commit d92ab3d7cbcd55ecdbfcfc5f44592bd71228a6c2 Author: hissorii Date: Tue Jul 16 06:46:56 2013 -0700 original xkeropi-20101107 diff --git a/Imakefile b/Imakefile new file mode 100644 index 0000000..80cde8b --- /dev/null +++ b/Imakefile @@ -0,0 +1,98 @@ +XCOMM $Id: Imakefile,v 1.4 2008/11/08 02:25:48 nonaka Exp $ + +#include "config.tmpl" + +XCOMM GTK+ +XCOMM for 1.2.x +XCOMM GTK_CONFIG?= gtk-config +XCOMM for 2.x +GTK_CONFIG?= pkg-config gtk+-2.0 +GTK_INCLUDE= `$(GTK_CONFIG) --cflags` +GTK_LIB= `$(GTK_CONFIG) --libs` + +XCOMM SDL 1.2 +SDL_CONFIG?= sdl-config +SDL_INCLUDE= `$(SDL_CONFIG) --cflags` +SDL_LIB= `$(SDL_CONFIG) --libs` + +NASM?= nasm +NASMFLAGS= -i ./x68k -i ./x11 +NASMOBJFLAGS?= -f elf + +#if defined(NO_SOUND) +EXTRA_DEFINES+= -DNOSOUND +#endif + +#if defined(NO_MERCURY) +EXTRA_DEFINES+= -DNO_MERCURY +NASMFLAGS+= -DNO_MERCURY +#endif + +SYS_LIBRARIES= -lm + +EXTRA_INCLUDES= -I./x11 -I./x68k -I./fmgen -I./win32api \ + $(GTK_INCLUDE) $(SDL_INCLUDE) + +CXXEXTRA_INCLUDES= $(EXTRA_INCLUDES) +CXXEXTRA_DEFINES= $(EXTRA_DEFINES) +CXXDEBUGFLAGS= $(CDEBUGFLAGS) + +LOCAL_LIBRARIES= $(XLIB) $(GTK_LIB) $(SDL_LIB) + +#define PassCDebugFlags + + +CPUOBJS= x68k/d68k.o +CPUASMOBJS= x68k/68kem.o + +X68KOBJS= \ + x68k/adpcm.o x68k/bg.o x68k/crtc.o x68k/dmac.o x68k/fdc.o \ + x68k/fdd.o x68k/disk_d88.o x68k/disk_dim.o x68k/disk_xdf.o \ + x68k/gvram.o x68k/ioc.o x68k/irqh.o x68k/mem_wrap.o x68k/mercury.o \ + x68k/mfp.o x68k/palette.o x68k/midi.o x68k/pia.o x68k/rtc.o \ + x68k/sasi.o x68k/scc.o x68k/scsi.o x68k/sram.o x68k/sysport.o \ + x68k/tvram.o \ + x68k/cpu_glue.o +X68KASMOBJS= x68k/bga.o x68k/memory.o x68k/memory_glue.o + +FMGENOBJS= \ + fmgen/fmgen.o fmgen/fmg_wrap.o fmgen/file.o fmgen/fmtimer.o \ + fmgen/opm.o fmgen/opna.o fmgen/psg.o + +X11OBJS= \ + x11/joystick.o x11/juliet.o x11/keyboard.o x11/mouse.o x11/prop.o \ + x11/status.o x11/timer.o \ + x11/dswin.o x11/windraw.o x11/winui.o \ + x11/about.o +X11CXXOBJS= x11/winx68k.o +X11ASMOBJS= x11/haveunit.o + +WIN32APIOBJS= win32api/dosio.o win32api/fake.o win32api/peace.o + +AOBJS= $(CPUASMOBJS) $(X68KASMOBJS) $(X11ASMOBJS) +COBJS= $(X68KOBJS) $(X11OBJS) $(WIN32APIOBJS) $(CPUOBJS) +CXXOBJS= $(FMGENOBJS) $(X11CXXOBJS) +OBJS= $(COBJS) $(CXXOBJS) $(AOBJS) + +ASRCS= $(AOBJS:.o=.asm) +CSRCS= $(COBJS:.o=.c) +CXXSRCS= $(CXXOBJS:.o=.cpp) +SRCS= $(CSRCS) $(CXXSRCS) +ALLSRCS= $(CSRCS) $(CXXSRCS) $(ASRCS) + +.SUFFIXES: .asm .c .cpp + +.c.o: + $(CC) -o $@ $(CFLAGS) $(_NOOP_) -c $*.c + +.cpp.o: + $(CXX) -o $@ $(CXXFLAGS) $(_NOOP_) -c $*.cpp + +.asm.o: + $(NASM) $(NASMFLAGS) $(NASMOBJFLAGS) $< + +ComplexCplusplusProgramTarget(xkeropi) + +cleandir distclean:: + -$(RM) .depend + $(RM) $(OBJS) diff --git a/README.ja b/README.ja new file mode 100644 index 0000000..49cf44e --- /dev/null +++ b/README.ja @@ -0,0 +1,117 @@ + +xkeropi - エックスけろぴー (WinX68k for X) + + +0. xkeropi って何? + + けんじょさん (http://retropc.net/kenjo/) が作成された SHARP X68000 + エミュレータ WinX68k (通称けろぴー)を UNIX/X11 環境で動作する様に + 移植した - ただし物凄く適当に - ソフトウェアです。 + + +1. 環境 + + 1.1. ソフトウェア + + コンパイルには以下のソフトウェアが必要です。 + + ・gcc (4.1.3 で動作確認をしています) + ・nasm (2.03.01 で動作確認をしています) + ・GTK+ 2.x + ・SDL 1.2.x + + 1.2. 動作環境 + + 以下の環境が必須です。 + + ・Intel i386 互換 CPU (ただし、動作周波数 1GHz 位は必要) + ・15bpp もしくは 16bpp の TrueColor/DirectColor で動作する X サーバ + + 1.3. 開発環境 + + 開発環境は以下の通りです。 + + ・NetBSD/i386 + ・GTK+ 2.14.4 + ・SDL 1.2.13 + + +2. コンパイル&インストール方法 + + 2.1. コンパイル + + 1) 必要があれば config.tmpl を編集 + 2) xmkmf -a + 3) make + (必要があれば su 等で root になってください) + 4) make install + + 2.2. config.tmpl で指定可能な内容 + + NO_SOUND : サウンド出力を無効化します。 + このオプションを指定した場合には SDL は必要無い筈です。 + + NO_MERCURY : 「まーきゅりーゆにっと」を無効化します。 + 無効化すると多少動作が速くなるかもしれません。 + + 2.3. インストール + + 1) BIOS の ROM イメージ、フォント ROM イメージを $(HOME)/.keropi 配下に + 置いてください。その際、ファイル名は全て全て小文字にしてください。 + + BIOS ROM イメージは実機から取得するなり RetroPC Network さん + (http://retropc.net/) から辿れる X68000 LIBRARY から取得して + ください。 + + フォント ROM イメージは実機から取得してください。また、WinX68k を + フォント ROM 無しで起動した際に生成される cgrom.tmp も使用可能です。 + + +3. 実行 + + コマンドラインから以下の様に入力してください。 + シェルによっては rehash 等のコマンドをインストール後に実行する必要がある + かもしれません。 + + $ xkeropi + + +4. 操作 + + マウスの真ん中ボタンで X <-> x68k のマウス切り替えが可能です。 + + +5. 備考 + + ・初期設定では音が鳴らない様になっています。音を鳴らしたい場合には +  プログラム起動後に設定ダイアログでサンプリングレートを設定してください。 + + +6. 問題点 + + ・画面描画処理は動作が怪しいです。 + ・マウス処理も動作が怪しい様です。 + ・ステータスバーは未実装です。 + ・MIDI は未サポートです。 + + 他、山程あるので書けません。 + + +7. 謝辞 + + 感謝する気持ちを忘れずに。 + + +8. 連絡先 + + 本ソフトウェアに関する問い合わせは以下のメールアドレスにお願いします。 + + NONAKA Kimihiro (埜中公博) / nonakap@gmail.com + + また、ソフトウェアのバージョンアップ等の情報は以下の URL から取得できます。 + + http://www.asahi-net.or.jp/~aw9k-nnk/keropi/ + + +-- + $Id: README.ja,v 1.5 2008/11/17 12:13:11 nonaka Exp $ diff --git a/config.tmpl b/config.tmpl new file mode 100644 index 0000000..b4555d1 --- /dev/null +++ b/config.tmpl @@ -0,0 +1,33 @@ +XCOMM $Id: config.tmpl,v 1.3 2008/11/08 01:16:30 nonaka Exp $ + +XCOMM +XCOMM disable sound +XCOMM +#undef NO_SOUND + +XCOMM +XCOMM disable mercury unit +XCOMM +#undef NO_MERCURY + +XCOMM +XCOMM for Opt. +XCOMM +XCOMM CDEBUGFLAGS= -O3 +XCOMM CDEBUGFLAGS+= -funroll-loops +XCOMM CDEBUGFLAGS+= -fomit-frame-pointer +XCOMM CDEBUGFLAGS+= -ffast-math + +XCOMM CDEBUGFLAGS+= -march=pentium-m +XCOMM CDEBUGFLAGS+= -msse -mfpmath=sse + +XCOMM +XCOMM for DEBUG +XCOMM +XCOMM CDEBUGFLAGS= -O0 +XCOMM CDEBUGFLAGS+= -g +XCOMM CDEBUGFLAGS+= -W -Wall -Wuninitialized +XCOMM CDEBUGFLAGS+= -Wunused +XCOMM CDEBUGFLAGS+= -Werror +XCOMM CDEBUGFLAGS+= -DINLINE= +XCOMM CDEBUGFLAGS+= -DUSE_GAS diff --git a/doc/kero_src.txt b/doc/kero_src.txt new file mode 100644 index 0000000..bb4690b --- /dev/null +++ b/doc/kero_src.txt @@ -0,0 +1,160 @@ +=================================================================== +===== �������[�iWinX68k�j�\�[�X�R�[�h�h�L�������g ===== +===== (c) 2000,01 Kenjo ===== +=================================================================== + +--------------- +1. ������ +--------------- + +�@X68000�G�~�����[�^�u�������[�v�i���uWinX68k�v�j���\�[�X�R�[�h�� +���������h�L�������g�����B + + + +--------------- +2. �t�@�C���\�� +--------------- + +�@Microsoft Visual C++ 6.0 �{ NASMW �������������������B +�@�f�B���N�g�����������������\�����������������i�w�b�_�t�@�C������ +���j�B + + --+-- Makefile VC++�pMake�t�@�C�� + | + +--win32 Windows�����t�@�C���Q + | | + | +- about.c About�_�C�A���O + | +- common.c �G���[�_�C�A���O���� + | +- cdaspi.c ASPI������CD-ROM�A�N�Z�X + | +- cdctrl.c IOCTRL������CD-ROM�A�N�Z�X + | +- cdrom.c CD-ROM�iSCSI IOCS �t�b�N���j + | +- dsound.c DirectSound + | +- fileio.c �t�@�C���A�N�Z�X + | +- joystick.c �W���C�X�e�B�b�N���� + | +- keyboard.c �L�[�{�[�h���� + | +- keyconf.c �L�[�R���t�B�O�_�C�A���O + | +- mkcgrom.c CGROM�������[�`�� + | +- mouse.c �}�E�X���� + | +- prop.c �����p�v���p�e�B�V�[�g + | +- status.c �X�e�[�^�X�o�[�\ヲ + | +- timer.c �^�C�}�[ + | +- windraw.c DirectDraw�������\ヲ���[�`�� + | +- winui.c ���j���[������UI���A + | +- winx68k.c ���C�� + | +- winx68k.rc ���\�[�X�t�@�C�� + | +- adpcm.bmp ���\�[�X�p�����f�[�^���� + | +- opm.bmp �V + | +- nekolgc.bmp �V + | +- motorola.bmp �V + | +- keropi.bmp �V + | +- keropi.ico �V + | | + | +- msfiles Microsoft�����������w�b�_�^���C�u���� + | | + | +- msfiles.txt �����f�B���N�g�������t�@�C�������������� + | + +--x68k X68k�����z�f�o�C�X�Q + | | + | +- 68kem.asm MPU�R�A�iMake68k��ゥ�������{�C���j + | +- comptab.asm �����g�������W�����v�e�[�u�� + | +- adpcm.c ADPCM + | +- bg.c BG/�X�v���C�g + | +- bg.x86 ���p���A�Z���u���C���N���[�h�t�@�C�� + | +- crtc.c CRTC + | +- dmac.c DMAC + | +- fdc.c FDC + | +- fdd.c FD�h���C�u + | +- gvram.c �O���t�B�b�NVRAM + | +- ioc.c I/O�R���g���[�� + | +- irqh.c IRQ�n���h�� + | +- memory.asm �������A�N�Z�X���[�`�� + | +- memory.c �������A�N�Z�X �f�o�b�O���[�`�� + | +- mercury.c ���`�������`�������� + | +- mfp.c MFP + | +- midi.c MIDI�{�[�h + | +- opm.c OPM + | +- palette.c �p���b�g + | +- pia.c 8255�i�W���C�X�e�B�b�N�p�j + | +- rtc.c RTC + | +- sasi.c SASI + | +- scc.c SCC�i�}�E�X�p�j + | +- scsi.c SCSI�{�[�h�^BIOS�iSPC����I/O���_�~�[�j + | +- sram.c SRAM + | +- sysport.c �V�X�e���|�[�g + | +- tvram.c �e�L�X�gVRAM + | +- windrv.c yamama������Windrv.sys�p�f�o�C�X + | + +-- release �I�u�W�F�N�g�t�@�C�����i�[�������f�B���N�g�� + + + +--------------- +3. �R���p�C�� +--------------- + +�@�������[���R���p�C�����������AVC++��NASMW�������ADirectX SDK���K�v�� +���B +�@���������������C���X�g�[���������}�V����DOS�����J���AVC++��NASMW���p +�X���������������AMakefile �������f�B���N�g�����������A + + nmake + +��タ�s�t�@�C�����������������B + + + +--------------- +4. 2���g�p�A�z�z�������� +--------------- + +�@�����p�������������������A�������t�@�C���������A�����A�p�N��������ゥ�R +�����B�p�N�����������\�t�g�����������\�[�X�R�[�h���J���`���������������B +�A�����s�v�����i�����A�g�������`���]�������������������������i���j�j�B + +�@���L�����������O���������A + + 1. MPU�R�A + Mike Coates ���� Darren Olafson ���������������B���p���������A���� + ���A�����A�g�p�������������������B + + Mike Coates���A���� : mcoates@mame.freeserve.co.uk + Darren Olafson���A���� : deo@mail.island.net + + 2. WINDRV.C + yamama���������������B���p���������Ayamama�����A�����A�g�p���������� + ���������B + + yamama���A���� : yamama@ps.ksky.ne.jp + +�@���������AOPM.C�����������A�����������E�����������������������A���{�I�� +�� Jarek Burczynski�����R�[�h���x�[�X�����������������A�����_������������ +�������K�������B + +�@�����R�[�hゥ�����z�z�����I�������������A�A�[�J�C�u�����g�����X�������A +�����Z�b�g���z�z�������������B + +�@�����������������������������i�������������������������������j�B���A +�����D�����g�����������i���j�B + + + +--------------- +5. ������ +--------------- + +�@���������B�������������B�v���O���������������B���p���l�����������B���� +�����������A����������ゥ�R�����g�����������i���B + +�@���������������������uwindraw.c�v���������������c�c�B +�@�`�����v�������S���������W���������������A�t���O���������������������� +�����������������i�����B�C�����������������h�L�������g������������������ +���c�c�B + + +----- +de �������� +kenjo@ceres.dti.ne.jp +kenjo@retropc.net + +[EOF] diff --git a/fmgen/diag.h b/fmgen/diag.h new file mode 100644 index 0000000..20dc370 --- /dev/null +++ b/fmgen/diag.h @@ -0,0 +1,15 @@ +#ifndef incl_diag_h +#define incl_diag_h + +#define LOG0(m) void (0) +#define LOG1(m,a) void (0) +#define LOG2(m,a,b) void (0) +#define LOG3(m,a,b,c) void (0) +#define LOG4(m,a,b,c,d) void (0) +#define LOG5(m,a,b,c,d,e) void (0) +#define LOG6(m,a,b,c,d,e,f) void (0) +#define LOG7(m,a,b,c,d,e,f,g) void (0) +#define LOG8(m,a,b,c,d,e,f,g,h) void (0) +#define LOG9(m,a,b,c,d,e,f,g,h,i) void (0) + +#endif // incl_diag_h diff --git a/fmgen/file.cpp b/fmgen/file.cpp new file mode 100644 index 0000000..8b1d2f7 --- /dev/null +++ b/fmgen/file.cpp @@ -0,0 +1,198 @@ +// $fmgen-Id: file.cpp,v 1.6 1999/12/28 11:14:05 cisc Exp $ + +#include "common.h" + +#include "headers.h" +#include "file.h" + +// --------------------------------------------------------------------------- +// 構築/消滅 +// --------------------------------------------------------------------------- + +FileIO::FileIO() +{ + flags = 0; +} + +FileIO::FileIO(const char* filename, uint flg) +{ + flags = 0; + Open(filename, flg); +} + +FileIO::~FileIO() +{ + Close(); +} + +// --------------------------------------------------------------------------- +// ファイルを開く +// --------------------------------------------------------------------------- + +bool FileIO::Open(const char* filename, uint flg) +{ + Close(); + + strncpy(path, filename, MAX_PATH); + + DWORD access = (flg & readonly ? 0 : GENERIC_WRITE) | GENERIC_READ; + DWORD share = (flg & readonly) ? FILE_SHARE_READ : 0; + DWORD creation = flg & create ? CREATE_ALWAYS : OPEN_EXISTING; + + hfile = CreateFile(filename, access, share, 0, creation, 0, 0); + + flags = (flg & readonly) | (hfile == INVALID_HANDLE_VALUE ? 0 : open); + if (!(flags & open)) + { + switch (GetLastError()) + { + case ERROR_FILE_NOT_FOUND: error = file_not_found; break; + case ERROR_SHARING_VIOLATION: error = sharing_violation; break; + default: error = unknown; break; + } + } + SetLogicalOrigin(0); + + return !!(flags & open); +} + +// --------------------------------------------------------------------------- +// ファイルがない場合は作成 +// --------------------------------------------------------------------------- + +bool FileIO::CreateNew(const char* filename) +{ + Close(); + + strncpy(path, filename, MAX_PATH); + + DWORD access = GENERIC_WRITE | GENERIC_READ; + DWORD share = 0; + DWORD creation = CREATE_NEW; + + hfile = CreateFile(filename, access, share, 0, creation, 0, 0); + + flags = (hfile == INVALID_HANDLE_VALUE ? 0 : open); + SetLogicalOrigin(0); + + return !!(flags & open); +} + +// --------------------------------------------------------------------------- +// ファイルを作り直す +// --------------------------------------------------------------------------- + +bool FileIO::Reopen(uint flg) +{ + if (!(flags & open)) return false; + if ((flags & readonly) && (flg & create)) return false; + + if (flags & readonly) flg |= readonly; + + Close(); + + DWORD access = (flg & readonly ? 0 : GENERIC_WRITE) | GENERIC_READ; + DWORD share = flg & readonly ? FILE_SHARE_READ : 0; + DWORD creation = flg & create ? CREATE_ALWAYS : OPEN_EXISTING; + + hfile = CreateFile(path, access, share, 0, creation, 0, 0); + + flags = (flg & readonly) | (hfile == INVALID_HANDLE_VALUE ? 0 : open); + SetLogicalOrigin(0); + + return !!(flags & open); +} + +// --------------------------------------------------------------------------- +// ファイルを閉じる +// --------------------------------------------------------------------------- + +void FileIO::Close() +{ + if (GetFlags() & open) + { + CloseHandle(hfile); + flags = 0; + } +} + +// --------------------------------------------------------------------------- +// ファイル殻の読み出し +// --------------------------------------------------------------------------- + +int32 FileIO::Read(void* dest, int32 size) +{ + if (!(GetFlags() & open)) + return -1; + + DWORD readsize; + if (!ReadFile(hfile, dest, size, &readsize, 0)) + return -1; + return readsize; +} + +// --------------------------------------------------------------------------- +// ファイルへの書き出し +// --------------------------------------------------------------------------- + +int32 FileIO::Write(const void* dest, int32 size) +{ + if (!(GetFlags() & open) || (GetFlags() & readonly)) + return -1; + + DWORD writtensize; + if (!WriteFile(hfile, dest, size, &writtensize, 0)) + return -1; + return writtensize; +} + +// --------------------------------------------------------------------------- +// ファイルをシーク +// --------------------------------------------------------------------------- + +bool FileIO::Seek(int32 pos, SeekMethod method) +{ + if (!(GetFlags() & open)) + return false; + + DWORD wmethod; + switch (method) + { + case begin: + wmethod = FILE_BEGIN; pos += lorigin; + break; + case current: + wmethod = FILE_CURRENT; + break; + case end: + wmethod = FILE_END; + break; + default: + return false; + } + + return 0xffffffff != SetFilePointer(hfile, pos, 0, wmethod); +} + +// --------------------------------------------------------------------------- +// ファイルの位置を得る +// --------------------------------------------------------------------------- + +int32 FileIO::Tellp() +{ + if (!(GetFlags() & open)) + return 0; + + return SetFilePointer(hfile, 0, 0, FILE_CURRENT) - lorigin; +} + +// --------------------------------------------------------------------------- +// 現在の位置をファイルの終端とする +// --------------------------------------------------------------------------- + +bool FileIO::SetEndOfFile() +{ + if (!(GetFlags() & open)) + return false; + return ::SetEndOfFile(hfile) != 0; +} diff --git a/fmgen/file.h b/fmgen/file.h new file mode 100644 index 0000000..433c80b --- /dev/null +++ b/fmgen/file.h @@ -0,0 +1,64 @@ +// $fmgen-Id: file.h,v 1.6 1999/11/26 10:14:09 cisc Exp $ + +#if !defined(win32_file_h) +#define win32_file_h + +#include "fmgen_types.h" + +// --------------------------------------------------------------------------- + +class FileIO +{ +public: + enum Flags + { + open = 0x000001, + readonly = 0x000002, + create = 0x000004, + }; + + enum SeekMethod + { + begin = 0, current = 1, end = 2, + }; + + enum Error + { + success = 0, + file_not_found, + sharing_violation, + unknown = -1 + }; + +public: + FileIO(); + FileIO(const char* filename, uint flg = 0); + virtual ~FileIO(); + + bool Open(const char* filename, uint flg = 0); + bool CreateNew(const char* filename); + bool Reopen(uint flg = 0); + void Close(); + Error GetError() { return error; } + + int32 Read(void* dest, int32 len); + int32 Write(const void* src, int32 len); + bool Seek(int32 fpos, SeekMethod method); + int32 Tellp(); + bool SetEndOfFile(); + + uint GetFlags() { return flags; } + void SetLogicalOrigin(int32 origin) { lorigin = origin; } + +private: + HANDLE hfile; + uint flags; + uint32 lorigin; + Error error; + char path[MAX_PATH]; + + FileIO(const FileIO&); + const FileIO& operator=(const FileIO&); +}; + +#endif // diff --git a/fmgen/fmg_wrap.cpp b/fmgen/fmg_wrap.cpp new file mode 100644 index 0000000..54edb6d --- /dev/null +++ b/fmgen/fmg_wrap.cpp @@ -0,0 +1,364 @@ +// ciscタンノエロガゾウキボンヌを強引にけろぴーに繋ぐための +// extern "C" の入れ方がきちゃなくてステキ(ぉ + +// readme.txtに従って、改変点: +// - opna.cppにYMF288用のクラス追加してます。OPNAそのまんまだけどね(ほんとは正しくないがまあいいや) +// - 多分他は弄ってないはず…… + +extern "C" { + +#include "common.h" +#include "winx68k.h" +#include "dswin.h" +#include "prop.h" +#include "juliet.h" +#include "mfp.h" +#include "adpcm.h" +#include "mercury.h" +#include "fdc.h" +#include "fmg_wrap.h" + +#include "opm.h" +#include "opna.h" + + +#define RMBUFSIZE (256*1024) + +typedef struct { + unsigned int time; + int reg; + BYTE data; +} RMDATA; + +}; + +static RMDATA RMData[RMBUFSIZE]; +static int RMPtrW; +static int RMPtrR; + +class MyOPM : public FM::OPM +{ +public: + MyOPM(); + virtual ~MyOPM() {} + void WriteIO(DWORD adr, BYTE data); + void Count2(DWORD clock); +private: + virtual void Intr(bool); + int CurReg; + DWORD CurCount; +}; + + +MyOPM::MyOPM() +{ + CurReg = 0; +} + +void MyOPM::WriteIO(DWORD adr, BYTE data) +{ + if( adr&1 ) { + if ( CurReg==0x1b ) { + ::ADPCM_SetClock((data>>5)&4); + ::FDC_SetForceReady((data>>6)&1); + } + SetReg((int)CurReg, (int)data); + if ( (juliet_YM2151IsEnable())&&(Config.SoundROMEO) ) { + int newptr = (RMPtrW+1)%RMBUFSIZE; + if ( newptr!=RMPtrR ) { +#if 0 + RMData[RMPtrW].time = timeGetTime(); + RMData[RMPtrW].reg = CurReg; +if ( CurReg==0x14 ) data &= 0xf3; // Int Enableはマスクする + RMData[RMPtrW].data = data; + RMPtrW = newptr; + } +#else + OPM_RomeoOut(Config.BufferSize*5); + } + RMData[RMPtrW].time = timeGetTime(); + RMData[RMPtrW].reg = CurReg; +if ( CurReg==0x14 ) data &= 0xf3; // Int Enableはマスクする + RMData[RMPtrW].data = data; + RMPtrW = newptr; +#endif + } + } else { + CurReg = (int)data; + } +} + +void MyOPM::Intr(bool f) +{ + if ( f ) ::MFP_Int(12); +} + + +void MyOPM::Count2(DWORD clock) +{ + CurCount += clock; + Count(CurCount/10); + CurCount %= 10; +} + + +static MyOPM* opm = NULL; + +int OPM_Init(int clock, int rate) +{ + juliet_load(); + juliet_prepare(); + + RMPtrW = RMPtrR = 0; + memset(RMData, 0, sizeof(RMData)); + + opm = new MyOPM(); + if ( !opm ) return FALSE; + if ( !opm->Init(clock, rate, TRUE) ) { + delete opm; + opm = NULL; + return FALSE; + } + return TRUE; +} + + +void OPM_Cleanup(void) +{ + juliet_YM2151Reset(); + juliet_unload(); + delete opm; + opm = NULL; +} + + +void OPM_SetRate(int clock, int rate) +{ + if ( opm ) opm->SetRate(clock, rate, TRUE); +} + + +void OPM_Reset(void) +{ + RMPtrW = RMPtrR = 0; + memset(RMData, 0, sizeof(RMData)); + + if ( opm ) opm->Reset(); + juliet_YM2151Reset(); +} + + +BYTE FASTCALL OPM_Read(WORD adr) +{ + BYTE ret = 0; + (void)adr; + if ( opm ) ret = opm->ReadStatus(); + if ( (juliet_YM2151IsEnable())&&(Config.SoundROMEO) ) { + int newptr = (RMPtrW+1)%RMBUFSIZE; + ret = (ret&0x7f)|((newptr==RMPtrR)?0x80:0x00); + } + return ret; +} + + +void FASTCALL OPM_Write(DWORD adr, BYTE data) +{ + if ( opm ) opm->WriteIO(adr, data); +} + + +void OPM_Update(short *buffer, int length) +{ + if ( (!juliet_YM2151IsEnable())||(!Config.SoundROMEO) ) + if ( opm ) opm->Mix((FM::Sample*)buffer, length); +} + + +void FASTCALL OPM_Timer(DWORD step) +{ + if ( opm ) opm->Count2(step); +} + + +void OPM_SetVolume(BYTE vol) +{ + int v = (vol)?((16-vol)*4):192; // このくらいかなぁ + if ( opm ) opm->SetVolume(-v); +} + + +void OPM_RomeoOut(unsigned int delay) +{ + unsigned int t = timeGetTime(); + if ( (juliet_YM2151IsEnable())&&(Config.SoundROMEO) ) { + while ( RMPtrW!=RMPtrR ) { + if ( (t-RMData[RMPtrR].time)>=delay ) { + juliet_YM2151W(RMData[RMPtrR].reg, RMData[RMPtrR].data); + RMPtrR = (RMPtrR+1)%RMBUFSIZE; + } else + break; + } + } +} + +// ---------------------------------------------------------- +// ---------------------------- YMF288 (満開版ま〜きゅり〜) +// ---------------------------------------------------------- +// TODO : ROMEOの288を叩くの + +class YMF288 : public FM::Y288 +{ +public: + YMF288(); + virtual ~YMF288() {} + void WriteIO(DWORD adr, BYTE data); + BYTE ReadIO(DWORD adr); + void Count2(DWORD clock); + void SetInt(int f) { IntrFlag = f; }; +private: + virtual void Intr(bool); + int CurReg[2]; + DWORD CurCount; + int IntrFlag; +}; + +YMF288::YMF288() +{ + CurReg[0] = 0; + CurReg[1] = 0; + IntrFlag = 0; +} + +void YMF288::WriteIO(DWORD adr, BYTE data) +{ + if( adr&1 ) { + SetReg(((adr&2)?(CurReg[1]+0x100):CurReg[0]), (int)data); + } else { + CurReg[(adr>>1)&1] = (int)data; + } +} + + +BYTE YMF288::ReadIO(DWORD adr) +{ + BYTE ret = 0; + if ( adr&1 ) { + ret = GetReg(((adr&2)?(CurReg[1]+0x100):CurReg[0])); + } else { + ret = ((adr)?(ReadStatusEx()):(ReadStatus())); + } + return ret; +} + + +void YMF288::Intr(bool f) +{ + if ( (f)&&(IntrFlag) ) ::Mcry_Int(); +} + + +void YMF288::Count2(DWORD clock) +{ + CurCount += clock; + Count(CurCount/10); + CurCount %= 10; +} + + +static YMF288* ymf288a = NULL; +static YMF288* ymf288b = NULL; + + +int M288_Init(int clock, int rate, const char* path) +{ + ymf288a = new YMF288(); + ymf288b = new YMF288(); + if ( (!ymf288a)||(!ymf288b) ) { + M288_Cleanup(); + return FALSE; + } + if ( (!ymf288a->Init(clock, rate, TRUE, path))||(!ymf288b->Init(clock, rate, TRUE, path)) ) { + M288_Cleanup(); + return FALSE; + } + ymf288a->SetInt(1); + ymf288b->SetInt(0); + return TRUE; +} + + +void M288_Cleanup(void) +{ + delete ymf288a; + delete ymf288b; + ymf288a = ymf288b = NULL; +} + + +void M288_SetRate(int clock, int rate) +{ + if ( ymf288a ) ymf288a->SetRate(clock, rate, TRUE); + if ( ymf288b ) ymf288b->SetRate(clock, rate, TRUE); +} + + +void M288_Reset(void) +{ + if ( ymf288a ) ymf288a->Reset(); + if ( ymf288b ) ymf288b->Reset(); +} + + +BYTE FASTCALL M288_Read(WORD adr) +{ + if ( adr<=3 ) { + if ( ymf288a ) + return ymf288a->ReadIO(adr); + else + return 0; + } else { + if ( ymf288b ) + return ymf288b->ReadIO(adr&3); + else + return 0; + } +} + + +void FASTCALL M288_Write(DWORD adr, BYTE data) +{ + if ( adr<=3 ) { + if ( ymf288a ) ymf288a->WriteIO(adr, data); + } else { + if ( ymf288b ) ymf288b->WriteIO(adr&3, data); + } +} + + +void M288_Update(short *buffer, int length) +{ + if ( ymf288a ) ymf288a->Mix((FM::Sample*)buffer, length); + if ( ymf288b ) ymf288b->Mix((FM::Sample*)buffer, length); +} + + +void FASTCALL M288_Timer(DWORD step) +{ + if ( ymf288a ) ymf288a->Count2(step); + if ( ymf288b ) ymf288b->Count2(step); +} + + +void M288_SetVolume(BYTE vol) +{ + int v1 = (vol)?((16-vol)*4-24):192; // このくらいかなぁ + int v2 = (vol)?((16-vol)*4):192; // 少し小さめに + if ( ymf288a ) { + ymf288a->SetVolumeFM(-v1); + ymf288a->SetVolumePSG(-v2); + } + if ( ymf288b ) { + ymf288b->SetVolumeFM(-v1); + ymf288b->SetVolumePSG(-v2); + } +} diff --git a/fmgen/fmg_wrap.h b/fmgen/fmg_wrap.h new file mode 100644 index 0000000..0ffafc3 --- /dev/null +++ b/fmgen/fmg_wrap.h @@ -0,0 +1,26 @@ +#ifndef _win68_opm_fmgen +#define _win68_opm_fmgen + +int OPM_Init(int clock, int rate); +void OPM_Cleanup(void); +void OPM_Reset(void); +void OPM_Update(short *buffer, int length); +void FASTCALL OPM_Write(DWORD r, BYTE v); +BYTE FASTCALL OPM_Read(WORD a); +void FASTCALL OPM_Timer(DWORD step); +void OPM_SetVolume(BYTE vol); +void OPM_SetRate(int clock, int rate); +void OPM_RomeoOut(unsigned int delay); + +int M288_Init(int clock, int rate, const char* path); +void M288_Cleanup(void); +void M288_Reset(void); +void M288_Update(short *buffer, int length); +void FASTCALL M288_Write(DWORD r, BYTE v); +BYTE FASTCALL M288_Read(WORD a); +void FASTCALL M288_Timer(DWORD step); +void M288_SetVolume(BYTE vol); +void M288_SetRate(int clock, int rate); +void M288_RomeoOut(unsigned int delay); + +#endif //_win68_opm_fmgen diff --git a/fmgen/fmgen.cpp b/fmgen/fmgen.cpp new file mode 100644 index 0000000..530a9a1 --- /dev/null +++ b/fmgen/fmgen.cpp @@ -0,0 +1,966 @@ +// --------------------------------------------------------------------------- +// FM Sound Generator - Core Unit +// Copyright (C) cisc 1998, 2003. +// --------------------------------------------------------------------------- +// $fmgen-Id: fmgen.cpp,v 1.49 2003/09/02 14:51:04 cisc Exp $ +// --------------------------------------------------------------------------- +// 参考: +// FM sound generator for M.A.M.E., written by Tatsuyuki Satoh. +// +// 謎: +// OPNB の CSM モード(仕様がよくわからない) +// +// 制限: +// ・AR!=31 で SSGEC を使うと波形が実際と異なる可能性あり +// +// 謝辞: +// Tatsuyuki Satoh さん(fm.c) +// Hiromitsu Shioya さん(ADPCM-A) +// DMP-SOFT. さん(OPNB) +// KAJA さん(test program) +// ほか掲示板等で様々なご助言,ご支援をお寄せいただいた皆様に +// --------------------------------------------------------------------------- + +#include "headers.h" +#include "misc.h" +#include "fmgen.h" +#include "fmgeninl.h" + +#define LOGNAME "fmgen" + +// --------------------------------------------------------------------------- + +#define FM_EG_BOTTOM 955 + +// --------------------------------------------------------------------------- +// Table/etc +// +namespace FM +{ + const uint8 Operator::notetable[128] = + { + 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, + 4, 4, 4, 4, 4, 4, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7, + 8, 8, 8, 8, 8, 8, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, + 12, 12, 12, 12, 12, 12, 12, 13, 14, 15, 15, 15, 15, 15, 15, 15, + 16, 16, 16, 16, 16, 16, 16, 17, 18, 19, 19, 19, 19, 19, 19, 19, + 20, 20, 20, 20, 20, 20, 20, 21, 22, 23, 23, 23, 23, 23, 23, 23, + 24, 24, 24, 24, 24, 24, 24, 25, 26, 27, 27, 27, 27, 27, 27, 27, + 28, 28, 28, 28, 28, 28, 28, 29, 30, 31, 31, 31, 31, 31, 31, 31, + }; + + const int8 Operator::dttable[256] = + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, + 4, 6, 6, 6, 8, 8, 8, 10, 10, 12, 12, 14, 16, 16, 16, 16, + 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 8, 8, 8, 10, + 10, 12, 12, 14, 16, 16, 18, 20, 22, 24, 26, 28, 32, 32, 32, 32, + 4, 4, 4, 4, 4, 6, 6, 6, 8, 8, 8, 10, 10, 12, 12, 14, + 16, 16, 18, 20, 22, 24, 26, 28, 32, 34, 38, 40, 44, 44, 44, 44, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, -2, -2, -2, -2, -2, -2, -2, -4, -4, -4, -4, + -4, -6, -6, -6, -8, -8, -8,-10,-10,-12,-12,-14,-16,-16,-16,-16, + -2, -2, -2, -2, -4, -4, -4, -4, -4, -6, -6, -6, -8, -8, -8,-10, + -10,-12,-12,-14,-16,-16,-18,-20,-22,-24,-26,-28,-32,-32,-32,-32, + -4, -4, -4, -4, -4, -6, -6, -6, -8, -8, -8,-10,-10,-12,-12,-14, + -16,-16,-18,-20,-22,-24,-26,-28,-32,-34,-38,-40,-44,-44,-44,-44, + }; + + const int8 Operator::decaytable1[64][8] = + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, + 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, + 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, + 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, + 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, + 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, + 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, + 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, + 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, + 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, + 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, + 2, 1, 2, 1, 2, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 4, 2, 2, 2, + 4, 2, 4, 2, 4, 2, 4, 2, 4, 4, 4, 2, 4, 4, 4, 2, + 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 8, 4, 4, 4, + 8, 4, 8, 4, 8, 4, 8, 4, 8, 8, 8, 4, 8, 8, 8, 4, + 16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16, + }; + + const int Operator::decaytable2[16] = + { + 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2047, 2047, 2047, 2047, 2047 + }; + + const int8 Operator::attacktable[64][8] = + { + -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4,-1, 4, 4, 4,-1, 4, 4, 4,-1, 4, 4, 4,-1, + 4,-1, 4,-1, 4,-1, 4,-1, 4, 4, 4,-1, 4,-1, 4,-1, + 4, 4, 4,-1, 4, 4, 4,-1, 4, 4, 4, 4, 4, 4, 4,-1, + 4,-1, 4,-1, 4,-1, 4,-1, 4, 4, 4,-1, 4,-1, 4,-1, + 4, 4, 4,-1, 4, 4, 4,-1, 4, 4, 4, 4, 4, 4, 4,-1, + 4,-1, 4,-1, 4,-1, 4,-1, 4, 4, 4,-1, 4,-1, 4,-1, + 4, 4, 4,-1, 4, 4, 4,-1, 4, 4, 4, 4, 4, 4, 4,-1, + 4,-1, 4,-1, 4,-1, 4,-1, 4, 4, 4,-1, 4,-1, 4,-1, + 4, 4, 4,-1, 4, 4, 4,-1, 4, 4, 4, 4, 4, 4, 4,-1, + 4,-1, 4,-1, 4,-1, 4,-1, 4, 4, 4,-1, 4,-1, 4,-1, + 4, 4, 4,-1, 4, 4, 4,-1, 4, 4, 4, 4, 4, 4, 4,-1, + 4,-1, 4,-1, 4,-1, 4,-1, 4, 4, 4,-1, 4,-1, 4,-1, + 4, 4, 4,-1, 4, 4, 4,-1, 4, 4, 4, 4, 4, 4, 4,-1, + 4,-1, 4,-1, 4,-1, 4,-1, 4, 4, 4,-1, 4,-1, 4,-1, + 4, 4, 4,-1, 4, 4, 4,-1, 4, 4, 4, 4, 4, 4, 4,-1, + 4,-1, 4,-1, 4,-1, 4,-1, 4, 4, 4,-1, 4,-1, 4,-1, + 4, 4, 4,-1, 4, 4, 4,-1, 4, 4, 4, 4, 4, 4, 4,-1, + 4,-1, 4,-1, 4,-1, 4,-1, 4, 4, 4,-1, 4,-1, 4,-1, + 4, 4, 4,-1, 4, 4, 4,-1, 4, 4, 4, 4, 4, 4, 4,-1, + 4,-1, 4,-1, 4,-1, 4,-1, 4, 4, 4,-1, 4,-1, 4,-1, + 4, 4, 4,-1, 4, 4, 4,-1, 4, 4, 4, 4, 4, 4, 4,-1, + 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, + 3, 4, 3, 4, 3, 4, 3, 4, 3, 3, 3, 4, 3, 3, 3, 4, + 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, + 2, 3, 2, 3, 2, 3, 2, 3, 2, 2, 2, 3, 2, 2, 2, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0, 0, 0, 0, 0, 0, + }; + + const int Operator::ssgenvtable[8][2][3][2] = + { + 1, 1, 1, 1, 1, 1, // 08 + 0, 1, 1, 1, 1, 1, // 08 56~ + 0, 1, 2, 0, 2, 0, // 09 + 0, 1, 2, 0, 2, 0, // 09 + 1,-1, 0, 1, 1,-1, // 10 + 0, 1, 1,-1, 0, 1, // 10 60~ + 1,-1, 0, 0, 0, 0, // 11 + 0, 1, 0, 0, 0, 0, // 11 60~ + 2,-1, 2,-1, 2,-1, // 12 + 1,-1, 2,-1, 2,-1, // 12 56~ + 1,-1, 0, 0, 0, 0, // 13 + 1,-1, 0, 0, 0, 0, // 13 + 0, 1, 1,-1, 0, 1, // 14 + 1,-1, 0, 1, 1,-1, // 14 60~ + 0, 1, 2, 0, 2, 0, // 15 + 1,-1, 2, 0, 2, 0, // 15 60~ + }; + + // fixed equasion-based tables + int pmtable[2][8][FM_LFOENTS]; + uint amtable[2][4][FM_LFOENTS]; + + static bool tablemade = false; +} + +namespace FM +{ + +// --------------------------------------------------------------------------- +// テーブル作成 +// +void MakeLFOTable() +{ + if (tablemade) + return; + + tablemade = true; + + int i; + + static const double pms[2][8] = + { + { 0, 1/360., 2/360., 3/360., 4/360., 6/360., 12/360., 24/360., }, // OPNA +// { 0, 1/240., 2/240., 4/240., 10/240., 20/240., 80/240., 140/240., }, // OPM + { 0, 1/480., 2/480., 4/480., 10/480., 20/480., 80/480., 140/480., }, // OPM +// { 0, 1/960., 2/960., 4/960., 10/960., 20/960., 80/960., 140/960., }, // OPM + }; + // 3 6, 12 30 60 240 420 / 720 + // 1.000963 + // lfofref[level * max * wave]; + // pre = lfofref[level][pms * wave >> 8]; + static const uint8 amt[2][4] = + { + { 31, 6, 4, 3 }, // OPNA + { 31, 2, 1, 0 }, // OPM + }; + + for (int type = 0; type < 2; type++) + { + for (i=0; i<8; i++) + { + double pmb = pms[type][i]; + for (int j=0; j> amt[type][i]) * 2) << 2; + } + } + } +} + + +// --------------------------------------------------------------------------- +// チップ内で共通な部分 +// +Chip::Chip() +: ratio_(0), aml_(0), pml_(0), pmv_(0), optype_(typeN) +{ +} + +// クロック・サンプリングレート比に依存するテーブルを作成 +void Chip::SetRatio(uint ratio) +{ + if (ratio_ != ratio) + { + ratio_ = ratio; + MakeTable(); + } +} + +void Chip::MakeTable() +{ + int h, l; + + // PG Part + static const float dt2lv[4] = { 1.f, 1.414f, 1.581f, 1.732f }; + for (h=0; h<4; h++) + { + assert(2 + FM_RATIOBITS - FM_PGBITS >= 0); + double rr = dt2lv[h] * double(ratio_) / (1 << (2 + FM_RATIOBITS - FM_PGBITS)); + for (l=0; l<16; l++) + { + int mul = l ? l * 2 : 1; + multable_[h][l] = uint(mul * rr); + } + } +} + + +// --------------------------------------------------------------------------- +// Operator +// +bool FM::Operator::tablehasmade = false; +uint FM::Operator::sinetable[1024]; +int32 FM::Operator::cltable[FM_CLENTS]; + +// 構築 +FM::Operator::Operator() +: chip_(0) +{ + if (!tablehasmade) + MakeTable(); + + // EG Part + ar_ = dr_ = sr_ = rr_ = key_scale_rate_ = 0; + ams_ = amtable[0][0]; + mute_ = false; + keyon_ = false; + tl_out_ = false; + ssg_type_ = 0; + + // PG Part + multiple_ = 0; + detune_ = 0; + detune2_ = 0; + + // LFO + ms_ = 0; + +// Reset(); +} + +// 初期化 +void FM::Operator::Reset() +{ + // EG part + tl_ = tl_latch_ = 127; + ShiftPhase(off); + eg_count_ = 0; + eg_curve_count_ = 0; + ssg_phase_ = 0; + + // PG part + pg_count_ = 0; + + // OP part + out_ = out2_ = 0; + + param_changed_ = true; + PARAMCHANGE(0); +} + +void Operator::MakeTable() +{ + // 対数テーブルの作成 + assert(FM_CLENTS >= 256); + + int* p = cltable; + int i; + for (i=0; i<256; i++) + { + int v = int(floor(pow(2., 13. - i / 256.))); + v = (v + 2) & ~3; + *p++ = v; + *p++ = -v; + } + while (p < cltable + FM_CLENTS) + { + *p++ = p[-512] / 2; + } + +// for (i=0; i<13*256; i++) +// printf("%4d, %d, %d\n", i, cltable[i*2], cltable[i*2+1]); + + // サインテーブルの作成 + double log2 = log(2.); + for (i=0; iGetMulValue(detune2_, multiple_); + pg_diff_lfo_ = pg_diff_ >> 11; + + // EG Part + key_scale_rate_ = bn_ >> (3-ks_); + tl_out_ = mute_ ? 0x3ff : tl_ * 8; + + switch (eg_phase_) + { + case attack: + SetEGRate(ar_ ? Min(63, ar_ + key_scale_rate_) : 0); + break; + case decay: + SetEGRate(dr_ ? Min(63, dr_ + key_scale_rate_) : 0); + eg_level_on_next_phase_ = sl_ * 8; + break; + case sustain: + SetEGRate(sr_ ? Min(63, sr_ + key_scale_rate_) : 0); + break; + case release: + SetEGRate(Min(63, rr_ + key_scale_rate_)); + break; + case next: + case off: + break; + } + + // SSG-EG + if (ssg_type_ && (eg_phase_ != release)) + { + int m = ar_ >= ((ssg_type_ == 8 || ssg_type_ == 12) ? 56 : 60); + + assert(0 <= ssg_phase_ && ssg_phase_ <= 2); + const int* table = ssgenvtable[ssg_type_ & 7][m][ssg_phase_]; + + ssg_offset_ = table[0] * 0x200; + ssg_vector_ = table[1]; + } + // LFO + ams_ = amtable[type_][amon_ ? (ms_ >> 4) & 3 : 0]; + EGUpdate(); + + dbgopout_ = 0; + } +} +// envelop の eg_phase_ 変更 +void Operator::ShiftPhase(EGPhase nextphase) +{ + switch (nextphase) + { + case attack: // Attack Phase + tl_ = tl_latch_; + if (ssg_type_) + { + ssg_phase_ = ssg_phase_ + 1; + if (ssg_phase_ > 2) + ssg_phase_ = 1; + + int m = ar_ >= ((ssg_type_ == 8 || ssg_type_ == 12) ? 56 : 60); + + assert(0 <= ssg_phase_ && ssg_phase_ <= 2); + const int* table = ssgenvtable[ssg_type_ & 7][m][ssg_phase_]; + + ssg_offset_ = table[0] * 0x200; + ssg_vector_ = table[1]; + } + if ((ar_ + key_scale_rate_) < 62) + { + SetEGRate(ar_ ? Min(63, ar_ + key_scale_rate_) : 0); + eg_phase_ = attack; + break; + } + case decay: // Decay Phase + if (sl_) + { + eg_level_ = 0; + eg_level_on_next_phase_ = ssg_type_ ? Min(sl_ * 8, 0x200) : sl_ * 8; + + SetEGRate(dr_ ? Min(63, dr_ + key_scale_rate_) : 0); + eg_phase_ = decay; + break; + } + case sustain: // Sustain Phase + eg_level_ = sl_ * 8; + eg_level_on_next_phase_ = ssg_type_ ? 0x200 : 0x400; + + SetEGRate(sr_ ? Min(63, sr_ + key_scale_rate_) : 0); + eg_phase_ = sustain; + break; + + case release: // Release Phase + if (ssg_type_) + { + eg_level_ = eg_level_ * ssg_vector_ + ssg_offset_; + ssg_vector_ = 1; + ssg_offset_ = 0; + } + if (eg_phase_ == attack || (eg_level_ < FM_EG_BOTTOM)) //0x400/* && eg_phase_ != off*/)) + { + eg_level_on_next_phase_ = 0x400; + SetEGRate(Min(63, rr_ + key_scale_rate_)); + eg_phase_ = release; + break; + } + case off: // off + default: + eg_level_ = FM_EG_BOTTOM; + eg_level_on_next_phase_ = FM_EG_BOTTOM; + EGUpdate(); + SetEGRate(0); + eg_phase_ = off; + break; + } +} + +// Block/F-Num +void Operator::SetFNum(uint f) +{ + dp_ = (f & 2047) << ((f >> 11) & 7); + bn_ = notetable[(f >> 7) & 127]; + param_changed_ = true; + PARAMCHANGE(2); +} + +// 1サンプル合成 + +// ISample を envelop count (2π) に変換するシフト量 +#define IS2EC_SHIFT ((20 + FM_PGBITS) - 13) + + +// 入力: s = 20+FM_PGBITS = 29 +#define Sine(s) sinetable[((s) >> (20+FM_PGBITS-FM_OPSINBITS))&(FM_OPSINENTS-1)] +#define SINE(s) sinetable[(s) & (FM_OPSINENTS-1)] + +inline FM::ISample Operator::LogToLin(uint a) +{ +#if 1 // FM_CLENTS < 0xc00 // 400 for TL, 400 for ENV, 400 for LFO. + return (a < FM_CLENTS) ? cltable[a] : 0; +#else + return cltable[a]; +#endif +} + +inline void Operator::EGUpdate() +{ + if (!ssg_type_) + { + eg_out_ = Min(tl_out_ + eg_level_, 0x3ff) << (1 + 2); + } + else + { + eg_out_ = Min(tl_out_ + eg_level_ * ssg_vector_ + ssg_offset_, 0x3ff) << (1 + 2); + } +} + +inline void Operator::SetEGRate(uint rate) +{ + eg_rate_ = rate; + eg_count_diff_ = decaytable2[rate / 4] * chip_->GetRatio(); +} + +// EG 計算 +void FM::Operator::EGCalc() +{ + eg_count_ = (2047 * 3) << FM_RATIOBITS; // ##この手抜きは再現性を低下させる + + if (eg_phase_ == attack) + { + int c = attacktable[eg_rate_][eg_curve_count_ & 7]; + if (c >= 0) + { + eg_level_ -= 1 + (eg_level_ >> c); + if (eg_level_ <= 0) + ShiftPhase(decay); + } + EGUpdate(); + } + else + { + if (!ssg_type_) + { + eg_level_ += decaytable1[eg_rate_][eg_curve_count_ & 7]; + if (eg_level_ >= eg_level_on_next_phase_) + ShiftPhase(EGPhase(eg_phase_+1)); + EGUpdate(); + } + else + { + eg_level_ += 4 * decaytable1[eg_rate_][eg_curve_count_ & 7]; + if (eg_level_ >= eg_level_on_next_phase_) + { + EGUpdate(); + switch (eg_phase_) + { + case decay: + ShiftPhase(sustain); + break; + case sustain: + ShiftPhase(attack); + break; + case release: + ShiftPhase(off); + break; + case next: + case attack: + case off: + break; + } + } + } + } + eg_curve_count_++; +} + +inline void FM::Operator::EGStep() +{ + eg_count_ -= eg_count_diff_; + + // EG の変化は全スロットで同期しているという噂もある + if (eg_count_ <= 0) + EGCalc(); +} + +// PG 計算 +// ret:2^(20+PGBITS) / cycle +inline uint32 FM::Operator::PGCalc() +{ + uint32 ret = pg_count_; + pg_count_ += pg_diff_; + dbgpgout_ = ret; + return ret; +} + +inline uint32 FM::Operator::PGCalcL() +{ + uint32 ret = pg_count_; + pg_count_ += pg_diff_ + ((pg_diff_lfo_ * chip_->GetPMV()) >> 5);// & -(1 << (2+IS2EC_SHIFT))); + dbgpgout_ = ret; + return ret /* + pmv * pg_diff_;*/; +} + +// OP 計算 +// in: ISample (最大 8π) +inline FM::ISample FM::Operator::Calc(ISample in) +{ + EGStep(); + out2_ = out_; + + int pgin = PGCalc() >> (20+FM_PGBITS-FM_OPSINBITS); + pgin += in >> (20+FM_PGBITS-FM_OPSINBITS-(2+IS2EC_SHIFT)); + out_ = LogToLin(eg_out_ + SINE(pgin)); + + dbgopout_ = out_; + return out_; +} + +inline FM::ISample FM::Operator::CalcL(ISample in) +{ + EGStep(); + + int pgin = PGCalcL() >> (20+FM_PGBITS-FM_OPSINBITS); + pgin += in >> (20+FM_PGBITS-FM_OPSINBITS-(2+IS2EC_SHIFT)); + out_ = LogToLin(eg_out_ + SINE(pgin) + ams_[chip_->GetAML()]); + + dbgopout_ = out_; + return out_; +} + +inline FM::ISample FM::Operator::CalcN(uint noise) +{ + EGStep(); + + int lv = Max(0, 0x3ff - (tl_out_ + eg_level_)) << 1; + + // noise & 1 ? lv : -lv と等価 + noise = (noise & 1) - 1; + out_ = (lv + noise) ^ noise; + + dbgopout_ = out_; + return out_; +} + +// OP (FB) 計算 +// Self Feedback の変調最大 = 4π +inline FM::ISample FM::Operator::CalcFB(uint fb) +{ + EGStep(); + + ISample in = out_ + out2_; + out2_ = out_; + + int pgin = PGCalc() >> (20+FM_PGBITS-FM_OPSINBITS); + if (fb < 31) + { + pgin += ((in << (1 + IS2EC_SHIFT)) >> fb) >> (20+FM_PGBITS-FM_OPSINBITS); + } + out_ = LogToLin(eg_out_ + SINE(pgin)); + dbgopout_ = out2_; + + return out2_; +} + +inline FM::ISample FM::Operator::CalcFBL(uint fb) +{ + EGStep(); + + ISample in = out_ + out2_; + out2_ = out_; + + int pgin = PGCalcL() >> (20+FM_PGBITS-FM_OPSINBITS); + if (fb < 31) + { + pgin += ((in << (1 + IS2EC_SHIFT)) >> fb) >> (20+FM_PGBITS-FM_OPSINBITS); + } + + out_ = LogToLin(eg_out_ + SINE(pgin) + ams_[chip_->GetAML()]); + dbgopout_ = out_; + + return out_; +} + +#undef Sine + +// --------------------------------------------------------------------------- +// 4-op Channel +// +const uint8 Channel4::fbtable[8] = { 31, 7, 6, 5, 4, 3, 2, 1 }; +int Channel4::kftable[64]; + +bool Channel4::tablehasmade = false; + + +Channel4::Channel4() +{ + if (!tablehasmade) + MakeTable(); + + SetAlgorithm(0); + pms = pmtable[0][0]; +} + +void Channel4::MakeTable() +{ + // 100/64 cent = 2^(i*100/64*1200) + for (int i=0; i<64; i++) + { + kftable[i] = int(0x10000 * pow(2., i / 768.) ); + } +} + +// リセット +void Channel4::Reset() +{ + op[0].Reset(); + op[1].Reset(); + op[2].Reset(); + op[3].Reset(); +} + +// Calc の用意 +int Channel4::Prepare() +{ + op[0].Prepare(); + op[1].Prepare(); + op[2].Prepare(); + op[3].Prepare(); + + pms = pmtable[op[0].type_][op[0].ms_ & 7]; + int key = (op[0].IsOn() | op[1].IsOn() | op[2].IsOn() | op[3].IsOn()) ? 1 : 0; + int lfo = op[0].ms_ & (op[0].amon_ | op[1].amon_ | op[2].amon_ | op[3].amon_ ? 0x37 : 7) ? 2 : 0; + return key | lfo; +} + +// F-Number/BLOCK を設定 +void Channel4::SetFNum(uint f) +{ + for (int i=0; i<4; i++) + op[i].SetFNum(f); +} + +// KC/KF を設定 +void Channel4::SetKCKF(uint kc, uint kf) +{ + static const uint kctable[16] = + { + 5197, 5506, 5833, 6180, 6180, 6547, 6937, 7349, + 7349, 7786, 8249, 8740, 8740, 9259, 9810, 10394, + }; + + int oct = 19 - ((kc >> 4) & 7); + +//printf("%p", this); + uint kcv = kctable[kc & 0x0f]; + kcv = (kcv + 2) / 4 * 4; +//printf(" %.4x", kcv); + uint dp = kcv * kftable[kf & 0x3f]; +//printf(" %.4x %.4x %.8x", kcv, kftable[kf & 0x3f], dp >> oct); + dp >>= 16 + 3; + dp <<= 16 + 3; + dp >>= oct; + uint bn = (kc >> 2) & 31; + op[0].SetDPBN(dp, bn); + op[1].SetDPBN(dp, bn); + op[2].SetDPBN(dp, bn); + op[3].SetDPBN(dp, bn); +//printf(" %.8x\n", dp); +} + +// キー制御 +void Channel4::KeyControl(uint key) +{ + if (key & 0x1) op[0].KeyOn(); else op[0].KeyOff(); + if (key & 0x2) op[1].KeyOn(); else op[1].KeyOff(); + if (key & 0x4) op[2].KeyOn(); else op[2].KeyOff(); + if (key & 0x8) op[3].KeyOn(); else op[3].KeyOff(); +} + +// アルゴリズムを設定 +void Channel4::SetAlgorithm(uint algo) +{ + static const uint8 table1[8][6] = + { + { 0, 1, 1, 2, 2, 3 }, { 1, 0, 0, 1, 1, 2 }, + { 1, 1, 1, 0, 0, 2 }, { 0, 1, 2, 1, 1, 2 }, + { 0, 1, 2, 2, 2, 1 }, { 0, 1, 0, 1, 0, 1 }, + { 0, 1, 2, 1, 2, 1 }, { 1, 0, 1, 0, 1, 0 }, + }; + + in [0] = &buf[table1[algo][0]]; + out[0] = &buf[table1[algo][1]]; + in [1] = &buf[table1[algo][2]]; + out[1] = &buf[table1[algo][3]]; + in [2] = &buf[table1[algo][4]]; + out[2] = &buf[table1[algo][5]]; + + op[0].ResetFB(); + algo_ = algo; +} + +// 合成 +ISample Channel4::Calc() +{ + int r = 0; + switch (algo_) + { + case 0: + op[2].Calc(op[1].Out()); + op[1].Calc(op[0].Out()); + r = op[3].Calc(op[2].Out()); + op[0].CalcFB(fb); + break; + case 1: + op[2].Calc(op[0].Out() + op[1].Out()); + op[1].Calc(0); + r = op[3].Calc(op[2].Out()); + op[0].CalcFB(fb); + break; + case 2: + op[2].Calc(op[1].Out()); + op[1].Calc(0); + r = op[3].Calc(op[0].Out() + op[2].Out()); + op[0].CalcFB(fb); + break; + case 3: + op[2].Calc(0); + op[1].Calc(op[0].Out()); + r = op[3].Calc(op[1].Out() + op[2].Out()); + op[0].CalcFB(fb); + break; + case 4: + op[2].Calc(0); + r = op[1].Calc(op[0].Out()); + r += op[3].Calc(op[2].Out()); + op[0].CalcFB(fb); + break; + case 5: + r = op[2].Calc(op[0].Out()); + r += op[1].Calc(op[0].Out()); + r += op[3].Calc(op[0].Out()); + op[0].CalcFB(fb); + break; + case 6: + r = op[2].Calc(0); + r += op[1].Calc(op[0].Out()); + r += op[3].Calc(0); + op[0].CalcFB(fb); + break; + case 7: + r = op[2].Calc(0); + r += op[1].Calc(0); + r += op[3].Calc(0); + r += op[0].CalcFB(fb); + break; + } + return r; +} + +// 合成 +ISample Channel4::CalcL() +{ + chip_->SetPMV(pms[chip_->GetPML()]); + + int r = 0; + switch (algo_) + { + case 0: + op[2].CalcL(op[1].Out()); + op[1].CalcL(op[0].Out()); + r = op[3].CalcL(op[2].Out()); + op[0].CalcFBL(fb); + break; + case 1: + op[2].CalcL(op[0].Out() + op[1].Out()); + op[1].CalcL(0); + r = op[3].CalcL(op[2].Out()); + op[0].CalcFBL(fb); + break; + case 2: + op[2].CalcL(op[1].Out()); + op[1].CalcL(0); + r = op[3].CalcL(op[0].Out() + op[2].Out()); + op[0].CalcFBL(fb); + break; + case 3: + op[2].CalcL(0); + op[1].CalcL(op[0].Out()); + r = op[3].CalcL(op[1].Out() + op[2].Out()); + op[0].CalcFBL(fb); + break; + case 4: + op[2].CalcL(0); + r = op[1].CalcL(op[0].Out()); + r += op[3].CalcL(op[2].Out()); + op[0].CalcFBL(fb); + break; + case 5: + r = op[2].CalcL(op[0].Out()); + r += op[1].CalcL(op[0].Out()); + r += op[3].CalcL(op[0].Out()); + op[0].CalcFBL(fb); + break; + case 6: + r = op[2].CalcL(0); + r += op[1].CalcL(op[0].Out()); + r += op[3].CalcL(0); + op[0].CalcFBL(fb); + break; + case 7: + r = op[2].CalcL(0); + r += op[1].CalcL(0); + r += op[3].CalcL(0); + r += op[0].CalcFBL(fb); + break; + } + return r; +} + +// 合成 +ISample Channel4::CalcN(uint noise) +{ + buf[1] = buf[2] = buf[3] = 0; + + buf[0] = op[0].out_; op[0].CalcFB(fb); + *out[0] += op[1].Calc(*in[0]); + *out[1] += op[2].Calc(*in[1]); + int o = op[3].out_; + op[3].CalcN(noise); + return *out[2] + o; +} + +// 合成 +ISample Channel4::CalcLN(uint noise) +{ + chip_->SetPMV(pms[chip_->GetPML()]); + buf[1] = buf[2] = buf[3] = 0; + + buf[0] = op[0].out_; op[0].CalcFBL(fb); + *out[0] += op[1].CalcL(*in[0]); + *out[1] += op[2].CalcL(*in[1]); + int o = op[3].out_; + op[3].CalcN(noise); + return *out[2] + o; +} + +} // namespace FM diff --git a/fmgen/fmgen.h b/fmgen/fmgen.h new file mode 100644 index 0000000..27f393f --- /dev/null +++ b/fmgen/fmgen.h @@ -0,0 +1,267 @@ +// --------------------------------------------------------------------------- +// FM Sound Generator +// Copyright (C) cisc 1998, 2001. +// --------------------------------------------------------------------------- +// $fmgen-Id: fmgen.h,v 1.37 2003/08/25 13:33:11 cisc Exp $ + +#ifndef FM_GEN_H +#define FM_GEN_H + +#include "common.h" +#include "fmgen_types.h" + +// --------------------------------------------------------------------------- +// 出力サンプルの型 +// +#define FM_SAMPLETYPE int32 // int16 or int32 + +// --------------------------------------------------------------------------- +// 定数その1 +// 静的テーブルのサイズ + +#define FM_LFOBITS 8 // 変更不可 +#define FM_TLBITS 7 + +// --------------------------------------------------------------------------- + +#define FM_TLENTS (1 << FM_TLBITS) +#define FM_LFOENTS (1 << FM_LFOBITS) +#define FM_TLPOS (FM_TLENTS/4) + +// サイン波の精度は 2^(1/256) +#define FM_CLENTS (0x1000 * 2) // sin + TL + LFO + +// --------------------------------------------------------------------------- + +namespace FM +{ + // Types ---------------------------------------------------------------- + typedef FM_SAMPLETYPE Sample; + typedef int32 ISample; + + enum OpType { typeN=0, typeM=1 }; + + void StoreSample(ISample& dest, int data); + + class Chip; + + // Operator ------------------------------------------------------------- + class Operator + { + public: + Operator(); + void SetChip(Chip* chip) { chip_ = chip; } + + static void MakeTimeTable(uint ratio); + + ISample Calc(ISample in); + ISample CalcL(ISample in); + ISample CalcFB(uint fb); + ISample CalcFBL(uint fb); + ISample CalcN(uint noise); + void Prepare(); + void KeyOn(); + void KeyOff(); + void Reset(); + void ResetFB(); + int IsOn(); + + void SetDT(uint dt); + void SetDT2(uint dt2); + void SetMULTI(uint multi); + void SetTL(uint tl, bool csm); + void SetKS(uint ks); + void SetAR(uint ar); + void SetDR(uint dr); + void SetSR(uint sr); + void SetRR(uint rr); + void SetSL(uint sl); + void SetSSGEC(uint ssgec); + void SetFNum(uint fnum); + void SetDPBN(uint dp, uint bn); + void SetMode(bool modulator); + void SetAMON(bool on); + void SetMS(uint ms); + void Mute(bool); + +// static void SetAML(uint l); +// static void SetPML(uint l); + + int Out() { return out_; } + + int dbgGetIn2() { return in2_; } + void dbgStopPG() { pg_diff_ = 0; pg_diff_lfo_ = 0; } + + private: + typedef uint32 Counter; + + Chip* chip_; + ISample out_, out2_; + ISample in2_; + + // Phase Generator ------------------------------------------------------ + uint32 PGCalc(); + uint32 PGCalcL(); + + uint dp_; // ΔP + uint detune_; // Detune + uint detune2_; // DT2 + uint multiple_; // Multiple + uint32 pg_count_; // Phase 現在値 + uint32 pg_diff_; // Phase 差分値 + int32 pg_diff_lfo_; // Phase 差分値 >> x + + // Envelop Generator --------------------------------------------------- + enum EGPhase { next, attack, decay, sustain, release, off }; + + void EGCalc(); + void EGStep(); + void ShiftPhase(EGPhase nextphase); + void SSGShiftPhase(int mode); + void SetEGRate(uint); + void EGUpdate(); + int FBCalc(int fb); + ISample LogToLin(uint a); + + + OpType type_; // OP の種類 (M, N...) + uint bn_; // Block/Note + int eg_level_; // EG の出力値 + int eg_level_on_next_phase_; // 次の eg_phase_ に移る値 + int eg_count_; // EG の次の変移までの時間 + int eg_count_diff_; // eg_count_ の差分 + int eg_out_; // EG+TL を合わせた出力値 + int tl_out_; // TL 分の出力値 +// int pm_depth_; // PM depth +// int am_depth_; // AM depth + int eg_rate_; + int eg_curve_count_; + int ssg_offset_; + int ssg_vector_; + int ssg_phase_; + + + uint key_scale_rate_; // key scale rate + EGPhase eg_phase_; + uint* ams_; + uint ms_; + + uint tl_; // Total Level (0-127) + uint tl_latch_; // Total Level Latch (for CSM mode) + uint ar_; // Attack Rate (0-63) + uint dr_; // Decay Rate (0-63) + uint sr_; // Sustain Rate (0-63) + uint sl_; // Sustain Level (0-127) + uint rr_; // Release Rate (0-63) + uint ks_; // Keyscale (0-3) + uint ssg_type_; // SSG-Type Envelop Control + + bool keyon_; + bool amon_; // enable Amplitude Modulation + bool param_changed_; // パラメータが更新された + bool mute_; + + // Tables --------------------------------------------------------------- + static Counter rate_table[16]; + static uint32 multable[4][16]; + + static const uint8 notetable[128]; + static const int8 dttable[256]; + static const int8 decaytable1[64][8]; + static const int decaytable2[16]; + static const int8 attacktable[64][8]; + static const int ssgenvtable[8][2][3][2]; + + static uint sinetable[1024]; + static int32 cltable[FM_CLENTS]; + + static bool tablehasmade; + static void MakeTable(); + + + + // friends -------------------------------------------------------------- + friend class Channel4; + friend void __stdcall FM_NextPhase(Operator* op); + + public: + int dbgopout_; + int dbgpgout_; + static const int32* dbgGetClTable() { return cltable; } + static const uint* dbgGetSineTable() { return sinetable; } + }; + + // 4-op Channel --------------------------------------------------------- + class Channel4 + { + public: + Channel4(); + void SetChip(Chip* chip); + void SetType(OpType type); + + ISample Calc(); + ISample CalcL(); + ISample CalcN(uint noise); + ISample CalcLN(uint noise); + void SetFNum(uint fnum); + void SetFB(uint fb); + void SetKCKF(uint kc, uint kf); + void SetAlgorithm(uint algo); + int Prepare(); + void KeyControl(uint key); + void Reset(); + void SetMS(uint ms); + void Mute(bool); + void Refresh(); + + void dbgStopPG() { for (int i=0; i<4; i++) op[i].dbgStopPG(); } + + private: + static const uint8 fbtable[8]; + uint fb; + int buf[4]; + int* in[3]; // 各 OP の入力ポインタ + int* out[3]; // 各 OP の出力ポインタ + int* pms; + int algo_; + Chip* chip_; + + static void MakeTable(); + + static bool tablehasmade; + static int kftable[64]; + + + public: + Operator op[4]; + }; + + // Chip resource + class Chip + { + public: + Chip(); + void SetRatio(uint ratio); + void SetAML(uint l); + void SetPML(uint l); + void SetPMV(int pmv) { pmv_ = pmv; } + + uint32 GetMulValue(uint dt2, uint mul) { return multable_[dt2][mul]; } + uint GetAML() { return aml_; } + uint GetPML() { return pml_; } + int GetPMV() { return pmv_; } + uint GetRatio() { return ratio_; } + + private: + void MakeTable(); + + uint ratio_; + uint aml_; + uint pml_; + int pmv_; + OpType optype_; + uint32 multable_[4][16]; + }; +} + +#endif // FM_GEN_H diff --git a/fmgen/fmgen_types.h b/fmgen/fmgen_types.h new file mode 100644 index 0000000..126df06 --- /dev/null +++ b/fmgen/fmgen_types.h @@ -0,0 +1,22 @@ +#if !defined(win32_types_h) +#define win32_types_h + +// 固定長型とか +typedef unsigned char uchar; +typedef unsigned short ushort; +typedef unsigned int uint; +typedef unsigned long ulong; + +typedef unsigned char uint8; +typedef unsigned short uint16; +typedef unsigned int uint32; + +typedef signed char sint8; +typedef signed short sint16; +typedef signed int sint32; + +typedef signed char int8; +typedef signed short int16; +typedef signed int int32; + +#endif // win32_types_h diff --git a/fmgen/fmgeninl.h b/fmgen/fmgeninl.h new file mode 100644 index 0000000..bd5f69f --- /dev/null +++ b/fmgen/fmgeninl.h @@ -0,0 +1,268 @@ +// --------------------------------------------------------------------------- +// FM Sound Generator +// Copyright (C) cisc 1998, 2003. +// --------------------------------------------------------------------------- +// $fmgen-Id: fmgeninl.h,v 1.26 2003/06/12 13:14:36 cisc Exp $ + +#ifndef FM_GEN_INL_H +#define FM_GEN_INL_H + +// --------------------------------------------------------------------------- +// 定数その2 +// +#define FM_PI 3.14159265358979323846 + +#define FM_SINEPRESIS 2 // EGとサイン波の精度の差 0(低)-2(高) + + +#define FM_OPSINBITS 10 +#define FM_OPSINENTS (1 << FM_OPSINBITS) + +#define FM_EGCBITS 18 // eg の count のシフト値 +#define FM_LFOCBITS 14 + +#ifdef FM_TUNEBUILD + #define FM_PGBITS 2 + #define FM_RATIOBITS 0 +#else + #define FM_PGBITS 9 + #define FM_RATIOBITS 7 // 8-12 くらいまで? +#endif + +#define FM_EGBITS 16 + +//extern int paramcount[]; +//#define PARAMCHANGE(i) paramcount[i]++; +#define PARAMCHANGE(i) + +namespace FM +{ + +// --------------------------------------------------------------------------- +// Operator +// +// フィードバックバッファをクリア +inline void Operator::ResetFB() +{ + out_ = out2_ = 0; +} + +// キーオン +inline void Operator::KeyOn() +{ + if (!keyon_) + { + keyon_ = true; + if (eg_phase_ == off || eg_phase_ == release) + { + ssg_phase_ = -1; + ShiftPhase(attack); + EGUpdate(); + in2_ = out_ = out2_ = 0; + pg_count_ = 0; + } + } +} + +// キーオフ +inline void Operator::KeyOff() +{ + if (keyon_) + { + keyon_ = false; + ShiftPhase(release); + } +} + +// オペレータは稼働中か? +inline int Operator::IsOn() +{ + return eg_phase_ - off; +} + +// Detune (0-7) +inline void Operator::SetDT(uint dt) +{ + detune_ = dt * 0x20, param_changed_ = true; + PARAMCHANGE(4); +} + +// DT2 (0-3) +inline void Operator::SetDT2(uint dt2) +{ + detune2_ = dt2 & 3, param_changed_ = true; + PARAMCHANGE(5); +} + +// Multiple (0-15) +inline void Operator::SetMULTI(uint mul) +{ + multiple_ = mul, param_changed_ = true; + PARAMCHANGE(6); +} + +// Total Level (0-127) (0.75dB step) +inline void Operator::SetTL(uint tl, bool csm) +{ + if (!csm) + { + tl_ = tl, param_changed_ = true; + PARAMCHANGE(7); + } + tl_latch_ = tl; +} + +// Attack Rate (0-63) +inline void Operator::SetAR(uint ar) +{ + ar_ = ar; + param_changed_ = true; + PARAMCHANGE(8); +} + +// Decay Rate (0-63) +inline void Operator::SetDR(uint dr) +{ + dr_ = dr; + param_changed_ = true; + PARAMCHANGE(9); +} + +// Sustain Rate (0-63) +inline void Operator::SetSR(uint sr) +{ + sr_ = sr; + param_changed_ = true; + PARAMCHANGE(10); +} + +// Sustain Level (0-127) +inline void Operator::SetSL(uint sl) +{ + sl_ = sl; + param_changed_ = true; + PARAMCHANGE(11); +} + +// Release Rate (0-63) +inline void Operator::SetRR(uint rr) +{ + rr_ = rr; + param_changed_ = true; + PARAMCHANGE(12); +} + +// Keyscale (0-3) +inline void Operator::SetKS(uint ks) +{ + ks_ = ks; + param_changed_ = true; + PARAMCHANGE(13); +} + +// SSG-type Envelop (0-15) +inline void Operator::SetSSGEC(uint ssgec) +{ + if (ssgec & 8) + ssg_type_ = ssgec; + else + ssg_type_ = 0; +} + +inline void Operator::SetAMON(bool amon) +{ + amon_ = amon; + param_changed_ = true; + PARAMCHANGE(14); +} + +inline void Operator::Mute(bool mute) +{ + mute_ = mute; + param_changed_ = true; + PARAMCHANGE(15); +} + +inline void Operator::SetMS(uint ms) +{ + ms_ = ms; + param_changed_ = true; + PARAMCHANGE(16); +} + +// --------------------------------------------------------------------------- +// 4-op Channel + +// オペレータの種類 (LFO) を設定 +inline void Channel4::SetType(OpType type) +{ + for (int i=0; i<4; i++) + op[i].type_ = type; +} + +// セルフ・フィードバックレートの設定 (0-7) +inline void Channel4::SetFB(uint feedback) +{ + fb = fbtable[feedback]; +} + +// OPNA 系 LFO の設定 +inline void Channel4::SetMS(uint ms) +{ + op[0].SetMS(ms); + op[1].SetMS(ms); + op[2].SetMS(ms); + op[3].SetMS(ms); +} + +// チャンネル・マスク +inline void Channel4::Mute(bool m) +{ + for (int i=0; i<4; i++) + op[i].Mute(m); +} + +// 内部パラメータを再計算 +inline void Channel4::Refresh() +{ + for (int i=0; i<4; i++) + op[i].param_changed_ = true; + PARAMCHANGE(3); +} + +inline void Channel4::SetChip(Chip* chip) +{ + chip_ = chip; + for (int i=0; i<4; i++) + op[i].SetChip(chip); +} + +// --------------------------------------------------------------------------- +// +// +inline void StoreSample(Sample& dest, ISample data) +{ + if (sizeof(Sample) == 2) + dest = (Sample) Limit(dest + data, 0x7fff, -0x8000); + else + dest += data; +} + + +// --------------------------------------------------------------------------- +// AM のレベルを設定 +inline void Chip::SetAML(uint l) +{ + aml_ = l & (FM_LFOENTS - 1); +} + +// PM のレベルを設定 +inline void Chip::SetPML(uint l) +{ + pml_ = l & (FM_LFOENTS - 1); +} + + +} + +#endif // FM_GEN_INL_H diff --git a/fmgen/fmtimer.cpp b/fmgen/fmtimer.cpp new file mode 100644 index 0000000..d4fb87f --- /dev/null +++ b/fmgen/fmtimer.cpp @@ -0,0 +1,191 @@ +// --------------------------------------------------------------------------- +// FM sound generator common timer module +// Copyright (C) cisc 1998, 2000. +// --------------------------------------------------------------------------- +// $fmgen-Id: fmtimer.cpp,v 1.1 2000/09/08 13:45:56 cisc Exp $ + +#include "common.h" +#include "fmgen_types.h" +#include "headers.h" +#include "fmtimer.h" + +using namespace FM; + +// --------------------------------------------------------------------------- +// タイマー制御 +// +void Timer::SetTimerControl(uint data) +{ + uint tmp = regtc ^ data; + regtc = uint8(data); + + if (data & 0x10) + ResetStatus(1); + if (data & 0x20) + ResetStatus(2); + + if (tmp & 0x01) + timera_count = (data & 1) ? timera : 0; + if (tmp & 0x02) + timerb_count = (data & 2) ? timerb : 0; +} + +#if 1 + +// --------------------------------------------------------------------------- +// タイマーA 周期設定 +// +void Timer::SetTimerA(uint addr, uint data) +{ + uint tmp; + regta[addr & 1] = uint8(data); + tmp = (regta[0] << 2) + (regta[1] & 3); + timera = (1024-tmp) * timer_step; +// LOG2("Timer A = %d %d us\n", tmp, timera >> 16); +} + +// --------------------------------------------------------------------------- +// タイマーB 周期設定 +// +void Timer::SetTimerB(uint data) +{ + timerb = (256-data) * timer_step; +// LOG2("Timer B = %d %d us\n", data, timerb >> 12); +} + +// --------------------------------------------------------------------------- +// タイマー時間処理 +// +bool Timer::Count(int32 us) +{ + bool event = false; + + if (timera_count) + { + timera_count -= us << 16; + if (timera_count <= 0) + { + event = true; + TimerA(); + + while (timera_count <= 0) + timera_count += timera; + + if (regtc & 4) + SetStatus(1); + } + } + if (timerb_count) + { + timerb_count -= us << 12; + if (timerb_count <= 0) + { + event = true; + while (timerb_count <= 0) + timerb_count += timerb; + + if (regtc & 8) + SetStatus(2); + } + } + return event; +} + +// --------------------------------------------------------------------------- +// 次にタイマーが発生するまでの時間を求める +// +int32 Timer::GetNextEvent() +{ + uint32 ta = ((timera_count + 0xffff) >> 16) - 1; + uint32 tb = ((timerb_count + 0xfff) >> 12) - 1; + return (ta < tb ? ta : tb) + 1; +} + +// --------------------------------------------------------------------------- +// タイマー基準値設定 +// +void Timer::SetTimerBase(uint clock) +{ + timer_step = int32(1000000. * 65536 / clock); +} + +#else + +// --------------------------------------------------------------------------- +// タイマーA 周期設定 +// +void Timer::SetTimerA(uint addr, uint data) +{ + regta[addr & 1] = uint8(data); + timera = (1024 - ((regta[0] << 2) + (regta[1] & 3))) << 16; +} + +// --------------------------------------------------------------------------- +// タイマーB 周期設定 +// +void Timer::SetTimerB(uint data) +{ + timerb = (256-data) << (16 + 4); +} + +// --------------------------------------------------------------------------- +// タイマー時間処理 +// +bool Timer::Count(int32 us) +{ + bool event = false; + + int tick = us * timer_step; + + if (timera_count) + { + timera_count -= tick; + if (timera_count <= 0) + { + event = true; + TimerA(); + + while (timera_count <= 0) + timera_count += timera; + + if (regtc & 4) + SetStatus(1); + } + } + if (timerb_count) + { + timerb_count -= tick; + if (timerb_count <= 0) + { + event = true; + while (timerb_count <= 0) + timerb_count += timerb; + + if (regtc & 8) + SetStatus(2); + } + } + return event; +} + +// --------------------------------------------------------------------------- +// 次にタイマーが発生するまでの時間を求める +// +int32 Timer::GetNextEvent() +{ + uint32 ta = timera_count - 1; + uint32 tb = timerb_count - 1; + uint32 t = (ta < tb ? ta : tb) + 1; + + return (t+timer_step-1) / timer_step; +} + +// --------------------------------------------------------------------------- +// タイマー基準値設定 +// +void Timer::SetTimerBase(uint clock) +{ + timer_step = clock * 1024 / 15625; +} + +#endif diff --git a/fmgen/fmtimer.h b/fmgen/fmtimer.h new file mode 100644 index 0000000..43a32c6 --- /dev/null +++ b/fmgen/fmtimer.h @@ -0,0 +1,53 @@ +// --------------------------------------------------------------------------- +// FM sound generator common timer module +// Copyright (C) cisc 1998, 2000. +// --------------------------------------------------------------------------- +// $fmgen-Id: fmtimer.h,v 1.2 2003/04/22 13:12:53 cisc Exp $ + +#ifndef FM_TIMER_H +#define FM_TIMER_H + +// --------------------------------------------------------------------------- + +namespace FM +{ + class Timer + { + public: + void Reset(); + bool Count(int32 us); + int32 GetNextEvent(); + + protected: + virtual void SetStatus(uint bit) = 0; + virtual void ResetStatus(uint bit) = 0; + + void SetTimerBase(uint clock); + void SetTimerA(uint addr, uint data); + void SetTimerB(uint data); + void SetTimerControl(uint data); + + uint8 status; + uint8 regtc; + + private: + virtual void TimerA() {} + uint8 regta[2]; + + int32 timera, timera_count; + int32 timerb, timerb_count; + int32 timer_step; + }; + +// --------------------------------------------------------------------------- +// 初期化 +// +inline void Timer::Reset() +{ + timera_count = 0; + timerb_count = 0; +} + +} // namespace FM + +#endif // FM_TIMER_H diff --git a/fmgen/headers.h b/fmgen/headers.h new file mode 100644 index 0000000..8bd350a --- /dev/null +++ b/fmgen/headers.h @@ -0,0 +1,21 @@ +#ifndef WIN_HEADERS_H +#define WIN_HEADERS_H + +#define STRICT +#define WIN32_LEAN_AND_MEAN + +#include +#include +#include +#include +#include +#include + +#ifdef _MSC_VER + #undef max + #define max _MAX + #undef min + #define min _MIN +#endif + +#endif // WIN_HEADERS_H diff --git a/fmgen/misc.h b/fmgen/misc.h new file mode 100644 index 0000000..3e55c0a --- /dev/null +++ b/fmgen/misc.h @@ -0,0 +1,69 @@ +// --------------------------------------------------------------------------- +// misc.h +// Copyright (C) cisc 1998, 1999. +// --------------------------------------------------------------------------- +// $fmgen-Id: misc.h,v 1.5 2002/05/31 09:45:20 cisc Exp $ + +#ifndef MISC_H +#define MISC_H + +inline int Max(int x, int y) { return (x > y) ? x : y; } +inline int Min(int x, int y) { return (x < y) ? x : y; } +inline int Abs(int x) { return x >= 0 ? x : -x; } + +inline int Limit(int v, int max, int min) +{ + return v > max ? max : (v < min ? min : v); +} + +inline unsigned int BSwap(unsigned int a) +{ + return (a >> 24) | ((a >> 8) & 0xff00) | ((a << 8) & 0xff0000) | (a << 24); +} + +inline unsigned int NtoBCD(unsigned int a) +{ + return ((a / 10) << 4) + (a % 10); +} + +inline unsigned int BCDtoN(unsigned int v) +{ + return (v >> 4) * 10 + (v & 15); +} + + +template +inline T gcd(T x, T y) +{ + T t; + while (y) + { + t = x % y; + x = y; + y = t; + } + return x; +} + + +template +T bessel0(T x) +{ + T p, r, s; + + r = 1.0; + s = 1.0; + p = (x / 2.0) / s; + + while (p > 1.0E-10) + { + r += p * p; + s += 1.0; + p *= (x / 2.0) / s; + } + return r; +} + + +#endif // MISC_H + diff --git a/fmgen/opm.cpp b/fmgen/opm.cpp new file mode 100644 index 0000000..799fdaf --- /dev/null +++ b/fmgen/opm.cpp @@ -0,0 +1,506 @@ +// --------------------------------------------------------------------------- +// OPM interface +// Copyright (C) cisc 1998, 2003. +// --------------------------------------------------------------------------- +// $fmgen-Id: opm.cpp,v 1.26 2003/08/25 13:53:08 cisc Exp $ + +#include "headers.h" +#include "misc.h" +#include "opm.h" +#include "fmgeninl.h" + +//#define LOGNAME "opm" + +namespace FM +{ + +int OPM::amtable[4][OPM_LFOENTS] = { -1, }; +int OPM::pmtable[4][OPM_LFOENTS]; + +// --------------------------------------------------------------------------- +// 構築 +// +OPM::OPM() +{ + lfo_count_ = 0; + lfo_count_prev_ = ~0; + BuildLFOTable(); + for (int i=0; i<8; i++) + { + ch[i].SetChip(&chip); + ch[i].SetType(typeM); + } +} + +// --------------------------------------------------------------------------- +// 初期化 +// +bool OPM::Init(uint c, uint rf, bool ip) +{ + if (!SetRate(c, rf, ip)) + return false; + + Reset(); + + SetVolume(0); + SetChannelMask(0); + return true; +} + +// --------------------------------------------------------------------------- +// 再設定 +// +bool OPM::SetRate(uint c, uint r, bool) +{ + clock = c; + pcmrate = r; + rate = r; + + RebuildTimeTable(); + + return true; +} + +// --------------------------------------------------------------------------- +// チャンネルマスクの設定 +// +void OPM::SetChannelMask(uint mask) +{ + for (int i=0; i<8; i++) + ch[i].Mute(!!(mask & (1 << i))); +} + +// --------------------------------------------------------------------------- +// リセット +// +void OPM::Reset() +{ + int i; + for (i=0x0; i<0x100; i++) SetReg(i, 0); + SetReg(0x19, 0x80); + Timer::Reset(); + + status = 0; + noise = 12345; + noisecount = 0; + + for (i=0; i<8; i++) + ch[i].Reset(); +} + +// --------------------------------------------------------------------------- +// 設定に依存するテーブルの作成 +// +void OPM::RebuildTimeTable() +{ + uint fmclock = clock / 64; + + assert(fmclock < (0x80000000 >> FM_RATIOBITS)); + rateratio = ((fmclock << FM_RATIOBITS) + rate/2) / rate; + SetTimerBase(fmclock); + +// FM::MakeTimeTable(rateratio); + chip.SetRatio(rateratio); + +// lfo_diff_ = + + +// lfodcount = (16 + (lfofreq & 15)) << (lfofreq >> 4); +// lfodcount = lfodcount * rateratio >> FM_RATIOBITS; +} + +// --------------------------------------------------------------------------- +// タイマー A 発生時イベント (CSM) +// +void OPM::TimerA() +{ + if (regtc & 0x80) + { + for (int i=0; i<8; i++) + { + ch[i].KeyControl(0); + ch[i].KeyControl(0xf); + } + } +} + +// --------------------------------------------------------------------------- +// 音量設定 +// +void OPM::SetVolume(int db) +{ + db = Min(db, 20); + if (db > -192) + fmvolume = int(16384.0 * pow(10, db / 40.0)); + else + fmvolume = 0; +} + +// --------------------------------------------------------------------------- +// ステータスフラグ設定 +// +void OPM::SetStatus(uint bits) +{ + if (!(status & bits)) + { + status |= bits; + Intr(true); + } +} + +// --------------------------------------------------------------------------- +// ステータスフラグ解除 +// +void OPM::ResetStatus(uint bits) +{ + if (status & bits) + { + status &= ~bits; + if (!status) + Intr(false); + } +} + +// --------------------------------------------------------------------------- +// レジスタアレイにデータを設定 +// +void OPM::SetReg(uint addr, uint data) +{ + if (addr >= 0x100) + return; + + int c = addr & 7; + switch (addr & 0xff) + { + case 0x01: // TEST (lfo restart) + if (data & 2) + { + lfo_count_ = 0; + lfo_count_prev_ = ~0; + } + reg01 = data; + break; + + case 0x08: // KEYON + if (!(regtc & 0x80)) + ch[data & 7].KeyControl(data >> 3); + else + { + c = data & 7; + if (!(data & 0x08)) ch[c].op[0].KeyOff(); + if (!(data & 0x10)) ch[c].op[1].KeyOff(); + if (!(data & 0x20)) ch[c].op[2].KeyOff(); + if (!(data & 0x40)) ch[c].op[3].KeyOff(); + } + break; + + case 0x10: case 0x11: // CLKA1, CLKA2 + SetTimerA(addr, data); + break; + + case 0x12: // CLKB + SetTimerB(data); + break; + + case 0x14: // CSM, TIMER + SetTimerControl(data); + break; + + case 0x18: // LFRQ(lfo freq) + lfofreq = data; + + assert(16-4-FM_RATIOBITS >= 0); + lfo_count_diff_ = + rateratio + * ((16 + (lfofreq & 15)) << (16 - 4 - FM_RATIOBITS)) + / (1 << (15 - (lfofreq >> 4))); + + break; + + case 0x19: // PMD/AMD + (data & 0x80 ? pmd : amd) = data & 0x7f; + break; + + case 0x1b: // CT, W(lfo waveform) + lfowaveform = data & 3; + break; + + // RL, FB, Connect + case 0x20: case 0x21: case 0x22: case 0x23: + case 0x24: case 0x25: case 0x26: case 0x27: + ch[c].SetFB((data >> 3) & 7); + ch[c].SetAlgorithm(data & 7); + pan[c] = (data >> 6) & 3; + break; + + // KC + case 0x28: case 0x29: case 0x2a: case 0x2b: + case 0x2c: case 0x2d: case 0x2e: case 0x2f: + kc[c] = data; + ch[c].SetKCKF(kc[c], kf[c]); + break; + + // KF + case 0x30: case 0x31: case 0x32: case 0x33: + case 0x34: case 0x35: case 0x36: case 0x37: + kf[c] = data >> 2; + ch[c].SetKCKF(kc[c], kf[c]); + break; + + // PMS, AMS + case 0x38: case 0x39: case 0x3a: case 0x3b: + case 0x3c: case 0x3d: case 0x3e: case 0x3f: + ch[c].SetMS((data << 4) | (data >> 4)); + break; + + case 0x0f: // NE/NFRQ (noise) + noisedelta = data; + noisecount = 0; + break; + + default: + if (addr >= 0x40) + OPM::SetParameter(addr, data); + break; + } +} + + +// --------------------------------------------------------------------------- +// パラメータセット +// +void OPM::SetParameter(uint addr, uint data) +{ + static const uint8 sltable[16] = + { + 0, 4, 8, 12, 16, 20, 24, 28, + 32, 36, 40, 44, 48, 52, 56, 124, + }; + static const uint8 slottable[4] = { 0, 2, 1, 3 }; + + uint slot = slottable[(addr >> 3) & 3]; + Operator* op = &ch[addr & 7].op[slot]; + + switch ((addr >> 5) & 7) + { + case 2: // 40-5F DT1/MULTI + op->SetDT((data >> 4) & 0x07); + op->SetMULTI(data & 0x0f); + break; + + case 3: // 60-7F TL + op->SetTL(data & 0x7f, (regtc & 0x80) != 0); + break; + + case 4: // 80-9F KS/AR + op->SetKS((data >> 6) & 3); + op->SetAR((data & 0x1f) * 2); + break; + + case 5: // A0-BF DR/AMON(D1R/AMS-EN) + op->SetDR((data & 0x1f) * 2); + op->SetAMON((data & 0x80) != 0); + break; + + case 6: // C0-DF SR(D2R), DT2 + op->SetSR((data & 0x1f) * 2); + op->SetDT2((data >> 6) & 3); + break; + + case 7: // E0-FF SL(D1L)/RR + op->SetSL(sltable[(data >> 4) & 15]); + op->SetRR((data & 0x0f) * 4 + 2); + break; + } +} + +// --------------------------------------------------------------------------- +// +// +void OPM::BuildLFOTable() +{ + if (amtable[0][0] != -1) + return; + + for (int type=0; type<4; type++) + { + int r = 0; + for (int c=0; c> 15) & 0x1fe; +// fprintf(stderr, "%.8x %.2x\n", lfo_count_, c); + chip.SetPML(pmtable[lfowaveform][c] * pmd / 128 + 0x80); + chip.SetAML(amtable[lfowaveform][c] * amd / 128); + } + } + else + { + if ((lfo_count_ ^ lfo_count_prev_) & ~((1 << 17) - 1)) + { + int c = (rand() / 17) & 0xff; + chip.SetPML((c - 0x80) * pmd / 128 + 0x80); + chip.SetAML(c * amd / 128); + } + } + lfo_count_prev_ = lfo_count_; + lfo_step_++; + if ((lfo_step_ & 7) == 0) + { + lfo_count_ += lfo_count_diff_; + } +} + +inline uint OPM::Noise() +{ + noisecount += 2 * rateratio; + if (noisecount >= (32 << FM_RATIOBITS)) + { + int n = 32 - (noisedelta & 0x1f); + if (n == 1) + n = 2; + + noisecount = noisecount - (n << FM_RATIOBITS); + if ((noisedelta & 0x1f) == 0x1f) + noisecount -= FM_RATIOBITS; + noise = (noise >> 1) ^ (noise & 1 ? 0x8408 : 0); + } + return noise; +} + +// --------------------------------------------------------------------------- +// 合成の一部 +// +inline void OPM::MixSub(int activech, ISample** idest) +{ + if (activech & 0x4000) (*idest[0] = ch[0].Calc()); + if (activech & 0x1000) (*idest[1] += ch[1].Calc()); + if (activech & 0x0400) (*idest[2] += ch[2].Calc()); + if (activech & 0x0100) (*idest[3] += ch[3].Calc()); + if (activech & 0x0040) (*idest[4] += ch[4].Calc()); + if (activech & 0x0010) (*idest[5] += ch[5].Calc()); + if (activech & 0x0004) (*idest[6] += ch[6].Calc()); + if (activech & 0x0001) + { + if (noisedelta & 0x80) + *idest[7] += ch[7].CalcN(Noise()); + else + *idest[7] += ch[7].Calc(); + } +} + +inline void OPM::MixSubL(int activech, ISample** idest) +{ + if (activech & 0x4000) (*idest[0] = ch[0].CalcL()); + if (activech & 0x1000) (*idest[1] += ch[1].CalcL()); + if (activech & 0x0400) (*idest[2] += ch[2].CalcL()); + if (activech & 0x0100) (*idest[3] += ch[3].CalcL()); + if (activech & 0x0040) (*idest[4] += ch[4].CalcL()); + if (activech & 0x0010) (*idest[5] += ch[5].CalcL()); + if (activech & 0x0004) (*idest[6] += ch[6].CalcL()); + if (activech & 0x0001) + { + if (noisedelta & 0x80) + *idest[7] += ch[7].CalcLN(Noise()); + else + *idest[7] += ch[7].CalcL(); + } +} + + +// --------------------------------------------------------------------------- +// 合成 (stereo) +// +void OPM::Mix(Sample* buffer, int nsamples) +{ +#define IStoSample(s) ((Limit(s, 0xffff, -0x10000) * fmvolume) >> 14) +//#define IStoSample(s) ((s * fmvolume) >> 14) + + // odd bits - active, even bits - lfo + uint activech=0; + for (int i=0; i<8; i++) + activech = (activech << 2) | ch[i].Prepare(); + + if (activech & 0x5555) + { + // LFO 波形初期化ビット = 1 ならば LFO はかからない? + if (reg01 & 0x02) + activech &= 0x5555; + + // Mix + ISample ibuf[8]; + ISample* idest[8]; + idest[0] = &ibuf[pan[0]]; + idest[1] = &ibuf[pan[1]]; + idest[2] = &ibuf[pan[2]]; + idest[3] = &ibuf[pan[3]]; + idest[4] = &ibuf[pan[4]]; + idest[5] = &ibuf[pan[5]]; + idest[6] = &ibuf[pan[6]]; + idest[7] = &ibuf[pan[7]]; + + Sample* limit = buffer + nsamples * 2; + for (Sample* dest = buffer; dest < limit; dest+=2) + { + ibuf[1] = ibuf[2] = ibuf[3] = 0; + if (activech & 0xaaaa) + LFO(), MixSubL(activech, idest); + else + LFO(), MixSub(activech, idest); + + StoreSample(dest[0], IStoSample(ibuf[1] + ibuf[3])); + StoreSample(dest[1], IStoSample(ibuf[2] + ibuf[3])); + } + } +#undef IStoSample +} + +} // namespace FM + diff --git a/fmgen/opm.h b/fmgen/opm.h new file mode 100644 index 0000000..6f320f4 --- /dev/null +++ b/fmgen/opm.h @@ -0,0 +1,161 @@ +// --------------------------------------------------------------------------- +// OPM-like Sound Generator +// Copyright (C) cisc 1998, 2003. +// --------------------------------------------------------------------------- +// $fmgen-Id: opm.h,v 1.14 2003/06/07 08:25:53 cisc Exp $ + +#ifndef FM_OPM_H +#define FM_OPM_H + +#include "fmgen.h" +#include "fmtimer.h" +#include "psg.h" + +// --------------------------------------------------------------------------- +// class OPM +// OPM に良く似た(?)音を生成する音源ユニット +// +// interface: +// bool Init(uint clock, uint rate, bool); +// 初期化.このクラスを使用する前にかならず呼んでおくこと. +// 注意: 線形補完モードは廃止されました +// +// clock: OPM のクロック周波数(Hz) +// +// rate: 生成する PCM の標本周波数(Hz) +// +// +// 返値 初期化に成功すれば true +// +// bool SetRate(uint clock, uint rate, bool) +// クロックや PCM レートを変更する +// 引数等は Init と同様. +// +// void Mix(Sample* dest, int nsamples) +// Stereo PCM データを nsamples 分合成し, dest で始まる配列に +// 加える(加算する) +// ・dest には sample*2 個分の領域が必要 +// ・格納形式は L, R, L, R... となる. +// ・あくまで加算なので,あらかじめ配列をゼロクリアする必要がある +// ・FM_SAMPLETYPE が short 型の場合クリッピングが行われる. +// ・この関数は音源内部のタイマーとは独立している. +// Timer は Count と GetNextEvent で操作する必要がある. +// +// void Reset() +// 音源をリセット(初期化)する +// +// void SetReg(uint reg, uint data) +// 音源のレジスタ reg に data を書き込む +// +// uint ReadStatus() +// 音源のステータスレジスタを読み出す +// busy フラグは常に 0 +// +// bool Count(uint32 t) +// 音源のタイマーを t [10^(-6) 秒] 進める. +// 音源の内部状態に変化があった時(timer オーバーフロー) +// true を返す +// +// uint32 GetNextEvent() +// 音源のタイマーのどちらかがオーバーフローするまでに必要な +// 時間[μ秒]を返す +// タイマーが停止している場合は 0 を返す. +// +// void SetVolume(int db) +// 各音源の音量を+−方向に調節する.標準値は 0. +// 単位は約 1/2 dB,有効範囲の上限は 20 (10dB) +// +// 仮想関数: +// virtual void Intr(bool irq) +// IRQ 出力に変化があった場合呼ばれる. +// irq = true: IRQ 要求が発生 +// irq = false: IRQ 要求が消える +// +namespace FM +{ + // YM2151(OPM) ---------------------------------------------------- + class OPM : public Timer + { + public: + OPM(); + virtual ~OPM() {} + + bool Init(uint c, uint r, bool=false); + bool SetRate(uint c, uint r, bool); + void SetLPFCutoff(uint freq); + void Reset(); + + void SetReg(uint addr, uint data); + uint GetReg(uint addr); + uint ReadStatus() { return status & 0x03; } + + void Mix(Sample* buffer, int nsamples); + + void SetVolume(int db); + void SetChannelMask(uint mask); + + private: + virtual void Intr(bool) {} + + private: + enum + { + OPM_LFOENTS = 512, + }; + + void SetStatus(uint bit); + void ResetStatus(uint bit); + void SetParameter(uint addr, uint data); + void TimerA(); + void RebuildTimeTable(); + void MixSub(int activech, ISample**); + void MixSubL(int activech, ISample**); + void LFO(); + uint Noise(); + + int fmvolume; + + uint clock; + uint rate; + uint pcmrate; + + uint pmd; + uint amd; + uint lfocount; + uint lfodcount; + + uint lfo_count_; + uint lfo_count_diff_; + uint lfo_step_; + uint lfo_count_prev_; + + uint lfowaveform; + uint rateratio; + uint noise; + int32 noisecount; + uint32 noisedelta; + + bool interpolation; + uint8 lfofreq; + uint8 status; + uint8 reg01; + + uint8 kc[8]; + uint8 kf[8]; + uint8 pan[8]; + + Channel4 ch[8]; + Chip chip; + + static void BuildLFOTable(); + static int amtable[4][OPM_LFOENTS]; + static int pmtable[4][OPM_LFOENTS]; + + public: + int dbgGetOpOut(int c, int s) { return ch[c].op[s].dbgopout_; } + Channel4* dbgGetCh(int c) { return &ch[c]; } + + }; +} + +#endif // FM_OPM_H diff --git a/fmgen/opna.cpp b/fmgen/opna.cpp new file mode 100644 index 0000000..3b8f85f --- /dev/null +++ b/fmgen/opna.cpp @@ -0,0 +1,2197 @@ +// --------------------------------------------------------------------------- +// OPN/A/B interface with ADPCM support +// Copyright (C) cisc 1998, 2001. +// --------------------------------------------------------------------------- +// $fmgen-Id: opna.cpp,v 1.68 2003/06/12 14:03:44 cisc Exp $ + +#include "headers.h" +#include "misc.h" +#include "opna.h" +#include "fmgeninl.h" + +#define BUILD_OPN +#define BUILD_OPNA +//#define BUILD_OPNB +#define BUILD_288 + + +// TOFIX: +// OPN ch3 が常にPrepareの対象となってしまう障害 + + +// --------------------------------------------------------------------------- +// OPNA: ADPCM データの格納方式の違い (8bit/1bit) をエミュレートしない +// このオプションを有効にすると ADPCM メモリへのアクセス(特に 8bit モード)が +// 多少軽くなるかも +// +//#define NO_BITTYPE_EMULATION + +#ifdef BUILD_OPNA +#include "file.h" +#endif + +namespace FM +{ + +// --------------------------------------------------------------------------- +// OPNBase + +#if defined(BUILD_OPN) || defined(BUILD_OPNA) || defined (BUILD_OPNB) + +uint32 OPNBase::lfotable[8]; // OPNA/B 用 + +OPNBase::OPNBase() +{ + prescale = 0; +} + +// パラメータセット +void OPNBase::SetParameter(Channel4* ch, uint addr, uint data) +{ + static const uint slottable[4] = { 0, 2, 1, 3 }; + static const uint8 sltable[16] = + { + 0, 4, 8, 12, 16, 20, 24, 28, + 32, 36, 40, 44, 48, 52, 56, 124, + }; + + if ((addr & 3) < 3) + { + uint slot = slottable[(addr >> 2) & 3]; + Operator* op = &ch->op[slot]; + + switch ((addr >> 4) & 15) + { + case 3: // 30-3E DT/MULTI + op->SetDT((data >> 4) & 0x07); + op->SetMULTI(data & 0x0f); + break; + + case 4: // 40-4E TL + op->SetTL(data & 0x7f, (regtc & 0x80) && (csmch == ch)); + break; + + case 5: // 50-5E KS/AR + op->SetKS((data >> 6) & 3); + op->SetAR((data & 0x1f) * 2); + break; + + case 6: // 60-6E DR/AMON + op->SetDR((data & 0x1f) * 2); + op->SetAMON((data & 0x80) != 0); + break; + + case 7: // 70-7E SR + op->SetSR((data & 0x1f) * 2); + break; + + case 8: // 80-8E SL/RR + op->SetSL(sltable[(data >> 4) & 15]); + op->SetRR((data & 0x0f) * 4 + 2); + break; + + case 9: // 90-9E SSG-EC + op->SetSSGEC(data & 0x0f); + break; + } + } +} + +// リセット +void OPNBase::Reset() +{ + status = 0; + SetPrescaler(0); + Timer::Reset(); + psg.Reset(); +} + +// プリスケーラ設定 +void OPNBase::SetPrescaler(uint p) +{ + static const char table[3][2] = { { 6, 4 }, { 3, 2 }, { 2, 1 } }; + static const uint8 table2[8] = { 108, 77, 71, 67, 62, 44, 8, 5 }; + // 512 + if (prescale != p) + { + prescale = p; + //assert(0 <= prescale && prescale < 3); + + uint fmclock = clock / table[p][0] / 12; + + rate = psgrate; + + // 合成周波数と出力周波数の比 + assert(fmclock < (0x80000000 >> FM_RATIOBITS)); + uint ratio = ((fmclock << FM_RATIOBITS) + rate/2) / rate; + + SetTimerBase(fmclock); +// MakeTimeTable(ratio); + chip.SetRatio(ratio); + psg.SetClock(clock / table[p][1], psgrate); + + for (int i=0; i<8; i++) + { + lfotable[i] = (ratio << (2+FM_LFOCBITS-FM_RATIOBITS)) / table2[i]; + } + } +} + +// 初期化 +bool OPNBase::Init(uint c, uint r) +{ + clock = c; + psgrate = r; + + return true; +} + +// 音量設定 +void OPNBase::SetVolumeFM(int db) +{ + db = Min(db, 20); + if (db > -192) + fmvolume = int(16384.0 * pow(10.0, db / 40.0)); + else + fmvolume = 0; +} + +// タイマー時間処理 +void OPNBase::TimerA() +{ + if (regtc & 0x80) + { + csmch->KeyControl(0x00); + csmch->KeyControl(0x0f); + } +} + +#endif // defined(BUILD_OPN) || defined(BUILD_OPNA) || defined (BUILD_OPNB) + +// --------------------------------------------------------------------------- +// YM2203 +// +#ifdef BUILD_OPN + +OPN::OPN() +{ + SetVolumeFM(0); + SetVolumePSG(0); + + csmch = &ch[2]; + + for (int i=0; i<3; i++) + { + ch[i].SetChip(&chip); + ch[i].SetType(typeN); + } +} + +// 初期化 +bool OPN::Init(uint c, uint r, bool ip, const char*) +{ + if (!SetRate(c, r, ip)) + return false; + + Reset(); + + SetVolumeFM(0); + SetVolumePSG(0); + SetChannelMask(0); + return true; +} + +// サンプリングレート変更 +bool OPN::SetRate(uint c, uint r, bool) +{ + OPNBase::Init(c, r); + RebuildTimeTable(); + return true; +} + + +// リセット +void OPN::Reset() +{ + int i; + for (i=0x20; i<0x28; i++) SetReg(i, 0); + for (i=0x30; i<0xc0; i++) SetReg(i, 0); + OPNBase::Reset(); + ch[0].Reset(); + ch[1].Reset(); + ch[2].Reset(); +} + + +// レジスタ読み込み +uint OPN::GetReg(uint addr) +{ + if (addr < 0x10) + return psg.GetReg(addr); + else + return 0; +} + + +// レジスタアレイにデータを設定 +void OPN::SetReg(uint addr, uint data) +{ +// LOG2("reg[%.2x] <- %.2x\n", addr, data); + if (addr >= 0x100) + return; + + int c = addr & 3; + switch (addr) + { + case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: + case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: + psg.SetReg(addr, data); + break; + + case 0x24: case 0x25: + SetTimerA(addr, data); + break; + + case 0x26: + SetTimerB(data); + break; + + case 0x27: + SetTimerControl(data); + break; + + case 0x28: // Key On/Off + if ((data & 3) < 3) + ch[data & 3].KeyControl(data >> 4); + break; + + case 0x2d: case 0x2e: case 0x2f: + SetPrescaler(addr-0x2d); + break; + + // F-Number + case 0xa0: case 0xa1: case 0xa2: + fnum[c] = data + fnum2[c] * 0x100; + break; + + case 0xa4: case 0xa5: case 0xa6: + fnum2[c] = uint8(data); + break; + + case 0xa8: case 0xa9: case 0xaa: + fnum3[c] = data + fnum2[c+3] * 0x100; + break; + + case 0xac: case 0xad: case 0xae: + fnum2[c+3] = uint8(data); + break; + + case 0xb0: case 0xb1: case 0xb2: + ch[c].SetFB((data >> 3) & 7); + ch[c].SetAlgorithm(data & 7); + break; + + default: + if (c < 3) + { + if ((addr & 0xf0) == 0x60) + data &= 0x1f; + OPNBase::SetParameter(&ch[c], addr, data); + } + break; + } +} + +// ステータスフラグ設定 +void OPN::SetStatus(uint bits) +{ + if (!(status & bits)) + { + status |= bits; + Intr(true); + } +} + +void OPN::ResetStatus(uint bit) +{ + status &= ~bit; + if (!status) + Intr(false); +} + +// マスク設定 +void OPN::SetChannelMask(uint mask) +{ + for (int i=0; i<3; i++) + ch[i].Mute(!!(mask & (1 << i))); + psg.SetChannelMask(mask >> 6); +} + + +// 合成(2ch) +void OPN::Mix(Sample* buffer, int nsamples) +{ +#define IStoSample(s) ((Limit(s, 0x7fff, -0x8000) * fmvolume) >> 14) + + psg.Mix(buffer, nsamples); + + // Set F-Number + ch[0].SetFNum(fnum[0]); + ch[1].SetFNum(fnum[1]); + if (!(regtc & 0xc0)) + ch[2].SetFNum(fnum[2]); + else + { // 効果音 + ch[2].op[0].SetFNum(fnum3[1]); + ch[2].op[1].SetFNum(fnum3[2]); + ch[2].op[2].SetFNum(fnum3[0]); + ch[2].op[3].SetFNum(fnum[2]); + } + + int actch = (((ch[2].Prepare() << 2) | ch[1].Prepare()) << 2) | ch[0].Prepare(); + if (actch & 0x15) + { + Sample* limit = buffer + nsamples * 2; + for (Sample* dest = buffer; dest < limit; dest+=2) + { + ISample s = 0; + if (actch & 0x01) s = ch[0].Calc(); + if (actch & 0x04) s += ch[1].Calc(); + if (actch & 0x10) s += ch[2].Calc(); + s = IStoSample(s); + StoreSample(dest[0], s); + StoreSample(dest[1], s); + } + } +#undef IStoSample +} + +#endif // BUILD_OPN + +// --------------------------------------------------------------------------- +// YM2608/2610 common part +// --------------------------------------------------------------------------- + +#if defined(BUILD_OPNA) || defined(BUILD_OPNB) + +int OPNABase::amtable[FM_LFOENTS] = { -1, }; +int OPNABase::pmtable[FM_LFOENTS]; + +int32 OPNABase::tltable[FM_TLENTS+FM_TLPOS]; +bool OPNABase::tablehasmade = false; + +OPNABase::OPNABase() +{ + adpcmbuf = 0; + memaddr = 0; + startaddr = 0; + deltan = 256; + + adpcmvol = 0; + control2 = 0; + + MakeTable2(); + BuildLFOTable(); + for (int i=0; i<6; i++) + { + ch[i].SetChip(&chip); + ch[i].SetType(typeN); + } +} + +OPNABase::~OPNABase() +{ +} + +// --------------------------------------------------------------------------- +// 初期化 +// +bool OPNABase::Init(uint c, uint r, bool) +{ + (void)c; + (void)r; + + RebuildTimeTable(); + + Reset(); + + SetVolumeFM(0); + SetVolumePSG(0); + SetChannelMask(0); + return true; +} + +// --------------------------------------------------------------------------- +// テーブル作成 +// +void OPNABase::MakeTable2() +{ + if (!tablehasmade) + { + for (int i=-FM_TLPOS; i> 16; + + RebuildTimeTable(); + + lfodcount = reg22 & 0x08 ? lfotable[reg22 & 7] : 0; + return true; +} + + +// --------------------------------------------------------------------------- +// チャンネルマスクの設定 +// +void OPNABase::SetChannelMask(uint mask) +{ + for (int i=0; i<6; i++) + ch[i].Mute(!!(mask & (1 << i))); + psg.SetChannelMask(mask >> 6); + adpcmmask_ = (mask & (1 << 9)) != 0; + rhythmmask_ = (mask >> 10) & ((1 << 6) - 1); +} + +// --------------------------------------------------------------------------- +// レジスタアレイにデータを設定 +// +void OPNABase::SetReg(uint addr, uint data) +{ + int c = addr & 3; + switch (addr) + { + uint modified; + + // Timer ----------------------------------------------------------------- + case 0x24: case 0x25: + SetTimerA(addr, data); + break; + + case 0x26: + SetTimerB(data); + break; + + case 0x27: + SetTimerControl(data); + break; + + // Misc ------------------------------------------------------------------ + case 0x28: // Key On/Off + if ((data & 3) < 3) + { + c = (data & 3) + (data & 4 ? 3 : 0); + ch[c].KeyControl(data >> 4); + } + break; + + // Status Mask ----------------------------------------------------------- + case 0x29: + reg29 = data; +// UpdateStatus(); //? + break; + + // Prescaler ------------------------------------------------------------- + case 0x2d: case 0x2e: case 0x2f: + SetPrescaler(addr-0x2d); + break; + + // F-Number -------------------------------------------------------------- + case 0x1a0: case 0x1a1: case 0x1a2: + c += 3; + case 0xa0: case 0xa1: case 0xa2: + fnum[c] = data + fnum2[c] * 0x100; + ch[c].SetFNum(fnum[c]); + break; + + case 0x1a4: case 0x1a5: case 0x1a6: + c += 3; + case 0xa4 : case 0xa5: case 0xa6: + fnum2[c] = uint8(data); + break; + + case 0xa8: case 0xa9: case 0xaa: + fnum3[c] = data + fnum2[c+6] * 0x100; + break; + + case 0xac : case 0xad: case 0xae: + fnum2[c+6] = uint8(data); + break; + + // Algorithm ------------------------------------------------------------- + + case 0x1b0: case 0x1b1: case 0x1b2: + c += 3; + case 0xb0: case 0xb1: case 0xb2: + ch[c].SetFB((data >> 3) & 7); + ch[c].SetAlgorithm(data & 7); + break; + + case 0x1b4: case 0x1b5: case 0x1b6: + c += 3; + case 0xb4: case 0xb5: case 0xb6: + pan[c] = (data >> 6) & 3; + ch[c].SetMS(data); + break; + + // LFO ------------------------------------------------------------------- + case 0x22: + modified = reg22 ^ data; + reg22 = data; + if (modified & 0x8) + lfocount = 0; + lfodcount = reg22 & 8 ? lfotable[reg22 & 7] : 0; + break; + + // PSG ------------------------------------------------------------------- + case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: + case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: + psg.SetReg(addr, data); + break; + + // 音色 ------------------------------------------------------------------ + default: + if (c < 3) + { + if (addr & 0x100) + c += 3; + OPNBase::SetParameter(&ch[c], addr, data); + } + break; + } +} + +// --------------------------------------------------------------------------- +// ADPCM B +// +void OPNABase::SetADPCMBReg(uint addr, uint data) +{ + switch (addr) + { + case 0x00: // Control Register 1 + if ((data & 0x80) && !adpcmplay) + { + adpcmplay = true; + memaddr = startaddr; + adpcmx = 0, adpcmd = 127; + adplc = 0; + } + if (data & 1) + { + adpcmplay = false; + } + control1 = data; + break; + + case 0x01: // Control Register 2 + control2 = data; + granuality = control2 & 2 ? 1 : 4; + break; + + case 0x02: // Start Address L + case 0x03: // Start Address H + adpcmreg[addr - 0x02 + 0] = data; + startaddr = (adpcmreg[1]*256+adpcmreg[0]) << 6; + memaddr = startaddr; +// LOG1(" startaddr %.6x", startaddr); + break; + + case 0x04: // Stop Address L + case 0x05: // Stop Address H + adpcmreg[addr - 0x04 + 2] = data; + stopaddr = (adpcmreg[3]*256+adpcmreg[2] + 1) << 6; +// LOG1(" stopaddr %.6x", stopaddr); + break; + + case 0x08: // ADPCM data + if ((control1 & 0x60) == 0x60) + { +// LOG2(" Wr [0x%.5x] = %.2x", memaddr, data); + WriteRAM(data); + } + break; + + case 0x09: // delta-N L + case 0x0a: // delta-N H + adpcmreg[addr - 0x09 + 4] = data; + deltan = adpcmreg[5]*256+adpcmreg[4]; + deltan = Max(256, deltan); + adpld = deltan * adplbase >> 16; + break; + + case 0x0b: // Level Control + adpcmlevel = data; + adpcmvolume = (adpcmvol * adpcmlevel) >> 12; + break; + + case 0x0c: // Limit Address L + case 0x0d: // Limit Address H + adpcmreg[addr - 0x0c + 6] = data; + limitaddr = (adpcmreg[7]*256+adpcmreg[6] + 1) << 6; +// LOG1(" limitaddr %.6x", limitaddr); + break; + + case 0x10: // Flag Control + if (data & 0x80) + { + status = 0; + UpdateStatus(); + } + else + { + stmask = ~(data & 0x1f); +// UpdateStatus(); //??? + } + break; + } +} + + +// --------------------------------------------------------------------------- +// レジスタ取得 +// +uint OPNA::GetReg(uint addr) +{ + if (addr < 0x10) + return psg.GetReg(addr); + + if (addr == 0x108) + { +// LOG1("%d:reg[108] -> ", Diag::GetCPUTick()); + + uint data = adpcmreadbuf & 0xff; + adpcmreadbuf >>= 8; + if ((control1 & 0x60) == 0x20) + { + adpcmreadbuf |= ReadRAM() << 8; +// LOG2("Rd [0x%.6x:%.2x] ", memaddr, adpcmreadbuf >> 8); + } +// LOG0("%.2x\n"); + return data; + } + + if (addr == 0xff) + return 1; + + return 0; +} + + + + +// --------------------------------------------------------------------------- +// ステータスフラグ設定 +// +void OPNABase::SetStatus(uint bits) +{ + if (!(status & bits)) + { +// LOG2("SetStatus(%.2x %.2x)\n", bits, stmask); + status |= bits & stmask; + UpdateStatus(); + } +// else +// LOG1("SetStatus(%.2x) - ignored\n", bits); +} + +void OPNABase::ResetStatus(uint bits) +{ + status &= ~bits; +// LOG1("ResetStatus(%.2x)\n", bits); + UpdateStatus(); +} + +inline void OPNABase::UpdateStatus() +{ +// LOG2("%d:INT = %d\n", Diag::GetCPUTick(), (status & stmask & reg29) != 0); + Intr((status & stmask & reg29) != 0); +} + +// --------------------------------------------------------------------------- +// ADPCM RAM への書込み操作 +// +void OPNABase::WriteRAM(uint data) +{ +#ifndef NO_BITTYPE_EMULATION + if (!(control2 & 2)) + { + // 1 bit mode + adpcmbuf[(memaddr >> 4) & 0x3ffff] = data; + memaddr += 16; + } + else + { + // 8 bit mode + uint8* p = &adpcmbuf[(memaddr >> 4) & 0x7fff]; + uint bank = (memaddr >> 1) & 7; + uint8 mask = 1 << bank; + data <<= bank; + + p[0x00000] = (p[0x00000] & ~mask) | (uint8(data) & mask); data >>= 1; + p[0x08000] = (p[0x08000] & ~mask) | (uint8(data) & mask); data >>= 1; + p[0x10000] = (p[0x10000] & ~mask) | (uint8(data) & mask); data >>= 1; + p[0x18000] = (p[0x18000] & ~mask) | (uint8(data) & mask); data >>= 1; + p[0x20000] = (p[0x20000] & ~mask) | (uint8(data) & mask); data >>= 1; + p[0x28000] = (p[0x28000] & ~mask) | (uint8(data) & mask); data >>= 1; + p[0x30000] = (p[0x30000] & ~mask) | (uint8(data) & mask); data >>= 1; + p[0x38000] = (p[0x38000] & ~mask) | (uint8(data) & mask); + memaddr += 2; + } +#else + adpcmbuf[(memaddr >> granuality) & 0x3ffff] = data; + memaddr += 1 << granuality; +#endif + + if (memaddr == stopaddr) + { + SetStatus(4); + statusnext = 0x04; // EOS + memaddr &= 0x3fffff; + } + if (memaddr == limitaddr) + { +// LOG1("Limit ! (%.8x)\n", limitaddr); + memaddr = 0; + } + SetStatus(8); +} + +// --------------------------------------------------------------------------- +// ADPCM RAM からの読み込み操作 +// +uint OPNABase::ReadRAM() +{ + uint data; +#ifndef NO_BITTYPE_EMULATION + if (!(control2 & 2)) + { + // 1 bit mode + data = adpcmbuf[(memaddr >> 4) & 0x3ffff]; + memaddr += 16; + } + else + { + // 8 bit mode + uint8* p = &adpcmbuf[(memaddr >> 4) & 0x7fff]; + uint bank = (memaddr >> 1) & 7; + uint8 mask = 1 << bank; + + data = (p[0x38000] & mask); + data = data * 2 + (p[0x30000] & mask); + data = data * 2 + (p[0x28000] & mask); + data = data * 2 + (p[0x20000] & mask); + data = data * 2 + (p[0x18000] & mask); + data = data * 2 + (p[0x10000] & mask); + data = data * 2 + (p[0x08000] & mask); + data = data * 2 + (p[0x00000] & mask); + data >>= bank; + memaddr += 2; + } +#else + data = adpcmbuf[(memaddr >> granuality) & 0x3ffff]; + memaddr += 1 << granuality; +#endif + if (memaddr == stopaddr) + { + SetStatus(4); + statusnext = 0x04; // EOS + memaddr &= 0x3fffff; + } + if (memaddr == limitaddr) + { +// LOG1("Limit ! (%.8x)\n", limitaddr); + memaddr = 0; + } + if (memaddr < stopaddr) + SetStatus(8); + return data; +} + + +inline int OPNABase::DecodeADPCMBSample(uint data) +{ + static const int table1[16] = + { + 1, 3, 5, 7, 9, 11, 13, 15, + -1, -3, -5, -7, -9, -11, -13, -15, + }; + static const int table2[16] = + { + 57, 57, 57, 57, 77, 102, 128, 153, + 57, 57, 57, 57, 77, 102, 128, 153, + }; + adpcmx = Limit(adpcmx + table1[data] * adpcmd / 8, 32767, -32768); + adpcmd = Limit(adpcmd * table2[data] / 64, 24576, 127); + return adpcmx; +} + + +// --------------------------------------------------------------------------- +// ADPCM RAM からの nibble 読み込み及び ADPCM 展開 +// +int OPNABase::ReadRAMN() +{ + uint data; + if (granuality > 0) + { +#ifndef NO_BITTYPE_EMULATION + if (!(control2 & 2)) + { + data = adpcmbuf[(memaddr >> 4) & 0x3ffff]; + memaddr += 8; + if (memaddr & 8) + return DecodeADPCMBSample(data >> 4); + data &= 0x0f; + } + else + { + uint8* p = &adpcmbuf[(memaddr >> 4) & 0x7fff] + ((~memaddr & 1) << 17); + uint bank = (memaddr >> 1) & 7; + uint8 mask = 1 << bank; + + data = (p[0x18000] & mask); + data = data * 2 + (p[0x10000] & mask); + data = data * 2 + (p[0x08000] & mask); + data = data * 2 + (p[0x00000] & mask); + data >>= bank; + memaddr ++; + if (memaddr & 1) + return DecodeADPCMBSample(data); + } +#else + data = adpcmbuf[(memaddr >> granuality) & adpcmmask]; + memaddr += 1 << (granuality-1); + if (memaddr & (1 << (granuality-1))) + return DecodeADPCMBSample(data >> 4); + data &= 0x0f; +#endif + } + else + { + data = adpcmbuf[(memaddr >> 1) & adpcmmask]; + ++memaddr; + if (memaddr & 1) + return DecodeADPCMBSample(data >> 4); + data &= 0x0f; + } + + DecodeADPCMBSample(data); + + // check + if (memaddr == stopaddr) + { + if (control1 & 0x10) + { + memaddr = startaddr; + data = adpcmx; + adpcmx = 0, adpcmd = 127; + return data; + } + else + { + memaddr &= adpcmmask; //0x3fffff; + SetStatus(adpcmnotice); + adpcmplay = false; + } + } + + if (memaddr == limitaddr) + memaddr = 0; + + return adpcmx; +} + +// --------------------------------------------------------------------------- +// 拡張ステータスを読みこむ +// +uint OPNABase::ReadStatusEx() +{ + uint r = ((status | 8) & stmask) | (adpcmplay ? 0x20 : 0); + status |= statusnext; + statusnext = 0; + return r; +} + +// --------------------------------------------------------------------------- +// ADPCM 展開 +// +inline void OPNABase::DecodeADPCMB() +{ + apout0 = apout1; + int n = (ReadRAMN() * adpcmvolume) >> 13; + apout1 = adpcmout + n; + adpcmout = n; +} + +// --------------------------------------------------------------------------- +// ADPCM 合成 +// +void OPNABase::ADPCMBMix(Sample* dest, uint count) +{ + uint maskl = control2 & 0x80 ? -1 : 0; + uint maskr = control2 & 0x40 ? -1 : 0; + if (adpcmmask_) + { + maskl = maskr = 0; + } + + if (adpcmplay) + { +// LOG2("ADPCM Play: %d DeltaN: %d\n", adpld, deltan); + if (adpld <= 8192) // fplay < fsamp + { + for (; count>0; count--) + { + if (adplc < 0) + { + adplc += 8192; + DecodeADPCMB(); + if (!adpcmplay) + break; + } + int s = (adplc * apout0 + (8192-adplc) * apout1) >> 13; + StoreSample(dest[0], s & maskl); + StoreSample(dest[1], s & maskr); + dest += 2; + adplc -= adpld; + } + for (; count>0 && apout0; count--) + { + if (adplc < 0) + { + apout0 = apout1, apout1 = 0; + adplc += 8192; + } + int s = (adplc * apout1) >> 13; + StoreSample(dest[0], s & maskl); + StoreSample(dest[1], s & maskr); + dest += 2; + adplc -= adpld; + } + } + else // fplay > fsamp (adpld = fplay/famp*8192) + { + int t = (-8192*8192)/adpld; + for (; count>0; count--) + { + int s = apout0 * (8192+adplc); + while (adplc < 0) + { + DecodeADPCMB(); + if (!adpcmplay) + goto stop; + s -= apout0 * Max(adplc, t); + adplc -= t; + } + adplc -= 8192; + s >>= 13; + StoreSample(dest[0], s & maskl); + StoreSample(dest[1], s & maskr); + dest += 2; + } +stop: + ; + } + } + if (!adpcmplay) + { + apout0 = apout1 = adpcmout = 0; + adplc = 0; + } +} + +// --------------------------------------------------------------------------- +// 合成 +// in: buffer 合成先 +// nsamples 合成サンプル数 +// +void OPNABase::FMMix(Sample* buffer, int nsamples) +{ + if (fmvolume > 0) + { + // 準備 + // Set F-Number + if (!(regtc & 0xc0)) + csmch->SetFNum(fnum[csmch-ch]); + else + { + // 効果音モード + csmch->op[0].SetFNum(fnum3[1]); csmch->op[1].SetFNum(fnum3[2]); + csmch->op[2].SetFNum(fnum3[0]); csmch->op[3].SetFNum(fnum[2]); + } + + int act = (((ch[2].Prepare() << 2) | ch[1].Prepare()) << 2) | ch[0].Prepare(); + if (reg29 & 0x80) + act |= (ch[3].Prepare() | ((ch[4].Prepare() | (ch[5].Prepare() << 2)) << 2)) << 6; + if (!(reg22 & 0x08)) + act &= 0x555; + + if (act & 0x555) + { + Mix6(buffer, nsamples, act); + } + } +} + +// --------------------------------------------------------------------------- + +void OPNABase::MixSubSL(int activech, ISample** dest) +{ + if (activech & 0x001) (*dest[0] = ch[0].CalcL()); + if (activech & 0x004) (*dest[1] += ch[1].CalcL()); + if (activech & 0x010) (*dest[2] += ch[2].CalcL()); + if (activech & 0x040) (*dest[3] += ch[3].CalcL()); + if (activech & 0x100) (*dest[4] += ch[4].CalcL()); + if (activech & 0x400) (*dest[5] += ch[5].CalcL()); +} + +inline void OPNABase::MixSubS(int activech, ISample** dest) +{ + if (activech & 0x001) (*dest[0] = ch[0].Calc()); + if (activech & 0x004) (*dest[1] += ch[1].Calc()); + if (activech & 0x010) (*dest[2] += ch[2].Calc()); + if (activech & 0x040) (*dest[3] += ch[3].Calc()); + if (activech & 0x100) (*dest[4] += ch[4].Calc()); + if (activech & 0x400) (*dest[5] += ch[5].Calc()); +} + +// --------------------------------------------------------------------------- + +void OPNABase::BuildLFOTable() +{ + if (amtable[0] == -1) + { + for (int c=0; c<256; c++) + { + int v; + if (c < 0x40) v = c * 2 + 0x80; + else if (c < 0xc0) v = 0x7f - (c - 0x40) * 2 + 0x80; + else v = (c - 0xc0) * 2; + pmtable[c] = c; + + if (c < 0x80) v = 0xff - c * 2; + else v = (c - 0x80) * 2; + amtable[c] = v & ~3; + } + } +} + +// --------------------------------------------------------------------------- + +inline void OPNABase::LFO() +{ +// LOG3("%4d - %8d, %8d\n", c, lfocount, lfodcount); + +// Operator::SetPML(pmtable[(lfocount >> (FM_LFOCBITS+1)) & 0xff]); +// Operator::SetAML(amtable[(lfocount >> (FM_LFOCBITS+1)) & 0xff]); + chip.SetPML(pmtable[(lfocount >> (FM_LFOCBITS+1)) & 0xff]); + chip.SetAML(amtable[(lfocount >> (FM_LFOCBITS+1)) & 0xff]); + lfocount += lfodcount; +} + +// --------------------------------------------------------------------------- +// 合成 +// +#define IStoSample(s) ((Limit(s, 0x7fff, -0x8000) * fmvolume) >> 14) + +void OPNABase::Mix6(Sample* buffer, int nsamples, int activech) +{ + // Mix + ISample ibuf[4]; + ISample* idest[6]; + idest[0] = &ibuf[pan[0]]; + idest[1] = &ibuf[pan[1]]; + idest[2] = &ibuf[pan[2]]; + idest[3] = &ibuf[pan[3]]; + idest[4] = &ibuf[pan[4]]; + idest[5] = &ibuf[pan[5]]; + + Sample* limit = buffer + nsamples * 2; + for (Sample* dest = buffer; dest < limit; dest+=2) + { + ibuf[1] = ibuf[2] = ibuf[3] = 0; + if (activech & 0xaaa) + LFO(), MixSubSL(activech, idest); + else + MixSubS(activech, idest); + StoreSample(dest[0], IStoSample(ibuf[2] + ibuf[3])); + StoreSample(dest[1], IStoSample(ibuf[1] + ibuf[3])); + } +} + +#endif // defined(BUILD_OPNA) || defined(BUILD_OPNB) + +// --------------------------------------------------------------------------- +// YM2608(OPNA) +// --------------------------------------------------------------------------- + +#ifdef BUILD_OPNA + +// --------------------------------------------------------------------------- +// 構築 +// +OPNA::OPNA() +{ + for (int i=0; i<6; i++) + { + rhythm[i].sample = 0; + rhythm[i].pos = 0; + rhythm[i].size = 0; + rhythm[i].volume = 0; + } + rhythmtvol = 0; + adpcmmask = 0x3ffff; + adpcmnotice = 4; + csmch = &ch[2]; +} + +// --------------------------------------------------------------------------- + +OPNA::~OPNA() +{ + delete[] adpcmbuf; + for (int i=0; i<6; i++) + delete[] rhythm[i].sample; +} + + + +// --------------------------------------------------------------------------- +// 初期化 +// +bool OPNA::Init(uint c, uint r, bool ipflag, const char* path) +{ + rate = 8000; + LoadRhythmSample(path); + + if (!adpcmbuf) + adpcmbuf = new uint8[0x40000]; + if (!adpcmbuf) + return false; + + if (!SetRate(c, r, ipflag)) + return false; + if (!OPNABase::Init(c, r, ipflag)) + return false; + + Reset(); + + SetVolumeADPCM(0); + SetVolumeRhythmTotal(0); + for (int i=0; i<6; i++) + SetVolumeRhythm(0, 0); + return true; +} + +// --------------------------------------------------------------------------- +// リセット +// +void OPNA::Reset() +{ + reg29 = 0x1f; + rhythmkey = 0; + limitaddr = 0x3ffff; + OPNABase::Reset(); +} + +// --------------------------------------------------------------------------- +// サンプリングレート変更 +// +bool OPNA::SetRate(uint c, uint r, bool ipflag) +{ + if (!OPNABase::SetRate(c, r, ipflag)) + return false; + + for (int i=0; i<6; i++) + { + rhythm[i].step = rhythm[i].rate * 1024 / r; + } + return true; +} + + +// --------------------------------------------------------------------------- +// リズム音を読みこむ +// +bool OPNA::LoadRhythmSample(const char* path) +{ + static const char* rhythmname[6] = + { + "BD", "SD", "TOP", "HH", "TOM", "RIM", + }; + + int i; + for (i=0; i<6; i++) + rhythm[i].pos = ~0; + + for (i=0; i<6; i++) + { + FileIO file; + uint32 fsize; + char buf[MAX_PATH] = ""; + if (path) + strncpy(buf, path, MAX_PATH); + strncat(buf, "2608_", MAX_PATH); + strncat(buf, rhythmname[i], MAX_PATH); + strncat(buf, ".WAV", MAX_PATH); + + if (!file.Open(buf, FileIO::readonly)) + { + if (i != 5) + break; + if (path) + strncpy(buf, path, MAX_PATH); + strncpy(buf, "2608_RYM.WAV", MAX_PATH); + if (!file.Open(buf, FileIO::readonly)) + break; + } + + struct + { + uint32 chunksize; + uint16 tag; + uint16 nch; + uint32 rate; + uint32 avgbytes; + uint16 align; + uint16 bps; + uint16 size; + } whdr; + + file.Seek(0x10, FileIO::begin); + file.Read(&whdr, sizeof(whdr)); + + uint8 subchunkname[4]; + fsize = 4 + whdr.chunksize - sizeof(whdr); + do + { + file.Seek(fsize, FileIO::current); + file.Read(&subchunkname, 4); + file.Read(&fsize, 4); + } while (memcmp("data", subchunkname, 4)); + + fsize /= 2; + if (fsize >= 0x100000 || whdr.tag != 1 || whdr.nch != 1) + break; + fsize = Max(fsize, (1<<31)/1024); + + delete rhythm[i].sample; + rhythm[i].sample = new int16[fsize]; + if (!rhythm[i].sample) + break; + + file.Read(rhythm[i].sample, fsize * 2); + + rhythm[i].rate = whdr.rate; + rhythm[i].step = rhythm[i].rate * 1024 / rate; + rhythm[i].pos = rhythm[i].size = fsize * 1024; + } + if (i != 6) + { + for (i=0; i<6; i++) + { + delete[] rhythm[i].sample; + rhythm[i].sample = 0; + } + return false; + } + return true; +} + + + +// --------------------------------------------------------------------------- +// レジスタアレイにデータを設定 +// +void OPNA::SetReg(uint addr, uint data) +{ + addr &= 0x1ff; + + switch (addr) + { + case 0x29: + reg29 = data; +// UpdateStatus(); //? + break; + + // Rhythm ---------------------------------------------------------------- + case 0x10: // DM/KEYON + if (!(data & 0x80)) // KEY ON + { + rhythmkey |= data & 0x3f; + if (data & 0x01) rhythm[0].pos = 0; + if (data & 0x02) rhythm[1].pos = 0; + if (data & 0x04) rhythm[2].pos = 0; + if (data & 0x08) rhythm[3].pos = 0; + if (data & 0x10) rhythm[4].pos = 0; + if (data & 0x20) rhythm[5].pos = 0; + } + else + { // DUMP + rhythmkey &= ~data; + } + break; + + case 0x11: + rhythmtl = ~data & 63; + break; + + case 0x18: // Bass Drum + case 0x19: // Snare Drum + case 0x1a: // Top Cymbal + case 0x1b: // Hihat + case 0x1c: // Tom-tom + case 0x1d: // Rim shot + rhythm[addr & 7].pan = (data >> 6) & 3; + rhythm[addr & 7].level = ~data & 31; + break; + + case 0x100: case 0x101: + case 0x102: case 0x103: + case 0x104: case 0x105: + case 0x108: case 0x109: + case 0x10a: case 0x10b: + case 0x10c: case 0x10d: + case 0x110: + OPNABase::SetADPCMBReg(addr - 0x100, data); + break; + + default: + OPNABase::SetReg(addr, data); + break; + } +} + + +// --------------------------------------------------------------------------- +// リズム合成 +// +void OPNA::RhythmMix(Sample* buffer, uint count) +{ + if (rhythmtvol < 128 && rhythm[0].sample && (rhythmkey & 0x3f)) + { + Sample* limit = buffer + count * 2; + for (int i=0; i<6; i++) + { + Rhythm& r = rhythm[i]; + //if ((rhythmkey & (1 << i)) && r.level < 128) + if (rhythmkey & (1 << i)) + { + int db = Limit(rhythmtl+rhythmtvol+r.level+r.volume, 127, -31); + int vol = tltable[FM_TLPOS+(db << (FM_TLBITS-7))] >> 4; + int maskl = -((r.pan >> 1) & 1); + int maskr = -(r.pan & 1); + + if (rhythmmask_ & (1 << i)) + { + maskl = maskr = 0; + } + + for (Sample* dest = buffer; dest> 12; + r.pos += r.step; + StoreSample(dest[0], sample & maskl); + StoreSample(dest[1], sample & maskr); + } + } + } + } +} + +// --------------------------------------------------------------------------- +// 音量設定 +// +void OPNA::SetVolumeRhythmTotal(int db) +{ + db = Min(db, 20); + rhythmtvol = -(db * 2 / 3); +} + +void OPNA::SetVolumeRhythm(int index, int db) +{ + db = Min(db, 20); + rhythm[index].volume = -(db * 2 / 3); +} + +void OPNA::SetVolumeADPCM(int db) +{ + db = Min(db, 20); + if (db > -192) + adpcmvol = int(65536.0 * pow(10.0, db / 40.0)); + else + adpcmvol = 0; + + adpcmvolume = (adpcmvol * adpcmlevel) >> 12; +} + +// --------------------------------------------------------------------------- +// 合成 +// in: buffer 合成先 +// nsamples 合成サンプル数 +// +void OPNA::Mix(Sample* buffer, int nsamples) +{ + FMMix(buffer, nsamples); + psg.Mix(buffer, nsamples); + ADPCMBMix(buffer, nsamples); + RhythmMix(buffer, nsamples); +} + +#endif // BUILD_OPNA + +// --------------------------------------------------------------------------- +// YM2610(OPNB) +// --------------------------------------------------------------------------- + +#ifdef BUILD_OPNB + +// --------------------------------------------------------------------------- +// 構築 +// +OPNB::OPNB() +{ + adpcmabuf = 0; + adpcmasize = 0; + for (int i=0; i<6; i++) + { + adpcma[i].pan = 0; + adpcma[i].level = 0; + adpcma[i].volume = 0; + adpcma[i].pos = 0; + adpcma[i].step = 0; + adpcma[i].volume = 0; + adpcma[i].start = 0; + adpcma[i].stop = 0; + adpcma[i].adpcmx = 0; + adpcma[i].adpcmd = 0; + } + adpcmatl = 0; + adpcmakey = 0; + adpcmatvol = 0; + adpcmmask = 0; + adpcmnotice = 0x8000; + granuality = -1; + csmch = &ch[2]; + + InitADPCMATable(); +} + +OPNB::~OPNB() +{ +} + +// --------------------------------------------------------------------------- +// 初期化 +// +bool OPNB::Init(uint c, uint r, bool ipflag, + uint8 *_adpcma, int _adpcma_size, + uint8 *_adpcmb, int _adpcmb_size) +{ + int i; + if (!SetRate(c, r, ipflag)) + return false; + if (!OPNABase::Init(c, r, ipflag)) + return false; + + adpcmabuf = _adpcma; + adpcmasize = _adpcma_size; + adpcmbuf = _adpcmb; + + for (i=0; i<=24; i++) // max 16M bytes + { + if (_adpcmb_size <= (1 << i)) + { + adpcmmask = (1 << i) - 1; + break; + } + } + +// adpcmmask = _adpcmb_size - 1; + limitaddr = adpcmmask; + + Reset(); + + SetVolumeFM(0); + SetVolumePSG(0); + SetVolumeADPCMB(0); + SetVolumeADPCMATotal(0); + for (i=0; i<6; i++) + SetVolumeADPCMA(0, 0); + SetChannelMask(0); + return true; +} + +// --------------------------------------------------------------------------- +// リセット +// +void OPNB::Reset() +{ + OPNABase::Reset(); + + stmask = ~0; + adpcmakey = 0; + reg29 = ~0; + + for (int i=0; i<6; i++) + { + adpcma[i].pan = 0; + adpcma[i].level = 0; + adpcma[i].volume = 0; + adpcma[i].pos = 0; + adpcma[i].step = 0; + adpcma[i].volume = 0; + adpcma[i].start = 0; + adpcma[i].stop = 0; + adpcma[i].adpcmx = 0; + adpcma[i].adpcmd = 0; + } +} + +// --------------------------------------------------------------------------- +// サンプリングレート変更 +// +bool OPNB::SetRate(uint c, uint r, bool ipflag) +{ + if (!OPNABase::SetRate(c, r, ipflag)) + return false; + + adpcmastep = int(double(c) / 54 * 8192 / r); + return true; +} + +// --------------------------------------------------------------------------- +// レジスタアレイにデータを設定 +// +void OPNB::SetReg(uint addr, uint data) +{ + addr &= 0x1ff; + + switch (addr) + { + // omitted registers + case 0x29: + case 0x2d: case 0x2e: case 0x2f: + break; + + // ADPCM A --------------------------------------------------------------- + case 0x100: // DM/KEYON + if (!(data & 0x80)) // KEY ON + { + adpcmakey |= data & 0x3f; + for (int c=0; c<6; c++) + { + if (data & (1<> 6) & 3; + adpcma[addr & 7].level = ~data & 31; + break; + + case 0x110: case 0x111: case 0x112: // START ADDRESS (L) + case 0x113: case 0x114: case 0x115: + case 0x118: case 0x119: case 0x11a: // START ADDRESS (H) + case 0x11b: case 0x11c: case 0x11d: + adpcmareg[addr - 0x110] = data; + adpcma[addr & 7].pos = adpcma[addr & 7].start = + (adpcmareg[(addr&7)+8]*256+adpcmareg[addr&7]) << 9; + break; + + case 0x120: case 0x121: case 0x122: // END ADDRESS (L) + case 0x123: case 0x124: case 0x125: + case 0x128: case 0x129: case 0x12a: // END ADDRESS (H) + case 0x12b: case 0x12c: case 0x12d: + adpcmareg[addr - 0x110] = data; + adpcma[addr & 7].stop = + (adpcmareg[(addr&7)+24]*256+adpcmareg[(addr&7)+16] + 1) << 9; + break; + + // ADPCMB ----------------------------------------------------------------- + case 0x10: + if ((data & 0x80) && !adpcmplay) + { + adpcmplay = true; + memaddr = startaddr; + adpcmx = 0, adpcmd = 127; + adplc = 0; + } + if (data & 1) + adpcmplay = false; + control1 = data & 0x91; + break; + + + case 0x11: // Control Register 2 + control2 = data & 0xc0; + break; + + case 0x12: // Start Address L + case 0x13: // Start Address H + adpcmreg[addr - 0x12 + 0] = data; + startaddr = (adpcmreg[1]*256+adpcmreg[0]) << 9; + memaddr = startaddr; + break; + + case 0x14: // Stop Address L + case 0x15: // Stop Address H + adpcmreg[addr - 0x14 + 2] = data; + stopaddr = (adpcmreg[3]*256+adpcmreg[2] + 1) << 9; +// LOG1(" stopaddr %.6x", stopaddr); + break; + + case 0x19: // delta-N L + case 0x1a: // delta-N H + adpcmreg[addr - 0x19 + 4] = data; + deltan = adpcmreg[5]*256+adpcmreg[4]; + deltan = Max(256, deltan); + adpld = deltan * adplbase >> 16; + break; + + case 0x1b: // Level Control + adpcmlevel = data; + adpcmvolume = (adpcmvol * adpcmlevel) >> 12; + break; + + case 0x1c: // Flag Control + stmask = ~((data & 0xbf) << 8); + status &= stmask; + UpdateStatus(); + break; + + default: + OPNABase::SetReg(addr, data); + break; + } +// LOG0("\n"); +} + +// --------------------------------------------------------------------------- +// レジスタ取得 +// +uint OPNB::GetReg(uint addr) +{ + if (addr < 0x10) + return psg.GetReg(addr); + + return 0; +} + +// --------------------------------------------------------------------------- +// 拡張ステータスを読みこむ +// +uint OPNB::ReadStatusEx() +{ + return (status & stmask) >> 8; +} + +// --------------------------------------------------------------------------- +// YM2610 +// +int OPNB::jedi_table[(48+1)*16]; + +void OPNB::InitADPCMATable() +{ + const static int8 table2[] = + { + 1, 3, 5, 7, 9, 11, 13, 15, + -1, -3, -5, -7, -9,-11,-13,-15, + }; + + for (int i=0; i<=48; i++) + { + int s = int(16.0 * pow (1.1, i) * 3); + for (int j=0; j<16; j++) + { + jedi_table[i*16+j] = s * table2[j] / 8; + } + } +} + +// --------------------------------------------------------------------------- +// ADPCMA 合成 +// +void OPNB::ADPCMAMix(Sample* buffer, uint count) +{ + const static int decode_tableA1[16] = + { + -1*16, -1*16, -1*16, -1*16, 2*16, 5*16, 7*16, 9*16, + -1*16, -1*16, -1*16, -1*16, 2*16, 5*16, 7*16, 9*16 + }; + + if (adpcmatvol < 128 && (adpcmakey & 0x3f)) + { + Sample* limit = buffer + count * 2; + for (int i=0; i<6; i++) + { + ADPCMA& r = adpcma[i]; + if ((adpcmakey & (1 << i)) && r.level < 128) + { + uint maskl = r.pan & 2 ? -1 : 0; + uint maskr = r.pan & 1 ? -1 : 0; + if (rhythmmask_ & (1 << i)) + { + maskl = maskr = 0; + } + + int db = Limit(adpcmatl+adpcmatvol+r.level+r.volume, 127, -31); + int vol = tltable[FM_TLPOS+(db << (FM_TLBITS-7))] >> 4; + + Sample* dest = buffer; + for ( ; dest= r.stop) + { + SetStatus(0x100 << i); + adpcmakey &= ~(1< 0x10000; r.step -= 0x10000) + { + int data; + if (!(r.pos & 1)) + { + r.nibble = adpcmabuf[r.pos>>1]; + data = r.nibble >> 4; + } + else + { + data = r.nibble & 0x0f; + } + r.pos++; + + r.adpcmx += jedi_table[r.adpcmd + data]; + r.adpcmx = Limit(r.adpcmx, 2048*3-1, -2048*3); + r.adpcmd += decode_tableA1[data]; + r.adpcmd = Limit(r.adpcmd, 48*16, 0); + } + int sample = (r.adpcmx * vol) >> 10; + StoreSample(dest[0], sample & maskl); + StoreSample(dest[1], sample & maskr); + } + } + } + } +} + +// --------------------------------------------------------------------------- +// 音量設定 +// +void OPNB::SetVolumeADPCMATotal(int db) +{ + db = Min(db, 20); + adpcmatvol = -(db * 2 / 3); +} + +void OPNB::SetVolumeADPCMA(int index, int db) +{ + db = Min(db, 20); + adpcma[index].volume = -(db * 2 / 3); +} + +void OPNB::SetVolumeADPCMB(int db) +{ + db = Min(db, 20); + if (db > -192) + adpcmvol = int(65536.0 * pow(10, db / 40.0)); + else + adpcmvol = 0; +} + +// --------------------------------------------------------------------------- +// 合成 +// in: buffer 合成先 +// nsamples 合成サンプル数 +// +void OPNB::Mix(Sample* buffer, int nsamples) +{ + FMMix(buffer, nsamples); + psg.Mix(buffer, nsamples); + ADPCMBMix(buffer, nsamples); + ADPCMAMix(buffer, nsamples); +} + +#endif // BUILD_OPNB + +// --------------------------------------------------------------------------- +// YMF288 +// --------------------------------------------------------------------------- + +#ifdef BUILD_288 + +// --------------------------------------------------------------------------- +// 構築 +// +Y288::Y288() +{ + for (int i=0; i<6; i++) + { + rhythm[i].sample = 0; + rhythm[i].pos = 0; + rhythm[i].size = 0; + rhythm[i].volume = 0; + } + csmch = &ch[2]; + mode288 = 0; +} + +// --------------------------------------------------------------------------- + +Y288::~Y288() +{ + for (int i=0; i<6; i++) + delete[] rhythm[i].sample; +} + + + +// --------------------------------------------------------------------------- +// 初期化 +// +bool Y288::Init(uint c, uint r, bool ipflag, const char* path) +{ + rate = 8000; + LoadRhythmSample(path); + + if (!SetRate(c, r, ipflag)) + return false; + if (!OPNABase::Init(c, r, ipflag)) + return false; + + Reset(); + + SetVolumeRhythmTotal(0); + for (int i=0; i<6; i++) + SetVolumeRhythm(0, 0); + + return true; +} + +// --------------------------------------------------------------------------- +// リセット +// +void Y288::Reset() +{ + reg29 = 0x1f; + rhythmkey = 0; + limitaddr = 0x3ffff; + OPNABase::Reset(); +} + +// --------------------------------------------------------------------------- +// サンプリングレート変更 +// +bool Y288::SetRate(uint c, uint r, bool ipflag) +{ + if (!OPNABase::SetRate(c, r, ipflag)) + return false; + for (int i=0; i<6; i++) + { + rhythm[i].step = rhythm[i].rate * 1024 / r; + } + + return true; +} + + +// --------------------------------------------------------------------------- +// リズム音を読みこむ +// +bool Y288::LoadRhythmSample(const char* path) +{ + static const char* rhythmname[6] = + { + "BD", "SD", "TOP", "HH", "TOM", "RIM", + }; + + int i; + for (i=0; i<6; i++) + rhythm[i].pos = ~0; + + for (i=0; i<6; i++) + { + FileIO file; + uint32 fsize; + char buf[MAX_PATH] = ""; + if (path) + strncpy(buf, path, MAX_PATH); + strncat(buf, "2608_", MAX_PATH); + strncat(buf, rhythmname[i], MAX_PATH); + strncat(buf, ".WAV", MAX_PATH); + + if (!file.Open(buf, FileIO::readonly)) + { + if (i != 5) + break; + if (path) + strncpy(buf, path, MAX_PATH); + strncpy(buf, "2608_RYM.WAV", MAX_PATH); + if (!file.Open(buf, FileIO::readonly)) + break; + } + + struct + { + uint32 chunksize; + uint16 tag; + uint16 nch; + uint32 rate; + uint32 avgbytes; + uint16 align; + uint16 bps; + uint16 size; + } whdr; + + file.Seek(0x10, FileIO::begin); + file.Read(&whdr, sizeof(whdr)); + + uint8 subchunkname[4]; + fsize = 4 + whdr.chunksize - sizeof(whdr); + do + { + file.Seek(fsize, FileIO::current); + file.Read(&subchunkname, 4); + file.Read(&fsize, 4); + } while (memcmp("data", subchunkname, 4)); + + fsize /= 2; + if (fsize >= 0x100000 || whdr.tag != 1 || whdr.nch != 1) + break; + fsize = Max(fsize, (1<<31)/1024); + + delete rhythm[i].sample; + rhythm[i].sample = new int16[fsize]; + if (!rhythm[i].sample) + break; + + file.Read(rhythm[i].sample, fsize * 2); + + rhythm[i].rate = whdr.rate; + rhythm[i].step = rhythm[i].rate * 1024 / rate; + rhythm[i].pos = rhythm[i].size = fsize * 1024; + } + if (i != 6) + { + for (i=0; i<6; i++) + { + delete[] rhythm[i].sample; + rhythm[i].sample = 0; + } + return false; + } + return true; +} + + +// --------------------------------------------------------------------------- +// レジスタアレイにデータを設定 +// +void Y288::SetReg(uint addr, uint data) +{ + addr &= 0x1ff; + + switch (addr) + { + // Rhythm ---------------------------------------------------------------- + case 0x10: // DM/KEYON + if (!(data & 0x80)) // KEY ON + { + rhythmkey |= data & 0x3f; + if (data & 0x01) rhythm[0].pos = 0; + if (data & 0x02) rhythm[1].pos = 0; + if (data & 0x04) rhythm[2].pos = 0; + if (data & 0x08) rhythm[3].pos = 0; + if (data & 0x10) rhythm[4].pos = 0; + if (data & 0x20) rhythm[5].pos = 0; + } + else + { // DUMP + rhythmkey &= ~data; + } + break; + + case 0x11: + rhythmtl = ~data & 63; + break; + + case 0x18: // Bass Drum + case 0x19: // Snare Drum + case 0x1a: // Top Cymbal + case 0x1b: // Hihat + case 0x1c: // Tom-tom + case 0x1d: // Rim shot + rhythm[addr & 7].pan = (data >> 6) & 3; + rhythm[addr & 7].level = ~data & 31; + break; + + case 0x20: + mode288 = ((data&2)?1:0); + break; + + case 0x27: + data &= 0x7f; // CSM無効 + OPNABase::SetReg(addr, data); + break; + + case 0x29: + reg29 = data; +// UpdateStatus(); //? + break; + + case 0x2d: case 0x2e: case 0x2f: + break; + + default: + OPNABase::SetReg(addr, data); + break; + } +} + + +// --------------------------------------------------------------------------- +// リズム合成 +// +void Y288::RhythmMix(Sample* buffer, uint count) +{ + if (rhythmtvol < 128 && rhythm[0].sample && (rhythmkey & 0x3f)) + { + Sample* limit = buffer + count * 2; + for (int i=0; i<6; i++) + { + Rhythm& r = rhythm[i]; + //if ((rhythmkey & (1 << i)) && (r.level < 128)) + if ((rhythmkey & (1 << i)) && ((uint8)r.level < 128)) + { + int db = Limit(rhythmtl+rhythmtvol+r.level+r.volume, 127, -31); + int vol = tltable[FM_TLPOS + (db << (FM_TLBITS-7))] >> 4; + int maskl = -((r.pan >> 1) & 1); + int maskr = -(r.pan & 1); + + for (Sample* dest = buffer; dest> 12; + r.pos += r.step; + StoreSample(dest[0], sample & maskl); + StoreSample(dest[1], sample & maskr); + } + } + } + } +} + + +// --------------------------------------------------------------------------- +// 音量設定 +// +void Y288::SetVolumeRhythmTotal(int db) +{ + db = Min(db, 20); + rhythmtvol = -(db * 2 / 3); +} + +void Y288::SetVolumeRhythm(int index, int db) +{ + db = Min(db, 20); + rhythm[index].volume = -(db * 2 / 3); +} + + +// --------------------------------------------------------------------------- +// レジスタ取得 +// +uint Y288::GetReg(uint addr) +{ + if (addr < 0x10) + return psg.GetReg(addr); + + if (addr == 0xff) + return ((mode288)?2:1); + + return 0; +} + + +// --------------------------------------------------------------------------- +// 合成 +// in: buffer 合成先 +// nsamples 合成サンプル数 +// +void Y288::Mix(Sample* buffer, int nsamples) +{ + FMMix(buffer, nsamples); + psg.Mix(buffer, nsamples); + RhythmMix(buffer, nsamples); +} + +#endif // BUILD_288 + +} // namespace FM diff --git a/fmgen/opna.h b/fmgen/opna.h new file mode 100644 index 0000000..d4c300b --- /dev/null +++ b/fmgen/opna.h @@ -0,0 +1,464 @@ +// --------------------------------------------------------------------------- +// OPN/A/B interface with ADPCM support +// Copyright (C) cisc 1998, 2003. +// --------------------------------------------------------------------------- +// $fmgen-Id: opna.h,v 1.33 2003/06/12 13:14:37 cisc Exp $ + +#ifndef FM_OPNA_H +#define FM_OPNA_H + +#include "fmgen.h" +#include "fmtimer.h" +#include "psg.h" + +// --------------------------------------------------------------------------- +// class OPN/OPNA +// OPN/OPNA に良く似た音を生成する音源ユニット +// +// interface: +// bool Init(uint clock, uint rate, bool, const char* path); +// 初期化.このクラスを使用する前にかならず呼んでおくこと. +// OPNA の場合はこの関数でリズムサンプルを読み込む +// +// clock: OPN/OPNA/OPNB のクロック周波数(Hz) +// +// rate: 生成する PCM の標本周波数(Hz) +// +// path: リズムサンプルのパス(OPNA のみ有効) +// 省略時はカレントディレクトリから読み込む +// 文字列の末尾には '\' や '/' などをつけること +// +// 返り値 初期化に成功すれば true +// +// bool LoadRhythmSample(const char* path) +// (OPNA ONLY) +// Rhythm サンプルを読み直す. +// path は Init の path と同じ. +// +// bool SetRate(uint clock, uint rate, bool) +// クロックや PCM レートを変更する +// 引数等は Init を参照のこと. +// +// void Mix(FM_SAMPLETYPE* dest, int nsamples) +// Stereo PCM データを nsamples 分合成し, dest で始まる配列に +// 加える(加算する) +// ・dest には sample*2 個分の領域が必要 +// ・格納形式は L, R, L, R... となる. +// ・あくまで加算なので,あらかじめ配列をゼロクリアする必要がある +// ・FM_SAMPLETYPE が short 型の場合クリッピングが行われる. +// ・この関数は音源内部のタイマーとは独立している. +// Timer は Count と GetNextEvent で操作する必要がある. +// +// void Reset() +// 音源をリセット(初期化)する +// +// void SetReg(uint reg, uint data) +// 音源のレジスタ reg に data を書き込む +// +// uint GetReg(uint reg) +// 音源のレジスタ reg の内容を読み出す +// 読み込むことが出来るレジスタは PSG, ADPCM の一部,ID(0xff) とか +// +// uint ReadStatus()/ReadStatusEx() +// 音源のステータスレジスタを読み出す +// ReadStatusEx は拡張ステータスレジスタの読み出し(OPNA) +// busy フラグは常に 0 +// +// bool Count(uint32 t) +// 音源のタイマーを t [μ秒] 進める. +// 音源の内部状態に変化があった時(timer オーバーフロー) +// true を返す +// +// uint32 GetNextEvent() +// 音源のタイマーのどちらかがオーバーフローするまでに必要な +// 時間[μ秒]を返す +// タイマーが停止している場合は ULONG_MAX を返す… と思う +// +// void SetVolumeFM(int db)/SetVolumePSG(int db) ... +// 各音源の音量を+−方向に調節する.標準値は 0. +// 単位は約 1/2 dB,有効範囲の上限は 20 (10dB) +// +namespace FM +{ + // OPN Base ------------------------------------------------------- + class OPNBase : public Timer + { + public: + OPNBase(); + virtual ~OPNBase() {} + + bool Init(uint c, uint r); + virtual void Reset(); + + void SetVolumeFM(int db); + void SetVolumePSG(int db); + void SetLPFCutoff(uint freq) {} // obsolete + + protected: + void SetParameter(Channel4* ch, uint addr, uint data); + void SetPrescaler(uint p); + void RebuildTimeTable(); + + int fmvolume; + + uint clock; // OPN クロック + uint rate; // FM 音源合成レート + uint psgrate; // FMGen 出力レート + uint status; + Channel4* csmch; + + + static uint32 lfotable[8]; + + private: + void TimerA(); + uint8 prescale; + + protected: + Chip chip; + PSG psg; + }; + + // OPN2 Base ------------------------------------------------------ + class OPNABase : public OPNBase + { + public: + OPNABase(); + virtual ~OPNABase(); + + uint ReadStatus() { return status & 0x03; } + uint ReadStatusEx(); + void SetChannelMask(uint mask); + + private: + virtual void Intr(bool) {} + + void MakeTable2(); + + protected: + bool Init(uint c, uint r, bool); + bool SetRate(uint c, uint r, bool); + + void Reset(); + void SetReg(uint addr, uint data); + void SetADPCMBReg(uint reg, uint data); + uint GetReg(uint addr); + + protected: + void FMMix(Sample* buffer, int nsamples); + void Mix6(Sample* buffer, int nsamples, int activech); + + void MixSubS(int activech, ISample**); + void MixSubSL(int activech, ISample**); + + void SetStatus(uint bit); + void ResetStatus(uint bit); + void UpdateStatus(); + void LFO(); + + void DecodeADPCMB(); + void ADPCMBMix(Sample* dest, uint count); + + void WriteRAM(uint data); + uint ReadRAM(); + int ReadRAMN(); + int DecodeADPCMBSample(uint); + + // FM 音源関係 + uint8 pan[6]; + uint8 fnum2[9]; + + uint8 reg22; + uint reg29; // OPNA only? + + uint stmask; + uint statusnext; + + uint32 lfocount; + uint32 lfodcount; + + uint fnum[6]; + uint fnum3[3]; + + // ADPCM 関係 + uint8* adpcmbuf; // ADPCM RAM + uint adpcmmask; // メモリアドレスに対するビットマスク + uint adpcmnotice; // ADPCM 再生終了時にたつビット + uint startaddr; // Start address + uint stopaddr; // Stop address + uint memaddr; // 再生中アドレス + uint limitaddr; // Limit address/mask + int adpcmlevel; // ADPCM 音量 + int adpcmvolume; + int adpcmvol; + uint deltan; // ��N + int adplc; // 周波数変換用変数 + int adpld; // 周波数変換用変数差分値 + uint adplbase; // adpld の元 + int adpcmx; // ADPCM 合成用 x + int adpcmd; // ADPCM 合成用 �� + int adpcmout; // ADPCM 合成後の出力 + int apout0; // out(t-2)+out(t-1) + int apout1; // out(t-1)+out(t) + + uint adpcmreadbuf; // ADPCM リード用バッファ + bool adpcmplay; // ADPCM 再生中 + int8 granuality; + bool adpcmmask_; + + uint8 control1; // ADPCM コントロールレジスタ1 + uint8 control2; // ADPCM コントロールレジスタ2 + uint8 adpcmreg[8]; // ADPCM レジスタの一部分 + + int rhythmmask_; + + Channel4 ch[6]; + + static void BuildLFOTable(); + static int amtable[FM_LFOENTS]; + static int pmtable[FM_LFOENTS]; + static int32 tltable[FM_TLENTS+FM_TLPOS]; + static bool tablehasmade; + }; + + // YM2203(OPN) ---------------------------------------------------- + class OPN : public OPNBase + { + public: + OPN(); + virtual ~OPN() {} + + bool Init(uint c, uint r, bool=false, const char* =0); + bool SetRate(uint c, uint r, bool=false); + + void Reset(); + void Mix(Sample* buffer, int nsamples); + void SetReg(uint addr, uint data); + uint GetReg(uint addr); + uint ReadStatus() { return status & 0x03; } + uint ReadStatusEx() { return 0xff; } + + void SetChannelMask(uint mask); + + int dbgGetOpOut(int c, int s) { return ch[c].op[s].dbgopout_; } + int dbgGetPGOut(int c, int s) { return ch[c].op[s].dbgpgout_; } + Channel4* dbgGetCh(int c) { return &ch[c]; } + + private: + virtual void Intr(bool) {} + + void SetStatus(uint bit); + void ResetStatus(uint bit); + + uint fnum[3]; + uint fnum3[3]; + uint8 fnum2[6]; + + Channel4 ch[3]; + }; + + // YM2608(OPNA) --------------------------------------------------- + class OPNA : public OPNABase + { + public: + OPNA(); + virtual ~OPNA(); + + bool Init(uint c, uint r, bool = false, const char* rhythmpath=0); + bool LoadRhythmSample(const char*); + + bool SetRate(uint c, uint r, bool = false); + void Mix(Sample* buffer, int nsamples); + + void Reset(); + void SetReg(uint addr, uint data); + uint GetReg(uint addr); + + void SetVolumeADPCM(int db); + void SetVolumeRhythmTotal(int db); + void SetVolumeRhythm(int index, int db); + + uint8* GetADPCMBuffer() { return adpcmbuf; } + + int dbgGetOpOut(int c, int s) { return ch[c].op[s].dbgopout_; } + int dbgGetPGOut(int c, int s) { return ch[c].op[s].dbgpgout_; } + Channel4* dbgGetCh(int c) { return &ch[c]; } + + + private: + struct Rhythm + { + uint8 pan; // ぱん + int8 level; // おんりょう + int volume; // おんりょうせってい + int16* sample; // さんぷる + uint size; // さいず + uint pos; // いち + uint step; // すてっぷち + uint rate; // さんぷるのれーと + }; + + void RhythmMix(Sample* buffer, uint count); + + // リズム音源関係 + Rhythm rhythm[6]; + int8 rhythmtl; // リズム全体の音量 + int rhythmtvol; + uint8 rhythmkey; // リズムのキー + }; + + // YM2610/B(OPNB) --------------------------------------------------- + class OPNB : public OPNABase + { + public: + OPNB(); + virtual ~OPNB(); + + bool Init(uint c, uint r, bool = false, + uint8 *_adpcma = 0, int _adpcma_size = 0, + uint8 *_adpcmb = 0, int _adpcmb_size = 0); + + bool SetRate(uint c, uint r, bool = false); + void Mix(Sample* buffer, int nsamples); + + void Reset(); + void SetReg(uint addr, uint data); + uint GetReg(uint addr); + uint ReadStatusEx(); + + void SetVolumeADPCMATotal(int db); + void SetVolumeADPCMA(int index, int db); + void SetVolumeADPCMB(int db); + +// void SetChannelMask(uint mask); + + private: + struct ADPCMA + { + uint8 pan; // ぱん + int8 level; // おんりょう + int volume; // おんりょうせってい + uint pos; // いち + uint step; // すてっぷち + + uint start; // 開始 + uint stop; // 終了 + uint nibble; // 次の 4 bit + int adpcmx; // 変換用 + int adpcmd; // 変換用 + }; + + int DecodeADPCMASample(uint); + void ADPCMAMix(Sample* buffer, uint count); + static void InitADPCMATable(); + + // ADPCMA 関係 + uint8* adpcmabuf; // ADPCMA ROM + int adpcmasize; + ADPCMA adpcma[6]; + int8 adpcmatl; // ADPCMA 全体の音量 + int adpcmatvol; + uint8 adpcmakey; // ADPCMA のキー + int adpcmastep; + uint8 adpcmareg[32]; + + static int jedi_table[(48+1)*16]; + + Channel4 ch[6]; + }; + + // YM2612/3438(OPN2) ---------------------------------------------------- + class OPN2 : public OPNBase + { + public: + OPN2(); + virtual ~OPN2() {} + + bool Init(uint c, uint r, bool=false, const char* =0); + bool SetRate(uint c, uint r, bool); + + void Reset(); + void Mix(Sample* buffer, int nsamples); + void SetReg(uint addr, uint data); + uint GetReg(uint addr); + uint ReadStatus() { return status & 0x03; } + uint ReadStatusEx() { return 0xff; } + + void SetChannelMask(uint mask); + + private: + virtual void Intr(bool) {} + + void SetStatus(uint bit); + void ResetStatus(uint bit); + + uint fnum[3]; + uint fnum3[3]; + uint8 fnum2[6]; + + // 線形補間用ワーク + int32 mixc, mixc1; + + Channel4 ch[3]; + }; + + // YMF288 --------------------------------------------------- + class Y288 : public OPNABase + { + public: + Y288(); + virtual ~Y288(); + + bool Init(uint c, uint r, bool ipflag = false, const char* =0); + bool LoadRhythmSample(const char*); + + bool SetRate(uint c, uint r, bool ipflag = false); + void Mix(Sample* buffer, int nsamples); + + void SetVolumeRhythmTotal(int db); + void SetVolumeRhythm(int index, int db); + + void Reset(); + void SetReg(uint addr, uint data); + uint GetReg(uint addr); + + private: + struct Rhythm + { + uint8 pan; // ぱん + int8 level; // おんりょう + int volume; // おんりょうせってい + int16* sample; // さんぷる + uint size; // さいず + uint pos; // いち + uint step; // すてっぷち + uint rate; // さんぷるのれーと + }; + + void RhythmMix(Sample* buffer, uint count); + + // リズム音源関係 + Rhythm rhythm[6]; + int8 rhythmtl; // リズム全体の音量 + int rhythmtvol; + uint8 rhythmkey; // リズムのキー + + int mode288; // 288/2608モードフラグ + }; +} + +// --------------------------------------------------------------------------- + +inline void FM::OPNBase::RebuildTimeTable() +{ + int p = prescale; + prescale = (uint8)-1; + SetPrescaler(p); +} + +inline void FM::OPNBase::SetVolumePSG(int db) +{ + psg.SetVolume(db); +} + +#endif // FM_OPNA_H diff --git a/fmgen/psg.cpp b/fmgen/psg.cpp new file mode 100644 index 0000000..cbbacbc --- /dev/null +++ b/fmgen/psg.cpp @@ -0,0 +1,364 @@ +// --------------------------------------------------------------------------- +// PSG Sound Implementation +// Copyright (C) cisc 1997, 1999. +// --------------------------------------------------------------------------- +// $fmgen-Id: psg.cpp,v 1.10 2002/05/15 21:38:01 cisc Exp $ + +#include "common.h" +#include "fmgen_types.h" + +#include "headers.h" +#include "misc.h" +#include "psg.h" + +// --------------------------------------------------------------------------- +// コンストラクタ・デストラクタ +// +PSG::PSG() +{ + SetVolume(0); + MakeNoiseTable(); + Reset(); + mask = 0x3f; +} + +PSG::~PSG() +{ + +} + +// --------------------------------------------------------------------------- +// PSG を初期化する(RESET) +// +void PSG::Reset() +{ + for (int i=0; i<14; i++) + SetReg(i, 0); + SetReg(7, 0xff); + SetReg(14, 0xff); + SetReg(15, 0xff); +} + +// --------------------------------------------------------------------------- +// クロック周波数の設定 +// +void PSG::SetClock(int clock, int rate) +{ + tperiodbase = int((1 << toneshift ) / 4.0 * clock / rate); + eperiodbase = int((1 << envshift ) / 4.0 * clock / rate); + nperiodbase = int((1 << noiseshift) / 4.0 * clock / rate); + + // 各データの更新 + int tmp; + tmp = ((reg[0] + reg[1] * 256) & 0xfff); + speriod[0] = tmp ? tperiodbase / tmp : tperiodbase; + tmp = ((reg[2] + reg[3] * 256) & 0xfff); + speriod[1] = tmp ? tperiodbase / tmp : tperiodbase; + tmp = ((reg[4] + reg[5] * 256) & 0xfff); + speriod[2] = tmp ? tperiodbase / tmp : tperiodbase; + tmp = reg[6] & 0x1f; + nperiod = tmp ? nperiodbase / tmp / 2 : nperiodbase / 2; + tmp = ((reg[11] + reg[12] * 256) & 0xffff); + eperiod = tmp ? eperiodbase / tmp : eperiodbase * 2; +} + +// --------------------------------------------------------------------------- +// ノイズテーブルを作成する +// +void PSG::MakeNoiseTable() +{ + if (!noisetable[0]) + { + int noise = 14321; + for (int i=0; i> 1) | (((noise << 14) ^ (noise << 16)) & 0x10000); + } + noisetable[i] = n; + } + } +} + +// --------------------------------------------------------------------------- +// 出力テーブルを作成 +// 素直にテーブルで持ったほうが省スペース。 +// +void PSG::SetVolume(int volume) +{ + double base = 0x4000 / 3.0 * pow(10.0, volume / 40.0); + for (int i=31; i>=2; i--) + { + EmitTable[i] = int(base); + base /= 1.189207115; + } + EmitTable[1] = 0; + EmitTable[0] = 0; + MakeEnvelopTable(); + + SetChannelMask(~mask); +} + +void PSG::SetChannelMask(int c) +{ + mask = ~c; + for (int i=0; i<3; i++) + olevel[i] = mask & (1 << i) ? EmitTable[(reg[8+i] & 15) * 2 + 1] : 0; +} + +// --------------------------------------------------------------------------- +// エンベロープ波形テーブル +// +void PSG::MakeEnvelopTable() +{ + // 0 lo 1 up 2 down 3 hi + static uint8 table1[16*2] = + { + 2,0, 2,0, 2,0, 2,0, 1,0, 1,0, 1,0, 1,0, + 2,2, 2,0, 2,1, 2,3, 1,1, 1,3, 1,2, 1,0, + }; + static uint8 table2[4] = { 0, 0, 31, 31 }; + static uint8 table3[4] = { 0, 1, (uint8)-1, 0 }; + + uint* ptr = enveloptable[0]; + + for (int i=0; i<16*2; i++) + { + uint8 v = table2[table1[i]]; + + for (int j=0; j<32; j++) + { + *ptr++ = EmitTable[v]; + v += table3[table1[i]]; + } + } +} + +// --------------------------------------------------------------------------- +// PSG のレジスタに値をセットする +// regnum レジスタの番号 (0 - 15) +// data セットする値 +// +void PSG::SetReg(uint regnum, uint8 data) +{ + if (regnum < 0x10) + { + reg[regnum] = data; + switch (regnum) + { + int tmp; + + case 0: // ChA Fine Tune + case 1: // ChA Coarse Tune + tmp = ((reg[0] + reg[1] * 256) & 0xfff); + speriod[0] = tmp ? tperiodbase / tmp : tperiodbase; + break; + + case 2: // ChB Fine Tune + case 3: // ChB Coarse Tune + tmp = ((reg[2] + reg[3] * 256) & 0xfff); + speriod[1] = tmp ? tperiodbase / tmp : tperiodbase; + break; + + case 4: // ChC Fine Tune + case 5: // ChC Coarse Tune + tmp = ((reg[4] + reg[5] * 256) & 0xfff); + speriod[2] = tmp ? tperiodbase / tmp : tperiodbase; + break; + + case 6: // Noise generator control + data &= 0x1f; + nperiod = data ? nperiodbase / data : nperiodbase; + break; + + case 8: + olevel[0] = mask & 1 ? EmitTable[(data & 15) * 2 + 1] : 0; + break; + + case 9: + olevel[1] = mask & 2 ? EmitTable[(data & 15) * 2 + 1] : 0; + break; + + case 10: + olevel[2] = mask & 4 ? EmitTable[(data & 15) * 2 + 1] : 0; + break; + + case 11: // Envelop period + case 12: + tmp = ((reg[11] + reg[12] * 256) & 0xffff); + eperiod = tmp ? eperiodbase / tmp : eperiodbase * 2; + break; + + case 13: // Envelop shape + ecount = 0; + envelop = enveloptable[data & 15]; + break; + } + } +} + +// --------------------------------------------------------------------------- +// +// +inline void PSG::StoreSample(Sample& dest, int32 data) +{ + if (sizeof(Sample) == 2) + dest = (Sample) Limit(dest + data, 0x7fff, -0x8000); + else + dest += data; +} + +// --------------------------------------------------------------------------- +// PCM データを吐き出す(2ch) +// dest PCM データを展開するポインタ +// nsamples 展開する PCM のサンプル数 +// +void PSG::Mix(Sample* dest, int nsamples) +{ + uint8 chenable[3], nenable[3]; + uint8 r7 = ~reg[7]; + + if ((r7 & 0x3f) | ((reg[8] | reg[9] | reg[10]) & 0x1f)) + { + chenable[0] = (r7 & 0x01) && (speriod[0] <= (1 << toneshift)); + chenable[1] = (r7 & 0x02) && (speriod[1] <= (1 << toneshift)); + chenable[2] = (r7 & 0x04) && (speriod[2] <= (1 << toneshift)); + nenable[0] = (r7 >> 3) & 1; + nenable[1] = (r7 >> 4) & 1; + nenable[2] = (r7 >> 5) & 1; + + int noise, sample; + uint env; + uint* p1 = ((mask & 1) && (reg[ 8] & 0x10)) ? &env : &olevel[0]; + uint* p2 = ((mask & 2) && (reg[ 9] & 0x10)) ? &env : &olevel[1]; + uint* p3 = ((mask & 4) && (reg[10] & 0x10)) ? &env : &olevel[2]; + + #define SCOUNT(ch) (scount[ch] >> (toneshift+oversampling)) + + if (p1 != &env && p2 != &env && p3 != &env) + { + // エンベロープ無し + if ((r7 & 0x38) == 0) + { + // ノイズ無し + for (int i=0; i> (noiseshift+oversampling+6)) & (noisetablesize-1)] + >> (ncount >> (noiseshift+oversampling+1)); +#else + noise = noisetable[(ncount >> (noiseshift+oversampling+6)) & (noisetablesize-1)] + >> (ncount >> (noiseshift+oversampling+1) & 31); +#endif + ncount += nperiod; + + int x, y, z; + x = ((SCOUNT(0) & chenable[0]) | (nenable[0] & noise)) - 1; // 0 or -1 + sample += (olevel[0] + x) ^ x; + scount[0] += speriod[0]; + y = ((SCOUNT(1) & chenable[1]) | (nenable[1] & noise)) - 1; + sample += (olevel[1] + y) ^ y; + scount[1] += speriod[1]; + z = ((SCOUNT(2) & chenable[2]) | (nenable[2] & noise)) - 1; + sample += (olevel[2] + z) ^ z; + scount[2] += speriod[2]; + } + sample /= (1 << oversampling); + StoreSample(dest[0], sample); + StoreSample(dest[1], sample); + dest += 2; + } + } + + // エンベロープの計算をさぼった帳尻あわせ + ecount = (ecount >> 8) + (eperiod >> (8-oversampling)) * nsamples; + if (ecount >= (1 << (envshift+6+oversampling-8))) + { + if ((reg[0x0d] & 0x0b) != 0x0a) + ecount |= (1 << (envshift+5+oversampling-8)); + ecount &= (1 << (envshift+6+oversampling-8)) - 1; + } + ecount <<= 8; + } + else + { + // エンベロープあり + for (int i=0; i> (envshift+oversampling)]; + ecount += eperiod; + if (ecount >= (1 << (envshift+6+oversampling))) + { + if ((reg[0x0d] & 0x0b) != 0x0a) + ecount |= (1 << (envshift+5+oversampling)); + ecount &= (1 << (envshift+6+oversampling)) - 1; + } +#ifdef _M_IX86 + noise = noisetable[(ncount >> (noiseshift+oversampling+6)) & (noisetablesize-1)] + >> (ncount >> (noiseshift+oversampling+1)); +#else + noise = noisetable[(ncount >> (noiseshift+oversampling+6)) & (noisetablesize-1)] + >> (ncount >> (noiseshift+oversampling+1) & 31); +#endif + ncount += nperiod; + + int x, y, z; + x = ((SCOUNT(0) & chenable[0]) | (nenable[0] & noise)) - 1; // 0 or -1 + sample += (*p1 + x) ^ x; + scount[0] += speriod[0]; + y = ((SCOUNT(1) & chenable[1]) | (nenable[1] & noise)) - 1; + sample += (*p2 + y) ^ y; + scount[1] += speriod[1]; + z = ((SCOUNT(2) & chenable[2]) | (nenable[2] & noise)) - 1; + sample += (*p3 + z) ^ z; + scount[2] += speriod[2]; + } + sample /= (1 << oversampling); + StoreSample(dest[0], sample); + StoreSample(dest[1], sample); + dest += 2; + } + } + } +} + +// --------------------------------------------------------------------------- +// テーブル +// +uint PSG::noisetable[noisetablesize] = { 0, }; +int PSG::EmitTable[0x20] = { -1, }; +uint PSG::enveloptable[16][64] = { 0, }; diff --git a/fmgen/psg.h b/fmgen/psg.h new file mode 100644 index 0000000..3e998cf --- /dev/null +++ b/fmgen/psg.h @@ -0,0 +1,93 @@ +// --------------------------------------------------------------------------- +// PSG-like sound generator +// Copyright (C) cisc 1997, 1999. +// --------------------------------------------------------------------------- +// $fmgen-Id: psg.h,v 1.8 2003/04/22 13:12:53 cisc Exp $ + +#ifndef PSG_H +#define PSG_H + +#define PSG_SAMPLETYPE int32 // int32 or int16 + +// --------------------------------------------------------------------------- +// class PSG +// PSG に良く似た音を生成する音源ユニット +// +// interface: +// bool SetClock(uint clock, uint rate) +// 初期化.このクラスを使用する前にかならず呼んでおくこと. +// PSG のクロックや PCM レートを設定する +// +// clock: PSG の動作クロック +// rate: 生成する PCM のレート +// retval 初期化に成功すれば true +// +// void Mix(Sample* dest, int nsamples) +// PCM を nsamples 分合成し, dest で始まる配列に加える(加算する) +// あくまで加算なので,最初に配列をゼロクリアする必要がある +// +// void Reset() +// リセットする +// +// void SetReg(uint reg, uint8 data) +// レジスタ reg に data を書き込む +// +// uint GetReg(uint reg) +// レジスタ reg の内容を読み出す +// +// void SetVolume(int db) +// 各音源の音量を調節する +// 単位は約 1/2 dB +// +class PSG +{ +public: + typedef PSG_SAMPLETYPE Sample; + + enum + { + noisetablesize = 1 << 11, // ←メモリ使用量を減らしたいなら減らして + toneshift = 24, + envshift = 22, + noiseshift = 14, + oversampling = 2, // ← 音質より速度が優先なら減らすといいかも + }; + +public: + PSG(); + ~PSG(); + + void Mix(Sample* dest, int nsamples); + void SetClock(int clock, int rate); + + void SetVolume(int vol); + void SetChannelMask(int c); + + void Reset(); + void SetReg(uint regnum, uint8 data); + uint GetReg(uint regnum) { return reg[regnum & 0x0f]; } + +protected: + void MakeNoiseTable(); + void MakeEnvelopTable(); + static void StoreSample(Sample& dest, int32 data); + + uint8 reg[16]; + + const uint* envelop; + uint olevel[3]; + uint32 scount[3], speriod[3]; + uint32 ecount, eperiod; + uint32 ncount, nperiod; + uint32 tperiodbase; + uint32 eperiodbase; + uint32 nperiodbase; + int volume; + int mask; + + static uint enveloptable[16][64]; + static uint noisetable[noisetablesize]; + static int EmitTable[32]; +}; + +#endif // PSG_H diff --git a/fmgen/readme.txt b/fmgen/readme.txt new file mode 100644 index 0000000..3e6c653 --- /dev/null +++ b/fmgen/readme.txt @@ -0,0 +1,93 @@ +------------------------------------------------------------------------------ + FM Sound Generator with OPN/OPM interface + Copyright (C) by cisc 1998, 2003. +------------------------------------------------------------------------------ + +【概要】 + C++ による FM/PSG 音源の実装です。 + + AY8910, YM2203, YM2151, YM2608, YM2610 相当のインターフェースも + 実装してあります。 + + +【使い方】 + (TODO:中身を書く) + +【注意】 + 以前のバージョンから幾分手を加えました。インターフェースは + いじっていないつもりですが、何かしらのバグが隠れているかもしれません。 + + YM2610 は動作チェックすらしていません。 + + 線形補完モード(interpolation)は廃止されました。 + Init() の引数仕様は変わっていませんが、interpolation = true にしても + 動作は変わりません。 + + OPNA::Init/SetRate で与えるチップクロックの値の仕様が + 以前の M88 に搭載されていたバージョンと異なっています. + + +【著作権、免責規定】 + + ・本ソースコードは作者(cisc@retropc.net) が著作権を所有しています。 + + ・本ソースコードはあるがままに提供されるものであり, + 暗黙及び明示的な保証を一切含みません. + + ・本ソースコードを利用したこと,利用しなかったこと, + 利用できなかったことに関して生じたあるいは生じると予測される + 損害について,作者は一切責任を負いません. + + ・本ソースコードは,以下の制限を満たす限り自由に改変・組み込み・ + 配布・利用することができます. + + 1. 本ソフトの由来(作者, 著作権)を明記すること. + 2. 配布する際にはフリーソフトとすること. + 3. 改変したソースコードを配布する際は改変内容を明示すること. + 4. ソースコードを配布する際にはこのテキストを一切改変せずに + そのまま添付すること. + + ・公開の際に作者への連絡を頂ければ幸いです. + + ・商用ソフト(シェアウェア含む) に本ソースコードの一部,または + 全部を組み込む際には,事前に作者の合意を得る必要があります. + + +【変更点】 +008 030902 ・出力サンプリングレートの設定を、チップ元来の合成サンプ + リングレートと異なる設定にするとエンベロープがおかしく + なる問題を修正。 + +007a 030608 ・領域外アクセスがあったのを修正 (Thanks to PI.様) + +007 030607 ・再現性の向上 + ・OPN: SSG-EG のサポート + ・線形補完の廃止 + ・asm 版の廃止 + ・マルチスレッドフリーになった? + +006 010330 ・再現性に関していくらか手直し(正弦波,出力タイミング等) + +005 010317 ・OPN: FM 音源の合成周波数が出力周波数よりも低いときに, + 補完を使うと音痴になる/音がまともに出なくなる問題を修正. + ・FM: 補完を使わない時の精度を上げてみる. + 問題が起きたら fmgeninl.h の FM_RATIOBITS を 8 に戻すと吉. + +004a 010311 ・OPM: ノイズをそこそこ聞けるレベル(?)まで修正. + ・OPNA/OPM: FM_USE_CALC2 廃止. + ・デグレ修正, なんのために cvs で管理しているんだか…(T-T + OPNB: ADPCMB ROM マスク作成ミス. + OPNB: ADPCMA ステータスフラグ関係の挙動修復. + OPM: LFO パラメータの初期化を忘れていたのを修正. + +003 010124 ・OPNA/OPM: 実際には補完前の値を出力していたバグを修正. + +002 010123 ・合成周波数が出力周波数より低いときでも補間が効くようにする. + ・OPN: 補間時にプリスケーラの設定を変更したときに音化けする + バグを修正. + ・OPNA/B: LFO が効かないバグを修正. + +001 000928 ・初期バージョン + + +$fmgen-Id: readme.txt,v 1.1 2003/06/07 08:25:20 cisc Exp $ diff --git a/icons/adpcm.bmp b/icons/adpcm.bmp new file mode 100644 index 0000000..4289d74 Binary files /dev/null and b/icons/adpcm.bmp differ diff --git a/icons/adpcm.xpm b/icons/adpcm.xpm new file mode 100644 index 0000000..f30c57e --- /dev/null +++ b/icons/adpcm.xpm @@ -0,0 +1,26 @@ +/* XPM */ +static char *adpcm[] = { +/* columns rows colors chars-per-pixel */ +"42 17 3 1", +" c black", +". c #808080", +"X c #C0C0C0", +/* pixels */ +"X X XX X", +"X XX. X .XX XX XXXXXXXXXXXXXXXXXXXXX X", +"X XXXX X XXXX XX XX XX XX XXX X X X X", +"X XXXX. X .XXXX XX X X X X X X X XXX X X", +"X XXXXX X XXXXX XX X X X X X X X XXX X X", +"X XXXXX X XXXXX XX X X X X XX XXX X X X", +"X XXXX. X .XXXX XX X X X X X XXX XXX X X X", +"X XXXX X XXXX XX X X X XX XXXX X X X X", +"X XX. X .XX XX XXXXXXXXXXXXXXXXXXXXX X", +"X X XX X", +"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", +" XXX XXX .XXX XX XX XXX XX", +" XX .XX XX. XX XX XXXX XXX. .XX XX", +" XX XX XX XXXXXX XXXX XXX X XX XX", +" XX XX XX XX XX XXXX XXX X XX XX", +" XX .XX XX. XX XX XXXX XX. .X XX", +" XXX XXX XX XXXX XX. .X. .X " +}; diff --git a/icons/fd_inserted.xpm b/icons/fd_inserted.xpm new file mode 100644 index 0000000..ce3920c --- /dev/null +++ b/icons/fd_inserted.xpm @@ -0,0 +1,26 @@ +/* XPM */ +static char *fd_inserted[] = { +/* width height ncolors chars_per_pixel */ +"16 16 3 1", +/* colors */ +" c #999999", +". c #C0C0C0", +"X c #585858", +/* pixels */ +"................", +"................", +"..XXXXXXXXXX....", +"..X X X XX...", +"..X X X X X..", +"..X X X X..", +"..X XXXXXXXX X..", +"..X X..", +"..X XXXXXXXX X..", +"..X X X X..", +"..X X X X..", +"..X X X X..", +"..X X X X..", +"..XXXXXXXXXXXX..", +"................", +"................" +}; diff --git a/icons/fd_inuse.xpm b/icons/fd_inuse.xpm new file mode 100644 index 0000000..3a99ddb --- /dev/null +++ b/icons/fd_inuse.xpm @@ -0,0 +1,26 @@ +/* XPM */ +static char *fd_inuse[] = { +/* width height ncolors chars_per_pixel */ +"16 16 3 1", +/* colors */ +" c #009F50", +". c #C0C0C0", +"X c #00E171", +/* pixels */ +"................", +"................", +".. ....", +".. X XXXX X ...", +".. X XXXX X X ..", +".. X XXXXXX X ..", +".. X X ..", +".. XXXXXXXXXX ..", +".. X X ..", +".. X XXXXXX X ..", +".. X XXXXXX X ..", +".. X XXXXXX X ..", +".. X XXXXXX X ..", +".. ..", +"................", +"................" +}; diff --git a/icons/fd_normal.xpm b/icons/fd_normal.xpm new file mode 100644 index 0000000..9155eed --- /dev/null +++ b/icons/fd_normal.xpm @@ -0,0 +1,25 @@ +/* XPM */ +static char *fd_normal[] = { +/* width height ncolors chars_per_pixel */ +"16 16 2 1", +/* colors */ +" c #9B9B9B", +". c #C0C0C0", +/* pixels */ +"................", +"................", +".. ....", +".. . .... . ...", +".. . .... . . ..", +".. . ...... . ..", +".. . . ..", +".. .......... ..", +".. . . ..", +".. . ...... . ..", +".. . ...... . ..", +".. . ...... . ..", +".. . ...... . ..", +".. ..", +"................", +"................" +}; diff --git a/icons/fd_protected.xpm b/icons/fd_protected.xpm new file mode 100644 index 0000000..5a522e3 --- /dev/null +++ b/icons/fd_protected.xpm @@ -0,0 +1,27 @@ +/* XPM */ +static char *fd_protected[] = { +/* width height ncolors chars_per_pixel */ +"16 16 4 1", +/* colors */ +" c #999999", +". c #8F2E2C", +"X c #C0C0C0", +"o c #585858", +/* pixels */ +"XXXXXXXXXXXXXXXX", +"XXXXXXXXXXXXXXXX", +"XXooooooooooXXXX", +"XXo o o ooXXX", +"XXo o o o oXX", +"XXo o o oXX", +"XXo oooooooo oXX", +"XXo oXX", +"XXo oooooooo oXX", +"XXo o o oXX", +"XXo o ...XX", +"XXo o . ...X", +"XXo o . . .X", +"XXoooooooo... .X", +"XXXXXXXXXXX...XX", +"XXXXXXXXXXXXXXXX" +}; diff --git a/icons/hd_inserted.xpm b/icons/hd_inserted.xpm new file mode 100644 index 0000000..6c3b3b7 --- /dev/null +++ b/icons/hd_inserted.xpm @@ -0,0 +1,26 @@ +/* XPM */ +static char *hd_inserted[] = { +/* width height ncolors chars_per_pixel */ +"16 16 3 1", +/* colors */ +" c #999999", +". c #C0C0C0", +"X c #585858", +/* pixels */ +"................", +"................", +".....XXXXXX.....", +"...XX XX...", +"..X X..", +"..XXX XXX..", +"..X XXXXXX X..", +"..X X..", +"..X X..", +"..X X..", +"..X X..", +"..X X..", +"...XX XX...", +".....XXXXXX.....", +"................", +"................" +}; diff --git a/icons/hd_inuse.xpm b/icons/hd_inuse.xpm new file mode 100644 index 0000000..4302df6 --- /dev/null +++ b/icons/hd_inuse.xpm @@ -0,0 +1,26 @@ +/* XPM */ +static char *hd_inuse[] = { +/* width height ncolors chars_per_pixel */ +"16 16 3 1", +/* colors */ +" c #009F50", +". c #C0C0C0", +"X c #00E171", +/* pixels */ +"................", +"................", +"..... .....", +"... XXXXXX ...", +".. XXXXXXXXXX ..", +".. XXXXXX ..", +".. XX XX ..", +".. XXXXXXXXXX ..", +".. XXXXXXXXXX ..", +".. XXXXXXXXXX ..", +".. XXXXXXXXXX ..", +".. XXXXXXXXXX ..", +"... XXXXXX ...", +"..... .....", +"................", +"................" +}; diff --git a/icons/hd_normal.xpm b/icons/hd_normal.xpm new file mode 100644 index 0000000..d53926e --- /dev/null +++ b/icons/hd_normal.xpm @@ -0,0 +1,25 @@ +/* XPM */ +static char *hd_normal[] = { +/* width height ncolors chars_per_pixel */ +"16 16 2 1", +/* colors */ +" c #9B9B9B", +". c #C0C0C0", +/* pixels */ +"................", +"................", +"..... .....", +"... ...... ...", +".. .......... ..", +".. ...... ..", +".. .. .. ..", +".. .......... ..", +".. .......... ..", +".. .......... ..", +".. .......... ..", +".. .......... ..", +"... ...... ...", +"..... .....", +"................", +"................" +}; diff --git a/icons/keropi.bmp b/icons/keropi.bmp new file mode 100644 index 0000000..76f29db Binary files /dev/null and b/icons/keropi.bmp differ diff --git a/icons/keropi.ico b/icons/keropi.ico new file mode 100644 index 0000000..0bf2bff Binary files /dev/null and b/icons/keropi.ico differ diff --git a/icons/keropi.xbm b/icons/keropi.xbm new file mode 100644 index 0000000..6721233 --- /dev/null +++ b/icons/keropi.xbm @@ -0,0 +1,14 @@ +#define keropi_width 32 +#define keropi_height 32 +static char keropi_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0xE0, 0x1D, 0x00, 0x00, 0xF0, 0x6F, 0x00, + 0x00, 0xD0, 0xFF, 0x00, 0x6D, 0xE4, 0xFC, 0x00, 0xE2, 0xEE, 0xBF, 0x00, + 0x1A, 0xF2, 0xFF, 0x00, 0x44, 0xEA, 0xFF, 0x01, 0xBB, 0xF4, 0xFF, 0x01, + 0x12, 0xA9, 0xBF, 0x00, 0x55, 0x6A, 0xDF, 0x00, 0xD4, 0xD5, 0xD7, 0x00, + 0x26, 0xAA, 0xB6, 0x00, 0x9A, 0x95, 0xED, 0x01, 0x24, 0x5D, 0x96, 0x03, + 0x51, 0xD5, 0xE6, 0x06, 0xA6, 0xAA, 0x3D, 0x07, 0x49, 0x3D, 0xDE, 0x07, + 0xB6, 0x92, 0xAF, 0x0E, 0xA9, 0xE8, 0xB7, 0x0D, 0x94, 0xBF, 0x69, 0x0F, + 0xFF, 0x9F, 0x66, 0x0D, 0x56, 0xE1, 0xDC, 0x1A, }; diff --git a/icons/keropi.xpm b/icons/keropi.xpm new file mode 100644 index 0000000..d7e0559 --- /dev/null +++ b/icons/keropi.xpm @@ -0,0 +1,112 @@ +/* XPM */ +static char *keropi_xpm[] = { +/* columns rows colors chars-per-pixel */ +"64 64 40 1", +" c black", +". c #2A1F00", +"X c #2A3F00", +"o c #2A1F55", +"O c #2A3F55", +"+ c #2A5F00", +"@ c #007F55", +"# c #2A5F55", +"$ c #2A7F55", +"% c #553F55", +"& c #555F55", +"* c #557F55", +"= c #7F5F55", +"- c #009F55", +"; c #00BF55", +": c #2A9F55", +"> c #2ABF55", +", c #2ADF55", +"< c #559F55", +"1 c #55BF55", +"2 c #55DF55", +"3 c #7FDF55", +"4 c #2ABFAA", +"5 c #2ADFAA", +"6 c #559FAA", +"7 c #55BFAA", +"8 c #7FBFAA", +"9 c #55DFAA", +"0 c #7FDFAA", +"q c #7FFFAA", +"w c #808080", +"e c #AA9FAA", +"r c #A0A0A4", +"t c #AABFAA", +"y c #AAFFAA", +"u c #C0DCC0", +"i c #CCCCFF", +"p c #D4DFFF", +"a c #FFFBF0", +"s c gray100", +/* pixels */ +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" .OOo. ", +" &uutew% o%%&%. ", +" wsaaaspw. OtuuuuwO ", +" .o OwwwraspO wapuupaeO ", +" .wt& %tapw. rse&&wuar. ", +" otau% .wut& %e% .wap& ", +" &uatO .wut&. . %up& ", +" .. wapwO%. waatw&&. &uu& ", +" .ww. .wpsuuu& tssappur&. .=tpr. ", +" &pu& .&russsssw &putetuau% owppe% ", +" waaw.%rupuupaatO OOooO&uaw OruuwO ", +" waawoeaur&%&up& wat. wau&. ", +" %pst%rpw. Otaw &uu% Otar. ", +" .esawO%. rae. &uu% %uaw ", +" &asu. &ptO .wptO .wwO ", +" .usuO &uu% .&O .&uuw. .. ", +" &pp& %uu& wauwwwruar. ", +" .eae. %uu& tssaaaauwo .OO. ", +" =aaw. %uaw &ttttte&. &paw ", +" .rapw. &ast ..oo. rssu ", +" OuspO Ouaw %tu& ", +" .rauO O%. ", +" ow% ", +" ", +" ", +" ", +" oOXOO ", +" .O@:>;:#X ", +" .O&OOO&O O#:>>@+#@>;% ", +" O&7000091& &1,:O&o .>-X ", +" &<0q0717909# .oO.OOXXX.. .O>5> war @># ", +" .<00wX .X709#. .%%O#&#::>>>>14:$##O$29: OwO .>:O ", +" %0y6.wr X909&&&#&<>7>525252494299252,7,$ X>;% ", +" .*q0.%si. <907<19999929>,7>42>,7,>,9>9>9: O>-# ", +" &808 O. *q9090902915>91,9,424,79>15>2>9# +;-. ", +" .&8q8. $090909099291,5>>9>52>,,9>24>,>># O-,@ ", +" .&000O <9020909399257192>91,7514,4,>4>>>>:$>>>;# ", +" .&000< $00909020909972,4,7,>5>2>,41>>>>>>>>>>>;>O ", +" .&0000*. .$099090909092929>24,7,7,4,7,>5>,>>>>;>;>>;# ", +" #7000q9777090209399020991951,7,7,1,4>>>>4>>4>>>>>;>;;. ", +" O51,5>5>,>,>>>>;>>>;>@. ", +" O000000090209090920902927,9,>,242>4>,>>>4>>>;4>;>;>;;X ", +" o<000090209093909090999924249>424,,>4>5>,>4>>>>:->;;;@ ", +" .*000000909090920902002729>2>9,>24>9>,>4>>>,>;$#:;>->;X ", +" *900000<1090900909099999>9,7,1541,>>4>,>,5>:+#;>>>;;>@. ", +" &0000007$*7209q909090291251515>2,4,9,,4>:$#@:;>>;;>->-. ", +" #00000900<$***<111937919515>9>7>4>:$$$#$#::>>>>;>>;;;>X. ", +" O000000090917<$*###$*##+$#+##$+#$##$::>>>,>>>;>>;;>;>;@O ", +" O00000000000000000809917141>1>7>129,2524,4>,4>4>>>>>>>$O " +}; +#define keropi_xpm_width 64 +#define keropi_xpm_height 64 diff --git a/icons/keropi_icon.xpm b/icons/keropi_icon.xpm new file mode 100644 index 0000000..7267787 --- /dev/null +++ b/icons/keropi_icon.xpm @@ -0,0 +1,72 @@ +/* XPM */ +static char *keropi_icon[] = { +/* columns rows colors chars-per-pixel */ +"32 32 34 1", +" c black", +". c #291800", +"X c #293800", +"o c #291852", +"O c #293852", +"+ c #295900", +"@ c #007952", +"# c #295952", +"$ c #297952", +"% c #523852", +"& c #525952", +"* c #527952", +"= c #7B5952", +"- c #7B7952", +"; c #009E52", +": c #00BE52", +"> c #299E52", +", c #29BE52", +"< c #29DF52", +"1 c #52BE52", +"2 c #52DF52", +"3 c #29BEAD", +"4 c #29DFAD", +"5 c #52BEAD", +"6 c #52DFAD", +"7 c #848684", +"8 c #AD9EAD", +"9 c #A5A6A5", +"0 c #ADBEAD", +"q c #D6BEAD", +"w c #C6DFC6", +"e c #D6DFFF", +"r c #FFFFF7", +"t c gray100", +/* pixels */ +"tttttttttttttttttttttttttttttttt", +"tttttttttttttttttttttttttttttttt", +"tttttttttttttttttttttttttttttttt", +"tttttttttttttttttttttttttttttttt", +"tttttttttttttttttttttttttttttttt", +"tttttttttttttttttttttttttttttttt", +"tttttttttttttttttttttttttttttttt", +"tttttttttttttttttttttttttttttttt", +"tttttttttttttttttttttttttttttttt", +"tttttttttttttrw87*79wrtttttttttt", +"ttttttttttttw&#@>,:>$*wttrtttttt", +"tttttttrtrtw$>,,@+#@,:&etttttrtt", +"rtrrtttttte71<>O&o .,;-rttrtttt", +"*7***=78wr7,4, 7r9 @,$etrttttt", +",,,13>>**&$26> O7O .,>0tttttrt", +"2363266242<5<$ X,:7ttrtttt", +"32,<5<,<6,6,6> O,;*rttttrt", +"<323<56,14,2,6# +:;&ttttttt", +"6,42,<<6,23,<,,# O;<@7tttrttt", +",61<5413<3<,3,,,,>$,,,:$qttttttt", +"5<,4,2,<31,,,,,,,,,,,:,#rtrtttrt", +"<5<5<3<5<,4,<,,,,:,:,,:#0tttrttt", +"5<5<1<3,,,,3,,3,,,,,:,::#wtttttt", +"<5<,41<4,4,<,<,,,,:,,,:,@&rtttrt", +",<232,3,<,,,3,,,:3,:,:,::X7ttttt", +"6,323<<,3,4,<,3,,,,>;,:::@orrttt", +",6<,23,6,<,3,,,<,:$#>:,;,:X9tttt", +"5<1431<,,3,<,<4,>+#:,,,::,@%ttrt", +"414,2<3<6<<3,>$#@>:,,::,;,;.wttt", +",6,5,3,>$$$#$#>>,,,,:,,:::,X8ttt", +"##$+#$##$>>,,,<,,,:,,::,:,:@7ttt", +",1,5,126<2423<3,<3,3,,,,,,,$&rtt" +}; diff --git a/icons/keropi_mono.ico b/icons/keropi_mono.ico new file mode 100644 index 0000000..b14c81c Binary files /dev/null and b/icons/keropi_mono.ico differ diff --git a/icons/keropi_mono.xbm b/icons/keropi_mono.xbm new file mode 100644 index 0000000..5293428 --- /dev/null +++ b/icons/keropi_mono.xbm @@ -0,0 +1,14 @@ +#define keropi_mono_width 32 +#define keropi_mono_height 32 +static char keropi_mono_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x0F, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 0x10, 0x47, 0x00, + 0x00, 0x90, 0xDE, 0x00, 0x7F, 0x48, 0x9C, 0x00, 0xC0, 0xC7, 0x3E, 0x01, + 0x00, 0xC0, 0x3F, 0x01, 0x00, 0xC0, 0x3F, 0x01, 0x00, 0xC0, 0x3F, 0x01, + 0x00, 0x80, 0x9F, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x04, + 0x00, 0x00, 0x06, 0x08, 0x00, 0xC0, 0x01, 0x08, 0x00, 0x3E, 0x00, 0x08, + 0xFF, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, }; diff --git a/icons/motorola.bmp b/icons/motorola.bmp new file mode 100644 index 0000000..e996914 Binary files /dev/null and b/icons/motorola.bmp differ diff --git a/icons/motorola.xpm b/icons/motorola.xpm new file mode 100644 index 0000000..cd913ea --- /dev/null +++ b/icons/motorola.xpm @@ -0,0 +1,94 @@ +/* XPM */ +static char *motorola[] = { +/* columns rows colors chars-per-pixel */ +"41 48 40 1", +" c black", +". c #2A1F00", +"X c #2A3F00", +"o c #2A1F55", +"O c #2A3F55", +"+ c #553F55", +"@ c #555F55", +"# c #7F5F55", +"$ c #7F7F55", +"% c blue", +"& c #2A1FFF", +"* c #2A3FFF", +"= c #2A5FFF", +"- c #2A7FFF", +"; c #553FFF", +": c #7F7FAA", +"> c #555FFF", +", c #557FFF", +"< c #7F7FFF", +"1 c #559FFF", +"2 c #7F9FFF", +"3 c #7FBFFF", +"4 c #808080", +"5 c #A0A0A4", +"6 c #AABFAA", +"7 c #AA9FFF", +"8 c #AABFFF", +"9 c #A6CAF0", +"0 c #AADFFF", +"q c #D4BFAA", +"w c #D4BFFF", +"e c #C0DCC0", +"r c #CCCCFF", +"t c #D4DFFF", +"y c #CCFFFF", +"u c #D4FFFF", +"i c #FFCCFF", +"p c #FFDFFF", +"a c #FFFBF0", +"s c gray100", +/* pixels */ +"sssssssssssssssssssssssssssssssssssssssss", +"sssssssssssssssssssst822,==;=,,78tsssssss", +"ssssssssssssssssst2>*%*%*%*%*%&&&,sssssss", +"sssssssssssssst2=*%%**%*&*&%%%**%,sssssss", +"sssssssssssss2*%*%***=11233ssss**1sssssss", +"sssssssssss8>**&*=-2yasassss=209,7sssssss", +"ssssssssss,**%*-8tsssssssass=2satusssssss", +"ssssssss8=&%*,tssssssssssssa=2u*,>tssssss", +"sssssss,&%*3ussssssssssst78t=sss", +"sss=*2=a==s8*=2r*8==2t9ssssst8sssssa=*tss", +"ssu*-=*2**2=*8,r*9atasssssss>&9sssss7&9ss", +"ssr%2=%=*%2=*,=t,=ssssssssss=*rr*=ts8&8ss", +"ss3*2*****>9**9sasssssss,*=3s8*7ss", +"ss2*2*2&2*=satssssssssrs,,s2**2*2=7s8%9ss", +"ss7*,*2*2**usssssssss,*88rr***,**=ts<*yss", +"ss8*,*2*2**as88ttsss<%*2*,,=,*,*222s==sss", +"ss8*22r3t88ss2<,*8=3-*9t&,>3,*2*<&2t%2sss", +"sst*=ssasssss78,%*&>,*rt*,=,**r2=,t,=asss", +"sss2%7sssssss*,1&1=*s2*2*,,&=&tass2%9ssss", +"sssa**tssssss=<2%t2*t3%2*,t83*tsss*=sssss", +"ssss3%>ssssss>,1*t3*3**r=2ssaussu>*tsssss", +"ssssu,%2sssss,<2%tr*=%2sassssss8=%3ssssss", +"ssssst=%,tsss,,t2at*2tssssssst<*%,sssssss", +"ssssssr*%*2ss2,sssssassssssp8=%*1ssssssss", +"sssssss3**%=,rssssssssssp82=%%-rsssssssss", +"sssssssst,=*%*>,228872,==*%*,9sssssssssss", +"sssssssssss8,*%%%%*%%&%*&=8ssssssssssssss", +"ssssssssssssst921-==-,18tssssssssssssssss", +"sssssssssssssssssasssssssssssssssssssssss", +"ssateapeasse5esst6ase5assa6tsse5tsse5asss", +"sss+ 45 5a@ +se.+tao .ta. .ae .e5 Oass", +"ssa. 44 45 465ao es@Oe 54 5.:+.5 @++4 4ss", +"sst. .O @+.sss5 .5a.+ e@os@+ 4s4 .6s.@ss", +"sse @ .++O.assO.eo.OOe 4+Xa+O 4s@ o5ao+ss", +"ss6 eo@e.6 o45@ 4.OO.4 45 @.5@ 4 @@.4 5ss", +"ssq t$4eos5. @aO .esO Oaa+ +seo Oa6 @ass", +"sssaasaaaasteaaattsaaeaasatassaeassaessss", +"ssssssss8,122<1,,,,=>>,>=,,,,,,,,>,,,ssss", +"sssssssssspsuutttrrr88211<,>==****&%*tsss", +"sssseee6s6pepe5a5eqtaqa5essssssuuut00ssss", +"ssss555+e45ee5#a@e4q54e+5ssssssssssssssss", +"sssatat6p6peie5a5wqet6sqessssssssssssssss" +}; diff --git a/icons/nekolgc.bmp b/icons/nekolgc.bmp new file mode 100644 index 0000000..88493dc Binary files /dev/null and b/icons/nekolgc.bmp differ diff --git a/icons/nekolgc.xpm b/icons/nekolgc.xpm new file mode 100644 index 0000000..cae7ce3 --- /dev/null +++ b/icons/nekolgc.xpm @@ -0,0 +1,26 @@ +/* XPM */ +static char *nekolgc[] = { +/* columns rows colors chars-per-pixel */ +"57 17 3 1", +" c black", +". c #808080", +"X c #C0C0C0", +/* pixels */ +"X XXX X ", +"X XX. X .XX X XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ", +"X XXXX X XXXX X X X X X X X XXXX X X X X X XXX ", +"X XXXX. X .XXXX X X X X XXX . X X XXXX X X XXX . X X XXX ", +"X XXXXX XXXXX X X X X XX X XXXX X X XX X XXX ", +"X X X X X X XXX . X X X X X XXX . X X X ", +"X X X . X XXX X X X XXXX . X XXX X X X XXX ", +"X XXX XXX X X X X X X X XXXX X X X X X XXX ", +"X .X X. X XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ", +"X X ", +"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", +" XX X X X. X X X X XXXX XXXX XXX X XX ", +" X X X X X. X X X X XXXX XXX X X XXXX X XX", +" X X X X . X X X X X X XXX X X X X X XX", +" XX X X X XX XX X X X XXX X X X X X XX", +" XXXX . X X. XXX .XX X XXXX XXX X X X X X XX", +" XXXXX XX X. XXX .XXX XXXXX XX XXX XX XX " +}; diff --git a/icons/nulldev.xpm b/icons/nulldev.xpm new file mode 100644 index 0000000..872dca8 --- /dev/null +++ b/icons/nulldev.xpm @@ -0,0 +1,25 @@ +/* XPM */ +static char *nulldev[] = { +/* width height ncolors chars_per_pixel */ +"16 16 2 1", +/* colors */ +" c #9B9B9B", +". c #C0C0C0", +/* pixels */ +"................", +"................", +"... ...", +".. .......... ..", +".. . ...... . ..", +".. .. .... .. ..", +".. ... .. ... ..", +".. .... ..... ..", +".. ..... .... ..", +".. ... .. ... ..", +".. .. .... .. ..", +".. . ...... . ..", +".. .......... ..", +"... ...", +"................", +"................" +}; diff --git a/icons/opm.bmp b/icons/opm.bmp new file mode 100644 index 0000000..73d024c Binary files /dev/null and b/icons/opm.bmp differ diff --git a/icons/opm.xpm b/icons/opm.xpm new file mode 100644 index 0000000..c6973ab --- /dev/null +++ b/icons/opm.xpm @@ -0,0 +1,27 @@ +/* XPM */ +static char *opm[] = { +/* columns rows colors chars-per-pixel */ +"30 18 3 1", +" c black", +". c #808080", +"X c #C0C0C0", +/* pixels */ +"XXXXXXXXXXXXXXXXXXXXXXXXXXX X", +" X ", +" XXXXXXXXXXXXXXXXXXXXXXXX . ", +" XX XX .XX .XX X X", +" X XX .XX X X X X X XXXX", +" X XX XX X X X X X XXXX", +" X XX XX XX X X X XXXX", +" XX XXX XXXX X X X XXXX", +" XXXXXXXX .XXXXXXXXX. X XXXX", +" XXXXXXXXXXXXXXXXXXXXXXXX XXXX", +" XXXX", +" XXXXXXXXXXXXXXXXXXXXXXXX XXXX", +" X .. . X XX XXXX", +" X X X X X X XX X X XXXX", +" X .. . . X X X X X XXXX", +" XXXXXXXXXXXXXXXXXXXXXXXX XXXX", +" XXXX", +"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" +}; diff --git a/icons/winx68k.ico b/icons/winx68k.ico new file mode 100644 index 0000000..3574867 Binary files /dev/null and b/icons/winx68k.ico differ diff --git a/win32api/appftype.h b/win32api/appftype.h new file mode 100644 index 0000000..a0ab168 --- /dev/null +++ b/win32api/appftype.h @@ -0,0 +1,20 @@ + +// DOSIO用のファイルタイプ + +enum { + FTYPE_NONE = 0, // 自動判別 or PC + FTYPE_SMIL, // システム予約 + FTYPE_TEXT, // テキストファイル + FTYPE_BMP, // Bitmap + FTYPE_PICT, // Picture (予約) + FTYPE_PNG, // Png (予約) + FTYPE_WAV, // Wave + FTYPE_D88, // D88 + FTYPE_BETA, // ベタイメージ + FTYPE_THD, // .thd ハードディスクイメージ + FTYPE_HDI, // .hdi ハードディスクイメージ + FTYPE_HDD, // .hdd ハードディスクイメージ (予約) + FTYPE_S98, // .s98 ハードディスクイメージ + FTYPE_MIMPI, // mimpi defaultファイル + FTYPE_SRAM // SRAM +}; diff --git a/win32api/dosio.c b/win32api/dosio.c new file mode 100644 index 0000000..4db2f1a --- /dev/null +++ b/win32api/dosio.c @@ -0,0 +1,650 @@ +/* $Id: dosio.c,v 1.2 2003/12/05 18:07:15 nonaka Exp $ */ + +/* + * Copyright (c) 2003 NONAKA Kimihiro + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgment: + * This product includes software developed by NONAKA Kimihiro. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include + +#include "dosio.h" + +static char curpath[MAX_PATH+32] = ""; +static LPSTR curfilep = curpath; + +void +dosio_init(void) +{ + + /* Nothing to do. */ +} + +void +dosio_term(void) +{ + + /* Nothing to do. */ +} + +/* ファイル操作 */ +FILEH +file_open(LPSTR filename) +{ + FILEH ret; + + ret = CreateFile(filename, GENERIC_READ | GENERIC_WRITE, + 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (ret == (FILEH)INVALID_HANDLE_VALUE) { + ret = CreateFile(filename, GENERIC_READ, + 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (ret == (FILEH)INVALID_HANDLE_VALUE) + return (FILEH)FALSE; + } + return ret; +} + +FILEH +file_create(LPSTR filename, int ftype) +{ + FILEH ret; + + (void)ftype; + + ret = CreateFile(filename, GENERIC_READ | GENERIC_WRITE, + 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + if (ret == (FILEH)INVALID_HANDLE_VALUE) + return (FILEH)FALSE; + return ret; +} + +DWORD +file_seek(FILEH handle, long pointer, short mode) +{ + + return SetFilePointer(handle, pointer, 0, mode); +} + +DWORD +file_lread(FILEH handle, void *data, DWORD length) +{ + DWORD readsize; + + if (ReadFile(handle, data, length, &readsize, NULL) == 0) + return 0; + return readsize; +} + +DWORD +file_lwrite(FILEH handle, void *data, DWORD length) +{ + DWORD writesize; + + if (WriteFile(handle, data, length, &writesize, NULL) == 0) + return 0; + return writesize; +} + +WORD +file_read(FILEH handle, void *data, WORD length) +{ + DWORD readsize; + + if (ReadFile(handle, data, length, &readsize, NULL) == 0) + return 0; + return (WORD)readsize; +} + +DWORD +file_zeroclr(FILEH handle, DWORD length) +{ + char buf[256]; + DWORD size; + DWORD wsize; + DWORD ret = 0; + + memset(buf, 0, sizeof(buf)); + while (length > 0) { + wsize = (length >= sizeof(buf)) ? sizeof(buf) : length; + + size = file_lwrite(handle, buf, wsize); + if (size == (DWORD)-1) + return -1; + + ret += size; + if (size != wsize) + break; + length -= wsize; + } + return ret; +} + + +WORD +file_write(FILEH handle, void *data, WORD length) +{ + DWORD writesize; + + if (WriteFile(handle, data, length, &writesize, NULL) == 0) + return 0; + return (WORD)writesize; +} + +WORD +file_lineread(FILEH handle, void *data, WORD length) +{ + LPSTR p = (LPSTR)data; + DWORD readsize; + DWORD pos; + WORD ret = 0; + + if ((length == 0) || ((pos = file_seek(handle, 0, 1)) == (DWORD)-1)) + return 0; + + ZeroMemory(data, length); + if (ReadFile(handle, data, length-1, &readsize, NULL) == 0) + return 0; + + while (*p) { + ret++; + pos++; + if ((*p == 0x0d) || (*p == 0x0a)) { + break; + } + p++; + } + *p = '\0'; + + file_seek(handle, pos, 0); + + return ret; +} + +short +file_close(FILEH handle) +{ + + CloseHandle(handle); + return 0; +} + +short +file_attr(LPSTR filename) +{ + + return (short)GetFileAttributes(filename); +} + + + // カレントファイル操作 +void +file_setcd(LPSTR exename) +{ + + strncpy(curpath, exename, sizeof(curpath)); + plusyen(curpath, sizeof(curpath)); + curfilep = curpath + strlen(exename) + 1; + *curfilep = '\0'; +} + +LPSTR +file_getcd(LPSTR filename) +{ + + strncpy(curfilep, filename, curfilep - curpath); + return curpath; +} + +FILEH +file_open_c(LPSTR filename) +{ + + strncpy(curfilep, filename, curfilep - curpath); + return file_open(curpath); +} + +FILEH +file_create_c(LPSTR filename, int ftype) +{ + + strncpy(curfilep, filename, curfilep - curpath); + return file_create(curpath, ftype); +} + +short +file_attr_c(LPSTR filename) +{ + + strncpy(curfilep, filename, curfilep - curpath); + return file_attr(curpath); +} + +int +file_getftype(LPSTR filename) +{ + + (void)filename; + + return FTYPE_NONE; +} + + +LPSTR +getFileName(LPSTR filename) +{ + LPSTR p, q; + + for (p = q = filename; *p != '\0'; p++) + if (*p == '/') + q = p + 1; + return q; +} + +void +cutFileName(LPSTR filename) +{ + LPSTR p, q; + + for (p = filename, q = NULL; *p != '\0'; p++) + if (*p == '/') + q = p + 1; + if (q != NULL) + *q = '\0'; +} + +LPSTR +getExtName(LPSTR filename) +{ + LPSTR p; + LPSTR q; + + p = getFileName(filename); + q = NULL; + + while (*p != '\0') { + if (*p == '.') + q = p + 1; + p++; + } + if (q == NULL) + q = p; + return q; +} + +void +cutExtName(LPSTR filename) +{ + LPSTR p; + LPSTR q; + + p = getFileName(filename); + q = NULL; + + while (*p != '\0') { + if (*p == '.') + q = p; + p++; + } + if (q != NULL) + *q = '\0'; +} + +int +kanji1st(LPSTR str, int pos) +{ + int ret = 0; + BYTE c; + + for (; pos > 0; pos--) { + c = (BYTE)str[pos]; + if (!((0x81 <= c && c <= 0x9f) || (0xe0 <= c && c <= 0xfc))) + break; + ret ^= 1; + } + return ret; +} + +int +kanji2nd(LPSTR str, int pos) +{ + int ret = 0; + BYTE c; + + while (pos-- > 0) { + c = (BYTE)str[pos]; + if (!((0x81 <= c && c <= 0x9f) || (0xe0 <= c && c <= 0xfc))) + break; + ret ^= 1; + } + return ret; +} + + +int +ex_a2i(LPSTR str, int min, int max) +{ + int ret = 0; + char c; + + if (str == NULL) + return(min); + + for (;;) { + c = *str++; + if (c == ' ') + continue; + if ((c < '0') || (c > '9')) + break; + ret = ret * 10 + (c - '0'); + } + + if (ret < min) + return min; + else if (ret > max) + return max; + return ret; +} + +void +cutyen(LPSTR str) +{ + int pos = strlen(str) - 1; + + if ((pos > 0) && (str[pos] == '/')) + str[pos] = '\0'; +} + +void +plusyen(LPSTR str, int len) +{ + int pos = strlen(str); + + if (pos) { + if (str[pos-1] == '/') + return; + } + if ((pos + 2) >= len) + return; + str[pos++] = '/'; + str[pos] = '\0'; +} + + +void +fname_mix(LPSTR str, LPSTR mix, int size) +{ + LPSTR p; + int len; + char c; + char check; + + cutFileName(str); + if (mix[0] == '/') + str[0] = '\0'; + + len = strlen(str); + p = str + len; + check = '.'; + while (len < size) { + c = *mix++; + if (c == '\0') + break; + + if (c == check) { + /* current dir */ + if (mix[0] == '/') { + mix++; + continue; + } + /* parent dir */ + if (mix[0] == '.' && mix[1] == '/') { + mix += 2; + cutyen(str); + cutFileName(str); + len = strlen(str); + p = str + len; + continue; + } + } + if (c == '/') + check = '.'; + else + check = 0; + *p++ = c; + len++; + } + if (p < str + len) + *p = '\0'; + else + str[len - 1] = '\0'; +} + +/* + * UNIX -> DOS 日時変換 + */ +/* $NetBSD: msdosfs_conv.c,v 1.29 2001/01/18 20:28:27 jdolecek Exp $ */ +/*- + * Copyright (C) 1995, 1997 Wolfgang Solfrank. + * Copyright (C) 1995, 1997 TooLs GmbH. + * All rights reserved. + * Original code by Paul Popelka (paulp@uts.amdahl.com) (see below). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by TooLs GmbH. + * 4. The name of TooLs GmbH may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/* + * Written by Paul Popelka (paulp@uts.amdahl.com) + * + * You can do anything you want with this software, just don't say you wrote + * it, and don't remove this notice. + * + * This software is provided "as is". + * + * The author supplies this software to be publicly redistributed on the + * understanding that the author is not responsible for the correct + * functioning of this software in any circumstances and is not liable for + * any damages caused by this software. + * + * October 1992 + */ + +/* + * Days in each month in a regular year. + */ +unsigned short const regyear[] = { + 31, 28, 31, 30, 31, 30, + 31, 31, 30, 31, 30, 31 +}; + +/* + * Days in each month in a leap year. + */ +unsigned short const leapyear[] = { + 31, 29, 31, 30, 31, 30, + 31, 31, 30, 31, 30, 31 +}; + +/* + * Variables used to remember parts of the last time conversion. Maybe we + * can avoid a full conversion. + */ +static time_t lasttime; +static unsigned long lastday; +static unsigned short lastddate; +static unsigned short lastdtime; + +/* + * Convert the unix version of time to dos's idea of time to be used in + * file timestamps. The passed in unix time is assumed to be in GMT. + */ +void +unix2dostime(time_t t, unsigned short *ddp, unsigned short *dtp, unsigned char *dhp) +{ + time_t tt; + unsigned long days; + unsigned long inc; + unsigned long year; + unsigned long month; + const unsigned short *months; + + /* + * If the time from the last conversion is the same as now, then + * skip the computations and use the saved result. + */ + tt = t; + t &= ~1; + if (lasttime != t) { + lasttime = t; + lastdtime = (((t / 2) % 30) << DT_2SECONDS_SHIFT) + + (((t / 60) % 60) << DT_MINUTES_SHIFT) + + (((t / 3600) % 24) << DT_HOURS_SHIFT); + + /* + * If the number of days since 1970 is the same as the last + * time we did the computation then skip all this leap year + * and month stuff. + */ + days = t / (24 * 60 * 60); + if (days != lastday) { + lastday = days; + for (year = 1970;; year++) { + inc = year & 0x03 ? 365 : 366; + if (days < inc) + break; + days -= inc; + } + months = year & 0x03 ? regyear : leapyear; + for (month = 0; month < 12; month++) { + if (days < months[month]) + break; + days -= months[month]; + } + lastddate = ((days + 1) << DD_DAY_SHIFT) + + ((month + 1) << DD_MONTH_SHIFT); + /* + * Remember dos's idea of time is relative to 1980. + * unix's is relative to 1970. If somehow we get a + * time before 1980 then don't give totally crazy + * results. + */ + if (year > 1980) + lastddate += (year - 1980) << DD_YEAR_SHIFT; + } + } + if (dtp) + *dtp = lastdtime; + if (dhp) + *dhp = (tt & 1) * 100; + + *ddp = lastddate; +} + +/* + * The number of seconds between Jan 1, 1970 and Jan 1, 1980. In that + * interval there were 8 regular years and 2 leap years. + */ +#define SECONDSTO1980 (((8 * 365) + (2 * 366)) * (24 * 60 * 60)) + +static unsigned short lastdosdate; +static unsigned long lastseconds; + +/* + * Convert from dos' idea of time to unix'. This will probably only be + * called from the stat(), and fstat() system calls and so probably need + * not be too efficient. + */ +void +dos2unixtime(unsigned int dd, unsigned int dt, unsigned int dh, time_t *tp) +{ + unsigned long seconds; + unsigned long m, month; + unsigned long y, year; + unsigned long days; + const unsigned short *months; + + if (dd == 0) { + /* + * Uninitialized field, return the epoch. + */ + tp = 0; + return; + } + seconds = ((dt & DT_2SECONDS_MASK) >> DT_2SECONDS_SHIFT) * 2 + + ((dt & DT_MINUTES_MASK) >> DT_MINUTES_SHIFT) * 60 + + ((dt & DT_HOURS_MASK) >> DT_HOURS_SHIFT) * 3600 + + dh / 100; + /* + * If the year, month, and day from the last conversion are the + * same then use the saved value. + */ + if (lastdosdate != dd) { + lastdosdate = dd; + days = 0; + year = (dd & DD_YEAR_MASK) >> DD_YEAR_SHIFT; + for (y = 0; y < year; y++) + days += y & 0x03 ? 365 : 366; + months = year & 0x03 ? regyear : leapyear; + /* + * Prevent going from 0 to 0xffffffff in the following + * loop. + */ + month = (dd & DD_MONTH_MASK) >> DD_MONTH_SHIFT; + if (month == 0) { + printf("dos2unixtime(): month value out of range (%ld)\n", + month); + month = 1; + } + for (m = 0; m < month - 1; m++) + days += months[m]; + days += ((dd & DD_DAY_MASK) >> DD_DAY_SHIFT) - 1; + lastseconds = (days * 24 * 60 * 60) + SECONDSTO1980; + } + *tp = seconds + lastseconds; +} diff --git a/win32api/dosio.h b/win32api/dosio.h new file mode 100644 index 0000000..d09912b --- /dev/null +++ b/win32api/dosio.h @@ -0,0 +1,169 @@ +/* $Id: dosio.h,v 1.1.1.1 2003/04/28 18:06:55 nonaka Exp $ */ + +/* + * Copyright (c) 2003 NONAKA Kimihiro + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgment: + * This product includes software developed by NONAKA Kimihiro. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __NP2_DOSIO_H__ +#define __NP2_DOSIO_H__ + +#include "common.h" +#include "appftype.h" + +#define FILEH HANDLE + +#define FSEEK_SET 0 +#define FSEEK_CUR 1 +#define FSEEK_END 2 + +#ifdef __cplusplus +extern "C" { +#endif + // DOSIO:関数の準備 +void dosio_init(void); +void dosio_term(void); + // ファイル操作 +FILEH file_open(LPSTR filename); +FILEH file_create(LPSTR filename, int ftype); +DWORD file_seek(FILEH handle, long pointer, short mode); +DWORD file_lread(FILEH handle, void *data, DWORD length); +DWORD file_lwrite(FILEH handle, void *data, DWORD length); +WORD file_read(FILEH handle, void *data, WORD length); +WORD file_write(FILEH handle, void *data, WORD length); +DWORD file_zeroclr(FILEH handle, DWORD length); +WORD file_lineread(FILEH handle, void *data, WORD length); +short file_close(FILEH handle); +short file_attr(LPSTR filename); + // カレントファイル操作 +void file_setcd(LPSTR exename); +LPSTR file_getcd(LPSTR filename); +FILEH file_open_c(LPSTR filename); +FILEH file_create_c(LPSTR filename, int ftype); +short file_attr_c(LPSTR filename); + +int file_getftype(LPSTR filename); + + // 日時の取得 +void dosdateset(BYTE *dat); +void dostimeset(BYTE *dat); + + +LPSTR getFileName(LPSTR filename); +void cutFileName(LPSTR filename); +LPSTR getExtName(LPSTR filename); +void cutExtName(LPSTR filename); +void plusyen(LPSTR str, int len); +void cutyen(LPSTR str); + +int kanji1st(LPSTR str, int pos); +int ex_a2i(LPSTR str, int min, int max); + +void fname_mix(LPSTR str, LPSTR mix, int size); + +/* $NetBSD: direntry.h,v 1.14 1997/11/17 15:36:32 ws Exp $ */ + +/*- + * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank. + * Copyright (C) 1994, 1995, 1997 TooLs GmbH. + * All rights reserved. + * Original code by Paul Popelka (paulp@uts.amdahl.com) (see below). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by TooLs GmbH. + * 4. The name of TooLs GmbH may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/* + * Written by Paul Popelka (paulp@uts.amdahl.com) + * + * You can do anything you want with this software, just don't say you wrote + * it, and don't remove this notice. + * + * This software is provided "as is". + * + * The author supplies this software to be publicly redistributed on the + * understanding that the author is not responsible for the correct + * functioning of this software in any circumstances and is not liable for + * any damages caused by this software. + * + * October 1992 + */ + +/* + * This is the format of the contents of the deTime field in the direntry + * structure. + * We don't use bitfields because we don't know how compilers for + * arbitrary machines will lay them out. + */ +#define DT_2SECONDS_MASK 0x1F /* seconds divided by 2 */ +#define DT_2SECONDS_SHIFT 0 +#define DT_MINUTES_MASK 0x7E0 /* minutes */ +#define DT_MINUTES_SHIFT 5 +#define DT_HOURS_MASK 0xF800 /* hours */ +#define DT_HOURS_SHIFT 11 + +/* + * This is the format of the contents of the deDate field in the direntry + * structure. + */ +#define DD_DAY_MASK 0x1F /* day of month */ +#define DD_DAY_SHIFT 0 +#define DD_MONTH_MASK 0x1E0 /* month */ +#define DD_MONTH_SHIFT 5 +#define DD_YEAR_MASK 0xFE00 /* year - 1980 */ +#define DD_YEAR_SHIFT 9 + +void unix2dostime(time_t t, u_int16_t *ddp, u_int16_t *dtp, u_int8_t *dhp); +void dos2unixtime(u_int dd, u_int dt, u_int dh, time_t *tp); + +#ifdef __cplusplus +}; +#endif + +#endif /* __NP2_DOSIO_H__ */ diff --git a/win32api/fake.c b/win32api/fake.c new file mode 100644 index 0000000..1a21039 --- /dev/null +++ b/win32api/fake.c @@ -0,0 +1,295 @@ +/* $Id: fake.c,v 1.2 2003/12/05 18:07:15 nonaka Exp $ */ + +/* + * Copyright (c) 2003 NONAKA Kimihiro + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgment: + * This product includes software developed by NONAKA Kimihiro. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +#include "windows.h" +#include "mmsystem.h" + +int WINAPI +MessageBox(HWND hWnd, LPCSTR str, LPCSTR title, UINT flags) +{ + + (void)hWnd; + (void)flags; + + printf("----- %s\n", title); + printf("%s\n", str); + printf("-----\n\n"); + + return 0; +} + +void WINAPI +PostQuitMessage(int m) +{ + + exit(m); +} + +DWORD WINAPI +GetLastError(VOID) +{ + + return NO_ERROR; +} + +BOOL WINAPI +SetEndOfFile(HANDLE hFile) +{ + + (void)hFile; + + return FALSE; +} + +WINMMAPI MMRESULT WINAPI +midiOutPrepareHeader(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh) +{ + + (void)hmo; + (void)pmh; + (void)cbmh; + return !MIDIERR_STILLPLAYING; // (ぉ +} + +WINMMAPI MMRESULT WINAPI +midiOutUnprepareHeader(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh) +{ + + (void)hmo; + (void)pmh; + (void)cbmh; + return MMSYSERR_NOERROR; +} + +WINMMAPI MMRESULT WINAPI +midiOutShortMsg(HMIDIOUT hmo, DWORD dwMsg) +{ + + (void)hmo; + (void)dwMsg; + return MMSYSERR_NOERROR; +} + +WINMMAPI MMRESULT WINAPI +midiOutLongMsg(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh) +{ + + (void)hmo; + (void)pmh; + (void)cbmh; + return MMSYSERR_NOERROR; +} + +WINMMAPI MMRESULT WINAPI +midiOutOpen(LPHMIDIOUT phmo, UINT uDeviceID, DWORD dwCallback, + DWORD dwInstance, DWORD fdwOpen) +{ + + (void)phmo; + (void)uDeviceID; + (void)dwCallback; + (void)dwInstance; + (void)fdwOpen; + return !MMSYSERR_NOERROR; // (ぃ +} + +WINMMAPI MMRESULT WINAPI +midiOutClose(HMIDIOUT hmo) +{ + + (void)hmo; + return MMSYSERR_NOERROR; +} + +WINMMAPI MMRESULT WINAPI +midiOutReset(HMIDIOUT hmo) +{ + + (void)hmo; + return MMSYSERR_NOERROR; +} + +static int _WritePrivateProfileString_subr( + FILE *, long, long, LPCSTR, LPCSTR); + +BOOL WINAPI +WritePrivateProfileString(LPCSTR sect, LPCSTR key, LPCSTR str, LPCSTR inifile) +{ + char lbuf[256]; + char newbuf[256]; + struct stat sb; + FILE *fp; + long pos; + int found = 0; + int notfound = 0; + int delta; + + if (stat(inifile, &sb) == 0) + fp = fopen(inifile, "r+"); + else + fp = fopen(inifile, "w+"); + if (!fp) + return FALSE; + + while (!feof(fp)) { + fgets(lbuf, sizeof(lbuf), fp); + /* XXX should be case insensitive */ + if (lbuf[0] == '[' + && !strncasecmp(sect, &lbuf[1], strlen(sect)) + && lbuf[strlen(sect) + 1] == ']') { + found = 1; + break; + } + } + if (feof(fp) && !found) { + /* + * Now create new section and key. + */ + rewind(fp); + snprintf(newbuf, sizeof(newbuf), "[%s]\n", sect); + if (fwrite(newbuf, strlen(newbuf), 1, fp) < 1) + goto writefail; + snprintf(newbuf, sizeof(newbuf), "%s=%s\n", key, str); + if (fwrite(newbuf, strlen(newbuf), 1, fp) < 1) + goto writefail; + fclose(fp); + return TRUE; + } + + pos = 0; /* gcc happy */ + found = 0; + while (!feof(fp)) { + pos = ftell(fp); + fgets(lbuf, sizeof(lbuf), fp); + if (lbuf[0] == '[' && strchr(lbuf, ']')) { + notfound = 1; + break; + } + /* XXX should be case insensitive */ + if (!strncasecmp(key, lbuf, strlen(key)) + && lbuf[strlen(key)] == '=') { + found = 1; + snprintf(newbuf, sizeof(newbuf), "%s=%s\n", key, str); + delta = strlen(newbuf) - strlen(lbuf); + if (delta == 0) { + if (!strncasecmp(newbuf, lbuf, strlen(newbuf))) + break; + /* overwrite */ + fseek(fp, pos, SEEK_SET); + if (fwrite(newbuf, strlen(newbuf), 1, fp) < 1) + goto writefail; + } else if (delta > 0) { + if (!_WritePrivateProfileString_subr(fp, pos, + ftell(fp), newbuf, inifile)) + goto writefail; + } else { + if (!_WritePrivateProfileString_subr(fp, pos, + ftell(fp), newbuf, inifile)) + goto writefail; + } + break; + } + } + if (feof(fp) && !found) { + /* + * Now create new key. + */ + fseek(fp, 0L, SEEK_END); + snprintf(newbuf, sizeof(newbuf), "%s=%s\n", key, str); + if (fwrite(newbuf, strlen(newbuf), 1, fp) < 1) + goto writefail; + } + else if (notfound) { + snprintf(newbuf, sizeof(newbuf), "%s=%s\n", key, str); + if (!_WritePrivateProfileString_subr(fp, pos, + ftell(fp), newbuf, inifile)) + goto writefail; + } + + fclose(fp); + return TRUE; + +writefail: + fclose(fp); + return FALSE; +} + +/* + * XXX: REWRITE ME!!! + */ +static int +_WritePrivateProfileString_subr(FILE *fp, long pos, long nowpos, + LPCSTR buf, LPCSTR file) +{ + struct stat sb; + char *p; + + if (stat(file, &sb) < 0) + return 1; + + p = (char *)malloc(sb.st_size); + if (!p) + return 1; + rewind(fp); + if (fread(p, sb.st_size, 1, fp) < 1) + goto out; + fclose(fp); + + fp = fopen(file, "w+"); + if (fp == NULL) + goto out; + if (fwrite(p, pos, 1, fp) < 1) + goto out; + if (fwrite(buf, strlen(buf), 1, fp) < 1) + goto out; + if (sb.st_size - nowpos > 0) + if (fwrite(p + nowpos, sb.st_size - nowpos, 1, fp) < 1) + goto out; + free(p); + return 0; + +out: + free(p); + return 1; +} diff --git a/win32api/mmsystem.h b/win32api/mmsystem.h new file mode 100644 index 0000000..44e77c8 --- /dev/null +++ b/win32api/mmsystem.h @@ -0,0 +1,50 @@ +/* $Id: mmsystem.h,v 1.1.1.1 2003/04/28 18:06:55 nonaka Exp $ */ + +#ifndef MMSYSTEM_H__ +#define MMSYSTEM_H__ + +#include "windows.h" + +#define WINMMAPI +typedef UINT MMRESULT; +typedef HANDLE HMIDIOUT; +typedef HMIDIOUT * LPHMIDIOUT; + +typedef struct midihdr { + LPSTR lpData; + DWORD dwBufferLength; + DWORD dwBytesRecorded; + DWORD dwUser; + DWORD dwFlags; + struct midihdr * lpNext; + DWORD reserved; + DWORD dwOffset; + DWORD dwReserved[8]; +} MIDIHDR, *PMIDIHDR, *NPMIDIHDR, *LPMIDIHDR; + + +#define MMSYSERR_NOERROR 0 +#define MIDIERR_STILLPLAYING 2 + +#define MIDI_MAPPER -1 + +#define CALLBACK_NULL 0x00000000L + + +#ifdef __cplusplus +extern "C" { +#endif + +WINMMAPI MMRESULT WINAPI midiOutPrepareHeader(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh); +WINMMAPI MMRESULT WINAPI midiOutUnprepareHeader(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh); +WINMMAPI MMRESULT WINAPI midiOutShortMsg(HMIDIOUT hmo, DWORD dwMsg); +WINMMAPI MMRESULT WINAPI midiOutLongMsg(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh); +WINMMAPI MMRESULT WINAPI midiOutOpen(LPHMIDIOUT phmo, UINT uDeviceID, DWORD dwCallback, DWORD dwInstance, DWORD fdwOpen); +WINMMAPI MMRESULT WINAPI midiOutClose(HMIDIOUT hmo); +WINMMAPI MMRESULT WINAPI midiOutReset(HMIDIOUT hmo); + +#ifdef __cplusplus +}; +#endif + +#endif /* MMSYSTEM_H__ */ diff --git a/win32api/peace.c b/win32api/peace.c new file mode 100644 index 0000000..ed10ab9 --- /dev/null +++ b/win32api/peace.c @@ -0,0 +1,456 @@ +/* $Id: peace.c,v 1.4 2008/11/17 12:24:18 nonaka Exp $ */ + +/* + * Copyright 2000 Masaru OKI + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "windows.h" + + +/*----- + * + * From PEACE - http://chiharu.hauN.org/peace/ja/ + * + */ +enum { + HTYPE_MEMORY = 0x100, + HTYPE_HEAP, + HTYPE_PROCESS, + HTYPE_THREAD, + HTYPE_MODULE, + HTYPE_FILE, + HTYPE_FILEMAPPING, + HTYPE_SEMAPHORE, + HTYPE_MUTEX, + HTYPE_EVENT, + HTYPE_HWND, + HTYPE_MENU, +#if 0 + HTYPE_HDC, + HTYPE_BMP, + HTYPE_ICON, + HTYPE_FONT, + HTYPE_PALETTE, + HTYPE_PEN, + HTYPE_BRUSH, + HTYPE_RGN, + HTYPE_METAFILE, +#endif + HTYPE_CONSOLE, + HTYPE_KEY, +}; + +struct internal_handle { + void *p; + u_int flags; + size_t psize; + u_int refcount; + int type; +}; + +struct internal_file { + int fd; +}; + +#define ptrtohandle(h) \ + ((struct internal_handle *)((void *)(h) - sizeof(struct internal_handle))) + +#define isfixed(h) \ + ((ptrtohandle(h)->p == (h)) ? 1 : 0) + +#define sethandletype(h,t) \ + do { \ + if (isfixed(h)) \ + ptrtohandle(h)->type = (t); \ + else \ + (((struct internal_handle *)(h))->type = (t)); \ + } while (/* CONSTCOND */0) + +#define handletype(h) \ + ((isfixed(h)) ? \ + ptrtohandle(h)->type : (((struct internal_handle *)(h))->type)) + + +#ifdef DEBUG +#define DPRF(arg) printf arg +#else /* !DEBUG */ +#define DPRF(arg) +#endif /* DEBUG */ + + +DWORD WINAPI +GetTickCount(void) +{ + struct timeval tv; + + gettimeofday(&tv, 0); + return tv.tv_usec / 1000 + tv.tv_sec * 1000; +} + +BOOL WINAPI +ReadFile(HANDLE h, PVOID buf, DWORD len, PDWORD lp, LPOVERLAPPED lpov) +{ + struct internal_file *fp; + + (void)lpov; + + if (h == (HANDLE)INVALID_HANDLE_VALUE) + return FALSE; + + fp = LocalLock(h); + *lp = read(fp->fd, buf, len); + LocalUnlock(h); + if (*lp <= 0) + return FALSE; + return TRUE; +} + +BOOL WINAPI +WriteFile(HANDLE h, PCVOID buf, DWORD len, PDWORD lp, LPOVERLAPPED lpov) +{ + struct internal_file *fp; + + (void)lpov; + + if (h == (HANDLE)INVALID_HANDLE_VALUE) + return FALSE; + + fp = LocalLock(h); + *lp = write(fp->fd, buf, len); + LocalUnlock(h); + if (*lp <= 0) + return FALSE; + return TRUE; +} + +HANDLE WINAPI +CreateFile(LPCSTR filename, DWORD rdwr, DWORD share, + LPSECURITY_ATTRIBUTES sap, + DWORD crmode, DWORD flags, HANDLE template) +{ + struct internal_file *fp; + HANDLE h; + int fd, fmode = 0; + + (void)share; + (void)sap; + (void)flags; + (void)template; + + switch (rdwr & (GENERIC_READ|GENERIC_WRITE)) { + case GENERIC_READ: + fmode |= O_RDONLY; + break; + case GENERIC_WRITE: + fmode |= O_WRONLY; + break; + case GENERIC_READ|GENERIC_WRITE: + fmode |= O_RDWR; + default: + break; + } + switch (crmode) { + case CREATE_ALWAYS: + fmode |= O_CREAT; + break; + case OPEN_EXISTING: + break; + } + fd = open(filename, fmode, 0644); + if (fd < 0) + return (HANDLE)INVALID_HANDLE_VALUE; + + h = LocalAlloc(0, sizeof(struct internal_file)); + sethandletype(h, HTYPE_FILE); + fp = LocalLock(h); + fp->fd = fd; + LocalUnlock(h); + return h; +} + +DWORD WINAPI +SetFilePointer(HANDLE h, LONG pos, PLONG newposh, DWORD whence) +{ + struct internal_file *fp; + off_t newpos; + int fd; + + (void)newposh; + + fp = LocalLock(h); + fd = fp->fd; + LocalUnlock(h); + newpos = lseek(fd, pos, whence); + return newpos; +} + +BOOL WINAPI +CloseHandle(HANDLE h) +{ + switch (handletype(h)) { + case HTYPE_FILE: + { + struct internal_file *fp; + + fp = LocalLock(h); + close(fp->fd); + LocalUnlock(h); + } + break; + default: + return FALSE; + } + LocalFree(h); + return TRUE; +} + +DWORD WINAPI +GetFileAttributes(LPCSTR path) +{ + struct stat sb; + DWORD attr = FILE_ATTRIBUTE_NORMAL; + + if (stat(path, &sb) == 0) { + if (S_ISDIR(sb.st_mode)) + return FILE_ATTRIBUTE_DIRECTORY; + if (!(sb.st_mode & S_IWUSR)) + attr |= FILE_ATTRIBUTE_READONLY; + return attr; + } + + return -1; +} + +HLOCAL WINAPI +LocalAlloc(UINT flags, UINT bytes) +{ + + return GlobalAlloc(flags, bytes); +} + +HLOCAL WINAPI +LocalFree(HLOCAL h) +{ + + return GlobalFree(h); +} + +PVOID WINAPI +LocalLock(HLOCAL h) +{ + + return GlobalLock(h); +} + +BOOL WINAPI +LocalUnlock(HLOCAL h) +{ + + return GlobalUnlock(h); +} + +HGLOBAL WINAPI +GlobalAlloc(UINT flags, DWORD bytes) +{ + struct internal_handle *p; + + (void)flags; + + p = malloc(bytes + sizeof(struct internal_handle)); + if (p != 0) { + p->p = &p[1]; + p->psize = bytes; + p->refcount = 0; + p->type = HTYPE_MEMORY; + return p; + } + return 0; +} + +HGLOBAL WINAPI +GlobalFree(HGLOBAL h) +{ + struct internal_handle *ih = h; + + if (h == 0) + return 0; + if (!isfixed(h)) { + free(ih); + return 0; + } + ih = GlobalHandle(h); + if (ih->p == &ih[1]) { + free(ih); + return 0; + } + + return h; +} + +HGLOBAL WINAPI +GlobalHandle(PCVOID p) +{ + + return (HGLOBAL)(p - sizeof(struct internal_handle)); +} + +LPVOID WINAPI +GlobalLock(HGLOBAL h) +{ + struct internal_handle *ih = h; + + if (isfixed(h)) + return h; + ih->refcount++; + + return ih->p; +} + +BOOL WINAPI +GlobalUnlock(HGLOBAL h) +{ + struct internal_handle *ih = h; + + if (isfixed(h) || ih->refcount == 0) + return FALSE; + + if (--ih->refcount != 0) { + /* still locked */ + return TRUE; + } + + /* unlocked */ + return FALSE; +} + +DWORD WINAPI +GetPrivateProfileString(LPCSTR sect, LPCSTR key, LPCSTR defvalue, + LPSTR buf, DWORD len, LPCSTR inifile) +{ + char lbuf[256]; + FILE *fp; + + if (sect == NULL + || key == NULL + || defvalue == NULL + || buf == NULL + || len == 0 + || inifile == NULL) + return 0; + + bzero(buf, len); + + fp = fopen(inifile, "r"); + if (fp == NULL) + goto nofile; + while (!feof(fp)) { + fgets(lbuf, sizeof(lbuf), fp); + /* XXX should be case insensitive */ + if (lbuf[0] == '[' + && !strncasecmp(sect, &lbuf[1], strlen(sect)) + && lbuf[strlen(sect) + 1] == ']') + break; + } + if (feof(fp)) + goto notfound; + while (!feof(fp)) { + fgets(lbuf, sizeof(lbuf), fp); + if (lbuf[0] == '[' && strchr(lbuf, ']')) + goto notfound; + /* XXX should be case insensitive */ + if (!strncasecmp(key, lbuf, strlen(key)) + && lbuf[strlen(key)] == '=') { + char *dst, *src; + src = &lbuf[strlen(key) + 1]; + dst = buf; + while (*src != '\r' && *src != '\n' && *src != '\0') + *dst++ = *src++; + *dst = '\0'; + fclose(fp); + return strlen(buf); + } + } +notfound: + DPRF(("[%s]:%s not found\n", sect, key)); + fclose(fp); +nofile: + strncpy(buf, defvalue, len); + /* not include nul */ + return strlen(buf); +} + +UINT WINAPI +GetPrivateProfileInt(LPCSTR sect, LPCSTR key, INT defvalue, LPCSTR inifile) +{ + char lbuf[256]; + FILE *fp; + + if (sect == NULL + || key == NULL + || inifile == NULL) + return 0; + + fp = fopen(inifile, "r"); + if (fp == NULL) + goto nofile; + while (!feof(fp)) { + fgets(lbuf, sizeof(lbuf), fp); + /* XXX should be case insensitive */ + if (lbuf[0] == '[' + && !strncasecmp(sect, &lbuf[1], strlen(sect)) + && lbuf[strlen(sect) + 1] == ']') + break; + } + if (feof(fp)) + goto notfound; + while (!feof(fp)) { + fgets(lbuf, sizeof(lbuf), fp); + if (lbuf[0] == '[' && strchr(lbuf, ']')) + goto notfound; + /* XXX should be case insensitive */ + if (!strncasecmp(key, lbuf, strlen(key)) + && lbuf[strlen(key)] == '=') { + int value; + sscanf(&lbuf[strlen(key) + 1], "%d", &value); + fclose(fp); + return value; + } + } +notfound: + fclose(fp); +nofile: + return defvalue; +} diff --git a/win32api/peace.h b/win32api/peace.h new file mode 100644 index 0000000..52f5134 --- /dev/null +++ b/win32api/peace.h @@ -0,0 +1,39 @@ +/* $Id: peace.h,v 1.1.1.1 2003/04/28 18:06:55 nonaka Exp $ */ + +#ifndef __NP2_PEACE_H__ +#define __NP2_PEACE_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +DWORD WINAPI GetTickCount(void); + +BOOL WINAPI ReadFile(HANDLE, PVOID, DWORD, PDWORD, LPOVERLAPPED); +BOOL WINAPI WriteFile(HANDLE, PCVOID, DWORD, PDWORD, LPOVERLAPPED); +HANDLE WINAPI CreateFile(LPCSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, + DWORD, DWORD, HANDLE); +DWORD WINAPI SetFilePointer(HANDLE, LONG, PLONG, DWORD); +BOOL WINAPI CloseHandle(HANDLE); +DWORD WINAPI GetFileAttributes(LPCSTR); + +HLOCAL WINAPI LocalAlloc(UINT, UINT); +HLOCAL WINAPI LocalFree(HLOCAL); +PVOID WINAPI LocalLock(HLOCAL); +BOOL WINAPI LocalUnlock(HLOCAL); + +HGLOBAL WINAPI GlobalAlloc(UINT, DWORD); +HGLOBAL WINAPI GlobalFree(HGLOBAL); +LPVOID WINAPI GlobalLock(HGLOBAL); +BOOL WINAPI GlobalUnlock(HGLOBAL); +HGLOBAL WINAPI GlobalHandle(PCVOID); + +DWORD WINAPI GetPrivateProfileString(LPCSTR, LPCSTR, LPCSTR, LPSTR, + DWORD, LPCSTR); +UINT WINAPI GetPrivateProfileInt(LPCSTR, LPCSTR, INT, LPCSTR); + +#ifdef __cplusplus +}; +#endif + +#endif /* __NP2_PEACE_H__ */ diff --git a/win32api/windows.h b/win32api/windows.h new file mode 100644 index 0000000..13c3cd8 --- /dev/null +++ b/win32api/windows.h @@ -0,0 +1,211 @@ +/* $Id: windows.h,v 1.1.1.1 2003/04/28 18:06:55 nonaka Exp $ */ + +#ifndef __NP2_WIN32EMUL_H__ +#define __NP2_WIN32EMUL_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef signed char CHAR; +typedef signed short SHORT; +typedef signed int INT; +typedef signed long LONG; + +typedef unsigned char UCHAR; +typedef unsigned short USHORT; +typedef unsigned int UINT; +typedef unsigned long ULONG; + +typedef unsigned char BYTE; +typedef unsigned short WORD; +typedef unsigned int DWORD; + +typedef int BOOL; +typedef WORD WPARAM; +typedef DWORD LPARAM; +typedef LONG LRESULT; + +typedef void VOID; +typedef void *PVOID; +typedef void *LPVOID; +typedef const void *PCVOID; +typedef long *PLONG; +typedef BYTE *LPBYTE; +typedef WORD *LPWORD; +typedef DWORD *PDWORD; +typedef DWORD *LPDWORD; +typedef char *LPSTR; +typedef const char *LPCSTR; + +typedef void * LPSECURITY_ATTRIBUTES; +typedef void * LPOVERLAPPED; + +typedef int HWND; +typedef void * HANDLE; +typedef HANDLE HLOCAL; +typedef HANDLE HGLOBAL; + +typedef void * DRAWITEMSTRUCT; + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef MAX_PATH +#define MAX_PATH MAXPATHLEN +#endif + +#ifndef max +#define max(a,b) (((a) > (b)) ? (a) : (b)) +#endif + +#ifndef AVE +#define AVE(a, b) (((a)+(b))/2) +#endif + +/* + * DUMMY DEFINITION + */ +#define WINAPI +#define CALLBACK +#define UNUSED(v) ((void)(v)) + +#ifndef INLINE +#define INLINE static inline +#endif + +#define RGB(r,g,b) ((DWORD)((BYTE)(r))|((WORD)((BYTE)(g)))|((DWORD)((BYTE)(b)))) + +#define MB_APPLMODAL 0 + +#define MB_ICONSTOP 16 +#define MB_ICONINFORMATION 64 + +#define MB_OK 0 + +#define GPTR 64 + +/* for BITMAP */ +#define BI_RGB 0 +#define BI_RLE8 1 +#define BI_RLE4 2 +#define BI_BITFIELDS 3 + +/* for dosio.c */ +#define GENERIC_READ 1 +#define GENERIC_WRITE 2 + +#define OPEN_EXISTING 1 +#define CREATE_ALWAYS 2 +#define CREATE_NEW 3 + +#define FILE_SHARE_READ 0x00000001 +#define FILE_SHARE_WRITE 0x00000002 +#define FILE_SHARE_DELETE 0x00000004 + +#define FILE_ATTRIBUTE_READONLY 0x01 +#define FILE_ATTRIBUTE_HIDDEN 0x02 +#define FILE_ATTRIBUTE_SYSTEM 0x04 +#define FILE_ATTRIBUTE_VOLUME 0x08 +#define FILE_ATTRIBUTE_DIRECTORY 0x10 +#define FILE_ATTRIBUTE_ARCHIVE 0x20 +#define FILE_ATTRIBUTE_NORMAL 0x40 + +#define INVALID_HANDLE_VALUE (HANDLE)-1 + +#define NO_ERROR 0 +#define ERROR_FILE_NOT_FOUND 2 +#define ERROR_SHARING_VIOLATION 32 + +#define FILE_BEGIN 0 +#define FILE_CURRENT 1 +#define FILE_END 2 + + +/* + * replace + */ +#define wsprintf sprintf +#define ZeroMemory(d,n) memset(d,0,n) +#define CopyMemory(d,s,n) memcpy(d,s,n) +#define timeGetTime() GetTickCount() + +/* + * WIN32 structure + */ +typedef struct { + WORD bfType; + DWORD bfSize; + WORD bfReserved1; + WORD bfReserved2; + DWORD bfOffBits; +} __attribute__ ((packed)) BITMAPFILEHEADER; + +typedef struct { + DWORD biSize; + LONG biWidth; + LONG biHeight; + WORD biPlanes; + WORD biBitCount; + DWORD biCompression; + DWORD biSizeImage; + LONG biXPelsPerMeter; + LONG biYPelsPerMeter; + DWORD biClrUsed; + DWORD biClrImportant; +} __attribute__ ((packed)) BITMAPINFOHEADER; + +typedef struct { + BYTE rgbBlue; + BYTE rgbGreen; + BYTE rgbRed; + BYTE rgbReserved; +} __attribute__ ((packed)) RGBQUAD; + +typedef struct { + BITMAPINFOHEADER bmiHeader; + RGBQUAD bmiColors[1]; +} __attribute__ ((packed)) BITMAPINFO; + +typedef struct { + DWORD top; + DWORD left; + DWORD bottom; + DWORD right; +} RECT; + +typedef struct { + WORD x; + WORD y; +} POINT; + +/* + * prototype + */ +#ifdef __cplusplus +extern "C" { +#endif +int WINAPI MessageBox(HWND, LPCSTR, LPCSTR, UINT); +void WINAPI PostQuitMessage(int); +BOOL WINAPI WritePrivateProfileString(LPCSTR, LPCSTR, LPCSTR, LPCSTR); + +DWORD WINAPI GetLastError(VOID); +BOOL WINAPI SetEndOfFile(HANDLE hFile); +#ifdef __cplusplus +}; +#endif + +#include "peace.h" + +#endif /* __NP2_WIN32EMUL_H__ */ diff --git a/x11/about.c b/x11/about.c new file mode 100644 index 0000000..809aa1c --- /dev/null +++ b/x11/about.c @@ -0,0 +1,152 @@ +/* $Id: about.c,v 1.4 2008/11/08 02:24:18 nonaka Exp $ */ + +/* + * Copyright (c) 2003 NONAKA Kimihiro + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "windows.h" + +#include "winx68k.h" +#include "about.h" +#include "version.h" + +#include "../icons/adpcm.xpm" +#include "../icons/keropi_icon.xpm" +#include "../icons/motorola.xpm" +#include "../icons/nekolgc.xpm" +#include "../icons/opm.xpm" + +static void +dialog_destroy(GtkWidget *w, GtkWidget **wp) +{ + + UNUSED(wp); + gtk_widget_destroy(w); +} + +static GtkWidget * +create_pixmap_from_xpm_d(GtkWidget *w, char **xpm) +{ + GdkColormap *colormap; + GdkPixmap *pixmap; + GdkBitmap *mask; + GtkWidget *newpixmap; + + colormap = gtk_widget_get_colormap(w); + pixmap = gdk_pixmap_colormap_create_from_xpm_d(NULL, colormap, + &mask, NULL, xpm); + newpixmap = gtk_pixmap_new(pixmap, mask); + gdk_pixmap_unref(pixmap); + gdk_bitmap_unref(mask); + + gtk_widget_ref(newpixmap); + gtk_object_set_data_full(GTK_OBJECT(w), "pixmap", + newpixmap, (GtkDestroyNotify)gtk_widget_unref); + + return newpixmap; +} + +void +create_about_dialog(void) +{ + GtkWidget *dialog; + GtkWidget *table; + GtkWidget *button; + GtkWidget *frame; + GtkWidget *frame_table; + GtkWidget *label; + GtkWidget *adpcm_pixmap; + GtkWidget *keropi_pixmap; + GtkWidget *motorola_pixmap; + GtkWidget *nekolgc_pixmap; + GtkWidget *opm_pixmap; + + dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_title(GTK_WINDOW(dialog), "About Keropi"); + gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); + gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); +#if GTK_MAJOR_VERSION > 1 + gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); +#endif + gtk_signal_connect(GTK_OBJECT(dialog), "destroy", + GTK_SIGNAL_FUNC(dialog_destroy), NULL); + + table = gtk_table_new(6, 2, FALSE); + gtk_container_add(GTK_CONTAINER(dialog), table); + + button = gtk_button_new_with_label("OK"); + gtk_table_attach(GTK_TABLE(table), button, 4, 5, 1, 2, + GTK_FILL|GTK_EXPAND, 0, 0, 0); + gtk_signal_connect_object(GTK_OBJECT(button), "clicked", + GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(dialog)); + GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT); + GTK_WIDGET_SET_FLAGS(button, GTK_HAS_DEFAULT); + gtk_widget_grab_default(button); + gtk_widget_show(button); + + motorola_pixmap = create_pixmap_from_xpm_d(dialog, motorola); + gtk_table_attach_defaults(GTK_TABLE(table),motorola_pixmap, 0, 1, 1, 2); + gtk_widget_show(motorola_pixmap); + + adpcm_pixmap = create_pixmap_from_xpm_d(dialog, adpcm); + gtk_table_attach_defaults(GTK_TABLE(table), adpcm_pixmap, 1, 2, 1, 2); + gtk_widget_show(adpcm_pixmap); + + opm_pixmap = create_pixmap_from_xpm_d(dialog, opm); + gtk_table_attach_defaults(GTK_TABLE(table), opm_pixmap, 2, 3, 1, 2); + gtk_widget_show(opm_pixmap); + + nekolgc_pixmap = create_pixmap_from_xpm_d(dialog, nekolgc); + gtk_table_attach_defaults(GTK_TABLE(table), nekolgc_pixmap, 3, 4, 1, 2); + gtk_widget_show(nekolgc_pixmap); + + frame = gtk_frame_new(NULL); + gtk_container_set_border_width(GTK_CONTAINER(frame), 5); + gtk_table_attach_defaults(GTK_TABLE(table), frame, 0, 6, 0, 1); + gtk_widget_show(frame); + + frame_table = gtk_table_new(2, 1, FALSE); + gtk_container_add(GTK_CONTAINER(frame), frame_table); + gtk_widget_show(frame_table); + + keropi_pixmap = create_pixmap_from_xpm_d(dialog, keropi_icon); + gtk_misc_set_padding(GTK_MISC(keropi_pixmap), 5, 0); + gtk_table_attach_defaults(GTK_TABLE(frame_table), + keropi_pixmap, 0, 1, 0, 1); + gtk_widget_show(keropi_pixmap); + + label = gtk_label_new("Keropi for X - " SOURCE_VERSION "\n" + "Modified by NONAKA Kimihiro\n" + "\nKeropi (WinX68k)\n" + "SHARP X680x0 series emulator\n" + "Version " APP_VER_STRING "\n" + "Copyright (C) 2000-02 Kenjo\n" + "\nUsing \"FM Sound Generator\" (C) cisc"); + gtk_misc_set_padding(GTK_MISC(label), 5, 0); + gtk_table_attach_defaults(GTK_TABLE(frame_table), label, 1, 2, 0, 1); + gtk_widget_show(label); + + gtk_widget_show(table); + gtk_widget_show(dialog); +} diff --git a/x11/about.h b/x11/about.h new file mode 100644 index 0000000..23f6291 --- /dev/null +++ b/x11/about.h @@ -0,0 +1,33 @@ +/* $Id: about.h,v 1.2 2008/11/08 01:42:42 nonaka Exp $ */ + +/* + * Copyright (c) 2003 NONAKA Kimihiro + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef about_h__ +#define about_h__ + +void create_about_dialog(void); + +#endif /* about_h__ */ diff --git a/x11/cdaspi.h b/x11/cdaspi.h new file mode 100644 index 0000000..954ce54 --- /dev/null +++ b/x11/cdaspi.h @@ -0,0 +1,24 @@ +#ifndef CDASPI_H_ +#define CDASPI_H_ + +int CDASPI_Open(void); +void CDASPI_Close(void); +int CDASPI_Wait(void); +int CDASPI_ReadTOC(void* buf); +int CDASPI_Read(long block, BYTE* buf); +int CDASPI_ExecCmd(BYTE *cdb, int cdb_size, BYTE *out_buff, int out_size); +int CDASPI_IsOpen(void); + +void CDASPI_EnumCD(void); + +void CDASPI_Init(void); +void CDASPI_Cleanup(void); + +extern BYTE CDASPI_CDName[8][4]; +extern int CDASPI_CDNum; + +extern HINSTANCE ASPIDLL; +DWORD (*pSendASPI32Command)(LPSRB); +DWORD (*pGetASPI32SupportInfo)(VOID); + +#endif // CDASPI_H_ diff --git a/x11/cdctrl.h b/x11/cdctrl.h new file mode 100644 index 0000000..8b86e94 --- /dev/null +++ b/x11/cdctrl.h @@ -0,0 +1,11 @@ +#ifndef CDCTRL_H_ +#define CDCTRL_H_ + +int CDCTRL_Open(void); +void CDCTRL_Close(void); +int CDCTRL_Wait(void); +int CDCTRL_ReadTOC(void* buf); +int CDCTRL_Read(long block, BYTE* buf); +int CDCTRL_IsOpen(void); + +#endif // CDCTRL_H_ diff --git a/x11/cdrom.h b/x11/cdrom.h new file mode 100644 index 0000000..da5db52 --- /dev/null +++ b/x11/cdrom.h @@ -0,0 +1,29 @@ +#ifndef _winx68k_cdrom +#define _winx68k_cdrom + +#include "common.h" + +typedef struct { + unsigned char reserved; + unsigned char adr; + unsigned char trackno; + unsigned char reserved1; + unsigned char addr[4]; +} TOCENTRY; + +typedef struct { + unsigned char size[2]; + unsigned char first; + unsigned char last; + TOCENTRY track[100]; +} TOC; + +void CDROM_Init(void); +void CDROM_Cleanup(void); +BYTE FASTCALL CDROM_Read(DWORD adr); +void FASTCALL CDROM_Write(DWORD adr, BYTE data); + +extern BYTE CDROM_ASPIChecked; + +#endif + diff --git a/x11/cmdline.h b/x11/cmdline.h new file mode 100644 index 0000000..98afa28 --- /dev/null +++ b/x11/cmdline.h @@ -0,0 +1,9 @@ +#ifndef keropi_cmdline_h +#define keropi_cmdline_h + +extern char macrofile[MAX_PATH]; + +void CheckCmdLine(LPSTR s); +void SetCmdLineFD(void); + +#endif //keropi_cmdline_h diff --git a/x11/common.c b/x11/common.c new file mode 100644 index 0000000..042700e --- /dev/null +++ b/x11/common.c @@ -0,0 +1,21 @@ +// --------------------------------------------------------------------------------------- +// COMMON - 標準ヘッダ群(COMMON.H)とエラーダイアログ表示とか +// --------------------------------------------------------------------------------------- +#include +#include + +#include "sstp.h" + +extern HWND hWndMain; +extern const BYTE PrgTitle[]; + +void Error(const char* s) +{ + char title[80]; + sprintf(title, "%s エラー\0", PrgTitle); + + SSTP_SendMes(SSTPMES_ERROR); + + MessageBox(hWndMain, s, title, MB_ICONERROR | MB_OK); +} + diff --git a/x11/common.h b/x11/common.h new file mode 100644 index 0000000..740f442 --- /dev/null +++ b/x11/common.h @@ -0,0 +1,43 @@ +#ifndef winx68k_common_h +#define winx68k_common_h + +#include "windows.h" +#include +#include + +#define TRUE 1 +#define FALSE 0 +#define SUCCESS 0 +#define FAILURE 1 + +#define FASTCALL +#define STDCALL +#define LABEL +#define __stdcall + +typedef unsigned char UINT8; +typedef unsigned short UINT16; +typedef unsigned int UINT32; +typedef signed char INT8; +typedef signed short INT16; +typedef signed int INT32; + +typedef union { + struct { + BYTE l; + BYTE h; + } b; + WORD w; +} PAIR; + +#ifdef __cplusplus +extern "C" { +#endif + +void Error(const char* s); + +#ifdef __cplusplus +} +#endif + +#endif //winx68k_common_h diff --git a/x11/dswin.c b/x11/dswin.c new file mode 100644 index 0000000..87aa038 --- /dev/null +++ b/x11/dswin.c @@ -0,0 +1,317 @@ +/* $Id: dswin.c,v 1.3 2010/11/07 14:22:50 nonaka Exp $ */ + +/* + * Copyright (c) 2003 NONAKA Kimihiro + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "windows.h" +#include "common.h" +#include "dswin.h" +#include "prop.h" +#include "adpcm.h" +#include "mercury.h" +#include "fmg_wrap.h" + + short playing = FALSE; + + BYTE pcmbuffer[2*2*48000]; + BYTE *pcmbufp = pcmbuffer; + DWORD pcmfreemax = 22050; + DWORD pcmfree = 22050; + DWORD ds_halfbuffer = 22050 * 4; + DWORD ratebase1000 = 22; + DWORD ratebase = 22050; + long DSound_PreCounter = 0; + +#ifndef NAUDIOBUFFER +#define NAUDIOBUFFER 3 +#endif + + int audio_fd = -1; + int audio_nextbuf; + char *audio_event; + char *audio_buffer[NAUDIOBUFFER]; + +// ???????????? +DWORD calc_blocksize(DWORD size); +static void sdlaudio_callback(void *userdata, unsigned char *stream, int len); +static BOOL buffer_init(DWORD rate, DWORD samples); +static void buffer_cleanup(void); + +// --------------------------------------------------------------------------- +// ?????? +// --------------------------------------------------------------------------- +#ifndef NOSOUND +#include "SDL.h" +#include "SDL_audio.h" + +int +DSound_Init(unsigned long rate, unsigned long buflen) +{ + SDL_AudioSpec fmt; + DWORD samples; + int rv; + + // ?????????????? + if (playing) { + return FALSE; + } + + // ???????????? + if (rate == 0) { + audio_fd = -1; + return TRUE; + } + + // pcmfreemax = Dsound?????????????????????????? + pcmfree = pcmfreemax = (DWORD)rate * buflen / 200 / 2; + ds_halfbuffer = pcmfreemax * 4; + pcmbufp = pcmbuffer; + ratebase1000 = rate / 1000; + ratebase = rate; + + samples = calc_blocksize(pcmfreemax); + audio_nextbuf = 0; + audio_event = 0; + + // ?????? + rv = SDL_Init(SDL_INIT_AUDIO); + if (rv < 0) { + audio_fd = -1; + return FALSE; + } + + // ?????????????????????????????? + bzero(&fmt, sizeof(fmt)); + fmt.freq = rate; + fmt.format = AUDIO_S16SYS; + fmt.channels = 2; + fmt.samples = samples; + fmt.callback = sdlaudio_callback; + fmt.userdata = (void *)ds_halfbuffer; + audio_fd = SDL_OpenAudio(&fmt, NULL); + if (audio_fd < 0) { + SDL_Quit(); + return FALSE; + } + buffer_init(rate, samples); + + playing = TRUE; + return TRUE; +} + + +void +DSound_Play(void) +{ + + if (audio_fd >= 0) + SDL_PauseAudio(0); +} + +void +DSound_Stop(void) +{ + + if (audio_fd >= 0) + SDL_PauseAudio(1); +} + + +// --------------------------------------------------------------------------- +// ???????? +// --------------------------------------------------------------------------- + +int +DSound_Cleanup(void) +{ + + playing = FALSE; + if (audio_fd >= 0) { + SDL_CloseAudio(); + SDL_Quit(); + buffer_cleanup(); + audio_fd = -1; + } + return TRUE; +} + + +// --------------------------------------------------------------------------- +// ?????????????? +// --------------------------------------------------------------------------- + +void FASTCALL +DSound_Send0(long clock) +{ + int length = 0; + + if (audio_fd >= 0) { + DSound_PreCounter += (ratebase * clock); + while (DSound_PreCounter >= 10000000L) { + length++; + DSound_PreCounter -= 10000000L; + } + if (length) { + if ((long)pcmfree > (long)length) { + ADPCM_Update((short *)pcmbufp, length); + OPM_Update((short *)pcmbufp, length); +#ifndef NO_MERCURY + Mcry_Update((short *)pcmbufp, length); +#endif + pcmbufp += length * sizeof(WORD) * 2; + pcmfree -= length; + } else { + ADPCM_Update((short *)pcmbufp, pcmfree); + OPM_Update((short *)pcmbufp, pcmfree); +#ifndef NO_MERCURY + Mcry_Update((short *)pcmbufp, pcmfree); +#endif + pcmbufp += pcmfree * sizeof(WORD) * 2; + pcmfree = 0; + } + } + } +} + + +void FASTCALL +DSound_Send(void) +{ + short *q; + + if (audio_fd >= 0) { + if (audio_event) { + q = (short *)audio_event; + audio_event = 0; + + ADPCM_Update((short *)pcmbufp, pcmfree); + OPM_Update((short *)pcmbufp, pcmfree); +#ifndef NO_MERCURY + Mcry_Update((short *)pcmbufp, pcmfree); +#endif + + memcpy(q, pcmbuffer, ds_halfbuffer); + + // ???????? + pcmbufp = pcmbuffer; + pcmfree = pcmfreemax; + } + } +} + +static void +sdlaudio_callback(void *userdata, unsigned char *stream, int len) +{ + + if (audio_event != NULL) + bzero(audio_event, (DWORD)userdata); + + SDL_MixAudio(stream, audio_buffer[audio_nextbuf], len, + SDL_MIX_MAXVOLUME); + + audio_nextbuf = (audio_nextbuf + 1) % NAUDIOBUFFER; + audio_event = audio_buffer[audio_nextbuf]; +} + +// --------------------------------------------------------------------------- +// ?????? +// --------------------------------------------------------------------------- + +DWORD +calc_blocksize(DWORD size) +{ + DWORD s = size; + + if (size & (size - 1)) + for (s = 32; s < size; s <<= 1) + continue; + return s; +} + +static BOOL +buffer_init(DWORD rate, DWORD samples) +{ + int i; + + UNUSED(rate); + + for (i = 0; i < NAUDIOBUFFER; i++) { + audio_buffer[i] = (char *)calloc(samples * 4, 1); + if (audio_buffer[i] == NULL) { + fprintf(stderr, "buffer_init: can't alloc memory\n"); + return FAILURE; + } + } + + return SUCCESS; +} + +static void +buffer_cleanup(void) +{ + int i; + + for (i = 0; i < NAUDIOBUFFER; i++) { + if (audio_buffer[i]) { + free(audio_buffer[i]); + audio_buffer[i] = 0; + } + } +} +#else /* NOSOUND */ +int +DSound_Init(unsigned long rate, unsigned long buflen) +{ + + return FALSE; +} + +void +DSound_Play(void) +{ +} + +void +DSound_Stop(void) +{ +} + +int +DSound_Cleanup(void) +{ + + return TRUE; +} + +void FASTCALL +DSound_Send0(long clock) +{ +} + +void FASTCALL +DSound_Send(void) +{ +} +#endif /* !NOSOUND */ diff --git a/x11/dswin.h b/x11/dswin.h new file mode 100644 index 0000000..0664889 --- /dev/null +++ b/x11/dswin.h @@ -0,0 +1,22 @@ +/* $Id: dswin.h,v 1.1.1.1 2003/04/28 18:06:56 nonaka Exp $ */ + +#ifndef dswin_h__ +#define dswin_h__ + +#include "common.h" + +int DSound_Init(unsigned long rate, unsigned long length); +int DSound_Cleanup(void); + +void DSound_Play(void); +void DSound_Stop(void); +void FASTCALL DSound_Send0(long clock); +void FASTCALL DSound_Send(void); + +void DS_SetVolumeOPM(long vol); +void DS_SetVolumeADPCM(long vol); +void DS_SetVolumeMercury(long vol); + +extern DWORD ratebase1000; + +#endif /* dswin_h__ */ diff --git a/x11/fileio.h b/x11/fileio.h new file mode 100644 index 0000000..ea91f37 --- /dev/null +++ b/x11/fileio.h @@ -0,0 +1,40 @@ +#ifndef winx68k_fileio_h +#define winx68k_fileio_h + +#include "common.h" +#include "dosio.h" + +#define FILEH HANDLE + +#define FSEEK_SET 0 +#define FSEEK_CUR 1 +#define FSEEK_END 2 + +LPSTR getFileName(LPSTR filename); +//#define getFileName GetFileName + +FILEH File_Open(BYTE *filename); +FILEH File_Create(BYTE *filename); +DWORD File_Seek(FILEH handle, long pointer, short mode); +DWORD File_Read(FILEH handle, void *data, DWORD length); +DWORD File_Write(FILEH handle, void *data, DWORD length); +short File_Close(FILEH handle); +short File_Attr(BYTE *filename); +#define File_Open file_open +#define File_Create file_create +#define File_Seek file_seek +#define File_Read file_lread +#define File_Write file_lwrite +#define File_Close file_close +#define File_Attr file_attr + +void File_SetCurDir(BYTE *exename); +FILEH File_OpenCurDir(BYTE *filename); +FILEH File_CreateCurDir(BYTE *filename); +short File_AttrCurDir(BYTE *filename); +#define File_SetCurDir file_setcd +#define File_OpenCurDir file_open_c +#define File_CreateCurDir file_create_c +#define File_AttrCurDir file_attr_c + +#endif diff --git a/x11/haveunit.asm b/x11/haveunit.asm new file mode 100644 index 0000000..2fd5cbb --- /dev/null +++ b/x11/haveunit.asm @@ -0,0 +1,269 @@ + +; for new GOGO-no-coda (1999/09) +; Copyright (C) 1999 shigeo +; modified by Keiichi SAKAI, URURI, Hash + +; 99/07/29 +; 99/09/06 フラグ追加 +; 99/09/07 SSEの処理を別にする +; 99/09/29 Cx586対策 +; 99/11/10 Cxrix対策 + +; int haveUNIT(void); + +; 486未満のCPUまたはFPUを搭載していなければ0 +; それ以外は次の値の論理和 +; PIIIでは丸め誤差を四捨五入モードにする(らしい) + +; haveunit.hとの整合性注意 + +%include "x11/nasm.h" + +tFPU equ (1<<0) +tMMX equ (1<<1) +t3DN equ (1<<2) +tSSE equ (1<<3) +tCMOV equ (1<<4) +tE3DN equ (1<<5) ;/* Athlon用 (extend 3D Now!)*/ +tEMMX equ (1<<6) ;/* EMMX=E3DNow!_INT=SSE_INT */ + +tSPC1 equ (1<<16) ;/* 特別なスイッチ */ +tSPC2 equ (1<<17) ;/* 用途は決まってない */ + +tINTEL equ (1<<8) +tAMD equ (1<<9) +tCYRIX equ (1<<10) +tIDT equ (1<<11) +tUNKNOWN equ (1<<15) ;ベンダーが分からない + +tFAMILY4 equ (1<<20) ;/* 486 この時ベンダー判定は当てにならない */ +tFAMILY5 equ (1<<21) ;/* 586 (P5, P5-MMX, K6, K6-2, K6-III) */ +tFAMILY6 equ (1<<22) ;/* 686以降 P-Pro, P-II, P-III, Athlon */ + + globaldef _haveUNIT + globaldef setPIII_round + globaldef maskFPU_exception + + segment_data + segment_code + +ACflag equ (1<<18) +IDflag equ (1<<21) + + align 16 +haveUNIT: + push ebx + push esi + xor esi,esi + call near haveFPU + jnz near .Lexit + or esi,tFPU + pushfd ;flag保存 + pushfd + pop eax ;eax=flag + or eax,ACflag ;eax=flag|ACflag + push eax + popfd ;flag=eax + pushfd + pop eax ;eax=flag + popfd ;flag復元 + test eax,ACflag ;ACflagは変化したか? + jz near .Lexit +;486以降 + pushfd ;flag保存 + pushfd + pop eax ;eax=flag + or eax,IDflag ;eax=flag|IDflag + push eax + popfd ;flag=eax + pushfd + pop eax ;eax=flag + popfd ;flag復元 + test eax,IDflag +; jz short .Lexit + jnz .L586 + +%if 1 + ;Cyrix 486CPU check Cyrix の HP にあったやつ by Hash + + xor ax, ax ; clear ax + sahf ; clear flags, bit 1 is always 1 in flags + mov ax, 5 + mov bx, 2 + div bl ; do an operation that does not change flags + lahf ; get flags + cmp ah, 2 ; check for change in flags + jne .L486intel ; flags changed not Cyrix + or esi,tCYRIX ; TRUE Cyrix CPU + jmp .L486 + +.L486intel: + or esi,tINTEL +.L486: + or esi,tFAMILY4 + jmp .Lexit + +%else + ; check for Cyrix 486DLC -- based on check routine + ; documented in "Cx486SLC/e SMM Programmer's Guide" + xor dx,dx + cmp dx,dx + pushf + pop cx + mov ax,0FFFFh + mov bx,4 + div bx + pushf + pop ax + and ax,8D5h + and cx,8D5h + cmp ax,cx + jnz .L486intel + or esi,tCYRIX + jmp .L486 +.L486intel: + or esi,tINTEL +.L486: + or esi,tFAMILY4 + jmp .Lexit +%endif + + +.L586: + +;cpuid は eax,ebx,ecx,edxを破壊するので注意!!! + + xor eax,eax + cpuid +; cmp ecx,"letn" + cmp ecx,"ntel" ;うわ〜NASMと反対に配置するんだ + jne .F00 + or esi,tINTEL + jmp .F09 +.F00: +; cmp ecx,"DMAc" + cmp ecx,"cAMD" + jne .F01 + or esi,tAMD + jmp .F09 +.F01: +; cmp ecx,"daet" + cmp ecx,"tead" + jne .F02 + or esi,tCYRIX + jmp .F09 +.F02: +; cmp ecx,"slua" + cmp ecx,"auls" + jne .F03 + or esi,tIDT + jmp .F09 +.F03: + or esi,tUNKNOWN + jmp .F09 +.F09: + mov eax,1 + cpuid + cmp ah,4 + jne .F10 + or esi,tFAMILY4 + jmp .Lexit +.F10: + cmp ah,5 + jne .F11 + or esi,tFAMILY5 + jmp .F19 +.F11: + cmp ah,6 + jne .F12 + or esi,tFAMILY6 + jmp .F19 +.F12: + or esi,tFAMILY6 ; 7以上は6と見なす +.F19: + + ;for AMD, IDT + mov eax,80000001h + cpuid + test edx,(1 << 31) + jz .F20 + or esi,t3DN +.F20: + test edx,(1 << 15) ;CMOVcc + jz .F21 +; test edx,(1 << 16) ;FCMOVcc ;K7から変更 by URURI +; jz .F21 + or esi,tCMOV +.F21: + test edx,(1 << 30) ;拡張 3D Now! + jz .F22 +%ifdef USE_E3DN + or esi,tE3DN +%endif +.F22: + test edx,(1 << 22) ;AMD MMX Ext + jz .F23 + or esi,tEMMX +.F23: + ;Intel系 + mov eax,1 + cpuid + test edx,(1 << 23) + jz .F30 + or esi,tMMX +.F30: + test edx,(1 << 15) ;CMOVcc and FCMOV if FPU=1 + jz .F31 + or esi,tCMOV +.F31: + test edx,(1 << 25) + jz short .Lexit + or esi,tEMMX +%ifndef UNAVAILABLE_SSE + or esi,tSSE +%endif +.Lexit: + mov eax,esi + pop esi + pop ebx + ret + +; in:none +; out:ZF FPUあり=1, なし=0 +; dest:eax + + align 16 +haveFPU: + mov al,1 + fninit + fnstsw ax + cmp al,0 + jne short .LhF_exit + sub esp,4 + fnstcw word [esp] + mov ax,[esp] + add esp,4 + and ax,103Fh + cmp ax,3Fh +.LhF_exit: + ret + +setPIII_round: + ;P-IIIのSSEを確実に四捨五入モードに +; mov eax,0x1f80 ; default mode + mov eax,0x9f80 ; flush to ZERO mode + push eax + ldmxcsr [esp] ; setup MXCSR + pop eax + ret + +; for Win32 Delphi +maskFPU_exception: + push eax + fnstcw word [esp] + and word [esp],0xFFF2 + fldcw word [esp] + pop eax + ret + + end diff --git a/x11/joystick.c b/x11/joystick.c new file mode 100644 index 0000000..0b6aac8 --- /dev/null +++ b/x11/joystick.c @@ -0,0 +1,332 @@ +// JOYSTICK.C - ジョイスティックサポート for WinX68k +// DInputの初期化/終了と、ジョイスティックポートチェック + +#include "common.h" +#include "prop.h" +#include "joystick.h" + +#if 0 +LPDIRECTINPUT dinput = NULL; +LPDIRECTINPUTDEVICE2 joy[2] = {NULL, NULL}; +#endif + +#ifndef MAX_BUTTON +#define MAX_BUTTON 32 +#endif + +char joyname[2][MAX_PATH]; +char joybtnname[2][MAX_BUTTON][MAX_PATH]; +BYTE joybtnnum[2] = {0, 0}; + +//static int joyactive = 0; +BYTE JoyKeyState = 0; +BYTE JoyKeyState0 = 0; +BYTE JoyKeyState1 = 0; +BYTE JoyState0[2] = {0xff, 0xff}; +BYTE JoyState1[2] = {0xff, 0xff}; +BYTE JoyPortData[2] = {0, 0}; + + +#if 0 +BOOL CALLBACK EnumButtonProc(LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOID pv) +{ + BYTE j = *(BYTE*)pv; + if (joybtnnum[j]tszName); + joybtnnum[j]++; + return DIENUM_CONTINUE; + } + else + return DIENUM_STOP; +} + + +BOOL CALLBACK JoyEnumProc(LPDIDEVICEINSTANCE pdidi, LPVOID pv) +{ + GUID *guid = NULL; + LPDIRECTINPUTDEVICE tmpdev = NULL; + + guid = (GUID *)pv; + *guid = pdidi->guidInstance; + + if (!joy[0]) + { + if ((IDirectInput_CreateDevice(dinput, guid, &tmpdev, NULL)) == DI_OK) + { + if ((IDirectInputDevice_QueryInterface(tmpdev, &IID_IDirectInputDevice2, &joy[0])) == DI_OK) + { + IDirectInputDevice_Release(tmpdev); + return DIENUM_CONTINUE; + } + else + { + joy[0] = NULL; + return DIENUM_CONTINUE; + } + } + else + { + joy[0] = NULL; + return DIENUM_CONTINUE; + } + } + if (!joy[1]) + { + if ((IDirectInput_CreateDevice(dinput, guid, &tmpdev, NULL)) == DI_OK) + { + if ((IDirectInputDevice_QueryInterface(tmpdev, &IID_IDirectInputDevice2, &joy[1])) == DI_OK) + { + IDirectInputDevice_Release(tmpdev); + return DIENUM_STOP; + } + else + { + joy[1] = NULL; + return DIENUM_CONTINUE; + } + } + else + { + joy[1] = NULL; + return DIENUM_CONTINUE; + } + } + return DIENUM_CONTINUE; +} +#endif + + +void Joystick_Init(void) +{ +#if 0 + BYTE jnum; + HRESULT hres; + GUID guid; + DIPROPRANGE diprg; + DIDEVICEINSTANCE dev; +#endif + + JoyKeyState0 = 0; + JoyKeyState1 = 0; + JoyState0[0] = 0xff; + JoyState0[1] = 0xff; + JoyState1[0] = 0xff; + JoyState1[1] = 0xff; + JoyPortData[0] = 0; + JoyPortData[1] = 0; + +#if 0 + if (FAILED(DirectInputCreate(hInst, DIRECTINPUT_VERSION, &dinput, NULL))) { + return; + } + + IDirectInput_EnumDevices(dinput, DIDEVTYPE_JOYSTICK, + (LPDIENUMDEVICESCALLBACK)JoyEnumProc, + &guid, DIEDFL_ATTACHEDONLY); + + if ((joy[0] != NULL) && (SUCCEEDED(IDirectInputDevice2_SetDataFormat(joy[0], &c_dfDIJoystick)))) + { + hres = IDirectInputDevice2_SetCooperativeLevel(joy[0], hWndMain, + DISCL_NONEXCLUSIVE | DISCL_FOREGROUND); + if (SUCCEEDED(hres)) { + ZeroMemory(&diprg, sizeof(diprg)); + diprg.diph.dwSize = sizeof(diprg); + diprg.diph.dwHeaderSize = sizeof(diprg.diph); + diprg.diph.dwObj = DIJOFS_X; + diprg.diph.dwHow = DIPH_BYOFFSET; + diprg.lMin = 0; + diprg.lMax = 255; + IDirectInputDevice2_SetProperty(joy[0], DIPROP_RANGE, &diprg.diph); + diprg.diph.dwObj = DIJOFS_Y; + IDirectInputDevice2_SetProperty(joy[0], DIPROP_RANGE, &diprg.diph); + IDirectInputDevice2_Acquire(joy[0]); + + ZeroMemory(&dev, sizeof(DIDEVICEINSTANCE)); + dev.dwSize = sizeof(DIDEVICEINSTANCE); + if (IDirectInputDevice2_GetDeviceInfo(joy[0], &dev) == DI_OK) + strcpy(joyname[0], dev.tszProductName); + else + strcpy(joyname[0], "不明なデバイス"); + + joybtnnum[0] = 0; + jnum = 0; + IDirectInputDevice_EnumObjects(joy[0], + (LPDIENUMDEVICEOBJECTSCALLBACK)EnumButtonProc, + &jnum, DIDFT_BUTTON); + } + } + if ((joy[1] != NULL) && (SUCCEEDED(IDirectInputDevice2_SetDataFormat(joy[1], &c_dfDIJoystick)))) + { + hres = IDirectInputDevice2_SetCooperativeLevel(joy[1], hWndMain, + DISCL_NONEXCLUSIVE | DISCL_FOREGROUND); + if (SUCCEEDED(hres)) { + ZeroMemory(&diprg, sizeof(diprg)); + diprg.diph.dwSize = sizeof(diprg); + diprg.diph.dwHeaderSize = sizeof(diprg.diph); + diprg.diph.dwObj = DIJOFS_X; + diprg.diph.dwHow = DIPH_BYOFFSET; + diprg.lMin = 0; + diprg.lMax = 255; + IDirectInputDevice2_SetProperty(joy[1], DIPROP_RANGE, &diprg.diph); + diprg.diph.dwObj = DIJOFS_Y; + IDirectInputDevice2_SetProperty(joy[1], DIPROP_RANGE, &diprg.diph); + IDirectInputDevice2_Acquire(joy[1]); + } + + ZeroMemory(&dev, sizeof(DIDEVICEINSTANCE)); + dev.dwSize = sizeof(DIDEVICEINSTANCE); + if (IDirectInputDevice2_GetDeviceInfo(joy[1], &dev) == DI_OK) + strcpy(joyname[1], dev.tszProductName); + else + strcpy(joyname[1], "不明なデバイス"); + + joybtnnum[1] = 0; + jnum = 1; + IDirectInputDevice_EnumObjects(joy[1], + (LPDIENUMDEVICEOBJECTSCALLBACK)EnumButtonProc, + &jnum, DIDFT_BUTTON); + } +#endif +} + +void Joystick_Cleanup(void) +{ +#if 0 + if (joy[0]) IDirectInputDevice2_Release(joy[0]); + if (joy[1]) IDirectInputDevice2_Release(joy[1]); + if (dinput) IDirectInput_Release(dinput); +#endif +} + + +void Joystick_Activate(UINT wParam) +{ +#if 1 + (void)wParam; +#else + if (wParam != WA_INACTIVE) + { + if (joy[0]) IDirectInputDevice2_Acquire(joy[0]); + if (joy[1]) IDirectInputDevice2_Acquire(joy[1]); + } + else + { + if (joy[0]) IDirectInputDevice2_Unacquire(joy[0]); + if (joy[1]) IDirectInputDevice2_Unacquire(joy[1]); + } +#endif +} + + +BYTE FASTCALL Joystick_Read(BYTE num) +{ + BYTE joynum = num; + BYTE ret0 = 0xff, ret1 = 0xff, ret; +#if 1 + (void)joynum; + (void)ret0; + (void)ret1; + ret = 0xff; +#else + if (Config.JoySwap) joynum ^= 1; + if (joy[num]) { + ret0 = JoyState0[num]; + ret1 = JoyState1[num]; + } + + if (Config.JoyKey) + { + if ((Config.JoyKeyJoy2)&&(num==1)) + ret0 ^= JoyKeyState; + else if ((!Config.JoyKeyJoy2)&&(num==0)) + ret0 ^= JoyKeyState; + } + + ret = ((~JoyPortData[num])&ret0)|(JoyPortData[num]&ret1); +//ret = ret0; +#endif + return ret; + +} + + +void FASTCALL Joystick_Write(BYTE num, BYTE data) +{ + if ( (num==0)||(num==1) ) JoyPortData[num] = data; +} + + +void FASTCALL Joystick_Update(void) +{ +#if 0 + BYTE ret0, ret1; + HRESULT hres; + DIJOYSTATE state; + int num; + + for (num=0; num<2; num++) + { + + ret0 = 0xff; + ret1 = 0xff; + + if (joy[num]) + { + hres = IDirectInputDevice2_Poll(joy[num]); + if (hres!=DI_OK) + { + if (hres == DIERR_INPUTLOST) { // ロストしてたらAquireしてみる(S.J.PAD2) + IDirectInputDevice2_Acquire(joy[num]); + hres = IDirectInputDevice2_Poll(joy[num]); + if (hres!=DI_OK) // それでもダメなら諦める + continue; + } + } + hres = IDirectInputDevice2_GetDeviceState(joy[num], sizeof(DIJOYSTATE), &state); + if (SUCCEEDED(hres)) + { + if (state.lX < 32) + ret0 ^= JOY_LEFT; + else if (state.lX >= 224) + ret0 ^= JOY_RIGHT; + + if (state.lY < 32) + ret0 ^= JOY_UP; + else if (state.lY >= 224) + ret0 ^= JOY_DOWN; + + if (Config.JOY_BTN[num][0] + +#define NC 0 + +BYTE KeyTable[512] = { + // , , , , , , , ; 0x00 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0x08 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0x10 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0x18 + NC, NC, NC, NC, NC, NC, NC, NC, + // SPC, ! , " , # , $ , % , & , ' ; 0x20 + 0x35,0x02,0x03,0x04,0x05,0x06,0x07,0x08, + // ( , ) , * , + , , , - , . , / ; 0x28 + 0x09,0x0a,0x28,0x27,0x31,0x0c,0x32,0x33, + // 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ; 0x30 + 0x0b,0x02,0x03,0x04,0x05,0x06,0x07,0x08, + // 8 , 9 , ; , : , < , = , > , ? ; 0x38 + 0x09,0x0a,0x28,0x27,0x31,0x0c,0x32,0x33, + // @ , A , B , C , D , E , F , G ; 0x40 + 0x1b,0x1e,0x2e,0x2c,0x20,0x13,0x21,0x22, + // H , I , J , K , L , M , N , O ; 0x48 + 0x23,0x18,0x24,0x25,0x26,0x30,0x2f,0x10, + // P , Q , R , S , T , U , V , W ; 0x50 + 0x1a,0x11,0x14,0x1f,0x15,0x17,0x2d,0x12, + // X , Y , Z , [ , \ , ] , ^ , _ ; 0x58 + 0x2b,0x16,0x2a,0x1c,0x0e,0x29,0x0d,0x34, + // ` , a , b , c , d , e , f , g ; 0x60 + 0x1b,0x1e,0x2e,0x2c,0x20,0x13,0x21,0x22, + // h , i , j , k , l , m , n , o ; 0x68 + 0x23,0x18,0x24,0x25,0x26,0x30,0x2f,0x19, + // p , q , r , s , t , u , v , w ; 0x70 + 0x1a,0x11,0x14,0x1f,0x15,0x17,0x2d,0x12, + // x , y , z , { , | , } , ~ , ; 0x78 + 0x2b,0x16,0x2a,0x1c,0x0e,0x29,0x0d, NC, + // , , , , , , , ; 0x80 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0x88 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0x90 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0x98 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0xa0 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0xa8 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0xb0 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0xb8 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0xc0 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0xc8 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0xd0 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0xd8 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0xe0 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0xe8 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0xf0 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0xf8 + NC, NC, NC, NC, NC, NC, NC, NC, + + // ;0x100 + + // , , , , , , , ; 0x00 + NC, NC, NC, NC, NC, NC, NC, NC, + // BS, TAB, LF, CLR, , RET, , ; 0x08 + 0x0f,0x10,0x1d, NC, NC,0x1d, NC, NC, + // , , ,PAUS,SCRL,SYSQ, , ; 0x10 + NC, NC, NC,0x61, NC, NC, NC, NC, + // , , , ESC, , , , ; 0x18 + NC, NC, NC,0x01, NC, NC, NC, NC, + // ,KANJ,MUHE,HENM,HENK,RONM,HIRA,KATA ; 0x20 + NC, NC,0x56, NC, NC, NC, NC, NC, + // HIKA,ZENK,HANK,ZNHN, ,KANA, , ; 0x28 + NC, NC, NC, NC, NC, NC, NC, NC, + // ALNU, , , , , , , ; 0x30 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , ,ZKOU,MKOU, ; 0x38 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0x40 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0x48 + NC, NC, NC, NC, NC, NC, NC, NC, + // HOME, ←, ↑, →, ↓,RLDN,RLUP, END ; 0x50 + 0x36,0x3b,0x3c,0x3d,0x3e,0x39,0x38,0x3a, + // , , , , , , , ; 0x58 + NC, NC, NC, NC, NC, NC, NC, NC, + // ,PRNT, INS, , , , , ; 0x60 + NC, NC,0x5e, NC, NC, NC, NC, NC, + // , , ,BREA, , , , ; 0x68 + NC, NC, NC,0x61, NC, NC, NC, NC, + // , , , , , , , ; 0x70 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0x78 + NC, NC, NC, NC, NC, NC, NC, NC, + // ,<↑> ; 0x90 + NC, NC, NC, NC, NC,0x36,0x3b,0x3c, + // <→>,<↓>,, <+>, <,>, <->, <.>, ; 0xa8 + NC, NC,0x41,0x46, NC,0x42,0x51,0x40, + // <0>, <1>, <2>, <3>, <4>, <5>, <6>, <7> ; 0xb0 + 0x4f,0x4b,0x4c,0x4d,0x47,0x48,0x49,0x43, + // <8>, <9>, , , , , f.1, f.2 ; 0xb8 + 0x44,0x45, NC, NC, NC, NC,0x63,0x64, + // f.3, f.4, f.5, f.6, f.7, f.8, f.9,f.10 ; 0xc0 + 0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c, + // f.11,f.12,f.13,f.14,f.15, , , ; 0xc8 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0xd0 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0xd8 + NC, NC, NC, NC, NC, NC, NC, NC, + // ,SFTL,SFTR,CTLL,CTLR,CAPS, ,METL ; 0xe0 + NC,0x70,0x70,0x71,0x71,0x5d, NC,0x55, + // METR,ALTL,ALTR, , , , , ; 0xe8 + 0x55,0x55,0x55, NC, NC, NC, NC, NC, + // , , , , , , , ; 0xf0 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , DEL ; 0xf8 + NC, NC, NC, NC, NC, NC, NC,0x37 +}; + +BYTE KeyTableMaster[512] = { + // , , , , , , , ; 0x00 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0x08 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0x10 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0x18 + NC, NC, NC, NC, NC, NC, NC, NC, + // SPC, ! , " , # , $ , % , & , ' ; 0x20 + 0x35,0x02,0x03,0x04,0x05,0x06,0x07,0x08, + // ( , ) , * , + , , , - , . , / ; 0x28 + 0x09,0x0a,0x28,0x27,0x31,0x0c,0x32,0x33, + // 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ; 0x30 + 0x0b,0x02,0x03,0x04,0x05,0x06,0x07,0x08, + // 8 , 9 , ; , : , < , = , > , ? ; 0x38 + 0x09,0x0a,0x28,0x27,0x31,0x0c,0x32,0x33, + // @ , A , B , C , D , E , F , G ; 0x40 + 0x1b,0x1e,0x2e,0x2c,0x20,0x13,0x21,0x22, + // H , I , J , K , L , M , N , O ; 0x48 + 0x23,0x18,0x24,0x25,0x26,0x30,0x2f,0x10, + // P , Q , R , S , T , U , V , W ; 0x50 + 0x1a,0x11,0x14,0x1f,0x15,0x17,0x2d,0x12, + // X , Y , Z , [ , \ , ] , ^ , _ ; 0x58 + 0x2b,0x16,0x2a,0x1c,0x0e,0x29,0x0d,0x34, + // ` , a , b , c , d , e , f , g ; 0x60 + 0x1b,0x1e,0x2e,0x2c,0x20,0x13,0x21,0x22, + // h , i , j , k , l , m , n , o ; 0x68 + 0x23,0x18,0x24,0x25,0x26,0x30,0x2f,0x19, + // p , q , r , s , t , u , v , w ; 0x70 + 0x1a,0x11,0x14,0x1f,0x15,0x17,0x2d,0x12, + // x , y , z , { , | , } , ~ , ; 0x78 + 0x2b,0x16,0x2a,0x1c,0x0e,0x29,0x0d, NC, + // , , , , , , , ; 0x80 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0x88 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0x90 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0x98 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0xa0 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0xa8 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0xb0 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0xb8 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0xc0 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0xc8 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0xd0 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0xd8 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0xe0 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0xe8 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0xf0 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0xf8 + NC, NC, NC, NC, NC, NC, NC, NC, + + // ;0x100 + + // , , , , , , , ; 0x00 + NC, NC, NC, NC, NC, NC, NC, NC, + // BS, TAB, LF, CLR, , RET, , ; 0x08 + 0x0f,0x10,0x1d, NC, NC,0x1d, NC, NC, + // , , ,PAUS,SCRL,SYSQ, , ; 0x10 + NC, NC, NC,0x61, NC, NC, NC, NC, + // , , , ESC, , , , ; 0x18 + NC, NC, NC,0x01, NC, NC, NC, NC, + // ,KANJ,MUHE,HENM,HENK,RONM,HIRA,KATA ; 0x20 + NC, NC,0x56, NC, NC, NC, NC, NC, + // HIKA,ZENK,HANK,ZNHN, ,KANA, , ; 0x28 + NC, NC, NC, NC, NC, NC, NC, NC, + // ALNU, , , , , , , ; 0x30 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , ,ZKOU,MKOU, ; 0x38 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0x40 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0x48 + NC, NC, NC, NC, NC, NC, NC, NC, + // HOME, ←, ↑, →, ↓,RLDN,RLUP, END ; 0x50 + 0x36, NC, NC, NC, NC,0x39,0x38,0x3a, + // , , , , , , , ; 0x58 + NC, NC, NC, NC, NC, NC, NC, NC, + // ,PRNT, INS, , , , , ; 0x60 + NC, NC,0x5e, NC, NC, NC, NC, NC, + // , , ,BREA, , , , ; 0x68 + NC, NC, NC,0x61, NC, NC, NC, NC, + // , , , , , , , ; 0x70 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0x78 + NC, NC, NC, NC, NC, NC, NC, NC, + // ,<↑> ; 0x90 + NC, NC, NC, NC, NC,0x36, NC, NC, + // <→>,<↓>,, <+>, <,>, <->, <.>, ; 0xa8 + NC, NC,0x41,0x46, NC,0x42, NC,0x40, + // <0>, <1>, <2>, <3>, <4>, <5>, <6>, <7> ; 0xb0 + 0x4f,0x4b,0x4c,0x4d,0x47,0x48,0x49,0x43, + // <8>, <9>, , , , , f.1, f.2 ; 0xb8 + 0x44,0x45, NC, NC, NC, NC,0x63,0x64, + // f.3, f.4, f.5, f.6, f.7, f.8, f.9,f.10 ; 0xc0 + 0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c, + // f.11,f.12,f.13,f.14,f.15, , , ; 0xc8 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0xd0 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , ; 0xd8 + NC, NC, NC, NC, NC, NC, NC, NC, + // ,SFTL,SFTR,CTLL,CTLR,CAPS, ,METL ; 0xe0 + NC,0x70,0x70,0x71,0x71,0x5d, NC,0x55, + // METR,ALTL,ALTR, , , , , ; 0xe8 + 0x55,0x55,0x55, NC, NC, NC, NC, NC, + // , , , , , , , ; 0xf0 + NC, NC, NC, NC, NC, NC, NC, NC, + // , , , , , , , DEL ; 0xf8 + NC, NC, NC, NC, NC, NC, NC,0x37 +}; + + +// ---------------------------------- +// WM_KEYDOWN〜 +// ---------------------------------- +void +Keyboard_KeyDown(DWORD wp) +{ + BYTE code; + BYTE newwp; + + if (wp & ~0xff) { + if (wp == GDK_VoidSymbol) + code = NC; + else if ((wp & 0xff00) == 0xff00) + code = KeyTable[(wp & 0xff) | 0x100]; + else + code = NC; + } else + code = KeyTable[wp & 0xff]; + + if (code != NC) { + newwp = ((KeyBufWP + 1) & (KeyBufSize - 1)); + if (newwp != KeyBufRP) { + KeyBuf[KeyBufWP] = code; + KeyBufWP = newwp; + } + } + + switch (wp) { + case GDK_Up: + if (!(JoyKeyState&JOY_DOWN)) + JoyKeyState |= JOY_UP; + break; + + case GDK_Down: + if (!(JoyKeyState&JOY_UP)) + JoyKeyState |= JOY_DOWN; + break; + + case GDK_Left: + if (!(JoyKeyState&JOY_RIGHT)) + JoyKeyState |= JOY_LEFT; + break; + + case GDK_Right: + if (!(JoyKeyState&JOY_LEFT)) + JoyKeyState |= JOY_RIGHT; + break; + + case GDK_Z: + case GDK_z: + if (Config.JoyKeyReverse) + JoyKeyState |= JOY_TRG2; + else + JoyKeyState |= JOY_TRG1; + break; + + case GDK_X: + case GDK_x: + if (Config.JoyKeyReverse) + JoyKeyState |= JOY_TRG1; + else + JoyKeyState |= JOY_TRG2; + break; + } +} + +// ---------------------------------- +// WM_KEYUP +// ---------------------------------- +void +Keyboard_KeyUp(DWORD wp) +{ + BYTE code; + BYTE newwp; + + if (wp & ~0xff) { + if (wp == GDK_VoidSymbol) + code = NC; + else if ((wp & 0xff00) == 0xff00) + code = KeyTable[(wp & 0xff) | 0x100]; + else + code = NC; + } else + code = KeyTable[wp & 0xff]; + + if (code != NC) { + newwp = ((KeyBufWP + 1) & (KeyBufSize - 1)); + if (newwp != KeyBufRP) { + KeyBuf[KeyBufWP] = code | 0x80; + KeyBufWP = newwp; + } + } + + switch(wp) { + case GDK_Up: + JoyKeyState &= ~JOY_UP; + break; + + case GDK_Down: + JoyKeyState &= ~JOY_DOWN; + break; + + case GDK_Left: + JoyKeyState &= ~JOY_LEFT; + break; + + case GDK_Right: + JoyKeyState &= ~JOY_RIGHT; + break; + + case GDK_Z: + case GDK_z: + if (Config.JoyKeyReverse) + JoyKeyState &= ~JOY_TRG2; + else + JoyKeyState &= ~JOY_TRG1; + break; + + case GDK_X: + case GDK_x: + if (Config.JoyKeyReverse) + JoyKeyState &= ~JOY_TRG1; + else + JoyKeyState &= ~JOY_TRG2; + break; + } +} + +// ---------------------------------- +// Key Check +// 1フレーム中に4回(2400bps/10bit/60fpsとすれば、だが)呼ばれて、MFPにデータを送る +// ---------------------------------- + +void +Keyboard_Int(void) +{ + if (KeyBufRP != KeyBufWP) { + if (!KeyIntFlag) { + LastKey = KeyBuf[KeyBufRP]; + KeyBufRP = ((KeyBufRP+1)&(KeyBufSize-1)); + KeyIntFlag = 1; + MFP_Int(3); + } + } else if (!KeyIntFlag) { + LastKey = 0; + } +} diff --git a/x11/keyboard.h b/x11/keyboard.h new file mode 100644 index 0000000..2707b90 --- /dev/null +++ b/x11/keyboard.h @@ -0,0 +1,20 @@ +#ifndef _winx68k_keyboard +#define _winx68k_keyboard + +#include "common.h" + +#define KeyBufSize 128 + +extern BYTE KeyBuf[KeyBufSize]; +extern BYTE KeyBufWP; +extern BYTE KeyBufRP; +extern BYTE KeyTable[512]; +extern BYTE KeyTableMaster[512]; +extern BYTE KeyEnable; +extern BYTE KeyIntFlag; + +void Keyboard_KeyDown(DWORD vkcode); +void Keyboard_KeyUp(DWORD vkcode); +void Keyboard_Int(void); + +#endif //_winx68k_keyboard diff --git a/x11/keyconf.c b/x11/keyconf.c new file mode 100644 index 0000000..bde024f --- /dev/null +++ b/x11/keyconf.c @@ -0,0 +1,68 @@ +// --------------------------------------------------------------------------------------- +// KEYCONF.C - KeyConfig 入力待ちダイアログ +// --------------------------------------------------------------------------------------- +#include "common.h" +#include "resource.h" +#include "keyconf.h" +#include "winx68k.h" + +HWND hWndKeyConf = NULL; +WORD KeyConf_CodeW = 0; +DWORD KeyConf_CodeL = 0; +char KeyConfMessage[255]; +int KeyConfFlag = 0; + + +LRESULT CALLBACK KeyConfProc(HWND hdlg, UINT msg, WPARAM wp, LPARAM lp) +{ + switch (msg) + { + case WM_INITDIALOG: +// if (!KeyConfFlag) SetFocus(hWndKeyConf); + KeyConfFlag = 1; + KeyConf_CodeW = 0; + KeyConf_CodeL = 0; +// SetDlgItemText(hdlg, IDC_KEYCONF_DLG, KeyConfMessage); +//ShowWindow(hdlg, SW_HIDE); + return 0; + + case WM_COMMAND: + if (IDCANCEL == LOWORD(wp)) + { + EndDialog(hdlg, TRUE); + break; + } + return TRUE; + + case WM_SYSCOMMAND: + return TRUE; + + case WM_ACTIVATE: + SetFocus(hWndKeyConf); + break; + +// case WM_CLOSE: +// EndDialog(hdlg, FALSE); +// return TRUE; + + case WM_KEYDOWN: + case WM_SYSKEYDOWN: + case WM_KEYUP: + case WM_SYSKEYUP: + if (wp==VK_F12) + { + EndDialog(hdlg, TRUE); + return TRUE; + } +// Error("Key Pressed."); + KeyConf_CodeW = wp; + KeyConf_CodeL = lp; + EndDialog(hdlg, TRUE); + return TRUE; + + default: +// SetFocus(hWndKeyConf); + return FALSE; + } + return FALSE; +} diff --git a/x11/keyconf.h b/x11/keyconf.h new file mode 100644 index 0000000..587b91e --- /dev/null +++ b/x11/keyconf.h @@ -0,0 +1,10 @@ +#ifndef _x68_keyconf +#define _x68_keyconf + +extern HWND hWndKeyConf; +extern WORD KeyConf_CodeW; +extern DWORD KeyConf_CodeL; +extern char KeyConfMessage[255]; +LRESULT CALLBACK KeyConfProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp); + +#endif // _x68_keyconf diff --git a/x11/mkcgrom.c b/x11/mkcgrom.c new file mode 100644 index 0000000..6e8a60e --- /dev/null +++ b/x11/mkcgrom.c @@ -0,0 +1,1102 @@ +// ----------------------------------------------------------------------- +// CGROM作成〜 ゆいさんに作ってもらったお +// ----------------------------------------------------------------------- +#include + +static char *str_x68k[14] = { + " !”#$%&’()*+,−./", + "0123456789;:<=>?", + "@ABCDEFGHIJKLMNO", + "PQRSTUVWXYZ[¥]^_", + "‘abcdefghijklmno", + "pqrstuvwxyz{|} ̄ ", + "      をぁぃぅぇぉゃゅょっ", + " あいうえおかきくけこさしすせそ", + " 。「」、・ヲァィゥェォャュョッ", + "ーアイウエオカキクケコサシスセソ", + "タチツテトナニヌネノハヒフヘホマ", + "ミムメモヤユヨラリルレロワン゛゜", + "たちつてとなにぬねのはひふへほま", + "みむめもやゆよらりるれろわん  "}; + +static int deltable[] = { + // del del del del del + 0x0f, 0x1a, 0x22, 0x2a, 0x31, 0x3c, 0x4b, 0x52, 0x5a, 0x5e, 0, + 0x01, 0x10, 0x1a, 0x21, 0x3b, 0x41, 0x5b, 0x5f, 0, + 0x54, 0x5f, 0, + 0x57, 0x5f, 0, + 0x19, 0x21, 0x39, 0x5f, 0, + 0x22, 0x31, 0x52, 0x5f, 0}; + +static BYTE x68c8[] = { + 0x60,0x80,0x60,0x12,0xF2,0x1E,0x12,0x12, + 0x60,0x80,0x60,0x12,0xF2,0x0C,0x12,0x12, + 0xF0,0x80,0xE0,0x92,0xF2,0x0C,0x12,0x12, + 0xF0,0x80,0xE0,0x8E,0xF4,0x04,0x04,0x04, + 0xF0,0x80,0xE0,0x8C,0xF2,0x12,0x16,0x0E, + 0x60,0x90,0x90,0xF2,0x94,0x18,0x14,0x12, + 0xE0,0x90,0xE0,0x90,0xF0,0x10,0x10,0x1E, + 0xE0,0x90,0xE0,0x9C,0xF0,0x0C,0x02,0x1C, + 0x90,0x90,0xF0,0x9E,0x94,0x04,0x04,0x04, + 0x80,0x80,0x80,0x9E,0xF0,0x1C,0x10,0x10, + 0x90,0x90,0x90,0x9E,0x64,0x04,0x04,0x04, + 0xF0,0x80,0xE0,0x9E,0x90,0x1C,0x10,0x10, + 0x70,0x80,0x80,0x9C,0x72,0x1E,0x14,0x12, + 0x60,0x80,0x60,0x1C,0xF2,0x12,0x12,0x0C, + 0x60,0x80,0x60,0x1E,0xE4,0x04,0x04,0x0E, + 0xE0,0x90,0x90,0x9E,0xF0,0x1C,0x10,0x1E, + 0xE0,0x90,0x90,0x92,0xE6,0x02,0x02,0x02, + 0xE0,0x90,0x90,0x94,0xEA,0x02,0x04,0x0E, + 0xE0,0x90,0x90,0x9E,0xE4,0x02,0x12,0x0C, + 0xE0,0x90,0x90,0x94,0xE4,0x14,0x1E,0x04, + 0x90,0xD0,0xB0,0x92,0x94,0x18,0x14,0x12, + 0x60,0x80,0x60,0x12,0xFA,0x16,0x12,0x12, + 0xF0,0x80,0xE0,0x9C,0xF2,0x1C,0x12,0x1C, + 0x70,0x80,0x80,0x92,0x7A,0x16,0x12,0x12, + 0xF0,0x80,0xE0,0x92,0xFE,0x12,0x12,0x12, + 0xF0,0x80,0xE0,0x8E,0xF0,0x10,0x10,0x0E, + 0x70,0x40,0x70,0x40,0x7E,0x10,0x10,0x0E, + 0x00,0x08,0x04,0x7E,0x04,0x08,0x00,0x00, + 0x00,0x10,0x20,0x7E,0x20,0x10,0x00,0x00, + 0x00,0x10,0x38,0x54,0x10,0x10,0x10,0x00, + 0x00,0x10,0x10,0x10,0x54,0x38,0x10,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x08,0x08,0x08,0x08,0x08,0x00,0x08,0x00, + 0x14,0x14,0x00,0x00,0x00,0x00,0x00,0x00, + 0x24,0x24,0x7E,0x24,0x24,0x7E,0x24,0x00, + 0x08,0x1C,0x28,0x1C,0x0A,0x1C,0x08,0x00, + 0x00,0x62,0x64,0x08,0x10,0x26,0x46,0x00, + 0x30,0x48,0x48,0x30,0x4A,0x44,0x3A,0x00, + 0x18,0x08,0x10,0x00,0x00,0x00,0x00,0x00, + 0x04,0x08,0x10,0x10,0x10,0x08,0x04,0x00, + 0x20,0x10,0x08,0x08,0x08,0x10,0x20,0x00, + 0x00,0x14,0x08,0x3E,0x08,0x14,0x00,0x00, + 0x00,0x08,0x08,0x3E,0x08,0x08,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x18,0x08,0x10, + 0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00, + 0x00,0x02,0x04,0x08,0x10,0x20,0x40,0x00, + 0x3C,0x42,0x46,0x5A,0x62,0x42,0x3C,0x00, + 0x08,0x18,0x08,0x08,0x08,0x08,0x1C,0x00, + 0x3C,0x42,0x02,0x0C,0x30,0x40,0x7E,0x00, + 0x7E,0x04,0x08,0x1C,0x02,0x42,0x3C,0x00, + 0x0C,0x14,0x24,0x44,0x7E,0x04,0x04,0x00, + 0x7E,0x40,0x7C,0x02,0x02,0x42,0x3C,0x00, + 0x20,0x20,0x20,0x3C,0x42,0x42,0x3C,0x00, + 0x7E,0x42,0x04,0x04,0x08,0x08,0x10,0x00, + 0x3C,0x42,0x42,0x3C,0x42,0x42,0x3C,0x00, + 0x3C,0x42,0x42,0x3C,0x04,0x04,0x04,0x00, + 0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x00, + 0x00,0x00,0x18,0x18,0x00,0x18,0x08,0x10, + 0x04,0x08,0x10,0x20,0x10,0x08,0x04,0x00, + 0x00,0x00,0x7E,0x00,0x7E,0x00,0x00,0x00, + 0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x00, + 0x3C,0x66,0x06,0x0C,0x10,0x00,0x10,0x00, + 0x1C,0x22,0x4A,0x56,0x4C,0x20,0x1E,0x00, + 0x18,0x24,0x24,0x42,0x7E,0x42,0x42,0x00, + 0x7C,0x42,0x42,0x7C,0x42,0x42,0x7C,0x00, + 0x1C,0x22,0x40,0x40,0x40,0x22,0x1C,0x00, + 0x78,0x44,0x42,0x42,0x42,0x44,0x78,0x00, + 0x7E,0x40,0x40,0x78,0x40,0x40,0x7E,0x00, + 0x7E,0x40,0x40,0x78,0x40,0x40,0x40,0x00, + 0x1C,0x22,0x40,0x4E,0x42,0x22,0x1E,0x00, + 0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x00, + 0x1C,0x08,0x08,0x08,0x08,0x08,0x1C,0x00, + 0x0E,0x04,0x04,0x04,0x04,0x44,0x38,0x00, + 0x42,0x44,0x48,0x70,0x48,0x44,0x42,0x00, + 0x40,0x40,0x40,0x40,0x40,0x40,0x7E,0x00, + 0x42,0x66,0x5A,0x5A,0x42,0x42,0x42,0x00, + 0x42,0x62,0x52,0x4A,0x46,0x42,0x42,0x00, + 0x3C,0x42,0x42,0x42,0x42,0x42,0x3C,0x00, + 0x7C,0x42,0x42,0x7C,0x40,0x40,0x40,0x00, + 0x3C,0x42,0x42,0x42,0x4A,0x44,0x3A,0x00, + 0x7C,0x42,0x42,0x7C,0x44,0x42,0x42,0x00, + 0x3C,0x42,0x20,0x18,0x04,0x42,0x3C,0x00, + 0x3E,0x08,0x08,0x08,0x08,0x08,0x08,0x00, + 0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00, + 0x42,0x42,0x42,0x24,0x24,0x18,0x18,0x00, + 0x42,0x42,0x42,0x5A,0x5A,0x66,0x42,0x00, + 0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x00, + 0x22,0x22,0x22,0x1C,0x08,0x08,0x08,0x00, + 0x7E,0x02,0x04,0x18,0x20,0x40,0x7E,0x00, + 0x1C,0x10,0x10,0x10,0x10,0x10,0x1C,0x00, + 0x22,0x22,0x14,0x3E,0x08,0x3E,0x08,0x00, + 0x38,0x08,0x08,0x08,0x08,0x08,0x38,0x00, + 0x08,0x14,0x22,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00, + 0x06,0x04,0x02,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x3C,0x02,0x3E,0x42,0x3E,0x00, + 0x40,0x40,0x5C,0x62,0x42,0x62,0x5C,0x00, + 0x00,0x00,0x3C,0x42,0x40,0x42,0x3C,0x00, + 0x02,0x02,0x3A,0x46,0x42,0x46,0x3A,0x00, + 0x00,0x00,0x3C,0x42,0x7E,0x40,0x3C,0x00, + 0x0E,0x10,0x10,0x7C,0x10,0x10,0x10,0x00, + 0x00,0x00,0x3A,0x46,0x46,0x3A,0x02,0x3C, + 0x40,0x40,0x5C,0x62,0x42,0x42,0x42,0x00, + 0x08,0x00,0x18,0x08,0x08,0x08,0x1C,0x00, + 0x04,0x00,0x0C,0x04,0x04,0x04,0x24,0x18, + 0x40,0x40,0x44,0x48,0x50,0x68,0x44,0x00, + 0x18,0x08,0x08,0x08,0x08,0x08,0x1C,0x00, + 0x00,0x00,0x76,0x49,0x49,0x49,0x49,0x00, + 0x00,0x00,0x5C,0x62,0x42,0x42,0x42,0x00, + 0x00,0x00,0x3C,0x42,0x42,0x42,0x3C,0x00, + 0x00,0x00,0x5C,0x62,0x62,0x5C,0x40,0x40, + 0x00,0x00,0x3A,0x46,0x46,0x3A,0x02,0x02, + 0x00,0x00,0x5C,0x62,0x40,0x40,0x40,0x00, + 0x00,0x00,0x3C,0x40,0x3C,0x02,0x7C,0x00, + 0x10,0x10,0x7C,0x10,0x10,0x10,0x0C,0x00, + 0x00,0x00,0x42,0x42,0x42,0x46,0x3A,0x00, + 0x00,0x00,0x42,0x42,0x42,0x24,0x18,0x00, + 0x00,0x00,0x41,0x49,0x49,0x49,0x36,0x00, + 0x00,0x00,0x42,0x24,0x18,0x24,0x42,0x00, + 0x00,0x00,0x42,0x42,0x42,0x3E,0x02,0x3C, + 0x00,0x00,0x7E,0x04,0x18,0x20,0x7E,0x00, + 0x0C,0x10,0x10,0x20,0x10,0x10,0x0C,0x00, + 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00, + 0x30,0x08,0x08,0x04,0x08,0x08,0x30,0x00, + 0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x00, + 0x60,0xDA,0x0C,0x00,0x00,0x00,0x00,0x00, + 0x10,0x10,0x10,0x00,0x10,0x10,0x10,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x10,0x7C,0x10,0x1C,0x28,0x20,0x1E,0x00, + 0x00,0x00,0x10,0x38,0x14,0x7E,0x34,0x00, + 0x00,0x00,0x00,0x44,0x42,0x52,0x20,0x00, + 0x00,0x00,0x18,0x00,0x3C,0x04,0x18,0x00, + 0x00,0x00,0x18,0x00,0x3C,0x08,0x34,0x00, + 0x00,0x00,0x12,0x7A,0x10,0x7C,0x74,0x00, + 0x00,0x00,0x04,0x28,0x7C,0x22,0x24,0x00, + 0x00,0x00,0x48,0x7C,0x4A,0x5C,0x08,0x00, + 0x00,0x00,0x08,0x0C,0x08,0x3C,0x3A,0x00, + 0x00,0x00,0x00,0x3C,0x02,0x02,0x0C,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x10,0x3C,0x10,0x3E,0x55,0x59,0x32,0x00, + 0x00,0x20,0x44,0x42,0x42,0x50,0x20,0x00, + 0x18,0x00,0x3C,0x02,0x02,0x04,0x18,0x00, + 0x18,0x00,0x3C,0x08,0x10,0x28,0x46,0x00, + 0x10,0x3A,0x12,0x3C,0x52,0x52,0x24,0x00, + 0x24,0x24,0x7A,0x26,0x24,0x24,0x4C,0x00, + 0x10,0x3C,0x10,0x7E,0x08,0x40,0x3C,0x00, + 0x0C,0x10,0x20,0x20,0x10,0x08,0x0C,0x00, + 0x04,0x5E,0x44,0x44,0x44,0x24,0x08,0x00, + 0x00,0x38,0x04,0x00,0x00,0x40,0x3C,0x00, + 0x10,0x3C,0x10,0x08,0x00,0x40,0x3C,0x00, + 0x20,0x20,0x20,0x20,0x20,0x24,0x18,0x00, + 0x04,0x7E,0x0C,0x14,0x1C,0x04,0x18,0x00, + 0x04,0x24,0x7E,0x24,0x2C,0x20,0x1C,0x00, + 0x48,0x10,0x26,0x78,0x20,0x20,0x1C,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x38,0x28,0x38,0x00, + 0x1C,0x10,0x10,0x10,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x08,0x08,0x08,0x38,0x00, + 0x00,0x00,0x00,0x00,0x20,0x10,0x08,0x00, + 0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00, + 0x00,0x3E,0x02,0x3E,0x02,0x04,0x18,0x00, + 0x00,0x00,0x3E,0x02,0x0C,0x08,0x10,0x00, + 0x00,0x00,0x04,0x08,0x18,0x28,0x08,0x00, + 0x00,0x00,0x08,0x3E,0x22,0x02,0x0C,0x00, + 0x00,0x00,0x00,0x3E,0x08,0x08,0x3E,0x00, + 0x00,0x00,0x04,0x3E,0x0C,0x14,0x24,0x00, + 0x00,0x00,0x10,0x3E,0x12,0x14,0x10,0x00, + 0x00,0x00,0x00,0x1C,0x04,0x04,0x3E,0x00, + 0x00,0x00,0x3C,0x04,0x3C,0x04,0x3C,0x00, + 0x00,0x00,0x00,0x2A,0x2A,0x02,0x0C,0x00, + 0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x00, + 0x00,0x7E,0x02,0x14,0x18,0x10,0x20,0x00, + 0x02,0x04,0x08,0x18,0x28,0x08,0x08,0x00, + 0x00,0x08,0x7E,0x42,0x02,0x04,0x18,0x00, + 0x00,0x3E,0x08,0x08,0x08,0x08,0x3E,0x00, + 0x00,0x08,0x7E,0x08,0x18,0x28,0x48,0x00, + 0x00,0x10,0x7E,0x12,0x12,0x22,0x24,0x00, + 0x00,0x08,0x3E,0x08,0x3E,0x08,0x08,0x00, + 0x00,0x1E,0x22,0x42,0x04,0x08,0x30,0x00, + 0x00,0x20,0x3E,0x48,0x08,0x08,0x10,0x00, + 0x00,0x7E,0x02,0x02,0x02,0x02,0x7E,0x00, + 0x00,0x24,0x7E,0x24,0x04,0x04,0x18,0x00, + 0x00,0x70,0x00,0x72,0x02,0x04,0x78,0x00, + 0x00,0x7E,0x02,0x04,0x08,0x14,0x62,0x00, + 0x00,0x20,0x7E,0x22,0x24,0x20,0x1E,0x00, + 0x00,0x22,0x22,0x12,0x02,0x04,0x18,0x00, + 0x00,0x1E,0x12,0x2A,0x06,0x04,0x18,0x00, + 0x00,0x3C,0x08,0x7E,0x08,0x08,0x10,0x00, + 0x00,0x52,0x52,0x52,0x02,0x04,0x18,0x00, + 0x00,0x3C,0x00,0x7E,0x08,0x08,0x10,0x00, + 0x00,0x10,0x10,0x18,0x14,0x10,0x10,0x00, + 0x00,0x08,0x7E,0x08,0x08,0x10,0x20,0x00, + 0x00,0x3C,0x00,0x00,0x00,0x00,0x7E,0x00, + 0x00,0x3E,0x02,0x14,0x08,0x14,0x20,0x00, + 0x00,0x08,0x3E,0x04,0x1C,0x2A,0x08,0x00, + 0x00,0x02,0x02,0x04,0x04,0x08,0x30,0x00, + 0x00,0x08,0x24,0x22,0x42,0x42,0x42,0x00, + 0x00,0x40,0x7E,0x40,0x40,0x40,0x3E,0x00, + 0x00,0x7E,0x02,0x02,0x04,0x08,0x30,0x00, + 0x00,0x00,0x10,0x28,0x44,0x02,0x00,0x00, + 0x00,0x08,0x3E,0x08,0x2A,0x2A,0x08,0x00, + 0x00,0x7E,0x02,0x04,0x28,0x10,0x08,0x00, + 0x00,0x3C,0x00,0x3C,0x00,0x7C,0x02,0x00, + 0x00,0x10,0x20,0x40,0x44,0x7C,0x02,0x00, + 0x00,0x02,0x02,0x14,0x08,0x14,0x20,0x00, + 0x00,0x7E,0x10,0x7E,0x10,0x10,0x1E,0x00, + 0x20,0x20,0x7E,0x22,0x24,0x20,0x20,0x00, + 0x00,0x38,0x08,0x08,0x08,0x08,0x7E,0x00, + 0x00,0x7E,0x02,0x7E,0x02,0x02,0x7E,0x00, + 0x00,0x3C,0x00,0x7E,0x02,0x04,0x38,0x00, + 0x00,0x22,0x22,0x22,0x02,0x04,0x18,0x00, + 0x00,0x28,0x28,0x28,0x2A,0x2A,0x4C,0x00, + 0x00,0x20,0x20,0x22,0x24,0x28,0x30,0x00, + 0x00,0x3E,0x22,0x22,0x22,0x22,0x3E,0x00, + 0x00,0x7E,0x42,0x42,0x02,0x04,0x18,0x00, + 0x00,0x70,0x02,0x02,0x04,0x08,0x70,0x00, + 0x10,0x48,0x20,0x00,0x00,0x00,0x00,0x00, + 0x70,0x50,0x70,0x00,0x00,0x00,0x00,0x00, + 0x20,0x7E,0x20,0x2E,0x20,0x48,0x46,0x00, + 0x10,0x3C,0x10,0x3C,0x42,0x02,0x1C,0x00, + 0x00,0x7C,0x02,0x02,0x02,0x04,0x18,0x00, + 0x00,0x7E,0x04,0x08,0x10,0x10,0x0E,0x00, + 0x10,0x10,0x16,0x38,0x40,0x40,0x3E,0x00, + 0x10,0x7A,0x22,0x48,0x08,0x3C,0x3A,0x00, + 0x20,0x4E,0x40,0x40,0x40,0x50,0x4E,0x00, + 0x04,0x04,0x5C,0x2A,0x52,0x56,0x26,0x00, + 0x20,0x20,0x6C,0x32,0x22,0x66,0x66,0x00, + 0x00,0x1C,0x2A,0x4A,0x52,0x52,0x24,0x00, + 0x04,0x5E,0x44,0x44,0x44,0x5E,0x5C,0x00, + 0x00,0x76,0x22,0x44,0x44,0x44,0x38,0x00, + 0x00,0x10,0x20,0x10,0x4A,0x4A,0x10,0x00, + 0x00,0x10,0x28,0x44,0x06,0x02,0x00,0x00, + 0x00,0x44,0x5E,0x44,0x44,0x5E,0x5C,0x00, + 0x08,0x7E,0x08,0x3E,0x08,0x7E,0x7A,0x00, + 0x70,0x14,0x14,0x3E,0x54,0x54,0x20,0x00, + 0x20,0x72,0x22,0x60,0x60,0x22,0x1C,0x00, + 0x04,0x04,0x5C,0x2A,0x52,0x52,0x24,0x00, + 0x08,0x78,0x10,0x78,0x20,0x22,0x1C,0x00, + 0x28,0x28,0x7C,0x22,0x22,0x26,0x20,0x00, + 0x08,0x5C,0x6A,0x4A,0x4A,0x5C,0x08,0x00, + 0x08,0x0E,0x08,0x08,0x3C,0x4A,0x30,0x00, + 0x10,0x08,0x20,0x3C,0x02,0x02,0x0C,0x00, + 0x04,0x22,0x22,0x22,0x12,0x04,0x08,0x00, + 0x3C,0x08,0x10,0x3C,0x42,0x12,0x1E,0x00, + 0x20,0x24,0x6C,0x34,0x24,0x64,0x26,0x00, + 0x3C,0x08,0x10,0x3C,0x42,0x02,0x1C,0x00, + 0x20,0x20,0x6C,0x32,0x22,0x62,0x24,0x00, + 0x10,0x10,0x20,0x20,0x30,0x4A,0x4C,0x00}; + +static WORD x68c16[] = { + 0x4038,0x1830,0x7008,0x0020,0x1212,0x1E12,0x1216,0x0002, // 1 + 0x4038,0x1830,0x7008,0x0020,0x1A02,0x0C0C,0x121E,0x0002, // 2 + 0x6038,0x7040,0x7840,0x0020,0x1A02,0x0C0C,0x121E,0x0002, // 3 + 0x6038,0x7040,0x7840,0x0020,0x0C1E,0x0808,0x0808,0x0008, // 4 + 0x6038,0x7040,0x7840,0x0020,0x1A1C,0x1212,0x1E16,0x000A, // 5 + 0x6830,0x4848,0x4878,0x0048,0x1210,0x1C14,0x1418,0x0016, // 6 + 0x4870,0x5850,0x4848,0x0050,0x1018,0x1010,0x1E10,0x0004, // 7 + 0x4870,0x5850,0x4848,0x0050,0x100E,0x060C,0x1C02,0x0008, // 8 + 0x4848,0x7848,0x4858,0x0008,0x0C1E,0x0808,0x0808,0x0008, // 9 + 0x4060,0x4040,0x7840,0x0010,0x180E,0x1C10,0x1018,0x0010, // a + 0x4848,0x4848,0x3050,0x0020,0x0C1E,0x0808,0x0808,0x0008, // b + 0x6038,0x7040,0x4060,0x0040,0x180E,0x1C10,0x1018,0x0010, // c + 0xD060,0x8080,0xF0D0,0x0020,0x121C,0x1412,0x1216,0x0010, // d + 0x4038,0x1830,0x7008,0x0020,0x121C,0x1212,0x1C12,0x0008, // e + 0x4038,0x1830,0x7008,0x0020,0x0C1E,0x080C,0x1E08,0x0008, // f + 0x4870,0x4848,0x4848,0x0050,0x180E,0x1C10,0x1E10,0x0008, //10 + 0x4870,0x4848,0x4848,0x0050,0x0C08,0x040C,0x0404,0x0004, //11 + 0x4870,0x4848,0x4848,0x0050,0x120C,0x0406,0x1A08,0x001C, //12 + 0x4870,0x4848,0x4848,0x0050,0x1A0C,0x0C02,0x0602,0x000C, //13 + 0x4870,0x4848,0x4848,0x0050,0x1008,0x1414,0x040E,0x0008, //14 + 0x4858,0x6848,0x5868,0x0048,0x1210,0x1C14,0x1418,0x0016, //15 + 0x4038,0x1830,0x7008,0x0020,0x1216,0x1A12,0x161A,0x0012, //16 + 0x6038,0x7040,0x7840,0x0020,0x121C,0x1614,0x1212,0x0014, //17 + 0x6830,0x4040,0x7868,0x0010,0x1216,0x1A12,0x161A,0x0012, //18 + 0x6038,0x7040,0x7840,0x0020,0x3602,0x223E,0x2222,0x0022, //19 + 0x4038,0x1830,0x7008,0x0020,0x121C,0x1614,0x1212,0x0014, //1a + 0x6038,0x7040,0x7840,0x0020,0x1A0C,0x1010,0x1E1A,0x0004, //1b + 0x0000,0x0000,0x0808,0xFE04,0x0804,0x0008,0x0000,0x0000, //1c + 0x0000,0x0000,0x2020,0xFE40,0x2040,0x0020,0x0000,0x0000, //1d + 0x0000,0x1010,0x3838,0x1054,0x1010,0x1010,0x0010,0x0000, //1e + 0x0000,0x1010,0x1010,0x5410,0x3854,0x1038,0x0010,0x0000, //1f + 0x8000,0x4080,0x2040,0x1020,0x0810,0x0408,0x0204,0x0002, //80 + 0x6000,0x0CDA,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, //81 + 0x1000,0x1010,0x1010,0x0010,0x1000,0x1010,0x1010,0x0010, //82 + 0x1000,0x3C10,0x2460,0x1C28,0x5232,0x4042,0x3C62,0x0000, //86 + 0x0000,0x0000,0x1000,0x1678,0x2C1C,0x5A4A,0x3052,0x0000, //87 + 0x0000,0x0000,0x0000,0x2224,0x2222,0x4242,0x2840,0x0010, //88 + 0x0000,0x0000,0x3800,0x0004,0x621C,0x0202,0x0402,0x0008, //89 + 0x0000,0x0000,0x1000,0x1E08,0x4222,0x0804,0x1A08,0x0024, //8a + 0x0000,0x0000,0x1200,0x6A1C,0x1C08,0x2A2A,0x2A2A,0x0010, //8b + 0x0000,0x0000,0x0000,0x2E04,0x6632,0x1020,0x1010,0x0008, //8c + 0x0000,0x0000,0x0000,0x5C48,0x6A6A,0x0A4A,0x080C,0x0008, //8d + 0x0000,0x0000,0x0000,0x080E,0x3C08,0x4A4C,0x4A4A,0x0030, //8e + 0x0000,0x0000,0x0000,0x621C,0x0202,0x0202,0x0402,0x0018, //8f + 0x0000,0x7820,0x202E,0x361C,0x5252,0x5A4A,0x0232,0x0000, //91 + 0x0000,0x2420,0x4224,0x4242,0x4042,0x4040,0x2840,0x0010, //92 + 0x0000,0x0438,0x0000,0x423C,0x0202,0x0202,0x0C04,0x0008, //93 + 0x0000,0x0810,0x261C,0x0242,0x0404,0x0808,0x1A10,0x0024, //94 + 0x1000,0x1C16,0x0A6A,0x1C08,0x2A2A,0x4A4A,0x326A,0x0000, //95 + 0x0000,0x1202,0x543A,0x2214,0x2222,0x2222,0x0404,0x0000, //96 + 0x1000,0x3E10,0x0868,0x7C06,0x1C04,0x4020,0x2642,0x0018, //97 + 0x0000,0x0806,0x2010,0x4020,0x4040,0x3060,0x0E18,0x0000, //98 + 0x0000,0x2404,0x4E24,0x4454,0x4444,0x4444,0x284C,0x0000, //99 + 0x0000,0x623C,0x0202,0x0000,0x2000,0x4040,0x3E62,0x0000, //9a + 0x1000,0x1010,0x483E,0x1808,0x4020,0x4040,0x3E62,0x0000, //9b + 0x0000,0x2020,0x2020,0x4040,0x4040,0x4040,0x6440,0x0038, //9c + 0x1000,0x7E10,0x0848,0x2C3C,0x4A4A,0x3252,0x0404,0x0008, //9d + 0x0000,0x2400,0x7E24,0x2425,0x4844,0x4040,0x3220,0x000C, //9e + 0x0000,0x4438,0x3008,0x4C22,0x2030,0x4040,0x2642,0x0018, //9f + 0x1000,0x7810,0x2C20,0x2222,0x4040,0x4040,0x7260,0x005C, //e0 + 0x1000,0x1010,0x207E,0x2C20,0x6232,0x0202,0x0C02,0x0000, //e1 + 0x0000,0x3C00,0x4262,0x0202,0x0202,0x0202,0x0C04,0x0010, //e2 + 0x0000,0x7E00,0x080C,0x2010,0x4040,0x6040,0x1E22,0x0000, //e3 + 0x0000,0x1010,0x121C,0x4020,0x4040,0x4040,0x3E22,0x0000, //e4 + 0x0000,0x1010,0x227C,0x4022,0x5C44,0x2414,0x1C24,0x000A, //e5 + 0x0000,0x1A0E,0x4040,0x4040,0x4040,0x5040,0x3250,0x000C, //e6 + 0x0000,0x0808,0x2C1C,0x6A6A,0x722A,0x5656,0x0A2A,0x0004, //e7 + 0x0000,0x2020,0x6A24,0x2232,0x2424,0x6A6C,0x262A,0x0000, //e8 + 0x0000,0x1C00,0x2A34,0x4A4A,0x4A4A,0x4A4A,0x0432,0x0000, //e9 + 0x0800,0x0408,0x645E,0x4C44,0x5654,0x6466,0x1C64,0x0000, //ea + 0x0000,0x3060,0x2410,0x2626,0x4444,0x4444,0x382C,0x0010, //eb + 0x0000,0x043C,0x0804,0x1008,0x4A12,0x4A4A,0x300A,0x0000, //ec + 0x0000,0x0000,0x3418,0x4424,0x0242,0x0202,0x0002,0x0000, //ed + 0x0400,0x441E,0x4444,0x5E44,0x4C44,0x5654,0x1856,0x0000, //ee + 0x1000,0x3E10,0x0848,0x3C0E,0x1848,0x4A2C,0x2A4A,0x0030, //ef + 0x3000,0x0810,0x0A08,0x4E3A,0x4A4E,0x524B,0x0424,0x0004, //f0 + 0x0400,0x7E04,0x0804,0x2A3A,0x5048,0x7250,0x0E2A,0x0004, //f1 + 0x0000,0x4808,0x2A5C,0x6A2A,0x4A6A,0x5252,0x0472,0x0000, //f2 + 0x0000,0x1008,0x127C,0x1010,0x247C,0x2020,0x2622,0x0018, //f3 + 0x0000,0x4400,0x5C44,0x6222,0x2222,0x1012,0x0810,0x0008, //f4 + 0x0000,0x5C08,0x6A6A,0x4A4A,0x4A4A,0x0C4A,0x0808,0x0000, //f5 + 0x0800,0x0E08,0x0808,0x3C08,0x4A6C,0x4A4A,0x3048,0x0000, //f6 + 0x0000,0x0418,0x2020,0x4440,0x625E,0x0202,0x0202,0x0004, //f7 + 0x0000,0x2200,0x4242,0x4242,0x4242,0x2252,0x0406,0x0000, //f8 + 0x0000,0x4C3C,0x1008,0x362C,0x4242,0x261A,0x2422,0x0018, //f9 + 0x0000,0x2020,0x6A26,0x3272,0x2422,0x6464,0x2224,0x0000, //fa + 0x0000,0x443C,0x1008,0x223C,0x4242,0x0202,0x0402,0x000C, //fb + 0x0000,0x1010,0x7C10,0x1232,0x2232,0x6262,0x2422,0x0000, //fc + 0x0000,0x1010,0x2030,0x2820,0x3434,0x2424,0x4624,0x0044}; //fd + +static WORD x68c12[] = { + 0x0000,0x0038,0x0064,0x0030,0x0008,0x0045, // 1 + 0x203B,0x2002,0xA003,0x2002,0x4002,0x0000, + 0x0000,0x0038,0x0064,0x0030,0x0008,0x2044, // 2 + 0x403B,0x8001,0xC000,0x4001,0x2002,0x0000, + 0x0000,0x007C,0x0020,0x0078,0x0040,0x2044, // 3 + 0x403B,0x8001,0xC000,0x4001,0x2002,0x0000, + 0x0000,0x007C,0x0020,0x0078,0x0040,0xE045, // 4 + 0x803A,0x8000,0x8000,0x8000,0x8000,0x0000, + 0x0000,0x007C,0x0020,0x0078,0x0040,0xC044, // 5 + 0x203B,0x2002,0xA002,0x4002,0xA001,0x0000, + 0x0000,0x0018,0x0028,0x0044,0x007C,0x2045, // 6 + 0x4045,0x8001,0x8001,0x4001,0x2001,0x0000, + 0x0000,0x0038,0x0064,0x0048,0x0044,0x0044, // 7 + 0x005A,0x0002,0x0002,0x2001,0xC001,0x0000, + 0x0000,0x0038,0x0064,0x0048,0x0044,0xC045, // 8 + 0x205B,0x8001,0x4000,0x2002,0xC001,0x0000, + 0x0000,0x0020,0x0064,0x0044,0x0074,0xE045, // 9 + 0x804A,0x8000,0x8000,0x8000,0x8000,0x0000, + 0x0000,0x0040,0x0040,0x0040,0x0040,0xE025, // a + 0x003B,0x0002,0xC003,0x0002,0x0002,0x0000, + 0x0000,0x0040,0x0044,0x0044,0x0064,0xE029, // b + 0x803A,0x8010,0x8000,0x8000,0x8000,0x0000, + 0x0000,0x003C,0x0060,0x0040,0x0078,0xE041, // c + 0x0043,0x0002,0xC003,0x0002,0x0002,0x0000, + 0x0000,0x0038,0x0064,0x0040,0x0040,0xC045, // d + 0x203B,0x2002,0x6002,0xC002,0x2002,0x0000, + 0x0000,0x0038,0x0064,0x0030,0x0008,0xC044, // e + 0x203B,0x2002,0x2002,0x4003,0x8001,0x0000, + 0x0000,0x0038,0x0064,0x0030,0x0008,0xC045, // f + 0x8038,0x8000,0x8000,0x8001,0xC000,0x0000, + 0x0000,0x0038,0x006C,0x0044,0x0044,0xE047, //10 + 0x0059,0xC003,0x0002,0x2002,0xC001,0x0000, + 0x0000,0x0038,0x006C,0x0044,0x0044,0x4044, //11 + 0xC058,0x4000,0xC000,0x8000,0xC001,0x0000, + 0x0000,0x0038,0x006C,0x0044,0x0044,0xC044, //12 + 0x6059,0x4000,0x8000,0x0001,0xC001,0x0000, + 0x0000,0x0038,0x006C,0x0044,0x0044,0xC044, //13 + 0x2059,0x4000,0x2000,0x2000,0xC001,0x0000, + 0x0000,0x0038,0x006C,0x0044,0x0044,0x0045, //14 + 0x4059,0x4002,0x8002,0xC001,0x8000,0x0000, + 0x0000,0x0044,0x0064,0x0074,0x0054,0x205D, //15 + 0x4049,0x8001,0x8001,0x4001,0x2001,0x0000, + 0x0000,0x0038,0x0064,0x0030,0x0008,0x2046, //16 + 0x203B,0xA003,0xA002,0xE002,0x4002,0x0000, + 0x0000,0x007C,0x0020,0x0078,0x0040,0xC045, //17 + 0x203B,0x4002,0x2002,0x2002,0xC002,0x0000, + 0x0000,0x0038,0x0064,0x0040,0x0040,0x2046, //18 + 0x203B,0xA003,0xA002,0xE002,0x4002,0x0000, + 0x0000,0x007C,0x0020,0x0078,0x0040,0x0046, //19 + 0x603B,0xE003,0xA002,0x2002,0x2002,0x0000, + 0x0000,0x0038,0x0064,0x0030,0x0008,0xC045, //1a + 0x203B,0x4002,0x2002,0x2002,0xC002,0x0000, + 0x0000,0x007C,0x0020,0x0078,0x0040,0xC045, //1b + 0x203B,0x0002,0x0002,0x2002,0xC001,0x0000, + 0x0000,0x0000,0x0000,0x8000,0x4000,0x2000, //1c + 0xF07F,0x2000,0x4000,0x8000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0008,0x0010,0x0020, //1d + 0xF07F,0x0020,0x0010,0x0008,0x0000,0x0000, + 0x0000,0x0004,0x000E,0x0015,0x8024,0x0004, //1e + 0x0004,0x0004,0x0004,0x0004,0x0004,0x0000, + 0x0000,0x0004,0x0004,0x0004,0x0004,0x0004, //1f + 0x0004,0x8024,0x0015,0x000E,0x0004,0x0000, + 0x0008,0x000C,0x0004,0x0006,0x0002,0x0003, //80 + 0x0001,0x8001,0x8000,0xC000,0x4000,0x0000, + 0x100E,0x601B,0xC020,0x0000,0x0000,0x0000, //81 + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0002,0x0002,0x0002,0x0002,0x0000, //82 + 0x0000,0x0002,0x0002,0x0002,0x0002,0x0000}; + +static WORD x68c24[] = { + 0x0000,0x0000,0x0000,0x0000,0x0038,0x0064, // 1 + 0x0040,0x0020,0x0018,0x000C,0x0044,0x0038, + 0x0001,0x2003,0x2002,0x2002,0xA003,0x2002, + 0x2002,0x4001,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0038,0x0064, // 2 + 0x0040,0x0020,0x0018,0x000C,0x0044,0x0038, + 0x2002,0x6003,0xC001,0x8000,0xC000,0x4001, + 0x2003,0x2002,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x007C,0x0020, // 3 + 0x0020,0x0078,0x0040,0x0040,0x0044,0x0038, + 0x2002,0x6003,0xC001,0x8000,0xC000,0x4001, + 0x2003,0x2002,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x007C,0x0020, // 4 + 0x0020,0x0078,0x0040,0x0040,0x0044,0x0038, + 0xE001,0x8002,0x8000,0x8000,0x8000,0x8000, + 0x8000,0x8000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x007C,0x0020, // 5 + 0x0020,0x0078,0x0040,0x0040,0x0044,0x0038, + 0xC000,0x2003,0x2002,0x2002,0xA002,0xE002, + 0x4003,0xA001,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0018,0x0028, // 6 + 0x0064,0x0044,0x007C,0x0044,0x0044,0x0044, + 0x2002,0x4002,0x8002,0x8003,0x0003,0x8002, + 0x4002,0x2002,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0038,0x0064, // 7 + 0x0044,0x0048,0x0058,0x0044,0x0044,0x0058, + 0x0002,0x0002,0x0002,0x0002,0x0002,0x0002, + 0x2003,0xC001,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0038,0x0064, // 8 + 0x0044,0x0048,0x0058,0x0044,0x0044,0x0058, + 0xC001,0x2003,0x0002,0x0001,0xC000,0x6000, + 0x2002,0xC001,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0020,0x0064, // 9 + 0x0044,0x0044,0x0074,0x0044,0x0044,0x0028, + 0xE001,0x8002,0x8000,0x8000,0x8000,0x8000, + 0x8000,0x8000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0040,0x0040, // a + 0x0040,0x0040,0x0040,0x0040,0x0064,0x0038, + 0xE001,0x0003,0x0002,0x8003,0xC002,0x0002, + 0x0002,0x0002,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0040,0x0044, // b + 0x0044,0x0044,0x0064,0x0028,0x0038,0x0010, + 0xE001,0x8002,0x8000,0x8000,0x8000,0x8000, + 0x8000,0x8000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x003C,0x0060, // c + 0x0040,0x0070,0x0058,0x0040,0x0040,0x0040, + 0xE001,0x0003,0x0002,0x8003,0xC002,0x0002, + 0x0002,0x0002,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0038,0x0064, // d + 0x0040,0x0040,0x0040,0x0040,0x0044,0x0038, + 0xC001,0x2003,0x2002,0x2002,0x6002,0xC002, + 0x2002,0x2002,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0038,0x0064, // e + 0x0040,0x0020,0x0018,0x000C,0x0044,0x0038, + 0xC000,0x2003,0x2002,0x2002,0x2002,0x2002, + 0x4003,0x8001,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0038,0x0064, // f + 0x0040,0x0020,0x0018,0x000C,0x0044,0x0038, + 0xC001,0x8000,0x8000,0x8000,0x8000,0x8000, + 0x8001,0xC000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0038,0x006C, //10 + 0x0044,0x0044,0x0044,0x0044,0x0044,0x0058, + 0x0000,0xE003,0x0001,0x0001,0xC003,0x0002, + 0x0002,0x2002,0xC001,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0038,0x006C, //11 + 0x0044,0x0044,0x0044,0x0044,0x0044,0x0058, + 0x0000,0x8000,0x8001,0x8000,0x8000,0x0001, + 0x0001,0x8003,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0038,0x006C, //12 + 0x0044,0x0044,0x0044,0x0044,0x0044,0x0058, + 0xC000,0x2001,0x2000,0x4000,0x8000,0x8000, + 0x0001,0xC003,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0038,0x006C, //13 + 0x0044,0x0044,0x0044,0x0044,0x0044,0x0058, + 0xE001,0x2000,0x4000,0xC000,0x2000,0x2000, + 0x4002,0x8001,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0038,0x006C, //14 + 0x0044,0x0044,0x0044,0x0044,0x0044,0x0058, + 0x8000,0x0001,0x4001,0x4002,0x4002,0xE001, + 0x8000,0x8000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0044,0x0044, //15 + 0x0044,0x0064,0x0074,0x0054,0x005C,0x0048, + 0x2002,0x4002,0x8002,0x8003,0x0003,0x8002, + 0x4002,0x2002,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0038,0x0064, //16 + 0x0040,0x0020,0x0018,0x000C,0x0044,0x0038, + 0x2002,0x2002,0x2002,0x2003,0xA003,0xA002, + 0xE002,0x4002,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x007C,0x0020, //17 + 0x0020,0x0078,0x0040,0x0040,0x0044,0x0038, + 0xC001,0x2003,0x2002,0x4002,0xC002,0x2002, + 0x2002,0xC002,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0038,0x0064, //18 + 0x0040,0x0040,0x0040,0x0040,0x0044,0x0038, + 0x2002,0x2002,0x2002,0x2003,0xA003,0xA002, + 0xE002,0x4002,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x007C,0x0020, //19 + 0x0020,0x0078,0x0040,0x0040,0x0044,0x0038, + 0x0002,0x6003,0xE003,0xA002,0x2002,0x2002, + 0x2002,0x2002,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0038,0x0064, //1a + 0x0040,0x0020,0x0018,0x000C,0x0044,0x0038, + 0xC001,0x2003,0x2002,0x4002,0xC002,0x2002, + 0x2002,0xC002,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x007C,0x0020, //1b + 0x0020,0x0078,0x0040,0x0040,0x0044,0x0038, + 0xC001,0x2003,0x0002,0x0002,0x0002,0x0002, + 0x2002,0xC001,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, //1c + 0x0000,0x0000,0x0000,0x0001,0x8000,0x4000, + 0xE07F,0x4000,0x8000,0x0001,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, //1d + 0x0000,0x0000,0x0000,0x0008,0x0010,0x0020, + 0xE07F,0x0020,0x0010,0x0008,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0004, //1e + 0x000E,0x0015,0x8024,0x0004,0x0004,0x0004, + 0x0004,0x0004,0x0004,0x0004,0x0004,0x0004, + 0x0004,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0004, //1f + 0x0004,0x0004,0x0004,0x0004,0x0004,0x0004, + 0x0004,0x0004,0x0004,0x8024,0x0015,0x000E, + 0x0004,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0030,0x0030,0x0030,0x0018, //80 + 0x0018,0x0018,0x000C,0x000C,0x000C,0x0006, + 0x0006,0x0006,0x0003,0x0003,0x0003,0x8001, + 0x8001,0x8001,0xC000,0xC000,0xC000,0x0000, + 0x0000,0x101C,0x303B,0xE061,0xC040,0x0000, //81 + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0006,0x0006,0x0006,0x0006,0x0006, //82 + 0x0006,0x0006,0x0006,0x0006,0x0000,0x0000, + 0x0000,0x0000,0x0006,0x0006,0x0006,0x0006, + 0x0006,0x0006,0x0006,0x0006,0x0006,0x0000}; + +static WORD x68k16[] = { + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xFFFF, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001, + 0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xFF01, + 0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00FF, + 0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001, + 0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x00FF, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0xFF01, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0xFF01, + 0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xFFFF, + 0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001, + 0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x00FF, + 0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001, + 0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0xFFFF, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0xFFFF, + 0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xFFFF, + 0xFFFF,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001, + 0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xFF01, + 0xFF01,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x80FF, + 0x80FF,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001, + 0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x80FF, + 0x80FF,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0xFF01, + 0xFF01,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0xFF01, + 0xFF01,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xFFFF, + 0xFFFF,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001, + 0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x80FF, + 0x80FF,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001, + 0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0xFFFF, + 0xFFFF,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0xFFFF, + 0xFFFF,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001, + 0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0xFF01, + 0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xFFFF, + 0xFFFF,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001, + 0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x80FF, + 0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001, + 0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0xFFFF, + 0xFFFF,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0xFFFF, + 0xFFFF,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001, + 0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0xFF01, + 0xFF01,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xFFFF, + 0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001, + 0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x00FF, + 0x00FF,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001, + 0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0xFFFF, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0xFFFF, + 0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001}; + +static WORD x68k24[] = { + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0xFF00,0xFFFF,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000, + 0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0x1000,0x0000, + 0x0010,0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0x1000, + 0x0000,0x0010,0x1000,0x0000,0x0010,0x1000,0x0000,0x0010, + 0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0x1000,0x0000, + 0x0010,0x1000,0x0000,0x0010, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0xFF1F,0x1000,0x0000,0x0010,0x1000,0x0000,0x0010, + 0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0x1000,0x0000, + 0x0010,0x1000,0x0000,0x0010, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0xFF00,0x00F0,0x1000,0x0000,0x0010,0x1000,0x0000,0x0010, + 0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0x1000,0x0000, + 0x0010,0x1000,0x0000,0x0010, + 0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0x1000,0x0000, + 0x0010,0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0x1000, + 0xFF00,0x00F0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000, + 0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0x1000,0x0000, + 0x0010,0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0x1000, + 0x0000,0xFF1F,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000, + 0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0x1000,0x0000, + 0x0010,0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0x1000, + 0x0000,0xFF1F,0x1000,0x0000,0x0010,0x1000,0x0000,0x0010, + 0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0x1000,0x0000, + 0x0010,0x1000,0x0000,0x0010, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0xFF00,0xFFFF,0x1000,0x0000,0x0010,0x1000,0x0000,0x0010, + 0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0x1000,0x0000, + 0x0010,0x1000,0x0000,0x0010, + 0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0x1000,0x0000, + 0x0010,0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0x1000, + 0xFF00,0x00F0,0x1000,0x0000,0x0010,0x1000,0x0000,0x0010, + 0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0x1000,0x0000, + 0x0010,0x1000,0x0000,0x0010, + 0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0x1000,0x0000, + 0x0010,0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0x1000, + 0xFF00,0xFFFF,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000, + 0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0x1000,0x0000, + 0x0010,0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0x1000, + 0xFF00,0xFFFF,0x1000,0x0000,0x0010,0x1000,0x0000,0x0010, + 0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0x1000,0x0000, + 0x0010,0x1000,0x0000,0x0010, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xFFFF, + 0xFFFF,0xFFFF,0xFFFF,0x00FF,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000, + 0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0x3800,0x0000, + 0x0038,0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0x3800, + 0x0000,0x0038,0x3800,0x0000,0x0038,0x3800,0x0000,0x0038, + 0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0x3800,0x0000, + 0x0038,0x3800,0x0000,0x0038, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3F00, + 0x00FF,0xFF3F,0x3F00,0x00FF,0x0038,0x3800,0x0000,0x0038, + 0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0x3800,0x0000, + 0x0038,0x3800,0x0000,0x0038, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xF8FF, + 0xFF00,0x00F8,0xF8FF,0x0000,0x0038,0x3800,0x0000,0x0038, + 0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0x3800,0x0000, + 0x0038,0x3800,0x0000,0x0038, + 0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0x3800,0x0000, + 0x0038,0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0xF8FF, + 0xFF00,0x00F8,0xF8FF,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000, + 0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0x3800,0x0000, + 0x0038,0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0x3F00, + 0x00FF,0xFF3F,0x3F00,0x00FF,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000, + 0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0x3800,0x0000, + 0x0038,0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0x3F00, + 0x00FF,0xFF3F,0x3F00,0x00FF,0x0038,0x3800,0x0000,0x0038, + 0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0x3800,0x0000, + 0x0038,0x3800,0x0000,0x0038, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xFFFF, + 0xFFFF,0xFFFF,0xFFFF,0x00FF,0x0038,0x3800,0x0000,0x0038, + 0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0x3800,0x0000, + 0x0038,0x3800,0x0000,0x0038, + 0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0x3800,0x0000, + 0x0038,0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0xF8FF, + 0xFF00,0x00F8,0xF8FF,0x0000,0x0038,0x3800,0x0000,0x0038, + 0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0x3800,0x0000, + 0x0038,0x3800,0x0000,0x0038, + 0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0x3800,0x0000, + 0x0038,0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0xFFFF, + 0xFFFF,0xFFFF,0xFFFF,0x00FF,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000, + 0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0x3800,0x0000, + 0x0038,0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0xFFFF, + 0xFFFF,0xFFFF,0xFFFF,0x00FF,0x0038,0x3800,0x0000,0x0038, + 0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0x3800,0x0000, + 0x0038,0x3800,0x0000,0x0038, + 0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0x3800,0x0000, + 0x0038,0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0x3800, + 0x0000,0xFF3F,0x3800,0x0000,0x0038,0x3800,0x0000,0x0038, + 0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0x3800,0x0000, + 0x0038,0x3800,0x0000,0x0038, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xFFFF, + 0xFFFF,0xFFFF,0xFFFF,0x00FF,0x0010,0x1000,0x0000,0x0010, + 0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0x1000,0x0000, + 0x0010,0x1000,0x0000,0x0010, + 0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0x3800,0x0000, + 0x0038,0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0x3800, + 0xFF00,0x00F8,0x3800,0x0000,0x0038,0x3800,0x0000,0x0038, + 0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0x3800,0x0000, + 0x0038,0x3800,0x0000,0x0038, + 0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0x1000,0x0000, + 0x0010,0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0xFFFF, + 0xFFFF,0xFFFF,0xFFFF,0x00FF,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000, + 0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0x1000,0x0000, + 0x0010,0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0xFFFF, + 0xFFFF,0xFFFF,0xFFFF,0x00FF,0x0010,0x1000,0x0000,0x0010, + 0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0x1000,0x0000, + 0x0010,0x1000,0x0000,0x0010, + 0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0x1000,0x0000, + 0x0010,0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0x1F00, + 0x00FF,0xFF1F,0x1F00,0x00FF,0x0010,0x1000,0x0000,0x0010, + 0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0x1000,0x0000, + 0x0010,0x1000,0x0000,0x0010, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0xFF00,0xFFFF,0x3800,0x0000,0x0038,0x3800,0x0000,0x0038, + 0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0x3800,0x0000, + 0x0038,0x3800,0x0000,0x0038, + 0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0x1000,0x0000, + 0x0010,0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0xF0FF, + 0xFF00,0x00F0,0xF0FF,0x0000,0x0010,0x1000,0x0000,0x0010, + 0x1000,0x0000,0x0010,0x1000,0x0000,0x0010,0x1000,0x0000, + 0x0010,0x1000,0x0000,0x0010, + 0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0x3800,0x0000, + 0x0038,0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0x3800, + 0xFF00,0xFFFF,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000, + 0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0x3800,0x0000, + 0x0038,0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0x3800, + 0xFF00,0xFFFF,0x3800,0x0000,0x0038,0x3800,0x0000,0x0038, + 0x3800,0x0000,0x0038,0x3800,0x0000,0x0038,0x3800,0x0000, + 0x0038,0x3800,0x0000,0x0038}; + +// --------------------------------------------------------------------------- + +static __declspec(naked) WORD __fastcall jis2sjis(WORD jis) { + + __asm { + mov ax, cx + xor dl, dl + add ah, 21h + test ah, 1 + je short jis2sjis1a + mov dl, 5eh +jis2sjis1a: sar ah, 1 + add al, dl + xor ah, 20h + or ah, 80h + cmp al, 60h + jb short jis2sjis1b + inc al +jis2sjis1b: add al, 1fh + xchg al, ah + ret + } +} + + +static void setmonobmphead(BITMAPINFO *bi, int x, int y) { + + BYTE i; + + ZeroMemory(&bi->bmiHeader, sizeof(BITMAPINFOHEADER)); + bi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bi->bmiHeader.biWidth = x; + bi->bmiHeader.biHeight = y; + bi->bmiHeader.biPlanes = 1; + bi->bmiHeader.biBitCount = 1; + bi->bmiHeader.biCompression = BI_RGB; + bi->bmiHeader.biSizeImage = (((x + 31) / 8) & ~3) * y; + bi->bmiHeader.biXPelsPerMeter = 0; + bi->bmiHeader.biYPelsPerMeter = 0; + bi->bmiHeader.biClrUsed = 2; + bi->bmiHeader.biClrImportant = 2; + + for (i=0; i<2; i++) { + bi->bmiColors[i].rgbRed = (i ^ 1) - 1; + bi->bmiColors[i].rgbGreen = (i ^ 1) - 1; + bi->bmiColors[i].rgbBlue = (i ^ 1) - 1; + bi->bmiColors[i].rgbReserved = PC_RESERVED; + } +} + + +static int getfont_sub(BYTE *dest, char *str, char *fontname, + int fntx, int fnty, int bmpx, int bmpy) { + + HDC hdc; + HDC hdcimage; + HBITMAP hBitmap; + HBITMAP hBitmapbak; + BYTE *image; + HFONT hfont; + HFONT hfontbak; + RECT rect; + char bmphead[sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 2]; + + SetRect(&rect, 0, 0, bmpx, bmpy); + setmonobmphead((BITMAPINFO *)bmphead, bmpx, bmpy); + hdc = GetDC(NULL); + hBitmap = CreateDIBSection(hdc, (BITMAPINFO *)bmphead, + DIB_RGB_COLORS, (void **)&image, NULL, 0); + hdcimage = CreateCompatibleDC(hdc); + ReleaseDC(NULL, hdc); + hBitmapbak = SelectObject(hdcimage, hBitmap); + SetDIBColorTable(hdcimage, 0, 2, ((BITMAPINFO *)bmphead)->bmiColors); + + hfont = CreateFont(fnty, fntx, FW_DONTCARE, FW_DONTCARE, FW_REGULAR, + FALSE, FALSE, FALSE, SHIFTJIS_CHARSET, + OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, + NONANTIALIASED_QUALITY, FIXED_PITCH, fontname); + hfontbak = SelectObject(hdcimage, hfont); + SetTextColor(hdcimage, RGB(255, 255, 255)); + SetBkColor(hdcimage, RGB(0, 0, 0)); + + FillRect(hdcimage, &rect, GetStockObject(BLACK_BRUSH)); + TextOut(hdcimage, 0, 0, str, strlen(str)); + CopyMemory(dest, image, (((bmpx + 31) / 8) & ~3) * bmpy); + + SelectObject(hdcimage, hBitmapbak); + DeleteObject(hBitmap); + DeleteDC(hdcimage); + + return(TRUE); +} + + +static int getfont(BYTE *dest, char *fontface, int base, int size) { + + int i; + char textbuf[256]; + int *p; + + if (!base) { + for (i=0; i<0x5f; i++) { + textbuf[i] = (BYTE)(i + 0x20); + } + textbuf[0x5f] = ' '; + textbuf[0x60] = ' '; + for (i=0x01; i<0x40; i++) { + textbuf[i+0x60] = (BYTE)(i + 0xa0); + } + textbuf[0xa0] = '\0'; + } + else { + *(WORD *)textbuf = 0x4081; + for (i=1; i<0x5f; i++) { + ((WORD *)textbuf)[i] = jis2sjis((WORD)((base << 8) + i + 0x20)); + } + textbuf[i*2] = '\0'; + switch(base) { + case 0x22: + case 0x23: + case 0x24: + case 0x25: + case 0x26: + case 0x27: + p = deltable; + while(base > 0x22) { + while(*p++); + base--; + } + while(*p) { + i = *p++; + while(i < *p) { + ((WORD *)textbuf)[i++] = 0x4081; + } + p++; + } + break; + case 0x4f: + for (i=0x34; i<0x5f; i++) { + ((WORD *)textbuf)[i] = 0x4081; + } + break; + case 0x74: + for (i=0x05; i<0x5f; i++) { + ((WORD *)textbuf)[i] = 0x4081; + } + break; + } + } + return(getfont_sub(dest, textbuf, fontface, + size, size*2, size*256, size*2)); +} + +// --------------------------------------------------------------------------- + +static void cpyank2cgrom(BYTE *dst, BYTE *src, int length) { + + int y; + + while(length--) { + for (y=16; y--;) { + *dst++ = src[y*256]; + } + src++; + } +} + +static void cpy12fnt2cgrom(BYTE *dst, BYTE *src, int bmpx, int bmpy) { + + int i, j; + + bmpx /= 8; + for (i=0; i<8; i++) { + for (j=bmpy; j--;) { + *(WORD *)dst = (*(WORD *)(&src[j*bmpx])) & 0xf0ff; + dst += 2; + } + for (j=bmpy; j--;) { + *dst++ = (src[j*bmpx+1] << 4) | (src[j*bmpx+2] >> 4); + *dst++ = (src[j*bmpx+2] << 4); + } + src += 3; + } +} + +static void cpysmall2cgrom(BYTE *dst, BYTE *src, int line) { + + int i, j; + + dst += 0x5e * 32 * line; + for (i=0; i<0x5e; i++) { + src += 2; + for (j=16; j--;) { + *(WORD *)dst = *(WORD *)(src + j * 256); + dst += 2; + } + } +} + +static void cpybig2cgrom(BYTE *dst, BYTE *src, int line) { + + int i, j; + + dst += 0x5e * 72 * line; + for (i=0; i<0x5e; i++) { + src += 3; + for (j=24; j--;) { + *dst++ = *(src + j * 384 + 0); + *dst++ = *(src + j * 384 + 1); + *dst++ = *(src + j * 384 + 2); + } + } +} + +// --------------------------------------------------------------------------- + +int make_cgromdat(BYTE *buf, int x68030, LPSTR primaryface, LPSTR secondaryface) { + + BYTE fnt[24*256*24/8]; + int i; + + ZeroMemory(buf, 0xc0000); + + // 8x8 + CopyMemory(buf + 0x3a000 + 0x01*8, x68c8, 0xfd*8); + + // 8x16 + getfont(fnt, primaryface, 0, 8); + cpyank2cgrom(buf + 0x3a800 + 0x21*16, fnt + 0x01, 0x5e); // 21-7e + cpyank2cgrom(buf + 0x3a800 + 0xa1*16, fnt + 0x61, 0x3f); // a1-df + CopyMemory(buf + 0x3a800 + 0x01*16, &x68c16[0x00*8], 0x1f*16); + CopyMemory(buf + 0x3a800 + 0x80*16, &x68c16[0x1f*8], 0x03*16); + CopyMemory(buf + 0x3a800 + 0x86*16, &x68c16[0x22*8], 0x0a*16); + CopyMemory(buf + 0x3a800 + 0x91*16, &x68c16[0x2c*8], 0x0f*16); + CopyMemory(buf + 0x3a800 + 0xe0*16, &x68c16[0x3b*8], 0x1e*16); + + // 12x12 + for (i=0; i<0x0e; i++) { + getfont_sub(fnt, str_x68k[i], secondaryface, 6, 12, 256, 12); + cpy12fnt2cgrom(buf + 0x3b800 + (i+2)*24*16, fnt, 256, 12); + } + CopyMemory(buf + 0x3b800 + 0x01*24, &x68c12[0x00*12], 0x1f*24); + CopyMemory(buf + 0x3b800 + 0x80*24, &x68c12[0x1f*12], 0x03*24); + + // 12x24 + getfont(fnt, secondaryface, 0, 12); + // ANK + for (i=0; i<6; i++) { + cpy12fnt2cgrom(buf + 0x3d000 + (i+ 2)*16*2*24, + fnt + (i+0)*8*3, 12*256, 24); + } + // カタカナ + for (i=0; i<4; i++) { + cpy12fnt2cgrom(buf + 0x3d000 + (i+10)*16*2*24, + fnt + (i+6)*8*3, 12*256, 24); + } + // 平仮名 + for (i=0; i<2; i++) { + getfont_sub(fnt, str_x68k[i+6], secondaryface, 6, 24, 256, 24); + cpy12fnt2cgrom(buf + 0x3d000 + (i+ 8)*16*2*24, fnt, 256, 24); + getfont_sub(fnt, str_x68k[i+12], secondaryface, 6, 24, 256, 24); + cpy12fnt2cgrom(buf + 0x3d000 + (i+14)*16*2*24, fnt, 256, 24); + } + CopyMemory(buf + 0x3d000 + 0x01*48, &x68c24[0x00*24], 0x1f*48); + CopyMemory(buf + 0x3d000 + 0x80*48, &x68c24[0x1f*24], 0x03*48); + + // 16x16 + for (i=0; i<7; i++) { + getfont(fnt, secondaryface, i+0x21, 8); + cpysmall2cgrom(buf, fnt, i); + } + for (i=0; i<0x45; i++) { + getfont(fnt, primaryface, i+0x30, 8); + cpysmall2cgrom(buf, fnt, i+8); + } + CopyMemory(buf + 0x5e*7*32, x68k16, 32*32); + + // 24x24 + for (i=0; i<7; i++) { + getfont(fnt, secondaryface, i+0x21, 12); + cpybig2cgrom(buf + 0x40000, fnt, i); + } + for (i=0; i<0x45; i++) { + getfont(fnt, secondaryface, i+0x30, 12); + cpybig2cgrom(buf + 0x40000, fnt, i+8); + } + CopyMemory(buf + 0x40000 + 0x5e*7*72, x68k24, 32*72); + + return(TRUE); +} diff --git a/x11/mkcgrom.h b/x11/mkcgrom.h new file mode 100644 index 0000000..b504743 --- /dev/null +++ b/x11/mkcgrom.h @@ -0,0 +1,11 @@ + +// X68KのCGROMを作る +// buf: 作る領域 (0xc0000バイト分のバッファ) +// x68030: X68030フォントを作るか? (現在無効) +// primaryface: 書体1 (主に16ドット用) +// secondaryface: 書体2 (主に24ドット用) +// +// 戻り値: FALSE: 失敗, TRUE: 成功 + + +int make_cgromdat(BYTE *buf, int x68030, LPSTR primaryface, LPSTR secondaryface); diff --git a/x11/mouse.c b/x11/mouse.c new file mode 100644 index 0000000..a088a9c --- /dev/null +++ b/x11/mouse.c @@ -0,0 +1,243 @@ +/* $Id: mouse.c,v 1.5 2008/11/08 02:24:18 nonaka Exp $ */ + +/* + * Copyright (c) 2003,2008 NONAKA Kimihiro + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "common.h" +#include "winx68k.h" +#include "prop.h" +#include "scc.h" +#include "crtc.h" +#include "mouse.h" + +int MousePosX = 0; +int MousePosY = 0; +BYTE MouseStat = 0; +BYTE MouseSW = 0; + +POINT CursorPos; +int mousex = 0, mousey = 0; + +static GdkPixmap *cursor_pixmap; +static GdkCursor *cursor; + +static void getmaincenter(GtkWidget *w, POINT *p); +void gdk_window_set_pointer(GdkWindow *window, gint x, gint y); + +void Mouse_Init(void) +{ + static gchar hide_cursor[16*16/8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; + static int inited = 0; + + if (!inited) { + GtkWidget *w = window; + + inited = 1; + + cursor_pixmap = gdk_pixmap_create_from_data(w->window, + hide_cursor, 16, 16, 1, &w->style->black, &w->style->black); + cursor = gdk_cursor_new_from_pixmap(cursor_pixmap, + cursor_pixmap, &w->style->black, &w->style->black, 0, 0); + } + + MousePosX = (TextDotX / 2); + MousePosY = (TextDotY / 2); + MouseStat = 0; +} + + +// ---------------------------------- +// Mouse Event Occured +// ---------------------------------- +void Mouse_Event(DWORD wparam, DWORD lparam) +{ + + if (MouseSW) { + switch (wparam) { + case 0: // マウス移動 + MousePosX = (lparam >> 16) & 0xffff; + MousePosY = (lparam & 0xffff); + break; + + case 1: // 左ボタン + if (lparam == TRUE) + MouseStat |= 1; + else + MouseStat &= 0xfe; + break; + + case 2: // 右ボタン + if (lparam == TRUE) + MouseStat |= 2; + else + MouseStat &= 0xfd; + break; + + default: + break; + } + } +} + + +// ---------------------------------- +// Mouse Data send to SCC +// ---------------------------------- +void Mouse_SetData(void) +{ + POINT pt; + int x, y; + + if (MouseSW) { + getmaincenter(window, &pt); + + mousex += (MousePosX - pt.x) * Config.MouseSpeed; + mousey += (MousePosY - pt.y) * Config.MouseSpeed; + x = mousex / 10; + y = mousey / 10; + mousex -= x * 10; + mousey -= y * 10; + MouseSt = MouseStat; + + if (x > 127) { + MouseSt |= 0x10; + MouseX = 127; + } else if (x < -128) { + MouseSt |= 0x20; + MouseX = -128; + } else { + MouseX = (signed char)x; + } + + if (y > 127) { + MouseSt |= 0x40; + MouseY = 127; + } else if (y < -128) { + MouseSt |= 0x80; + MouseY = -128; + } else { + MouseY = (signed char)y; + } + + gdk_window_set_pointer(window->window, pt.x, pt.y); + } else { + MouseSt = 0; + MouseX = 0; + MouseY = 0; + } +} + + +// ---------------------------------- +// Start Capture +// ---------------------------------- +void Mouse_StartCapture(int flag) +{ + GtkWidget *w = window; + POINT pt; + + if (flag && !MouseSW) { + int cx, cy; + + gdk_window_get_pointer(w->window, &cx, &cy, NULL); + gdk_pointer_grab(w->window, TRUE, 0, w->window, cursor, 0); + getmaincenter(w, &pt); + gdk_window_set_pointer(w->window, pt.x, pt.y); + + CursorPos.x = (WORD)cx; + CursorPos.y = (WORD)cy; + MouseSW = 1; + } + + if (!flag && MouseSW) { + gdk_window_set_pointer(w->window, CursorPos.x, CursorPos.y); + gdk_pointer_ungrab(0); + + MouseSW = 0; + } +} + + +void Mouse_ChangePos(void) +{ + + if (MouseSW) { + POINT pt; + + getmaincenter(window, &pt); + gdk_window_set_pointer(window->window, pt.x, pt.y); + } +} + +static void +getmaincenter(GtkWidget *w, POINT *p) +{ + + p->x = w->allocation.x + w->allocation.width / 2; + p->y = w->allocation.y + w->allocation.height / 2; +} + +#if GTK_MAJOR_VERSION == 1 +#include + +void +gdk_window_set_pointer(GdkWindow *window, gint x, gint y) +{ + GdkWindowPrivate *private; + + if (!window) + window = (GdkWindow *)&gdk_root_parent; + + private = (GdkWindowPrivate *)window; + if (private->destroyed) + return; + + XWarpPointer(private->xdisplay, None, private->xwindow, + 0, 0, 0, 0, x, y); +} +#else /* GTK_MAJOR_VERSION != 1 */ +#include + +void +gdk_window_set_pointer(GdkWindow *window, gint x, gint y) +{ + GdkScreen *screen; + + if (window == NULL) { + screen = gdk_screen_get_default(); + window = gdk_screen_get_root_window(screen); + } + if (GDK_WINDOW_DESTROYED(window)) + return; + + XWarpPointer(GDK_WINDOW_XDISPLAY(window), None, GDK_WINDOW_XID(window), + 0, 0, 0, 0, x, y); +} +#endif /* GTK_MAJOR_VERSION == 1 */ diff --git a/x11/mouse.h b/x11/mouse.h new file mode 100644 index 0000000..af8c359 --- /dev/null +++ b/x11/mouse.h @@ -0,0 +1,17 @@ +#ifndef _winx68k_mouse +#define _winx68k_mouse + +#include "common.h" + +extern int MousePosX; +extern int MousePosY; +extern BYTE MouseStat; +extern BYTE MouseSW; + +void Mouse_Init(void); +void Mouse_Event(DWORD wparam, DWORD lparam); +void Mouse_SetData(void); +void Mouse_StartCapture(int flag); +void Mouse_ChangePos(void); + +#endif //_winx68k_mouse diff --git a/x11/nasm.h b/x11/nasm.h new file mode 100644 index 0000000..b4e6451 --- /dev/null +++ b/x11/nasm.h @@ -0,0 +1,178 @@ + +; Copyright (C) 1999 URURI + +; nasm用マクロ +; 1999/08/21 作成 +; 1999/10/10 幾つか追加 +; 1999/10/27 aout対応 +; 1999/11/07 pushf, popf のNASMのバグ対応 +; 1999/12/02 for BCC ( Thanks to Miquel ) + +; for Windows Visual C++ -> define WIN32 +; Borland or cygwin -> WIN32 and COFF +; for FreeBSD 2.x -> AOUT +; for TownsOS -> __tos__ +; otherwise -> none + +;名前の付け方 + +BITS 32 + +%ifdef WIN32 + %define _NAMING + %define segment_code segment .text align=16 class=CODE use32 + %define segment_data segment .data align=16 class=DATA use32 +%ifdef __BORLANDC__ + %define segment_bss segment .data align=16 class=DATA use32 +%else + %define segment_bss segment .bss align=16 class=DATA use32 +%endif +%elifdef AOUT + %define _NAMING + %define segment_code segment .text + %define segment_data segment .data + %define segment_bss segment .bss +%else + %define segment_code segment .text align=16 class=CODE use32 + %define segment_data segment .data align=16 class=DATA use32 + %define segment_bss segment .bss align=16 class=DATA use32 +%endif + +%ifdef __tos__ +group CGROUP text +group DGROUP data +%endif + +;単精度浮動小数点形式 + +%idefine float dword +%idefine fsize 4 +%idefine fsizen(a) (fsize*(a)) + +;ワード形式 + +%idefine wsize 2 +%idefine wsizen(a) (wsize*(a)) +%idefine dwsize 4 +%idefine dwsizen(a) (dwsize*(a)) + +;REG + +%define r0 eax +%define r1 ebx +%define r2 ecx +%define r3 edx +%define r4 esi +%define r5 edi +%define r6 ebp +%define r7 esp + +;MMX,3DNow!,SSE + +%define pmov movq +%define pmovd movd + +%define pupldq punpckldq +%define puphdq punpckhdq +%define puplwd punpcklwd +%define puphwd punpckhwd + +%define xm0 xmm0 +%define xm1 xmm1 +%define xm2 xmm2 +%define xm3 xmm3 +%define xm4 xmm4 +%define xm5 xmm5 +%define xm6 xmm6 +%define xm7 xmm7 + +;シャッフル用の4進マクロ + +%define R4(a,b,c,d) (a*64+b*16+c*4+d) + +;Cライクな簡易マクロ + +%imacro globaldef 1 + %ifdef _NAMING + %define %1 _%1 + %endif + global %1 +%endmacro + +%imacro externdef 1 + %ifdef _NAMING + %define %1 _%1 + %endif + extern %1 +%endmacro + +%imacro proc 1 + %push proc + %ifdef _NAMING + global _%1 + %else + global %1 + %endif + + align 32 +%1: +_%1: + + %assign %$STACK 0 + %assign %$STACKN 0 + %assign %$ARG 4 +%endmacro + +%imacro endproc 0 + %ifnctx proc + %error expected 'proc' before 'endproc'. + %else + %if %$STACK > 0 + add esp, %$STACK + %endif + + %if %$STACK <> (-%$STACKN) + %error STACKLEVEL mismatch check 'local', 'alloc', 'pushd', 'popd' + %endif + + ret + %pop + %endif +%endmacro + +%idefine sp(a) esp+%$STACK+a + +%imacro arg 1 + %00 equ %$ARG + %assign %$ARG %$ARG+%1 +%endmacro + +%imacro local 1 + %assign %$STACKN %$STACKN-%1 + %00 equ %$STACKN +%endmacro + +%imacro alloc 0 + sub esp, (-%$STACKN)-%$STACK + %assign %$STACK (-%$STACKN) +%endmacro + +%imacro pushd 1-* + %rep %0 + push %1 + %assign %$STACK %$STACK+4 + %rotate 1 + %endrep +%endmacro + +%imacro popd 1-* + %rep %0 + %rotate -1 + pop %1 + %assign %$STACK %$STACK-4 + %endrep +%endmacro + +; bug of NASM-0.98 +%define pushf db 0x66, 0x9C +%define popf db 0x66, 0x9D diff --git a/x11/prop.c b/x11/prop.c new file mode 100644 index 0000000..12b1974 --- /dev/null +++ b/x11/prop.c @@ -0,0 +1,1294 @@ +/* $Id: prop.c,v 1.4 2008/11/17 12:02:08 nonaka Exp $ */ + +/* + * Copyright (c) 2003 NONAKA Kimihiro + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* -------------------------------------------------------------------------- * + * PROP.C - 各種設定用プロパティシートと設定値管理 * + * -------------------------------------------------------------------------- */ + +#include + +#include "common.h" +#include "winx68k.h" +#include "keyboard.h" +#include "fileio.h" +#include "prop.h" + +BYTE LastCode = 0; +BYTE KEYCONFFILE[] = "xkeyconf.dat"; + +int CurrentHDDNo = 0; + +BYTE ini_title[] = "WinX68k"; + +static const char MIDI_TYPE_NAME[4][3] = { + "LA", "GM", "GS", "XG" +}; + +BYTE KeyTableBk[512]; + +Win68Conf Config; +Win68Conf ConfBk; + +#ifndef MAX_BUTTON +#define MAX_BUTTON 32 +#endif + +extern char filepath[MAX_PATH]; +extern char winx68k_ini[MAX_PATH]; +extern int winx, winy; +extern char joyname[2][MAX_PATH]; +extern char joybtnname[2][MAX_BUTTON][MAX_PATH]; +extern BYTE joybtnnum[2]; +extern BYTE FrameRate; + +#define CFGLEN MAX_PATH + +#if 0 +static long solveHEX(char *str) { + + long ret; + int i; + char c; + + ret = 0; + for (i=0; i<8; i++) { + c = *str++; + if ((c >= '0') && (c <= '9')) { + c -= '0'; + } + else if ((c >= 'A') && (c <= 'F')) { + c -= '7'; + } + else if ((c >= 'a') && (c <= 'f')) { + c -= 'W'; + } + else { + break; + } + ret <<= 4; + ret += (long) c; + } + return(ret); +} +#endif + +static char *makeBOOL(BYTE value) { + + if (value) { + return("true"); + } + return("false"); +} + +static BYTE Aacmp(char *cmp, char *str) { + + char p; + + while(*str) { + p = *cmp++; + if (!p) { + break; + } + if (p >= 'a' && p <= 'z') { + p -= 0x20; + } + if (p != *str++) { + return(-1); + } + } + return(0); +} + +static BYTE solveBOOL(char *str) { + + if ((!Aacmp(str, "TRUE")) || (!Aacmp(str, "ON")) || + (!Aacmp(str, "+")) || (!Aacmp(str, "1")) || + (!Aacmp(str, "ENABLE"))) { + return(1); + } + return(0); +} + +int +set_modulepath(char *path, size_t len) +{ + struct stat sb; + char *homepath; + + homepath = getenv("HOME"); + if (homepath == 0) + homepath = "."; + + g_snprintf(path, len, "%s/%s", homepath, ".keropi"); + if (stat(path, &sb) < 0) { + if (mkdir(path, 0700) < 0) { + perror(path); + return 1; + } + } else { + if ((sb.st_mode & S_IFDIR) == 0) { + fprintf(stderr, "%s isn't directory.\n", path); + return 1; + } + } + g_snprintf(winx68k_ini, sizeof(winx68k_ini), "%s/%s", path, "config"); + if (stat(winx68k_ini, &sb) >= 0) { + if (sb.st_mode & S_IFDIR) { + fprintf(stderr, "%s is directory.\n", winx68k_ini); + return 1; + } + } + + return 0; +} + +void LoadConfig(void) +{ + int i, j; + char buf[CFGLEN]; + FILEH fp; + + winx = GetPrivateProfileInt(ini_title, "WinPosX", 0, winx68k_ini); + winy = GetPrivateProfileInt(ini_title, "WinPosY", 0, winx68k_ini); + + FrameRate = (BYTE)GetPrivateProfileInt(ini_title, "FrameRate", 7, winx68k_ini); + if (!FrameRate) FrameRate=7; + GetPrivateProfileString(ini_title, "StartDir", "", buf, MAX_PATH, winx68k_ini); + if (buf[0] != 0) + strncpy(filepath, buf, sizeof(filepath)); + else + filepath[0] = 0; + + Config.OPM_VOL = GetPrivateProfileInt(ini_title, "OPM_Volume", 12, winx68k_ini); + Config.PCM_VOL = GetPrivateProfileInt(ini_title, "PCM_Volume", 15, winx68k_ini); + Config.MCR_VOL = GetPrivateProfileInt(ini_title, "MCR_Volume", 13, winx68k_ini); + Config.SampleRate = GetPrivateProfileInt(ini_title, "SampleRate", 0, winx68k_ini); + Config.BufferSize = GetPrivateProfileInt(ini_title, "BufferSize", 50, winx68k_ini); + + Config.MouseSpeed = GetPrivateProfileInt(ini_title, "MouseSpeed", 10, winx68k_ini); + + GetPrivateProfileString(ini_title, "FDDStatWin", "1", buf, CFGLEN, winx68k_ini); + Config.WindowFDDStat = solveBOOL(buf); + GetPrivateProfileString(ini_title, "FDDStatFullScr", "1", buf, CFGLEN, winx68k_ini); + Config.FullScrFDDStat = solveBOOL(buf); + + GetPrivateProfileString(ini_title, "DSAlert", "1", buf, CFGLEN, winx68k_ini); + Config.DSAlert = solveBOOL(buf); + GetPrivateProfileString(ini_title, "SoundLPF", "1", buf, CFGLEN, winx68k_ini); + Config.Sound_LPF = solveBOOL(buf); + GetPrivateProfileString(ini_title, "UseRomeo", "0", buf, CFGLEN, winx68k_ini); + Config.SoundROMEO = solveBOOL(buf); + GetPrivateProfileString(ini_title, "MIDI_SW", "1", buf, CFGLEN, winx68k_ini); + Config.MIDI_SW = solveBOOL(buf); + GetPrivateProfileString(ini_title, "MIDI_Reset", "0", buf, CFGLEN, winx68k_ini); + Config.MIDI_Reset = solveBOOL(buf); + Config.MIDI_Type = GetPrivateProfileInt(ini_title, "MIDI_Type", 1, winx68k_ini); + + GetPrivateProfileString(ini_title, "JoySwap", "0", buf, CFGLEN, winx68k_ini); + Config.JoySwap = solveBOOL(buf); + + GetPrivateProfileString(ini_title, "JoyKey", "0", buf, CFGLEN, winx68k_ini); + Config.JoyKey = solveBOOL(buf); + GetPrivateProfileString(ini_title, "JoyKeyReverse", "0", buf, CFGLEN, winx68k_ini); + Config.JoyKeyReverse = solveBOOL(buf); + GetPrivateProfileString(ini_title, "JoyKeyJoy2", "0", buf, CFGLEN, winx68k_ini); + Config.JoyKeyJoy2 = solveBOOL(buf); + GetPrivateProfileString(ini_title, "SRAMBootWarning", "1", buf, CFGLEN, winx68k_ini); + Config.SRAMWarning = solveBOOL(buf); + + GetPrivateProfileString(ini_title, "WinDrvLFN", "1", buf, CFGLEN, winx68k_ini); + Config.LongFileName = solveBOOL(buf); + GetPrivateProfileString(ini_title, "WinDrvFDD", "1", buf, CFGLEN, winx68k_ini); + Config.WinDrvFD = solveBOOL(buf); + + Config.WinStrech = GetPrivateProfileInt(ini_title, "WinStretch", 1, winx68k_ini); + + GetPrivateProfileString(ini_title, "DSMixing", "0", buf, CFGLEN, winx68k_ini); + Config.DSMixing = solveBOOL(buf); + + Config.XVIMode = (BYTE)GetPrivateProfileInt(ini_title, "XVIMode", 0, winx68k_ini); + + GetPrivateProfileString(ini_title, "CDROM_ASPI", "1", buf, CFGLEN, winx68k_ini); + Config.CDROM_ASPI = solveBOOL(buf); + Config.CDROM_SCSIID = (BYTE)GetPrivateProfileInt(ini_title, "CDROM_SCSIID", 6, winx68k_ini); + Config.CDROM_ASPI_Drive = (BYTE)GetPrivateProfileInt(ini_title, "CDROM_ASPIDrv", 0, winx68k_ini); + Config.CDROM_IOCTRL_Drive = (BYTE)GetPrivateProfileInt(ini_title, "CDROM_CTRLDrv", 16, winx68k_ini); + GetPrivateProfileString(ini_title, "CDROM_Enable", "1", buf, CFGLEN, winx68k_ini); + Config.CDROM_Enable = solveBOOL(buf); + + GetPrivateProfileString(ini_title, "SSTP_Enable", "0", buf, CFGLEN, winx68k_ini); + Config.SSTP_Enable = solveBOOL(buf); + Config.SSTP_Port = GetPrivateProfileInt(ini_title, "SSTP_Port", 11000, winx68k_ini); + + GetPrivateProfileString(ini_title, "ToneMapping", "0", buf, CFGLEN, winx68k_ini); + Config.ToneMap = solveBOOL(buf); + GetPrivateProfileString(ini_title, "ToneMapFile", "", buf, MAX_PATH, winx68k_ini); + if (buf[0] != 0) + strcpy(Config.ToneMapFile, buf); + else + Config.ToneMapFile[0] = 0; + + Config.MIDIDelay = GetPrivateProfileInt(ini_title, "MIDIDelay", Config.BufferSize*5, winx68k_ini); + Config.MIDIAutoDelay = GetPrivateProfileInt(ini_title, "MIDIAutoDelay", 1, winx68k_ini); + + for (i=0; i<2; i++) + { + for (j=0; j<8; j++) + { + sprintf(buf, "Joy%dButton%d", i+1, j+1); + Config.JOY_BTN[i][j] = GetPrivateProfileInt(ini_title, buf, j, winx68k_ini); + } + } + + for (i=0; i<16; i++) + { + sprintf(buf, "HDD%d", i); + GetPrivateProfileString(ini_title, buf, "", Config.HDImage[i], MAX_PATH, winx68k_ini); + } + + fp = File_OpenCurDir(KEYCONFFILE); + if (fp) + { + File_Read(fp, KeyTable, 512); + File_Close(fp); + } +} + + +void SaveConfig(void) +{ + int i, j; + char buf[CFGLEN], buf2[CFGLEN]; + FILEH fp; + + wsprintf(buf, "%d", winx); + WritePrivateProfileString(ini_title, "WinPosX", buf, winx68k_ini); + wsprintf(buf, "%d", winy); + WritePrivateProfileString(ini_title, "WinPosY", buf, winx68k_ini); + wsprintf(buf, "%d", FrameRate); + WritePrivateProfileString(ini_title, "FrameRate", buf, winx68k_ini); + WritePrivateProfileString(ini_title, "StartDir", filepath, winx68k_ini); + + wsprintf(buf, "%d", Config.OPM_VOL); + WritePrivateProfileString(ini_title, "OPM_Volume", buf, winx68k_ini); + wsprintf(buf, "%d", Config.PCM_VOL); + WritePrivateProfileString(ini_title, "PCM_Volume", buf, winx68k_ini); + wsprintf(buf, "%d", Config.MCR_VOL); + WritePrivateProfileString(ini_title, "MCR_Volume", buf, winx68k_ini); + wsprintf(buf, "%d", Config.SampleRate); + WritePrivateProfileString(ini_title, "SampleRate", buf, winx68k_ini); + wsprintf(buf, "%d", Config.BufferSize); + WritePrivateProfileString(ini_title, "BufferSize", buf, winx68k_ini); + + wsprintf(buf, "%d", Config.MouseSpeed); + WritePrivateProfileString(ini_title, "MouseSpeed", buf, winx68k_ini); + + WritePrivateProfileString(ini_title, "FDDStatWin", makeBOOL((BYTE)Config.WindowFDDStat), winx68k_ini); + WritePrivateProfileString(ini_title, "FDDStatFullScr", makeBOOL((BYTE)Config.FullScrFDDStat), winx68k_ini); + + WritePrivateProfileString(ini_title, "DSAlert", makeBOOL((BYTE)Config.DSAlert), winx68k_ini); + WritePrivateProfileString(ini_title, "SoundLPF", makeBOOL((BYTE)Config.Sound_LPF), winx68k_ini); + WritePrivateProfileString(ini_title, "UseRomeo", makeBOOL((BYTE)Config.SoundROMEO), winx68k_ini); + WritePrivateProfileString(ini_title, "MIDI_SW", makeBOOL((BYTE)Config.MIDI_SW), winx68k_ini); + WritePrivateProfileString(ini_title, "MIDI_Reset", makeBOOL((BYTE)Config.MIDI_Reset), winx68k_ini); + wsprintf(buf, "%d", Config.MIDI_Type); + WritePrivateProfileString(ini_title, "MIDI_Type", buf, winx68k_ini); + + WritePrivateProfileString(ini_title, "JoySwap", makeBOOL((BYTE)Config.JoySwap), winx68k_ini); + + WritePrivateProfileString(ini_title, "JoyKey", makeBOOL((BYTE)Config.JoyKey), winx68k_ini); + WritePrivateProfileString(ini_title, "JoyKeyReverse", makeBOOL((BYTE)Config.JoyKeyReverse), winx68k_ini); + WritePrivateProfileString(ini_title, "JoyKeyJoy2", makeBOOL((BYTE)Config.JoyKeyJoy2), winx68k_ini); + WritePrivateProfileString(ini_title, "SRAMBootWarning", makeBOOL((BYTE)Config.SRAMWarning), winx68k_ini); + + WritePrivateProfileString(ini_title, "WinDrvLFN", makeBOOL((BYTE)Config.LongFileName), winx68k_ini); + WritePrivateProfileString(ini_title, "WinDrvFDD", makeBOOL((BYTE)Config.WinDrvFD), winx68k_ini); + + wsprintf(buf, "%d", Config.WinStrech); + WritePrivateProfileString(ini_title, "WinStretch", buf, winx68k_ini); + + WritePrivateProfileString(ini_title, "DSMixing", makeBOOL((BYTE)Config.DSMixing), winx68k_ini); + + wsprintf(buf, "%d", Config.XVIMode); + WritePrivateProfileString(ini_title, "XVIMode", buf, winx68k_ini); + + WritePrivateProfileString(ini_title, "CDROM_ASPI", makeBOOL((BYTE)Config.CDROM_ASPI), winx68k_ini); + wsprintf(buf, "%d", Config.CDROM_SCSIID); + WritePrivateProfileString(ini_title, "CDROM_SCSIID", buf, winx68k_ini); + wsprintf(buf, "%d", Config.CDROM_ASPI_Drive); + WritePrivateProfileString(ini_title, "CDROM_ASPIDrv", buf, winx68k_ini); + wsprintf(buf, "%d", Config.CDROM_IOCTRL_Drive); + WritePrivateProfileString(ini_title, "CDROM_CTRLDrv", buf, winx68k_ini); + WritePrivateProfileString(ini_title, "CDROM_Enable", makeBOOL((BYTE)Config.CDROM_Enable), winx68k_ini); + + WritePrivateProfileString(ini_title, "SSTP_Enable", makeBOOL((BYTE)Config.SSTP_Enable), winx68k_ini); + wsprintf(buf, "%d", Config.SSTP_Port); + WritePrivateProfileString(ini_title, "SSTP_Port", buf, winx68k_ini); + + WritePrivateProfileString(ini_title, "ToneMapping", makeBOOL((BYTE)Config.ToneMap), winx68k_ini); + WritePrivateProfileString(ini_title, "ToneMapFile", Config.ToneMapFile, winx68k_ini); + + wsprintf(buf, "%d", Config.MIDIDelay); + WritePrivateProfileString(ini_title, "MIDIDelay", buf, winx68k_ini); + WritePrivateProfileString(ini_title, "MIDIAutoDelay", makeBOOL((BYTE)Config.MIDIAutoDelay), winx68k_ini); + + for (i=0; i<2; i++) + { + for (j=0; j<8; j++) + { + sprintf(buf, "Joy%dButton%d", i+1, j+1); + wsprintf(buf2, "%d", Config.JOY_BTN[i][j]); + WritePrivateProfileString(ini_title, buf, buf2, winx68k_ini); + } + } + + for (i=0; i<16; i++) + { + sprintf(buf, "HDD%d", i); + WritePrivateProfileString(ini_title, buf, Config.HDImage[i], winx68k_ini); + } + + fp = File_OpenCurDir(KEYCONFFILE); + if (!fp) + fp = File_CreateCurDir(KEYCONFFILE, FTYPE_TEXT); + if (fp) + { + File_Write(fp, KeyTable, 512); + File_Close(fp); + } +} + + +/* --------------- */ + +typedef struct { + GtkWidget *fs; + int type; + void *arg; +} file_selection_t; + +static void file_selection_ok(GtkWidget *w, GtkFileSelection *gfs); +static void file_selection_destroy(GtkWidget *w, GtkWidget **wp); +static void file_selection(int type, char *title, char *defstr, void *arg); + +static Win68Conf ConfigProp; + +static GtkWidget *create_sound_note(void); +static GtkWidget *create_midi_note(void); +static GtkWidget *create_mouse_note(void); +static GtkWidget *create_others_note(void); + +static void +dialog_destroy(GtkWidget *w, GtkWidget **wp) +{ + + UNUSED(wp); + + gtk_widget_destroy(w); + install_idle_process(); +} + +/* + * Config dialog + */ +static void config_ok_button_clicked(GtkButton *b, gpointer d); +static void config_accept_button_clicked(GtkButton *b, gpointer d); + +void +PropPage_Init(void) +{ + GtkWidget *dialog; + GtkWidget *dialog_table; + GtkWidget *notebook; + GtkWidget *note; + GtkWidget *ok_button; + GtkWidget *cancel_button; + GtkWidget *accept_button; + + uninstall_idle_process(); + + ConfigProp = Config; + + dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_title(GTK_WINDOW(dialog), "Configure Keropi"); + gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); + gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); + gtk_signal_connect(GTK_OBJECT(dialog), "destroy", + GTK_SIGNAL_FUNC(dialog_destroy), NULL); + + dialog_table = gtk_table_new(10, 4, FALSE); + gtk_container_add(GTK_CONTAINER(dialog), dialog_table); + gtk_widget_show(dialog_table); + + /* notebook */ + notebook = gtk_notebook_new(); + gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook), GTK_POS_TOP); + gtk_notebook_set_scrollable(GTK_NOTEBOOK(notebook), TRUE); + gtk_table_attach_defaults(GTK_TABLE(dialog_table),notebook, 0, 4, 0, 9); + gtk_widget_show(notebook); + + /* Sound note */ + note = create_sound_note(); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), note, + gtk_label_new("Sound")); + gtk_widget_show(note); + + /* MIDI note */ + note = create_midi_note(); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), note, + gtk_label_new("MIDI")); + gtk_widget_show(note); + + /* Keyboard note */ + /* Joystick1 note */ + /* Joystick2 note */ + + /* Mouse note */ + note = create_mouse_note(); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), note, + gtk_label_new("Mouse")); + gtk_widget_show(note); + + /* SCSI note */ + + /* Others note */ + note = create_others_note(); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), note, + gtk_label_new("Others")); + gtk_widget_show(note); + + /* ページ下部ボタン */ + ok_button = gtk_button_new_with_label("OK"); + gtk_table_attach_defaults(GTK_TABLE(dialog_table), ok_button, + 1, 2, 9, 10); + gtk_signal_connect(GTK_OBJECT(ok_button), "clicked", + GTK_SIGNAL_FUNC(config_ok_button_clicked), dialog); + GTK_WIDGET_SET_FLAGS(ok_button, GTK_CAN_DEFAULT); + GTK_WIDGET_SET_FLAGS(ok_button, GTK_HAS_DEFAULT); + gtk_widget_grab_default(ok_button); + gtk_widget_show(ok_button); + + cancel_button = gtk_button_new_with_label("Cancel"); + gtk_container_set_border_width(GTK_CONTAINER(cancel_button), 5); + gtk_table_attach_defaults(GTK_TABLE(dialog_table), cancel_button, + 2, 3, 9, 10); + gtk_signal_connect_object(GTK_OBJECT(cancel_button), "clicked", + GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(dialog)); + gtk_widget_show(cancel_button); + + accept_button = gtk_button_new_with_label("Accept"); + gtk_container_set_border_width(GTK_CONTAINER(accept_button), 5); + gtk_table_attach_defaults(GTK_TABLE(dialog_table), accept_button, + 3, 4, 9, 10); + gtk_signal_connect(GTK_OBJECT(accept_button), "clicked", + GTK_SIGNAL_FUNC(config_accept_button_clicked), dialog); + gtk_widget_show(accept_button); + + gtk_widget_show(dialog); +} + +static void +config_ok_button_clicked(GtkButton *b, gpointer d) +{ + + (void)b; + + Config = ConfigProp; + gtk_widget_destroy(GTK_WIDGET(d)); +} + +static void +config_accept_button_clicked(GtkButton *b, gpointer d) +{ + + (void)b; + (void)d; + + Config = ConfigProp; +} + +/* + * Sound note + */ +static void sample_rate_button_clicked(GtkButton *b, gpointer d); +static void adpcm_lpf_button_clicked(GtkButton *b, gpointer d); +static void vol_adj_value_changed(GtkAdjustment *adj, gpointer d); + +static const struct { + const char *str; + DWORD rate; +} sample_rate[] = { + { "No Sound", 0 }, + { "11kHz", 11025 }, + { "22kHz", 22050 }, + { "44kHz", 44100 }, + { "48kHz", 48000 }, +}; + +static const struct { + const char *name; + gfloat value; + gfloat min; + gfloat max; + size_t offset; +} sound_right_frame[] = { + { "Buffer size", 500.0, 20.0,1000.0, offsetof(Win68Conf,BufferSize) }, + { "ADPCM volume", 15.0, 0.0, 16.0, offsetof(Win68Conf,PCM_VOL) }, + { "OPM volume", 12.0, 0.0, 16.0, offsetof(Win68Conf,OPM_VOL) }, + { "Mercury volume", 13.0, 0.0, 16.0, offsetof(Win68Conf,MCR_VOL) }, +}; + +static GtkWidget * +create_sound_note(void) +{ + GtkWidget *main_vbox; + GtkWidget *hbox; + GtkWidget *vbox; + GtkWidget *frame; + GtkWidget *button[NELEMENTS(sample_rate)]; + GSList *gslist; + int i; + + main_vbox = gtk_vbox_new(FALSE, 2); + + hbox = gtk_hbox_new(FALSE, 2); + gtk_box_pack_start(GTK_BOX(main_vbox), hbox, FALSE, FALSE, 10); + gtk_widget_show(hbox); + + frame = gtk_frame_new("Sample rate"); + gtk_container_set_border_width(GTK_CONTAINER(frame), 5); + gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, FALSE, 0); + gtk_widget_show(frame); + + vbox = gtk_vbox_new(FALSE, 5); + gtk_container_add(GTK_CONTAINER(frame), vbox); + gtk_widget_show(vbox); + + /* Sample rate */ + for (gslist = 0, i = 0; i < NELEMENTS(sample_rate); ++i) { + button[i] = gtk_radio_button_new_with_label(gslist, + sample_rate[i].str); + GTK_WIDGET_UNSET_FLAGS(button[i], GTK_CAN_FOCUS); + gslist = gtk_radio_button_group(GTK_RADIO_BUTTON(button[i])); + gtk_box_pack_start(GTK_BOX(vbox), button[i], FALSE, FALSE, 0); + gtk_signal_connect(GTK_OBJECT(button[i]), "clicked", + GTK_SIGNAL_FUNC(sample_rate_button_clicked), + (gpointer)sample_rate[i].rate); + gtk_widget_show(button[i]); + } + for (i = 0; i < NELEMENTS(sample_rate); ++i) { + if (sample_rate[i].rate == Config.SampleRate) + break; + } + if (i == NELEMENTS(sample_rate)) + i = 0; + gtk_signal_emit_by_name(GTK_OBJECT(button[i]), "clicked"); + + vbox = gtk_vbox_new(FALSE, 4); + gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 10); + gtk_widget_show(vbox); + + for (i = 0; i < NELEMENTS(sound_right_frame); ++i) { + GtkObject *adjust; + GtkWidget *hscale; + GtkWidget *align; + + frame = gtk_frame_new(sound_right_frame[i].name); + gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); + gtk_widget_show(frame); + + align = gtk_alignment_new(0.5, 0.5, 0.9, 0.9); + gtk_container_add(GTK_CONTAINER(frame), align); + gtk_widget_show(align); + + adjust = gtk_adjustment_new(sound_right_frame[i].value, + sound_right_frame[i].min, sound_right_frame[i].max, + 1.0, 0.0, 0.0); + hscale = gtk_hscale_new(GTK_ADJUSTMENT(adjust)); + gtk_scale_set_value_pos(GTK_SCALE(hscale), GTK_POS_RIGHT); + gtk_scale_set_digits(GTK_SCALE(hscale), 0); + gtk_container_add(GTK_CONTAINER(align), hscale); + gtk_signal_connect(GTK_OBJECT(adjust), "value_changed", + GTK_SIGNAL_FUNC(vol_adj_value_changed),(gpointer)i); + gtk_widget_show(hscale); + if (i == 0) + gtk_adjustment_set_value(GTK_ADJUSTMENT(adjust), + Config.BufferSize); + else { + int *p = (int *)(((char *)&Config) + sound_right_frame[i].offset); + gtk_adjustment_set_value(GTK_ADJUSTMENT(adjust), *p); + } + } + + button[0] = gtk_check_button_new_with_label("Enable ADPCM LPF"); + gtk_container_set_border_width(GTK_CONTAINER(button[0]), 5); + gtk_box_pack_start(GTK_BOX(main_vbox), button[0], TRUE, TRUE, 0); + gtk_signal_connect(GTK_OBJECT(button[0]), "clicked", + GTK_SIGNAL_FUNC(adpcm_lpf_button_clicked), 0); + gtk_widget_show(button[0]); + if (Config.Sound_LPF) + gtk_signal_emit_by_name(GTK_OBJECT(button[0]), "clicked"); + + return main_vbox; +} + +static void +sample_rate_button_clicked(GtkButton *b, gpointer d) +{ + + UNUSED(b); + + ConfigProp.SampleRate = (DWORD)((long)d); +} + +static void +adpcm_lpf_button_clicked(GtkButton *b, gpointer d) +{ + + UNUSED(d); + + ConfigProp.Sound_LPF = GTK_TOGGLE_BUTTON(b)->active; +} + +static void +vol_adj_value_changed(GtkAdjustment *adj, gpointer d) +{ + int val = (int)(GTK_ADJUSTMENT(adj)->value); + int idx = (int)(long)d; + size_t offset = sound_right_frame[idx].offset; + + if (idx == 0) + ConfigProp.BufferSize = (DWORD)val; + else { + int *p = (int *)(((char *)&ConfigProp) + offset); + *p = val; + } +} + +/* + * Midi note + */ +static void midi_enable_button_clicked(GtkButton *b, gpointer d); +static void midi_send_reset_button_clicked(GtkButton *b, gpointer d); +static void midi_mimpi_browse_button_clicked(GtkButton *b, gpointer d); +static void midi_mimpi_button_clicked(GtkButton *b, gpointer d); +static void midi_init_entry_changed(GtkEditable *e, gpointer d); + +typedef struct { + GtkWidget *init_combo; + GtkWidget *init_label; + GtkWidget *reset_button; + GtkWidget *mimpi_button; + GtkWidget *mimpi_entry; + GtkWidget *mimpi_browse_button; +} midi_init_item_t; + +static GtkWidget * +create_midi_note(void) +{ + GtkWidget *vbox; + GtkWidget *button; + GtkWidget *enable_button; + GtkWidget *mimpi_button; + GtkWidget *label; + GtkWidget *combo; + GtkWidget *entry; + GtkWidget *hbox; + static midi_init_item_t mii; + GList *items; + int i; + + vbox = gtk_vbox_new(FALSE, 4); + + hbox = gtk_hbox_new(FALSE, 3); + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); + gtk_widget_show(hbox); + + enable_button = gtk_check_button_new_with_label( + "Enable MIDI"); + gtk_container_set_border_width(GTK_CONTAINER(enable_button), 5); + gtk_box_pack_start(GTK_BOX(hbox), enable_button, FALSE, FALSE, 0); + gtk_widget_show(enable_button); + + mii.init_combo = combo = gtk_combo_new(); + gtk_container_set_border_width(GTK_CONTAINER(combo), 5); + gtk_combo_set_value_in_list(GTK_COMBO(combo), TRUE, TRUE); + gtk_combo_set_use_arrows_always(GTK_COMBO(combo), TRUE); + for (items = 0, i = 0; i < NELEMENTS(MIDI_TYPE_NAME); ++i) + items = g_list_append(items, (gpointer)MIDI_TYPE_NAME[i]); + gtk_combo_set_popdown_strings(GTK_COMBO(combo), items); + g_list_free(items); + gtk_box_pack_end(GTK_BOX(hbox), combo, FALSE, FALSE, 0); + gtk_widget_show(combo); + + entry = GTK_COMBO(combo)->entry; + gtk_entry_set_editable(GTK_ENTRY(entry), FALSE); + gtk_signal_connect(GTK_OBJECT(entry), "changed", + GTK_SIGNAL_FUNC(midi_init_entry_changed), 0); + gtk_widget_show(entry); + + mii.init_label = label = gtk_label_new( + "- MIDI initialized method:"); + gtk_box_pack_end(GTK_BOX(hbox), label, TRUE, TRUE, 0); + gtk_widget_show(label); + + mii.reset_button = button = gtk_check_button_new_with_label( + "Send initialize command when X68k is reseted"); + gtk_container_set_border_width(GTK_CONTAINER(button), 5); + gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0); + gtk_signal_connect(GTK_OBJECT(button), "clicked", + GTK_SIGNAL_FUNC(midi_send_reset_button_clicked), 0); + gtk_widget_show(button); + if (Config.MIDI_Reset) + gtk_signal_emit_by_name(GTK_OBJECT(button), "clicked"); + + mii.mimpi_button = mimpi_button = gtk_check_button_new_with_label( + "Use MIMPI tone map"); + gtk_container_set_border_width(GTK_CONTAINER(mimpi_button), 5); + gtk_box_pack_start(GTK_BOX(vbox), mimpi_button, FALSE, FALSE, 0); + gtk_widget_show(mimpi_button); + + hbox = gtk_hbox_new(FALSE, 5); + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); + gtk_widget_show(hbox); + + mii.mimpi_entry = entry = gtk_entry_new(); + gtk_entry_set_max_length(GTK_ENTRY(entry), MAX_PATH - 1); + gtk_entry_set_editable(GTK_ENTRY(entry), FALSE); + gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 10); + gtk_widget_show(entry); + + mii.mimpi_browse_button = button = gtk_button_new_with_label( + "Browse..."); + gtk_container_set_border_width(GTK_CONTAINER(button), 5); + gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); + gtk_signal_connect(GTK_OBJECT(button), "clicked", + GTK_SIGNAL_FUNC(midi_mimpi_browse_button_clicked), + (gpointer)&mii); + gtk_widget_show(button); + + /* MIMPI ToneMap */ + gtk_signal_connect(GTK_OBJECT(mimpi_button), "clicked", + GTK_SIGNAL_FUNC(midi_mimpi_button_clicked), + (gpointer)&mii); + if (!Config.ToneMap) + gtk_signal_emit_by_name(GTK_OBJECT(mimpi_button), "clicked"); + gtk_signal_emit_by_name(GTK_OBJECT(mimpi_button), "clicked"); + + /* Enable MIDI */ + gtk_signal_connect(GTK_OBJECT(enable_button), "clicked", + GTK_SIGNAL_FUNC(midi_enable_button_clicked), + (gpointer)&mii); + if (!Config.MIDI_SW) + gtk_signal_emit_by_name(GTK_OBJECT(enable_button), "clicked"); + gtk_signal_emit_by_name(GTK_OBJECT(enable_button), "clicked"); + + return vbox; +} + +static void +midi_enable_button_clicked(GtkButton *b, gpointer d) +{ + midi_init_item_t *mii = (midi_init_item_t *)d; + + ConfigProp.MIDI_SW = GTK_TOGGLE_BUTTON(b)->active; + + if (ConfigProp.MIDI_SW) { + gtk_widget_set_sensitive(mii->init_combo, TRUE); + gtk_widget_set_sensitive(mii->init_label, TRUE); + gtk_widget_set_sensitive(mii->reset_button, TRUE); + gtk_widget_set_sensitive(mii->mimpi_button, TRUE); + if (ConfigProp.ToneMap) { + gtk_widget_set_sensitive(mii->mimpi_entry, TRUE); + gtk_widget_set_sensitive(mii->mimpi_browse_button,TRUE); + } + } else { + gtk_widget_set_sensitive(mii->init_combo, FALSE); + gtk_widget_set_sensitive(mii->init_label, FALSE); + gtk_widget_set_sensitive(mii->reset_button, FALSE); + gtk_widget_set_sensitive(mii->mimpi_button, FALSE); + gtk_widget_set_sensitive(mii->mimpi_entry, FALSE); + gtk_widget_set_sensitive(mii->mimpi_browse_button, FALSE); + } +} + +static void +midi_send_reset_button_clicked(GtkButton *b, gpointer d) +{ + + UNUSED(d); + + ConfigProp.MIDI_Reset = GTK_TOGGLE_BUTTON(b)->active; +} + +static void +midi_mimpi_browse_button_clicked(GtkButton *b, gpointer d) +{ + midi_init_item_t *mii = (midi_init_item_t *)d; + gchar *path = gtk_entry_get_text(GTK_ENTRY(mii->mimpi_entry)); + + UNUSED(b); + + file_selection(1, "MIMPI tone map", path, mii->mimpi_entry); +} + +static void +midi_mimpi_button_clicked(GtkButton *b, gpointer d) +{ + midi_init_item_t *mii = (midi_init_item_t *)d; + + ConfigProp.ToneMap = GTK_TOGGLE_BUTTON(b)->active; + if (ConfigProp.ToneMap) { + gtk_widget_set_sensitive(mii->mimpi_entry, TRUE); + gtk_widget_set_sensitive(mii->mimpi_browse_button, TRUE); + } else { + gtk_widget_set_sensitive(mii->mimpi_entry, FALSE); + gtk_widget_set_sensitive(mii->mimpi_browse_button, FALSE); + } +} + +static void +midi_init_entry_changed(GtkEditable *e, gpointer d) +{ + gchar *str; + int i; + + UNUSED(d); + + str = gtk_editable_get_chars(GTK_EDITABLE(e), 0, -1); + for (i = 0; i < NELEMENTS(MIDI_TYPE_NAME); ++i) { + if (strcmp(MIDI_TYPE_NAME[i], str) == 0) { + ConfigProp.MIDI_Type = i; + break; + } + } + g_free(str); +} + +/* + * Mouse note + */ +static void mouse_speed_rate_value_changed(GtkAdjustment *adj, gpointer d); + +static GtkWidget * +create_mouse_note(void) +{ + GtkWidget *w; + GtkWidget *frame; + GtkWidget *vbox; + GtkWidget *hbox; + GtkWidget *align; + GtkWidget *hscale; + GtkWidget *label; + GtkObject *adjust; + + w = gtk_vbox_new(FALSE, 1); + + frame = gtk_frame_new("Mouse speed"); + gtk_box_pack_start(GTK_BOX(w), frame, FALSE, FALSE, 0); + gtk_widget_show(frame); + + align = gtk_alignment_new(0.5, 0.5, 0.9, 0.9); + gtk_container_add(GTK_CONTAINER(frame), align); + gtk_widget_show(align); + + vbox = gtk_vbox_new(FALSE, 2); + gtk_container_add(GTK_CONTAINER(align), vbox); + gtk_widget_show(vbox); + + adjust = gtk_adjustment_new(10.0, 1.0, 20.0, 1.0, 1.0, 0.0); + hscale = gtk_hscale_new(GTK_ADJUSTMENT(adjust)); + gtk_scale_set_draw_value(GTK_SCALE(hscale), FALSE); + gtk_box_pack_start(GTK_BOX(vbox), hscale, TRUE, TRUE, 0); + gtk_widget_show(hscale); + + hbox = gtk_hbox_new(TRUE, 3); + gtk_box_pack_end(GTK_BOX(vbox), hbox, TRUE, TRUE, 0); + gtk_widget_show(hbox); + + label = gtk_label_new("x0.1"); + gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0); + gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); + gtk_widget_show(label); + + label = gtk_label_new("x1.0"); + gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER); + gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.0); + gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); + gtk_widget_show(label); + + label = gtk_label_new("x2.0"); + gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_RIGHT); + gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.0); + gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); + gtk_widget_show(label); + + /* Mouse speed rate */ + gtk_signal_connect(GTK_OBJECT(adjust), "value_changed", + GTK_SIGNAL_FUNC(mouse_speed_rate_value_changed), 0); + gtk_adjustment_set_value(GTK_ADJUSTMENT(adjust), + (gfloat)Config.MouseSpeed); + + return w; +} + +static void +mouse_speed_rate_value_changed(GtkAdjustment *adj, gpointer d) +{ + + UNUSED(d); + + ConfigProp.MouseSpeed = (int)adj->value; + if (ConfigProp.MouseSpeed < 1) + ConfigProp.MouseSpeed = 1; + if (ConfigProp.MouseSpeed > 20) + ConfigProp.MouseSpeed = 20; +} + +/* + * Others note + */ +static void others_sasi_hdd_index_entry_changed(GtkEditable *e, gpointer d); +static void others_sasi_hdd_new_button_clicked(GtkButton *b, gpointer d); +static void others_sasi_hdd_remove_button_clicked(GtkButton *b, gpointer d); +static void others_sasi_hdd_browse_button_clicked(GtkButton *b, gpointer d); +static void others_show_fdd_status_button_clicked(GtkButton *b, gpointer d); +static void others_enable_virus_button_clicked(GtkButton *b, gpointer d); + +typedef struct { + int idx; + GtkWidget *entry; +} sasi_hdd_t; + +static GtkWidget * +create_others_note(void) +{ + static const char *sasi_drive_str[16] = { + "0", "1", "2", "3", "4", "5", "6", "7", "8", + "9", "10", "11", "12", "13", "14", "15", + }; + static sasi_hdd_t sasi_hdd = { 0, 0 }; + + GtkWidget *w; + GtkWidget *frame; + GtkWidget *align; + GtkWidget *table; + GtkWidget *label; + GtkWidget *combo; + GtkWidget *entry; + GtkWidget *button; + GList *items; + int i; + + w = gtk_vbox_new(FALSE, 3); + + frame = gtk_frame_new("HDD (SASI) Drive"); + gtk_box_pack_start(GTK_BOX(w), frame, FALSE, FALSE, 0); + gtk_widget_show(frame); + + align = gtk_alignment_new(0.5, 0.5, 0.9, 0.9); + gtk_container_add(GTK_CONTAINER(frame), align); + gtk_widget_show(align); + + table = gtk_table_new(2, 5, FALSE); + gtk_container_add(GTK_CONTAINER(align), table); + gtk_widget_show(table); + + label = gtk_label_new("Drive #:"); + gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1); + gtk_widget_show(label); + + combo = gtk_combo_new(); + gtk_combo_set_value_in_list(GTK_COMBO(combo), TRUE, TRUE); + gtk_combo_set_use_arrows_always(GTK_COMBO(combo), TRUE); + for (items = 0, i = 0; i < NELEMENTS(sasi_drive_str); ++i) + items = g_list_append(items, (gpointer)sasi_drive_str[i]); + gtk_combo_set_popdown_strings(GTK_COMBO(combo), items); + g_list_free(items); + gtk_table_attach_defaults(GTK_TABLE(table), combo, 1, 2, 0, 1); + gtk_widget_show(combo); + + entry = GTK_COMBO(combo)->entry; + gtk_entry_set_editable(GTK_ENTRY(entry), FALSE); + gtk_signal_connect(GTK_OBJECT(entry), "changed", + GTK_SIGNAL_FUNC(others_sasi_hdd_index_entry_changed), + &sasi_hdd); + gtk_widget_show(entry); + + button = gtk_button_new_with_label("Remove"); + gtk_container_set_border_width(GTK_CONTAINER(button), 5); + gtk_table_attach_defaults(GTK_TABLE(table), button, 3, 4, 0, 1); + gtk_signal_connect(GTK_OBJECT(button), "clicked", + GTK_SIGNAL_FUNC(others_sasi_hdd_remove_button_clicked), + &sasi_hdd); + gtk_widget_show(button); + + button = gtk_button_new_with_label("New"); + gtk_container_set_border_width(GTK_CONTAINER(button), 5); + gtk_table_attach_defaults(GTK_TABLE(table), button, 4, 5, 0, 1); + gtk_signal_connect(GTK_OBJECT(button), "clicked", + GTK_SIGNAL_FUNC(others_sasi_hdd_new_button_clicked), + &sasi_hdd); +#if 1 + gtk_widget_set_sensitive(button, FALSE); +#endif + gtk_widget_show(button); + + label = gtk_label_new("Filename:"); + gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2); + gtk_widget_show(label); + + sasi_hdd.entry = entry = gtk_entry_new(); + gtk_entry_set_max_length(GTK_ENTRY(entry), MAX_PATH - 1); + gtk_entry_set_editable(GTK_ENTRY(entry), FALSE); + gtk_table_attach_defaults(GTK_TABLE(table), entry, 1, 4, 1, 2); + gtk_widget_show(entry); + gtk_entry_set_text(GTK_ENTRY(entry), Config.HDImage[0]); + + button = gtk_button_new_with_label("Browse..."); + gtk_container_set_border_width(GTK_CONTAINER(button), 5); + gtk_table_attach_defaults(GTK_TABLE(table), button, 4, 5, 1, 2); + gtk_signal_connect(GTK_OBJECT(button), "clicked", + GTK_SIGNAL_FUNC(others_sasi_hdd_browse_button_clicked), + &sasi_hdd); + gtk_widget_show(button); + + button = gtk_check_button_new_with_label("Show FDD status"); + gtk_container_set_border_width(GTK_CONTAINER(button), 5); + gtk_box_pack_start(GTK_BOX(w), button, FALSE, FALSE, 0); + gtk_signal_connect(GTK_OBJECT(button), "clicked", + GTK_SIGNAL_FUNC(others_show_fdd_status_button_clicked), 0); +#if 1 + gtk_widget_set_sensitive(button, FALSE); +#else + if (Config.WindowFDDStat) + gtk_signal_emit_by_name(GTK_OBJECT(button), "clicked"); +#endif + gtk_widget_show(button); + + button = gtk_check_button_new_with_label("Enable SRAM virus warning"); + gtk_container_set_border_width(GTK_CONTAINER(button), 5); + gtk_box_pack_start(GTK_BOX(w), button, FALSE, FALSE, 0); + gtk_signal_connect(GTK_OBJECT(button), "clicked", + GTK_SIGNAL_FUNC(others_enable_virus_button_clicked), 0); + if (Config.SRAMWarning) + gtk_signal_emit_by_name(GTK_OBJECT(button), "clicked"); + gtk_widget_show(button); + + return w; +} + +static void +others_sasi_hdd_index_entry_changed(GtkEditable *e, gpointer d) +{ + sasi_hdd_t *sasi_hdd = (sasi_hdd_t *)d; + char *str; + char *ep; + + str = gtk_editable_get_chars(GTK_EDITABLE(e), 0, -1); + if (str) { + unsigned long val; + + errno = 0; + val = strtoul(str, &ep, 10); + /* Not a number */ + if (str[0] == '\0' || *ep != '\0') + val = 0; + /* Out of range */ + if (errno == ERANGE && val == ULONG_MAX) + val = 0; + sasi_hdd->idx = (int)val; + + if (sasi_hdd->idx >= 0 && sasi_hdd->idx < 16) { + gtk_entry_set_text(GTK_ENTRY(sasi_hdd->entry), + ConfigProp.HDImage[sasi_hdd->idx]); + } + } +} + +static void +others_sasi_hdd_new_button_clicked(GtkButton *b, gpointer d) +{ + sasi_hdd_t *sasi_hdd = (sasi_hdd_t *)d; + gchar *path = gtk_entry_get_text(GTK_ENTRY(sasi_hdd->entry)); + + UNUSED(b); + + file_selection(3, "Create SASI HDD", path, d); +} + +static void +others_sasi_hdd_remove_button_clicked(GtkButton *b, gpointer d) +{ + sasi_hdd_t *sasi_hdd = (sasi_hdd_t *)d; + + UNUSED(b); + + bzero(ConfigProp.HDImage[sasi_hdd->idx], sizeof(ConfigProp.HDImage)); + gtk_entry_set_text(GTK_ENTRY(sasi_hdd->entry), ConfigProp.HDImage[sasi_hdd->idx]); +} + +static void +others_sasi_hdd_browse_button_clicked(GtkButton *b, gpointer d) +{ + sasi_hdd_t *sasi_hdd = (sasi_hdd_t *)d; + gchar *path = gtk_entry_get_text(GTK_ENTRY(sasi_hdd->entry)); + + UNUSED(b); + + file_selection(2, "SASI HDD", path, d); +} + +static void +others_show_fdd_status_button_clicked(GtkButton *b, gpointer d) +{ + + UNUSED(d); + + ConfigProp.WindowFDDStat = GTK_TOGGLE_BUTTON(b)->active; +} + +static void +others_enable_virus_button_clicked(GtkButton *b, gpointer d) +{ + + UNUSED(d); + + ConfigProp.SRAMWarning = GTK_TOGGLE_BUTTON(b)->active; +} + +/* + * ---------- file selection + */ + +static void +file_selection_ok(GtkWidget *w, GtkFileSelection *gfs) +{ + file_selection_t *fsp = (file_selection_t *)gfs; + GtkFileSelection *fs = (GtkFileSelection *)fsp->fs; + char *p; + + UNUSED(w); + + p = (char *)gtk_file_selection_get_filename(fs); + if (p) { + struct stat st; + + if (stat(p, &st) == 0) { + if (!S_ISDIR(st.st_mode)) { + switch (fsp->type) { + case 1: // open MIMPI tone map + gtk_entry_set_text(GTK_ENTRY(fsp->arg), p); + strncpy(ConfigProp.ToneMapFile, p, sizeof(ConfigProp.ToneMapFile)); + break; + + case 2: // open SASI HDD + { + sasi_hdd_t *sasi_hdd = (sasi_hdd_t *)fsp->arg; + strncpy(ConfigProp.HDImage[sasi_hdd->idx], p, sizeof(ConfigProp.HDImage[0])); + gtk_entry_set_text(GTK_ENTRY(sasi_hdd->entry), p); + } + break; + } + } + } else if (errno == ENOENT) { + switch (fsp->type) { + case 3: // create SASI HDD image + { + sasi_hdd_t *sasi_hdd = (sasi_hdd_t *)fsp->arg; + char buf[0x1000]; + FILEH *fh; + int i; + + fh = File_Create(p, FTYPE_NONE); + if (fh == INVALID_HANDLE_VALUE) + break; + + bzero(buf, sizeof(buf)); + for (i = 0; i < 0x2793 /* 40Mb/0x1000 */; ++i) + File_Write(fh, buf, 0x1000); + File_Close(fh); + + strncpy(ConfigProp.HDImage[sasi_hdd->idx], p, sizeof(ConfigProp.HDImage[0])); + gtk_entry_set_text(GTK_ENTRY(sasi_hdd->entry), p); + } + break; + } + } + } + gtk_widget_destroy(GTK_WIDGET(fs)); +} + +static void +file_selection_destroy(GtkWidget *w, GtkWidget **wp) +{ + file_selection_t *fsp = (file_selection_t *)wp; + + free(fsp); + gtk_widget_destroy(w); +} + +static void +file_selection(int type, char *title, char *defstr, void *arg) +{ + GtkWidget *file_dialog; + file_selection_t *fsp; + + fsp = malloc(sizeof(*fsp)); + if (fsp == 0) { + printf("file_selection: Can't alloc memory (size = %d)\n", + sizeof(*fsp)); + return; + } + bzero(fsp, sizeof(*fsp)); + + file_dialog = gtk_file_selection_new(title); + if (defstr) { + gtk_file_selection_set_filename( + GTK_FILE_SELECTION(file_dialog), defstr); + } + + fsp->fs = file_dialog; + fsp->type = type; + fsp->arg = arg; + + gtk_window_set_position(GTK_WINDOW(file_dialog), GTK_WIN_POS_CENTER); + gtk_window_set_modal(GTK_WINDOW(file_dialog), TRUE); + gtk_file_selection_hide_fileop_buttons(GTK_FILE_SELECTION(file_dialog)); + gtk_signal_connect(GTK_OBJECT(file_dialog), "destroy", + GTK_SIGNAL_FUNC(file_selection_destroy), fsp); + gtk_signal_connect_object( + GTK_OBJECT(GTK_FILE_SELECTION(file_dialog)->cancel_button), + "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), + GTK_OBJECT(file_dialog)); + gtk_signal_connect( + GTK_OBJECT(GTK_FILE_SELECTION(file_dialog)->ok_button), + "clicked", GTK_SIGNAL_FUNC(file_selection_ok), fsp); + + gtk_widget_show(file_dialog); +} diff --git a/x11/prop.h b/x11/prop.h new file mode 100644 index 0000000..929534f --- /dev/null +++ b/x11/prop.h @@ -0,0 +1,57 @@ +#ifndef _winx68k_config +#define _winx68k_config + +#include "common.h" + +typedef struct +{ + DWORD SampleRate; + DWORD BufferSize; + int WinPosX; + int WinPosY; + int OPM_VOL; + int PCM_VOL; + int MCR_VOL; + int JOY_BTN[2][8]; + int MouseSpeed; + int WindowFDDStat; + int FullScrFDDStat; + int DSAlert; + int MIDI_SW; + int MIDI_Type; + int MIDI_Reset; + int JoyKey; + int JoyKeyReverse; + int JoyKeyJoy2; + int SRAMWarning; + char HDImage[16][MAX_PATH]; + int ToneMap; + char ToneMapFile[MAX_PATH]; + int XVIMode; + int JoySwap; + int LongFileName; + int WinDrvFD; + int WinStrech; + int DSMixing; + int CDROM_ASPI; + int CDROM_ASPI_Drive; + int CDROM_IOCTRL_Drive; + int CDROM_SCSIID; + int CDROM_Enable; + int SSTP_Enable; + int SSTP_Port; + int Sound_LPF; + int SoundROMEO; + int MIDIDelay; + int MIDIAutoDelay; +} Win68Conf; + +extern Win68Conf Config; + +void LoadConfig(void); +void SaveConfig(void); +void PropPage_Init(void); + +int set_modulepath(char *path, size_t len); + +#endif //_winx68k_config diff --git a/x11/status.c b/x11/status.c new file mode 100644 index 0000000..b2fb88c --- /dev/null +++ b/x11/status.c @@ -0,0 +1,344 @@ +/* $Id: status.c,v 1.3 2008/11/08 01:42:42 nonaka Exp $ */ + +/* + * Copyright (c) 2003 NONAKA Kimihiro + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#if 0 +/* -------------------------------------------------------------------------- * + * FDD状態表示用ステータスバー * + * -------------------------------------------------------------------------- */ + +#include "common.h" +#include "windraw.h" +#include "winx68k.h" +#include "prop.h" +#include "status.h" +#include "fileio.h" +#include "fdd.h" + +#if 0 +#include "../icons/fd_inserted.xpm" +#include "../icons/fd_inuse.xpm" +#include "../icons/fd_normal.xpm" +#include "../icons/fd_protected.xpm" +#include "../icons/hd_inserted.xpm" +#include "../icons/hd_inuse.xpm" +#include "../icons/hd_normal.xpm" +#include "../icons/nulldev.xpm" + +static char **pixmaps[] = { + fd_normal, + fd_inuse, + fd_inserted, + fd_protected, + hd_normal, + hd_inuse, + hd_inserted, + nulldev, +}; +#endif + +//static GtkWidget *statbar; +//static GtkWidget *devstat[2 /* FDD */ + 1 /* SASI */]; +//static GtkWidget *devlabel[2 /* FDD */ + 1 /* SASI */]; +//static GdkPixmap *devstat_pixmap[2 /* FDD */ + 1 /* SASI */]; +//static GdkPixmap *dev_pixmap[NELEMENTS(pixmaps)]; + +typedef struct { + int insert; + int access; + int blink; + int timer; + char file[MAX_PATH]; +} FDDLED; + +static FDDLED FddLed[2]; +//static int HddLed = 0, HddLedTmp = 0; + +#if 0 +/* ----- GTK signal handler */ +static gint +expose(GtkWidget *w, GdkEventExpose *ev, gpointer d) +{ + + if (ev->type == GDK_EXPOSE) { + if (ev->count == 0) { + gdk_draw_pixmap(w->window, + w->style->fg_gc[GTK_WIDGET_STATE(w)], + devstat_pixmap[(int)d], 0, 0, 0, 0, 16, 16); + } + return TRUE; + } + return FALSE; +} +/* ----- */ +#endif + +void +StatBar_Redraw(void) +{ + + if (Config.FullScrFDDStat) { + StatBar_FDD(0, 0, FddLed[0].access); + StatBar_FDD(0, 1, FddLed[0].insert); + StatBar_FDD(1, 0, FddLed[1].access); + StatBar_FDD(1, 1, FddLed[1].insert); + StatBar_FDName(0, FddLed[0].file); + StatBar_FDName(1, FddLed[1].file); + } +} + + +void +StatBar_Show(int sw) +{ +#if 1 + (void)sw; +#else + if (sw) { + if (statbar == 0) { + GdkVisual *visual; + GdkColormap *colormap; + GdkBitmap *mask; + int pos = 0; + int i; + + statbar = gtk_table_new(1, 18, FALSE); + gtk_box_pack_start(GTK_BOX(main_vbox), statbar, + FALSE, TRUE, 0); + + colormap = gtk_widget_get_colormap(window); + for (i = 0; i < NELEMENTS(dev_pixmap); ++i) { + dev_pixmap[i] = + gdk_pixmap_colormap_create_from_xpm_d(NULL, + colormap, &mask, NULL, pixmaps[i]); + } + + for (i = 0; i < NELEMENTS(devstat); ++i) { + GtkWidget *w; + int idx = 0; + + if (i == NELEMENTS(devstat) - 1) { + w = gtk_vseparator_new(); + gtk_table_attach(GTK_TABLE(statbar), w, + pos, pos + 1, 0, 1, 0, 0, 0, 0); + pos++; + gtk_widget_show(w); + idx += 4; + } + + w = devstat[i] = gtk_drawing_area_new(); + gtk_drawing_area_size(GTK_DRAWING_AREA(w), + 16, 16); + gtk_table_attach(GTK_TABLE(statbar), w, + pos, pos + 1, 0, 1, 0, 0, 0, 0); + pos++; + gtk_signal_connect(GTK_OBJECT(w),"expose_event", + GTK_SIGNAL_FUNC(expose), (gpointer)i); + gtk_widget_show(w); + + devlabel[i] = gtk_label_new( + (i == NELEMENTS(devstat) - 1) ? + "HDD" + : + " " + " " + " " + " "); + gtk_table_attach_defaults(GTK_TABLE(statbar), + devlabel[i], pos, pos + 3, 0, 1); + pos += 3; + gtk_widget_show(devlabel[i]); + + visual = gtk_widget_get_visual(w); + devstat_pixmap[i] = gdk_pixmap_new(w->window, + 16, 16, visual->depth); + gdk_draw_pixmap(devstat_pixmap[i], + w->style->fg_gc[GTK_WIDGET_STATE(w)], + dev_pixmap[idx], 0, 0, 0, 0, 16, 16); + } + + } + gtk_widget_show(statbar); + } else { + if (statbar) + gtk_widget_hide(statbar); + } +#endif +} + + +void +StatBar_UpdateTimer(void) +{ +#if 0 + FddLed[0].timer ^= 1; + FddLed[1].timer ^= 1; + + if (FddLed[0].blink && (!FddLed[0].file[0]) && statbar) { + gdk_draw_pixmap(devstat_pixmap[0], + devstat[0]->style->fg_gc[GTK_WIDGET_STATE(devstat[0])], + dev_pixmap[FddLed[0].timer], 0, 0, 0, 0, 16, 16); + } + if (FddLed[1].blink && (!FddLed[1].file[0]) && statbar) { + gdk_draw_pixmap(devstat_pixmap[1], + devstat[1]->style->fg_gc[GTK_WIDGET_STATE(devstat[1])], + dev_pixmap[FddLed[1].timer], 0, 0, 0, 0, 16, 16); + } + if (HddLed != HddLedTmp) { + HddLed = HddLedTmp; + if (statbar) { + gdk_draw_pixmap(devstat_pixmap[2], + devstat[2]->style->fg_gc[ + GTK_WIDGET_STATE(devstat[2])], + dev_pixmap[HddLed ? 5 : 4], 0, 0, 0, 0, 16, 16); + } + } + StatBar_Redraw(); +#endif +} + + +void +StatBar_HDD(int hd) +{ +#if 1 + (void)hd; +#else + HddLedTmp = hd; + if ((HddLed != hd) && (hd)) { + gdk_draw_pixmap(devstat_pixmap[2], + devstat[2]->style->fg_gc[GTK_WIDGET_STATE(devstat[2])], + dev_pixmap[HddLed ? 5 : 4], 0, 0, 0, 0, 16, 16); + HddLed = hd; + } + StatBar_Redraw(); +#endif +} + + +void +StatBar_SetFDD(int drv, char* file) +{ +#if 1 + (void)drv; + (void)file; +#else + char name[81]; + char *f; + int i; + + if ((drv < 0)||(drv > 1)) + return; + + f = (char *)getFileName(file); + strcpy(FddLed[drv].file, f); + g_snprintf(name, sizeof(name), "%s", f); + + if (f[0]) { + FddLed[drv].access = 1; + FddLed[drv].insert = 1; + } else { + FddLed[drv].access = 0; + FddLed[drv].insert = 0; + } + + if (statbar) { + int len = strlen(name); + int c = ((FddLed[drv].blink) && (!FddLed[drv].file[0])) ? FddLed[drv].timer : FddLed[drv].access; + gdk_draw_pixmap(devstat_pixmap[drv], + devstat[drv]->style->fg_gc[ + GTK_WIDGET_STATE(devstat[drv])], + dev_pixmap[c], 0, 0, 0, 0, 16, 16); + + memset(name + len, ' ', sizeof(name) - len); + name[80] = '\0'; + gtk_label_set_text(devlabel[drv], name); + } + StatBar_Redraw(); +#endif +} + + +void +StatBar_ParamFDD(int drv, int access, int insert, int blink) +{ +#if 1 + (void)drv; + (void)access; + (void)insert; + (void)blink; +#else + int update; + + if ((drv < 0) || (drv > 1)) + return; + + update = 0; + if (FddLed[drv].access != access) { + FddLed[drv].access = access; + update = 1; + } + if (FddLed[drv].insert != insert) { + FddLed[drv].insert = insert; + update = 1; + } + if (FddLed[drv].blink != blink) { + FddLed[drv].blink = blink; + update = 1; + } + + if (update) { + if (statbar) { + int c = ((FddLed[drv].blink) && (!FddLed[drv].file[0])) ? FddLed[drv].timer : FddLed[drv].access; + gdk_draw_pixmap(devstat_pixmap[drv], + devstat[drv]->style->fg_gc[ + GTK_WIDGET_STATE(devstat[drv])], + dev_pixmap[c], 0, 0, 0, 0, 16, 16); + } + StatBar_Redraw(); + } +#endif +} + + +void +StatBar_FDName(int drv, char* name) +{ + /* Full screen 専用 */ + (void)drv; + (void)name; +} + + +void +StatBar_FDD(int drv, int led, int col) +{ + /* Full screen 専用 */ + (void)drv; + (void)led; + (void)col; +} +#endif diff --git a/x11/status.h b/x11/status.h new file mode 100644 index 0000000..28c49b9 --- /dev/null +++ b/x11/status.h @@ -0,0 +1,34 @@ +#ifndef winx68k_statusbar_h +#define winx68k_statusbar_h + +#ifdef __cplusplus +extern "C" { +#endif + +#if 1 + +#define StatBar_Show(s) +#define StatBar_UpdateTimer() +#define StatBar_SetFDD(d,f) +#define StatBar_ParamFDD(d,a,i,b) +#define StatBar_HDD(s) + +#else + +void StatBar_Redraw(void); +void StatBar_Show(int sw); +void StatBar_Draw(DRAWITEMSTRUCT* dis); +void StatBar_FDName(int drv, char* name); +void StatBar_FDD(int drv, int led, int col); +void StatBar_UpdateTimer(void); +void StatBar_SetFDD(int drv, char* file); +void StatBar_ParamFDD(int drv, int access, int insert, int blink); +void StatBar_HDD(int sw); + +#endif + +#ifdef __cplusplus +}; +#endif + +#endif //winx68k_statusbar_h diff --git a/x11/timer.c b/x11/timer.c new file mode 100644 index 0000000..f2b5a18 --- /dev/null +++ b/x11/timer.c @@ -0,0 +1,36 @@ +// ----------------------------------------------------------------------- +// 55.6fpsキープ用たいまー +// ----------------------------------------------------------------------- +#include "common.h" +#include "crtc.h" +#include "mfp.h" + +DWORD timercnt = 0; +DWORD tick = 0; + +void Timer_Init(void) +{ + tick = timeGetTime(); +} + +void Timer_Reset(void) +{ + tick = timeGetTime(); +} + +WORD Timer_GetCount(void) +{ + DWORD ticknow = timeGetTime(); + DWORD dif = ticknow-tick; + DWORD TIMEBASE = ((CRTC_Regs[0x29]&0x10)?VSYNC_HIGH:VSYNC_NORM); + + timercnt += dif*10000; + tick = ticknow; + if ( timercnt>=TIMEBASE ) { +// timercnt = 0; + timercnt -= TIMEBASE; + if ( timercnt>=(TIMEBASE*2) ) timercnt = 0; + return 1; + } else + return 0; +} diff --git a/x11/timer.h b/x11/timer.h new file mode 100644 index 0000000..0b519e7 --- /dev/null +++ b/x11/timer.h @@ -0,0 +1,9 @@ +#ifndef winx1_timer_h +#define winx1_timer_h + +void Timer_Init(void); +void Timer_Reset(void); +WORD Timer_GetCount(void); +void Timer_SetCount(WORD); + +#endif //winx1_timer_h diff --git a/x11/version.h b/x11/version.h new file mode 100644 index 0000000..3a2b503 --- /dev/null +++ b/x11/version.h @@ -0,0 +1,15 @@ +// --------------------------------------------------------------------------- +// WinX68k - SHARP X680x0 Emulator +// Copyright (C) Kenjo 2000 +// --------------------------------------------------------------------------- + +#ifndef _version_h +#define _version_h + +#define APP_VER_MAJOR 0 +#define APP_VER_MINOR 65 +#define APP_VER_STRING "0.65" + +#define SOURCE_VERSION "20081108" + +#endif //_version_h diff --git a/x11/windraw.c b/x11/windraw.c new file mode 100644 index 0000000..fa16e40 --- /dev/null +++ b/x11/windraw.c @@ -0,0 +1,2433 @@ +/* $Id: windraw.c,v 1.3 2008/11/08 01:42:42 nonaka Exp $ */ + +/* + * Copyright (c) 2003 NONAKA Kimihiro + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "common.h" +#include "winx68k.h" +#include "winui.h" + +#include "bg.h" +#include "crtc.h" +#include "gvram.h" +#include "mouse.h" +#include "palette.h" +#include "prop.h" +#include "status.h" +#include "tvram.h" + +#include "../icons/keropi.xpm" + +extern BYTE Debug_Text, Debug_Grp, Debug_Sp; + +WORD *ScrBuf = 0; + +int Draw_Opaque; +int FullScreenFlag = 0; +extern BYTE Draw_RedrawAllFlag; +BYTE Draw_DrawFlag = 1; +BYTE Draw_ClrMenu = 0; + +BYTE Draw_BitMask[800]; +BYTE Draw_TextBitMask[800]; + +int winx = 0, winy = 0; +DWORD winh = 0, winw = 0; +DWORD root_width, root_height; +WORD FrameCount = 0; +int SplashFlag = 0; + +WORD WinDraw_Pal16B, WinDraw_Pal16R, WinDraw_Pal16G; + +DWORD WindowX = 0; +DWORD WindowY = 0; + +GdkImage *surface; +GdkRectangle surface_rect = { 16, 16, FULLSCREEN_WIDTH, FULLSCREEN_HEIGHT }; +GdkImage *scaled_screen; +GdkPixmap *pixmap; +GdkPixmap *splash_pixmap; +static int screen_mode; + + +GdkImage *gdk_scale_image(GdkImage *dest, GdkImage *src, GdkRectangle *dest_rect, GdkRectangle *src_rect); + + +void WinDraw_InitWindowSize(WORD width, WORD height) +{ + static BOOL inited = FALSE; + + if (!inited) { + GdkWindow *t, *root = window->window; + + while ((t = gdk_window_get_parent(root)) != 0) + root = t; + gdk_window_get_size(root, &root_width, &root_height); + inited = TRUE; + } + + gdk_window_get_position(window->window, &winx, &winy); + + winw = width; + winh = height; + + if (root_width < winw) + winx = (root_width - winw) / 2; + else if (winx < 0) + winx = 0; + else if ((winx + winw) > root_width) + winx = root_width - winw; + if (root_height < winh) + winy = (root_height - winh) / 2; + else if (winy < 0) + winy = 0; + else if ((winy + winh) > root_height) + winy = root_height - winh; +} + +void WinDraw_ChangeSize(void) +{ + DWORD oldx = WindowX, oldy = WindowY; + int dif; + + Mouse_ChangePos(); + + switch (Config.WinStrech) { + case 0: + WindowX = TextDotX; + WindowY = TextDotY; + break; + + case 1: + WindowX = 768; + WindowY = 512; + break; + + case 2: + if (TextDotX <= 384) + WindowX = TextDotX * 2; + else + WindowX = TextDotX; + if (TextDotY <= 256) + WindowY = TextDotY * 2; + else + WindowY = TextDotY; + break; + + case 3: + if (TextDotX <= 384) + WindowX = TextDotX * 2; + else + WindowX = TextDotX; + if (TextDotY <= 256) + WindowY = TextDotY * 2; + else + WindowY = TextDotY; + dif = WindowX - WindowY; + if ((dif > -32) && (dif < 32)) { + // 正方形に近い画面なら、としておこう + WindowX = (int)(WindowX * 1.25); + } + break; + } + + if ((WindowX > 768) || (WindowX <= 0)) { + if (oldx) + WindowX = oldx; + else + WindowX = oldx = 768; + } + if ((WindowY > 512) || (WindowY <= 0)) { + if (oldy) + WindowY = oldy; + else + WindowY = oldy = 512; + } + + surface_rect.width = TextDotX; + surface_rect.height = TextDotY; + + if ((oldx == WindowX) && (oldy == WindowY)) + return; + + if ((TextDotX == WindowX) && (TextDotY == WindowY)) + screen_mode = 0; + else { + screen_mode = 1; + if (scaled_screen) + gdk_image_destroy(scaled_screen); + scaled_screen = gdk_image_new(GDK_IMAGE_FASTEST, + surface->visual, WindowX, WindowY); + } + if (surface) { + bzero(ScrBuf, FULLSCREEN_WIDTH * FULLSCREEN_HEIGHT * 2); +#if 1 + gdk_draw_rectangle(pixmap, window->style->black_gc, TRUE, + 0, 0, FULLSCREEN_WIDTH, FULLSCREEN_HEIGHT); +#else + gdk_draw_rectangle(pixmap, window->style->black_gc, TRUE, + oldx, 0, FULLSCREEN_WIDTH - oldx, FULLSCREEN_HEIGHT); + gdk_draw_rectangle(pixmap, window->style->black_gc, TRUE, + 0, oldy, FULLSCREEN_WIDTH - oldx, FULLSCREEN_HEIGHT - oldy); +#endif + } + + WinDraw_InitWindowSize((WORD)WindowX, (WORD)WindowY); + gtk_widget_set_usize(drawarea, winw, winh); + gtk_widget_set_uposition(window, winx, winy); + StatBar_Show(Config.WindowFDDStat); + Mouse_ChangePos(); +} + +//static int dispflag = 0; +void WinDraw_StartupScreen(void) +{ +} + +void WinDraw_CleanupScreen(void) +{ +} + +void WinDraw_ChangeMode(int flag) +{ + + /* full screen mode(TRUE) <-> window mode(FALSE) */ + (void)flag; +} + +void WinDraw_ShowSplash(void) +{ + + gdk_draw_pixmap(pixmap, + drawarea->style->fg_gc[GTK_WIDGET_STATE(drawarea)], + splash_pixmap, 0, 0, + 768 - keropi_xpm_width, 512 - keropi_xpm_height, + keropi_xpm_width, keropi_xpm_height); +} + +void WinDraw_HideSplash(void) +{ + + gdk_draw_rectangle(pixmap, window->style->black_gc, TRUE, 0, 0, + FULLSCREEN_WIDTH, FULLSCREEN_HEIGHT); + Draw_DrawFlag = 1; +} + +int WinDraw_Init(void) +{ + GdkVisual *visual; + GdkColormap *colormap; + GdkBitmap *mask; + + WindowX = 768; + WindowY = 512; + + if ((root_width < WindowX) || (root_height < WindowY)) { + fprintf(stderr, "No support resolution.\n"); + return FALSE; + } + + visual = gtk_widget_get_visual(drawarea); + + switch (visual->type) { + case GDK_VISUAL_TRUE_COLOR: + break; + case GDK_VISUAL_DIRECT_COLOR: + if (visual->depth >= 15) + break; + /* FALLTHROUGH */ + default: + fprintf(stderr, "No support visual class.\n"); + return FALSE; + } + + /* 15 or 16 bpp 以外はサポート外 */ + if (visual->depth != 15 && visual->depth != 16) { + fprintf(stderr, "No support depth.\n"); + return FALSE; + } + WinDraw_Pal16R = visual->red_mask; + WinDraw_Pal16G = visual->green_mask; + WinDraw_Pal16B = visual->blue_mask; + + surface = gdk_image_new(GDK_IMAGE_FASTEST, visual, FULLSCREEN_WIDTH, + FULLSCREEN_HEIGHT); + if (surface == NULL) { + g_message("can't create surface."); + return 1; + } + ScrBuf = (WORD *)(surface->mem); + + pixmap = gdk_pixmap_new(drawarea->window, + FULLSCREEN_WIDTH, FULLSCREEN_HEIGHT, visual->depth); + if (pixmap == NULL) { + g_message("can't create pixmap."); + return FALSE; + } + gdk_draw_rectangle(pixmap, window->style->black_gc, TRUE, 0, 0, + FULLSCREEN_WIDTH, FULLSCREEN_HEIGHT); + + /* けろぴーすぷらっしゅ用意 */ + colormap = gtk_widget_get_colormap(window); + splash_pixmap = gdk_pixmap_colormap_create_from_xpm_d(NULL, colormap, + &mask, NULL, keropi_xpm); + if (splash_pixmap == NULL) + g_error("Couldn't create replacement pixmap."); + + return TRUE; +} + +void +WinDraw_Cleanup(void) +{ + + if (splash_pixmap) { + gdk_pixmap_unref(splash_pixmap); + splash_pixmap = 0; + } + if (pixmap) { + gdk_pixmap_unref(pixmap); + pixmap = 0; + } + if (scaled_screen) { + gdk_image_destroy(scaled_screen); + scaled_screen = 0; + } + if (surface) { + gdk_image_destroy(surface); + surface = 0; + ScrBuf = 0; + } + gdk_window_get_position(window->window, &winx, &winy); +} + +void +WinDraw_Redraw(void) +{ + + TVRAM_SetAllDirty(); +} + +void FASTCALL +WinDraw_Draw(void) +{ + GtkWidget *w = (GtkWidget *)drawarea; + GdkDrawable *d = (GdkDrawable *)drawarea->window; + + FrameCount++; + if (!Draw_DrawFlag && is_installed_idle_process()) + return; + Draw_DrawFlag = 0; + + if (SplashFlag) + WinDraw_ShowSplash(); + + if (screen_mode == 0) { + gdk_draw_pixmap(d, w->style->fg_gc[GTK_WIDGET_STATE(w)], + pixmap, 0, 0, 0, 0, TextDotX, TextDotY); + } else { + gdk_scale_image(scaled_screen, surface, NULL, &surface_rect); + gdk_draw_image(d, w->style->fg_gc[GTK_WIDGET_STATE(w)], + scaled_screen, 0, 0, 0, 0, WindowX, WindowY); + } +} + +INLINE void WinDraw_DrawGrpLine(int opaq) +{ +#ifdef USE_ASM + DWORD adr = ((VLINE+16)*1600+32); + if (opaq) + { + __asm { + mov ebx, adr + add ebx, offset ScrBuf + mov edx, offset Grp_LineBuf + mov ecx, TextDotX + shr cx, 1 + drawgrplineolp: + mov eax, [edx] + mov [ebx], eax + add edx, 4 + add ebx, 4 + loop drawgrplineolp + } + } + else + { + __asm { + mov ebx, adr + add ebx, offset ScrBuf + mov edx, offset Grp_LineBuf + mov ecx, TextDotX + drawgrplinelp: + mov ax, [edx] + or ax, ax + jz drawgrplineskip + mov [ebx], ax + drawgrplineskip: + add edx, 2 + add ebx, 2 + loop drawgrplinelp + } + } +#elif defined(USE_GAS) && defined(__i386__) + DWORD adr = ((VLINE+16)*1600+32); + if (opaq) { + asm ( + "mov %0, %%ebx;" + "add %1, %%ebx;" + "mov %2, %%edx;" + "mov (%3), %%ecx;" + "shr $1, %%cx;" + "0:" + "mov (%%edx), %%eax;" + "mov %%eax, (%%ebx);" + "add $4, %%edx;" + "add $4, %%ebx;" + "loop 0b;" + : /* output: nothing */ + : "m" (adr), "g" (ScrBuf), "g" (Grp_LineBuf), "g" (TextDotX) + : "ax", "bx", "cx", "dx", "memory"); + } else { + asm ( + "mov %0, %%ebx;" + "add %1, %%ebx;" + "mov %2, %%edx;" + "mov (%3), %%ecx;" + "shr $1, %%cx;" + "0:" + "mov (%%edx), %%ax;" + "or %%ax, %%ax;" + "jz 1f;" + "mov %%ax, (%%ebx);" + "1:" + "add $2, %%edx;" + "add $2, %%ebx;" + "loop 0b;" + : /* output: nothing */ + : "m" (adr), "g" (ScrBuf), "g" (Grp_LineBuf), "g" (TextDotX) + : "ax", "bx", "cx", "dx", "memory"); + } +#else /* !USE_ASM && !(USE_GAS && __i386__) */ + DWORD adr = ((VLINE+16)*FULLSCREEN_WIDTH+16); + WORD w; + int i; + + if (opaq) { + memcpy(&ScrBuf[adr], Grp_LineBuf, TextDotX * 2); + } else { + for (i = 0; i < TextDotX; i++, adr++) { + w = Grp_LineBuf[i]; + if (w != 0) + ScrBuf[adr] = w; + } + } +#endif /* USE_ASM */ +} + +INLINE void WinDraw_DrawGrpLineNonSP(int opaq) +{ +#ifdef USE_ASM + DWORD adr = ((VLINE+16)*1600+32); + if (opaq) + { + __asm { + mov ebx, adr + add ebx, offset ScrBuf + mov edx, offset Grp_LineBufSP2 + mov ecx, TextDotX + drawgrpnslinelpo: + mov ax, [edx] + mov [ebx], ax + add edx, 2 + add ebx, 2 + loop drawgrpnslinelpo + } + } + else + { + __asm { + mov ebx, adr + add ebx, offset ScrBuf + mov edx, offset Grp_LineBufSP2 + mov ecx, TextDotX + drawgrpnslinelp: + mov ax, [edx] + or ax, ax + jz drawgrpnslineskip + mov [ebx], ax + drawgrpnslineskip: + add edx, 2 + add ebx, 2 + loop drawgrpnslinelp + } + } +#elif defined(USE_GAS) && defined(__i386__) + DWORD adr = ((VLINE+16)*1600+32); + if (opaq) { + asm ( + "mov %0, %%ebx;" + "add %1, %%ebx;" + "mov %2, %%edx;" + "mov (%3), %%ecx;" + "0:" + "mov (%%edx), %%ax;" + "mov %%ax, (%%ebx);" + "add $2, %%edx;" + "add $2, %%ebx;" + "loop 0b;" + : /* output: nothing */ + : "m" (adr), "g" (ScrBuf), "g" (Grp_LineBufSP2), "g" (TextDotX) + : "ax", "bx", "cx", "dx", "memory"); + } else { + asm ( + "mov %0, %%ebx;" + "add %1, %%ebx;" + "mov %2, %%edx;" + "mov (%3), %%ecx;" + "0:" + "mov (%%edx), %%ax;" + "or %%ax, %%ax;" + "jz 1f;" + "mov %%ax, (%%ebx);" + "1:" + "add $2, %%edx;" + "add $2, %%ebx;" + "loop 0b;" + : /* output: nothing */ + : "m" (adr), "g" (ScrBuf), "g" (Grp_LineBufSP2), "g" (TextDotX) + : "ax", "bx", "cx", "dx", "memory"); + } +#else /* !USE_ASM && !(USE_GAS && __i386__) */ + DWORD adr = ((VLINE+16)*FULLSCREEN_WIDTH+16); + WORD w; + int i; + + if (opaq) { + memcpy(&ScrBuf[adr], Grp_LineBufSP2, TextDotX * 2); + } else { + for (i = 0; i < TextDotX; i++, adr++) { + w = Grp_LineBufSP2[i]; + if (w != 0) + ScrBuf[adr] = w; + } + } +#endif /* USE_ASM */ +} + + +INLINE void WinDraw_DrawTextLine(int opaq, int td) +{ +#ifdef USE_ASM + DWORD adr = ((VLINE+16)*1600+32); + if (opaq) + { + __asm { + mov ebx, adr + add ebx, offset ScrBuf + xor edx, edx + mov ecx, TextDotX + drawtextlineolp: + mov ax, word ptr (BG_LineBuf+32)[edx*2] + // test byte ptr (Text_TrFlag+16)[edx], 1 + // jnz drawtextlineoskip + // mov ax, TextPal[0] + //drawtextlineoskip: + mov [ebx], ax + inc edx + add ebx, 2 + loop drawtextlineolp + } + } + else + { + if (td) + { + __asm { + mov ebx, adr + add ebx, offset ScrBuf + xor edx, edx + mov ecx, TextDotX + drawtextlinetdlp: + test byte ptr (Text_TrFlag+16)[edx], 1 + jz drawtextlinetdskip + mov ax, word ptr (BG_LineBuf+32)[edx*2] + or ax, ax + jz drawtextlinetdskip +//mov [ebx], 0xffff + mov [ebx], ax + drawtextlinetdskip: + inc edx + add ebx, 2 + loop drawtextlinetdlp + } + } + else + { + __asm { + mov ebx, adr + add ebx, offset ScrBuf + xor edx, edx + mov ecx, TextDotX + drawtextlinelp: + // test byte ptr (Text_TrFlag+16)[edx], 3 + // jnz drawtextlinenonskip + // mov ax, TextPal[0] + // jmp drawtextlinenonskip2 + //drawtextlinenonskip: + // test byte ptr (Text_TrFlag+16)[edx], 1 + // jz drawtextlineskip + mov ax, word ptr (BG_LineBuf+32)[edx*2] + //drawtextlinenonskip2: + or ax, ax + jz drawtextlineskip + mov [ebx], ax + drawtextlineskip: + inc edx + add ebx, 2 + loop drawtextlinelp + } + } + } +#elif defined(USE_GAS) && defined(__i386__) + DWORD adr = ((VLINE+16)*1600+32); + if (opaq) { + asm ( + "mov %0, %%ebx;" + "add %1, %%ebx;" + "xor %%edx, %%edx;" + "mov (%2), %%ecx;" + "0:" + "mov BG_LineBuf + 32(, %%edx, 2), %%ax;" + "mov %%ax, (%%ebx);" + "inc %%edx;" + "add $2, %%ebx;" + "loop 0b;" + : /* output: nothing */ + : "m" (adr), "g" (ScrBuf), "g" (TextDotX) + : "ax", "bx", "cx", "dx", "memory"); + } else { + if (td) { + asm ( + "mov %0, %%ebx;" + "add %1, %%ebx;" + "xor %%edx, %%edx;" + "mov (%2), %%ecx;" + "0:" + "testb $1, Text_TrFlag + 16(%%edx);" + "jz 1f;" + "mov BG_LineBuf + 32(, %%edx, 2), %%ax;" + "or %%ax, %%ax;" + "jz 1f;" + "mov %%ax, (%%ebx);" + "1:" + "inc %%edx;" + "add $2, %%ebx;" + "loop 0b;" + : /* output: nothing */ + : "m" (adr), "g" (ScrBuf), "g" (TextDotX) + : "ax", "bx", "cx", "dx", "memory"); + } else { + asm ( + "mov %0, %%ebx;" + "add %1, %%ebx;" + "xor %%edx, %%edx;" + "mov (%2), %%ecx;" + "0:" + "mov BG_LineBuf + 32(, %%edx, 2), %%ax;" + "or %%ax, %%ax;" + "jz 1f;" + "mov %%ax, (%%ebx);" + "1:" + "inc %%edx;" + "add $2, %%ebx;" + "loop 0b;" + : /* output: nothing */ + : "m" (adr), "g" (ScrBuf), "g" (TextDotX) + : "ax", "bx", "cx", "dx", "memory"); + } + } +#else /* !USE_ASM && !(USE_GAS && __i386__) */ + DWORD adr = ((VLINE+16)*FULLSCREEN_WIDTH+16); + WORD w; + int i; + + if (opaq) { + memcpy(&ScrBuf[adr], &BG_LineBuf[16], TextDotX * 2); + } else { + if (td) { + for (i = 16; i < TextDotX + 16; i++, adr++) { + if (Text_TrFlag[i] & 1) { + w = BG_LineBuf[i]; + if (w != 0) + ScrBuf[adr] = w; + } + } + } else { + for (i = 16; i < TextDotX + 16; i++, adr++) { + w = BG_LineBuf[i]; + if (w != 0) + ScrBuf[adr] = w; + } + } + } +#endif /* USE_ASM */ +} + + +INLINE void WinDraw_DrawTextLineTR(int opaq) +{ +#ifdef USE_ASM + DWORD adr = ((VLINE+16)*1600+32); + if (opaq) + { + __asm { + push edi + mov ebx, adr + add ebx, offset ScrBuf + xor edx, edx + xor edi, edi + xor eax, eax + mov ecx, TextDotX + drawtexttrlineolp: + mov di, word ptr Grp_LineBufSP[edx*2] + or di, di + jnz drawtexttrlineotr + + test byte ptr (Text_TrFlag+16)[edx], 1 + jz drawtexttrlineopal0 + + mov ax, word ptr (BG_LineBuf+32)[edx*2] + jmp drawtexttrlineonorm + + drawtexttrlineopal0: + xor ax, ax + jmp drawtexttrlineonorm + drawtexttrlineotr: + // ねこーねこー + mov ax, word ptr (BG_LineBuf+32)[edx*2] + and di, Pal_HalfMask + test ax, Ibit + jz drawtexttrlineotrI + add di, Pal_Ix2 + drawtexttrlineotrI: + and ax, Pal_HalfMask + add ax, di // 17bit計算中 + rcr ax, 1 // 17bit計算中 + drawtexttrlineonorm: + mov [ebx], ax + inc edx + add ebx, 2 + dec cx + jnz drawtexttrlineolp +// loop drawtexttrlineolp + pop edi + } + } + else + { + __asm { + push edi + mov ebx, adr + add ebx, offset ScrBuf + xor edx, edx + mov ecx, TextDotX + drawtexttrlinelp: + test byte ptr (Text_TrFlag+16)[edx], 1 + jz drawtexttrlineskip + + mov di, word ptr Grp_LineBufSP[edx*2] + or di, di + jnz drawtexttrlinetr + + mov ax, word ptr (BG_LineBuf+32)[edx*2] + or ax, ax + jz drawtexttrlineskip + jmp drawtexttrlinenorm + + drawtexttrlinetr: + // ねこーねこー + mov ax, word ptr (BG_LineBuf+32)[edx*2] + or ax, ax + jz drawtexttrlineskip + and di, Pal_HalfMask + test ax, Ibit + jz drawtexttrlinetrI + add di, Pal_Ix2 + drawtexttrlinetrI: + and ax, Pal_HalfMask + add ax, di // 17bit計算中 + rcr ax, 1 // 17bit計算中 + drawtexttrlinenorm: + mov [ebx], ax + drawtexttrlineskip: + inc edx + add ebx, 2 + dec cx + jnz drawtexttrlinelp +// loop drawtexttrlinelp + pop edi + } + } +#elif defined(USE_GAS) && defined(__i386__) + DWORD adr = ((VLINE+16)*1600+32); + if (opaq) { + asm ( + "mov %0, %%ebx;" + "add %1, %%ebx;" + "xor %%edx, %%edx;" + "xor %%edi, %%edi;" + "xor %%eax, %%eax;" + "mov (%2), %%ecx;" + "0:" + "mov Grp_LineBufSP(, %%edx, 2), %%di;" + "or %%di, %%di;" + "jnz 2f;" + + "testb $1, Text_TrFlag + 16(%%edx);" + "jz 1f;" + + "mov BG_LineBuf + 32(, %%edx, 2), %%ax;" + "jmp 4f;" + + "1:" + "xor %%ax, %%ax;" + "jmp 4f;" + "2:" + // ねこーねこー + "mov BG_LineBuf + 32(, %%edx, 2), %%ax;" + "and (%3), %%di;" + "test (%4), %%ax;" + "jz 3f;" + "add (%5), %%di;" + "3:" + "and (%3), %%ax;" + "add %%di, %%ax;" // 17bit計算中 + "rcr $1, %%ax;" // 17bit計算中 + "4:" + "mov %%ax, (%%ebx);" + "inc %%edx;" + "add $2, %%ebx;" + "dec %%cx;" + "jnz 0b;" + : /* output: nothing */ + : "m" (adr), "g" (ScrBuf), "g" (TextDotX), "g" (Pal_HalfMask), + "g" (Ibit), "g" (Pal_Ix2) + : "ax", "bx", "cx", "dx", "di", "memory"); + } else { + asm ( + "mov %0, %%ebx;" + "add %1, %%ebx;" + "xor %%edx, %%edx;" + "mov (%2), %%ecx;" + "0:" + "testb $1, Text_TrFlag + 16(%%edx);" + "jz 4f;" + + "mov Grp_LineBufSP(, %%edx, 2), %%di;" + "or %%di, %%di;" + "jnz 1f;" + + "mov BG_LineBuf + 32(, %%edx, 2), %%ax;" + "or %%ax, %%ax;" + "jz 4f;" + "jmp 3f;" + + "1:" + // ねこーねこー + "mov BG_LineBuf + 32(, %%edx, 2), %%ax;" + "or %%ax, %%ax;" + "jz 4f;" + "and (%3), %%di;" + "test (%4), %%ax;" + "jz 2f;" + "add (%5), %%di;" + "2:" + "and (%3), %%ax;" + "add %%di, %%ax;" // 17bit計算中 + "rcr $1, %%ax;" // 17bit計算中 + "3:" + "mov %%ax, (%%ebx);" + "4:" + "inc %%edx;" + "add $2, %%ebx;" + "dec %%cx;" + "jnz 0b;" + : /* output: nothing */ + : "m" (adr), "g" (ScrBuf), "g" (TextDotX), "g" (Pal_HalfMask), + "g" (Ibit), "g" (Pal_Ix2) + : "ax", "bx", "cx", "dx", "di", "memory"); + } +#else /* !USE_ASM && !(USE_GAS && __i386__) */ + DWORD adr = ((VLINE+16)*FULLSCREEN_WIDTH+16); + DWORD v; + WORD w; + int i; + + if (opaq) { + for (i = 16; i < TextDotX + 16; i++, adr++) { + w = Grp_LineBufSP[i - 16]; + if (w != 0) { + w &= Pal_HalfMask; + v = BG_LineBuf[i]; + if (v & Ibit) + w += Pal_Ix2; + v &= Pal_HalfMask; + v += w; + v >>= 1; + } else { + if (Text_TrFlag[i] & 1) + v = BG_LineBuf[i]; + else + v = 0; + } + ScrBuf[adr] = (WORD)v; + } + } else { + for (i = 16; i < TextDotX + 16; i++, adr++) { + if (Text_TrFlag[i] & 1) { + w = Grp_LineBufSP[i - 16]; + v = BG_LineBuf[i]; + + if (v != 0) { + if (w != 0) { + w &= Pal_HalfMask; + if (v & Ibit) + w += Pal_Ix2; + v &= Pal_HalfMask; + v += w; + v >>= 1; + } + ScrBuf[adr] = (WORD)v; + } + } + } + } +#endif /* USE_ASM */ +} + +INLINE void WinDraw_DrawTextLineTR2(int opaq) +{ +#ifdef USE_ASM + DWORD adr = ((VLINE+16)*1600+32); + if (opaq) + { + __asm { + push edi + mov ebx, adr + add ebx, offset ScrBuf + xor edx, edx + xor edi, edi + xor eax, eax + mov ecx, TextDotX + drawtexttrline2olp: + mov di, word ptr Grp_LineBufSP[edx*2] + or di, di + jnz drawtexttrline2otr + + test byte ptr (Text_TrFlag+16)[edx], 1 + jz drawtexttrline2opal0 + + mov ax, word ptr (BG_LineBuf+32)[edx*2] + jmp drawtexttrline2onorm + + drawtexttrline2opal0: + xor ax, ax + jmp drawtexttrline2onorm + drawtexttrline2otr: + // ねこーねこー + mov ax, word ptr (BG_LineBuf+32)[edx*2] + and di, Pal_HalfMask + test ax, Ibit + jz drawtexttrline2otrI + add di, Pal_Ix2 + drawtexttrline2otrI: + and ax, Pal_HalfMask + add ax, di // 17bit計算中 + rcr ax, 1 // 17bit計算中 + drawtexttrline2onorm: + mov [ebx], ax + inc edx + add ebx, 2 + dec cx + jnz drawtexttrline2olp +// loop drawtexttrline2olp + pop edi + } + } + else + { + __asm { + push edi + mov ebx, adr + add ebx, offset ScrBuf + xor edx, edx + mov ecx, TextDotX + drawtexttrline2lp: + test byte ptr (Text_TrFlag+16)[edx], 1 + jz drawtexttrline2skip + + mov di, word ptr Grp_LineBufSP[edx*2] + or di, di + jnz drawtexttrline2tr + + mov ax, word ptr (BG_LineBuf+32)[edx*2] + or ax, ax + jz drawtexttrline2skip + jmp drawtexttrline2norm + + drawtexttrline2tr: + // ねこーねこー + mov ax, word ptr (BG_LineBuf+32)[edx*2] + or ax, ax + jz drawtexttrline2skip + and di, Pal_HalfMask + test ax, Ibit + jz drawtexttrline2trI + add di, Pal_Ix2 + drawtexttrline2trI: + and ax, Pal_HalfMask + add ax, di // 17bit計算中 + rcr ax, 1 // 17bit計算中 + drawtexttrline2norm: + mov [ebx], ax + drawtexttrline2skip: + inc edx + add ebx, 2 + dec cx + jnz drawtexttrline2lp +// loop drawtexttrline2lp + pop edi + } + } +#elif defined(USE_GAS) && defined(__i386__) + DWORD adr = ((VLINE+16)*1600+32); + if (opaq) { + asm ( + "mov %0, %%ebx;" + "add %1, %%ebx;" + "xor %%edx, %%edx;" + "xor %%edi, %%edi;" + "xor %%eax, %%eax;" + "mov (%2), %%ecx;" + "0:" + "mov Grp_LineBufSP(, %%edx, 2), %%di;" + "or %%di, %%di;" + "jnz 2f;" + + "testb $1, Text_TrFlag + 16(%%edx);" + "jz 1f;" + + "mov BG_LineBuf + 32(, %%edx, 2), %%ax;" + "jmp 4f;" + + "1:" + "xor %%ax, %%ax;" + "jmp 4f;" + "2:" + // ねこーねこー + "mov BG_LineBuf + 32 (, %%edx, 2), %%ax;" + "and (%3), %%di;" + "test (%4), %%ax;" + "jz 3f;" + "add (%5), %%di;" + "3:" + "and (%3), %%ax;" + "add %%di, %%ax;" // 17bit計算中 + "rcr $1, %%ax;" // 17bit計算中 + "4:" + "mov %%ax, (%%ebx);" + "inc %%edx;" + "add $2, %%ebx;" + "dec %%cx;" + "jnz 0b;" + : /* output: nothing */ + : "m" (adr), "g" (ScrBuf), "g" (TextDotX), + "g" (Pal_HalfMask), "g" (Ibit), "g" (Pal_Ix2) + : "ax", "bx", "cx", "dx", "di", "memory"); + } else { + asm ( + "mov %0, %%ebx;" + "add %1, %%ebx;" + "xor %%edx, %%edx;" + "mov (%2), %%ecx;" + ".drawtexttrline2lp:" + "testb $1, Text_TrFlag + 16(%%edx);" + "jz .drawtexttrline2skip;" + + "mov Grp_LineBufSP(, %%edx, 2), %%di;" + "or %%di, %%di;" + "jnz .drawtexttrline2tr;" + + "mov BG_LineBuf + 32(, %%edx, 2), %%ax;" + "or %%ax, %%ax;" + "jz .drawtexttrline2skip;" + "jmp .drawtexttrline2norm;" + + ".drawtexttrline2tr:" + // ねこーねこー + "mov BG_LineBuf + 32(, %%edx, 2), %%ax;" + "or %%ax, %%ax;" + "jz .drawtexttrline2skip;" + "and (%3), %%di;" + "test (%4), %%ax;" + "jz .drawtexttrline2trI;" + "add (%5), %%di;" + ".drawtexttrline2trI:" + "and (%3), %%ax;" + "add %%di, %%ax;" // 17bit計算中 + "rcr $1, %%ax;" // 17bit計算中 + ".drawtexttrline2norm:" + "mov %%ax, (%%ebx);" + ".drawtexttrline2skip:" + "inc %%edx;" + "add $2, %%ebx;" + "dec %%cx;" + "jnz .drawtexttrline2lp;" + : /* output: nothing */ + : "m" (adr), "g" (ScrBuf), "g" (TextDotX), + "g" (Pal_HalfMask), "g" (Ibit), "g" (Pal_Ix2) + : "ax", "bx", "cx", "dx", "di", "memory"); + } +#else /* !USE_ASM && !(USE_GAS && __i386__) */ + DWORD adr = ((VLINE+16)*FULLSCREEN_WIDTH+16); + DWORD v; + WORD w; + int i; + + if (opaq) { + for (i = 16; i < TextDotX + 16; i++, adr++) { + w = Grp_LineBufSP[i - 16]; + if (w != 0) { + w &= Pal_HalfMask; + v = BG_LineBuf[i]; + if (v & Ibit) + w += Pal_Ix2; + v &= Pal_HalfMask; + v += w; + v >>= 1; + } else { + if (Text_TrFlag[i] & 1) + v = BG_LineBuf[i]; + else + v = 0; + } + ScrBuf[adr] = (WORD)v; + } + } else { + for (i = 16; i < TextDotX + 16; i++, adr++) { + if (Text_TrFlag[i] & 1) { + w = Grp_LineBufSP[i - 16]; + v = BG_LineBuf[i]; + + if (v != 0) { + if (w != 0) { + w &= Pal_HalfMask; + if (v & Ibit) + w += Pal_Ix2; + v &= Pal_HalfMask; + v += w; + v >>= 1; + } + ScrBuf[adr] = (WORD)v; + } + } + } + } +#endif /* USE_ASM */ +} + + +INLINE void WinDraw_DrawBGLine(int opaq, int td) +{ +#ifdef USE_ASM + DWORD adr = ((VLINE+16)*1600+32); + if (opaq) + { + __asm { + mov ebx, adr + add ebx, offset ScrBuf + xor edx, edx + mov ecx, TextDotX + drawbglineolp: + mov ax, word ptr (BG_LineBuf+32)[edx*2] + // test byte ptr (Text_TrFlag+16)[edx], 3 + // jnz drawbglineoskip + // mov ax, TextPal[0] + //drawbglineoskip: + mov [ebx], ax + inc edx + add ebx, 2 + loop drawbglineolp + } + } + else + { + if (td) + { + __asm { + mov ebx, adr + add ebx, offset ScrBuf + xor edx, edx + mov ecx, TextDotX + drawbglinetdlp: + test byte ptr (Text_TrFlag+16)[edx], 2 + jz drawbglinetdskip + mov ax, word ptr (BG_LineBuf+32)[edx*2] + or ax, ax + jz drawbglinetdskip + mov [ebx], ax + drawbglinetdskip: + inc edx + add ebx, 2 + loop drawbglinetdlp + } + } + else + { + __asm { + mov ebx, adr + add ebx, offset ScrBuf + xor edx, edx + mov ecx, TextDotX + drawbglinelp: + // test byte ptr (Text_TrFlag+16)[edx], 3 + // jnz drawbglinenonskip + // mov ax, TextPal[0] + // jmp drawbglinenonskip2 + //drawbglinenonskip: + // test byte ptr (Text_TrFlag+16)[edx], 2 + // jz drawbglineskip + mov ax, word ptr (BG_LineBuf+32)[edx*2] + //drawbglinenonskip2: + or ax, ax + jz drawbglineskip + mov [ebx], ax + drawbglineskip: + inc edx + add ebx, 2 + loop drawbglinelp + } + } + } +#elif defined(USE_GAS) && defined(__i386__) + DWORD adr = ((VLINE+16)*1600+32); + if (opaq) { + asm ( + "mov %0, %%ebx;" + "add %1, %%ebx;" + "xor %%edx, %%edx;" + "mov (%2), %%ecx;" + "0:" + "mov BG_LineBuf + 32(, %%edx, 2), %%ax;" + "mov %%ax, (%%ebx);" + "inc %%edx;" + "add $2, %%ebx;" + "loop 0b;" + : /* output: nothing */ + : "m" (adr), "g" (ScrBuf), "g" (TextDotX) + : "ax", "bx", "cx", "dx", "memory"); + } else { + if (td) { + asm ( + "mov %0, %%ebx;" + "add %1, %%ebx;" + "xor %%edx, %%edx;" + "mov (%2), %%ecx;" + "0:" + "testb $2, Text_TrFlag + 16(%%edx);" + "jz 1f;" + "mov BG_LineBuf + 32(, %%edx, 2), %%ax;" + "or %%ax, %%ax;" + "jz 1f;" + "mov %%ax, (%%ebx);" + "1:" + "inc %%edx;" + "add $2, %%ebx;" + "loop 0b;" + : /* output: nothing */ + : "m" (adr), "g" (ScrBuf), "g" (TextDotX) + : "ax", "bx", "cx", "dx", "memory"); + } else { + asm ( + "mov %0, %%ebx;" + "add %1, %%ebx;" + "xor %%edx, %%edx;" + "mov (%2), %%ecx;" + "0:" + "mov BG_LineBuf + 32(, %%edx, 2), %%ax;" + "or %%ax, %%ax;" + "jz 1;" + "mov %%ax, (%%ebx);" + "1:" + "inc %%edx;" + "add $2, %%ebx;" + "loop 0b;" + : /* output: nothing */ + : "m" (adr), "g" (ScrBuf), "g" (TextDotX) + : "ax", "bx", "cx", "dx", "memory"); + } + } +#else /* !USE_ASM && !(USE_GAS && __i386__) */ + DWORD adr = ((VLINE+16)*FULLSCREEN_WIDTH+16); + WORD w; + int i; + + if (opaq) { + memcpy(&ScrBuf[adr], &BG_LineBuf[16], TextDotX * 2); + } else { + if (td) { + for (i = 16; i < TextDotX + 16; i++, adr++) { + if (Text_TrFlag[i] & 2) { + w = BG_LineBuf[i]; + if (w != 0) + ScrBuf[adr] = w; + } + } + } else { + for (i = 16; i < TextDotX + 16; i++, adr++) { + w = BG_LineBuf[i]; + if (w != 0) + ScrBuf[adr] = w; + } + } + } +#endif /* USE_ASM */ +} + + +INLINE void WinDraw_DrawBGLineTR(int opaq) +{ +#ifdef USE_ASM + DWORD adr = ((VLINE+16)*1600+32); + if (opaq) + { + __asm { + push edi + mov ebx, adr + add ebx, offset ScrBuf + xor edx, edx + xor edi, edi + xor eax, eax + mov ecx, TextDotX + drawbgtrlineolp: + mov di, word ptr Grp_LineBufSP[edx*2] + or di, di + jnz drawbgtrlineotr + + // test byte ptr (Text_TrFlag+16)[edx], 2 + // jz drawbgtrlineopal0 + + mov ax, word ptr (BG_LineBuf+32)[edx*2] + jmp drawbgtrlineonorm + + //drawbgtrlineopal0: + // xor ax, ax + // jmp drawbgtrlineonorm + + drawbgtrlineotr: + + mov ax, word ptr (BG_LineBuf+32)[edx*2] + and di, Pal_HalfMask + test ax, Ibit + jz drawbgtrlineotrI + add di, Pal_Ix2 + drawbgtrlineotrI: + and ax, Pal_HalfMask + add ax, di // 17bit計算中 + rcr ax, 1 // 17bit計算中 + + drawbgtrlineonorm: + mov [ebx], ax + inc edx + add ebx, 2 + dec cx + jnz drawbgtrlineolp +// loop drawbgtrlineolp + pop edi + } + } + else + { + __asm { + push edi + mov ebx, adr + add ebx, offset ScrBuf + xor edx, edx + mov ecx, TextDotX + drawbgtrlinelp: + test byte ptr (Text_TrFlag+16)[edx], 2 + jz drawbgtrlineskip + + mov di, word ptr Grp_LineBufSP[edx*2] + or di, di + jnz drawbgtrlinetr + + mov ax, word ptr (BG_LineBuf+32)[edx*2] + or ax, ax + jz drawbgtrlineskip + jmp drawbgtrlinenorm + + drawbgtrlinetr: + // ねこーねこー + mov ax, word ptr (BG_LineBuf+32)[edx*2] + or ax, ax + jz drawbgtrlineskip + and di, Pal_HalfMask + test ax, Ibit + jz drawbgtrlinetrI + add di, Pal_Ix2 + drawbgtrlinetrI: + and ax, Pal_HalfMask + add ax, di // 17bit計算中 + rcr ax, 1 // 17bit計算中 + + drawbgtrlinenorm: + mov [ebx], ax + drawbgtrlineskip: + inc edx + add ebx, 2 + dec cx + jnz drawbgtrlinelp +// loop drawbgtrlinelp + pop edi + } + } +#elif defined(USE_GAS) && defined(__i386__) + DWORD adr = ((VLINE+16)*1600+32); + if (opaq) { + asm ( + "mov %0, %%ebx;" + "add %1, %%ebx;" + "xor %%edx, %%edx;" + "xor %%edi, %%edi;" + "xor %%eax, %%eax;" + "mov (%2), %%ecx;" + "0:" + "mov Grp_LineBufSP(, %%edx, 2), %%di;" + "or %%di, %%di;" + "jnz 1f;" + + "mov BG_LineBuf + 32(, %%edx, 2), %%ax;" + "jmp 3f;" + + "1:" + "mov BG_LineBuf + 32(, %%edx, 2), %%ax;" + "and (%3), %%di;" + "test (%4), %%ax;" + "jz 2f;" + "add (%5), %%di;" + "2:" + "and (%3), %%ax;" + "add %%di, %%ax;" // 17bit計算中 + "rcr $1, %%ax;" // 17bit計算中 + + "3:" + "mov %%ax, (%%ebx);" + "inc %%edx;" + "add $2, %%ebx;" + "dec %%cx;" + "jnz 0b;" + : /* output: nothing */ + : "m" (adr), "g" (ScrBuf), "g" (TextDotX), + "g" (Pal_HalfMask), "g" (Ibit), "g" (Pal_Ix2) + : "ax", "bx", "cx", "dx", "di", "memory"); + } else { + asm ( + "mov %0, %%ebx;" + "add %1, %%ebx;" + "xor %%edx, %%edx;" + "mov (%2), %%ecx;" + "0:" + "testb $2, Text_TrFlag + 16(%%edx);" + "jz 4f;" + + "mov Grp_LineBufSP(, %%edx, 2), %%di;" + "or %%di, %%di;" + "jnz 1f;" + + "mov BG_LineBuf + 32(, %%edx, 2), %%ax;" + "orw %%ax, %%ax;" + "jz 4f;" + "jmp 3f;" + + "1:" + // ねこーねこー + "mov BG_LineBuf + 32(, %%edx, 2), %%ax;" + "or %%ax, %%ax;" + "jz 4f;" + "and (%3), %%di;" + "test (%4), %%ax;" + "jz 2f;" + "add (%5), %%di;" + "2:" + "and (%3), %%ax;" + "add %%di, %%ax;" // 17bit計算中 + "rcr $1, %%ax;" // 17bit計算中 + + "3:" + "mov %%ax, (%%ebx);" + "4:" + "inc %%edx;" + "add $2, %%ebx;" + "dec %%cx;" + "jnz 0b;" + : /* output: nothing */ + : "m" (adr), "g" (ScrBuf), "g" (TextDotX), + "g" (Pal_HalfMask), "g" (Ibit), "g" (Pal_Ix2) + : "ax", "bx", "cx", "dx", "di", "memory"); + } +#else /* !USE_ASM && !(USE_GAS && __i386__) */ + DWORD adr = ((VLINE+16)*FULLSCREEN_WIDTH+16); + DWORD v; + WORD w; + int i; + + if (opaq) { + for (i = 16; i < TextDotX + 16; i++, adr++) { + w = Grp_LineBufSP[i - 16]; + v = BG_LineBuf[i]; + + if (w != 0) { + w &= Pal_HalfMask; + if (v & Ibit) + w += Pal_Ix2; + v &= Pal_HalfMask; + v += w; + v >>= 1; + } + ScrBuf[adr] = (WORD)v; + } + } else { + for (i = 16; i < TextDotX + 16; i++, adr++) { + if (Text_TrFlag[i] & 2) { + w = Grp_LineBufSP[i - 16]; + v = BG_LineBuf[i]; + + if (v != 0) { + if (w != 0) { + w &= Pal_HalfMask; + if (v & Ibit) + w += Pal_Ix2; + v &= Pal_HalfMask; + v += w; + v >>= 1; + } + ScrBuf[adr] = (WORD)v; + } + } + } + } +#endif /* USE_ASM */ +} + + +INLINE void WinDraw_DrawPriLine(void) +{ +#ifdef USE_ASM + DWORD adr = ((VLINE+16)*1600+32); + { + __asm { + mov ebx, adr + add ebx, offset ScrBuf + mov edx, offset Grp_LineBufSP + mov ecx, TextDotX + drawprilinelp: + mov ax, [edx] + or ax, ax + jz drawprilineskip + mov [ebx], ax + drawprilineskip: + add edx, 2 + add ebx, 2 +// dec cx +// jnz drawprilinelp + loop drawprilinelp + } + } +#elif defined(USE_GAS) && defined(__i386__) + DWORD adr = ((VLINE+16)*1600+32); + + asm ( + "mov %0, %%ebx;" + "add %1, %%ebx;" + "add %2, %%edx;" + "mov (%3), %%ecx;" + "0:" + "mov (%%edx), %%ax;" + "or %%ax, %%ax;" + "jz 1f;" + "mov %%ax, (%%ebx);" + "1:" + "add $2, %%edx;" + "add $2, %%ebx;" + "loop 0b;" + : /* output: nothing */ + : "m" (adr), "g" (ScrBuf), "g" (Grp_LineBufSP), "g" (TextDotX) + : "ax", "bx", "cx", "dx", "memory"); +#else /* !USE_ASM && !(USE_GAS && __i386__) */ + DWORD adr = ((VLINE+16)*FULLSCREEN_WIDTH+16); + WORD w; + int i; + + for (i = 0; i < TextDotX; i++, adr++) { + w = Grp_LineBufSP[i]; + if (w != 0) + ScrBuf[adr] = w; + } +#endif /* USE_ASM */ +} + + +INLINE void WinDraw_DrawTRLine(void) +{ +#ifdef USE_ASM + DWORD adr = ((VLINE+16)*1600+32); + __asm { + push edi + mov ebx, adr + add ebx, offset ScrBuf + xor edx, edx + xor edi, edi + xor eax, eax + mov ecx, TextDotX + drawtrlinelp: + mov di, word ptr Grp_LineBufSP[edx] + or di, di + jz drawtrlineskip + +// drawtrlineo: +#if 1 // ねこーねこー + mov ax, [ebx] + and di, Pal_HalfMask + test ax, Ibit + jz drawtrlineoI + add di, Pal_Ix2 + drawtrlineoI: + and ax, Pal_HalfMask + add ax, di // 17bit計算中 + rcr ax, 1 // 17bit計算中 +#else + push ecx + mov cx, [ebx] + and cx, WinDraw_Pal16R + and di, WinDraw_Pal16R + add ecx, edi + shr ecx, 1 + and cx, WinDraw_Pal16R + mov ax, cx + mov di, word ptr Grp_LineBufSP[edx] + mov cx, [ebx] + and cx, WinDraw_Pal16G + and di, WinDraw_Pal16G + add ecx, edi + shr ecx, 1 + and cx, WinDraw_Pal16G + or ax, cx + mov di, word ptr Grp_LineBufSP[edx] + mov cx, [ebx] + and cx, WinDraw_Pal16B + and di, WinDraw_Pal16B + add ecx, edi + shr ecx, 1 + and cx, WinDraw_Pal16B + or ax, cx + mov cx, [ebx] + and cx, Ibit + or ax, cx + pop ecx +#endif + mov [ebx], ax + drawtrlineskip: + add edx, 2 + add ebx, 2 + dec cx + jnz drawtrlinelp +// loop drawtrlinelp + pop edi + } +#elif defined(USE_GAS) && defined(__i386__) + DWORD adr = ((VLINE+16)*1600+32); + asm ( + "mov %0, %%ebx;" + "add %1, %%ebx;" + "xor %%edx, %%edx;" + "xor %%edi, %%edi;" + "xor %%eax, %%eax;" + "mov (%2), %%ecx;" + "0:" + "mov Grp_LineBufSP(%%edx), %%di;" + "or %%di, %%di;" + "jz 2f;" + + // ねこーねこー + "mov (%%ebx), %%ax;" + "and (%3), %%di;" + "test (%4), %%ax;" + "jz 1f;" + "add (%5), %%di;" + "1:" + "and (%3), %%ax;" + "add %%di, %%ax;" + "rcr $1, %%ax;" + "mov %%ax, (%%ebx);" + "2:" + "add $2, %%edx;" + "add $2, %%ebx;" + "dec %%cx;" + "jnz 0b;" + : /* output: nothing */ + : "m" (adr), "g" (ScrBuf), "g" (TextDotX), + "g" (Pal_HalfMask), "g" (Ibit), "g" (Pal_Ix2) + : "ax", "bx", "cx", "dx", "di", "memory"); +#else /* !USE_ASM && !(USE_GAS && __i386__) */ + DWORD adr = ((VLINE+16)*FULLSCREEN_WIDTH+16); + DWORD v; + WORD w; + int i; + + for (i = 0; i < TextDotX; i++, adr++) { + w = Grp_LineBufSP[i]; + if (w != 0) { + v = ScrBuf[adr]; + w &= Pal_HalfMask; + if (v & Ibit) + w += Pal_Ix2; + v &= Pal_HalfMask; + v += w; + v >>= 1; + ScrBuf[adr] = (WORD)v; + } + } +#endif /* USE_ASM */ +} + + +void WinDraw_DrawLine(void) +{ + int opaq, ton=0, gon=0, bgon=0, tron=0, pron=0, tdrawed=0; + + if (!TextDirtyLine[VLINE]) return; + TextDirtyLine[VLINE] = 0; + Draw_DrawFlag = 1; + + + if (Debug_Grp) + { + switch(VCReg0[1]&3) + { + case 0: // 16 colors + if (VCReg0[1]&4) // 1024dot + { + if (VCReg2[1]&0x10) + { + if ( (VCReg2[0]&0x14)==0x14 ) + { + Grp_DrawLine4hSP(); + pron = tron = 1; + } + else + { + Grp_DrawLine4h(); + gon=1; + } + } + } + else // 512dot + { + if ( (VCReg2[0]&0x10)&&(VCReg2[1]&1) ) + { + Grp_DrawLine4SP((VCReg1[1] )&3/*, 1*/); // 半透明の下準備 + pron = tron = 1; + } + opaq = 1; + if (VCReg2[1]&8) + { + Grp_DrawLine4((VCReg1[1]>>6)&3, 1); + opaq = 0; + gon=1; + } + if (VCReg2[1]&4) + { + Grp_DrawLine4((VCReg1[1]>>4)&3, opaq); + opaq = 0; + gon=1; + } + if (VCReg2[1]&2) + { + if ( ((VCReg2[0]&0x1e)==0x1e)&&(tron) ) + Grp_DrawLine4TR((VCReg1[1]>>2)&3, opaq); + else + Grp_DrawLine4((VCReg1[1]>>2)&3, opaq); + opaq = 0; + gon=1; + } + if (VCReg2[1]&1) + { +// if ( (VCReg2[0]&0x1e)==0x1e ) +// { +// Grp_DrawLine4SP((VCReg1[1] )&3, opaq); +// tron = pron = 1; +// } +// else + if ( (VCReg2[0]&0x14)!=0x14 ) + { + Grp_DrawLine4((VCReg1[1] )&3, opaq); + gon=1; + } + } + } + break; + case 1: + case 2: + opaq = 1; // 256 colors + if ( (VCReg1[1]&3) <= ((VCReg1[1]>>4)&3) ) // 同じ値の時は、GRP0が優先(ドラスピ) + { + if ( (VCReg2[0]&0x10)&&(VCReg2[1]&1) ) + { + Grp_DrawLine8SP(0); // 半透明の下準備 + tron = pron = 1; + } + if (VCReg2[1]&4) + { + if ( ((VCReg2[0]&0x1e)==0x1e)&&(tron) ) + Grp_DrawLine8TR(1, 1); + else + Grp_DrawLine8(1, 1); + opaq = 0; + gon=1; + } + if (VCReg2[1]&1) + { + if ( (VCReg2[0]&0x14)!=0x14 ) + { + Grp_DrawLine8(0, opaq); + gon=1; + } + } + } + else + { + if ( (VCReg2[0]&0x10)&&(VCReg2[1]&1) ) + { + Grp_DrawLine8SP(1); // 半透明の下準備 + tron = pron = 1; + } + if (VCReg2[1]&4) + { + if ( ((VCReg2[0]&0x1e)==0x1e)&&(tron) ) + Grp_DrawLine8TR(0, 1); + else + Grp_DrawLine8(0, 1); + opaq = 0; + gon=1; + } + if (VCReg2[1]&1) + { + if ( (VCReg2[0]&0x14)!=0x14 ) + { + Grp_DrawLine8(1, opaq); + gon=1; + } + } + } + break; + case 3: // 65536 colors + if (VCReg2[1]&15) + { + if ( (VCReg2[0]&0x14)==0x14 ) + { + Grp_DrawLine16SP(); + tron = pron = 1; + } + else + { + Grp_DrawLine16(); + gon=1; + } + } + break; + } + } + + +// if ( ( ((VCReg1[0]&0x30)>>4) < (VCReg1[0]&0x03) ) && (gon) ) +// gdrawed = 1; // GrpよりBGの方が上 + + if ( ((VCReg1[0]&0x30)>>2) < (VCReg1[0]&0x0c) ) + { // BGの方が上 + if ((VCReg2[1]&0x20)&&(Debug_Text)) + { + Text_DrawLine(1); + ton = 1; + } + else + ZeroMemory(Text_TrFlag, TextDotX+16); + + if ((VCReg2[1]&0x40)&&(BG_Regs[8]&2)&&(!(BG_Regs[0x11]&2))&&(Debug_Sp)) + { + int s1, s2; + s1 = (((BG_Regs[0x11] &4)?2:1)-((BG_Regs[0x11] &16)?1:0)); + s2 = (((CRTC_Regs[0x29]&4)?2:1)-((CRTC_Regs[0x29]&16)?1:0)); + VLINEBG = VLINE; + VLINEBG <<= s1; + VLINEBG >>= s2; + if ( !(BG_Regs[0x11]&16) ) VLINEBG -= ((BG_Regs[0x0f]>>s1)-(CRTC_Regs[0x0d]>>s2)); + BG_DrawLine(!ton, 0); + bgon = 1; + } + } + else + { // Textの方が上 + if ((VCReg2[1]&0x40)&&(BG_Regs[8]&2)&&(!(BG_Regs[0x11]&2))&&(Debug_Sp)) + { + int s1, s2; + s1 = (((BG_Regs[0x11] &4)?2:1)-((BG_Regs[0x11] &16)?1:0)); + s2 = (((CRTC_Regs[0x29]&4)?2:1)-((CRTC_Regs[0x29]&16)?1:0)); + VLINEBG = VLINE; + VLINEBG <<= s1; + VLINEBG >>= s2; + if ( !(BG_Regs[0x11]&16) ) VLINEBG -= ((BG_Regs[0x0f]>>s1)-(CRTC_Regs[0x0d]>>s2)); + ZeroMemory(Text_TrFlag, TextDotX+16); + BG_DrawLine(1, 1); + bgon = 1; + } + else + { + if ((VCReg2[1]&0x20)&&(Debug_Text)) + { +#ifdef USE_ASM + _asm{ + mov ax, TextPal[0] + shl eax, 16 + mov ax, TextPal[0] + mov edx, 16*2 + mov ecx, TextDotX + shr ecx, 1 + BGLineClr_lp: + mov dword ptr BG_LineBuf[edx], eax + add edx, 4 + loop BGLineClr_lp + } +#elif defined(USE_GAS) && defined(__i386__) + asm ( + "mov (%0), %%ax;" + "shl $16, %%eax;" + "mov (%0), %%ax;" + "mov $16*2, %%edx;" + "mov (%1), %%ecx;" + "shr $1, %%ecx;" + "0:" + "mov %%eax, BG_LineBuf(%%edx);" + "add $4, %%edx;" + "loop 0b;" + : /* output: nothing */ + : "g" (TextPal[0]), "g" (TextDotX) + : "ax", "cx", "dx", "memory"); +#else /* !USE_ASM && !(USE_GAS && __i386__) */ + int i; + for (i = 16; i < TextDotX + 16; ++i) + BG_LineBuf[i] = TextPal[0]; +#endif /* USE_ASM */ + } else { // 20010120 (琥珀色) +#ifdef USE_ASM + _asm{ + xor eax, eax + mov edx, 16*2 + mov ecx, TextDotX + shr ecx, 1 + BGLineClr_lp2: + mov dword ptr BG_LineBuf[edx], eax + add edx, 4 + loop BGLineClr_lp2 + } +#elif defined(USE_GAS) && defined(__i386__) + asm ( + "xor %%eax, %%eax;" + "mov $16*2, %%edx;" + "mov (%0), %%ecx;" + "shr $1, %%ecx;" + "0:" + "mov %%eax, BG_LineBuf(%%edx);" + "add $4, %%edx;" + "loop 0b;" + : /* output: nothing */ + : "g" (TextDotX) + : "ax", "cx", "dx", "memory"); +#else /* !USE_ASM && !(USE_GAS && __i386__) */ + bzero(&BG_LineBuf[16], TextDotX * 2); +#endif /* !USE_ASM */ + } + ZeroMemory(Text_TrFlag, TextDotX+16); + bgon = 1; + } + + if ((VCReg2[1]&0x20)&&(Debug_Text)) + { + Text_DrawLine(!bgon); + ton = 1; + } + } + + + opaq = 1; + + +#if 0 + // Pri = 3(違反)に設定されている画面を表示 + if ( ((VCReg1[0]&0x30)==0x30)&&(bgon) ) + { + if ( ((VCReg2[0]&0x5d)==0x1d)&&((VCReg1[0]&0x03)!=0x03)&&(tron) ) + { + if ( (VCReg1[0]&3)<((VCReg1[0]>>2)&3) ) + { + WinDraw_DrawBGLineTR(opaq); + tdrawed = 1; + opaq = 0; + } + } + else + { + WinDraw_DrawBGLine(opaq, /*tdrawed*/0); + tdrawed = 1; + opaq = 0; + } + } + if ( ((VCReg1[0]&0x0c)==0x0c)&&(ton) ) + { + if ( ((VCReg2[0]&0x5d)==0x1d)&&((VCReg1[0]&0x03)!=0x0c)&&(tron) ) + WinDraw_DrawTextLineTR(opaq); + else + WinDraw_DrawTextLine(opaq, /*tdrawed*/((VCReg1[0]&0x30)==0x30)); + opaq = 0; + tdrawed = 1; + } +#endif + // Pri = 2 or 3(最下位)に設定されている画面を表示 + // プライオリティが同じ場合は、GRP>2)&3) ) + { + WinDraw_DrawBGLineTR(opaq); + tdrawed = 1; + opaq = 0; + } + } + else + { + WinDraw_DrawBGLine(opaq, /*0*/tdrawed); + tdrawed = 1; + opaq = 0; + } + } + if ( (VCReg1[0]&0x08)&&(ton) ) + { + if ( ((VCReg2[0]&0x5d)==0x1d)&&((VCReg1[0]&0x03)!=0x02)&&(tron) ) + WinDraw_DrawTextLineTR(opaq); + else + WinDraw_DrawTextLine(opaq, tdrawed/*((VCReg1[0]&0x30)>=0x20)*/); + opaq = 0; + tdrawed = 1; + } + + // Pri = 1(2番目)に設定されている画面を表示 + if ( ((VCReg1[0]&0x03)==0x01)&&(gon) ) + { + WinDraw_DrawGrpLine(opaq); + opaq = 0; + } + if ( ((VCReg1[0]&0x30)==0x10)&&(bgon) ) + { + if ( ((VCReg2[0]&0x5d)==0x1d)&&(!(VCReg1[0]&0x03))&&(tron) ) + { + if ( (VCReg1[0]&3)<((VCReg1[0]>>2)&3) ) + { + WinDraw_DrawBGLineTR(opaq); + tdrawed = 1; + opaq = 0; + } + } + else + { + WinDraw_DrawBGLine(opaq, ((VCReg1[0]&0xc)==0x8)); + tdrawed = 1; + opaq = 0; + } + } + if ( ((VCReg1[0]&0x0c)==0x04) && ((VCReg2[0]&0x5d)==0x1d) && (VCReg1[0]&0x03) && (((VCReg1[0]>>4)&3)>(VCReg1[0]&3)) && (bgon) && (tron) ) + { + WinDraw_DrawBGLineTR(opaq); + tdrawed = 1; + opaq = 0; + if (tron) + { + WinDraw_DrawGrpLineNonSP(opaq); + } + } + else if ( ((VCReg1[0]&0x03)==0x01)&&(tron)&&(gon)&&(VCReg2[0]&0x10) ) + { + WinDraw_DrawGrpLineNonSP(opaq); + opaq = 0; + } + if ( ((VCReg1[0]&0x0c)==0x04)&&(ton) ) + { + if ( ((VCReg2[0]&0x5d)==0x1d)&&(!(VCReg1[0]&0x03))&&(tron) ) + WinDraw_DrawTextLineTR(opaq); + else + WinDraw_DrawTextLine(opaq, ((VCReg1[0]&0x30)>=0x10)); + opaq = 0; + tdrawed = 1; + } + + // Pri = 0(最優先)に設定されている画面を表示 + if ( (!(VCReg1[0]&0x03))&&(gon) ) + { + WinDraw_DrawGrpLine(opaq); + opaq = 0; + } + if ( (!(VCReg1[0]&0x30))&&(bgon) ) + { + WinDraw_DrawBGLine(opaq, /*tdrawed*/((VCReg1[0]&0xc)>=0x4)); + tdrawed = 1; + opaq = 0; + } + if ( (!(VCReg1[0]&0x0c)) && ((VCReg2[0]&0x5d)==0x1d) && (((VCReg1[0]>>4)&3)>(VCReg1[0]&3)) && (bgon) && (tron) ) + { + WinDraw_DrawBGLineTR(opaq); + tdrawed = 1; + opaq = 0; + if (tron) + { + WinDraw_DrawGrpLineNonSP(opaq); + } + } + else if ( (!(VCReg1[0]&0x03))&&(tron)&&(VCReg2[0]&0x10) ) + { + WinDraw_DrawGrpLineNonSP(opaq); + opaq = 0; + } + if ( (!(VCReg1[0]&0x0c))&&(ton) ) + { + WinDraw_DrawTextLine(opaq, 1); + tdrawed = 1; + opaq = 0; + } + + // 特殊プライオリティ時のグラフィック + if ( ((VCReg2[0]&0x5c)==0x14)&&(pron) ) // 特殊Pri時は、対象プレーンビットは意味が無いらしい(ついんびー) + { + WinDraw_DrawPriLine(); + } + else if ( ((VCReg2[0]&0x5d)==0x1c)&&(tron) ) // 半透明時に全てが透明なドットをハーフカラーで埋める + { // (AQUALES) +#ifdef USE_ASM + DWORD adr = ((VLINE+16)*1600+32); + __asm { + mov ebx, adr + add ebx, offset ScrBuf + xor edx, edx + mov ecx, TextDotX + trsublinelp: + mov ax, word ptr Grp_LineBufSP[edx] + or ax, ax + jz trsublineskip + test word ptr [ebx], 0ffffh + jnz trsublineskip + and ax, Pal_HalfMask + shr ax, 1 // 17bit計算中 + mov [ebx], ax + trsublineskip: + add edx, 2 + add ebx, 2 + loop trsublinelp + } +#elif defined(USE_GAS) && defined(__i386__) + DWORD adr = ((VLINE+16)*1600+32); + asm ( + "mov %0, %%ebx;" + "add %1, %%ebx;" + "xor %%edx, %%edx;" + "mov (%2), %%ecx;" + "0:" + "mov Grp_LineBufSP(%%edx), %%ax;" + "or %%ax, %%ax;" + "jz 1f;" + "testw $0xffff, (%%ebx);" + "jnz 1f;" + "and (%3), %%ax;" + "shr $1, %%ax;" // 17bit計算中 + "mov %%ax, (%%ebx);" + "1:" + "add $2, %%edx;" + "add $2, %%ebx;" + "loop 0b;" + : /* output: nothing */ + : "m" (adr), "g" (ScrBuf), "g" (TextDotX), + "g" (Pal_HalfMask) + : "ax", "bx", "cx", "dx", "memory"); +#else /* !USE_ASM && !(USE_GAS && __i386__) */ + DWORD adr = ((VLINE+16)*FULLSCREEN_WIDTH+16); + WORD w; + int i; + + for (i = 0; i < TextDotX; ++i, ++adr) { + w = Grp_LineBufSP[i]; + if (w != 0 && (ScrBuf[adr] & 0xffff) == 0) + ScrBuf[adr] = (w & Pal_HalfMask) >> 1; + } +#endif /* USE_ASM */ + } + + + if (opaq) + { +#ifdef USE_ASM + DWORD adr = ((VLINE+16)*1600+32); + __asm { + mov ebx, adr + add ebx, offset ScrBuf + mov ecx, TextDotX + shr cx, 1 + clrscrlp: + mov dword ptr [ebx], 0 + add ebx, 4 +// dec cx +// jnz clrscrlp + loop clrscrlp + } +#elif defined(USE_GAS) && defined(__i386__) + DWORD adr = ((VLINE+16)*1600+32); + asm ( + "mov %0, %%ebx;" + "add %1, %%ebx;" + "mov (%2), %%ecx;" + "shr $1, %%cx;" + "0:" + "movl $0, (%%ebx);" + "add $4, %%ebx;" + "loop 0b;" + : /* output: nothing */ + : "m" (adr), "g" (ScrBuf), "g" (TextDotX) + : "bx", "cx", "memory"); +#else /* !USE_ASM && !(USE_GAS && __i386__) */ + DWORD adr = ((VLINE+16)*FULLSCREEN_WIDTH+16); + bzero(&ScrBuf[adr], TextDotX * 2); +#endif /* USE_ASM */ + } + + switch (screen_mode) { + case 0: + gdk_draw_image(pixmap, + drawarea->style->fg_gc[GTK_WIDGET_STATE(drawarea)], + surface, 16, 16 + VLINE, 0, VLINE, WindowX, 1); + break; + } +} + + +/* ----- */ + +/** + * 最大公約数を求める + */ +unsigned int +gcd(unsigned int v0, unsigned int v1) +{ +#if 0 +/* + * ユークリッドの互除法版 + */ + unsigned int t; + + if (v0 == 0 || v1 == 0) + return 0; + if (v0 == 1 || v1 == 1) + return 1; + + if (v0 < v1) + t = v0, v0 = v1, v1 = t; + + for (; t = v0 % v1; v0 = v1, v1 = t) + continue; + return v1; +#else +/* + * Brent の改良型アルゴリズム + */ + unsigned int c; + unsigned int d; + unsigned int t; + + if (v0 == 0 || v1 == 0) + return 0; + if (v0 == 1 || v1 == 1) + return 1; + if (v0 == v1) + return v0; + + for (c = 0; !(v0 & 1) && !(v1 & 1); v0 >>= 1, v1 >>= 1, ++c) + continue; + + while (!(v0 & 1)) + v0 >>= 1; + while (!(v1 & 1)) + v1 >>= 1; + if (v0 < v1) + t = v0, v0 = v1, v1 = t; + + for (; (d = v0 - v1) != 0; v0 = v1, v1 = d) { + while ((d & 1) == 0) + d >>= 1; + if (v1 < d) + t = v1, v1 = d, d = t; + } + return v1 << c; +#endif +} + +static void expand16_fast(GdkImage *dest, GdkImage *src, GdkRectangle *dr, GdkRectangle *sr, int ratio[4]); + +GdkImage * +gdk_scale_image(GdkImage *dest, GdkImage *src, GdkRectangle *dest_rect, GdkRectangle *src_rect) +{ + GdkRectangle dr, sr; + GdkImage *new = dest; + int ratio[4]; + int x_gcd, y_gcd; + + g_return_val_if_fail(src, 0); + g_return_val_if_fail((src->visual->depth == 15 || src->visual->depth == 16), 0); + + if (dest_rect == 0) { + GdkImage *p = dest ? dest : src; + dr.x = dr.y = 0; + dr.width = p->width; + dr.height = p->height; + } else + dr = *dest_rect; + + if (src_rect == 0) { + sr.x = sr.y = 0; + sr.width = src->width; + sr.height = src->height; + } else { + sr = *src_rect; + g_return_val_if_fail((sr.x >= 0 && sr.y >= 0), 0); + } + + if (new == 0) { + new = gdk_image_new(GDK_IMAGE_FASTEST, src->visual, dr.width + (dr.x > 0 ? dr.x : 0), dr.height + (dr.y > 0 ? dr.y : 0)); + g_return_val_if_fail(new, 0); + } + + x_gcd = gcd(sr.width, dr.width); + y_gcd = gcd(sr.height, dr.height); + + if (x_gcd >= 2 && y_gcd >= 2) + /* continue */; + else { + if (dest == 0) + gdk_image_destroy(new); + g_return_val_if_fail((x_gcd >= 2 && y_gcd >= 2), 0); + } + + ratio[0] /* dx_ratio */ = dr.width / x_gcd; + ratio[1] /* sx_ratio */ = sr.width / x_gcd; + ratio[2] /* dy_ratio */ = dr.height / y_gcd; + ratio[3] /* sy_ratio */ = sr.height / y_gcd; +#if 0 + if (ratio[0] >= ratio[1] && ratio[2] >= ratio[3]) + /* continue */; + else { + printf("sr(width, height) = (%d, %d), dr(width, height) = (%d, %d)\n", sr.width, sr.height, dr.width, dr.height); + printf("gcd(x, y) = (%d, %d)\n", x_gcd, y_gcd); + printf("ratio(0, 1, 2, 3) = (%d, %d, %d, %d)\n", ratio[0], ratio[1], ratio[2], ratio[3]); + if (dest == 0) + gdk_image_destroy(new); + g_return_val_if_fail((ratio[0] >= ratio[1] && ratio[2] >= ratio[3]), NULL); + } +#endif + expand16_fast(new, src, &dr, &sr, ratio); + + return new; +} + +static void +expand16_fast(GdkImage *dest, GdkImage *src, GdkRectangle *dr, GdkRectangle *sr, int ratio[4]) +{ + guint16 *dp, *sp; + int dest_right, dest_bottom; + int sx, sy; + int dx, dy; + int x_ratio = 0, y_ratio = 0; + + dest_right = dr->x + dr->width; + dest_bottom = dr->y + dr->height; + if (dest_right < 0 && dest_bottom < 0) + return; + + for (sy = sr->y, dy = dr->y; dy < dest_bottom; ++dy) { + dp = (guint16 *)(dest->mem + dest->bpl * dy); + sp = (guint16 *)(src->mem + src->bpl * sy); + for (sx = sr->x, dx = dr->x; dx < dest_right; ++dx) { + if (dx >= 0 && dy >= 0) + dp[dx] = sp[sx]; + + x_ratio += ratio[1] /* sx_ratio */; + if (ratio[0] /* dx_ratio */ <= x_ratio) { + ++sx; + x_ratio -= ratio[0] /* dx_ratio */; + } + } + + y_ratio += ratio[3] /* sy_ratio */; + if (ratio[2] /* dy_ratio */ <= y_ratio) { + ++sy; + y_ratio -= ratio[2] /* dy_ratio */; + } + } +} diff --git a/x11/windraw.h b/x11/windraw.h new file mode 100644 index 0000000..306a29c --- /dev/null +++ b/x11/windraw.h @@ -0,0 +1,35 @@ +/* $Id: windraw.h,v 1.1.1.1 2003/04/28 18:06:56 nonaka Exp $ */ + +#ifndef _winx68k_windraw_h +#define _winx68k_windraw_h + +extern BYTE Draw_DrawFlag; +extern int winx, winy; +extern int winh, winw; +extern WORD *ScrBuf; +extern int FullScreenFlag; +extern BYTE Draw_ClrMenu; +extern WORD FrameCount; +extern WORD WinDraw_Pal16B, WinDraw_Pal16R, WinDraw_Pal16G; + +extern BYTE Draw_BitMask[800]; +extern BYTE Draw_TextBitMask[800]; + +extern int WindowX; +extern int WindowY; + +void WinDraw_InitWindowSize(WORD width, WORD height); +void WinDraw_ChangeMode(int flag); +int WinDraw_Init(void); +void WinDraw_Cleanup(void); +void WinDraw_Redraw(void); +void FASTCALL WinDraw_Draw(void); +void WinDraw_ShowMenu(int flag); +void WinDraw_DrawLine(void); +void WinDraw_HideSplash(void); +void WinDraw_ChangeSize(void); + +void WinDraw_StartupScreen(void); +void WinDraw_CleanupScreen(void); + +#endif //winx68k_windraw_h diff --git a/x11/winui.c b/x11/winui.c new file mode 100644 index 0000000..3280fe8 --- /dev/null +++ b/x11/winui.c @@ -0,0 +1,1017 @@ +/* $Id: winui.c,v 1.8 2008/11/11 02:46:30 nonaka Exp $ */ + +/* + * Copyright (c) 2003,2008 NONAKA Kimihiro + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* -------------------------------------------------------------------------- * + * WINUI.C - UI関連 * + * -------------------------------------------------------------------------- */ + +#include +#include + +#include "common.h" +#include "about.h" +#include "keyboard.h" +#include "windraw.h" +#include "dswin.h" +#include "fileio.h" +#include "prop.h" +#include "status.h" +#include "joystick.h" +#include "mouse.h" +#include "winx68k.h" +#include "version.h" +#include "juliet.h" +#include "fdd.h" +#include "irqh.h" +#include "m68000.h" +#include "crtc.h" +#include "mfp.h" +#include "fdc.h" +#include "disk_d88.h" +#include "dmac.h" +#include "ioc.h" +#include "rtc.h" +#include "sasi.h" +#include "bg.h" +#include "palette.h" +#include "crtc.h" +#include "pia.h" +#include "scc.h" +#include "midi.h" +#include "adpcm.h" +#include "mercury.h" +#include "tvram.h" + +#include "fmg_wrap.h" + +extern BYTE fdctrace; +extern BYTE traceflag; +extern WORD FrameCount; +extern DWORD TimerICount; +extern unsigned int hTimerID; + DWORD timertick=0; +extern int FullScreenFlag; + int UI_MouseFlag = 0; + int UI_MouseX = -1, UI_MouseY = -1; +extern int NoWaitMode; +extern short timertrace; + + BYTE MenuClearFlag = 0; + + BYTE Debug_Text=1, Debug_Grp=1, Debug_Sp=1; + BYTE FrameRate = 2; + + char filepath[MAX_PATH] = "."; + int fddblink = 0; + int fddblinkcount = 0; + int hddtrace = 0; +extern int dmatrace; + + DWORD LastClock[4] = {0, 0, 0, 0}; + +#define EVENT_MASK \ + (GDK_BUTTON1_MOTION_MASK \ + | GDK_BUTTON2_MOTION_MASK \ + | GDK_BUTTON3_MOTION_MASK \ + | GDK_POINTER_MOTION_MASK \ + | GDK_POINTER_MOTION_HINT_MASK \ + | GDK_KEY_PRESS_MASK \ + | GDK_KEY_RELEASE_MASK \ + | GDK_BUTTON_PRESS_MASK \ + | GDK_BUTTON_RELEASE_MASK \ + | GDK_EXPOSURE_MASK) + + +static gint key_press(GtkWidget *w, GdkEventKey *ev); +static gint key_release(GtkWidget *w, GdkEventKey *ev); +static gint button_press(GtkWidget *w, GdkEventButton *ev); +static gint button_release(GtkWidget *w, GdkEventButton *ev); +static gint motion_notify(GtkWidget *w, GdkEventMotion *ev); +static gint expose(GtkWidget *w, GdkEventExpose *ev); + +static void xmenu_toggle_item(char *name, int onoff, int emitp); + +static gint wm_timer(gpointer data); + +static void file_selection(int type, char *title, char *defstr, void *arg); + +typedef struct { + GtkWidget *fs; + int type; + void *arg; +} file_selection_t; + +/****************************************************************************** + * init + ******************************************************************************/ +void +WinUI_Init(void) +{ + + /* + * ハンドラ設定 + */ + gtk_signal_connect(GTK_OBJECT(window), "destroy", + GTK_SIGNAL_FUNC(gtk_main_quit), (void *)"WM destroy"); + gtk_signal_connect(GTK_OBJECT(window), "key_press_event", + GTK_SIGNAL_FUNC(key_press), NULL); + gtk_signal_connect(GTK_OBJECT(window), "key_release_event", + GTK_SIGNAL_FUNC(key_release), NULL); + gtk_signal_connect(GTK_OBJECT(window), "button_press_event", + GTK_SIGNAL_FUNC(button_press), NULL); + gtk_signal_connect(GTK_OBJECT(window), "button_release_event", + GTK_SIGNAL_FUNC(button_release), NULL); + gtk_signal_connect(GTK_OBJECT(window), "motion_notify_event", + GTK_SIGNAL_FUNC(motion_notify), NULL); + + gtk_signal_connect(GTK_OBJECT(drawarea), "expose_event", + GTK_SIGNAL_FUNC(expose), NULL); + + /* + * イベント設定 + */ + gtk_widget_add_events(GTK_WIDGET(window), EVENT_MASK); + + /* + * タイトルバー変更用タイマ + */ + hTimerID = gtk_timeout_add(500, wm_timer, (gpointer)window); +} + +/****************************************************************************** + * イベントハンドラ + ******************************************************************************/ + +#include + +/* + - Signal: gint GtkWidget::expose_event (GtkWidget *WIDGET, + GdkEventExpose *EVENT) +*/ +static gint +expose(GtkWidget *w, GdkEventExpose *ev) +{ + + UNUSED(w); + + if (ev->type == GDK_EXPOSE) { + if (ev->count == 0) { + WinDraw_Redraw(); + WinDraw_Draw(); + } + return TRUE; + } + return FALSE; +} + +/* + - Signal: gint GtkWidget::key_press_event (GtkWidget *WIDGET, + GdkEventKey *EVENT) +*/ +static gint +key_press(GtkWidget *w, GdkEventKey *ev) +{ + + UNUSED(w); + + if (ev->type == GDK_KEY_PRESS) { + if (ev->keyval != GDK_F12) + Keyboard_KeyDown(ev->keyval); + return TRUE; + } + return FALSE; +} + +/* + - Signal: gint GtkWidget::key_release_event (GtkWidget *WIDGET, + GdkEventKey *EVENT) +*/ +static gint +key_release(GtkWidget *w, GdkEventKey *ev) +{ + + UNUSED(w); + + if (ev->type == GDK_KEY_RELEASE) { + if (ev->keyval == GDK_F12) { + xmenu_toggle_item("mouse", UI_MouseFlag ^ 1, 1); + } else + Keyboard_KeyUp(ev->keyval); + return TRUE; + } + return FALSE; +} + +/* + - Signal: gint GtkWidget::button_press_event (GtkWidget *WIDGET, + GdkEventButton *EVENT) +*/ +static gint +button_press(GtkWidget *w, GdkEventButton *ev) +{ + + UNUSED(w); + + if (ev->type == GDK_BUTTON_PRESS) { + switch (ev->button) { + case 1: + Mouse_Event(1, TRUE); + break; + + case 2: + xmenu_toggle_item("mouse", UI_MouseFlag ^ 1, 1); + break; + + case 3: + Mouse_Event(2, TRUE); + break; + } + return TRUE; + } + return FALSE; +} + +/* + - Signal: gint GtkWidget::button_release_event (GtkWidget *WIDGET, + GdkEventButton *EVENT) +*/ +static gint +button_release(GtkWidget *w, GdkEventButton *ev) +{ + + UNUSED(w); + + if (ev->type == GDK_BUTTON_RELEASE) { + switch (ev->button) { + case 1: + Mouse_Event(1, FALSE); + break; + + case 2: + break; + + case 3: + Mouse_Event(2, FALSE); + break; + } + return TRUE; + } + return FALSE; +} + +/* +- Signal: gint GtkWidget::motion_notify_event (GtkWidget *WIDGET, + GdkEventMotion *EVENT) +*/ +static gint +motion_notify(GtkWidget *w, GdkEventMotion *ev) +{ + GdkModifierType state; + int x, y; + + UNUSED(w); + + if (ev->type == GDK_MOTION_NOTIFY) { + if (ev->is_hint) { + gdk_window_get_pointer (ev->window, &x, &y, &state); + } else { + x = ev->x; + y = ev->y; + state = ev->state; + } + Mouse_Event(0, (x << 16) | y); + return TRUE; + } + return FALSE; +} + +/*- + * タイマ + */ +gint +wm_timer(gpointer data) +{ + DWORD timernowtick = timeGetTime(); + unsigned int freq = TimerICount / (timernowtick - timertick); + int fddflag = 0; + + timertick = timernowtick; + LastClock[3] = LastClock[2]; + LastClock[2] = LastClock[1]; + LastClock[1] = LastClock[0]; + LastClock[0] = freq; + TimerICount = 0; + + + if (fddblink) { + char buf[256]; +#ifdef WIN68DEBUG + g_snprintf(buf, sizeof(buf), + "%s - %2d fps / %2d.%03d MHz PC:%08X", + PrgTitle, FrameCount, (freq/1000), (freq%1000), regs.pc); +#else + if ( juliet_YM2151IsEnable() ) { + g_snprintf(buf, sizeof(buf), + "%s v%s w/ ROMEO - %2d fps / %2d.%03d MHz", + PrgTitle, APP_VER_STRING, + FrameCount, (freq/1000), (freq%1000)); + } else { + g_snprintf(buf, sizeof(buf), + "%s v%s - %2d fps / %2d.%03d MHz", + PrgTitle, APP_VER_STRING, + FrameCount, (freq/1000), (freq%1000)); + } +#endif + FrameCount = 0; + gtk_window_set_title(GTK_WINDOW(data), buf); + } + fddblink ^= 1; + + StatBar_UpdateTimer(); + + if (fddflag) { + if (fddblink) { + fddblinkcount++; + } + } else { + fddblinkcount = 0; + } + + return TRUE; +} + +/****************************************************************************** + * メニュー + ******************************************************************************/ + +static void reset(gpointer, guint, GtkWidget *); +static void nmi_reset(gpointer, guint, GtkWidget *); +static void exit_from_menu(gpointer, guint, GtkWidget *); +static void framerate(gpointer, guint, GtkWidget *); +static void stretch(gpointer, guint, GtkWidget *); +static void xvimode(gpointer, guint, GtkWidget *); +static void toggle(gpointer, guint, GtkWidget *); +static void videoreg_save(gpointer, guint, GtkWidget *); +static void fdd_open(gpointer, guint, GtkWidget *); +static void fdd_eject(gpointer, guint, GtkWidget *); + +#define f(f) ((GtkItemFactoryCallback)(f)) +#define s(s) ((guint)(s)) +static GtkItemFactoryEntry menu_items[] = { +{ "/_System", NULL, NULL, 0, "" }, +{ "/System/_Reset", NULL, f(reset), 0, NULL }, +{ "/System/_NMI Reset", NULL, f(nmi_reset), 0, NULL }, +{ "/System/sep", NULL, NULL, 0, "" }, +{ "/System/_Quit", NULL, f(exit_from_menu), 0, NULL }, +{ "/FDD_0", NULL, NULL, 0, "" }, +{ "/FDD0/_Open", NULL, f(fdd_open), 0, NULL }, +{ "/FDD0/_Eject", NULL, f(fdd_eject), 0, NULL }, +{ "/FDD_1", NULL, NULL, 0, "" }, +{ "/FDD1/_Open", NULL, f(fdd_open), 1, NULL }, +{ "/FDD1/_Eject", NULL, f(fdd_eject), 1, NULL }, +{ "/_Display", NULL, NULL, 0, "" }, +{ "/Display/_Full Screen", NULL, f(toggle),s("fullscreen"),""}, +{ "/Display/sep0", NULL, NULL, 0, "" }, +{ "/Display/Auto Frame Skip", NULL, f(framerate), 7, "" }, +{ "/Display/_60 fps", NULL,f(framerate),1,"/Display/Auto Frame Skip"}, +{ "/Display/_30 fps", NULL, f(framerate), 2, "/Display/60 fps" }, +{ "/Display/_20 fps", NULL, f(framerate), 3, "/Display/30 fps" }, +{ "/Display/1_5 fps", NULL, f(framerate), 4, "/Display/20 fps" }, +{ "/Display/_12 fps", NULL, f(framerate), 5, "/Display/15 fps" }, +{ "/Display/1_0 fps", NULL, f(framerate), 6, "/Display/12 fps" }, +{ "/Display/_7.5 fps", NULL, f(framerate), 8, "/Display/10 fps" }, +{ "/Display/sep1", NULL, NULL, 0, "" }, +{ "/Display/Fixed Stretch", NULL, f(stretch), 1, "" }, +{ "/Display/Auto Stretch", NULL, f(stretch), 2, "/Display/Fixed Stretch" }, +{ "/Display/Auto with X68 Size", NULL, f(stretch), 3, "/Display/Auto Stretch" }, +{ "/Display/No Stretch", NULL,f(stretch),0,"/Display/Auto with X68 Size"}, +{ "/_Option", NULL, NULL, 0, "" }, +{ "/Option/Mouse Mode [F12]", NULL, f(toggle), s("mouse"), "" }, +{ "/Option/sep0", NULL, NULL, 0, "" }, +{ "/Option/_JoyKey Mode", NULL, f(toggle), s("joykey"), "" }, +{"/Option/Reverse JoyKey _Button",NULL,f(toggle),s("joykeyrev"),""}, +{"/Option/_Use JoyKey as Joy2", NULL, f(toggle),s("joykeyjoy2"),""}, +{ "/Option/sep1", NULL, NULL, 0, "" }, +{ "/Option/10MHz (Normal)", NULL, f(xvimode), 0, "" }, +{ "/Option/16MHz (XVI)", NULL, f(xvimode), 1, "/Option/10MHz (Normal)" }, +{ "/Option/24MHz (RED ZONE)", NULL, f(xvimode), 2, "/Option/16MHz (XVI)" }, +{ "/Option/sep2", NULL, NULL, 0, "" }, +{ "/Option/No-_Wait Mode", NULL, f(toggle), s("nowait"), "" }, +{ "/Option/sep3", NULL, NULL, 0, "" }, +{ "/Option/Config", NULL, f(PropPage_Init), 0, NULL }, +{ "/_Help", NULL, NULL, 0, "" }, +{ "/Help/About", NULL, f(create_about_dialog), 0, NULL }, +{ "/Debug", NULL, NULL, 0, "" }, +{ "/Debug/Trace", NULL, f(toggle), s("db_trace"),""}, +{ "/Debug/sep0", NULL, NULL, 0, "" }, +{ "/Debug/HDD Trace", NULL,f(toggle),s("db_hddtrace"),""}, +{ "/Debug/DMA Trace", NULL,f(toggle),s("db_dmatrace"),""}, +{ "/Debug/MFP Timer Trace", NULL,f(toggle),s("db_mfptrace"),""}, +{ "/Debug/sep1", NULL, NULL, 0, "" }, +{ "/Debug/Text On|Off", NULL, f(toggle), s("db_text"), ""}, +{ "/Debug/Grp On|Off", NULL, f(toggle), s("db_grp"), "" }, +{ "/Debug/SP|BG On|Off", NULL, f(toggle), s("db_spgb"), ""}, +{ "/Debug/VideoReg Save", NULL, f(videoreg_save), 0, NULL }, +}; +#undef s +#undef f + +typedef struct toggle_tag { + int cookie; + char *name; + char *menu_item; + int stat; +} toggle_t; + +static toggle_t toggle_items[] = { + { 0, "fullscreen", "/Display/Full Screen", 0 }, + { 1, "mouse", "/Option/Mouse Mode [F12]", 0 }, + { 2, "joykey", "/Option/JoyKey Mode", 0 }, + { 3, "joykeyrev", "/Option/Reverse JoyKey Button", 0 }, + { 4, "joykeyjoy2", "/Option/Use JoyKey as Joy2", 0 }, + { 5, "nowait", "/Option/No-Wait Mode", 0 }, + { 6, "db_trace", "/Debug/Trace", 0 }, + { 7, "db_hddtrace", "/Debug/HDD Trace", 0 }, + { 8, "db_dmatrace", "/Debug/DMA Trace", 0 }, + { 9, "db_mfptrace", "/Debug/MFP Timer Trace", 0 }, + { 10, "db_text", "/Debug/Text On|Off", 0 }, + { 11, "db_grp", "/Debug/Grp On|Off", 0 }, + { 12, "db_spbg", "/Debug/SP|BG On|Off", 0 }, +}; + +static GtkItemFactory *item_factory; +static int menu_inited = 0; + +static void disable_unused_items(void); +static void enable_item(char *name); +static void disable_item(char *name); +static void select_item(char *name); +static void xmenu_select_framerate(int kind); +static void xmenu_select_stretch(int kind); +//static void xmenu_select_xvimode(int kind); + + +GtkWidget * +create_menu(GtkWidget *w) +{ + GtkAccelGroup *accel_group; + + accel_group = gtk_accel_group_new(); + item_factory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "
", accel_group); + gtk_item_factory_create_items(item_factory, NELEMENTS(menu_items), menu_items, NULL); + gtk_window_add_accel_group(GTK_WINDOW(w), accel_group); + + xmenu_toggle_item("fullscreen", FullScreenFlag, 1); + xmenu_toggle_item("mouse", MouseSW, 1); + xmenu_toggle_item("joykey", Config.JoyKey, 1); + xmenu_toggle_item("joykeyrev", Config.JoyKeyReverse, 1); + xmenu_toggle_item("joykeyjoy2", Config.JoyKeyJoy2, 1); + xmenu_toggle_item("nowait", NoWaitMode, 1); +#ifdef DEBUG + xmenu_toggle_item("db_trace", traceflag, 1); + xmenu_toggle_item("db_hddtrace", hddtrace, 1); + xmenu_toggle_item("db_dmatrace", dmatrace, 1); + xmenu_toggle_item("db_mfptrace", timertrace, 1); + xmenu_toggle_item("db_text", Debug_Text, 1); + xmenu_toggle_item("db_grp", Debug_Grp, 1); + xmenu_toggle_item("db_spbg", Debug_Sp, 1); +#endif + + xmenu_select_framerate(FrameRate); + xmenu_select_stretch(Config.WinStrech); + + disable_unused_items(); + + menu_inited = 1; + + return gtk_item_factory_get_widget(item_factory, "
"); +} + +static void +disable_unused_items(void) +{ + static char *items[] = { + "/Display/Full Screen", +#ifndef DEBUG + "/Debug/Trace", + "/Debug/HDD Trace", + "/Debug/DMA Trace", + "/Debug/MFP Timer Trace", + "/Debug/Text On|Off", + "/Debug/Grp On|Off", + "/Debug/SP|BG On|Off", + "/Debug/VideoReg Save", +#endif + NULL + }; + int i; + + for (i = 0; i < NELEMENTS(items); i++) { + if (items[i]) + disable_item(items[i]); + } + + if (!Config.JoyKey) { + disable_item("/Option/Reverse JoyKey Button"); + disable_item("/Option/Use JoyKey as Joy2"); + } +} + +static void +enable_item(char *name) +{ + GtkWidget *menu_item; + + menu_item = gtk_item_factory_get_widget(item_factory, name); + gtk_widget_set_sensitive(menu_item, TRUE); +} + +static void +disable_item(char *name) +{ + GtkWidget *menu_item; + + menu_item = gtk_item_factory_get_widget(item_factory, name); + gtk_widget_set_sensitive(menu_item, FALSE); +} + +static void +select_item(char *name) +{ + GtkWidget *menu_item; + + menu_item = gtk_item_factory_get_widget(item_factory, name); + gtk_signal_emit_by_name(GTK_OBJECT(menu_item), "activate-item"); +} + +void +xmenu_toggle_item(char *name, int onoff, int emitp) +{ + int i; + + for (i = 0; i < NELEMENTS(toggle_items); ++i) { + if (strcmp(toggle_items[i].name, name) == 0) + break; + } + if (i == NELEMENTS(toggle_items)) + return; + + if (onoff != toggle_items[i].stat) { + toggle_items[i].stat = onoff; + if (emitp) + select_item(toggle_items[i].menu_item); + } +} + +static void +xmenu_select_framerate(int kind) +{ + static char *name[] = { + NULL, /* 0 */ + "/Display/60 fps", /* 1 */ + "/Display/30 fps", /* 2 */ + "/Display/20 fps", /* 3 */ + "/Display/15 fps", /* 4 */ + "/Display/12 fps", /* 5 */ + "/Display/10 fps", /* 6 */ + "/Display/Auto Frame Skip", /* 7 */ + "/Display/7.5 fps", /* 8 */ + }; + + if (kind > 0 && kind < NELEMENTS(name)) { + if (name[kind]) + select_item(name[kind]); + } +} + +static void +xmenu_select_stretch(int kind) +{ + static char *name[] = { + "/Display/No Stretch", + "/Display/Fixed Stretch", + "/Display/Auto Stretch", + "/Display/Auto with X68 Size", + }; + + if (kind >= 0 && kind < NELEMENTS(name)) { + if (name[kind]) + select_item(name[kind]); + } +} + +#if 0 +static void +xmenu_select_xvimode(int kind) +{ + static char *name[] = { + "/Option/10MHz (Normal)", + "/Option/16MHz (XVI)", + "/Option/24MHz (RED ZONE)", + }; + + if (kind >= 0 && kind < NELEMENTS(name)) { + if (name[kind]) + select_item(name[kind]); + } +} +#endif + +/* + * item function + */ +static void +exit_from_menu(gpointer data, guint action, GtkWidget *w) +{ + + UNUSED(data); + UNUSED(action); + UNUSED(w); + + gtk_main_quit(); +} + +static void +reset(gpointer data, guint action, GtkWidget *w) +{ + + UNUSED(data); + UNUSED(action); + UNUSED(w); + + WinX68k_Reset(); + if (Config.MIDI_SW && Config.MIDI_Reset) + MIDI_Reset(); +} + +static void +nmi_reset(gpointer data, guint action, GtkWidget *w) +{ + + UNUSED(data); + UNUSED(action); + UNUSED(w); + + IRQH_Int(7, NULL); +} + +static void +framerate(gpointer data, guint action, GtkWidget *w) +{ + UNUSED(data); + UNUSED(w); + + if (FrameRate != action) + FrameRate = action; +} + +static void +stretch(gpointer data, guint action, GtkWidget *w) +{ + UNUSED(data); + UNUSED(w); + + if (Config.WinStrech != (int)action) + Config.WinStrech = action; +} + +static void +xvimode(gpointer data, guint action, GtkWidget *w) +{ + UNUSED(data); + UNUSED(w); + + if (Config.XVIMode != (int)action) + Config.XVIMode = action; +} + +static void +videoreg_save(gpointer data, guint action, GtkWidget *w) +{ + char buf[256]; + + UNUSED(data); + UNUSED(action); + UNUSED(w); + + DSound_Stop(); + g_snprintf(buf, sizeof(buf), + "VCReg 0:$%02X%02X 1:$%02x%02X 2:$%02X%02X " + "CRTC00/02/05/06=%02X/%02X/%02X/%02X%02X " + "BGHT/HD/VD=%02X/%02X/%02X $%02X/$%02X", + VCReg0[0], VCReg0[1], VCReg1[0], VCReg1[1], VCReg2[0], VCReg2[1], + CRTC_Regs[0x01], CRTC_Regs[0x05], CRTC_Regs[0x0b], CRTC_Regs[0x0c], + CRTC_Regs[0x0d], + BG_Regs[0x0b], BG_Regs[0x0d], BG_Regs[0x0f], + CRTC_Regs[0x29], BG_Regs[0x11]); + Error(buf); + DSound_Play(); +} + +static void +fdd_open(gpointer data, guint action, GtkWidget *w) +{ + + (void)w; + (void)data; + + if (action < 2) + file_selection(0, "Open FD image", filepath, (void *)action); +} + +static void +fdd_eject(gpointer data, guint action, GtkWidget *w) +{ + + (void)w; + (void)data; + + FDD_EjectFD(action); +} + +static void +toggle(gpointer data, guint action, GtkWidget *w) +{ + char *name = (char *)action; + int i; + + UNUSED(data); + UNUSED(w); + + if (!menu_inited) + return; + + for (i = 0; i < NELEMENTS(toggle_items); ++i) { + if (strcmp(toggle_items[i].name, name) == 0) + break; + } + if (i == NELEMENTS(toggle_items)) + return; + + switch (toggle_items[i].cookie) { + case 0: // fullscreen +#if 0 + xmenu_toggle_item("fullscreen", !FullScreenFlag, 0); + ChangeFullScreen(!FullScreenFlag); +#endif + break; + + case 1: // mouse + UI_MouseFlag ^= 1; + xmenu_toggle_item("mouse", UI_MouseFlag, 0); + Mouse_StartCapture(UI_MouseFlag); + break; + + case 2: // joykey + Config.JoyKey ^= 1; + if (Config.JoyKey) { + enable_item("/Option/Reverse JoyKey Button"); + enable_item("/Option/Use JoyKey as Joy2"); + } else { + disable_item("/Option/Reverse JoyKey Button"); + disable_item("/Option/Use JoyKey as Joy2"); + } + xmenu_toggle_item("joykey", Config.JoyKey, 0); + break; + + case 3: // joykeyrev + Config.JoyKeyReverse ^= 1; + xmenu_toggle_item("joykey_rev", Config.JoyKeyReverse,0); + break; + + case 4: // joykeyjoy2 + Config.JoyKeyJoy2 ^= 1; + xmenu_toggle_item("joykey_joy2", Config.JoyKeyJoy2, 0); + break; + + case 5: // nowait + NoWaitMode ^= 1; + xmenu_toggle_item("nowait", NoWaitMode, 0); + break; + + case 6: // db_trace + traceflag ^= 1; + xmenu_toggle_item("db_trace", traceflag, 0); + break; + + case 7: // db_hddtrace + hddtrace ^= 1; + xmenu_toggle_item("db_hddtrace", hddtrace, 0); + break; + + case 8: // db_dmatrace + dmatrace ^= 1; + xmenu_toggle_item("db_dmatrace", dmatrace, 0); + break; + + case 9: // db_mfptrace + timertrace ^= 1; + xmenu_toggle_item("db_mfptrace", timertrace, 0); + break; + + case 10: // db_text + Debug_Text ^= 1; + TVRAM_SetAllDirty(); + xmenu_toggle_item("db_text", Debug_Text, 0); + break; + + case 11: // db_grp + Debug_Grp ^= 1; + TVRAM_SetAllDirty(); + xmenu_toggle_item("db_grp", Debug_Grp, 0); + break; + + case 12: // db_spbg + Debug_Sp ^= 1; + TVRAM_SetAllDirty(); + xmenu_toggle_item("db_spbg", Debug_Sp, 0); + break; + } +} + +/* + * file selecter + */ +static int +FDType(const char *fname) +{ + const char *p; + int len; + + len = strlen(fname); + if (len > 4) { + p = fname + len - 4; + if (strcmp(p, ".D88") == 0 || strcmp(p, ".d88") == 0 || + strcmp(p, ".88D") == 0 || strcmp(p, ".88d") == 0) { + return FD_D88; + } + if (strcmp(p, ".DIM") == 0 || strcmp(p, ".dim") == 0) { + return FD_DIM; + } + return FD_XDF; + } + return FD_Non; +} + +static void +file_selection_ok(GtkWidget *w, GtkFileSelection *gfs) +{ + file_selection_t *fsp = (file_selection_t *)gfs; + GtkFileSelection *fs = (GtkFileSelection *)fsp->fs; + char *p; + + (void)w; + + p = (char *)gtk_file_selection_get_filename(fs); + if (p != NULL) { + D88_HEADER d88; + struct stat st; + FILEH fp; + int drive; + int type; + int ro = 0; + + if (stat(p, &st) == 0) { + if (!S_ISDIR(st.st_mode)) { + switch (fsp->type) { + case 0: + drive = (int)(long)fsp->arg; + FDD_EjectFD(drive); + strncpy(filepath, p, MAX_PATH); + if ((st.st_mode & S_IWUSR) == 0) + ro = 1; + FDD_SetFD(drive, p, ro); + break; + } + } + } else if (errno == ENOENT) { + switch (fsp->type) { + case 0: // FDD + type = FDType(p); + if (type > 0) { + int is_opened = 0; + + switch (type) { + case FD_DIM: + Error("DIM 形式のディスクは作成できません。\n"); + break; + + case FD_D88: + fp = File_Create(p, FTYPE_D88); + if (fp == NULL) { + Error("ファイルの作成に失敗しました。\n"); + } else { + bzero(&d88, sizeof(d88)); + d88.fd_size = sizeof(D88_HEADER); + d88.fd_type = 0x20; + File_Write(fp, &d88, sizeof(D88_HEADER)); + File_Close(fp); + is_opened = 1; + } + break; + + case FD_XDF: + fp = File_Create(p, FTYPE_NONE); + if (fp == NULL) { + Error("ファイルの作成に失敗しました。\n"); + } else { + char t[0x100]; + int i; + + memset(t, 0xe5, sizeof(t)); + for (i = 0; i < 0x1340; ++i) + File_Write(fp, t, sizeof(t)); + File_Close(fp); + is_opened = 1; + } + break; + } + + if (is_opened) { + drive = (int)(long)fsp->arg; + FDD_EjectFD(drive); + strncpy(filepath, p, MAX_PATH); + if ((st.st_mode & S_IWUSR) == 0) + ro = 1; + FDD_SetFD(drive, p, ro); + } + } + break; + } + } + } + gtk_widget_destroy(GTK_WIDGET(fs)); +} + +static void +file_selection_destroy(GtkWidget *w, GtkWidget **wp) +{ + file_selection_t *fsp = (file_selection_t *)wp; + + free(fsp); + gtk_widget_destroy(w); +} + +static void +file_selection(int type, char *title, char *defstr, void *arg) +{ + GtkWidget *file_dialog; + file_selection_t *fsp; + + fsp = malloc(sizeof(*fsp)); + if (fsp == NULL) { + printf("file_selection: Can't alloc memory (size = %d)\n", + sizeof(*fsp)); + return; + } + bzero(fsp, sizeof(*fsp)); + + file_dialog = gtk_file_selection_new(title); + if (defstr != NULL) { + gtk_file_selection_set_filename( + GTK_FILE_SELECTION(file_dialog), defstr); + } + + fsp->fs = file_dialog; + fsp->type = type; + fsp->arg = arg; + + gtk_window_set_position(GTK_WINDOW(file_dialog), GTK_WIN_POS_CENTER); + gtk_window_set_modal(GTK_WINDOW(file_dialog), TRUE); + gtk_file_selection_hide_fileop_buttons(GTK_FILE_SELECTION(file_dialog)); + gtk_signal_connect(GTK_OBJECT(file_dialog), "destroy", + GTK_SIGNAL_FUNC(file_selection_destroy), fsp); + gtk_signal_connect_object( + GTK_OBJECT(GTK_FILE_SELECTION(file_dialog)->cancel_button), + "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), + GTK_OBJECT(file_dialog)); + gtk_signal_connect( + GTK_OBJECT(GTK_FILE_SELECTION(file_dialog)->ok_button), + "clicked", GTK_SIGNAL_FUNC(file_selection_ok), fsp); + + gtk_widget_show(file_dialog); +} diff --git a/x11/winui.h b/x11/winui.h new file mode 100644 index 0000000..bb15baf --- /dev/null +++ b/x11/winui.h @@ -0,0 +1,21 @@ +/* $Id: winui.h,v 1.1.1.1 2003/04/28 18:06:56 nonaka Exp $ */ + +#ifndef _winx68k_winui_h +#define _winx68k_winui_h + +extern BYTE Debug_Text, Debug_Grp, Debug_Sp; +extern DWORD LastClock[4]; + +void WinUI_Init(void); + +#ifndef _winx68k_gtkui_h +#define _winx68k_gtkui_h + +#include +#include + +GtkWidget *create_menu(GtkWidget *w); + +#endif //winx68k_gtkui_h + +#endif //winx68k_winui_h diff --git a/x11/winx68k.cpp b/x11/winx68k.cpp new file mode 100644 index 0000000..5e03d5e --- /dev/null +++ b/x11/winx68k.cpp @@ -0,0 +1,747 @@ +/* $Id: winx68k.cpp,v 1.2 2003/12/05 18:07:17 nonaka Exp $ */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "common.h" +#include "fileio.h" +#include "timer.h" +#include "keyboard.h" +#include "prop.h" +#include "status.h" +#include "joystick.h" +#include "mkcgrom.h" +#include "winx68k.h" +#include "windraw.h" +#include "winui.h" +#include "m68000.h" +#include "memory.h" +#include "mfp.h" +#include "opm.h" +#include "bg.h" +#include "adpcm.h" +#include "mercury.h" +#include "crtc.h" +#include "mfp.h" +#include "fdc.h" +#include "fdd.h" +#include "dmac.h" +#include "irqh.h" +#include "ioc.h" +#include "rtc.h" +#include "sasi.h" +#include "scsi.h" +#include "bg.h" +#include "palette.h" +#include "crtc.h" +#include "pia.h" +#include "scc.h" +#include "midi.h" +#include "sram.h" +#include "gvram.h" +#include "tvram.h" +#include "mouse.h" + +#include "dswin.h" +#include "fmg_wrap.h" + +#ifdef WIN68DEBUG +#include "d68k.h" +#endif + +#include "../icons/keropi_mono.xbm" + +#define APPNAME "Keropi" + +extern WORD BG_CHREND; +extern WORD BG_BGTOP; +extern WORD BG_BGEND; +extern BYTE BG_CHRSIZE; + +const BYTE PrgName[] = "Keropi"; +const BYTE PrgTitle[] = APPNAME; + +char winx68k_dir[MAX_PATH]; +char winx68k_ini[MAX_PATH]; + +WORD VLINE_TOTAL = 567; +DWORD VLINE = 0; +DWORD vline = 0; + +extern int SplashFlag; + +BYTE DispFrame = 0; +extern BYTE FrameRate; +DWORD SoundSampleRate; +int CurFrameRate = 1; +int NoWaitMode = 0; + +unsigned int hTimerID = 0; +DWORD TimerICount = 0; +extern DWORD timertick; +BYTE traceflag = 0; + +BYTE ForceDebugMode = 0; +DWORD skippedframes = 0; + +static int ClkUsed = 0; +static int FrameSkipCount = 0; +static int FrameSkipQueue = 0; + +GtkWidget *window; +GtkWidget *main_vbox; +GtkWidget *menubar; +GtkWidget *drawarea; +extern GdkImage *surface; +extern GdkPixmap *pixmap; +extern GdkPixmap *splash_pixmap; + +static void set_window_size(GtkWidget *); +static void set_icon_bitmap(GtkWidget *); +typedef void sigfunc(int); +static sigfunc *setup_signal(int, sigfunc *); +static void sighandler(int); + +#ifdef __cplusplus +}; +#endif + +void +WinX68k_SCSICheck(void) +{ + static const BYTE SCSIIMG[] = { + 0x00, 0xfc, 0x00, 0x14, // $fc0000 SCSI起動用のエントリアドレス + 0x00, 0xfc, 0x00, 0x16, // $fc0004 IOCSベクタ設定のエントリアドレス(必ず"Human"の8バイト前) + 0x00, 0x00, 0x00, 0x00, // $fc0008 ? + 0x48, 0x75, 0x6d, 0x61, // $fc000c ↓ + 0x6e, 0x36, 0x38, 0x6b, // $fc0010 ID "Human68k" (必ず起動エントリポイントの直前) + 0x4e, 0x75, // $fc0014 "rts" (起動エントリポイント) + 0x23, 0xfc, 0x00, 0xfc, 0x00, 0x2a, // $fc0016 ↓ (IOCSベクタ設定エントリポイント) + 0x00, 0x00, 0x07, 0xd4, // $fc001c "move.l #$fc002a, $7d4.l" + 0x74, 0xff, // $fc0020 "moveq #-1, d2" + 0x4e, 0x75, // $fc0022 "rts" +// 0x53, 0x43, 0x53, 0x49, 0x49, 0x4e, // $fc0024 ID "SCSIIN" +// 内蔵SCSIをONにすると、SASIは自動的にOFFになっちゃうらしい… +// よって、IDはマッチしないようにしておく… + 0x44, 0x55, 0x4d, 0x4d, 0x59, 0x20, // $fc0024 ID "DUMMY " + 0x70, 0xff, // $fc002a "moveq #-1, d0" (SCSI IOCSコールエントリポイント) + 0x4e, 0x75, // $fc002c "rts" + }; + + DWORD *p; + int scsi; + int i; + + scsi = 0; + for (i = 0x30600; i < 0x30c00; i += 2) { + p = (DWORD *)(&IPL[i]); + if (*p == 0x0000fc00) + scsi = 1; + } + + // SCSIモデルのとき + if (scsi) { + ZeroMemory(IPL, 0x2000); // 本体は8kb + memset(&IPL[0x2000], 0xff, 0x1e000); // 残りは0xff + memcpy(IPL, SCSIIMG, sizeof(SCSIIMG)); // インチキSCSI BIOS +// Memory_SetSCSIMode(); + } else { + // SASIモデルはIPLがそのまま見える + memcpy(IPL, &IPL[0x20000], 0x20000); + } +} + +int +WinX68k_LoadROMs(void) +{ + static const char *BIOSFILE[] = { + "iplrom.dat", "iplrom30.dat", "iplromco.dat", "iplromxv.dat" + }; + static const char FONTFILE[] = "cgrom.dat"; + static const char FONTFILETMP[] = "cgrom.tmp"; + FILEH fp; + int i; + BYTE tmp; + + for (fp = 0, i = 0; fp == 0 && i < NELEMENTS(BIOSFILE); ++i) { + fp = File_OpenCurDir((char *)BIOSFILE[i]); + } + if (fp == 0) { + Error("BIOS ROM イメージが見つかりません."); + return FALSE; + } + + File_Read(fp, &IPL[0x20000], 0x20000); + File_Close(fp); + + WinX68k_SCSICheck(); // SCSI IPLなら、$fc0000〜にSCSI BIOSを置く + + for (i = 0; i < 0x40000; i += 2) { + tmp = IPL[i]; + IPL[i] = IPL[i + 1]; + IPL[i + 1] = tmp; + } + + fp = File_OpenCurDir((char *)FONTFILE); + if (fp == 0) { + // cgrom.tmpがある? + fp = File_OpenCurDir((char *)FONTFILETMP); + if (fp == 0) { +#if 1 + // フォント生成 XXX + printf("フォントROMイメージが見つかりません\n"); + return FALSE; +#else + MessageBox(hWndMain, + "フォントROMイメージが見つかりません.\nWindowsフォントから新規に作成します.", + "けろぴーのメッセージ", MB_ICONWARNING | MB_OK); + SSTP_SendMes(SSTPMES_MAKEFONT); + make_cgromdat(FONT, FALSE, "MS ゴシック", "MS 明朝"); + //WinX68k_MakeFont(); + //DialogBox(hInst, MAKEINTRESOURCE(IDD_PROGBAR), + // hWndMain, (DLGPROC)MakeFontProc); + fp = File_CreateCurDir(FONTFILETMP); + if (fp) + { + File_Write(fp, FONT, 0xc0000); + File_Close(fp); + return TRUE; + } + return TRUE; +#endif + } + } + File_Read(fp, FONT, 0xc0000); + File_Close(fp); + + return TRUE; +} + +int +WinX68k_Reset(void) +{ + OPM_Reset(); + + ZeroMemory(®s, sizeof(m68k_regs)); + regs.a[7] = regs.isp = (IPL[0x30001]<<24)|(IPL[0x30000]<<16)|(IPL[0x30003]<<8)|IPL[0x30002]; + regs.pc = (IPL[0x30005]<<24)|(IPL[0x30004]<<16)|(IPL[0x30007]<<8)|IPL[0x30006]; + regs.sr_high = 0x27; + M68KRESET(); + + Memory_Init(); + CRTC_Init(); + DMA_Init(); + MFP_Init(); + FDC_Init(); + FDD_Reset(); + SASI_Init(); + SCSI_Init(); + IOC_Init(); + SCC_Init(); + PIA_Init(); + RTC_Init(); + TVRAM_Init(); + GVRAM_Init(); + BG_Init(); + Pal_Init(); + IRQH_Init(); + MIDI_Init(); + //WinDrv_Init(); + + m68000_ICount = 0; + m68000_ICountBk = 0; + ICount = 0; + + DSound_Stop(); + SRAM_VirusCheck(); + //CDROM_Init(); + DSound_Play(); + + return TRUE; +} + + +int +WinX68k_Init(void) +{ + + IPL = (BYTE*)malloc(0x40000); + MEM = (BYTE*)malloc(0xc00000); + FONT = (BYTE*)malloc(0xc0000); + + if (MEM) + ZeroMemory(MEM, 0xc00000); + + if (MEM && FONT && IPL) + return TRUE; + else + return FALSE; +} + +void +WinX68k_Cleanup(void) +{ + + if (IPL) { + free(IPL); + IPL = 0; + } + if (MEM) { + free(MEM); + MEM = 0; + } + if (FONT) { + free(FONT); + FONT = 0; + } +} + +#define CLOCK_SLICE 200 +// ----------------------------------------------------------------------------------- +// コアのめいんるーぷ +// ----------------------------------------------------------------------------------- +void WinX68k_Exec(void) +{ + //char *test = NULL; + int clk_total, clkdiv, usedclk, hsync, clk_next, clk_count, clk_line=0; + int KeyIntCnt = 0, MouseIntCnt = 0; + DWORD t_start = timeGetTime(), t_end; + + if ( FrameRate!=7 ) { + DispFrame = (DispFrame+1)%FrameRate; + } else { // Auto Frame Skip + if ( FrameSkipQueue ) { + if ( FrameSkipCount>15 ) { + FrameSkipCount = 0; + FrameSkipQueue++; + DispFrame = 0; + } else { + FrameSkipCount++; + FrameSkipQueue--; + DispFrame = 1; + } + } else { + FrameSkipCount = 0; + DispFrame = 0; + } + } + + vline = 0; + clk_count = -ICount; + clk_total = (CRTC_Regs[0x29] & 0x10) ? VSYNC_HIGH : VSYNC_NORM; + if (Config.XVIMode == 1) { + clk_total = (clk_total*16)/10; + clkdiv = 16; + } else if (Config.XVIMode == 2) { + clk_total = (clk_total*24)/10; + clkdiv = 24; + } else { + clkdiv = 10; + } + ICount += clk_total; + clk_next = (clk_total/VLINE_TOTAL); + hsync = 1; + + do { + int m, n = (ICount>CLOCK_SLICE)?CLOCK_SLICE:ICount; + m68000_ICount = m68000_ICountBk = 0; // 割り込み発生前に与えておかないとダメ(CARAT) + + if ( hsync ) { + hsync = 0; + clk_line = 0; + MFP_Int(0); + if ( (vline>=CRTC_VSTART)&&(vline=VLINE_TOTAL ) { + if ( (long)vline==(CRTC_VEND-VLINE_TOTAL) ) MFP_Int(9); // エキサイティングアワーとか(TOTAL=0x2000)&&((regs.pc<=0x8e0e0))) tracing=50000; +// if (regs.pc<0x10000) tracing=1; +// if ( (regs.pc&1) ) +// fp=fopen("_trace68.txt", "a"); +// if ( (regs.pc==0x7176) /*&& (Memory_ReadW(oldpc)==0xff1a)*/ ) tracing=100; +// if ( (/*((regs.pc>=0x27000) && (regs.pc<=0x29000))||*/((regs.pc>=0x27000) && (regs.pc<=0x29000))) && (oldpc!=regs.pc)) + if (/*fdctrace&&*/(oldpc!=regs.pc)) + { +// //tracing--; + fprintf(fp, "D0:%08X D1:%08X D2:%08X D3:%08X D4:%08X D5:%08X D6:%08X D7:%08X CR:%04X\n", regs.d[0], regs.d[1], regs.d[2], regs.d[3], regs.d[4], regs.d[5], regs.d[6], regs.d[7], regs.ccr); + fprintf(fp, "A0:%08X A1:%08X A2:%08X A3:%08X A4:%08X A5:%08X A6:%08X A7:%08X SR:%04X\n", regs.a[0], regs.a[1], regs.a[2], regs.a[3], regs.a[4], regs.a[5], regs.a[6], regs.a[7], regs.sr_high); + fprintf(fp, "<%04X> (%08X ->) %08X : %s\n", Memory_ReadW(regs.pc), oldpc, regs.pc, buf); + } + oldpc = regs.pc; + m68000_ICount = 1; + M68KRUN(); + } + fclose(fp); + usedclk = clk_line = HSYNC_CLK; + clk_count = clk_next; + } + else +#endif + { + m68000_ICount = n; + M68KRUN(); + m = (n-m68000_ICount-m68000_ICountBk); // 経過クロック数 + ClkUsed += m*10; + usedclk = ClkUsed/clkdiv; + clk_line += usedclk; + ClkUsed -= usedclk*clkdiv; + ICount -= m; + clk_count += m; + m68000_ICount = m68000_ICountBk = 0; + } + + MFP_Timer(usedclk); + RTC_Timer(usedclk); + DMA_Exec(0); + DMA_Exec(1); + DMA_Exec(2); + + if ( clk_count>=clk_next ) { + //OPM_RomeoOut(Config.BufferSize*5); + MIDI_DelayOut((Config.MIDIAutoDelay)?(Config.BufferSize*5):Config.MIDIDelay); + MFP_TimerA(); + if ( (MFP[MFP_AER]&0x40)&&(vline==CRTC_IntLine) ) + MFP_Int(1); + if ( (!DispFrame)&&(vline>=CRTC_VSTART)&&(vline(VLINE_TOTAL/4) ) { + KeyIntCnt = 0; + Keyboard_Int(); + } + MouseIntCnt++; + if ( MouseIntCnt>(VLINE_TOTAL/8) ) { + MouseIntCnt = 0; + SCC_IntCheck(); + } + DSound_Send0(clk_line); // Bufferがでかいとき用 + + vline++; + clk_next = (clk_total*(vline+1))/VLINE_TOTAL; + hsync = 1; + } + } while ( vline((CRTC_Regs[0x29]&0x10)?14:16) ) { + FrameSkipQueue += ((t_end-t_start)/((CRTC_Regs[0x29]&0x10)?14:16))+1; + if ( FrameSkipQueue>100 ) + FrameSkipQueue = 100; + } +} + +/* + * signal handler + */ +static sigfunc * +setup_signal(int signo, sigfunc *func) +{ + struct sigaction act, oact; + + act.sa_handler = func; + sigemptyset(&act.sa_mask); + act.sa_flags = 0; + if (sigaction(signo, &act, &oact) < 0) + return SIG_ERR; + return oact.sa_handler; +} + +static void +sighandler(int signo) +{ + + UNUSED(signo); + + gtk_main_quit(); +} + +/* + * misc + */ +static void +set_window_size(GtkWidget *w) +{ + + /* リサイズ不可 */ + gtk_window_set_policy(GTK_WINDOW(w), FALSE, FALSE, TRUE); +} + +static void +set_icon_bitmap(GtkWidget *w) +{ + GdkPixmap *icon_pixmap; + + gdk_window_set_icon_name(w->window, APPNAME); + icon_pixmap = gdk_bitmap_create_from_data( + w->window, keropi_mono_bits, keropi_mono_width, keropi_mono_height); + gdk_window_set_icon(w->window, NULL, icon_pixmap, NULL); +} + +// +// IDLE process +// +static gint +idle_process_splash(gpointer *p) +{ + + UNUSED(p); + + // OPM_RomeoOut(Config.BufferSize * 5); + if (NoWaitMode || Timer_GetCount()) { + WinX68k_Exec(); + if (SplashFlag) { + SplashFlag--; + if (SplashFlag == 0) + WinDraw_HideSplash(); + } + } + return TRUE; +} + +static int idle_id = -1; + +BOOL +is_installed_idle_process(void) +{ + + return (idle_id == -1) ? FALSE : TRUE; +} + +void +install_idle_process(void) +{ + + idle_id = gtk_idle_add((GtkFunction)idle_process_splash, NULL); +} + +void +uninstall_idle_process(void) +{ + + gtk_idle_remove(idle_id); + idle_id = -1; +} + + +// +// main +// +int +main(int argc, char *argv[]) +{ + + if (set_modulepath(winx68k_dir, sizeof(winx68k_dir))) + return 1; + + dosio_init(); + file_setcd(winx68k_dir); + + LoadConfig(); + + gtk_set_locale(); + gtk_rc_add_default_file(".xkeropirc"); + gtk_init(&argc, &argv); + + /* ウィンドウの作成 */ + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + + main_vbox = gtk_vbox_new(FALSE, 2); + gtk_container_border_width(GTK_CONTAINER(main_vbox), 1); + gtk_container_add(GTK_CONTAINER(window), main_vbox); + gtk_widget_show(main_vbox); + + /* メニューバー */ + menubar = create_menu(window); + gtk_box_pack_start(GTK_BOX(main_vbox), menubar, FALSE, TRUE, 0); + gtk_widget_show(menubar); + + /* 画面領域 */ + drawarea = gtk_drawing_area_new(); + gtk_drawing_area_size(GTK_DRAWING_AREA(drawarea), + FULLSCREEN_WIDTH, FULLSCREEN_HEIGHT); + gtk_box_pack_start(GTK_BOX(main_vbox), drawarea, FALSE, TRUE, 0); + gtk_widget_show(drawarea); + + gtk_widget_realize(window); + gtk_widget_set_uposition(GTK_WIDGET(window), winx, winy); + + /* タイトルやらアイコンやらのセットアップ */ + gtk_window_set_title(GTK_WINDOW(window), APPNAME); + set_window_size(window); + set_icon_bitmap(window); + + SplashFlag = 20; + SoundSampleRate = Config.SampleRate; + + StatBar_Show(Config.WindowFDDStat); + WinDraw_ChangeSize(); + WinDraw_ChangeMode(FALSE); + + WinUI_Init(); + WinDraw_StartupScreen(); + + if (!WinDraw_Init()) { + WinDraw_Cleanup(); + Error("Error: Can't init screen.\n"); + return 1; + } + + /* window 表示 */ + gtk_widget_show(window); + + if (!WinX68k_Init()) { + WinX68k_Cleanup(); + WinDraw_Cleanup(); + return 1; + } + + if (!WinX68k_LoadROMs()) { + WinX68k_Cleanup(); + WinDraw_Cleanup(); + return 1; + } + + if ( SoundSampleRate ) { + ADPCM_Init(SoundSampleRate); + OPM_Init(4000000/*3579545*/, SoundSampleRate); +#ifndef NO_MERCURY + Mcry_Init(SoundSampleRate, winx68k_dir); +#endif + } else { + ADPCM_Init(100); + OPM_Init(4000000/*3579545*/, 100); +#ifndef NO_MERCURY + Mcry_Init(100, winx68k_dir); +#endif + } + + Mouse_Init(); + Joystick_Init(); + SRAM_Init(); + WinX68k_Reset(); + Timer_Init(); + + MIDI_Init(); + MIDI_SetMimpiMap(Config.ToneMapFile); // 音色設定ファイル使用反映 + MIDI_EnableMimpiDef(Config.ToneMap); + + if (!DSound_Init(Config.SampleRate, Config.BufferSize)) { + if (Config.DSAlert) + fprintf(stderr, "Can't init sound.\n"); + } + + ADPCM_SetVolume((BYTE)Config.PCM_VOL); + OPM_SetVolume((BYTE)Config.OPM_VOL); +#ifndef NO_MERCURY + Mcry_SetVolume((BYTE)Config.MCR_VOL); +#endif + DSound_Play(); + + //SetCmdLineFD(); // コマンドラインでFD挿入を指示している場合 + switch (argc) { + case 3: + FDD_SetFD(1, argv[2], 0); + case 2: + FDD_SetFD(0, argv[1], 0); + break; + } + + setup_signal(SIGINT, sighandler); + setup_signal(SIGTERM, sighandler); + + /* メインループ */ + install_idle_process(); + gtk_main(); + uninstall_idle_process(); + + Memory_WriteB(0xe8e00d, 0x31); // SRAM書き込み許可 + Memory_WriteD(0xed0040, Memory_ReadD(0xed0040)+1); // 積算稼働時間(min.) + Memory_WriteD(0xed0044, Memory_ReadD(0xed0044)+1); // 積算起動回数 + + OPM_Cleanup(); +#ifndef NO_MERCURY + Mcry_Cleanup(); +#endif + + SRAM_Cleanup(); + FDD_Cleanup(); + //CDROM_Cleanup(); + MIDI_Cleanup(); + Joystick_Cleanup(); + DSound_Cleanup(); + WinX68k_Cleanup(); + WinDraw_Cleanup(); + WinDraw_CleanupScreen(); + + SaveConfig(); + + return 0; +} diff --git a/x11/winx68k.h b/x11/winx68k.h new file mode 100644 index 0000000..ee1a6f5 --- /dev/null +++ b/x11/winx68k.h @@ -0,0 +1,50 @@ +#ifndef winx68k_wincore_h +#define winx68k_wincore_h + +#define SCREEN_WIDTH 768 +#define SCREEN_HEIGHT 512 + +#define FULLSCREEN_WIDTH 800 +#define FULLSCREEN_HEIGHT 600 +#define FULLSCREEN_POSX ((FULLSCREEN_WIDTH - SCREEN_WIDTH) / 2) +#define FULLSCREEN_POSY ((FULLSCREEN_HEIGHT - SCREEN_HEIGHT) / 2) + +extern BYTE* FONT; + +extern WORD VLINE_TOTAL; +extern DWORD VLINE; +extern DWORD vline; + +extern char winx68k_dir[MAX_PATH]; +extern char winx68k_ini[MAX_PATH]; +extern int BIOS030Flag; +extern BYTE FrameChanged; + +extern const BYTE PrgTitle[]; + +int WinX68k_Reset(void); + +#ifndef winx68k_gtkwarpper_h +#define winx68k_gtkwarpper_h + +#include +#include + +#include +#include + +extern GtkWidget *window; +extern GtkWidget *main_vbox; +extern GtkWidget *menubar; +extern GtkWidget *drawarea; +extern GdkPixmap *splash_pixmap; + +BOOL is_installed_idle_process(void); +void install_idle_process(void); +void uninstall_idle_process(void); + +#define NELEMENTS(array) ((int)(sizeof(array) / sizeof(array[0]))) + +#endif //winx68k_gtkwarpper_h + +#endif //winx68k_wincore_h diff --git a/x68k/68kem.asm b/x68k/68kem.asm new file mode 100644 index 0000000..c68a36d --- /dev/null +++ b/x68k/68kem.asm @@ -0,0 +1,56435 @@ +; Make68K - V0.17 - Copyright 1998, Mike Coates (mcoates@mame.freeserve.co.uk) +; & Darren Olafson (deo@mail.island.net) + +; Changed for WinX68k by Kenjo +; - Added BusError / Adress Error +; - Changed inc/dec number to 2 in byte access from/to -(A7)/(A7)+ +; - Changed main loop style (slower ... but for DMA and "Trace exception") +; ... Not yet done :-p + + BITS 32 + +%define _OP_ROM OP_ROM +%define _M68KRUN M68KRUN +%define _M68KRESET M68KRESET +%define _m68000_ICount m68000_ICount +%define _m68000_ICountBk m68000_ICountBk +%define _ICount ICount +%define _regs regs +%define AdrError @AdrError@8 +%define BusError @BusError@8 + + GLOBAL OP_f000 + GLOBAL Exception + + GLOBAL _M68KRUN + GLOBAL _M68KRESET + GLOBAL _m68000_ICount + GLOBAL _m68000_ICountBk + GLOBAL ICount + GLOBAL _regs + GLOBAL BusError + GLOBAL AdrError + + EXTERN @cpu_readmem24@4 + EXTERN @cpu_readmem24_word@4 + EXTERN @cpu_readmem24_dword@4 + + EXTERN @cpu_writemem24@8 + EXTERN @cpu_writemem24_word@8 + EXTERN @cpu_writemem24_dword@8 + EXTERN @cpu_setOPbase24@4 + +; Vars Mame declares / needs access to + + EXTERN _OP_ROM + SECTION .text + + +; +; M68KEM MAIN +; + +_M68KRESET: + pushad + +; Build Jump Table (not optimised!) + + lea edi,[OPCODETABLE] ; Jump Table + lea esi,[COMPTABLE] ; RLE Compressed Table + mov ebp,[esi] + add esi,byte 4 +RESET0: + mov eax,[esi] + mov ecx,eax + and eax,0ffffffh + add eax,ebp + add esi,byte 4 + shr ecx,24 + jne short RESET1 + movzx ecx,word [esi] ; Repeats + add esi,byte 2 + jecxz RESET2 ; Finished! +RESET1: + mov [edi],eax + add edi,byte 4 + dec ecx + jnz short RESET1 + jmp short RESET0 +RESET2: + popad + ret + + ALIGN 4 + +_M68KRUN: + pushad + mov esi,[R_PC] + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +; Check for Interrupt waiting + + test [R_IRQ],byte 07H + jne near interrupt + +IntCont: + or dword [_m68000_ICount],0 + js short MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + ALIGN 4 + +MainExit: + mov [R_PC],esi ; Save PC + mov [R_CCR],edx + test byte [R_SR_H],20H + mov eax,[R_A7] ; Get A7 + jne short ME1 ; Mode ? + mov [R_USP],eax ;Save in USP + jmp short MC68Kexit +ME1: + mov [R_ISP],eax +MC68Kexit: + popad + ret + ALIGN 4 + +; Interrupt check + +interrupt: + mov eax,[R_IRQ] + and eax,byte 07H + cmp al,7 ; Always take 7 + je short procint + + mov ebx,[R_SR_H] ; int mask + and ebx,byte 07H + cmp eax,ebx + jle near IntCont + + ALIGN 4 + +procint: + and byte [R_IRQ],78h ; remove interrupt & stop + + push eax ; save level + + mov ebx,eax + mov [R_CCR],edx + mov ecx, eax ; irq line # + call dword [R_IRQ_CALLBACK] ; get the IRQ level + mov edx,[R_CCR] + test eax,eax + jns short AUTOVECTOR + mov eax,ebx + add eax,byte 24 ; Vector + +AUTOVECTOR: + + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_0ffff_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_0ffff_Bank: + pop eax ; set Int mask + mov bl,byte [R_SR_H] + and bl,0F8h + or bl,al + mov byte [R_SR_H],bl + + jmp IntCont + + ALIGN 4 + +Exception: + push edx ; Save flags + and eax,0FFH ; Zero Extend IRQ Vector + push eax ; Save for Later + mov al,[exception_cycles+eax] ; Get Cycles + sub [_m68000_ICount],eax ; Decrement ICount + mov eax,edx + mov ah,byte [R_XC] + mov ECX,edx + and ECX,byte 1 + shr eax,4 + and eax,byte 01Ch ; X, N & Z + + or eax,ECX ; C + + mov ECX,edx + shr ECX,10 + and ECX,byte 2 + or eax,ECX ; O + + mov ah,byte [R_SR_H] ; T, S & I + + mov edi,[R_A7] ; Get A7 + test ah,20H ; Which Mode ? + jne short ExSuperMode ; Supervisor + or byte [R_SR_H],20H ; Set Supervisor Mode + mov [R_USP],edi ; Save in USP + mov edi,[R_ISP] ; Get ISP +ExSuperMode: + sub edi,byte 6 + mov [R_A7],edi ; Put in A7 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + add edi,byte 2 + mov [R_PC],ESI + mov edx,ESI + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop eax ;Level + shl eax,2 + add eax,[R_VBR] + mov [R_PC],ESI + mov ecx,EAX + call @cpu_readmem24_dword@4 + and eax, 0ffffffh + mov esi,eax ;Set PC + mov ecx,esi + call @cpu_setOPbase24@4 + mov ebp,dword [_OP_ROM] + pop edx ; Restore flags + ret + ALIGN 4 + + +BusError: + push edx ; Save flags + push ecx ; Save flags + movzx eax,byte[exception_cycles+2] ; Get Cycles + sub [_m68000_ICount],eax ; Decrement ICount + mov eax,edx + mov ah,byte [R_XC] + mov ECX,edx + and ECX,byte 1 + shr eax,4 + and eax,byte 01Ch ; X, N & Z + + or eax,ECX ; C + + mov ECX,edx + shr ECX,10 + and ECX,byte 2 + or eax,ECX ; O + + mov ah,byte [R_SR_H] ; T, S & I + + mov edi,[R_A7] ; Get A7 + test ah,20H ; Which Mode ? + jne short BESuperMode ; Supervisor + or byte [R_SR_H],20H ; Set Supervisor Mode + mov [R_USP],edi ; Save in USP + mov edi,[R_ISP] ; Get ISP +BESuperMode: + sub edi,byte 14 + mov [R_A7],edi ; Put in A7 + mov [R_PC],ESI + add edi,byte 2 ; SP(Word) <- Dummy (Read/Write cycle flag, Command/Others flag, etc) + pop ecx + push eax + mov edx,ecx + mov ecx,EDI + call @cpu_writemem24_dword@8 ; SP(DWord) <- Accessed Adr + add edi,byte 6 ; SP(Word) <- Dummy (OP word) + pop eax + and EDI,0FFFFFFh + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 ; SP(Word) <- SR + mov [R_PC],ESI + add edi,byte 2 + mov edx,ESI + mov ecx,EDI + call @cpu_writemem24_dword@8 ; SP(DWord) <- PC + mov eax, 8 + add eax,[R_VBR] + mov [R_PC],ESI + mov ecx,EAX + call @cpu_readmem24_dword@4 + and eax, 0ffffffh + mov esi,eax ;Set PC + mov ecx,esi + call @cpu_setOPbase24@4 + mov ebp,dword [_OP_ROM] + pop edx ; Restore flags + ret + ALIGN 4 + + +AdrError: ; Adress Error + push edx ; Save flags + push ecx ; Save flags + movzx eax,byte[exception_cycles+3] ; Get Cycles + sub [_m68000_ICount],eax ; Decrement ICount + mov eax,edx + mov ah,byte [R_XC] + mov ECX,edx + and ECX,byte 1 + shr eax,4 + and eax,byte 01Ch ; X, N & Z + + or eax,ECX ; C + + mov ECX,edx + shr ECX,10 + and ECX,byte 2 + or eax,ECX ; O + + mov ah,byte [R_SR_H] ; T, S & I + + mov edi,[R_A7] ; Get A7 + test ah,20H ; Which Mode ? + jne short AESuperMode ; Supervisor + or byte [R_SR_H],20H ; Set Supervisor Mode + mov [R_USP],edi ; Save in USP + mov edi,[R_ISP] ; Get ISP +AESuperMode: + sub edi,byte 14 + mov [R_A7],edi ; Put in A7 + mov [R_PC],ESI + add edi,byte 2 + pop ecx + push eax + mov edx,ecx + mov ecx,EDI + call @cpu_writemem24_dword@8 + add edi,byte 6 + pop eax + and EDI,0FFFFFFh + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov [R_PC],ESI + add edi,byte 2 + mov edx,ESI + mov ecx,EDI + call @cpu_writemem24_dword@8 + mov eax, 12 + add eax,[R_VBR] + mov [R_PC],ESI + mov ecx,EAX + call @cpu_readmem24_dword@4 + and eax, 0ffffffh + mov esi,eax ;Set PC + mov ecx,esi + call @cpu_setOPbase24@4 + mov ebp,dword [_OP_ROM] + pop edx ; Restore flags + ret + ALIGN 4 + + +OP_1000: ; move.b D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + mov EAX,[R_D0+EBX*4] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],AL + pop EDX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1010: ; move.b (A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],AL + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1018: ; move.b (A0)+, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + inc dword [R_A0+EBX*4] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],AL + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_101f: ; move.b (A7)+, D0: + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],AL + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1020: ; move.b -(A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + dec EDI + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],AL + pop EDX + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1027: ; move.b -(A7), D0: + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],AL + pop EDX + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1028: ; move.b ($1028,A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],AL + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1030: ; move.b ($30,A0,D1.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_1030_1 + cwde +OP_1030_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],AL + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1038: ; move.b $1038.w, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],AL + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1039: ; move.b $123456.l, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],AL + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_103a: ; move.b ($103a,PC), D0; ($1038): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],AL + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_103b: ; move.b ($3b,PC,D1.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_103b_1 + cwde +OP_103b_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],AL + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_103c: ; move.b #$0, D0: + add esi,byte 2 + + mov EAX,dword [esi+ebp] + add esi,byte 2 + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],AL + pop EDX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1080: ; move.b D0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + mov EAX,[R_D0+EBX*4] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1090: ; move.b (A0), (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1098: ; move.b (A0)+, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + inc dword [R_A0+EBX*4] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_109f: ; move.b (A7)+, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_10a0: ; move.b -(A0), (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + dec EDI + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_10a7: ; move.b -(A7), (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_10a8: ; move.b ($10a8,A0), (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_10b0: ; move.b (-$50,A0,D1.w), (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_10b0_1 + cwde +OP_10b0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_10b8: ; move.b $10b8.w, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_10b9: ; move.b $123456.l, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_10ba: ; move.b ($10ba,PC), (A0); ($10b8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_10bb: ; move.b (-$45,PC,D1.w), (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_10bb_1 + cwde +OP_10bb_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_10bc: ; move.b #$0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EAX,dword [esi+ebp] + add esi,byte 2 + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_10c0: ; move.b D0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + mov EAX,[R_D0+EBX*4] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_10d0: ; move.b (A0), (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_10d8: ; move.b (A0)+, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + inc dword [R_A0+EBX*4] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_10d8_notA7 ; + inc dword [R_A0+ECX*4] +OP_10d8_notA7: ; + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_10df: ; move.b (A7)+, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_10df_notA7 ; + inc dword [R_A0+ECX*4] +OP_10df_notA7: ; + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_10e0: ; move.b -(A0), (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + dec EDI + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_10e0_notA7 ; + inc dword [R_A0+ECX*4] +OP_10e0_notA7: ; + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_10e7: ; move.b -(A7), (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_10e7_notA7 ; + inc dword [R_A0+ECX*4] +OP_10e7_notA7: ; + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_10e8: ; move.b ($10e8,A0), (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_10e8_notA7 ; + inc dword [R_A0+ECX*4] +OP_10e8_notA7: ; + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_10f0: ; move.b (-$10,A0,D1.w), (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_10f0_1 + cwde +OP_10f0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_10f0_notA7 ; + inc dword [R_A0+ECX*4] +OP_10f0_notA7: ; + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_10f8: ; move.b $10f8.w, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_10f8_notA7 ; + inc dword [R_A0+ECX*4] +OP_10f8_notA7: ; + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_10f9: ; move.b $123456.l, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_10f9_notA7 ; + inc dword [R_A0+ECX*4] +OP_10f9_notA7: ; + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_10fa: ; move.b ($10fa,PC), (A0)+; ($10f8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_10fa_notA7 ; + inc dword [R_A0+ECX*4] +OP_10fa_notA7: ; + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_10fb: ; move.b (-$5,PC,D1.w), (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_10fb_1 + cwde +OP_10fb_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_10fb_notA7 ; + inc dword [R_A0+ECX*4] +OP_10fb_notA7: ; + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_10fc: ; move.b #$0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EAX,dword [esi+ebp] + add esi,byte 2 + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_10fc_notA7 ; + inc dword [R_A0+ECX*4] +OP_10fc_notA7: ; + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1100: ; move.b D0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + mov EAX,[R_D0+EBX*4] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_1100_notA7 ; + dec EDI +OP_1100_notA7: ; + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1110: ; move.b (A0), -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_1110_notA7 ; + dec EDI +OP_1110_notA7: ; + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1118: ; move.b (A0)+, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + inc dword [R_A0+EBX*4] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_1118_notA7 ; + dec EDI +OP_1118_notA7: ; + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_111f: ; move.b (A7)+, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_111f_notA7 ; + dec EDI +OP_111f_notA7: ; + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1120: ; move.b : + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + dec EDI + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_1120_notA7 ; + dec EDI ; +OP_1120_notA7: ; + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1127: ; move.b -(A7), -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_1127_notA7 ; + dec EDI ; +OP_1127_notA7: ; + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1128: ; move.b ($1128,A0), -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_1128_notA7 ; + dec EDI ; +OP_1128_notA7: ; + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1130: ; move.b ($3456,A0,D1.w), -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_1130_1 + cwde +OP_1130_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_1130_notA7 ; + dec EDI ; +OP_1130_notA7: ; + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1138: ; move.b $1138.w, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_1138_notA7 ; + dec EDI ; +OP_1138_notA7: ; + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1139: ; move.b $123456.l, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_1139_notA7 ; + dec EDI ; +OP_1139_notA7: ; + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_113a: ; move.b ($113a,PC), -(A0); ($1138): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_113a_notA7 ; + dec EDI ; +OP_113a_notA7: ; + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_113b: ; move.b ([$3456,PC,D1.w],$3456), -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_113b_1 + cwde +OP_113b_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_113b_notA7 ; + dec EDI ; +OP_113b_notA7: ; + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_113c: ; move.b #$0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EAX,dword [esi+ebp] + add esi,byte 2 + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_113c_notA7 ; + dec EDI ; +OP_113c_notA7: ; + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1140: ; move.b D0, ($1140,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + mov EAX,[R_D0+EBX*4] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1150: ; move.b (A0), ($1150,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1158: ; move.b (A0)+, ($1158,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + inc dword [R_A0+EBX*4] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_115f: ; move.b (A7)+, ($115f,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1160: ; move.b -(A0), ($1160,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + dec EDI + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1167: ; move.b -(A7), ($1167,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1168: ; move.b ($1168,A0), ($1168,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1170: ; move.b ($3456,A0), ($1170,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_1170_1 + cwde +OP_1170_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1178: ; move.b $1178.w, ($1178,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1179: ; move.b $123456.l, ($1179,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_117a: ; move.b ($117a,PC), ($117a,A0); ($1178): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_117b: ; move.b ([$3456,PC],$3456), ($117b,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_117b_1 + cwde +OP_117b_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_117c: ; move.b #$0, ($117c,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EAX,dword [esi+ebp] + add esi,byte 2 + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1180: ; move.b D0, (D1.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + mov EAX,[R_D0+EBX*4] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_1180_1 + cwde +OP_1180_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1190: ; move.b (A0), (D1.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_1190_1 + cwde +OP_1190_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1198: ; move.b (A0)+, (D1.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + inc dword [R_A0+EBX*4] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_1198_1 + cwde +OP_1198_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_119f: ; move.b (A7)+, ([],D1.w,$3456): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_119f_1 + cwde +OP_119f_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_11a0: ; move.b -(A0), ($11a0,D1.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + dec EDI + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_11a0_1 + cwde +OP_11a0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_11a7: ; move.b -(A7), ([$11a7],D1.w,$3456): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_11a7_1 + cwde +OP_11a7_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_11a8: ; move.b ($11a8,A0), ($11a8,D1.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_11a8_1 + cwde +OP_11a8_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_11b0: ; move.b ($3456,D1.w), ($3456,D1.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_11b0_1 + cwde +OP_11b0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_11b0_2 + cwde +OP_11b0_2: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_11b8: ; move.b $11b8.w, ($3456,D1.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_11b8_1 + cwde +OP_11b8_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_11b9: ; move.b $123456.l, ([$3456,D1.w]): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_11b9_1 + cwde +OP_11b9_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 26 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_11ba: ; move.b ($11ba,PC), ([$3456,D1.w],$11ba); ($11b8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_11ba_1 + cwde +OP_11ba_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_11bb: ; move.b ([$3456,D1.w],$3456), ([$3456,D1.w],$3456): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_11bb_1 + cwde +OP_11bb_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_11bb_2 + cwde +OP_11bb_2: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_11bc: ; move.b #$0, ($3456,D1.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EAX,dword [esi+ebp] + add esi,byte 2 + test AL,AL + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_11bc_1 + cwde +OP_11bc_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_11c0: ; move.b D0, $11c0.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 15 + mov EAX,[R_D0+ECX*4] + test AL,AL + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_11d0: ; move.b (A0), $11d0.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_11d8: ; move.b (A0)+, $11d8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_11df: ; move.b (A7)+, $11df.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_11e0: ; move.b -(A0), $11e0.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_11e7: ; move.b -(A7), $11e7.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_11e8: ; move.b ($11e8,A0), $11e8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_11f0: ; move.b ($3456), $11f0.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_11f0_1 + cwde +OP_11f0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_11f8: ; move.b $11f8.w, $11f8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_11f9: ; move.b $123456.l, $11f9.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_11fa: ; move.b ($11fa,PC), $11fa.w; ($11f8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_11fb: ; move.b ([$3456],$3456), $11fb.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_11fb_1 + cwde +OP_11fb_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_11fc: ; move.b #$0, $11fc.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EAX,dword [esi+ebp] + add esi,byte 2 + test AL,AL + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_13c0: ; move.b D0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 15 + mov EAX,[R_D0+ECX*4] + test AL,AL + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_13d0: ; move.b (A0), $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_13d8: ; move.b (A0)+, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_13df: ; move.b (A7)+, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_13e0: ; move.b -(A0), $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_13e7: ; move.b -(A7), $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_13e8: ; move.b ($13e8,A0), $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_13f0: ; move.b ($3456), $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_13f0_1 + cwde +OP_13f0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 26 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_13f8: ; move.b $13f8.w, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_13f9: ; move.b $123456.l, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_13fa: ; move.b ($13fa,PC), $123456.l; ($13f8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_13fb: ; move.b ([$3456],$3456), $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_13fb_1 + cwde +OP_13fb_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 26 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_13fc: ; move.b #$0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EAX,dword [esi+ebp] + add esi,byte 2 + test AL,AL + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1ec0: ; move.b D0, (A7)+: + add esi,byte 2 + + and ecx,byte 15 + mov EAX,[R_D0+ECX*4] + test AL,AL + pushfd + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1ed0: ; move.b (A0), (A7)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1ed8: ; move.b (A0)+, (A7)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1edf: ; move.b (A7)+, (A7)+: + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1ee0: ; move.b -(A0), (A7)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1ee7: ; move.b -(A7), (A7)+: + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1ee8: ; move.b ($1ee8,A0), (A7)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1ef0: ; move.b (-$10,A0,D1.l*8), (A7)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_1ef0_1 + cwde +OP_1ef0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1ef8: ; move.b $1ef8.w, (A7)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1ef9: ; move.b $123456.l, (A7)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1efa: ; move.b ($1efa,PC), (A7)+; ($1ef8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1efb: ; move.b (-$5,PC,D1.l*8), (A7)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_1efb_1 + cwde +OP_1efb_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1efc: ; move.b #$0, (A7)+: + add esi,byte 2 + + mov EAX,dword [esi+ebp] + add esi,byte 2 + test AL,AL + pushfd + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1f00: ; move.b D0, -(A7): + add esi,byte 2 + + and ecx,byte 15 + mov EAX,[R_D0+ECX*4] + test AL,AL + pushfd + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1f10: ; move.b (A0), -(A7): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1f18: ; move.b (A0)+, -(A7): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1f1f: ; move.b (A7)+, -(A7): + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1f20: ; move.b -(A0), -(A7): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1f27: ; move.b -(A7), -(A7): + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1f28: ; move.b ($1f28,A0), -(A7): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1f30: ; move.b ($3456,A0,D1.l*8), -(A7): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_1f30_1 + cwde +OP_1f30_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1f38: ; move.b $1f38.w, -(A7): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1f39: ; move.b $123456.l, -(A7): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1f3a: ; move.b ($1f3a,PC), -(A7); ($1f38): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1f3b: ; move.b ([$3456,PC,D1.l*8],$3456), -(A7): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_1f3b_1 + cwde +OP_1f3b_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_1f3c: ; move.b #$0, -(A7): + add esi,byte 2 + + mov EAX,dword [esi+ebp] + add esi,byte 2 + test AL,AL + pushfd + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2000: ; move.l D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + mov EAX,[R_D0+EBX*4] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],EAX + pop EDX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2010: ; move.l (A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],EAX + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2018: ; move.l (A0)+, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 4 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],EAX + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2020: ; move.l -(A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 4 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],EAX + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2028: ; move.l ($2028,A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],EAX + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2030: ; move.l ($30,A0,D2.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_2030_1 + cwde +OP_2030_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],EAX + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2038: ; move.l $2038.w, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],EAX + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2039: ; move.l $123456.l, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],EAX + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_203a: ; move.l ($203a,PC), D0; ($2038): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],EAX + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_203b: ; move.l ($3b,PC,D2.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_203b_1 + cwde +OP_203b_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],EAX + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_203c: ; move.l #$123456, D0: + add esi,byte 2 + + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,byte 4 + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],EAX + pop EDX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2040: ; movea.l D0, A0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + mov EAX,[R_D0+EBX*4] + shr ecx,9 + and ecx,byte 7 + mov [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2050: ; movea.l (A0), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + shr ecx,9 + and ecx,byte 7 + mov [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2058: ; movea.l (A0)+, A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 4 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + shr ecx,9 + and ecx,byte 7 + mov [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2060: ; movea.l -(A0), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 4 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + shr ecx,9 + and ecx,byte 7 + mov [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2068: ; movea.l ($2068,A0), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + shr ecx,9 + and ecx,byte 7 + mov [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2070: ; movea.l ($70,A0,D2.w), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_2070_1 + cwde +OP_2070_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + shr ecx,9 + and ecx,byte 7 + mov [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2078: ; movea.l $2078.w, A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + shr ecx,9 + and ecx,byte 7 + mov [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2079: ; movea.l $123456.l, A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + shr ecx,9 + and ecx,byte 7 + mov [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_207a: ; movea.l ($207a,PC), A0; ($2078): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + shr ecx,9 + and ecx,byte 7 + mov [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_207b: ; movea.l ($7b,PC,D2.w), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_207b_1 + cwde +OP_207b_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + shr ecx,9 + and ecx,byte 7 + mov [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_207c: ; movea.l #$123456, A0: + add esi,byte 2 + + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,byte 4 + shr ecx,9 + and ecx,byte 7 + mov [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2080: ; move.l D0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + mov EAX,[R_D0+EBX*4] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2090: ; move.l (A0), (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2098: ; move.l (A0)+, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 4 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_20a0: ; move.l -(A0), (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 4 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_20a8: ; move.l ($20a8,A0), (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_20b0: ; move.l (-$50,A0,D2.w), (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_20b0_1 + cwde +OP_20b0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 26 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_20b8: ; move.l $20b8.w, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_20b9: ; move.l $123456.l, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_20ba: ; move.l ($20ba,PC), (A0); ($20b8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_20bb: ; move.l (-$45,PC,D2.w), (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_20bb_1 + cwde +OP_20bb_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 26 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_20bc: ; move.l #$123456, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,byte 4 + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_20c0: ; move.l D0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + mov EAX,[R_D0+EBX*4] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 4 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_20d0: ; move.l (A0), (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 4 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_20d8: ; move.l (A0)+, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 4 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 4 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_20e0: ; move.l -(A0), (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 4 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 4 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_20e8: ; move.l ($20e8,A0), (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 4 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_20f0: ; move.l (-$10,A0,D2.w), (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_20f0_1 + cwde +OP_20f0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 4 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 26 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_20f8: ; move.l $20f8.w, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 4 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_20f9: ; move.l $123456.l, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 4 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_20fa: ; move.l ($20fa,PC), (A0)+; ($20f8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 4 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_20fb: ; move.l (-$5,PC,D2.w), (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_20fb_1 + cwde +OP_20fb_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 4 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 26 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_20fc: ; move.l #$123456, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,byte 4 + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 4 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2100: ; move.l D0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + mov EAX,[R_D0+EBX*4] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 4 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2110: ; move.l (A0), -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 4 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2118: ; move.l (A0)+, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 4 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 4 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2120: ; move.l -(A0), -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 4 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 4 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2128: ; move.l ($2128,A0), -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 4 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 26 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2130: ; move.l ($3456,A0,D2.w), -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_2130_1 + cwde +OP_2130_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 4 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2138: ; move.l $2138.w, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 4 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 26 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2139: ; move.l $123456.l, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 4 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 30 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_213a: ; move.l ($213a,PC), -(A0); ($2138): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 4 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 26 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_213b: ; move.l ([$3456,PC,D2.w],$3456), -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_213b_1 + cwde +OP_213b_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 4 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_213c: ; move.l #$123456, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,byte 4 + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 4 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2140: ; move.l D0, ($2140,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + mov EAX,[R_D0+EBX*4] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2150: ; move.l (A0), ($2150,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2158: ; move.l (A0)+, ($2158,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 4 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2160: ; move.l -(A0), ($2160,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 4 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 26 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2168: ; move.l ($2168,A0), ($2168,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2170: ; move.l ($3456,A0), ($2170,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_2170_1 + cwde +OP_2170_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 30 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2178: ; move.l $2178.w, ($2178,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2179: ; move.l $123456.l, ($2179,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 32 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_217a: ; move.l ($217a,PC), ($217a,A0); ($2178): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_217b: ; move.l ([$3456,PC],$3456), ($217b,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_217b_1 + cwde +OP_217b_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 30 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_217c: ; move.l #$123456, ($217c,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,byte 4 + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2180: ; move.l D0, (D2.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + mov EAX,[R_D0+EBX*4] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_2180_1 + cwde +OP_2180_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2190: ; move.l (A0), (D2.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_2190_1 + cwde +OP_2190_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 26 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_2198: ; move.l (A0)+, (D2.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 4 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_2198_1 + cwde +OP_2198_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 26 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_21a0: ; move.l -(A0), ($21a0,D2.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 4 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_21a0_1 + cwde +OP_21a0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_21a8: ; move.l ($21a8,A0), ($21a8,D2.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_21a8_1 + cwde +OP_21a8_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 30 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_21b0: ; move.l ($3456,D2.w), ($3456,D2.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_21b0_1 + cwde +OP_21b0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_21b0_2 + cwde +OP_21b0_2: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 32 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_21b8: ; move.l $21b8.w, ($3456,D2.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_21b8_1 + cwde +OP_21b8_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 30 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_21b9: ; move.l $123456.l, ([$3456,D2.w]): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_21b9_1 + cwde +OP_21b9_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 34 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_21ba: ; move.l ($21ba,PC), ([$3456,D2.w],$21ba); ($21b8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_21ba_1 + cwde +OP_21ba_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 30 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_21bb: ; move.l ([$3456,D2.w],$3456), ([$3456,D2.w],$3456): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_21bb_1 + cwde +OP_21bb_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_21bb_2 + cwde +OP_21bb_2: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 32 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_21bc: ; move.l #$123456, ($3456,D2.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,byte 4 + test EAX,EAX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_21bc_1 + cwde +OP_21bc_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_21c0: ; move.l D0, $21c0.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 15 + mov EAX,[R_D0+ECX*4] + test EAX,EAX + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_21d0: ; move.l (A0), $21d0.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + test EAX,EAX + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_21d8: ; move.l (A0)+, $21d8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 4 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + test EAX,EAX + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_21e0: ; move.l -(A0), $21e0.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 4 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + test EAX,EAX + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 26 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_21e8: ; move.l ($21e8,A0), $21e8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + test EAX,EAX + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_21f0: ; move.l ($3456), $21f0.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_21f0_1 + cwde +OP_21f0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + test EAX,EAX + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 30 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_21f8: ; move.l $21f8.w, $21f8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + test EAX,EAX + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_21f9: ; move.l $123456.l, $21f9.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + test EAX,EAX + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 32 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_21fa: ; move.l ($21fa,PC), $21fa.w; ($21f8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + test EAX,EAX + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_21fb: ; move.l ([$3456],$3456), $21fb.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_21fb_1 + cwde +OP_21fb_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + test EAX,EAX + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 30 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_21fc: ; move.l #$123456, $21fc.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,byte 4 + test EAX,EAX + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_23c0: ; move.l D0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 15 + mov EAX,[R_D0+ECX*4] + test EAX,EAX + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_23d0: ; move.l (A0), $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + test EAX,EAX + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_23d8: ; move.l (A0)+, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 4 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + test EAX,EAX + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_23e0: ; move.l -(A0), $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 4 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + test EAX,EAX + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 30 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_23e8: ; move.l ($23e8,A0), $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + test EAX,EAX + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 32 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_23f0: ; move.l ($3456), $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_23f0_1 + cwde +OP_23f0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + test EAX,EAX + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 34 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_23f8: ; move.l $23f8.w, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + test EAX,EAX + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 32 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_23f9: ; move.l $123456.l, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + test EAX,EAX + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 36 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_23fa: ; move.l ($23fa,PC), $123456.l; ($23f8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + test EAX,EAX + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 32 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_23fb: ; move.l ([$3456],$3456), $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_23fb_1 + cwde +OP_23fb_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + test EAX,EAX + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 34 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_23fc: ; move.l #$123456, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,byte 4 + test EAX,EAX + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3000: ; move.w D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + mov EAX,[R_D0+EBX*4] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],AX + pop EDX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3010: ; move.w (A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],AX + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3018: ; move.w (A0)+, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],AX + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3020: ; move.w -(A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 2 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],AX + pop EDX + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3028: ; move.w ($3028,A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],AX + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3030: ; move.w ($30,A0,D3.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_3030_1 + cwde +OP_3030_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],AX + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3038: ; move.w $3038.w, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],AX + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3039: ; move.w $123456.l, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],AX + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_303a: ; move.w ($303a,PC), D0; ($3038): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],AX + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_303b: ; move.w ($3b,PC,D3.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_303b_1 + cwde +OP_303b_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],AX + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_303c: ; move.w #$303c, D0: + add esi,byte 2 + + mov EAX,dword [esi+ebp] + add esi,byte 2 + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov [R_D0+ECX*4],AX + pop EDX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3040: ; movea.w D0, A0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + mov EAX,[R_D0+EBX*4] + shr ecx,9 + and ecx,byte 7 + cwde + mov [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3050: ; movea.w (A0), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + shr ecx,9 + and ecx,byte 7 + cwde + mov [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3058: ; movea.w (A0)+, A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + shr ecx,9 + and ecx,byte 7 + cwde + mov [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3060: ; movea.w -(A0), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 2 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + shr ecx,9 + and ecx,byte 7 + cwde + mov [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3068: ; movea.w ($3068,A0), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + shr ecx,9 + and ecx,byte 7 + cwde + mov [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3070: ; movea.w ($70,A0,D3.w), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_3070_1 + cwde +OP_3070_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + shr ecx,9 + and ecx,byte 7 + cwde + mov [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3078: ; movea.w $3078.w, A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + shr ecx,9 + and ecx,byte 7 + cwde + mov [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3079: ; movea.w $123456.l, A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + shr ecx,9 + and ecx,byte 7 + cwde + mov [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_307a: ; movea.w ($307a,PC), A0; ($3078): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + shr ecx,9 + and ecx,byte 7 + cwde + mov [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_307b: ; movea.w ($7b,PC,D3.w), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_307b_1 + cwde +OP_307b_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + shr ecx,9 + and ecx,byte 7 + cwde + mov [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_307c: ; movea.w #$307c, A0: + add esi,byte 2 + + mov EAX,dword [esi+ebp] + add esi,byte 2 + shr ecx,9 + and ecx,byte 7 + cwde + mov [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3080: ; move.w D0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + mov EAX,[R_D0+EBX*4] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3090: ; move.w (A0), (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3098: ; move.w (A0)+, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_30a0: ; move.w -(A0), (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 2 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_30a8: ; move.w ($30a8,A0), (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_30b0: ; move.w (-$50,A0,D3.w), (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_30b0_1 + cwde +OP_30b0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_30b8: ; move.w $30b8.w, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_30b9: ; move.w $123456.l, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_30ba: ; move.w ($30ba,PC), (A0); ($30b8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_30bb: ; move.w (-$45,PC,D3.w), (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_30bb_1 + cwde +OP_30bb_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_30bc: ; move.w #$30bc, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EAX,dword [esi+ebp] + add esi,byte 2 + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_30c0: ; move.w D0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + mov EAX,[R_D0+EBX*4] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_30d0: ; move.w (A0), (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_30d8: ; move.w (A0)+, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_30e0: ; move.w -(A0), (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 2 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_30e8: ; move.w ($30e8,A0), (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_30f0: ; move.w (-$10,A0,D3.w), (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_30f0_1 + cwde +OP_30f0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_30f8: ; move.w $30f8.w, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_30f9: ; move.w $123456.l, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_30fa: ; move.w ($30fa,PC), (A0)+; ($30f8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_30fb: ; move.w (-$5,PC,D3.w), (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_30fb_1 + cwde +OP_30fb_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_30fc: ; move.w #$30fc, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EAX,dword [esi+ebp] + add esi,byte 2 + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3100: ; move.w D0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + mov EAX,[R_D0+EBX*4] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3110: ; move.w (A0), -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3118: ; move.w (A0)+, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3120: ; move.w -(A0), -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 2 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3128: ; move.w ($3128,A0), -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3130: ; move.w ($3456,A0,D3.w), -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_3130_1 + cwde +OP_3130_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3138: ; move.w $3138.w, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3139: ; move.w $123456.l, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_313a: ; move.w ($313a,PC), -(A0); ($3138): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_313b: ; move.w ([$3456,PC,D3.w],$3456), -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_313b_1 + cwde +OP_313b_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_313c: ; move.w #$313c, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EAX,dword [esi+ebp] + add esi,byte 2 + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3140: ; move.w D0, ($3140,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + mov EAX,[R_D0+EBX*4] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3150: ; move.w (A0), ($3150,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3158: ; move.w (A0)+, ($3158,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3160: ; move.w -(A0), ($3160,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 2 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3168: ; move.w ($3168,A0), ($3168,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3170: ; move.w ($3456,A0), ($3170,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_3170_1 + cwde +OP_3170_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3178: ; move.w $3178.w, ($3178,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3179: ; move.w $123456.l, ($3179,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_317a: ; move.w ($317a,PC), ($317a,A0); ($3178): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_317b: ; move.w ([$3456,PC],$3456), ($317b,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_317b_1 + cwde +OP_317b_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_317c: ; move.w #$317c, ($317c,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EAX,dword [esi+ebp] + add esi,byte 2 + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3180: ; move.w D0, (D3.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + mov EAX,[R_D0+EBX*4] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_3180_1 + cwde +OP_3180_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3190: ; move.w (A0), (D3.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_3190_1 + cwde +OP_3190_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_3198: ; move.w (A0)+, (D3.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_3198_1 + cwde +OP_3198_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_31a0: ; move.w -(A0), ($31a0,D3.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 2 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_31a0_1 + cwde +OP_31a0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_31a8: ; move.w ($31a8,A0), ($31a8,D3.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_31a8_1 + cwde +OP_31a8_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_31b0: ; move.w ($3456,D3.w), ($3456,D3.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_31b0_1 + cwde +OP_31b0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_31b0_2 + cwde +OP_31b0_2: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_31b8: ; move.w $31b8.w, ($3456,D3.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_31b8_1 + cwde +OP_31b8_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_31b9: ; move.w $123456.l, ([$3456,D3.w]): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_31b9_1 + cwde +OP_31b9_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 26 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_31ba: ; move.w ($31ba,PC), ([$3456,D3.w],$31ba); ($31b8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_31ba_1 + cwde +OP_31ba_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_31bb: ; move.w ([$3456,D3.w],$3456), ([$3456,D3.w],$3456): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_31bb_1 + cwde +OP_31bb_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_31bb_2 + cwde +OP_31bb_2: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_31bc: ; move.w #$31bc, ($3456,D3.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EAX,dword [esi+ebp] + add esi,byte 2 + test AX,AX + pushfd + shr ecx,9 + and ecx,byte 7 + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_31bc_1 + cwde +OP_31bc_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_31c0: ; move.w D0, $31c0.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 15 + mov EAX,[R_D0+ECX*4] + test AX,AX + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_31d0: ; move.w (A0), $31d0.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test AX,AX + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_31d8: ; move.w (A0)+, $31d8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test AX,AX + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_31e0: ; move.w -(A0), $31e0.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test AX,AX + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_31e8: ; move.w ($31e8,A0), $31e8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test AX,AX + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_31f0: ; move.w ($3456), $31f0.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_31f0_1 + cwde +OP_31f0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test AX,AX + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_31f8: ; move.w $31f8.w, $31f8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test AX,AX + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_31f9: ; move.w $123456.l, $31f9.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test AX,AX + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_31fa: ; move.w ($31fa,PC), $31fa.w; ($31f8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test AX,AX + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_31fb: ; move.w ([$3456],$3456), $31fb.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_31fb_1 + cwde +OP_31fb_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test AX,AX + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_31fc: ; move.w #$31fc, $31fc.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EAX,dword [esi+ebp] + add esi,byte 2 + test AX,AX + pushfd + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_33c0: ; move.w D0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 15 + mov EAX,[R_D0+ECX*4] + test AX,AX + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_33d0: ; move.w (A0), $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test AX,AX + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_33d8: ; move.w (A0)+, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test AX,AX + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_33e0: ; move.w -(A0), $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test AX,AX + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_33e8: ; move.w ($33e8,A0), $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test AX,AX + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_33f0: ; move.w ($3456), $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_33f0_1 + cwde +OP_33f0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test AX,AX + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 26 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_33f8: ; move.w $33f8.w, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test AX,AX + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_33f9: ; move.w $123456.l, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test AX,AX + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_33fa: ; move.w ($33fa,PC), $123456.l; ($33f8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test AX,AX + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_33fb: ; move.w ([$3456],$3456), $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_33fb_1 + cwde +OP_33fb_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test AX,AX + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 26 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_33fc: ; move.w #$33fc, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EAX,dword [esi+ebp] + add esi,byte 2 + test AX,AX + pushfd + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0000: ; ori.b #$0, D0: + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EAX,[R_D0+ECX*4] + or AL,BL + pushfd + mov [R_D0+ECX*4],AL + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0010: ; ori.b #$0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0018: ; ori.b #$0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_001f: ; ori.b #$0, (A7)+: + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0020: ; ori.b #$0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + dec EDI + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0027: ; ori.b #$0, -(A7): + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0028: ; ori.b #$0, ($28,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0030: ; ori.b #$0, ($30,A0,D0.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_0030_1 + cwde +OP_0030_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0038: ; ori.b #$0, $38.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0039: ; ori.b #$0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_003c: ; ori #$0, CCR: + add esi,byte 2 + + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov eax,edx + mov ah,byte [R_XC] + mov ECX,edx + and ECX,byte 1 + shr eax,4 + and eax,byte 01Ch ; X, N & Z + + or eax,ECX ; C + + mov ECX,edx + shr ECX,10 + and ECX,byte 2 + or eax,ECX ; O + + or AL,BL + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0040: ; ori.w #$40, D0: + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EAX,[R_D0+ECX*4] + or AX,BX + pushfd + mov [R_D0+ECX*4],AX + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0050: ; ori.w #$50, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0058: ; ori.w #$58, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0060: ; ori.w #$60, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0068: ; ori.w #$68, ($68,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0070: ; ori.w #$70, ($70,A0,D0.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_0070_1 + cwde +OP_0070_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0078: ; ori.w #$78, $78.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0079: ; ori.w #$79, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_007c: ; ori #$7c, SR: + add esi,byte 2 + + test byte [R_SR_H],20h ; Supervisor Mode ? + jne near OP_007c_1 + +; sub esi,byte 2 + mov al,8 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_0007c_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_0007c_Bank: + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_007c_1: + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov eax,edx + mov ah,byte [R_XC] + mov ECX,edx + and ECX,byte 1 + shr eax,4 + and eax,byte 01Ch ; X, N & Z + + or eax,ECX ; C + + mov ECX,edx + shr ECX,10 + and ECX,byte 2 + or eax,ECX ; O + + mov ah,byte [R_SR_H] ; T, S & I + + or AX,BX + test ah,20h ; User Mode ? + jne short OP_007c_2 + + mov edx,[R_A7] + mov [R_ISP],edx + mov edx,[R_USP] + mov [R_A7],edx +OP_007c_2: + mov byte [R_SR_H],ah ;T, S & I + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + sub dword [_m68000_ICount],byte 20 + js near MainExit + +; Check for Interrupt waiting + + test byte [R_IRQ],07H + jne near interrupt + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0080: ; ori.l #$123456, D0: + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EAX,[R_D0+ECX*4] + or EAX,EBX + pushfd + mov [R_D0+ECX*4],EAX + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0090: ; ori.l #$123456, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0098: ; ori.l #$123456, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_00a0: ; ori.l #$123456, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 4 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 30 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_00a8: ; ori.l #$123456, ($a8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 32 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_00b0: ; ori.l #$123456, (-$50,A0,D0.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_00b0_1 + cwde +OP_00b0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 34 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_00b8: ; ori.l #$123456, $b8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 32 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_00b9: ; ori.l #$123456, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 36 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0200: ; andi.b #$0, D0: + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EAX,[R_D0+ECX*4] + and AL,BL + pushfd + mov [R_D0+ECX*4],AL + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0210: ; andi.b #$0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0218: ; andi.b #$0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_021f: ; andi.b #$0, (A7)+: + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0220: ; andi.b #$0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + dec EDI + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0227: ; andi.b #$0, -(A7): + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0228: ; andi.b #$0, ($228,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0230: ; andi.b #$0, ($30,A0,D0.w*2): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_0230_1 + cwde +OP_0230_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0238: ; andi.b #$0, $238.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0239: ; andi.b #$0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_023c: ; andi #$0, CCR: + add esi,byte 2 + + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov eax,edx + mov ah,byte [R_XC] + mov ECX,edx + and ECX,byte 1 + shr eax,4 + and eax,byte 01Ch ; X, N & Z + + or eax,ECX ; C + + mov ECX,edx + shr ECX,10 + and ECX,byte 2 + or eax,ECX ; O + + and AL,BL + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0240: ; andi.w #$240, D0: + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EAX,[R_D0+ECX*4] + and AX,BX + pushfd + mov [R_D0+ECX*4],AX + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0250: ; andi.w #$250, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0258: ; andi.w #$258, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0260: ; andi.w #$260, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0268: ; andi.w #$268, ($268,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0270: ; andi.w #$270, ($70,A0,D0.w*2): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_0270_1 + cwde +OP_0270_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0278: ; andi.w #$278, $278.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0279: ; andi.w #$279, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_027c: ; andi #$27c, SR: + add esi,byte 2 + + test byte [R_SR_H],20h ; Supervisor Mode ? + jne near OP_027c_1 + +; sub esi,byte 2 + mov al,8 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_0027c_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_0027c_Bank: + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_027c_1: + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov eax,edx + mov ah,byte [R_XC] + mov ECX,edx + and ECX,byte 1 + shr eax,4 + and eax,byte 01Ch ; X, N & Z + + or eax,ECX ; C + + mov ECX,edx + shr ECX,10 + and ECX,byte 2 + or eax,ECX ; O + + mov ah,byte [R_SR_H] ; T, S & I + + and AX,BX + test ah,20h ; User Mode ? + jne short OP_027c_2 + + mov edx,[R_A7] + mov [R_ISP],edx + mov edx,[R_USP] + mov [R_A7],edx +OP_027c_2: + mov byte [R_SR_H],ah ;T, S & I + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + sub dword [_m68000_ICount],byte 20 + js near MainExit + +; Check for Interrupt waiting + + test byte [R_IRQ],07H + jne near interrupt + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0280: ; andi.l #$123456, D0: + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EAX,[R_D0+ECX*4] + and EAX,EBX + pushfd + mov [R_D0+ECX*4],EAX + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0290: ; andi.l #$123456, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0298: ; andi.l #$123456, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_02a0: ; andi.l #$123456, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 4 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 30 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_02a8: ; andi.l #$123456, ($2a8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 32 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_02b0: ; andi.l #$123456, (-$50,A0,D0.w*2): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_02b0_1 + cwde +OP_02b0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 34 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_02b8: ; andi.l #$123456, $2b8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 32 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_02b9: ; andi.l #$123456, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 36 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0400: ; subi.b #$0, D0: + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EAX,[R_D0+ECX*4] + sub AL,BL + pushfd + mov [R_D0+ECX*4],AL + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0410: ; subi.b #$0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0418: ; subi.b #$0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_041f: ; subi.b #$0, (A7)+: + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0420: ; subi.b #$0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + dec EDI + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0427: ; subi.b #$0, -(A7): + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0428: ; subi.b #$0, ($428,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0430: ; subi.b #$0, ($30,A0,D0.w*4): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_0430_1 + cwde +OP_0430_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0438: ; subi.b #$0, $438.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0439: ; subi.b #$0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0440: ; subi.w #$440, D0: + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EAX,[R_D0+ECX*4] + sub AX,BX + pushfd + mov [R_D0+ECX*4],AX + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0450: ; subi.w #$450, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0458: ; subi.w #$458, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0460: ; subi.w #$460, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0468: ; subi.w #$468, ($468,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0470: ; subi.w #$470, ($70,A0,D0.w*4): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_0470_1 + cwde +OP_0470_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0478: ; subi.w #$478, $478.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0479: ; subi.w #$479, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0480: ; subi.l #$123456, D0: + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EAX,[R_D0+ECX*4] + sub EAX,EBX + pushfd + mov [R_D0+ECX*4],EAX + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0490: ; subi.l #$123456, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0498: ; subi.l #$123456, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_04a0: ; subi.l #$123456, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 4 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 30 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_04a8: ; subi.l #$123456, ($4a8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 32 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_04b0: ; subi.l #$123456, (-$50,A0,D0.w*4): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_04b0_1 + cwde +OP_04b0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 34 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_04b8: ; subi.l #$123456, $4b8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 32 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_04b9: ; subi.l #$123456, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 36 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0600: ; addi.b #$0, D0: + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EAX,[R_D0+ECX*4] + add AL,BL + pushfd + mov [R_D0+ECX*4],AL + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0610: ; addi.b #$0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0618: ; addi.b #$0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_061f: ; addi.b #$0, (A7)+: + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0620: ; addi.b #$0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + dec EDI + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0627: ; addi.b #$0, -(A7): + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0628: ; addi.b #$0, ($628,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0630: ; addi.b #$0, ($30,A0,D0.w*8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_0630_1 + cwde +OP_0630_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0638: ; addi.b #$0, $638.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0639: ; addi.b #$0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0640: ; addi.w #$640, D0: + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EAX,[R_D0+ECX*4] + add AX,BX + pushfd + mov [R_D0+ECX*4],AX + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0650: ; addi.w #$650, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0658: ; addi.w #$658, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0660: ; addi.w #$660, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0668: ; addi.w #$668, ($668,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0670: ; addi.w #$670, ($70,A0,D0.w*8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_0670_1 + cwde +OP_0670_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0678: ; addi.w #$678, $678.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0679: ; addi.w #$679, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0680: ; addi.l #$123456, D0: + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EAX,[R_D0+ECX*4] + add EAX,EBX + pushfd + mov [R_D0+ECX*4],EAX + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0690: ; addi.l #$123456, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0698: ; addi.l #$123456, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_06a0: ; addi.l #$123456, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 4 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 30 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_06a8: ; addi.l #$123456, ($6a8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 32 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_06b0: ; addi.l #$123456, (-$50,A0,D0.w*8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_06b0_1 + cwde +OP_06b0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 34 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_06b8: ; addi.l #$123456, $6b8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 32 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_06b9: ; addi.l #$123456, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 36 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0a00: ; eori.b #$0, D0: + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EAX,[R_D0+ECX*4] + xor AL,BL + pushfd + mov [R_D0+ECX*4],AL + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0a10: ; eori.b #$0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0a18: ; eori.b #$0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0a1f: ; eori.b #$0, (A7)+: + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0a20: ; eori.b #$0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + dec EDI + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0a27: ; eori.b #$0, -(A7): + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0a28: ; eori.b #$0, ($a28,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0a30: ; eori.b #$0, ($30,A0,D0.l*2): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_0a30_1 + cwde +OP_0a30_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0a38: ; eori.b #$0, $a38.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0a39: ; eori.b #$0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AL,BL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0a3c: ; eori #$0, CCR: + add esi,byte 2 + + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov eax,edx + mov ah,byte [R_XC] + mov ECX,edx + and ECX,byte 1 + shr eax,4 + and eax,byte 01Ch ; X, N & Z + + or eax,ECX ; C + + mov ECX,edx + shr ECX,10 + and ECX,byte 2 + or eax,ECX ; O + + xor AL,BL + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0a40: ; eori.w #$a40, D0: + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EAX,[R_D0+ECX*4] + xor AX,BX + pushfd + mov [R_D0+ECX*4],AX + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0a50: ; eori.w #$a50, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0a58: ; eori.w #$a58, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0a60: ; eori.w #$a60, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0a68: ; eori.w #$a68, ($a68,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0a70: ; eori.w #$a70, ($70,A0,D0.l*2): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_0a70_1 + cwde +OP_0a70_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0a78: ; eori.w #$a78, $a78.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0a79: ; eori.w #$a79, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AX,BX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0a7c: ; eori #$a7c, SR: + add esi,byte 2 + + test byte [R_SR_H],20h ; Supervisor Mode ? + jne near OP_0a7c_1 + +; sub esi,byte 2 + mov al,8 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_00a7c_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_00a7c_Bank: + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_0a7c_1: + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov eax,edx + mov ah,byte [R_XC] + mov ECX,edx + and ECX,byte 1 + shr eax,4 + and eax,byte 01Ch ; X, N & Z + + or eax,ECX ; C + + mov ECX,edx + shr ECX,10 + and ECX,byte 2 + or eax,ECX ; O + + mov ah,byte [R_SR_H] ; T, S & I + + xor AX,BX + test ah,20h ; User Mode ? + jne short OP_0a7c_2 + + mov edx,[R_A7] + mov [R_ISP],edx + mov edx,[R_USP] + mov [R_A7],edx +OP_0a7c_2: + mov byte [R_SR_H],ah ;T, S & I + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + sub dword [_m68000_ICount],byte 20 + js near MainExit + +; Check for Interrupt waiting + + test byte [R_IRQ],07H + jne near interrupt + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0a80: ; eori.l #$123456, D0: + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EAX,[R_D0+ECX*4] + xor EAX,EBX + pushfd + mov [R_D0+ECX*4],EAX + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0a90: ; eori.l #$123456, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0a98: ; eori.l #$123456, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0aa0: ; eori.l #$123456, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 4 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 30 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0aa8: ; eori.l #$123456, ($aa8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 32 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0ab0: ; eori.l #$123456, (-$50,A0,D0.l*2): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_0ab0_1 + cwde +OP_0ab0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 34 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0ab8: ; eori.l #$123456, $ab8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 32 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0ab9: ; eori.l #$123456, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor EAX,EBX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 36 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0c00: ; cmpi.b #$0, D0: + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EAX,[R_D0+ECX*4] + cmp AL,BL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0c10: ; cmpi.b #$0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp AL,BL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0c18: ; cmpi.b #$0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp AL,BL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0c1f: ; cmpi.b #$0, (A7)+: + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp AL,BL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0c20: ; cmpi.b #$0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + dec EDI + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp AL,BL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0c27: ; cmpi.b #$0, -(A7): + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp AL,BL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0c28: ; cmpi.b #$0, ($c28,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp AL,BL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0c30: ; cmpi.b #$0, ($30,A0,D0.l*4): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_0c30_1 + cwde +OP_0c30_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp AL,BL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0c38: ; cmpi.b #$0, $c38.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp AL,BL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0c39: ; cmpi.b #$0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp AL,BL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0c3c: ; dc.w $0c3c; ILLEGAL: + add esi,byte 2 + + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov eax,edx + mov ah,byte [R_XC] + mov ECX,edx + and ECX,byte 1 + shr eax,4 + and eax,byte 01Ch ; X, N & Z + + or eax,ECX ; C + + mov ECX,edx + shr ECX,10 + and ECX,byte 2 + or eax,ECX ; O + + cmp AL,BL + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0c40: ; cmpi.w #$c40, D0: + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EAX,[R_D0+ECX*4] + cmp AX,BX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0c50: ; cmpi.w #$c50, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp AX,BX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0c58: ; cmpi.w #$c58, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp AX,BX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0c60: ; cmpi.w #$c60, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp AX,BX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0c68: ; cmpi.w #$c68, ($c68,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp AX,BX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0c70: ; cmpi.w #$c70, ($70,A0,D0.l*4): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_0c70_1 + cwde +OP_0c70_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp AX,BX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0c78: ; cmpi.w #$c78, $c78.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp AX,BX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0c79: ; cmpi.w #$c79, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp AX,BX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0c7c: ; dc.w $0c7c; ILLEGAL: + add esi,byte 2 + + test byte [R_SR_H],20h ; Supervisor Mode ? + jne near OP_0c7c_1 + +; sub esi,byte 2 + mov al,8 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_00c7c_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_00c7c_Bank: + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_0c7c_1: + mov EBX,dword [esi+ebp] + add esi,byte 2 + mov eax,edx + mov ah,byte [R_XC] + mov ECX,edx + and ECX,byte 1 + shr eax,4 + and eax,byte 01Ch ; X, N & Z + + or eax,ECX ; C + + mov ECX,edx + shr ECX,10 + and ECX,byte 2 + or eax,ECX ; O + + mov ah,byte [R_SR_H] ; T, S & I + + cmp AX,BX + test ah,20h ; User Mode ? + jne short OP_0c7c_2 + + mov edx,[R_A7] + mov [R_ISP],edx + mov edx,[R_USP] + mov [R_A7],edx +OP_0c7c_2: + mov byte [R_SR_H],ah ;T, S & I + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + sub dword [_m68000_ICount],byte 20 + js near MainExit + +; Check for Interrupt waiting + + test byte [R_IRQ],07H + jne near interrupt + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0c80: ; cmpi.l #$123456, D0: + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EAX,[R_D0+ECX*4] + cmp EAX,EBX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0c90: ; cmpi.l #$123456, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp EAX,EBX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0c98: ; cmpi.l #$123456, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp EAX,EBX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0ca0: ; cmpi.l #$123456, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 4 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp EAX,EBX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0ca8: ; cmpi.l #$123456, ($ca8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp EAX,EBX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0cb0: ; cmpi.l #$123456, (-$50,A0,D0.l*4): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_0cb0_1 + cwde +OP_0cb0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp EAX,EBX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 26 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0cb8: ; cmpi.l #$123456, $cb8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp EAX,EBX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0cb9: ; cmpi.l #$123456, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EBX,dword [esi+ebp] + rol EBX,16 + add esi,byte 4 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp EAX,EBX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0100: ; btst D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 31 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + or edx,byte 40h ; Set Zero Flag + test [R_D0+ebx*4],ECX + jz short OP_0100_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0100_1: + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0110: ; btst D0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0110_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0110_1: + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0118: ; btst D0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + inc dword [R_A0+EBX*4] + cmp ebx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_0118_notA7 ; + inc dword [R_A0+EBX*4] ; +OP_0118_notA7: ; + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0118_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0118_1: + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0120: ; btst D0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + dec EDI + cmp ebx, byte 7 ; by Kenjo, for "-(A7)" + jne OP_0120_notA7 ; + dec EDI ; +OP_0120_notA7: ; + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0120_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0120_1: + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0128: ; btst D0, ($128,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0128_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0128_1: + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0130: ; btst D0, ($3456,A0,D0.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_0130_1 + cwde +OP_0130_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0130_2 + xor edx,byte 40h ; Clear Zero Flag +OP_0130_2: + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0138: ; btst D0, $138.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0138_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0138_1: + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0139: ; btst D0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0139_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0139_1: + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_013a: ; btst D0, ($13a,PC); ($138): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_013a_1 + xor edx,byte 40h ; Clear Zero Flag +OP_013a_1: + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_013b: ; btst D0, ([$3456,PC,D0.w],$3456): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov edi,esi ; Get PC + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_013b_1 + cwde +OP_013b_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_013b_2 + xor edx,byte 40h ; Clear Zero Flag +OP_013b_2: + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_013c: ; btst D0, CCR // 16/04/2000 Kenjo + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + +; ---------------------------------------- "btst D0, CCR" の Ver. +; mov eax,edx +; mov ah,byte [R_XC] +; mov EbX,edx +; and EbX,byte 1 +; shr eax,4 +; and eax,byte 01Ch ; X, N & Z +; or eax,EbX ; C +; mov EbX,edx +; shr EbX,10 +; and EbX,byte 2 +; or eax,EbX ; O +; ---------------------------------------- 今までどおりのVer.("btst D0, #$0") + mov EAX,dword [esi+ebp] + add esi,byte 2 + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_013c_1 + xor edx,byte 40h ; Clear Zero Flag +; ---------------------------------------- + + or edx,byte 40h ; Set Zero Flag + test eax,ECX + jz short OP_013c_1 + xor edx,byte 40h ; Clear Zero Flag +OP_013c_1: + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + + +OP_0140: ; bchg D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 31 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + or edx,byte 40h ; Set Zero Flag + test [R_D0+ebx*4],ECX + jz short OP_0140_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0140_1: + xor [R_D0+ebx*4],ECX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0150: ; bchg D0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0150_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0150_1: + xor AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0158: ; bchg D0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + inc dword [R_A0+EBX*4] + cmp ebx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_0158_notA7 ; + inc dword [R_A0+EBX*4] ; +OP_0158_notA7: ; + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0158_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0158_1: + xor AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0160: ; bchg D0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + dec EDI + cmp ebx, byte 7 ; by Kenjo, for "-(A7)" + jne OP_0160_notA7 ; + dec EDI ; +OP_0160_notA7: ; + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0160_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0160_1: + xor AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0168: ; bchg D0, ($168,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0168_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0168_1: + xor AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0170: ; bchg D0, ($3456,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_0170_1 + cwde +OP_0170_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0170_2 + xor edx,byte 40h ; Clear Zero Flag +OP_0170_2: + xor AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0178: ; bchg D0, $178.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0178_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0178_1: + xor AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0179: ; bchg D0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0179_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0179_1: + xor AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0180: ; bclr D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 31 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + or edx,byte 40h ; Set Zero Flag + test [R_D0+ebx*4],ECX + jz short OP_0180_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0180_1: + not ecx + and [R_D0+ebx*4],ECX + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0190: ; bclr D0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0190_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0190_1: + not ecx + and AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0198: ; bclr D0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + inc dword [R_A0+EBX*4] + cmp ebx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_0198_notA7 ; + inc dword [R_A0+EBX*4] ; +OP_0198_notA7: ; + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0198_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0198_1: + not ecx + and AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_01a0: ; bclr D0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + dec EDI + cmp ebx, byte 7 ; by Kenjo, for "-(A7)" + jne OP_01a0_notA7 ; + dec EDI ; +OP_01a0_notA7: ; + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_01a0_1 + xor edx,byte 40h ; Clear Zero Flag +OP_01a0_1: + not ecx + and AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_01a8: ; bclr D0, ($1a8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_01a8_1 + xor edx,byte 40h ; Clear Zero Flag +OP_01a8_1: + not ecx + and AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_01b0: ; bclr D0, ($3456,D0.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_01b0_1 + cwde +OP_01b0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_01b0_2 + xor edx,byte 40h ; Clear Zero Flag +OP_01b0_2: + not ecx + and AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_01b8: ; bclr D0, $1b8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_01b8_1 + xor edx,byte 40h ; Clear Zero Flag +OP_01b8_1: + not ecx + and AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_01b9: ; bclr D0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_01b9_1 + xor edx,byte 40h ; Clear Zero Flag +OP_01b9_1: + not ecx + and AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_01c0: ; bset D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 31 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + or edx,byte 40h ; Set Zero Flag + test [R_D0+ebx*4],ECX + jz short OP_01c0_1 + xor edx,byte 40h ; Clear Zero Flag +OP_01c0_1: + or [R_D0+ebx*4],ECX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_01d0: ; bset D0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_01d0_1 + xor edx,byte 40h ; Clear Zero Flag +OP_01d0_1: + or AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_01d8: ; bset D0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + inc dword [R_A0+EBX*4] + cmp ebx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_01d8_notA7 ; + inc dword [R_A0+EBX*4] ; +OP_01d8_notA7: ; + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_01d8_1 + xor edx,byte 40h ; Clear Zero Flag +OP_01d8_1: + or AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_01e0: ; bset D0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + dec EDI + cmp ebx, byte 7 ; by Kenjo, for "-(A7)" + jne OP_01e0_notA7 ; + dec EDI ; +OP_01e0_notA7: ; + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_01e0_1 + xor edx,byte 40h ; Clear Zero Flag +OP_01e0_1: + or AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_01e8: ; bset D0, ($1e8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_01e8_1 + xor edx,byte 40h ; Clear Zero Flag +OP_01e8_1: + or AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_01f0: ; bset D0, ($3456): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_01f0_1 + cwde +OP_01f0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_01f0_2 + xor edx,byte 40h ; Clear Zero Flag +OP_01f0_2: + or AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_01f8: ; bset D0, $1f8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_01f8_1 + xor edx,byte 40h ; Clear Zero Flag +OP_01f8_1: + or AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_01f9: ; bset D0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx, byte 9 + and ecx, byte 7 + mov ecx, [R_D0+ECX*4] + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_01f9_1 + xor edx,byte 40h ; Clear Zero Flag +OP_01f9_1: + or AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0108: ; movep.w ($108,A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov ebx,ecx + and ebx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + shr ecx,byte 9 + and ecx,byte 7 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + mov bh,al + add edi,byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + mov bl,al + mov [R_D0+ecx*4],bx + pop edx + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0148: ; movep.l ($148,A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov ebx,ecx + and ebx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + shr ecx,byte 9 + and ecx,byte 7 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + mov bh,al + add edi,byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + mov bl,al + add edi,byte 2 + shl ebx,16 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + mov bh,al + add edi,byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov bl,al + mov [R_D0+ecx*4],ebx + pop edx + sub dword [_m68000_ICount],byte 36 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0188: ; movep.w D0, ($188,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov ebx,ecx + and ebx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + shr ecx,byte 9 + and ecx,byte 7 + mov eax,[R_D0+ecx*4] + rol eax,byte 24 + mov [R_PC],ESI + and EDI,0FFFFFFh + push EaX + mov [Safe_EDI],EDI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDI,[Safe_EDI] + pop EAX + add edi,byte 2 + rol eax,byte 8 + mov [R_PC],ESI + push EaX + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EAX + pop edx + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_01c8: ; movep.l D0, ($1c8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov ebx,ecx + and ebx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + shr ecx,byte 9 + and ecx,byte 7 + mov eax,[R_D0+ecx*4] + rol eax,byte 8 + mov [R_PC],ESI + and EDI,0FFFFFFh + push EaX + mov [Safe_EDI],EDI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDI,[Safe_EDI] + pop EAX + add edi,byte 2 + rol eax,byte 8 + mov [R_PC],ESI + push EaX + mov [Safe_EDI],EDI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDI,[Safe_EDI] + pop EAX + add edi,byte 2 + rol eax,byte 8 + mov [R_PC],ESI + push EaX + mov [Safe_EDI],EDI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDI,[Safe_EDI] + pop EAX + add edi,byte 2 + rol eax,byte 8 + mov [R_PC],ESI + push EaX + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EAX + pop edx + sub dword [_m68000_ICount],byte 36 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0800: ; btst #$0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 31 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + or edx,byte 40h ; Set Zero Flag + test [R_D0+ebx*4],ECX + jz short OP_0800_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0800_1: + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0810: ; btst #$0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0810_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0810_1: + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0818: ; btst #$0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + inc dword [R_A0+EBX*4] + cmp ebx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_0818_notA7 ; + inc dword [R_A0+EBX*4] ; +OP_0818_notA7: ; + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0818_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0818_1: + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0820: ; btst #$0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + dec EDI + cmp ebx, byte 7 ; by Kenjo, for "-(A7)" + jne OP_0820_notA7 ; + dec EDI ; +OP_0820_notA7: ; + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0820_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0820_1: + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0828: ; btst #$0, ($828,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0828_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0828_1: + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0830: ; btst #$0, ($30,A0,D0.l): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_0830_1 + cwde +OP_0830_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0830_2 + xor edx,byte 40h ; Clear Zero Flag +OP_0830_2: + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0838: ; btst #$0, $838.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0838_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0838_1: + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0839: ; btst #$0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0839_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0839_1: + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_083a: ; btst #$0, ($83a,PC); ($838): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_083a_1 + xor edx,byte 40h ; Clear Zero Flag +OP_083a_1: + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_083b: ; btst #$0, ($3b,PC,D0.l): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov edi,esi ; Get PC + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_083b_1 + cwde +OP_083b_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_083b_2 + xor edx,byte 40h ; Clear Zero Flag +OP_083b_2: + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0840: ; bchg #$0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 31 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + or edx,byte 40h ; Set Zero Flag + test [R_D0+ebx*4],ECX + jz short OP_0840_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0840_1: + xor [R_D0+ebx*4],ECX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0850: ; bchg #$0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0850_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0850_1: + xor AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0858: ; bchg #$0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + inc dword [R_A0+EBX*4] + cmp ebx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_0858_notA7 ; + inc dword [R_A0+EBX*4] ; +OP_0858_notA7: ; + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0858_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0858_1: + xor AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0860: ; bchg #$0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + dec EDI + cmp ebx, byte 7 ; by Kenjo, for "-(A7)" + jne OP_0860_notA7 ; + dec EDI ; +OP_0860_notA7: ; + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0860_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0860_1: + xor AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0868: ; bchg #$0, ($868,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0868_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0868_1: + xor AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0870: ; bchg #$0, ($70,A0,D0.l): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_0870_1 + cwde +OP_0870_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0870_2 + xor edx,byte 40h ; Clear Zero Flag +OP_0870_2: + xor AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0878: ; bchg #$0, $878.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0878_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0878_1: + xor AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0879: ; bchg #$0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0879_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0879_1: + xor AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0880: ; bclr #$0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 31 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + or edx,byte 40h ; Set Zero Flag + test [R_D0+ebx*4],ECX + jz short OP_0880_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0880_1: + not ecx + and [R_D0+ebx*4],ECX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0890: ; bclr #$0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0890_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0890_1: + not ecx + and AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_0898: ; bclr #$0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + inc dword [R_A0+EBX*4] + cmp ebx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_0898_notA7 ; + inc dword [R_A0+EBX*4] ; +OP_0898_notA7: ; + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_0898_1 + xor edx,byte 40h ; Clear Zero Flag +OP_0898_1: + not ecx + and AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_08a0: ; bclr #$0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + dec EDI + cmp ebx, byte 7 ; by Kenjo, for "-(A7)" + jne OP_08a0_notA7 ; + dec EDI ; +OP_08a0_notA7: ; + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_08a0_1 + xor edx,byte 40h ; Clear Zero Flag +OP_08a0_1: + not ecx + and AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_08a8: ; bclr #$0, ($8a8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_08a8_1 + xor edx,byte 40h ; Clear Zero Flag +OP_08a8_1: + not ecx + and AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_08b0: ; bclr #$0, (-$50,A0,D0.l): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_08b0_1 + cwde +OP_08b0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_08b0_2 + xor edx,byte 40h ; Clear Zero Flag +OP_08b0_2: + not ecx + and AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_08b8: ; bclr #$0, $8b8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_08b8_1 + xor edx,byte 40h ; Clear Zero Flag +OP_08b8_1: + not ecx + and AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_08b9: ; bclr #$0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_08b9_1 + xor edx,byte 40h ; Clear Zero Flag +OP_08b9_1: + not ecx + and AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_08c0: ; bset #$0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 31 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + or edx,byte 40h ; Set Zero Flag + test [R_D0+ebx*4],ECX + jz short OP_08c0_1 + xor edx,byte 40h ; Clear Zero Flag +OP_08c0_1: + or [R_D0+ebx*4],ECX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_08d0: ; bset #$0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_08d0_1 + xor edx,byte 40h ; Clear Zero Flag +OP_08d0_1: + or AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_08d8: ; bset #$0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + inc dword [R_A0+EBX*4] + cmp ebx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_08d8_notA7 ; + inc dword [R_A0+EBX*4] ; +OP_08d8_notA7: ; + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_08d8_1 + xor edx,byte 40h ; Clear Zero Flag +OP_08d8_1: + or AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_08e0: ; bset #$0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + dec EDI + cmp ebx, byte 7 ; by Kenjo, for "-(A7)" + jne OP_08e0_notA7 ; + dec EDI ; +OP_08e0_notA7: ; + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_08e0_1 + xor edx,byte 40h ; Clear Zero Flag +OP_08e0_1: + or AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_08e8: ; bset #$0, ($8e8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_08e8_1 + xor edx,byte 40h ; Clear Zero Flag +OP_08e8_1: + or AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_08f0: ; bset #$0, (-$10,A0,D0.l): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,[R_A0+EBX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_08f0_1 + cwde +OP_08f0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_08f0_2 + xor edx,byte 40h ; Clear Zero Flag +OP_08f0_2: + or AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_08f8: ; bset #$0, $8f8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_08f8_1 + xor edx,byte 40h ; Clear Zero Flag +OP_08f8_1: + or AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_08f9: ; bset #$0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ECX,dword [esi+ebp] + add esi,byte 2 + and ecx, byte 7 + xor eax,eax + inc eax + shl eax,cl + mov ecx,eax + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + or edx,byte 40h ; Set Zero Flag + test AL,CL + jz short OP_08f9_1 + xor edx,byte 40h ; Clear Zero Flag +OP_08f9_1: + or AL,CL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_41d0: ; lea (A0), A0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_A0+ECX*4],edi + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_41e8: ; lea ($41e8,A0), A0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_A0+ECX*4],edi + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_41f0: ; lea ($3456), A0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_41f0_1 + cwde +OP_41f0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov [R_A0+ECX*4],edi + sub dword [_m68000_ICount],byte 26 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_41f8: ; lea $41f8.w, A0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_A0+ECX*4],edi + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_41f9: ; lea $123456.l, A0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_A0+ECX*4],edi + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_41fa: ; lea ($41fa,PC), A0; ($41f8): + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_A0+ECX*4],edi + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_41fb: ; lea ([$3456],$3456), A0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,esi ; Get PC + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_41fb_1 + cwde +OP_41fb_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov [R_A0+ECX*4],edi + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4850: ; pea (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov ecx,[R_A7] ; Push onto Stack + sub ecx,byte 4 + mov [R_A7],ecx + mov [R_PC],ESI + and ECX,0FFFFFFh + mov [R_CCR],edx + mov edx,EDI + mov ecx,ECX + call @cpu_writemem24_dword@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4868: ; pea ($4868,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov ecx,[R_A7] ; Push onto Stack + sub ecx,byte 4 + mov [R_A7],ecx + mov [R_PC],ESI + and ECX,0FFFFFFh + mov [R_CCR],edx + mov edx,EDI + mov ecx,ECX + call @cpu_writemem24_dword@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4870: ; pea ($70,A0,D4.l): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_4870_1 + cwde +OP_4870_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov ecx,[R_A7] ; Push onto Stack + sub ecx,byte 4 + mov [R_A7],ecx + mov [R_PC],ESI + and ECX,0FFFFFFh + mov [R_CCR],edx + mov edx,EDI + mov ecx,ECX + call @cpu_writemem24_dword@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 34 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4878: ; pea $4878.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov ecx,[R_A7] ; Push onto Stack + sub ecx,byte 4 + mov [R_A7],ecx + mov [R_PC],ESI + and ECX,0FFFFFFh + mov [R_CCR],edx + mov edx,EDI + mov ecx,ECX + call @cpu_writemem24_dword@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4879: ; pea $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov ecx,[R_A7] ; Push onto Stack + sub ecx,byte 4 + mov [R_A7],ecx + mov [R_PC],ESI + and ECX,0FFFFFFh + mov [R_CCR],edx + mov edx,EDI + mov ecx,ECX + call @cpu_writemem24_dword@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 32 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_487a: ; pea ($487a,PC); ($4878): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov ecx,[R_A7] ; Push onto Stack + sub ecx,byte 4 + mov [R_A7],ecx + mov [R_PC],ESI + and ECX,0FFFFFFh + mov [R_CCR],edx + mov edx,EDI + mov ecx,ECX + call @cpu_writemem24_dword@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_487b: ; pea ($7b,PC,D4.l): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_487b_1 + cwde +OP_487b_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov ecx,[R_A7] ; Push onto Stack + sub ecx,byte 4 + mov [R_A7],ecx + mov [R_PC],ESI + and ECX,0FFFFFFh + mov [R_CCR],edx + mov edx,EDI + mov ecx,ECX + call @cpu_writemem24_dword@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 30 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_40c0: ; move SR, D0: + add esi,byte 2 + + and ecx,byte 7 + mov eax,edx + mov ah,byte [R_XC] + mov EBX,edx + and EBX,byte 1 + shr eax,4 + and eax,byte 01Ch ; X, N & Z + + or eax,EBX ; C + + mov EBX,edx + shr EBX,10 + and EBX,byte 2 + or eax,EBX ; O + + mov ah,byte [R_SR_H] ; T, S & I + + mov [R_D0+ECX*4],AX + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_40d0: ; move SR, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov eax,edx + mov ah,byte [R_XC] + mov EBX,edx + and EBX,byte 1 + shr eax,4 + and eax,byte 01Ch ; X, N & Z + + or eax,EBX ; C + + mov EBX,edx + shr EBX,10 + and EBX,byte 2 + or eax,EBX ; O + + mov ah,byte [R_SR_H] ; T, S & I + + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_40d8: ; move SR, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov eax,edx + mov ah,byte [R_XC] + mov EBX,edx + and EBX,byte 1 + shr eax,4 + and eax,byte 01Ch ; X, N & Z + + or eax,EBX ; C + + mov EBX,edx + shr EBX,10 + and EBX,byte 2 + or eax,EBX ; O + + mov ah,byte [R_SR_H] ; T, S & I + + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_40e0: ; move SR, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov eax,edx + mov ah,byte [R_XC] + mov EBX,edx + and EBX,byte 1 + shr eax,4 + and eax,byte 01Ch ; X, N & Z + + or eax,EBX ; C + + mov EBX,edx + shr EBX,10 + and EBX,byte 2 + or eax,EBX ; O + + mov ah,byte [R_SR_H] ; T, S & I + + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_40e8: ; move SR, ($40e8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov eax,edx + mov ah,byte [R_XC] + mov EBX,edx + and EBX,byte 1 + shr eax,4 + and eax,byte 01Ch ; X, N & Z + + or eax,EBX ; C + + mov EBX,edx + shr EBX,10 + and EBX,byte 2 + or eax,EBX ; O + + mov ah,byte [R_SR_H] ; T, S & I + + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_40f0: ; move SR, (-$10,A0,D4.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov eax,edx + mov ah,byte [R_XC] + mov EBX,edx + and EBX,byte 1 + shr eax,4 + and eax,byte 01Ch ; X, N & Z + + or eax,EBX ; C + + mov EBX,edx + shr EBX,10 + and EBX,byte 2 + or eax,EBX ; O + + mov ah,byte [R_SR_H] ; T, S & I + + push EAX + mov EDI,[R_A0+ECX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_40f0_1 + cwde +OP_40f0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + pop EAX + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_40f8: ; move SR, $40f8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov eax,edx + mov ah,byte [R_XC] + mov EBX,edx + and EBX,byte 1 + shr eax,4 + and eax,byte 01Ch ; X, N & Z + + or eax,EBX ; C + + mov EBX,edx + shr EBX,10 + and EBX,byte 2 + or eax,EBX ; O + + mov ah,byte [R_SR_H] ; T, S & I + + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_40f9: ; move SR, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov eax,edx + mov ah,byte [R_XC] + mov EBX,edx + and EBX,byte 1 + shr eax,4 + and eax,byte 01Ch ; X, N & Z + + or eax,EBX ; C + + mov EBX,edx + shr EBX,10 + and EBX,byte 2 + or eax,EBX ; O + + mov ah,byte [R_SR_H] ; T, S & I + + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_42c0: ; move CCR, D0; (1+): + test byte [CPU_TYPE], 3 ; CPU Check + jnz OP_42c0_Cnt ; 030/040? + mov al, 4 + jmp ILLEGAL +OP_42c0_Cnt: + add esi,byte 2 + + and ecx,byte 7 + mov eax,edx + mov ah,byte [R_XC] + mov EBX,edx + and EBX,byte 1 + shr eax,4 + and eax,byte 01Ch ; X, N & Z + + or eax,EBX ; C + + mov EBX,edx + shr EBX,10 + and EBX,byte 2 + or eax,EBX ; O + + mov [R_D0+ECX*4],AX + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_42d0: ; move CCR, (A0); (1+): + test byte [CPU_TYPE], 3 ; CPU Check + jnz OP_42d0_Cnt ; 030/040? + mov al, 4 + jmp ILLEGAL +OP_42d0_Cnt: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov eax,edx + mov ah,byte [R_XC] + mov EBX,edx + and EBX,byte 1 + shr eax,4 + and eax,byte 01Ch ; X, N & Z + + or eax,EBX ; C + + mov EBX,edx + shr EBX,10 + and EBX,byte 2 + or eax,EBX ; O + + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_42d8: ; move CCR, (A0)+; (1+): + test byte [CPU_TYPE], 3 ; CPU Check + jnz OP_42d8_Cnt ; 030/040? + mov al, 4 + jmp ILLEGAL +OP_42d8_Cnt: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov eax,edx + mov ah,byte [R_XC] + mov EBX,edx + and EBX,byte 1 + shr eax,4 + and eax,byte 01Ch ; X, N & Z + + or eax,EBX ; C + + mov EBX,edx + shr EBX,10 + and EBX,byte 2 + or eax,EBX ; O + + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_42e0: ; move CCR, -(A0); (1+): + test byte [CPU_TYPE], 3 ; CPU Check + jnz OP_42e0_Cnt ; 030/040? + mov al, 4 + jmp ILLEGAL +OP_42e0_Cnt: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov eax,edx + mov ah,byte [R_XC] + mov EBX,edx + and EBX,byte 1 + shr eax,4 + and eax,byte 01Ch ; X, N & Z + + or eax,EBX ; C + + mov EBX,edx + shr EBX,10 + and EBX,byte 2 + or eax,EBX ; O + + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_42e8: ; move CCR, ($42e8,A0); (1+): + test byte [CPU_TYPE], 3 ; CPU Check + jnz OP_42e8_Cnt ; 030/040? + mov al, 4 + jmp ILLEGAL +OP_42e8_Cnt: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov eax,edx + mov ah,byte [R_XC] + mov EBX,edx + and EBX,byte 1 + shr eax,4 + and eax,byte 01Ch ; X, N & Z + + or eax,EBX ; C + + mov EBX,edx + shr EBX,10 + and EBX,byte 2 + or eax,EBX ; O + + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_42f0: ; move CCR, (-$10,A0,D4.w*2); (1+): + test byte [CPU_TYPE], 3 ; CPU Check + jnz OP_42f0_Cnt ; 030/040? + mov al, 4 + jmp ILLEGAL +OP_42f0_Cnt: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov eax,edx + mov ah,byte [R_XC] + mov EBX,edx + and EBX,byte 1 + shr eax,4 + and eax,byte 01Ch ; X, N & Z + + or eax,EBX ; C + + mov EBX,edx + shr EBX,10 + and EBX,byte 2 + or eax,EBX ; O + + push EAX + mov EDI,[R_A0+ECX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_42f0_1 + cwde +OP_42f0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + pop EAX + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_42f8: ; move CCR, $42f8.w; (1+): + test byte [CPU_TYPE], 3 ; CPU Check + jnz OP_42f8_Cnt ; 030/040? + mov al, 4 + jmp ILLEGAL +OP_42f8_Cnt: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov eax,edx + mov ah,byte [R_XC] + mov EBX,edx + and EBX,byte 1 + shr eax,4 + and eax,byte 01Ch ; X, N & Z + + or eax,EBX ; C + + mov EBX,edx + shr EBX,10 + and EBX,byte 2 + or eax,EBX ; O + + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_42f9: ; move CCR, $123456.l; (1+): + test byte [CPU_TYPE], 3 ; CPU Check + jnz OP_42f9_Cnt ; 030/040? + mov al, 4 + jmp ILLEGAL +OP_42f9_Cnt: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov eax,edx + mov ah,byte [R_XC] + mov EBX,edx + and EBX,byte 1 + shr eax,4 + and eax,byte 01Ch ; X, N & Z + + or eax,EBX ; C + + mov EBX,edx + shr EBX,10 + and EBX,byte 2 + or eax,EBX ; O + + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_44c0: ; move D0, CCR: + add esi,byte 2 + + and ecx,byte 7 + mov EAX,[R_D0+ECX*4] + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_44d0: ; move (A0), CCR: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_44d8: ; move (A0)+, CCR: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_44e0: ; move -(A0), CCR: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_44e8: ; move ($44e8,A0), CCR: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_44f0: ; move (-$10,A0,D4.w*4), CCR: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_44f0_1 + cwde +OP_44f0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_44f8: ; move $44f8.w, CCR: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_44f9: ; move $123456.l, CCR: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_44fa: ; move ($44fa,PC), CCR; ($44f8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_44fb: ; move (-$5,PC,D4.w*4), CCR: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_44fb_1 + cwde +OP_44fb_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_44fc: ; move #$0, CCR: + add esi,byte 2 + + mov EAX,dword [esi+ebp] + add esi,byte 2 + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_46c0: ; move D0, SR: + add esi,byte 2 + + test byte [R_SR_H],20h ; Supervisor Mode ? + je near OP_46c0_1 + + and ecx,byte 7 + mov EAX,[R_D0+ECX*4] + test ah,20h ; User Mode ? + jne short OP_46c0_2 + + mov edx,[R_A7] + mov [R_ISP],edx + mov edx,[R_USP] + mov [R_A7],edx +OP_46c0_2: + mov byte [R_SR_H],ah ;T, S & I + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + sub dword [_m68000_ICount],byte 12 + js near MainExit + +; Check for Interrupt waiting + + test byte [R_IRQ],07H + jne near interrupt + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_46c0_1: +; sub esi,byte 2 + mov al,8 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_046c0_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_046c0_Bank: + sub dword [_m68000_ICount],byte 12 + js near MainExit + +; Check for Interrupt waiting + + test byte [R_IRQ],07H + jne near interrupt + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_46d0: ; move (A0), SR: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + test byte [R_SR_H],20h ; Supervisor Mode ? + je near OP_46d0_1 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test ah,20h ; User Mode ? + jne short OP_46d0_2 + + mov edx,[R_A7] + mov [R_ISP],edx + mov edx,[R_USP] + mov [R_A7],edx +OP_46d0_2: + mov byte [R_SR_H],ah ;T, S & I + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + sub dword [_m68000_ICount],byte 16 + js near MainExit + +; Check for Interrupt waiting + + test byte [R_IRQ],07H + jne near interrupt + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_46d0_1: +; sub esi,byte 2 + mov al,8 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_046d0_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_046d0_Bank: + sub dword [_m68000_ICount],byte 16 + js near MainExit + +; Check for Interrupt waiting + + test byte [R_IRQ],07H + jne near interrupt + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_46d8: ; move (A0)+, SR: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + test byte [R_SR_H],20h ; Supervisor Mode ? + je near OP_46d8_1 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test ah,20h ; User Mode ? + jne short OP_46d8_2 + + mov edx,[R_A7] + mov [R_ISP],edx + mov edx,[R_USP] + mov [R_A7],edx +OP_46d8_2: + mov byte [R_SR_H],ah ;T, S & I + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + sub dword [_m68000_ICount],byte 16 + js near MainExit + +; Check for Interrupt waiting + + test byte [R_IRQ],07H + jne near interrupt + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_46d8_1: +; sub esi,byte 2 + mov al,8 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_046d8_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_046d8_Bank: + sub dword [_m68000_ICount],byte 16 + js near MainExit + +; Check for Interrupt waiting + + test byte [R_IRQ],07H + jne near interrupt + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_46e0: ; move -(A0), SR: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + test byte [R_SR_H],20h ; Supervisor Mode ? + je near OP_46e0_1 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test ah,20h ; User Mode ? + jne short OP_46e0_2 + + mov edx,[R_A7] + mov [R_ISP],edx + mov edx,[R_USP] + mov [R_A7],edx +OP_46e0_2: + mov byte [R_SR_H],ah ;T, S & I + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + sub dword [_m68000_ICount],byte 18 + js near MainExit + +; Check for Interrupt waiting + + test byte [R_IRQ],07H + jne near interrupt + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_46e0_1: +; sub esi,byte 2 + mov al,8 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_046e0_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_046e0_Bank: + sub dword [_m68000_ICount],byte 18 + js near MainExit + +; Check for Interrupt waiting + + test byte [R_IRQ],07H + jne near interrupt + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_46e8: ; move ($46e8,A0), SR: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + test byte [R_SR_H],20h ; Supervisor Mode ? + je near OP_46e8_1 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test ah,20h ; User Mode ? + jne short OP_46e8_2 + + mov edx,[R_A7] + mov [R_ISP],edx + mov edx,[R_USP] + mov [R_A7],edx +OP_46e8_2: + mov byte [R_SR_H],ah ;T, S & I + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + sub dword [_m68000_ICount],byte 20 + js near MainExit + +; Check for Interrupt waiting + + test byte [R_IRQ],07H + jne near interrupt + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_46e8_1: +; sub esi,byte 2 + mov al,8 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_046e8_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_046e8_Bank: + sub dword [_m68000_ICount],byte 20 + js near MainExit + +; Check for Interrupt waiting + + test byte [R_IRQ],07H + jne near interrupt + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_46f0: ; move (-$10,A0,D4.w*8), SR: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + test byte [R_SR_H],20h ; Supervisor Mode ? + je near OP_46f0_1 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_46f0_2 + cwde +OP_46f0_2: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test ah,20h ; User Mode ? + jne short OP_46f0_3 + + mov edx,[R_A7] + mov [R_ISP],edx + mov edx,[R_USP] + mov [R_A7],edx +OP_46f0_3: + mov byte [R_SR_H],ah ;T, S & I + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + sub dword [_m68000_ICount],byte 22 + js near MainExit + +; Check for Interrupt waiting + + test byte [R_IRQ],07H + jne near interrupt + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_46f0_1: +; sub esi,byte 2 + mov al,8 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_046f0_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_046f0_Bank: + sub dword [_m68000_ICount],byte 22 + js near MainExit + +; Check for Interrupt waiting + + test byte [R_IRQ],07H + jne near interrupt + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_46f8: ; move $46f8.w, SR: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + test byte [R_SR_H],20h ; Supervisor Mode ? + je near OP_46f8_1 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test ah,20h ; User Mode ? + jne short OP_46f8_2 + + mov edx,[R_A7] + mov [R_ISP],edx + mov edx,[R_USP] + mov [R_A7],edx +OP_46f8_2: + mov byte [R_SR_H],ah ;T, S & I + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + sub dword [_m68000_ICount],byte 20 + js near MainExit + +; Check for Interrupt waiting + + test byte [R_IRQ],07H + jne near interrupt + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_46f8_1: +; sub esi,byte 2 + mov al,8 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_046f8_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_046f8_Bank: + sub dword [_m68000_ICount],byte 20 + js near MainExit + +; Check for Interrupt waiting + + test byte [R_IRQ],07H + jne near interrupt + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_46f9: ; move $123456.l, SR: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + test byte [R_SR_H],20h ; Supervisor Mode ? + je near OP_46f9_1 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test ah,20h ; User Mode ? + jne short OP_46f9_2 + + mov edx,[R_A7] + mov [R_ISP],edx + mov edx,[R_USP] + mov [R_A7],edx +OP_46f9_2: + mov byte [R_SR_H],ah ;T, S & I + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + sub dword [_m68000_ICount],byte 24 + js near MainExit + +; Check for Interrupt waiting + + test byte [R_IRQ],07H + jne near interrupt + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_46f9_1: +; sub esi,byte 2 + mov al,8 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_046f9_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_046f9_Bank: + sub dword [_m68000_ICount],byte 24 + js near MainExit + +; Check for Interrupt waiting + + test byte [R_IRQ],07H + jne near interrupt + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_46fa: ; move ($46fa,PC), SR; ($46f8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + test byte [R_SR_H],20h ; Supervisor Mode ? + je near OP_46fa_1 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test ah,20h ; User Mode ? + jne short OP_46fa_2 + + mov edx,[R_A7] + mov [R_ISP],edx + mov edx,[R_USP] + mov [R_A7],edx +OP_46fa_2: + mov byte [R_SR_H],ah ;T, S & I + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + sub dword [_m68000_ICount],byte 20 + js near MainExit + +; Check for Interrupt waiting + + test byte [R_IRQ],07H + jne near interrupt + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_46fa_1: +; sub esi,byte 2 + mov al,8 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_046fa_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_046fa_Bank: + sub dword [_m68000_ICount],byte 20 + js near MainExit + +; Check for Interrupt waiting + + test byte [R_IRQ],07H + jne near interrupt + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_46fb: ; move (-$5,PC,D4.w*8), SR: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + test byte [R_SR_H],20h ; Supervisor Mode ? + je near OP_46fb_1 + + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_46fb_2 + cwde +OP_46fb_2: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test ah,20h ; User Mode ? + jne short OP_46fb_3 + + mov edx,[R_A7] + mov [R_ISP],edx + mov edx,[R_USP] + mov [R_A7],edx +OP_46fb_3: + mov byte [R_SR_H],ah ;T, S & I + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + sub dword [_m68000_ICount],byte 22 + js near MainExit + +; Check for Interrupt waiting + + test byte [R_IRQ],07H + jne near interrupt + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_46fb_1: +; sub esi,byte 2 + mov al,8 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_046fb_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_046fb_Bank: + sub dword [_m68000_ICount],byte 22 + js near MainExit + +; Check for Interrupt waiting + + test byte [R_IRQ],07H + jne near interrupt + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_46fc: ; move #$46fc, SR: + add esi,byte 2 + + test byte [R_SR_H],20h ; Supervisor Mode ? + je near OP_46fc_1 + + mov EAX,dword [esi+ebp] + add esi,byte 2 + test ah,20h ; User Mode ? + jne short OP_46fc_2 + + mov edx,[R_A7] + mov [R_ISP],edx + mov edx,[R_USP] + mov [R_A7],edx +OP_46fc_2: + mov byte [R_SR_H],ah ;T, S & I + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + sub dword [_m68000_ICount],byte 12 + js near MainExit + +; Check for Interrupt waiting + + test byte [R_IRQ],07H + jne near interrupt + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_46fc_1: +; sub esi,byte 2 + mov al,8 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_046fc_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_046fc_Bank: + sub dword [_m68000_ICount],byte 12 + js near MainExit + +; Check for Interrupt waiting + + test byte [R_IRQ],07H + jne near interrupt + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5000: ; addq.b #8, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + add [R_D0+ebx*4],CL + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5088: ; addq.l #8, A0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + add [R_A0+ebx*4],ECX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5010: ; addq.b #8, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + add AL,CL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5018: ; addq.b #8, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + inc dword [R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + add AL,CL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_501f: ; addq.b #8, (A7)+: + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + add AL,CL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5020: ; addq.b #8, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + dec EDI + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + add AL,CL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5027: ; addq.b #8, -(A7): + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + add AL,CL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5028: ; addq.b #8, ($5028,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + add AL,CL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5030: ; addq.b #8, ($30,A0,D5.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_5030_1 + cwde +OP_5030_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + add AL,CL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5038: ; addq.b #8, $5038.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + add AL,CL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5039: ; addq.b #8, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + add AL,CL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5040: ; addq.w #8, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + add [R_D0+ebx*4],CX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5050: ; addq.w #8, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + add AX,CX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5058: ; addq.w #8, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + add AX,CX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5060: ; addq.w #8, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 2 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + add AX,CX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5068: ; addq.w #8, ($5068,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + add AX,CX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5070: ; addq.w #8, ($70,A0,D5.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_5070_1 + cwde +OP_5070_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + add AX,CX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5078: ; addq.w #8, $5078.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + add AX,CX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5079: ; addq.w #8, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + add AX,CX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5080: ; addq.l #8, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + add [R_D0+ebx*4],ECX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5090: ; addq.l #8, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + add EAX,ECX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5098: ; addq.l #8, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + add EAX,ECX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_50a0: ; addq.l #8, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 4 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + add EAX,ECX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_50a8: ; addq.l #8, ($50a8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + add EAX,ECX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_50b0: ; addq.l #8, (-$50,A0,D5.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_50b0_1 + cwde +OP_50b0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + add EAX,ECX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 26 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_50b8: ; addq.l #8, $50b8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + add EAX,ECX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_50b9: ; addq.l #8, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + add EAX,ECX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_50c0: ; st D0: + add esi,byte 2 + + and ecx,byte 7 + mov AL,byte 0ffh + mov [R_D0+ECX*4],AL + and eax,byte 2 + add eax,byte 4 + sub dword [_m68000_ICount],eax + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_50c8: ; dbt D0, 50c8: + jmp short OP_50c8_2 + and ecx,byte 7 + mov ax,[R_D0+ecx*4] + dec ax + mov [R_D0+ecx*4],ax + inc ax ; Is it -1 + jz short OP_50c8_1 + add esi,byte 2 + + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_50c8_1: +OP_50c8_2: + add esi,byte 4 + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_50d0: ; st (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + and edi,0FFFFFFh + mov AL,byte 0ffh + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_50d8: ; st (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + and edi,0FFFFFFh + mov AL,byte 0ffh + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_50df: ; st (A7)+: + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + and edi,0FFFFFFh + mov AL,byte 0ffh + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_50e0: ; st -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + mov [R_A0+ECX*4],EDI + and edi,0FFFFFFh + mov AL,byte 0ffh + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_50e7: ; st -(A7): + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + and edi,0FFFFFFh + mov AL,byte 0ffh + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_50e8: ; st ($50e8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + and edi,0FFFFFFh + mov AL,byte 0ffh + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_50f0: ; st (-$10,A0,D5.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_50f0_1 + cwde +OP_50f0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + and edi,0FFFFFFh + mov AL,byte 0ffh + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_50f8: ; st $50f8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + and edi,0FFFFFFh + mov AL,byte 0ffh + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_50f9: ; st $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + and edi,0FFFFFFh + mov AL,byte 0ffh + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5100: ; subq.b #8, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + sub [R_D0+ebx*4],CL + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5188: ; subq.l #8, A0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + sub [R_A0+ebx*4],ECX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5110: ; subq.b #8, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + sub AL,CL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5118: ; subq.b #8, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + inc dword [R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + sub AL,CL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_511f: ; subq.b #8, (A7)+: + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + sub AL,CL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5120: ; subq.b #8, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + dec EDI + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + sub AL,CL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5127: ; subq.b #8, -(A7): + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + sub AL,CL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5128: ; subq.b #8, ($5128,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + sub AL,CL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5130: ; subq.b #8, ($3456,A0,D5.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_5130_1 + cwde +OP_5130_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + sub AL,CL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5138: ; subq.b #8, $5138.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + sub AL,CL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5139: ; subq.b #8, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + sub AL,CL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5140: ; subq.w #8, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + sub [R_D0+ebx*4],CX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5150: ; subq.w #8, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + sub AX,CX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5158: ; subq.w #8, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + sub AX,CX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5160: ; subq.w #8, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 2 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + sub AX,CX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5168: ; subq.w #8, ($5168,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + sub AX,CX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5170: ; subq.w #8, ($3456,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_5170_1 + cwde +OP_5170_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + sub AX,CX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5178: ; subq.w #8, $5178.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + sub AX,CX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5179: ; subq.w #8, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + sub AX,CX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5180: ; subq.l #8, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + sub [R_D0+ebx*4],ECX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5190: ; subq.l #8, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + sub EAX,ECX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5198: ; subq.l #8, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + sub EAX,ECX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_51a0: ; subq.l #8, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 4 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + sub EAX,ECX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_51a8: ; subq.l #8, ($51a8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + sub EAX,ECX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_51b0: ; subq.l #8, ($3456,D5.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_51b0_1 + cwde +OP_51b0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + sub EAX,ECX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 26 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_51b8: ; subq.l #8, $51b8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + sub EAX,ECX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_51b9: ; subq.l #8, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ecx,9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + sub EAX,ECX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_51c0: ; sf D0: + add esi,byte 2 + + and ecx,byte 7 + xor eax,eax + mov [R_D0+ECX*4],AL + and eax,byte 2 + add eax,byte 4 + sub dword [_m68000_ICount],eax + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_51c8: ; dbra D0, 51c8: + and ecx,byte 7 + mov ax,[R_D0+ecx*4] + dec ax + mov [R_D0+ecx*4],ax + inc ax ; Is it -1 + jz short OP_51c8_1 + add esi,byte 2 + + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_51c8_1: +OP_51c8_2: + add esi,byte 4 + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_51d0: ; sf (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + and edi,0FFFFFFh + xor eax,eax + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_51d8: ; sf (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + and edi,0FFFFFFh + xor eax,eax + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_51df: ; sf (A7)+: + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + and edi,0FFFFFFh + xor eax,eax + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_51e0: ; sf -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + mov [R_A0+ECX*4],EDI + and edi,0FFFFFFh + xor eax,eax + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_51e7: ; sf -(A7): + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + and edi,0FFFFFFh + xor eax,eax + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_51e8: ; sf ($51e8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + and edi,0FFFFFFh + xor eax,eax + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_51f0: ; sf ($3456): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_51f0_1 + cwde +OP_51f0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + and edi,0FFFFFFh + xor eax,eax + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_51f8: ; sf $51f8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + and edi,0FFFFFFh + xor eax,eax + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_51f9: ; sf $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + and edi,0FFFFFFh + xor eax,eax + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_52c0: ; shi D0: + add esi,byte 2 + + and ecx,byte 7 + mov ah,dl + sahf + seta AL + neg byte AL + mov [R_D0+ECX*4],AL + and eax,byte 2 + add eax,byte 4 + sub dword [_m68000_ICount],eax + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_52c8: ; dbhi D0, 52c8: + mov ah,dl + sahf + ja short OP_52c8_2 + and ecx,byte 7 + mov ax,[R_D0+ecx*4] + dec ax + mov [R_D0+ecx*4],ax + inc ax ; Is it -1 + jz short OP_52c8_1 + add esi,byte 2 + + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_52c8_1: +OP_52c8_2: + add esi,byte 4 + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_52d0: ; shi (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + and edi,0FFFFFFh + mov ah,dl + sahf + seta AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_52d8: ; shi (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + and edi,0FFFFFFh + mov ah,dl + sahf + seta AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_52df: ; shi (A7)+: + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + and edi,0FFFFFFh + mov ah,dl + sahf + seta AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_52e0: ; shi -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + mov [R_A0+ECX*4],EDI + and edi,0FFFFFFh + mov ah,dl + sahf + seta AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_52e7: ; shi -(A7): + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + and edi,0FFFFFFh + mov ah,dl + sahf + seta AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_52e8: ; shi ($52e8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + and edi,0FFFFFFh + mov ah,dl + sahf + seta AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_52f0: ; shi (-$10,A0,D5.w*2): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_52f0_1 + cwde +OP_52f0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + and edi,0FFFFFFh + mov ah,dl + sahf + seta AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_52f8: ; shi $52f8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + and edi,0FFFFFFh + mov ah,dl + sahf + seta AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_52f9: ; shi $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + and edi,0FFFFFFh + mov ah,dl + sahf + seta AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_53c0: ; sls D0: + add esi,byte 2 + + and ecx,byte 7 + mov ah,dl + sahf + setbe AL + neg byte AL + mov [R_D0+ECX*4],AL + and eax,byte 2 + add eax,byte 4 + sub dword [_m68000_ICount],eax + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_53c8: ; dbls D0, 53c8: + mov ah,dl + sahf + jbe short OP_53c8_2 + and ecx,byte 7 + mov ax,[R_D0+ecx*4] + dec ax + mov [R_D0+ecx*4],ax + inc ax ; Is it -1 + jz short OP_53c8_1 + add esi,byte 2 + + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_53c8_1: +OP_53c8_2: + add esi,byte 4 + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_53d0: ; sls (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + and edi,0FFFFFFh + mov ah,dl + sahf + setbe AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_53d8: ; sls (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + and edi,0FFFFFFh + mov ah,dl + sahf + setbe AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_53df: ; sls (A7)+: + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + and edi,0FFFFFFh + mov ah,dl + sahf + setbe AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_53e0: ; sls -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + mov [R_A0+ECX*4],EDI + and edi,0FFFFFFh + mov ah,dl + sahf + setbe AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_53e7: ; sls -(A7): + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + and edi,0FFFFFFh + mov ah,dl + sahf + setbe AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_53e8: ; sls ($53e8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + and edi,0FFFFFFh + mov ah,dl + sahf + setbe AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_53f0: ; sls ($3456): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_53f0_1 + cwde +OP_53f0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + and edi,0FFFFFFh + mov ah,dl + sahf + setbe AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_53f8: ; sls $53f8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + and edi,0FFFFFFh + mov ah,dl + sahf + setbe AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_53f9: ; sls $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + and edi,0FFFFFFh + mov ah,dl + sahf + setbe AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_54c0: ; scc D0: + add esi,byte 2 + + and ecx,byte 7 + test dl,1 ;Check Carry + setz AL + neg byte AL + mov [R_D0+ECX*4],AL + and eax,byte 2 + add eax,byte 4 + sub dword [_m68000_ICount],eax + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_54c8: ; dbcc D0, 54c8: + test dl,1H ;check carry + jz short OP_54c8_2 + and ecx,byte 7 + mov ax,[R_D0+ecx*4] + dec ax + mov [R_D0+ecx*4],ax + inc ax ; Is it -1 + jz short OP_54c8_1 + add esi,byte 2 + + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_54c8_1: +OP_54c8_2: + add esi,byte 4 + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_54d0: ; scc (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + and edi,0FFFFFFh + test dl,1 ;Check Carry + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_54d8: ; scc (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + and edi,0FFFFFFh + test dl,1 ;Check Carry + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_54df: ; scc (A7)+: + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + and edi,0FFFFFFh + test dl,1 ;Check Carry + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_54e0: ; scc -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + mov [R_A0+ECX*4],EDI + and edi,0FFFFFFh + test dl,1 ;Check Carry + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_54e7: ; scc -(A7): + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + and edi,0FFFFFFh + test dl,1 ;Check Carry + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_54e8: ; scc ($54e8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + and edi,0FFFFFFh + test dl,1 ;Check Carry + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_54f0: ; scc (-$10,A0,D5.w*4): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_54f0_1 + cwde +OP_54f0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + and edi,0FFFFFFh + test dl,1 ;Check Carry + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_54f8: ; scc $54f8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + and edi,0FFFFFFh + test dl,1 ;Check Carry + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_54f9: ; scc $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + and edi,0FFFFFFh + test dl,1 ;Check Carry + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_55c0: ; scs D0: + add esi,byte 2 + + and ecx,byte 7 + test dl,1 ;Check Carry + setnz AL + neg byte AL + mov [R_D0+ECX*4],AL + and eax,byte 2 + add eax,byte 4 + sub dword [_m68000_ICount],eax + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_55c8: ; dbcs D0, 55c8: + test dl,1H ;check carry + jnz short OP_55c8_2 + and ecx,byte 7 + mov ax,[R_D0+ecx*4] + dec ax + mov [R_D0+ecx*4],ax + inc ax ; Is it -1 + jz short OP_55c8_1 + add esi,byte 2 + + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_55c8_1: +OP_55c8_2: + add esi,byte 4 + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_55d0: ; scs (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + and edi,0FFFFFFh + test dl,1 ;Check Carry + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_55d8: ; scs (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + and edi,0FFFFFFh + test dl,1 ;Check Carry + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_55df: ; scs (A7)+: + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + and edi,0FFFFFFh + test dl,1 ;Check Carry + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_55e0: ; scs -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + mov [R_A0+ECX*4],EDI + and edi,0FFFFFFh + test dl,1 ;Check Carry + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_55e7: ; scs -(A7): + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + and edi,0FFFFFFh + test dl,1 ;Check Carry + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_55e8: ; scs ($55e8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + and edi,0FFFFFFh + test dl,1 ;Check Carry + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_55f0: ; scs ($3456): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_55f0_1 + cwde +OP_55f0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + and edi,0FFFFFFh + test dl,1 ;Check Carry + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_55f8: ; scs $55f8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + and edi,0FFFFFFh + test dl,1 ;Check Carry + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_55f9: ; scs $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + and edi,0FFFFFFh + test dl,1 ;Check Carry + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_56c0: ; sne D0: + add esi,byte 2 + + and ecx,byte 7 + test dl,40H ;Check Zero + setz AL + neg byte AL + mov [R_D0+ECX*4],AL + and eax,byte 2 + add eax,byte 4 + sub dword [_m68000_ICount],eax + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_56c8: ; dbne D0, 56c8: + test dl,40H ;Check zero + jz short OP_56c8_2 + and ecx,byte 7 + mov ax,[R_D0+ecx*4] + dec ax + mov [R_D0+ecx*4],ax + inc ax ; Is it -1 + jz short OP_56c8_1 + add esi,byte 2 + + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_56c8_1: +OP_56c8_2: + add esi,byte 4 + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_56d0: ; sne (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + and edi,0FFFFFFh + test dl,40H ;Check Zero + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_56d8: ; sne (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + and edi,0FFFFFFh + test dl,40H ;Check Zero + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_56df: ; sne (A7)+: + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + and edi,0FFFFFFh + test dl,40H ;Check Zero + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_56e0: ; sne -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + mov [R_A0+ECX*4],EDI + and edi,0FFFFFFh + test dl,40H ;Check Zero + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_56e7: ; sne -(A7): + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + and edi,0FFFFFFh + test dl,40H ;Check Zero + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_56e8: ; sne ($56e8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + and edi,0FFFFFFh + test dl,40H ;Check Zero + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_56f0: ; sne (-$10,A0,D5.w*8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_56f0_1 + cwde +OP_56f0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + and edi,0FFFFFFh + test dl,40H ;Check Zero + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_56f8: ; sne $56f8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + and edi,0FFFFFFh + test dl,40H ;Check Zero + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_56f9: ; sne $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + and edi,0FFFFFFh + test dl,40H ;Check Zero + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_57c0: ; seq D0: + add esi,byte 2 + + and ecx,byte 7 + test dl,40H ;Check Zero + setnz AL + neg byte AL + mov [R_D0+ECX*4],AL + and eax,byte 2 + add eax,byte 4 + sub dword [_m68000_ICount],eax + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_57c8: ; dbeq D0, 57c8: + test dl,40H ;Check zero + jnz short OP_57c8_2 + and ecx,byte 7 + mov ax,[R_D0+ecx*4] + dec ax + mov [R_D0+ecx*4],ax + inc ax ; Is it -1 + jz short OP_57c8_1 + add esi,byte 2 + + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_57c8_1: +OP_57c8_2: + add esi,byte 4 + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_57d0: ; seq (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + and edi,0FFFFFFh + test dl,40H ;Check Zero + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_57d8: ; seq (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + and edi,0FFFFFFh + test dl,40H ;Check Zero + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_57df: ; seq (A7)+: + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + and edi,0FFFFFFh + test dl,40H ;Check Zero + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_57e0: ; seq -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + mov [R_A0+ECX*4],EDI + and edi,0FFFFFFh + test dl,40H ;Check Zero + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_57e7: ; seq -(A7): + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + and edi,0FFFFFFh + test dl,40H ;Check Zero + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_57e8: ; seq ($57e8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + and edi,0FFFFFFh + test dl,40H ;Check Zero + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_57f0: ; seq ($3456): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_57f0_1 + cwde +OP_57f0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + and edi,0FFFFFFh + test dl,40H ;Check Zero + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_57f8: ; seq $57f8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + and edi,0FFFFFFh + test dl,40H ;Check Zero + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_57f9: ; seq $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + and edi,0FFFFFFh + test dl,40H ;Check Zero + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_58c0: ; svc D0: + add esi,byte 2 + + and ecx,byte 7 + test dh,8H ;Check Overflow + setz AL + neg byte AL + mov [R_D0+ECX*4],AL + and eax,byte 2 + add eax,byte 4 + sub dword [_m68000_ICount],eax + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_58c8: ; dbvc D0, 58c8: + test dh,8H ;Check Overflow + jz short OP_58c8_2 + and ecx,byte 7 + mov ax,[R_D0+ecx*4] + dec ax + mov [R_D0+ecx*4],ax + inc ax ; Is it -1 + jz short OP_58c8_1 + add esi,byte 2 + + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_58c8_1: +OP_58c8_2: + add esi,byte 4 + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_58d0: ; svc (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + and edi,0FFFFFFh + test dh,8H ;Check Overflow + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_58d8: ; svc (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + and edi,0FFFFFFh + test dh,8H ;Check Overflow + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_58df: ; svc (A7)+: + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + and edi,0FFFFFFh + test dh,8H ;Check Overflow + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_58e0: ; svc -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + mov [R_A0+ECX*4],EDI + and edi,0FFFFFFh + test dh,8H ;Check Overflow + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_58e7: ; svc -(A7): + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + and edi,0FFFFFFh + test dh,8H ;Check Overflow + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_58e8: ; svc ($58e8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + and edi,0FFFFFFh + test dh,8H ;Check Overflow + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_58f0: ; svc (-$10,A0,D5.l): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_58f0_1 + cwde +OP_58f0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + and edi,0FFFFFFh + test dh,8H ;Check Overflow + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_58f8: ; svc $58f8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + and edi,0FFFFFFh + test dh,8H ;Check Overflow + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_58f9: ; svc $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + and edi,0FFFFFFh + test dh,8H ;Check Overflow + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_59c0: ; svs D0: + add esi,byte 2 + + and ecx,byte 7 + test dh,8H ;Check Overflow + setnz AL + neg byte AL + mov [R_D0+ECX*4],AL + and eax,byte 2 + add eax,byte 4 + sub dword [_m68000_ICount],eax + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_59c8: ; dbvs D0, 59c8: + test dh,8H ;Check Overflow + jnz short OP_59c8_2 + and ecx,byte 7 + mov ax,[R_D0+ecx*4] + dec ax + mov [R_D0+ecx*4],ax + inc ax ; Is it -1 + jz short OP_59c8_1 + add esi,byte 2 + + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_59c8_1: +OP_59c8_2: + add esi,byte 4 + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_59d0: ; svs (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + and edi,0FFFFFFh + test dh,8H ;Check Overflow + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_59d8: ; svs (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + and edi,0FFFFFFh + test dh,8H ;Check Overflow + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_59df: ; svs (A7)+: + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + and edi,0FFFFFFh + test dh,8H ;Check Overflow + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_59e0: ; svs -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + mov [R_A0+ECX*4],EDI + and edi,0FFFFFFh + test dh,8H ;Check Overflow + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_59e7: ; svs -(A7): + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + and edi,0FFFFFFh + test dh,8H ;Check Overflow + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_59e8: ; svs ($59e8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + and edi,0FFFFFFh + test dh,8H ;Check Overflow + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_59f0: ; svs ($3456): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_59f0_1 + cwde +OP_59f0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + and edi,0FFFFFFh + test dh,8H ;Check Overflow + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_59f8: ; svs $59f8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + and edi,0FFFFFFh + test dh,8H ;Check Overflow + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_59f9: ; svs $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + and edi,0FFFFFFh + test dh,8H ;Check Overflow + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5ac0: ; spl D0: + add esi,byte 2 + + and ecx,byte 7 + test dl,80H ;Check Sign + setz AL + neg byte AL + mov [R_D0+ECX*4],AL + and eax,byte 2 + add eax,byte 4 + sub dword [_m68000_ICount],eax + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5ac8: ; dbpl D0, 5ac8: + test dl,80H ;Check Sign + jz short OP_5ac8_2 + and ecx,byte 7 + mov ax,[R_D0+ecx*4] + dec ax + mov [R_D0+ecx*4],ax + inc ax ; Is it -1 + jz short OP_5ac8_1 + add esi,byte 2 + + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_5ac8_1: +OP_5ac8_2: + add esi,byte 4 + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5ad0: ; spl (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + and edi,0FFFFFFh + test dl,80H ;Check Sign + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5ad8: ; spl (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + and edi,0FFFFFFh + test dl,80H ;Check Sign + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5adf: ; spl (A7)+: + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + and edi,0FFFFFFh + test dl,80H ;Check Sign + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5ae0: ; spl -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + mov [R_A0+ECX*4],EDI + and edi,0FFFFFFh + test dl,80H ;Check Sign + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5ae7: ; spl -(A7): + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + and edi,0FFFFFFh + test dl,80H ;Check Sign + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5ae8: ; spl ($5ae8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + and edi,0FFFFFFh + test dl,80H ;Check Sign + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5af0: ; spl (-$10,A0,D5.l*2): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_5af0_1 + cwde +OP_5af0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + and edi,0FFFFFFh + test dl,80H ;Check Sign + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5af8: ; spl $5af8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + and edi,0FFFFFFh + test dl,80H ;Check Sign + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5af9: ; spl $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + and edi,0FFFFFFh + test dl,80H ;Check Sign + setz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5bc0: ; smi D0: + add esi,byte 2 + + and ecx,byte 7 + test dl,80H ;Check Sign + setnz AL + neg byte AL + mov [R_D0+ECX*4],AL + and eax,byte 2 + add eax,byte 4 + sub dword [_m68000_ICount],eax + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5bc8: ; dbmi D0, 5bc8: + test dl,80H ;Check Sign + jnz short OP_5bc8_2 + and ecx,byte 7 + mov ax,[R_D0+ecx*4] + dec ax + mov [R_D0+ecx*4],ax + inc ax ; Is it -1 + jz short OP_5bc8_1 + add esi,byte 2 + + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_5bc8_1: +OP_5bc8_2: + add esi,byte 4 + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5bd0: ; smi (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + and edi,0FFFFFFh + test dl,80H ;Check Sign + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5bd8: ; smi (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + and edi,0FFFFFFh + test dl,80H ;Check Sign + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5bdf: ; smi (A7)+: + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + and edi,0FFFFFFh + test dl,80H ;Check Sign + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5be0: ; smi -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + mov [R_A0+ECX*4],EDI + and edi,0FFFFFFh + test dl,80H ;Check Sign + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5be7: ; smi -(A7): + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + and edi,0FFFFFFh + test dl,80H ;Check Sign + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5be8: ; smi ($5be8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + and edi,0FFFFFFh + test dl,80H ;Check Sign + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5bf0: ; smi ($3456): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_5bf0_1 + cwde +OP_5bf0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + and edi,0FFFFFFh + test dl,80H ;Check Sign + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5bf8: ; smi $5bf8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + and edi,0FFFFFFh + test dl,80H ;Check Sign + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5bf9: ; smi $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + and edi,0FFFFFFh + test dl,80H ;Check Sign + setnz AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5cc0: ; sge D0: + add esi,byte 2 + + and ecx,byte 7 + or edx,200h + push edx + popf + setge AL + neg byte AL + mov [R_D0+ECX*4],AL + and eax,byte 2 + add eax,byte 4 + sub dword [_m68000_ICount],eax + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5cc8: ; dbge D0, 5cc8: + or edx,200h + push edx + popf + jge short OP_5cc8_2 + and ecx,byte 7 + mov ax,[R_D0+ecx*4] + dec ax + mov [R_D0+ecx*4],ax + inc ax ; Is it -1 + jz short OP_5cc8_1 + add esi,byte 2 + + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_5cc8_1: +OP_5cc8_2: + add esi,byte 4 + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5cd0: ; sge (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + and edi,0FFFFFFh + or edx,200h + push edx + popf + setge AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5cd8: ; sge (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + and edi,0FFFFFFh + or edx,200h + push edx + popf + setge AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5cdf: ; sge (A7)+: + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + and edi,0FFFFFFh + or edx,200h + push edx + popf + setge AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5ce0: ; sge -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + mov [R_A0+ECX*4],EDI + and edi,0FFFFFFh + or edx,200h + push edx + popf + setge AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5ce7: ; sge -(A7): + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + and edi,0FFFFFFh + or edx,200h + push edx + popf + setge AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5ce8: ; sge ($5ce8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + and edi,0FFFFFFh + or edx,200h + push edx + popf + setge AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5cf0: ; sge (-$10,A0,D5.l*4): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_5cf0_1 + cwde +OP_5cf0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + and edi,0FFFFFFh + or edx,200h + push edx + popf + setge AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5cf8: ; sge $5cf8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + and edi,0FFFFFFh + or edx,200h + push edx + popf + setge AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5cf9: ; sge $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + and edi,0FFFFFFh + or edx,200h + push edx + popf + setge AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5dc0: ; slt D0: + add esi,byte 2 + + and ecx,byte 7 + or edx,200h + push edx + popf + setl AL + neg byte AL + mov [R_D0+ECX*4],AL + and eax,byte 2 + add eax,byte 4 + sub dword [_m68000_ICount],eax + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5dc8: ; dblt D0, 5dc8: + or edx,200h + push edx + popf + jl short OP_5dc8_2 + and ecx,byte 7 + mov ax,[R_D0+ecx*4] + dec ax + mov [R_D0+ecx*4],ax + inc ax ; Is it -1 + jz short OP_5dc8_1 + add esi,byte 2 + + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_5dc8_1: +OP_5dc8_2: + add esi,byte 4 + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5dd0: ; slt (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + and edi,0FFFFFFh + or edx,200h + push edx + popf + setl AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5dd8: ; slt (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + and edi,0FFFFFFh + or edx,200h + push edx + popf + setl AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5ddf: ; slt (A7)+: + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + and edi,0FFFFFFh + or edx,200h + push edx + popf + setl AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5de0: ; slt -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + mov [R_A0+ECX*4],EDI + and edi,0FFFFFFh + or edx,200h + push edx + popf + setl AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5de7: ; slt -(A7): + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + and edi,0FFFFFFh + or edx,200h + push edx + popf + setl AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5de8: ; slt ($5de8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + and edi,0FFFFFFh + or edx,200h + push edx + popf + setl AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5df0: ; slt ($3456): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_5df0_1 + cwde +OP_5df0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + and edi,0FFFFFFh + or edx,200h + push edx + popf + setl AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5df8: ; slt $5df8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + and edi,0FFFFFFh + or edx,200h + push edx + popf + setl AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5df9: ; slt $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + and edi,0FFFFFFh + or edx,200h + push edx + popf + setl AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5ec0: ; sgt D0: + add esi,byte 2 + + and ecx,byte 7 + or edx,200h + push edx + popf + setg AL + neg byte AL + mov [R_D0+ECX*4],AL + and eax,byte 2 + add eax,byte 4 + sub dword [_m68000_ICount],eax + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5ec8: ; dbgt D0, 5ec8: + or edx,200h + push edx + popf + jg short OP_5ec8_2 + and ecx,byte 7 + mov ax,[R_D0+ecx*4] + dec ax + mov [R_D0+ecx*4],ax + inc ax ; Is it -1 + jz short OP_5ec8_1 + add esi,byte 2 + + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_5ec8_1: +OP_5ec8_2: + add esi,byte 4 + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5ed0: ; sgt (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + and edi,0FFFFFFh + or edx,200h + push edx + popf + setg AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5ed8: ; sgt (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + and edi,0FFFFFFh + or edx,200h + push edx + popf + setg AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5edf: ; sgt (A7)+: + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + and edi,0FFFFFFh + or edx,200h + push edx + popf + setg AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5ee0: ; sgt -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + mov [R_A0+ECX*4],EDI + and edi,0FFFFFFh + or edx,200h + push edx + popf + setg AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5ee7: ; sgt -(A7): + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + and edi,0FFFFFFh + or edx,200h + push edx + popf + setg AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5ee8: ; sgt ($5ee8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + and edi,0FFFFFFh + or edx,200h + push edx + popf + setg AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5ef0: ; sgt (-$10,A0,D5.l*8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_5ef0_1 + cwde +OP_5ef0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + and edi,0FFFFFFh + or edx,200h + push edx + popf + setg AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5ef8: ; sgt $5ef8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + and edi,0FFFFFFh + or edx,200h + push edx + popf + setg AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5ef9: ; sgt $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + and edi,0FFFFFFh + or edx,200h + push edx + popf + setg AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5fc0: ; sle D0: + add esi,byte 2 + + and ecx,byte 7 + or edx,200h + push edx + popf + setle AL + neg byte AL + mov [R_D0+ECX*4],AL + and eax,byte 2 + add eax,byte 4 + sub dword [_m68000_ICount],eax + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5fc8: ; dble D0, 5fc8: + or edx,200h + push edx + popf + jle short OP_5fc8_2 + and ecx,byte 7 + mov ax,[R_D0+ecx*4] + dec ax + mov [R_D0+ecx*4],ax + inc ax ; Is it -1 + jz short OP_5fc8_1 + add esi,byte 2 + + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_5fc8_1: +OP_5fc8_2: + add esi,byte 4 + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5fd0: ; sle (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + and edi,0FFFFFFh + or edx,200h + push edx + popf + setle AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5fd8: ; sle (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + and edi,0FFFFFFh + or edx,200h + push edx + popf + setle AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5fdf: ; sle (A7)+: + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + and edi,0FFFFFFh + or edx,200h + push edx + popf + setle AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5fe0: ; sle -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + mov [R_A0+ECX*4],EDI + and edi,0FFFFFFh + or edx,200h + push edx + popf + setle AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5fe7: ; sle -(A7): + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + and edi,0FFFFFFh + or edx,200h + push edx + popf + setle AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5fe8: ; sle ($5fe8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + and edi,0FFFFFFh + or edx,200h + push edx + popf + setle AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5ff0: ; sle ($3456): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_5ff0_1 + cwde +OP_5ff0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + and edi,0FFFFFFh + or edx,200h + push edx + popf + setle AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5ff8: ; sle $5ff8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + and edi,0FFFFFFh + or edx,200h + push edx + popf + setle AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_5ff9: ; sle $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + and edi,0FFFFFFh + or edx,200h + push edx + popf + setle AL + neg byte AL + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6000: ; bra 6000: + add esi,byte 2 + + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6001: ; bra 1: + add esi,byte 2 + + movsx eax,cl ; Sign Extend displacement + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_60ff: ; bra 123456; (2+): + test byte [CPU_TYPE], 3 ; CPU Check + jz OP_6001 ; 030/040? + + add esi,byte 2 + + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6100: ; bsr 6100: + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + mov eax,esi ; Get PC + sub edi,byte 4 ; Decrement A7 + add eax,byte 2 ; Skip Displacement + mov [R_A7],edi + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + mov EDX,[R_CCR] + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6101: ; bsr 1: + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + sub edi,byte 4 ; Decrement + mov [R_A7],edi + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov edx,ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + movsx eax,cl ; Sign Extend displacement + add esi,eax + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_61ff: ; bsr 123456; (2+): + test byte [CPU_TYPE], 3 ; CPU Check + jz OP_6101 ; 030/040? + + add esi,byte 2 + + mov edi,[R_A7] ; Get A7 + mov eax,esi ; Get PC + sub edi,byte 4 ; Decrement A7 + add eax,byte 2 ; Skip Displacement + mov [R_A7],edi + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + mov EDX,[R_CCR] + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,eax + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6200: ; bhi 6200: + add esi,byte 2 + + mov ah,dl + sahf + ja short OP_6200_1 + add esi,byte 2 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6200_1: + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6201: ; bhi 1: + add esi,byte 2 + + mov ah,dl + sahf + ja short OP_6201_1 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6201_1: + movsx eax,cl ; Sign Extend displacement + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_62ff: ; bhi 123456; (2+): + test byte [CPU_TYPE], 3 ; CPU Check + jz OP_6201 ; 030/040? + + add esi,byte 2 + + mov ah,dl + sahf + ja short OP_62ff_1 + add esi,byte 4 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_62ff_1: + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6300: ; bls 6300: + add esi,byte 2 + + mov ah,dl + sahf + jbe short OP_6300_1 + add esi,byte 2 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6300_1: + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6301: ; bls 1: + add esi,byte 2 + + mov ah,dl + sahf + jbe short OP_6301_1 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6301_1: + movsx eax,cl ; Sign Extend displacement + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_63ff: ; bls 123456; (2+): + test byte [CPU_TYPE], 3 ; CPU Check + jz OP_6301 ; 030/040? + + add esi,byte 2 + + mov ah,dl + sahf + jbe short OP_63ff_1 + add esi,byte 4 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_63ff_1: + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6400: ; bcc 6400: + add esi,byte 2 + + test dl,1H ;check carry + jz short OP_6400_1 + add esi,byte 2 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6400_1: + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6401: ; bcc 1: + add esi,byte 2 + + test dl,1H ;check carry + jz short OP_6401_1 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6401_1: + movsx eax,cl ; Sign Extend displacement + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_64ff: ; bcc 123456; (2+): + test byte [CPU_TYPE], 3 ; CPU Check + jz OP_6401 ; 030/040? + + add esi,byte 2 + + test dl,1H ;check carry + jz short OP_64ff_1 + add esi,byte 4 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_64ff_1: + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6500: ; bcs 6500: + add esi,byte 2 + + test dl,1H ;check carry + jnz short OP_6500_1 + add esi,byte 2 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6500_1: + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6501: ; bcs 1: + add esi,byte 2 + + test dl,1H ;check carry + jnz short OP_6501_1 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6501_1: + movsx eax,cl ; Sign Extend displacement + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_65ff: ; bcs 123456; (2+): + test byte [CPU_TYPE], 3 ; CPU Check + jz OP_6501 ; 030/040? + + add esi,byte 2 + + test dl,1H ;check carry + jnz short OP_65ff_1 + add esi,byte 4 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_65ff_1: + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6600: ; bne 6600: + add esi,byte 2 + + test dl,40H ;Check zero + jz short OP_6600_1 + add esi,byte 2 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6600_1: + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6601: ; bne 1: + add esi,byte 2 + + test dl,40H ;Check zero + jz short OP_6601_1 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6601_1: + movsx eax,cl ; Sign Extend displacement + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_66ff: ; bne 123456; (2+): + test byte [CPU_TYPE], 3 ; CPU Check + jz OP_6601 ; 030/040? + + add esi,byte 2 + + test dl,40H ;Check zero + jz short OP_66ff_1 + add esi,byte 4 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_66ff_1: + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6700: ; beq 6700: + add esi,byte 2 + + test dl,40H ;Check zero + jnz short OP_6700_1 + add esi,byte 2 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6700_1: + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6701: ; beq 1: + add esi,byte 2 + + test dl,40H ;Check zero + jnz short OP_6701_1 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6701_1: + movsx eax,cl ; Sign Extend displacement + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_67ff: ; beq 123456; (2+): + test byte [CPU_TYPE], 3 ; CPU Check + jz OP_6701 ; 030/040? + + add esi,byte 2 + + test dl,40H ;Check zero + jnz short OP_67ff_1 + add esi,byte 4 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_67ff_1: + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6800: ; bvc 6800: + add esi,byte 2 + + test dh,8H ;Check Overflow + jz short OP_6800_1 + add esi,byte 2 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6800_1: + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6801: ; bvc 1: + add esi,byte 2 + + test dh,8H ;Check Overflow + jz short OP_6801_1 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6801_1: + movsx eax,cl ; Sign Extend displacement + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_68ff: ; bvc 123456; (2+): + test byte [CPU_TYPE], 3 ; CPU Check + jz OP_6801 ; 030/040? + + add esi,byte 2 + + test dh,8H ;Check Overflow + jz short OP_68ff_1 + add esi,byte 4 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_68ff_1: + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6900: ; bvs 6900: + add esi,byte 2 + + test dh,8H ;Check Overflow + jnz short OP_6900_1 + add esi,byte 2 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6900_1: + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6901: ; bvs 1: + add esi,byte 2 + + test dh,8H ;Check Overflow + jnz short OP_6901_1 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6901_1: + movsx eax,cl ; Sign Extend displacement + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_69ff: ; bvs 123456; (2+): + test byte [CPU_TYPE], 3 ; CPU Check + jz OP_6901 ; 030/040? + + add esi,byte 2 + + test dh,8H ;Check Overflow + jnz short OP_69ff_1 + add esi,byte 4 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_69ff_1: + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6a00: ; bpl 6a00: + add esi,byte 2 + + test dl,80H ;Check Sign + jz short OP_6a00_1 + add esi,byte 2 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6a00_1: + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6a01: ; bpl 1: + add esi,byte 2 + + test dl,80H ;Check Sign + jz short OP_6a01_1 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6a01_1: + movsx eax,cl ; Sign Extend displacement + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6aff: ; bpl 123456; (2+): + test byte [CPU_TYPE], 3 ; CPU Check + jz OP_6a01 ; 030/040? + + add esi,byte 2 + + test dl,80H ;Check Sign + jz short OP_6aff_1 + add esi,byte 4 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6aff_1: + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6b00: ; bmi 6b00: + add esi,byte 2 + + test dl,80H ;Check Sign + jnz short OP_6b00_1 + add esi,byte 2 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6b00_1: + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6b01: ; bmi 1: + add esi,byte 2 + + test dl,80H ;Check Sign + jnz short OP_6b01_1 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6b01_1: + movsx eax,cl ; Sign Extend displacement + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6bff: ; bmi 123456; (2+): + test byte [CPU_TYPE], 3 ; CPU Check + jz OP_6b01 ; 030/040? + + add esi,byte 2 + + test dl,80H ;Check Sign + jnz short OP_6bff_1 + add esi,byte 4 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6bff_1: + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6c00: ; bge 6c00: + add esi,byte 2 + + or edx,200h + push edx + popf + jge short OP_6c00_1 + add esi,byte 2 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6c00_1: + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6c01: ; bge 1: + add esi,byte 2 + + or edx,200h + push edx + popf + jge short OP_6c01_1 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6c01_1: + movsx eax,cl ; Sign Extend displacement + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6cff: ; bge 123456; (2+): + test byte [CPU_TYPE], 3 ; CPU Check + jz OP_6c01 ; 030/040? + + add esi,byte 2 + + or edx,200h + push edx + popf + jge short OP_6cff_1 + add esi,byte 4 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6cff_1: + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6d00: ; blt 6d00: + add esi,byte 2 + + or edx,200h + push edx + popf + jl short OP_6d00_1 + add esi,byte 2 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6d00_1: + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6d01: ; blt 1: + add esi,byte 2 + + or edx,200h + push edx + popf + jl short OP_6d01_1 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6d01_1: + movsx eax,cl ; Sign Extend displacement + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6dff: ; blt 123456; (2+): + test byte [CPU_TYPE], 3 ; CPU Check + jz OP_6d01 ; 030/040? + + add esi,byte 2 + + or edx,200h + push edx + popf + jl short OP_6dff_1 + add esi,byte 4 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6dff_1: + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6e00: ; bgt 6e00: + add esi,byte 2 + + or edx,200h + push edx + popf + jg short OP_6e00_1 + add esi,byte 2 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6e00_1: + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6e01: ; bgt 1: + add esi,byte 2 + + or edx,200h + push edx + popf + jg short OP_6e01_1 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6e01_1: + movsx eax,cl ; Sign Extend displacement + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6eff: ; bgt 123456; (2+): + test byte [CPU_TYPE], 3 ; CPU Check + jz OP_6e01 ; 030/040? + + add esi,byte 2 + + or edx,200h + push edx + popf + jg short OP_6eff_1 + add esi,byte 4 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6eff_1: + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6f00: ; ble 6f00: + add esi,byte 2 + + or edx,200h + push edx + popf + jle short OP_6f00_1 + add esi,byte 2 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6f00_1: + movsx EAX,word [esi+ebp] + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6f01: ; ble 1: + add esi,byte 2 + + or edx,200h + push edx + popf + jle short OP_6f01_1 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6f01_1: + movsx eax,cl ; Sign Extend displacement + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6fff: ; ble 123456; (2+): + test byte [CPU_TYPE], 3 ; CPU Check + jz OP_6f01 ; 030/040? + + add esi,byte 2 + + or edx,200h + push edx + popf + jle short OP_6fff_1 + add esi,byte 4 + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_6fff_1: + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,eax + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_7000: ; moveq #$0, D0: + add esi,byte 2 + + movsx eax,cl + shr ecx,9 + and ecx,byte 7 + test EAX,EAX + pushfd + pop EDX + mov [R_D0+ECX*4],EAX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8100: ; sbcd D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EBX,[R_D0+EBX*4] + mov EAX,[R_D0+ECX*4] + bt dword [R_XC],0 + sbb al,bl + das + mov ebx,edx + setc dl + jnz short OP_8100_1 + + and bl,40h ; Mask out Old Z + or dl,bl ; Copy across + +OP_8100_1: + mov bl,dl + and bl,1 + shl bl,7 + and dl,7Fh + or dl,bl + mov [R_XC],edx + mov [R_D0+ECX*4],AL + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8108: ; sbcd -(A0), -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EDI,[R_A0+EBX*4] + cmp ebx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_8108_notA7_1 ; + dec EDI +OP_8108_notA7_1: ; + dec EDI + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EBX,EAX + mov EDI,[R_A0+ECX*4] + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_8108_notA7_2 ; + dec EDI +OP_8108_notA7_2: ; + dec EDI + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + bt dword [R_XC],0 + sbb al,bl + das + mov ebx,edx + setc dl + jnz short OP_8108_1 + + and bl,40h ; Mask out Old Z + or dl,bl ; Copy across + +OP_8108_1: + mov bl,dl + and bl,1 + shl bl,7 + and dl,7Fh + or dl,bl + mov [R_XC],edx + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c100: ; abcd D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EBX,[R_D0+EBX*4] + mov EAX,[R_D0+ECX*4] + bt dword [R_XC],0 + adc al,bl + daa + mov ebx,edx + setc dl + jnz short OP_c100_1 + + and bl,40h ; Mask out Old Z + or dl,bl ; Copy across + +OP_c100_1: + mov bl,dl + and bl,1 + shl bl,7 + and dl,7Fh + or dl,bl + mov [R_XC],edx + mov [R_D0+ECX*4],AL + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c108: ; abcd -(A0), -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EDI,[R_A0+EBX*4] + dec EDI + cmp ebx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_c108_notA7_1 ; + dec EDI +OP_c108_notA7_1: ; + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EBX,EAX + mov EDI,[R_A0+ECX*4] + dec EDI + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_c108_notA7_2 ; + dec EDI +OP_c108_notA7_2: ; + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + bt dword [R_XC],0 + adc al,bl + daa + mov ebx,edx + setc dl + jnz short OP_c108_1 + + and bl,40h ; Mask out Old Z + or dl,bl ; Copy across + +OP_c108_1: + mov bl,dl + and bl,1 + shl bl,7 + and dl,7Fh + or dl,bl + mov [R_XC],edx + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8000: ; or.b D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,[R_D0+EBX*4] + or [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8010: ; or.b (A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8018: ; or.b (A0)+, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + inc dword [R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_801f: ; or.b (A7)+, D0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8020: ; or.b -(A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + dec EDI + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8027: ; or.b -(A7), D0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8028: ; or.b (-$7fd8,A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8030: ; or.b ($30,A0,A0.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_8030_1 + cwde +OP_8030_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8038: ; or.b $8038.w, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8039: ; or.b $123456.l, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_803a: ; or.b (-$7fc6,PC), D0; ($ffff8038): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_803b: ; or.b ($3b,PC,A0.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_803b_1 + cwde +OP_803b_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_803c: ; or.b #$0, D0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,dword [esi+ebp] + add esi,byte 2 + or [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8040: ; or.w D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,[R_D0+EBX*4] + or [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8050: ; or.w (A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8058: ; or.w (A0)+, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8060: ; or.w -(A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 2 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8068: ; or.w (-$7f98,A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8070: ; or.w ($70,A0,A0.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_8070_1 + cwde +OP_8070_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8078: ; or.w $8078.w, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8079: ; or.w $123456.l, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_807a: ; or.w (-$7f86,PC), D0; ($ffff8078): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_807b: ; or.w ($7b,PC,A0.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_807b_1 + cwde +OP_807b_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_807c: ; or.w #$807c, D0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,dword [esi+ebp] + add esi,byte 2 + or [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8080: ; or.l D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,[R_D0+EBX*4] + or [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8090: ; or.l (A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8098: ; or.l (A0)+, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80a0: ; or.l -(A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 4 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80a8: ; or.l (-$7f58,A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80b0: ; or.l (-$50,A0,A0.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_80b0_1 + cwde +OP_80b0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80b8: ; or.l $80b8.w, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80b9: ; or.l $123456.l, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80ba: ; or.l (-$7f46,PC), D0; ($ffff80b8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80bb: ; or.l (-$45,PC,A0.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_80bb_1 + cwde +OP_80bb_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80bc: ; or.l #$123456, D0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,byte 4 + or [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8110: ; or.b D0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8118: ; or.b D0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + inc dword [R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_811f: ; or.b D0, (A7)+: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8120: ; or.b D0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + dec EDI + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8127: ; or.b D0, -(A7): + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8128: ; or.b D0, (-$7ed8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8130: ; or.b D0, ($3456,A0,A0.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_8130_1 + cwde +OP_8130_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8138: ; or.b D0, $8138.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8139: ; or.b D0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8150: ; or.w D0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8158: ; or.w D0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8160: ; or.w D0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 2 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8168: ; or.w D0, (-$7e98,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8170: ; or.w D0, ($3456,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_8170_1 + cwde +OP_8170_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8178: ; or.w D0, $8178.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8179: ; or.w D0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8190: ; or.l D0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_8198: ; or.l D0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81a0: ; or.l D0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 4 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81a8: ; or.l D0, (-$7e58,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81b0: ; or.l D0, ($3456,A0.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_81b0_1 + cwde +OP_81b0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 26 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81b8: ; or.l D0, $81b8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81b9: ; or.l D0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + or EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9000: ; sub.b D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,[R_D0+EBX*4] + sub [R_D0+ECX*4],AL + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9010: ; sub.b (A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub [R_D0+ECX*4],AL + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9018: ; sub.b (A0)+, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + inc dword [R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub [R_D0+ECX*4],AL + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_901f: ; sub.b (A7)+, D0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub [R_D0+ECX*4],AL + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9020: ; sub.b -(A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + dec EDI + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub [R_D0+ECX*4],AL + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9027: ; sub.b -(A7), D0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub [R_D0+ECX*4],AL + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9028: ; sub.b (-$6fd8,A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub [R_D0+ECX*4],AL + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9030: ; sub.b ($30,A0,A1.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_9030_1 + cwde +OP_9030_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub [R_D0+ECX*4],AL + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9038: ; sub.b $9038.w, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub [R_D0+ECX*4],AL + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9039: ; sub.b $123456.l, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub [R_D0+ECX*4],AL + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_903a: ; sub.b (-$6fc6,PC), D0; ($ffff9038): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub [R_D0+ECX*4],AL + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_903b: ; sub.b ($3b,PC,A1.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_903b_1 + cwde +OP_903b_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub [R_D0+ECX*4],AL + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_903c: ; sub.b #$0, D0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,dword [esi+ebp] + add esi,byte 2 + sub [R_D0+ECX*4],AL + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9040: ; sub.w D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,[R_D0+EBX*4] + sub [R_D0+ECX*4],AX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9050: ; sub.w (A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub [R_D0+ECX*4],AX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9058: ; sub.w (A0)+, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub [R_D0+ECX*4],AX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9060: ; sub.w -(A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 2 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub [R_D0+ECX*4],AX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9068: ; sub.w (-$6f98,A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub [R_D0+ECX*4],AX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9070: ; sub.w ($70,A0,A1.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_9070_1 + cwde +OP_9070_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub [R_D0+ECX*4],AX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9078: ; sub.w $9078.w, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub [R_D0+ECX*4],AX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9079: ; sub.w $123456.l, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub [R_D0+ECX*4],AX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_907a: ; sub.w (-$6f86,PC), D0; ($ffff9078): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub [R_D0+ECX*4],AX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_907b: ; sub.w ($7b,PC,A1.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_907b_1 + cwde +OP_907b_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub [R_D0+ECX*4],AX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_907c: ; sub.w #$907c, D0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,dword [esi+ebp] + add esi,byte 2 + sub [R_D0+ECX*4],AX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9080: ; sub.l D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,[R_D0+EBX*4] + sub [R_D0+ECX*4],EAX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9090: ; sub.l (A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub [R_D0+ECX*4],EAX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9098: ; sub.l (A0)+, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub [R_D0+ECX*4],EAX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_90a0: ; sub.l -(A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 4 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub [R_D0+ECX*4],EAX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_90a8: ; sub.l (-$6f58,A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub [R_D0+ECX*4],EAX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_90b0: ; sub.l (-$50,A0,A1.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_90b0_1 + cwde +OP_90b0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub [R_D0+ECX*4],EAX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_90b8: ; sub.l $90b8.w, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub [R_D0+ECX*4],EAX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_90b9: ; sub.l $123456.l, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub [R_D0+ECX*4],EAX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_90ba: ; sub.l (-$6f46,PC), D0; ($ffff90b8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub [R_D0+ECX*4],EAX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_90bb: ; sub.l (-$45,PC,A1.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_90bb_1 + cwde +OP_90bb_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub [R_D0+ECX*4],EAX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_90bc: ; sub.l #$123456, D0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,byte 4 + sub [R_D0+ECX*4],EAX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9110: ; sub.b D0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9118: ; sub.b D0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + inc dword [R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_911f: ; sub.b D0, (A7)+: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9120: ; sub.b D0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + dec EDI + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9127: ; sub.b D0, -(A7): + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9128: ; sub.b D0, (-$6ed8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9130: ; sub.b D0, ($3456,A0,A1.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_9130_1 + cwde +OP_9130_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9138: ; sub.b D0, $9138.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9139: ; sub.b D0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9150: ; sub.w D0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9158: ; sub.w D0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9160: ; sub.w D0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 2 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9168: ; sub.w D0, (-$6e98,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9170: ; sub.w D0, ($3456,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_9170_1 + cwde +OP_9170_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9178: ; sub.w D0, $9178.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9179: ; sub.w D0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9190: ; sub.l D0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9198: ; sub.l D0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_91a0: ; sub.l D0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 4 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_91a8: ; sub.l D0, (-$6e58,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_91b0: ; sub.l D0, ($3456,A1.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_91b0_1 + cwde +OP_91b0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 26 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_91b8: ; sub.l D0, $91b8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_91b9: ; sub.l D0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sub EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_90c0: ; suba.w D0, A0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,[R_D0+EBX*4] + cwde + sub [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_90d0: ; suba.w (A0), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + sub [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_90d8: ; suba.w (A0)+, A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + sub [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_90e0: ; suba.w -(A0), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 2 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + sub [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_90e8: ; suba.w (-$6f18,A0), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + sub [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_90f0: ; suba.w (-$10,A0,A1.w), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_90f0_1 + cwde +OP_90f0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + sub [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_90f8: ; suba.w $90f8.w, A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + sub [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_90f9: ; suba.w $123456.l, A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + sub [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_90fa: ; suba.w (-$6f06,PC), A0; ($ffff90f8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + sub [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_90fb: ; suba.w (-$5,PC,A1.w), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,esi ; Get PC + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_90fb_1 + cwde +OP_90fb_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + sub [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_90fc: ; suba.w #$90fc, A0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,dword [esi+ebp] + add esi,byte 2 + cwde + sub [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_91c0: ; suba.l D0, A0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,[R_D0+EBX*4] + sub [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_91d0: ; suba.l (A0), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + sub [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_91d8: ; suba.l (A0)+, A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + sub [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_91e0: ; suba.l -(A0), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 4 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + sub [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_91e8: ; suba.l (-$6e18,A0), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + sub [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_91f0: ; suba.l ($3456), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_91f0_1 + cwde +OP_91f0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + sub [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_91f8: ; suba.l $91f8.w, A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + sub [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_91f9: ; suba.l $123456.l, A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + sub [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_91fa: ; suba.l (-$6e06,PC), A0; ($ffff91f8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + sub [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_91fb: ; suba.l ([$3456],$3456), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,esi ; Get PC + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_91fb_1 + cwde +OP_91fb_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + sub [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_91fc: ; suba.l #$123456, A0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,byte 4 + sub [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b000: ; cmp.b D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,[R_D0+EBX*4] + cmp [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b010: ; cmp.b (A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b018: ; cmp.b (A0)+, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + inc dword [R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b01f: ; cmp.b (A7)+, D0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b020: ; cmp.b -(A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + dec EDI + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b027: ; cmp.b -(A7), D0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b028: ; cmp.b (-$4fd8,A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b030: ; cmp.b ($30,A0,A3.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_b030_1 + cwde +OP_b030_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b038: ; cmp.b $b038.w, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b039: ; cmp.b $123456.l, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b03a: ; cmp.b (-$4fc6,PC), D0; ($ffffb038): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b03b: ; cmp.b ($3b,PC,A3.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_b03b_1 + cwde +OP_b03b_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b03c: ; cmp.b #$0, D0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,dword [esi+ebp] + add esi,byte 2 + cmp [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b040: ; cmp.w D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,[R_D0+EBX*4] + cmp [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b050: ; cmp.w (A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b058: ; cmp.w (A0)+, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b060: ; cmp.w -(A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 2 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b068: ; cmp.w (-$4f98,A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b070: ; cmp.w ($70,A0,A3.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_b070_1 + cwde +OP_b070_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b078: ; cmp.w $b078.w, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b079: ; cmp.w $123456.l, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b07a: ; cmp.w (-$4f86,PC), D0; ($ffffb078): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b07b: ; cmp.w ($7b,PC,A3.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_b07b_1 + cwde +OP_b07b_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b07c: ; cmp.w #$b07c, D0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,dword [esi+ebp] + add esi,byte 2 + cmp [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b080: ; cmp.l D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,[R_D0+EBX*4] + cmp [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b090: ; cmp.l (A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b098: ; cmp.l (A0)+, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b0a0: ; cmp.l -(A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 4 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b0a8: ; cmp.l (-$4f58,A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b0b0: ; cmp.l (-$50,A0,A3.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_b0b0_1 + cwde +OP_b0b0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b0b8: ; cmp.l $b0b8.w, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b0b9: ; cmp.l $123456.l, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b0ba: ; cmp.l (-$4f46,PC), D0; ($ffffb0b8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b0bb: ; cmp.l (-$45,PC,A3.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_b0bb_1 + cwde +OP_b0bb_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + cmp [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b0bc: ; cmp.l #$123456, D0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,byte 4 + cmp [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b0c0: ; cmpa.w D0, A0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,[R_D0+EBX*4] + cwde + cmp [R_A0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b0d0: ; cmpa.w (A0), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + cmp [R_A0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b0d8: ; cmpa.w (A0)+, A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + cmp [R_A0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b0e0: ; cmpa.w -(A0), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 2 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + cmp [R_A0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b0e8: ; cmpa.w (-$4f18,A0), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + cmp [R_A0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b0f0: ; cmpa.w (-$10,A0,A3.w), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_b0f0_1 + cwde +OP_b0f0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + cmp [R_A0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b0f8: ; cmpa.w $b0f8.w, A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + cmp [R_A0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b0f9: ; cmpa.w $123456.l, A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + cmp [R_A0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b0fa: ; cmpa.w (-$4f06,PC), A0; ($ffffb0f8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + cmp [R_A0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b0fb: ; cmpa.w (-$5,PC,A3.w), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,esi ; Get PC + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_b0fb_1 + cwde +OP_b0fb_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + cmp [R_A0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b0fc: ; cmpa.w #$b0fc, A0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,dword [esi+ebp] + add esi,byte 2 + cwde + cmp [R_A0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b1c0: ; cmpa.l D0, A0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,[R_D0+EBX*4] + cmp [R_A0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b1d0: ; cmpa.l (A0), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cmp [R_A0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b1d8: ; cmpa.l (A0)+, A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cmp [R_A0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b1e0: ; cmpa.l -(A0), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 4 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cmp [R_A0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b1e8: ; cmpa.l (-$4e18,A0), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cmp [R_A0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b1f0: ; cmpa.l ($3456), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_b1f0_1 + cwde +OP_b1f0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cmp [R_A0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b1f8: ; cmpa.l $b1f8.w, A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cmp [R_A0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b1f9: ; cmpa.l $123456.l, A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cmp [R_A0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b1fa: ; cmpa.l (-$4e06,PC), A0; ($ffffb1f8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cmp [R_A0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b1fb: ; cmpa.l ([$3456],$3456), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,esi ; Get PC + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_b1fb_1 + cwde +OP_b1fb_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cmp [R_A0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b1fc: ; cmpa.l #$123456, A0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,byte 4 + cmp [R_A0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d0c0: ; adda.w D0, A0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,[R_D0+EBX*4] + cwde + add [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d0d0: ; adda.w (A0), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + add [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d0d8: ; adda.w (A0)+, A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + add [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d0e0: ; adda.w -(A0), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 2 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + add [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d0e8: ; adda.w (-$2f18,A0), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + add [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d0f0: ; adda.w (-$10,A0,A5.w), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_d0f0_1 + cwde +OP_d0f0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + add [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d0f8: ; adda.w $d0f8.w, A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + add [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d0f9: ; adda.w $123456.l, A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + add [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d0fa: ; adda.w (-$2f06,PC), A0; ($ffffd0f8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + add [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d0fb: ; adda.w (-$5,PC,A5.w), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,esi ; Get PC + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_d0fb_1 + cwde +OP_d0fb_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + add [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d0fc: ; adda.w #$d0fc, A0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,dword [esi+ebp] + add esi,byte 2 + cwde + add [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d1c0: ; adda.l D0, A0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,[R_D0+EBX*4] + add [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d1d0: ; adda.l (A0), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + add [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d1d8: ; adda.l (A0)+, A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + add [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d1e0: ; adda.l -(A0), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 4 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + add [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d1e8: ; adda.l (-$2e18,A0), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + add [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d1f0: ; adda.l ($3456), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_d1f0_1 + cwde +OP_d1f0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + add [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d1f8: ; adda.l $d1f8.w, A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + add [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d1f9: ; adda.l $123456.l, A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + add [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d1fa: ; adda.l (-$2e06,PC), A0; ($ffffd1f8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + add [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d1fb: ; adda.l ([$3456],$3456), A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,esi ; Get PC + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_d1fb_1 + cwde +OP_d1fb_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + add [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d1fc: ; adda.l #$123456, A0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,byte 4 + add [R_A0+ECX*4],EAX + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b100: ; eor.b D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,[R_D0+EBX*4] + xor AL,[R_D0+ECX*4] + pushfd + mov [R_D0+EBX*4],AL + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b110: ; eor.b D0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b118: ; eor.b D0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + inc dword [R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b11f: ; eor.b D0, (A7)+: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b120: ; eor.b D0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + dec EDI + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b127: ; eor.b D0, -(A7): + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b128: ; eor.b D0, (-$4ed8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b130: ; eor.b D0, ($3456,A0,A3.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_b130_1 + cwde +OP_b130_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b138: ; eor.b D0, $b138.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b139: ; eor.b D0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b140: ; eor.w D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,[R_D0+EBX*4] + xor AX,[R_D0+ECX*4] + pushfd + mov [R_D0+EBX*4],AX + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b150: ; eor.w D0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b158: ; eor.w D0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b160: ; eor.w D0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 2 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b168: ; eor.w D0, (-$4e98,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b170: ; eor.w D0, ($3456,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_b170_1 + cwde +OP_b170_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b178: ; eor.w D0, $b178.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b179: ; eor.w D0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b180: ; eor.l D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,[R_D0+EBX*4] + xor EAX,[R_D0+ECX*4] + pushfd + mov [R_D0+EBX*4],EAX + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b190: ; eor.l D0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b198: ; eor.l D0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b1a0: ; eor.l D0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 4 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b1a8: ; eor.l D0, (-$4e58,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b1b0: ; eor.l D0, ($3456,A3.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_b1b0_1 + cwde +OP_b1b0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 26 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b1b8: ; eor.l D0, $b1b8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b1b9: ; eor.l D0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c000: ; and.b D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,[R_D0+EBX*4] + and [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c010: ; and.b (A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c018: ; and.b (A0)+, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + inc dword [R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c01f: ; and.b (A7)+, D0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c020: ; and.b -(A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + dec EDI + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c027: ; and.b -(A7), D0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c028: ; and.b (-$3fd8,A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c030: ; and.b ($30,A0,A4.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_c030_1 + cwde +OP_c030_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c038: ; and.b $c038.w, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c039: ; and.b $123456.l, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c03a: ; and.b (-$3fc6,PC), D0; ($ffffc038): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c03b: ; and.b ($3b,PC,A4.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_c03b_1 + cwde +OP_c03b_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c03c: ; and.b #$0, D0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,dword [esi+ebp] + add esi,byte 2 + and [R_D0+ECX*4],AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c040: ; and.w D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,[R_D0+EBX*4] + and [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c050: ; and.w (A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c058: ; and.w (A0)+, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c060: ; and.w -(A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 2 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c068: ; and.w (-$3f98,A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c070: ; and.w ($70,A0,A4.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_c070_1 + cwde +OP_c070_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c078: ; and.w $c078.w, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c079: ; and.w $123456.l, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c07a: ; and.w (-$3f86,PC), D0; ($ffffc078): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c07b: ; and.w ($7b,PC,A4.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_c07b_1 + cwde +OP_c07b_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c07c: ; and.w #$c07c, D0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,dword [esi+ebp] + add esi,byte 2 + and [R_D0+ECX*4],AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c080: ; and.l D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,[R_D0+EBX*4] + and [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c090: ; and.l (A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c098: ; and.l (A0)+, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c0a0: ; and.l -(A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 4 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c0a8: ; and.l (-$3f58,A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c0b0: ; and.l (-$50,A0,A4.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_c0b0_1 + cwde +OP_c0b0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c0b8: ; and.l $c0b8.w, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c0b9: ; and.l $123456.l, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c0ba: ; and.l (-$3f46,PC), D0; ($ffffc0b8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c0bb: ; and.l (-$45,PC,A4.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_c0bb_1 + cwde +OP_c0bb_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c0bc: ; and.l #$123456, D0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,byte 4 + and [R_D0+ECX*4],EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c110: ; and.b D0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c118: ; and.b D0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + inc dword [R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c11f: ; and.b D0, (A7)+: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c120: ; and.b D0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + dec EDI + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c127: ; and.b D0, -(A7): + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c128: ; and.b D0, (-$3ed8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c130: ; and.b D0, ($3456,A0,A4.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_c130_1 + cwde +OP_c130_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c138: ; and.b D0, $c138.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c139: ; and.b D0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c150: ; and.w D0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c158: ; and.w D0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c160: ; and.w D0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 2 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c168: ; and.w D0, (-$3e98,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c170: ; and.w D0, ($3456,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_c170_1 + cwde +OP_c170_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c178: ; and.w D0, $c178.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c179: ; and.w D0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c190: ; and.l D0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c198: ; and.l D0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c1a0: ; and.l D0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 4 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c1a8: ; and.l D0, (-$3e58,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c1b0: ; and.l D0, ($3456,A4.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_c1b0_1 + cwde +OP_c1b0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 26 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c1b8: ; and.l D0, $c1b8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c1b9: ; and.l D0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + and EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d000: ; add.b D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,[R_D0+EBX*4] + add [R_D0+ECX*4],AL + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d010: ; add.b (A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add [R_D0+ECX*4],AL + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d018: ; add.b (A0)+, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + inc dword [R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add [R_D0+ECX*4],AL + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d01f: ; add.b (A7)+, D0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add [R_D0+ECX*4],AL + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d020: ; add.b -(A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + dec EDI + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add [R_D0+ECX*4],AL + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d027: ; add.b -(A7), D0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add [R_D0+ECX*4],AL + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d028: ; add.b (-$2fd8,A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add [R_D0+ECX*4],AL + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d030: ; add.b ($30,A0,A5.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_d030_1 + cwde +OP_d030_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add [R_D0+ECX*4],AL + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d038: ; add.b $d038.w, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add [R_D0+ECX*4],AL + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d039: ; add.b $123456.l, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add [R_D0+ECX*4],AL + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d03a: ; add.b (-$2fc6,PC), D0; ($ffffd038): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add [R_D0+ECX*4],AL + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d03b: ; add.b ($3b,PC,A5.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_d03b_1 + cwde +OP_d03b_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add [R_D0+ECX*4],AL + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d03c: ; add.b #$0, D0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,dword [esi+ebp] + add esi,byte 2 + add [R_D0+ECX*4],AL + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d040: ; add.w D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,[R_D0+EBX*4] + add [R_D0+ECX*4],AX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d050: ; add.w (A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add [R_D0+ECX*4],AX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d058: ; add.w (A0)+, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add [R_D0+ECX*4],AX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d060: ; add.w -(A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 2 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add [R_D0+ECX*4],AX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d068: ; add.w (-$2f98,A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add [R_D0+ECX*4],AX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d070: ; add.w ($70,A0,A5.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_d070_1 + cwde +OP_d070_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add [R_D0+ECX*4],AX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d078: ; add.w $d078.w, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add [R_D0+ECX*4],AX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d079: ; add.w $123456.l, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add [R_D0+ECX*4],AX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d07a: ; add.w (-$2f86,PC), D0; ($ffffd078): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add [R_D0+ECX*4],AX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d07b: ; add.w ($7b,PC,A5.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_d07b_1 + cwde +OP_d07b_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add [R_D0+ECX*4],AX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d07c: ; add.w #$d07c, D0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,dword [esi+ebp] + add esi,byte 2 + add [R_D0+ECX*4],AX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d080: ; add.l D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 15 + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,[R_D0+EBX*4] + add [R_D0+ECX*4],EAX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d090: ; add.l (A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add [R_D0+ECX*4],EAX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d098: ; add.l (A0)+, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add [R_D0+ECX*4],EAX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d0a0: ; add.l -(A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 4 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add [R_D0+ECX*4],EAX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d0a8: ; add.l (-$2f58,A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add [R_D0+ECX*4],EAX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d0b0: ; add.l (-$50,A0,A5.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_d0b0_1 + cwde +OP_d0b0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add [R_D0+ECX*4],EAX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d0b8: ; add.l $d0b8.w, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add [R_D0+ECX*4],EAX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d0b9: ; add.l $123456.l, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add [R_D0+ECX*4],EAX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d0ba: ; add.l (-$2f46,PC), D0; ($ffffd0b8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add [R_D0+ECX*4],EAX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d0bb: ; add.l (-$45,PC,A5.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_d0bb_1 + cwde +OP_d0bb_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add [R_D0+ECX*4],EAX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d0bc: ; add.l #$123456, D0: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EAX,dword [esi+ebp] + rol EAX,16 + add esi,byte 4 + add [R_D0+ECX*4],EAX + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d110: ; add.b D0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d118: ; add.b D0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + inc dword [R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d11f: ; add.b D0, (A7)+: + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,[R_A7] ; Get A7 + add dword [R_A7],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d120: ; add.b D0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + dec EDI + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d127: ; add.b D0, -(A7): + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov edi,[R_A7] ; Get A7 + sub edi,byte 2 + mov [R_A7],edi + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d128: ; add.b D0, (-$2ed8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d130: ; add.b D0, ($3456,A0,A5.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_d130_1 + cwde +OP_d130_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d138: ; add.b D0, $d138.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d139: ; add.b D0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AL,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d150: ; add.w D0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d158: ; add.w D0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d160: ; add.w D0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 2 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d168: ; add.w D0, (-$2e98,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d170: ; add.w D0, ($3456,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_d170_1 + cwde +OP_d170_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d178: ; add.w D0, $d178.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d179: ; add.w D0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add AX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d190: ; add.l D0, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d198: ; add.l D0, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d1a0: ; add.l D0, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 4 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d1a8: ; add.l D0, (-$2e58,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d1b0: ; add.l D0, ($3456,A5.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_d1b0_1 + cwde +OP_d1b0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 26 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d1b8: ; add.l D0, $d1b8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d1b9: ; add.l D0, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx,byte 9 + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + add EAX,[R_D0+ECX*4] + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9100: ; subx.b D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EBX,[R_D0+EBX*4] + bt dword [R_XC],0 + sbb [R_D0+ecx*4],BL + mov ebx,edx + pushfd + pop EDX + mov [R_XC],edx + jnz short OP_9100_1 + + and dl,0BFh ; Remove Z + and bl,40h ; Mask out Old Z + or dl,bl ; Copy across + +OP_9100_1: + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9108: ; subx.b -(A0), -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EDI,[R_A0+EBX*4] + dec EDI + cmp ebx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_9108_notA7_1 ; + dec EDI +OP_9108_notA7_1: ; + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EBX,EAX + mov EDI,[R_A0+ECX*4] + dec EDI + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_9108_notA7_2 ; + dec EDI +OP_9108_notA7_2: ; + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + bt dword [R_XC],0 + sbb AL,BL + mov ebx,edx + pushfd + pop EDX + mov [R_XC],edx + jnz short OP_9108_1 + + and dl,0BFh ; Remove Z + and bl,40h ; Mask out Old Z + or dl,bl ; Copy across + +OP_9108_1: + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9140: ; subx.w D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EBX,[R_D0+EBX*4] + bt dword [R_XC],0 + sbb [R_D0+ecx*4],BX + mov ebx,edx + pushfd + pop EDX + mov [R_XC],edx + jnz short OP_9140_1 + + and dl,0BFh ; Remove Z + and bl,40h ; Mask out Old Z + or dl,bl ; Copy across + +OP_9140_1: + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9148: ; subx.w -(A0), -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 2 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EBX,EAX + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + bt dword [R_XC],0 + sbb AX,BX + mov ebx,edx + pushfd + pop EDX + mov [R_XC],edx + jnz short OP_9148_1 + + and dl,0BFh ; Remove Z + and bl,40h ; Mask out Old Z + or dl,bl ; Copy across + +OP_9148_1: + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9180: ; subx.l D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EBX,[R_D0+EBX*4] + bt dword [R_XC],0 + sbb [R_D0+ecx*4],EBX + mov ebx,edx + pushfd + pop EDX + mov [R_XC],edx + jnz short OP_9180_1 + + and dl,0BFh ; Remove Z + and bl,40h ; Mask out Old Z + or dl,bl ; Copy across + +OP_9180_1: + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_9188: ; subx.l -(A0), -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 4 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EBX,EAX + mov EDI,[R_A0+ECX*4] + sub EDI,byte 4 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + bt dword [R_XC],0 + sbb EAX,EBX + mov ebx,edx + pushfd + pop EDX + mov [R_XC],edx + jnz short OP_9188_1 + + and dl,0BFh ; Remove Z + and bl,40h ; Mask out Old Z + or dl,bl ; Copy across + +OP_9188_1: + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 30 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d100: ; addx.b D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EBX,[R_D0+EBX*4] + bt dword [R_XC],0 + adc [R_D0+ecx*4],BL + mov ebx,edx + pushfd + pop EDX + mov [R_XC],edx + jnz short OP_d100_1 + + and dl,0BFh ; Remove Z + and bl,40h ; Mask out Old Z + or dl,bl ; Copy across + +OP_d100_1: + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d108: ; addx.b -(A0), -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EDI,[R_A0+EBX*4] + dec EDI + cmp ebx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_d108_notA7_1 ; + dec EDI +OP_d108_notA7_1: ; + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EBX,EAX + mov EDI,[R_A0+ECX*4] + dec EDI + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_d108_notA7_2 ; + dec EDI +OP_d108_notA7_2: ; + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + bt dword [R_XC],0 + adc AL,BL + mov ebx,edx + pushfd + pop EDX + mov [R_XC],edx + jnz short OP_d108_1 + + and dl,0BFh ; Remove Z + and bl,40h ; Mask out Old Z + or dl,bl ; Copy across + +OP_d108_1: + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d140: ; addx.w D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EBX,[R_D0+EBX*4] + bt dword [R_XC],0 + adc [R_D0+ecx*4],BX + mov ebx,edx + pushfd + pop EDX + mov [R_XC],edx + jnz short OP_d140_1 + + and dl,0BFh ; Remove Z + and bl,40h ; Mask out Old Z + or dl,bl ; Copy across + +OP_d140_1: + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d148: ; addx.w -(A0), -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 2 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EBX,EAX + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + bt dword [R_XC],0 + adc AX,BX + mov ebx,edx + pushfd + pop EDX + mov [R_XC],edx + jnz short OP_d148_1 + + and dl,0BFh ; Remove Z + and bl,40h ; Mask out Old Z + or dl,bl ; Copy across + +OP_d148_1: + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d180: ; addx.l D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EBX,[R_D0+EBX*4] + bt dword [R_XC],0 + adc [R_D0+ecx*4],EBX + mov ebx,edx + pushfd + pop EDX + mov [R_XC],edx + jnz short OP_d180_1 + + and dl,0BFh ; Remove Z + and bl,40h ; Mask out Old Z + or dl,bl ; Copy across + +OP_d180_1: + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_d188: ; addx.l -(A0), -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 4 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EBX,EAX + mov EDI,[R_A0+ECX*4] + sub EDI,byte 4 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + bt dword [R_XC],0 + adc EAX,EBX + mov ebx,edx + pushfd + pop EDX + mov [R_XC],edx + jnz short OP_d188_1 + + and dl,0BFh ; Remove Z + and bl,40h ; Mask out Old Z + or dl,bl ; Copy across + +OP_d188_1: + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 30 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80c0: ; divu.w D0, D0: + add esi,byte 2 + + mov [R_CCR],edx + sub dword [_m68000_ICount],133 + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EAX,[R_D0+EBX*4] + test ax,ax + je near OP_80c0_1_ZERO ;do div by zero trap + movzx ebx,ax + mov EAX,[R_D0+ECX*4] + xor edx,edx + div ebx + test eax, 0FFFF0000H + jnz short OP_80c0_1_OVER + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test DX,DX + pushfd + pop EDX + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80c0_1_OVER: + mov edx,[R_CCR] + or dh,8h ;V flag + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80c0_1_ZERO: ;Do divide by zero trap + add dword [_m68000_ICount],byte 95 +; sub esi,byte 2 + mov al,5 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_080c0_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_080c0_Bank: + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80d0: ; divu.w (A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov [R_CCR],edx + sub dword [_m68000_ICount],137 + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + test ax,ax + je near OP_80d0_1_ZERO ;do div by zero trap + movzx ebx,ax + mov EAX,[R_D0+ECX*4] + xor edx,edx + div ebx + test eax, 0FFFF0000H + jnz short OP_80d0_1_OVER + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test DX,DX + pushfd + pop EDX + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80d0_1_OVER: + mov edx,[R_CCR] + or dh,8h ;V flag + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80d0_1_ZERO: ;Do divide by zero trap + add dword [_m68000_ICount],byte 95 +; sub esi,byte 2 + mov al,5 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_080d0_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_080d0_Bank: + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80d8: ; divu.w (A0)+, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov [R_CCR],edx + sub dword [_m68000_ICount],137 + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + test ax,ax + je near OP_80d8_1_ZERO ;do div by zero trap + movzx ebx,ax + mov EAX,[R_D0+ECX*4] + xor edx,edx + div ebx + test eax, 0FFFF0000H + jnz short OP_80d8_1_OVER + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test DX,DX + pushfd + pop EDX + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80d8_1_OVER: + mov edx,[R_CCR] + or dh,8h ;V flag + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80d8_1_ZERO: ;Do divide by zero trap + add dword [_m68000_ICount],byte 95 +; sub esi,byte 2 + mov al,5 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_080d8_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_080d8_Bank: + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80e0: ; divu.w -(A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov [R_CCR],edx + sub dword [_m68000_ICount],139 + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 2 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + test ax,ax + je near OP_80e0_1_ZERO ;do div by zero trap + movzx ebx,ax + mov EAX,[R_D0+ECX*4] + xor edx,edx + div ebx + test eax, 0FFFF0000H + jnz short OP_80e0_1_OVER + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test DX,DX + pushfd + pop EDX + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80e0_1_OVER: + mov edx,[R_CCR] + or dh,8h ;V flag + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80e0_1_ZERO: ;Do divide by zero trap + add dword [_m68000_ICount],byte 95 +; sub esi,byte 2 + mov al,5 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_080e0_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_080e0_Bank: + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80e8: ; divu.w (-$7f18,A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov [R_CCR],edx + sub dword [_m68000_ICount],141 + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + test ax,ax + je near OP_80e8_1_ZERO ;do div by zero trap + movzx ebx,ax + mov EAX,[R_D0+ECX*4] + xor edx,edx + div ebx + test eax, 0FFFF0000H + jnz short OP_80e8_1_OVER + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test DX,DX + pushfd + pop EDX + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80e8_1_OVER: + mov edx,[R_CCR] + or dh,8h ;V flag + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80e8_1_ZERO: ;Do divide by zero trap + add dword [_m68000_ICount],byte 95 +; sub esi,byte 2 + mov al,5 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_080e8_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_080e8_Bank: + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80f0: ; divu.w (-$10,A0,A0.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov [R_CCR],edx + sub dword [_m68000_ICount],145 + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_80f0_2 + cwde +OP_80f0_2: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + test ax,ax + je near OP_80f0_1_ZERO ;do div by zero trap + movzx ebx,ax + mov EAX,[R_D0+ECX*4] + xor edx,edx + div ebx + test eax, 0FFFF0000H + jnz short OP_80f0_1_OVER + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test DX,DX + pushfd + pop EDX + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80f0_1_OVER: + mov edx,[R_CCR] + or dh,8h ;V flag + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80f0_1_ZERO: ;Do divide by zero trap + add dword [_m68000_ICount],byte 95 +; sub esi,byte 2 + mov al,5 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_080f0_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_080f0_Bank: + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80f8: ; divu.w $80f8.w, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov [R_CCR],edx + sub dword [_m68000_ICount],141 + shr ecx, byte 9 + and ecx, byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + test ax,ax + je near OP_80f8_1_ZERO ;do div by zero trap + movzx ebx,ax + mov EAX,[R_D0+ECX*4] + xor edx,edx + div ebx + test eax, 0FFFF0000H + jnz short OP_80f8_1_OVER + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test DX,DX + pushfd + pop EDX + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80f8_1_OVER: + mov edx,[R_CCR] + or dh,8h ;V flag + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80f8_1_ZERO: ;Do divide by zero trap + add dword [_m68000_ICount],byte 95 +; sub esi,byte 2 + mov al,5 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_080f8_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_080f8_Bank: + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80f9: ; divu.w $123456.l, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov [R_CCR],edx + sub dword [_m68000_ICount],145 + shr ecx, byte 9 + and ecx, byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + test ax,ax + je near OP_80f9_1_ZERO ;do div by zero trap + movzx ebx,ax + mov EAX,[R_D0+ECX*4] + xor edx,edx + div ebx + test eax, 0FFFF0000H + jnz short OP_80f9_1_OVER + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test DX,DX + pushfd + pop EDX + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80f9_1_OVER: + mov edx,[R_CCR] + or dh,8h ;V flag + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80f9_1_ZERO: ;Do divide by zero trap + add dword [_m68000_ICount],byte 95 +; sub esi,byte 2 + mov al,5 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_080f9_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_080f9_Bank: + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80fa: ; divu.w (-$7f06,PC), D0; ($ffff80f8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov [R_CCR],edx + sub dword [_m68000_ICount],141 + shr ecx, byte 9 + and ecx, byte 7 + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + test ax,ax + je near OP_80fa_1_ZERO ;do div by zero trap + movzx ebx,ax + mov EAX,[R_D0+ECX*4] + xor edx,edx + div ebx + test eax, 0FFFF0000H + jnz short OP_80fa_1_OVER + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test DX,DX + pushfd + pop EDX + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80fa_1_OVER: + mov edx,[R_CCR] + or dh,8h ;V flag + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80fa_1_ZERO: ;Do divide by zero trap + add dword [_m68000_ICount],byte 95 +; sub esi,byte 2 + mov al,5 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_080fa_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_080fa_Bank: + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80fb: ; divu.w (-$5,PC,A0.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov [R_CCR],edx + sub dword [_m68000_ICount],143 + shr ecx, byte 9 + and ecx, byte 7 + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_80fb_2 + cwde +OP_80fb_2: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + test ax,ax + je near OP_80fb_1_ZERO ;do div by zero trap + movzx ebx,ax + mov EAX,[R_D0+ECX*4] + xor edx,edx + div ebx + test eax, 0FFFF0000H + jnz short OP_80fb_1_OVER + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test DX,DX + pushfd + pop EDX + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80fb_1_OVER: + mov edx,[R_CCR] + or dh,8h ;V flag + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80fb_1_ZERO: ;Do divide by zero trap + add dword [_m68000_ICount],byte 95 +; sub esi,byte 2 + mov al,5 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_080fb_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_080fb_Bank: + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80fc: ; divu.w #$80fc, D0: + add esi,byte 2 + + mov [R_CCR],edx + sub dword [_m68000_ICount],137 + shr ecx, byte 9 + and ecx, byte 7 + mov EAX,dword [esi+ebp] + add esi,byte 2 + test ax,ax + je near OP_80fc_1_ZERO ;do div by zero trap + movzx ebx,ax + mov EAX,[R_D0+ECX*4] + xor edx,edx + div ebx + test eax, 0FFFF0000H + jnz short OP_80fc_1_OVER + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test DX,DX + pushfd + pop EDX + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80fc_1_OVER: + mov edx,[R_CCR] + or dh,8h ;V flag + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_80fc_1_ZERO: ;Do divide by zero trap + add dword [_m68000_ICount],byte 95 +; sub esi,byte 2 + mov al,5 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_080fc_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_080fc_Bank: + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81c0: ; divs.w D0, D0: + add esi,byte 2 + + mov [R_CCR],edx + sub dword [_m68000_ICount],150 + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EAX,[R_D0+EBX*4] + test ax,ax + je near OP_81c0_1_ZERO ;do div by zero trap + movsx ebx,ax + mov EAX,[R_D0+ECX*4] + cdq + idiv ebx + movsx ebx,ax + cmp eax,ebx + jne short OP_81c0_1_OVER + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test DX,DX + pushfd + pop EDX + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81c0_1_OVER: + mov edx,[R_CCR] + or dh,8h ;V flag + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81c0_1_ZERO: ;Do divide by zero trap + add dword [_m68000_ICount],byte 112 +; sub esi,byte 2 + mov al,5 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_081c0_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_081c0_Bank: + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81d0: ; divs.w (A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov [R_CCR],edx + sub dword [_m68000_ICount],154 + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + test ax,ax + je near OP_81d0_1_ZERO ;do div by zero trap + movsx ebx,ax + mov EAX,[R_D0+ECX*4] + cdq + idiv ebx + movsx ebx,ax + cmp eax,ebx + jne short OP_81d0_1_OVER + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test DX,DX + pushfd + pop EDX + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81d0_1_OVER: + mov edx,[R_CCR] + or dh,8h ;V flag + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81d0_1_ZERO: ;Do divide by zero trap + add dword [_m68000_ICount],byte 112 +; sub esi,byte 2 + mov al,5 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_081d0_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_081d0_Bank: + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81d8: ; divs.w (A0)+, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov [R_CCR],edx + sub dword [_m68000_ICount],154 + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + test ax,ax + je near OP_81d8_1_ZERO ;do div by zero trap + movsx ebx,ax + mov EAX,[R_D0+ECX*4] + cdq + idiv ebx + movsx ebx,ax + cmp eax,ebx + jne short OP_81d8_1_OVER + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test DX,DX + pushfd + pop EDX + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81d8_1_OVER: + mov edx,[R_CCR] + or dh,8h ;V flag + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81d8_1_ZERO: ;Do divide by zero trap + add dword [_m68000_ICount],byte 112 +; sub esi,byte 2 + mov al,5 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_081d8_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_081d8_Bank: + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81e0: ; divs.w -(A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov [R_CCR],edx + sub dword [_m68000_ICount],156 + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 2 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + test ax,ax + je near OP_81e0_1_ZERO ;do div by zero trap + movsx ebx,ax + mov EAX,[R_D0+ECX*4] + cdq + idiv ebx + movsx ebx,ax + cmp eax,ebx + jne short OP_81e0_1_OVER + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test DX,DX + pushfd + pop EDX + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81e0_1_OVER: + mov edx,[R_CCR] + or dh,8h ;V flag + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81e0_1_ZERO: ;Do divide by zero trap + add dword [_m68000_ICount],byte 112 +; sub esi,byte 2 + mov al,5 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_081e0_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_081e0_Bank: + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81e8: ; divs.w (-$7e18,A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov [R_CCR],edx + sub dword [_m68000_ICount],158 + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + test ax,ax + je near OP_81e8_1_ZERO ;do div by zero trap + movsx ebx,ax + mov EAX,[R_D0+ECX*4] + cdq + idiv ebx + movsx ebx,ax + cmp eax,ebx + jne short OP_81e8_1_OVER + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test DX,DX + pushfd + pop EDX + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81e8_1_OVER: + mov edx,[R_CCR] + or dh,8h ;V flag + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81e8_1_ZERO: ;Do divide by zero trap + add dword [_m68000_ICount],byte 112 +; sub esi,byte 2 + mov al,5 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_081e8_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_081e8_Bank: + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81f0: ; divs.w ($3456), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov [R_CCR],edx + sub dword [_m68000_ICount],162 + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_81f0_2 + cwde +OP_81f0_2: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + test ax,ax + je near OP_81f0_1_ZERO ;do div by zero trap + movsx ebx,ax + mov EAX,[R_D0+ECX*4] + cdq + idiv ebx + movsx ebx,ax + cmp eax,ebx + jne short OP_81f0_1_OVER + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test DX,DX + pushfd + pop EDX + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81f0_1_OVER: + mov edx,[R_CCR] + or dh,8h ;V flag + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81f0_1_ZERO: ;Do divide by zero trap + add dword [_m68000_ICount],byte 112 +; sub esi,byte 2 + mov al,5 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_081f0_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_081f0_Bank: + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81f8: ; divs.w $81f8.w, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov [R_CCR],edx + sub dword [_m68000_ICount],158 + shr ecx, byte 9 + and ecx, byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + test ax,ax + je near OP_81f8_1_ZERO ;do div by zero trap + movsx ebx,ax + mov EAX,[R_D0+ECX*4] + cdq + idiv ebx + movsx ebx,ax + cmp eax,ebx + jne short OP_81f8_1_OVER + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test DX,DX + pushfd + pop EDX + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81f8_1_OVER: + mov edx,[R_CCR] + or dh,8h ;V flag + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81f8_1_ZERO: ;Do divide by zero trap + add dword [_m68000_ICount],byte 112 +; sub esi,byte 2 + mov al,5 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_081f8_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_081f8_Bank: + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81f9: ; divs.w $123456.l, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov [R_CCR],edx + sub dword [_m68000_ICount],162 + shr ecx, byte 9 + and ecx, byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + test ax,ax + je near OP_81f9_1_ZERO ;do div by zero trap + movsx ebx,ax + mov EAX,[R_D0+ECX*4] + cdq + idiv ebx + movsx ebx,ax + cmp eax,ebx + jne short OP_81f9_1_OVER + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test DX,DX + pushfd + pop EDX + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81f9_1_OVER: + mov edx,[R_CCR] + or dh,8h ;V flag + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81f9_1_ZERO: ;Do divide by zero trap + add dword [_m68000_ICount],byte 112 +; sub esi,byte 2 + mov al,5 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_081f9_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_081f9_Bank: + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81fa: ; divs.w (-$7e06,PC), D0; ($ffff81f8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov [R_CCR],edx + sub dword [_m68000_ICount],158 + shr ecx, byte 9 + and ecx, byte 7 + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + test ax,ax + je near OP_81fa_1_ZERO ;do div by zero trap + movsx ebx,ax + mov EAX,[R_D0+ECX*4] + cdq + idiv ebx + movsx ebx,ax + cmp eax,ebx + jne short OP_81fa_1_OVER + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test DX,DX + pushfd + pop EDX + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81fa_1_OVER: + mov edx,[R_CCR] + or dh,8h ;V flag + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81fa_1_ZERO: ;Do divide by zero trap + add dword [_m68000_ICount],byte 112 +; sub esi,byte 2 + mov al,5 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_081fa_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_081fa_Bank: + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81fb: ; divs.w ([$3456],$3456), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov [R_CCR],edx + sub dword [_m68000_ICount],160 + shr ecx, byte 9 + and ecx, byte 7 + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_81fb_2 + cwde +OP_81fb_2: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + test ax,ax + je near OP_81fb_1_ZERO ;do div by zero trap + movsx ebx,ax + mov EAX,[R_D0+ECX*4] + cdq + idiv ebx + movsx ebx,ax + cmp eax,ebx + jne short OP_81fb_1_OVER + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test DX,DX + pushfd + pop EDX + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81fb_1_OVER: + mov edx,[R_CCR] + or dh,8h ;V flag + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81fb_1_ZERO: ;Do divide by zero trap + add dword [_m68000_ICount],byte 112 +; sub esi,byte 2 + mov al,5 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_081fb_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_081fb_Bank: + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81fc: ; divs.w #$81fc, D0: + add esi,byte 2 + + mov [R_CCR],edx + sub dword [_m68000_ICount],154 + shr ecx, byte 9 + and ecx, byte 7 + mov EAX,dword [esi+ebp] + add esi,byte 2 + test ax,ax + je near OP_81fc_1_ZERO ;do div by zero trap + movsx ebx,ax + mov EAX,[R_D0+ECX*4] + cdq + idiv ebx + movsx ebx,ax + cmp eax,ebx + jne short OP_81fc_1_OVER + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test DX,DX + pushfd + pop EDX + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81fc_1_OVER: + mov edx,[R_CCR] + or dh,8h ;V flag + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_81fc_1_ZERO: ;Do divide by zero trap + add dword [_m68000_ICount],byte 112 +; sub esi,byte 2 + mov al,5 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_081fc_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_081fc_Bank: + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4840: ; swap D0: + add esi,byte 2 + + and ecx, byte 7 + ror dword [R_D0+ECX*4],16 + or dword [R_D0+ECX*4],0 + pushfd + pop EDX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4000: ; negx.b D0: + add esi,byte 2 + + and ecx,byte 7 + mov EAX,[R_D0+ECX*4] + neg AL + bt dword [R_XC],0 + sbb AL,0 + pushfd + mov [R_D0+ECX*4],AL + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4010: ; negx.b (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg AL + bt dword [R_XC],0 + sbb AL,0 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4018: ; negx.b (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_4018_notA7 ; + inc dword [R_A0+ECX*4] ; +OP_4018_notA7: ; + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg AL + bt dword [R_XC],0 + sbb AL,0 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4020: ; negx.b -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + cmp ecx, byte 7 ; by Kenjo, for "-(A7)" + jne OP_4020_notA7 ; + dec EDI ; +OP_4020_notA7: ; + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg AL + bt dword [R_XC],0 + sbb AL,0 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4028: ; negx.b ($4028,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg AL + bt dword [R_XC],0 + sbb AL,0 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4030: ; negx.b ($30,A0,D4.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_4030_1 + cwde +OP_4030_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg AL + bt dword [R_XC],0 + sbb AL,0 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4038: ; negx.b $4038.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg AL + bt dword [R_XC],0 + sbb AL,0 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4039: ; negx.b $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg AL + bt dword [R_XC],0 + sbb AL,0 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4040: ; negx.w D0: + add esi,byte 2 + + and ecx,byte 7 + mov EAX,[R_D0+ECX*4] + neg AX + bt dword [R_XC],0 + sbb AX,0 + pushfd + mov [R_D0+ECX*4],AX + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4050: ; negx.w (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg AX + bt dword [R_XC],0 + sbb AX,0 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4058: ; negx.w (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg AX + bt dword [R_XC],0 + sbb AX,0 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4060: ; negx.w -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg AX + bt dword [R_XC],0 + sbb AX,0 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4068: ; negx.w ($4068,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg AX + bt dword [R_XC],0 + sbb AX,0 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4070: ; negx.w ($70,A0,D4.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_4070_1 + cwde +OP_4070_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg AX + bt dword [R_XC],0 + sbb AX,0 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4078: ; negx.w $4078.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg AX + bt dword [R_XC],0 + sbb AX,0 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4079: ; negx.w $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg AX + bt dword [R_XC],0 + sbb AX,0 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4080: ; negx.l D0: + add esi,byte 2 + + and ecx,byte 7 + mov EAX,[R_D0+ECX*4] + neg EAX + bt dword [R_XC],0 + sbb EAX,0 + pushfd + mov [R_D0+ECX*4],EAX + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4090: ; negx.l (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg EAX + bt dword [R_XC],0 + sbb EAX,0 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4098: ; negx.l (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg EAX + bt dword [R_XC],0 + sbb EAX,0 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_40a0: ; negx.l -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 4 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg EAX + bt dword [R_XC],0 + sbb EAX,0 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_40a8: ; negx.l ($40a8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg EAX + bt dword [R_XC],0 + sbb EAX,0 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_40b0: ; negx.l (-$50,A0,D4.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_40b0_1 + cwde +OP_40b0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg EAX + bt dword [R_XC],0 + sbb EAX,0 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_40b8: ; negx.l $40b8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg EAX + bt dword [R_XC],0 + sbb EAX,0 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_40b9: ; negx.l $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg EAX + bt dword [R_XC],0 + sbb EAX,0 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4200: ; clr.b D0: + add esi,byte 2 + + and ecx,byte 7 + xor eax,eax + mov [R_D0+ECX*4],AL + mov edx,40H + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4210: ; clr.b (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + xor eax,eax + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + mov edx,40H + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4218: ; clr.b (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + xor eax,eax + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_4218_notA7 ; + inc dword [R_A0+ECX*4] ; +OP_4218_notA7: ; + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + mov edx,40H + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4220: ; clr.b -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + xor eax,eax + mov EDI,[R_A0+ECX*4] + dec EDI + cmp ecx, byte 7 ; by Kenjo, for "-(A7)" + jne OP_4220_notA7 ; + dec EDI ; +OP_4220_notA7: ; + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + mov edx,40H + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4228: ; clr.b ($4228,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + xor eax,eax + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + mov edx,40H + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4230: ; clr.b ($30,A0,D4.w*2): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + xor eax,eax + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_4230_1 + cwde +OP_4230_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + mov edx,40H + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4238: ; clr.b $4238.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + xor eax,eax + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + mov edx,40H + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4239: ; clr.b $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + xor eax,eax + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24@8 + mov edx,40H + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4240: ; clr.w D0: + add esi,byte 2 + + and ecx,byte 7 + xor eax,eax + mov [R_D0+ECX*4],AX + mov edx,40H + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4250: ; clr.w (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + xor eax,eax + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + mov edx,40H + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4258: ; clr.w (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + xor eax,eax + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + mov edx,40H + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4260: ; clr.w -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + xor eax,eax + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + mov edx,40H + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4268: ; clr.w ($4268,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + xor eax,eax + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + mov edx,40H + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4270: ; clr.w ($70,A0,D4.w*2): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + xor eax,eax + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_4270_1 + cwde +OP_4270_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + mov edx,40H + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4278: ; clr.w $4278.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + xor eax,eax + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + mov edx,40H + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4279: ; clr.w $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + xor eax,eax + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + mov edx,40H + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4280: ; clr.l D0: + add esi,byte 2 + + and ecx,byte 7 + xor eax,eax + mov [R_D0+ECX*4],EAX + mov edx,40H + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4290: ; clr.l (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + xor eax,eax + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + mov edx,40H + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4298: ; clr.l (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + xor eax,eax + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 4 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + mov edx,40H + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_42a0: ; clr.l -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + xor eax,eax + mov EDI,[R_A0+ECX*4] + sub EDI,byte 4 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + mov edx,40H + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_42a8: ; clr.l ($42a8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + xor eax,eax + push EAX + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + mov edx,40H + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_42b0: ; clr.l (-$50,A0,D4.w*2): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + xor eax,eax + push EAX + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_42b0_1 + cwde +OP_42b0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + mov edx,40H + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_42b8: ; clr.l $42b8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + xor eax,eax + push EAX + movsx EDI,word [esi+ebp] + add esi,byte 2 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + mov edx,40H + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_42b9: ; clr.l $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + xor eax,eax + push EAX + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + pop EAX + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + mov edx,40H + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4400: ; neg.b D0: + add esi,byte 2 + + and ecx,byte 7 + mov EAX,[R_D0+ECX*4] + neg AL + pushfd + mov [R_D0+ECX*4],AL + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4410: ; neg.b (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg AL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4418: ; neg.b (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_4418_notA7 ; + inc dword [R_A0+ECX*4] ; +OP_4418_notA7: ; + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg AL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4420: ; neg.b -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + cmp ecx, byte 7 ; by Kenjo, for "-(A7)" + jne OP_4420_notA7 ; + dec EDI ; +OP_4420_notA7: ; + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg AL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4428: ; neg.b ($4428,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg AL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4430: ; neg.b ($30,A0,D4.w*4): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_4430_1 + cwde +OP_4430_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg AL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4438: ; neg.b $4438.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg AL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4439: ; neg.b $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg AL + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4440: ; neg.w D0: + add esi,byte 2 + + and ecx,byte 7 + mov EAX,[R_D0+ECX*4] + neg AX + pushfd + mov [R_D0+ECX*4],AX + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4450: ; neg.w (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg AX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4458: ; neg.w (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg AX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4460: ; neg.w -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg AX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4468: ; neg.w ($4468,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg AX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4470: ; neg.w ($70,A0,D4.w*4): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_4470_1 + cwde +OP_4470_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg AX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4478: ; neg.w $4478.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg AX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4479: ; neg.w $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg AX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4480: ; neg.l D0: + add esi,byte 2 + + and ecx,byte 7 + mov EAX,[R_D0+ECX*4] + neg EAX + pushfd + mov [R_D0+ECX*4],EAX + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4490: ; neg.l (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg EAX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4498: ; neg.l (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg EAX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_44a0: ; neg.l -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 4 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg EAX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_44a8: ; neg.l ($44a8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg EAX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_44b0: ; neg.l (-$50,A0,D4.w*4): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_44b0_1 + cwde +OP_44b0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg EAX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_44b8: ; neg.l $44b8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg EAX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_44b9: ; neg.l $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + neg EAX + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4600: ; not.b D0: + add esi,byte 2 + + and ecx,byte 7 + mov EAX,[R_D0+ECX*4] + xor AL,-1 + pushfd + mov [R_D0+ECX*4],AL + pop EDX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4610: ; not.b (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AL,-1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4618: ; not.b (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_4618_notA7 ; + inc dword [R_A0+ECX*4] ; +OP_4618_notA7: ; + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AL,-1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4620: ; not.b -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + cmp ecx, byte 7 ; by Kenjo, for "-(A7)" + jne OP_4620_notA7 ; + dec EDI ; +OP_4620_notA7: ; + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AL,-1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4628: ; not.b ($4628,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AL,-1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4630: ; not.b ($30,A0,D4.w*8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_4630_1 + cwde +OP_4630_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AL,-1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4638: ; not.b $4638.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AL,-1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4639: ; not.b $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AL,-1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4640: ; not.w D0: + add esi,byte 2 + + and ecx,byte 7 + mov EAX,[R_D0+ECX*4] + xor AX,-1 + pushfd + mov [R_D0+ECX*4],AX + pop EDX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4650: ; not.w (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AX,-1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4658: ; not.w (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AX,-1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4660: ; not.w -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AX,-1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4668: ; not.w ($4668,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AX,-1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4670: ; not.w ($70,A0,D4.w*8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_4670_1 + cwde +OP_4670_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AX,-1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4678: ; not.w $4678.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AX,-1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4679: ; not.w $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor AX,-1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4680: ; not.l D0: + add esi,byte 2 + + and ecx,byte 7 + mov EAX,[R_D0+ECX*4] + xor EAX,-1 + pushfd + mov [R_D0+ECX*4],EAX + pop EDX + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4690: ; not.l (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor EAX,-1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4698: ; not.l (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor EAX,-1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_46a0: ; not.l -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 4 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor EAX,-1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_46a8: ; not.l ($46a8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor EAX,-1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_46b0: ; not.l (-$50,A0,D4.w*8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_46b0_1 + cwde +OP_46b0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor EAX,-1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_46b8: ; not.l $46b8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor EAX,-1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_46b9: ; not.l $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + xor EAX,-1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_dword@8 + pop EDX + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4e60: ; move A0, USP + add esi,byte 2 + + test byte [R_SR_H],20h ; Supervisor Mode ? + jz short OP_4e60_Trap + and ecx,7 + mov eax,[R_A0+ECX*4] + mov [R_USP],eax + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_4e60_Trap: +; sub esi,byte 2 + mov al,8 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_04e60_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_04e60_Bank: + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4e68: ; move USP, A0 + add esi,byte 2 + + test byte [R_SR_H],20h ; Supervisor Mode ? + jz short OP_4e68_Trap + and ecx,7 + mov eax,[R_USP] + mov [R_A0+ECX*4],eax + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_4e68_Trap: +; sub esi,byte 2 + mov al,8 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_04e68_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_04e68_Bank: + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4180: ; chk.w D0, D0: + add esi,byte 2 + + mov ebx,ecx + shr ebx,byte 9 + and ebx,byte 7 + mov ebx,[R_D0+EBX*4] + test bh,80h + jnz near OP_4180_Trap_minus + and ecx,byte 7 + mov EAX,[R_D0+ECX*4] + cmp bx,ax + jg near OP_4180_Trap_over + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4180_Trap_minus: + or dl,80h +; sub esi,byte 2 + mov al,6 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_04180_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_04180_Bank: + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4180_Trap_over: + and dl,7Fh +; sub esi,byte 2 + mov al,6 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_14180_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_14180_Bank: + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4190: ; chk.w (A0), D0: + add esi,byte 2 + + mov ebx,ecx + shr ebx,byte 9 + and ebx,byte 7 + mov ebx,[R_D0+EBX*4] + test bh,80h + jnz near OP_4190_Trap_minus + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + cmp bx,ax + jg near OP_4190_Trap_over + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4190_Trap_minus: + or dl,80h +; sub esi,byte 2 + mov al,6 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_04190_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_04190_Bank: + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4190_Trap_over: + and dl,7Fh +; sub esi,byte 2 + mov al,6 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_14190_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_14190_Bank: + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4198: ; chk.w (A0)+, D0: + add esi,byte 2 + + mov ebx,ecx + shr ebx,byte 9 + and ebx,byte 7 + mov ebx,[R_D0+EBX*4] + test bh,80h + jnz near OP_4198_Trap_minus + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + cmp bx,ax + jg near OP_4198_Trap_over + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4198_Trap_minus: + or dl,80h +; sub esi,byte 2 + mov al,6 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_04198_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_04198_Bank: + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4198_Trap_over: + and dl,7Fh +; sub esi,byte 2 + mov al,6 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_14198_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_14198_Bank: + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_41a0: ; chk.w -(A0), D0: + add esi,byte 2 + + mov ebx,ecx + shr ebx,byte 9 + and ebx,byte 7 + mov ebx,[R_D0+EBX*4] + test bh,80h + jnz near OP_41a0_Trap_minus + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + cmp bx,ax + jg near OP_41a0_Trap_over + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_41a0_Trap_minus: + or dl,80h +; sub esi,byte 2 + mov al,6 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_041a0_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_041a0_Bank: + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_41a0_Trap_over: + and dl,7Fh +; sub esi,byte 2 + mov al,6 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_141a0_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_141a0_Bank: + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_41a8: ; chk.w ($41a8,A0), D0: + add esi,byte 2 + + mov ebx,ecx + shr ebx,byte 9 + and ebx,byte 7 + mov ebx,[R_D0+EBX*4] + test bh,80h + jnz near OP_41a8_Trap_minus + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + cmp bx,ax + jg near OP_41a8_Trap_over + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_41a8_Trap_minus: + or dl,80h +; sub esi,byte 2 + mov al,6 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_041a8_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_041a8_Bank: + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_41a8_Trap_over: + and dl,7Fh +; sub esi,byte 2 + mov al,6 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_141a8_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_141a8_Bank: + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_41b0: ; chk.w ($3456,D4.w), D0: + add esi,byte 2 + + mov ebx,ecx + shr ebx,byte 9 + and ebx,byte 7 + mov ebx,[R_D0+EBX*4] + test bh,80h + jnz near OP_41b0_Trap_minus + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_41b0_1 + cwde +OP_41b0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + cmp bx,ax + jg near OP_41b0_Trap_over + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_41b0_Trap_minus: + or dl,80h +; sub esi,byte 2 + mov al,6 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_041b0_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_041b0_Bank: + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_41b0_Trap_over: + and dl,7Fh +; sub esi,byte 2 + mov al,6 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_141b0_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_141b0_Bank: + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_41b8: ; chk.w $41b8.w, D0: + add esi,byte 2 + + mov ebx,ecx + shr ebx,byte 9 + and ebx,byte 7 + mov ebx,[R_D0+EBX*4] + test bh,80h + jnz near OP_41b8_Trap_minus + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + cmp bx,ax + jg near OP_41b8_Trap_over + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_41b8_Trap_minus: + or dl,80h +; sub esi,byte 2 + mov al,6 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_041b8_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_041b8_Bank: + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_41b8_Trap_over: + and dl,7Fh +; sub esi,byte 2 + mov al,6 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_141b8_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_141b8_Bank: + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_41b9: ; chk.w $123456.l, D0: + add esi,byte 2 + + mov ebx,ecx + shr ebx,byte 9 + and ebx,byte 7 + mov ebx,[R_D0+EBX*4] + test bh,80h + jnz near OP_41b9_Trap_minus + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + cmp bx,ax + jg near OP_41b9_Trap_over + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_41b9_Trap_minus: + or dl,80h +; sub esi,byte 2 + mov al,6 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_041b9_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_041b9_Bank: + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_41b9_Trap_over: + and dl,7Fh +; sub esi,byte 2 + mov al,6 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_141b9_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_141b9_Bank: + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_41ba: ; chk.w ($41ba,PC), D0; ($41b8): + add esi,byte 2 + + mov ebx,ecx + shr ebx,byte 9 + and ebx,byte 7 + mov ebx,[R_D0+EBX*4] + test bh,80h + jnz near OP_41ba_Trap_minus + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + cmp bx,ax + jg near OP_41ba_Trap_over + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_41ba_Trap_minus: + or dl,80h +; sub esi,byte 2 + mov al,6 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_041ba_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_041ba_Bank: + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_41ba_Trap_over: + and dl,7Fh +; sub esi,byte 2 + mov al,6 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_141ba_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_141ba_Bank: + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_41bb: ; chk.w ([$3456,D4.w],$3456), D0: + add esi,byte 2 + + mov ebx,ecx + shr ebx,byte 9 + and ebx,byte 7 + mov ebx,[R_D0+EBX*4] + test bh,80h + jnz near OP_41bb_Trap_minus + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_41bb_1 + cwde +OP_41bb_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + cmp bx,ax + jg near OP_41bb_Trap_over + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_41bb_Trap_minus: + or dl,80h +; sub esi,byte 2 + mov al,6 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_041bb_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_041bb_Bank: + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_41bb_Trap_over: + and dl,7Fh +; sub esi,byte 2 + mov al,6 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_141bb_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_141bb_Bank: + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_41bc: ; chk.w #$41bc, D0: + add esi,byte 2 + + mov ebx,ecx + shr ebx,byte 9 + and ebx,byte 7 + mov ebx,[R_D0+EBX*4] + test bh,80h + jnz near OP_41bc_Trap_minus + mov EAX,dword [esi+ebp] + add esi,byte 2 + cmp bx,ax + jg near OP_41bc_Trap_over + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_41bc_Trap_minus: + or dl,80h +; sub esi,byte 2 + mov al,6 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_041bc_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_041bc_Bank: + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_41bc_Trap_over: + and dl,7Fh +; sub esi,byte 2 + mov al,6 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_141bc_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_141bc_Bank: + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c140: ; exg D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov eax,[R_D0+ECX*4] + mov edi,[R_D0+EBX*4] + mov [R_D0+ECX*4],edi + mov [R_D0+EBX*4],eax + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c148: ; exg A0, A0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov eax,[R_A0+ECX*4] + mov edi,[R_A0+EBX*4] + mov [R_A0+ECX*4],edi + mov [R_A0+EBX*4],eax + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c188: ; exg D0, A0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov eax,[R_D0+ECX*4] + mov edi,[R_A0+EBX*4] + mov [R_D0+ECX*4],edi + mov [R_A0+EBX*4],eax + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b108: ; cmpm.b (A0)+, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EDI,[R_A0+EBX*4] + inc dword [R_A0+EBX*4] + cmp ebx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_b108_notA7_1 ; + inc dword [R_A0+EBX*4] ; +OP_b108_notA7_1: ; + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EBX,EAX + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_b108_notA7_2 ; + inc dword [R_A0+ECX*4] ; +OP_b108_notA7_2: ; + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + cmp AL,BL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b148: ; cmpm.w (A0)+, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EBX,EAX + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + cmp AX,BX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_b188: ; cmpm.l (A0)+, (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 4 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EBX,EAX + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 4 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + cmp EAX,EBX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c0c0: ; mulu.w D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EAX,[R_D0+EBX*4] + mul word [R_D0+ECX*4] + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test EDX,EDX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 70 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c0d0: ; mulu.w (A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + mul word [R_D0+ECX*4] + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test EDX,EDX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 74 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c0d8: ; mulu.w (A0)+, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + mul word [R_D0+ECX*4] + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test EDX,EDX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 74 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c0e0: ; mulu.w -(A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 2 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + mul word [R_D0+ECX*4] + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test EDX,EDX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 76 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c0e8: ; mulu.w (-$3f18,A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + mul word [R_D0+ECX*4] + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test EDX,EDX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 78 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c0f0: ; mulu.w (-$10,A0,A4.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_c0f0_1 + cwde +OP_c0f0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + mul word [R_D0+ECX*4] + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test EDX,EDX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 80 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c0f8: ; mulu.w $c0f8.w, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx, byte 9 + and ecx, byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + mul word [R_D0+ECX*4] + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test EDX,EDX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 78 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c0f9: ; mulu.w $123456.l, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx, byte 9 + and ecx, byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + mul word [R_D0+ECX*4] + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test EDX,EDX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 82 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c0fa: ; mulu.w (-$3f06,PC), D0; ($ffffc0f8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx, byte 9 + and ecx, byte 7 + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + mul word [R_D0+ECX*4] + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test EDX,EDX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 78 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c0fb: ; mulu.w (-$5,PC,A4.w), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx, byte 9 + and ecx, byte 7 + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_c0fb_1 + cwde +OP_c0fb_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + mul word [R_D0+ECX*4] + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test EDX,EDX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 80 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c0fc: ; mulu.w #$c0fc, D0: + add esi,byte 2 + + shr ecx, byte 9 + and ecx, byte 7 + mov EAX,dword [esi+ebp] + add esi,byte 2 + mul word [R_D0+ECX*4] + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test EDX,EDX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 70 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c1c0: ; muls.w D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EAX,[R_D0+EBX*4] + imul word [R_D0+ECX*4] + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test EDX,EDX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 70 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c1d0: ; muls.w (A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EDI,[R_A0+EBX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + imul word [R_D0+ECX*4] + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test EDX,EDX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 74 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c1d8: ; muls.w (A0)+, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EDI,[R_A0+EBX*4] + add dword [R_A0+EBX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + imul word [R_D0+ECX*4] + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test EDX,EDX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 74 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c1e0: ; muls.w -(A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EDI,[R_A0+EBX*4] + sub EDI,byte 2 + mov [R_A0+EBX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + imul word [R_D0+ECX*4] + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test EDX,EDX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 76 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c1e8: ; muls.w (-$3e18,A0), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+EBX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + imul word [R_D0+ECX*4] + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test EDX,EDX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 78 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c1f0: ; muls.w ($3456), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx, byte 9 + and ecx, byte 7 + mov EDI,[R_A0+EBX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_c1f0_1 + cwde +OP_c1f0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + imul word [R_D0+ECX*4] + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test EDX,EDX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 80 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c1f8: ; muls.w $c1f8.w, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx, byte 9 + and ecx, byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + imul word [R_D0+ECX*4] + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test EDX,EDX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 78 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c1f9: ; muls.w $123456.l, D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx, byte 9 + and ecx, byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + imul word [R_D0+ECX*4] + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test EDX,EDX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 82 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c1fa: ; muls.w (-$3e06,PC), D0; ($ffffc1f8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx, byte 9 + and ecx, byte 7 + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + imul word [R_D0+ECX*4] + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test EDX,EDX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 78 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c1fb: ; muls.w ([$3456],$3456), D0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + shr ecx, byte 9 + and ecx, byte 7 + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_c1fb_1 + cwde +OP_c1fb_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + imul word [R_D0+ECX*4] + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test EDX,EDX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 80 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_c1fc: ; muls.w #$c1fc, D0: + add esi,byte 2 + + shr ecx, byte 9 + and ecx, byte 7 + mov EAX,dword [esi+ebp] + add esi,byte 2 + imul word [R_D0+ECX*4] + shl edx, byte 16 + mov dx,ax + mov [R_D0+ECX*4],edx + test EDX,EDX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 70 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4e77: ; rtr: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,[R_A7] + add dword [R_A7],byte 6 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov EDI,[Safe_EDI] + add edi,byte 2 + mov esi,eax + mov [R_PC],ESI + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_dword@4 + mov EDI,[Safe_EDI] + xchg esi,eax + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_04e77_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_04e77_Bank: + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4e75: ; rts: + mov [R_PPC],esi ; Keep Previous PC + mov eax,[R_A7] + add dword [R_A7],byte 4 + mov [R_PC],ESI + mov [R_CCR],edx + mov ecx,EAX + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov EDX,[R_CCR] + mov esi,eax + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_04e75_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_04e75_Bank: + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4e90: ; jsr (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov eax,esi ; Old PC + mov ebx,[R_A7] ; Push onto Stack + sub ebx,byte 4 + mov esi,edi ; New PC + mov [R_A7],ebx + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EBX + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + mov EDX,[R_CCR] + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_04e90_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_04e90_Bank: + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4ea8: ; jsr ($4ea8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov eax,esi ; Old PC + mov ebx,[R_A7] ; Push onto Stack + sub ebx,byte 4 + mov esi,edi ; New PC + mov [R_A7],ebx + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EBX + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + mov EDX,[R_CCR] + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_04ea8_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_04ea8_Bank: + sub dword [_m68000_ICount],byte 30 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4eb0: ; jsr (-$50,A0,D4.l*8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_4eb0_1 + cwde +OP_4eb0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov eax,esi ; Old PC + mov ebx,[R_A7] ; Push onto Stack + sub ebx,byte 4 + mov esi,edi ; New PC + mov [R_A7],ebx + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EBX + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + mov EDX,[R_CCR] + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_04eb0_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_04eb0_Bank: + sub dword [_m68000_ICount],byte 36 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4eb8: ; jsr $4eb8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov eax,esi ; Old PC + mov ebx,[R_A7] ; Push onto Stack + sub ebx,byte 4 + mov esi,edi ; New PC + mov [R_A7],ebx + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EBX + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + mov EDX,[R_CCR] + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_04eb8_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_04eb8_Bank: + sub dword [_m68000_ICount],byte 30 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4eb9: ; jsr $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov eax,esi ; Old PC + mov ebx,[R_A7] ; Push onto Stack + sub ebx,byte 4 + mov esi,edi ; New PC + mov [R_A7],ebx + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EBX + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + mov EDX,[R_CCR] + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_04eb9_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_04eb9_Bank: + sub dword [_m68000_ICount],byte 34 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4eba: ; jsr ($4eba,PC); ($4eb8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov eax,esi ; Old PC + mov ebx,[R_A7] ; Push onto Stack + sub ebx,byte 4 + mov esi,edi ; New PC + mov [R_A7],ebx + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EBX + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + mov EDX,[R_CCR] + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_04eba_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_04eba_Bank: + sub dword [_m68000_ICount],byte 30 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4ebb: ; jsr (-$45,PC,D4.l*8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_4ebb_1 + cwde +OP_4ebb_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov eax,esi ; Old PC + mov ebx,[R_A7] ; Push onto Stack + sub ebx,byte 4 + mov esi,edi ; New PC + mov [R_A7],ebx + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EBX + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + mov EDX,[R_CCR] + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_04ebb_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_04ebb_Bank: + sub dword [_m68000_ICount],byte 32 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4ed0: ; jmp (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov esi,edi + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_04ed0_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_04ed0_Bank: + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4ee8: ; jmp ($4ee8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov esi,edi + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_04ee8_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_04ee8_Bank: + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4ef0: ; jmp (-$10,A0,D4.l*8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_4ef0_1 + cwde +OP_4ef0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov esi,edi + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_04ef0_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_04ef0_Bank: + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4ef8: ; jmp $4ef8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov esi,edi + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_04ef8_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_04ef8_Bank: + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4ef9: ; jmp $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov esi,edi + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_04ef9_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_04ef9_Bank: + sub dword [_m68000_ICount],byte 26 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4efa: ; jmp ($4efa,PC); ($4ef8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov esi,edi + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_04efa_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_04efa_Bank: + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4efb: ; jmp (-$5,PC,D4.l*8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov edi,esi ; Get PC + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_4efb_1 + cwde +OP_4efb_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov esi,edi + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_04efb_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_04efb_Bank: + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4800: ; nbcd D0: + add esi,byte 2 + + and ecx, byte 7 + mov EBX,[R_D0+ECX*4] + xor eax,eax + bt dword [R_XC],0 + sbb al,bl + das + pushfd + mov [R_D0+ECX*4],AL + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4810: ; nbcd (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx, byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + mov EBX,EAX + xor eax,eax + bt dword [R_XC],0 + sbb al,bl + das + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4818: ; nbcd (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx, byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_4818_notA7 ; + inc dword [R_A0+ECX*4] ; +OP_4818_notA7: ; + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + mov EBX,EAX + xor eax,eax + bt dword [R_XC],0 + sbb al,bl + das + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4820: ; nbcd -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx, byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + cmp ecx, byte 7 ; by Kenjo, for "-(A7)" + jne OP_4820_notA7 ; + dec EDI ; +OP_4820_notA7: ; + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + mov EBX,EAX + xor eax,eax + bt dword [R_XC],0 + sbb al,bl + das + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4828: ; nbcd ($4828,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx, byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + mov EBX,EAX + xor eax,eax + bt dword [R_XC],0 + sbb al,bl + das + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4830: ; nbcd ($30,A0,D4.l): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx, byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_4830_1 + cwde +OP_4830_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + mov EBX,EAX + xor eax,eax + bt dword [R_XC],0 + sbb al,bl + das + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4838: ; nbcd $4838.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx, byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + mov EBX,EAX + xor eax,eax + bt dword [R_XC],0 + sbb al,bl + das + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4839: ; nbcd $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx, byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + mov EBX,EAX + xor eax,eax + bt dword [R_XC],0 + sbb al,bl + das + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_483a: ; dc.w $483a; ILLEGAL: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx, byte 7 + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + mov EBX,EAX + xor eax,eax + bt dword [R_XC],0 + sbb al,bl + das + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_483b: ; dc.w $483b; ILLEGAL: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx, byte 7 + mov edi,esi ; Get PC + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_483b_1 + cwde +OP_483b_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + mov EBX,EAX + xor eax,eax + bt dword [R_XC],0 + sbb al,bl + das + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_483c: ; dc.w $483c; ILLEGAL: + add esi,byte 2 + + and ecx, byte 7 + mov EBX,dword [esi+ebp] + add esi,byte 2 + xor eax,eax + bt dword [R_XC],0 + sbb al,bl + das + pushfd + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4ac0: ; tas D0: + add esi,byte 2 + + and ecx, byte 7 + mov EAX,[R_D0+ECX*4] + test AL,AL + pushfd + or al,128 + mov [R_D0+ECX*4],AL + pop EDX +; mov [R_XC],edx + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4ad0: ; tas (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx, byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + test AL,AL + pushfd + or al,128 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX +; mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4ad8: ; tas (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx, byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_4ad8_notA7 ; + inc dword [R_A0+ECX*4] ; +OP_4ad8_notA7: ; + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + test AL,AL + pushfd + or al,128 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX +; mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4ae0: ; tas -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx, byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + cmp ecx, byte 7 ; by Kenjo, for "-(A7)" + jne OP_4ae0_notA7 ; + dec EDI ; +OP_4ae0_notA7: ; + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + test AL,AL + pushfd + or al,128 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX +; mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4ae8: ; tas ($4ae8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx, byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + test AL,AL + pushfd + or al,128 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX +; mov [R_XC],edx + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4af0: ; tas (-$10,A0,D4.l*2): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx, byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_4af0_1 + cwde +OP_4af0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + test AL,AL + pushfd + or al,128 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX +; mov [R_XC],edx + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4af8: ; tas $4af8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx, byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + test AL,AL + pushfd + or al,128 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX +; mov [R_XC],edx + sub dword [_m68000_ICount],byte 22 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4af9: ; tas $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx, byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + test AL,AL + pushfd + or al,128 + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24@8 + pop EDX +; mov [R_XC],edx + sub dword [_m68000_ICount],byte 26 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4e40: ; trap #$0: + add esi,byte 2 + + mov eax,ecx + and eax,byte 15 + or eax,byte 32 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_04e40_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_04e40_Bank: + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4e76: ; trapv + add esi,byte 2 + + test dh,08h + jz near OP_4e76_Clear +; sub esi,byte 2 + mov al,7 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_04e76_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_04e76_Bank: + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_4e76_Clear: + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4e70: ; reset: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + test byte [R_SR_H],20h ; Supervisor Mode ? + jnz near OP_4e70_RESET +; sub esi,byte 2 + mov al,8 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_04e70_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_04e70_Bank: + sub dword [_m68000_ICount],132 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + +OP_4e70_RESET: + movzx ecx,word [esi+ebp] + mov eax,dword [R_RESET_CALLBACK] + test eax,eax + jz near OP_4e70_END + mov [R_PC],ESI, + mov [R_CCR],edx + mov [Safe_ECX],ECX + call [eax] + mov ESI,[R_PC] + mov edx,[R_CCR] + mov ECX,[Safe_ECX] + mov ebp,dword [_OP_ROM] +OP_4e70_END: + sub dword [_m68000_ICount],132 + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4e71: ; nop: + add esi,byte 2 + + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4e72: ; stop #$4e72: + add esi,byte 2 + + test byte [R_SR_H],20h ; Supervisor Mode ? + je near OP_4e72_1 + + mov EAX,dword [esi+ebp] + add esi,byte 2 + test ah,20h ; User Mode ? + jne short OP_4e72_2 + + mov edx,[R_A7] + mov [R_ISP],edx + mov edx,[R_USP] + mov [R_A7],edx +OP_4e72_2: + mov byte [R_SR_H],ah ;T, S & I + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + mov eax,[R_IRQ] + and eax,byte 07H + cmp al,7 ; Always take 7 + je near procint + + mov ebx,[R_SR_H] ; int mask + and ebx,byte 07H + cmp eax,ebx + jg near procint + + xor ecx,ecx + mov [_m68000_ICount],ecx + or byte [R_IRQ],80h + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4e72_1: +; sub esi,byte 2 + mov al,8 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_04e72_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_04e72_Bank: + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4880: ; ext.w D0: + add esi,byte 2 + + and ecx, byte 7 + movsx eax,byte [R_D0+ECX*4] + mov [R_D0+ECX*4],ax + test AX,AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_48c0: ; ext.l D0: + add esi,byte 2 + + and ecx, byte 7 + movsx eax,word [R_D0+ECX*4] + mov [R_D0+ECX*4],eax + test EAX,EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4e73: ; rte: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + test byte [R_SR_H],20h ; Supervisor Mode ? + je near OP_4e73_1 + + mov edi,[R_A7] + add dword [R_A7],byte 6 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov EDI,[Safe_EDI] + add edi,byte 2 + mov esi,eax + mov [R_PC],ESI + mov ecx,EDI + call @cpu_readmem24_dword@4 + xchg esi,eax + test ah,20h ; User Mode ? + jne short OP_4e73_2 + + mov edx,[R_A7] + mov [R_ISP],edx + mov edx,[R_USP] + mov [R_A7],edx +OP_4e73_2: + mov byte [R_SR_H],ah ;T, S & I + and eax,byte 1Fh + mov edx,[IntelFlag+eax*4] + mov [R_XC],dh + and edx,0EFFh + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_04e73_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_04e73_Bank: + sub dword [_m68000_ICount],byte 20 + js near MainExit + +; Check for Interrupt waiting + + test byte [R_IRQ],07H + jne near interrupt + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_4e73_1: +; sub esi,byte 2 + mov al,8 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_14e73_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_14e73_Bank: + sub dword [_m68000_ICount],byte 20 + js near MainExit + +; Check for Interrupt waiting + + test byte [R_IRQ],07H + jne near interrupt + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4a00: ; tst.b D0: + add esi,byte 2 + + and ecx,byte 7 + mov EAX,[R_D0+ECX*4] + test AL,AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4a10: ; tst.b (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4a18: ; tst.b (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + inc dword [R_A0+ECX*4] + cmp ecx, byte 7 ; by Kenjo, for "(A7)+" + jne OP_4a18_notA7 ; + inc dword [R_A0+ECX*4] ; +OP_4a18_notA7: ; + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4a20: ; tst.b -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + dec EDI + cmp ecx, byte 7 ; by Kenjo, for "-(A7)" + jne OP_4a20_notA7 ; + dec EDI ; +OP_4a20_notA7: ; + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4a28: ; tst.b ($4a28,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4a30: ; tst.b ($30,A0,D4.l*2): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_4a30_1 + cwde +OP_4a30_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4a38: ; tst.b $4a38.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4a39: ; tst.b $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24@4 + test AL,AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4a40: ; tst.w D0: + add esi,byte 2 + + and ecx,byte 7 + mov EAX,[R_D0+ECX*4] + test AX,AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4a50: ; tst.w (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test AX,AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4a58: ; tst.w (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test AX,AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4a60: ; tst.w -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test AX,AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 10 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4a68: ; tst.w ($4a68,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test AX,AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4a70: ; tst.w ($70,A0,D4.l*2): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_4a70_1 + cwde +OP_4a70_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test AX,AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4a78: ; tst.w $4a78.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test AX,AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4a79: ; tst.w $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + test AX,AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4a80: ; tst.l D0: + add esi,byte 2 + + and ecx,byte 7 + mov EAX,[R_D0+ECX*4] + test EAX,EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4a90: ; tst.l (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + test EAX,EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4a98: ; tst.l (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 4 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + test EAX,EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4aa0: ; tst.l -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 4 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + test EAX,EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4aa8: ; tst.l ($4aa8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + test EAX,EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4ab0: ; tst.l (-$50,A0,D4.l*2): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_4ab0_1 + cwde +OP_4ab0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + test EAX,EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4ab8: ; tst.l $4ab8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + test EAX,EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4ab9: ; tst.l $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + test EAX,EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4890: ; movem.w D4-D5/A3-A4, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov EDX,dword [esi+ebp] + add esi,byte 2 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov ebx,1 + xor ecx,ecx +OP_4890_Again: + test edx,ebx + je OP_4890_Skip + mov eax,[R_D0+ecx] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + add edi,byte 2 + sub dword [_m68000_ICount],byte 4 +OP_4890_Skip: + add ecx,byte 4h + add ebx,ebx + test bx,bx + jnz OP_4890_Again + pop edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_48a0: ; movem.w D1-D2/A0-A1, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov EDX,dword [esi+ebp] + add esi,byte 2 + and ecx,byte 7 + push ecx + mov edi,[R_A0+ECX*4] + mov ebx,1 + mov ecx,3Ch +OP_48a0_Again: + test edx,ebx + je OP_48a0_Skip + mov eax,[R_D0+ecx] + sub edi,byte 2 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + sub dword [_m68000_ICount],byte 4 +OP_48a0_Skip: + sub ecx,byte 4h + add ebx,ebx + test bx,bx + jnz OP_48a0_Again + pop ecx + mov [R_A0+ECX*4],edi + pop edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_48a8: ; movem.w D3-D5/A3-A4, ($48a8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov EDX,dword [esi+ebp] + add esi,byte 2 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov ebx,1 + xor ecx,ecx +OP_48a8_Again: + test edx,ebx + je OP_48a8_Skip + mov eax,[R_D0+ecx] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + add edi,byte 2 + sub dword [_m68000_ICount],byte 4 +OP_48a8_Skip: + add ecx,byte 4h + add ebx,ebx + test bx,bx + jnz OP_48a8_Again + pop edx + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_48b0: ; movem.w D4-D6/A3-A4, (-$50,A0,D4.l): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov EDX,dword [esi+ebp] + add esi,byte 2 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_48b0_1 + cwde +OP_48b0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov ebx,1 + xor ecx,ecx +OP_48b0_Again: + test edx,ebx + je OP_48b0_Skip + mov eax,[R_D0+ecx] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + add edi,byte 2 + sub dword [_m68000_ICount],byte 4 +OP_48b0_Skip: + add ecx,byte 4h + add ebx,ebx + test bx,bx + jnz OP_48b0_Again + pop edx + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_48b8: ; movem.w D3-D6/A3-A4, $48b8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov EDX,dword [esi+ebp] + add esi,byte 2 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov ebx,1 + xor ecx,ecx +OP_48b8_Again: + test edx,ebx + je OP_48b8_Skip + mov eax,[R_D0+ecx] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + add edi,byte 2 + sub dword [_m68000_ICount],byte 4 +OP_48b8_Skip: + add ecx,byte 4h + add ebx,ebx + test bx,bx + jnz OP_48b8_Again + pop edx + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_48b9: ; movem.w D0-D4/A3-A4, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov EDX,dword [esi+ebp] + add esi,byte 2 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov ebx,1 + xor ecx,ecx +OP_48b9_Again: + test edx,ebx + je OP_48b9_Skip + mov eax,[R_D0+ecx] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_word@8 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + add edi,byte 2 + sub dword [_m68000_ICount],byte 4 +OP_48b9_Skip: + add ecx,byte 4h + add ebx,ebx + test bx,bx + jnz OP_48b9_Again + pop edx + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_48d0: ; movem.l D4-D6/A3-A4, (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov EDX,dword [esi+ebp] + add esi,byte 2 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov ebx,1 + xor ecx,ecx +OP_48d0_Again: + test edx,ebx + je OP_48d0_Skip + mov eax,[R_D0+ecx] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + add edi,byte 4 + sub dword [_m68000_ICount],byte 8 +OP_48d0_Skip: + add ecx,byte 4h + add ebx,ebx + test bx,bx + jnz OP_48d0_Again + pop edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_48e0: ; movem.l D1-D2/A0-A2, -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov EDX,dword [esi+ebp] + add esi,byte 2 + and ecx,byte 7 + push ecx + mov edi,[R_A0+ECX*4] + mov ebx,1 + mov ecx,3Ch +OP_48e0_Again: + test edx,ebx + je OP_48e0_Skip + mov eax,[R_D0+ecx] + sub edi,byte 4 + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + sub dword [_m68000_ICount],byte 8 +OP_48e0_Skip: + sub ecx,byte 4h + add ebx,ebx + test bx,bx + jnz OP_48e0_Again + pop ecx + mov [R_A0+ECX*4],edi + pop edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_48e8: ; movem.l D3-D6/A3-A4, ($48e8,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov EDX,dword [esi+ebp] + add esi,byte 2 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov ebx,1 + xor ecx,ecx +OP_48e8_Again: + test edx,ebx + je OP_48e8_Skip + mov eax,[R_D0+ecx] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + add edi,byte 4 + sub dword [_m68000_ICount],byte 8 +OP_48e8_Skip: + add ecx,byte 4h + add ebx,ebx + test bx,bx + jnz OP_48e8_Again + pop edx + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_48f0: ; movem.l D4-D7/A3-A4, (-$10,A0,D4.l): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov EDX,dword [esi+ebp] + add esi,byte 2 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_48f0_1 + cwde +OP_48f0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov ebx,1 + xor ecx,ecx +OP_48f0_Again: + test edx,ebx + je OP_48f0_Skip + mov eax,[R_D0+ecx] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + add edi,byte 4 + sub dword [_m68000_ICount],byte 8 +OP_48f0_Skip: + add ecx,byte 4h + add ebx,ebx + test bx,bx + jnz OP_48f0_Again + pop edx + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_48f8: ; movem.l D3-D7/A3-A4, $48f8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov EDX,dword [esi+ebp] + add esi,byte 2 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov ebx,1 + xor ecx,ecx +OP_48f8_Again: + test edx,ebx + je OP_48f8_Skip + mov eax,[R_D0+ecx] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + add edi,byte 4 + sub dword [_m68000_ICount],byte 8 +OP_48f8_Skip: + add ecx,byte 4h + add ebx,ebx + test bx,bx + jnz OP_48f8_Again + pop edx + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_48f9: ; movem.l D0-D5/A3-A4, $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov EDX,dword [esi+ebp] + add esi,byte 2 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov ebx,1 + xor ecx,ecx +OP_48f9_Again: + test edx,ebx + je OP_48f9_Skip + mov eax,[R_D0+ecx] + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + add edi,byte 4 + sub dword [_m68000_ICount],byte 8 +OP_48f9_Skip: + add ecx,byte 4h + add ebx,ebx + test bx,bx + jnz OP_48f9_Again + pop edx + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4c90: ; movem.w (A0), D4-D5/A2-A4: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov EDX,dword [esi+ebp] + add esi,byte 2 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov ebx,1 + xor ecx,ecx +OP_4c90_Again: + test edx,ebx + je OP_4c90_Skip + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + mov [R_D0+ecx],eax + add edi,byte 2 + sub dword [_m68000_ICount],byte 4 +OP_4c90_Skip: + add ecx,byte 4 + add ebx,ebx + test bx,bx + jnz OP_4c90_Again + pop edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4c98: ; movem.w (A0)+, D3-D5/A2-A4: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov EDX,dword [esi+ebp] + add esi,byte 2 + and ecx,byte 7 + push ecx + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 4 + mov ebx,1 + xor ecx,ecx +OP_4c98_Again: + test edx,ebx + je OP_4c98_Skip + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + mov [R_D0+ecx],eax + add edi,byte 2 + sub dword [_m68000_ICount],byte 4 +OP_4c98_Skip: + add ecx,byte 4 + add ebx,ebx + test bx,bx + jnz OP_4c98_Again + pop ecx + mov [R_A0+ECX*4],edi + pop edx + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4ca8: ; movem.w ($4ca8,A0), D3-D5/A2-A4: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov EDX,dword [esi+ebp] + add esi,byte 2 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov ebx,1 + xor ecx,ecx +OP_4ca8_Again: + test edx,ebx + je OP_4ca8_Skip + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + mov [R_D0+ecx],eax + add edi,byte 2 + sub dword [_m68000_ICount],byte 4 +OP_4ca8_Skip: + add ecx,byte 4 + add ebx,ebx + test bx,bx + jnz OP_4ca8_Again + pop edx + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4cb0: ; movem.w (-$50,A0,D4.l*4), D4-D6/A2-A4: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov EDX,dword [esi+ebp] + add esi,byte 2 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_4cb0_1 + cwde +OP_4cb0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov ebx,1 + xor ecx,ecx +OP_4cb0_Again: + test edx,ebx + je OP_4cb0_Skip + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + mov [R_D0+ecx],eax + add edi,byte 2 + sub dword [_m68000_ICount],byte 4 +OP_4cb0_Skip: + add ecx,byte 4 + add ebx,ebx + test bx,bx + jnz OP_4cb0_Again + pop edx + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4cb8: ; movem.w $4cb8.w, D3-D6/A2-A4: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov EDX,dword [esi+ebp] + add esi,byte 2 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov ebx,1 + xor ecx,ecx +OP_4cb8_Again: + test edx,ebx + je OP_4cb8_Skip + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + mov [R_D0+ecx],eax + add edi,byte 2 + sub dword [_m68000_ICount],byte 4 +OP_4cb8_Skip: + add ecx,byte 4 + add ebx,ebx + test bx,bx + jnz OP_4cb8_Again + pop edx + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4cb9: ; movem.w $123456.l, D0-D4/A2-A4: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov EDX,dword [esi+ebp] + add esi,byte 2 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov ebx,1 + xor ecx,ecx +OP_4cb9_Again: + test edx,ebx + je OP_4cb9_Skip + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + mov [R_D0+ecx],eax + add edi,byte 2 + sub dword [_m68000_ICount],byte 4 +OP_4cb9_Skip: + add ecx,byte 4 + add ebx,ebx + test bx,bx + jnz OP_4cb9_Again + pop edx + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4cba: ; movem.w ($4cba,PC), D1-D5/A2-A4; ($4cb8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov EDX,dword [esi+ebp] + add esi,byte 2 + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov ebx,1 + xor ecx,ecx +OP_4cba_Again: + test edx,ebx + je OP_4cba_Skip + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + mov [R_D0+ecx],eax + add edi,byte 2 + sub dword [_m68000_ICount],byte 4 +OP_4cba_Skip: + add ecx,byte 4 + add ebx,ebx + test bx,bx + jnz OP_4cba_Again + pop edx + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4cbb: ; movem.w (-$45,PC,D4.l*4), D0-D5/A2-A4: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov EDX,dword [esi+ebp] + add esi,byte 2 + mov edi,esi ; Get PC + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_4cbb_1 + cwde +OP_4cbb_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov ebx,1 + xor ecx,ecx +OP_4cbb_Again: + test edx,ebx + je OP_4cbb_Skip + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + cwde + mov [R_D0+ecx],eax + add edi,byte 2 + sub dword [_m68000_ICount],byte 4 +OP_4cbb_Skip: + add ecx,byte 4 + add ebx,ebx + test bx,bx + jnz OP_4cbb_Again + pop edx + sub dword [_m68000_ICount],byte 26 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4cd0: ; movem.l (A0), D4-D6/A2-A4: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov EDX,dword [esi+ebp] + add esi,byte 2 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov ebx,1 + xor ecx,ecx +OP_4cd0_Again: + test edx,ebx + je OP_4cd0_Skip + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + mov [R_D0+ecx],eax + add edi,byte 4 + sub dword [_m68000_ICount],byte 8 +OP_4cd0_Skip: + add ecx,byte 4 + add ebx,ebx + test bx,bx + jnz OP_4cd0_Again + pop edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4cd8: ; movem.l (A0)+, D3-D6/A2-A4: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov EDX,dword [esi+ebp] + add esi,byte 2 + and ecx,byte 7 + push ecx + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 4 + mov ebx,1 + xor ecx,ecx +OP_4cd8_Again: + test edx,ebx + je OP_4cd8_Skip + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + mov [R_D0+ecx],eax + add edi,byte 4 + sub dword [_m68000_ICount],byte 8 +OP_4cd8_Skip: + add ecx,byte 4 + add ebx,ebx + test bx,bx + jnz OP_4cd8_Again + pop ecx + mov [R_A0+ECX*4],edi + pop edx + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4ce8: ; movem.l ($4ce8,A0), D3-D6/A2-A4: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov EDX,dword [esi+ebp] + add esi,byte 2 + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov ebx,1 + xor ecx,ecx +OP_4ce8_Again: + test edx,ebx + je OP_4ce8_Skip + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + mov [R_D0+ecx],eax + add edi,byte 4 + sub dword [_m68000_ICount],byte 8 +OP_4ce8_Skip: + add ecx,byte 4 + add ebx,ebx + test bx,bx + jnz OP_4ce8_Again + pop edx + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4cf0: ; movem.l (-$10,A0,D4.l*4), D4-D7/A2-A4: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov EDX,dword [esi+ebp] + add esi,byte 2 + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_4cf0_1 + cwde +OP_4cf0_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov ebx,1 + xor ecx,ecx +OP_4cf0_Again: + test edx,ebx + je OP_4cf0_Skip + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + mov [R_D0+ecx],eax + add edi,byte 4 + sub dword [_m68000_ICount],byte 8 +OP_4cf0_Skip: + add ecx,byte 4 + add ebx,ebx + test bx,bx + jnz OP_4cf0_Again + pop edx + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4cf8: ; movem.l $4cf8.w, D3-D7/A2-A4: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov EDX,dword [esi+ebp] + add esi,byte 2 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov ebx,1 + xor ecx,ecx +OP_4cf8_Again: + test edx,ebx + je OP_4cf8_Skip + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + mov [R_D0+ecx],eax + add edi,byte 4 + sub dword [_m68000_ICount],byte 8 +OP_4cf8_Skip: + add ecx,byte 4 + add ebx,ebx + test bx,bx + jnz OP_4cf8_Again + pop edx + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4cf9: ; movem.l $123456.l, D0-D5/A2-A4: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov EDX,dword [esi+ebp] + add esi,byte 2 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov ebx,1 + xor ecx,ecx +OP_4cf9_Again: + test edx,ebx + je OP_4cf9_Skip + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + mov [R_D0+ecx],eax + add edi,byte 4 + sub dword [_m68000_ICount],byte 8 +OP_4cf9_Skip: + add ecx,byte 4 + add ebx,ebx + test bx,bx + jnz OP_4cf9_Again + pop edx + sub dword [_m68000_ICount],byte 28 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4cfa: ; movem.l ($4cfa,PC), D1-D6/A2-A4; ($4cf8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov EDX,dword [esi+ebp] + add esi,byte 2 + movsx EAX,word [esi+ebp] + mov EDI,ESI ; Get PC + add esi,byte 2 + add edi,eax ; Add Offset to PC + mov ebx,1 + xor ecx,ecx +OP_4cfa_Again: + test edx,ebx + je OP_4cfa_Skip + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + mov [R_D0+ecx],eax + add edi,byte 4 + sub dword [_m68000_ICount],byte 8 +OP_4cfa_Skip: + add ecx,byte 4 + add ebx,ebx + test bx,bx + jnz OP_4cfa_Again + pop edx + sub dword [_m68000_ICount],byte 24 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4cfb: ; movem.l (-$5,PC,D4.l*4), D0-D6/A2-A4: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + push edx + mov EDX,dword [esi+ebp] + add esi,byte 2 + mov edi,esi ; Get PC + push edx + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_4cfb_1 + cwde +OP_4cfb_1: + add edi,eax + movsx edx,dl + add edi,edx + pop edx + mov ebx,1 + xor ecx,ecx +OP_4cfb_Again: + test edx,ebx + je OP_4cfb_Skip + mov [R_PC],ESI + mov [Safe_ECX],ECX + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov ECX,[Safe_ECX] + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + mov [R_D0+ecx],eax + add edi,byte 4 + sub dword [_m68000_ICount],byte 8 +OP_4cfb_Skip: + add ecx,byte 4 + add ebx,ebx + test bx,bx + jnz OP_4cfb_Again + pop edx + sub dword [_m68000_ICount],byte 26 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4e50: ; link A0, #$4e50: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + sub dword [R_A7],byte 4 + and ecx, byte 7 + mov eax,[R_A0+ECX*4] + mov edi,[R_A7] + mov [R_A0+ECX*4],edi + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_writemem24_dword@8 + mov EDX,[R_CCR] + movsx EAX,word [esi+ebp] + add esi,byte 2 + add [R_A7],eax + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4e58: ; unlk A0: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + mov ebx,ecx + and ebx, byte 7 + mov edi,[R_A0+EBX*4] + mov [R_PC],ESI + mov [R_CCR],edx + mov [Safe_EDI],EDI + mov ecx,EDI + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov EDX,[R_CCR] + mov EDI,[Safe_EDI] + mov [R_A0+EBX*4],eax + add edi,byte 4 + mov dword [R_A7],EDI + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e000: ; asr.b #8, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + mov EAX,[R_D0+EBX*4] + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + sar AL,cl + mov [R_D0+EBX*4],AL + lahf + movzx edx,ah + mov [R_XC],edx + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e020: ; asr.b D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + mov EAX,[R_D0+EBX*4] + and ecx,byte 7 + mov ECX,[R_D0+ECX*4] + and ecx,byte 63 + jz short OP_e020_1 + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + sar AL,cl + mov [R_D0+EBX*4],AL + lahf + movzx edx,ah + mov [R_XC],edx + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e020_1: + test AL,AL + pushfd + pop EDX + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e040: ; asr.w #8, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + mov EAX,[R_D0+EBX*4] + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + sar AX,cl + mov [R_D0+EBX*4],AX + lahf + movzx edx,ah + mov [R_XC],edx + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e060: ; asr.w D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + mov EAX,[R_D0+EBX*4] + and ecx,byte 7 + mov ECX,[R_D0+ECX*4] + and ecx,byte 63 + jz short OP_e060_1 + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + sar AX,cl + mov [R_D0+EBX*4],AX + lahf + movzx edx,ah + mov [R_XC],edx + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e060_1: + test AX,AX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e080: ; asr.l #8, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + mov EAX,[R_D0+EBX*4] + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + sar EAX,cl + mov [R_D0+EBX*4],EAX + lahf + movzx edx,ah + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e0a0: ; asr.l D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + mov EAX,[R_D0+EBX*4] + and ecx,byte 7 + mov ECX,[R_D0+ECX*4] + and ecx,byte 63 + jz short OP_e0a0_1 + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + sar EAX,cl + mov [R_D0+EBX*4],EAX + lahf + movzx edx,ah + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e0a0_1: + test EAX,EAX + pushfd + pop EDX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e100: ; asl.b #8, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + mov EAX,[R_D0+EBX*4] + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + mov edi,eax ; Save It + xor edx,edx + stc + rcr DL,1 ; d=1xxxx + sar DL,cl ; d=1CCxx + and eax,edx + jz short OP_e100_1_V ; No Overflow + cmp eax,edx + je short OP_e100_1_V ; No Overflow + mov edx,0x800 + jmp short OP_e100_1_OV +OP_e100_1_V: + xor edx,edx +OP_e100_1_OV: + mov eax,edi ; Restore It + sal AL,cl + mov [R_D0+EBX*4],AL + lahf + mov dl,ah + mov [R_XC],edx + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e120: ; asl.b D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + mov EAX,[R_D0+EBX*4] + and ecx,byte 7 + mov ECX,[R_D0+ECX*4] + and ecx,byte 63 + jz short OP_e120_1 + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + mov edi,eax ; Save It + xor edx,edx + stc + rcr DL,1 ; d=1xxxx + sar DL,cl ; d=1CCxx + and eax,edx + jz short OP_e120_1_V ; No Overflow + cmp eax,edx + je short OP_e120_1_V ; No Overflow + mov edx,0x800 + jmp short OP_e120_1_OV +OP_e120_1_V: + xor edx,edx +OP_e120_1_OV: + mov eax,edi ; Restore It + sal AL,cl + mov [R_D0+EBX*4],AL + lahf + mov dl,ah + mov [R_XC],edx + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e120_1: + mov ebx,edx + and ebx,byte 1 + test AL,AL + pushfd + pop EDX + or edx,ebx + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e140: ; asl.w #8, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + mov EAX,[R_D0+EBX*4] + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + mov edi,eax ; Save It + xor edx,edx + stc + rcr DX,1 ; d=1xxxx + sar DX,cl ; d=1CCxx + and eax,edx + jz short OP_e140_1_V ; No Overflow + cmp eax,edx + je short OP_e140_1_V ; No Overflow + mov edx,0x800 + jmp short OP_e140_1_OV +OP_e140_1_V: + xor edx,edx +OP_e140_1_OV: + mov eax,edi ; Restore It + sal AX,cl + mov [R_D0+EBX*4],AX + lahf + mov dl,ah + mov [R_XC],edx + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e160: ; asl.w D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + mov EAX,[R_D0+EBX*4] + and ecx,byte 7 + mov ECX,[R_D0+ECX*4] + and ecx,byte 63 + jz short OP_e160_1 + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + mov edi,eax ; Save It + xor edx,edx + stc + rcr DX,1 ; d=1xxxx + sar DX,cl ; d=1CCxx + and eax,edx + jz short OP_e160_1_V ; No Overflow + cmp eax,edx + je short OP_e160_1_V ; No Overflow + mov edx,0x800 + jmp short OP_e160_1_OV +OP_e160_1_V: + xor edx,edx +OP_e160_1_OV: + mov eax,edi ; Restore It + sal AX,cl + mov [R_D0+EBX*4],AX + lahf + mov dl,ah + mov [R_XC],edx + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e160_1: + mov ebx,edx + and ebx,byte 1 + test AX,AX + pushfd + pop EDX + or edx,ebx + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e180: ; asl.l #8, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + mov EAX,[R_D0+EBX*4] + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + mov edi,eax ; Save It + xor edx,edx + stc + rcr EDX,1 ; d=1xxxx + sar EDX,cl ; d=1CCxx + and eax,edx + jz short OP_e180_1_V ; No Overflow + cmp eax,edx + je short OP_e180_1_V ; No Overflow + mov edx,0x800 + jmp short OP_e180_1_OV +OP_e180_1_V: + xor edx,edx +OP_e180_1_OV: + mov eax,edi ; Restore It + sal EAX,cl + mov [R_D0+EBX*4],EAX + lahf + mov dl,ah + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e1a0: ; asl.l D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + mov EAX,[R_D0+EBX*4] + and ecx,byte 7 + mov ECX,[R_D0+ECX*4] + and ecx,byte 63 + jz short OP_e1a0_1 + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + mov edi,eax ; Save It + xor edx,edx + stc + rcr EDX,1 ; d=1xxxx + sar EDX,cl ; d=1CCxx + and eax,edx + jz short OP_e1a0_1_V ; No Overflow + cmp eax,edx + je short OP_e1a0_1_V ; No Overflow + mov edx,0x800 + jmp short OP_e1a0_1_OV +OP_e1a0_1_V: + xor edx,edx +OP_e1a0_1_OV: + test cl,0e0h + jnz short OP_e1a0_1_32 + + mov eax,edi ; Restore It + sal EAX,cl + mov [R_D0+EBX*4],EAX + lahf + mov dl,ah + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e1a0_1: + mov ebx,edx + and ebx,byte 1 + test EAX,EAX + pushfd + pop EDX + or edx,ebx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + +OP_e1a0_1_32: + mov dl,40h + xor eax,eax + mov [R_D0+EBX*4],EAX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e300: ; asl.b #1, D0: + add esi,byte 2 + + and ecx,byte 7 + sal byte [R_D0+ecx*4],1 + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e340: ; asl.w #1, D0: + add esi,byte 2 + + and ecx,byte 7 + sal word [R_D0+ecx*4],1 + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e380: ; asl.l #1, D0: + add esi,byte 2 + + and ecx,byte 7 + sal long [R_D0+ecx*4],1 + pushfd + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e0d0: ; asr.w (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sar ax,1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e0d8: ; asr.w (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sar ax,1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e0e0: ; asr.w -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sar ax,1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e0e8: ; asr.w (-$1f18,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sar ax,1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e0f0: ; asr.w (-$10,A0,A6.w): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_e0f0_1 + cwde +OP_e0f0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sar ax,1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e0f8: ; asr.w $e0f8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sar ax,1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e0f9: ; asr.w $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sar ax,1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e1d0: ; asl.w (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sal ax,1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e1d8: ; asl.w (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sal ax,1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e1e0: ; asl.w -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sal ax,1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e1e8: ; asl.w (-$1e18,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sal ax,1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e1f0: ; asl.w ($3456): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_e1f0_1 + cwde +OP_e1f0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sal ax,1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e1f8: ; asl.w $e1f8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sal ax,1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e1f9: ; asl.w $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + sal ax,1 + pushfd + mov [R_PC],ESI + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + pop EDX + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e010: ; roxr.b #8, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + mov EAX,[R_D0+EBX*4] + bt dword [R_XC],0 + rcr AL,cl + setc ch + test AL,AL + pushfd + pop EDX + mov [R_D0+EBX*4],AL + test cl,cl + jz OP_e010_1 + or dl,ch + mov [R_XC],dl + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e010_1: + mov ecx,[R_XC] + and ecx,byte 1 + or edx,ecx + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e030: ; roxr.b D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov ECX,[R_D0+ECX*4] + and ecx,byte 63 + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + mov EAX,[R_D0+EBX*4] + bt dword [R_XC],0 + rcr AL,cl + setc ch + test AL,AL + pushfd + pop EDX + mov [R_D0+EBX*4],AL + test cl,cl + jz OP_e030_1 + or dl,ch + mov [R_XC],dl + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e030_1: + mov ecx,[R_XC] + and ecx,byte 1 + or edx,ecx + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e050: ; roxr.w #8, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + mov EAX,[R_D0+EBX*4] + bt dword [R_XC],0 + rcr AX,cl + setc ch + test AX,AX + pushfd + pop EDX + mov [R_D0+EBX*4],AX + test cl,cl + jz OP_e050_1 + or dl,ch + mov [R_XC],dl + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e050_1: + mov ecx,[R_XC] + and ecx,byte 1 + or edx,ecx + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e070: ; roxr.w D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov ECX,[R_D0+ECX*4] + and ecx,byte 63 + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + mov EAX,[R_D0+EBX*4] + bt dword [R_XC],0 + rcr AX,cl + setc ch + test AX,AX + pushfd + pop EDX + mov [R_D0+EBX*4],AX + test cl,cl + jz OP_e070_1 + or dl,ch + mov [R_XC],dl + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e070_1: + mov ecx,[R_XC] + and ecx,byte 1 + or edx,ecx + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e090: ; roxr.l #8, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + mov EAX,[R_D0+EBX*4] + bt dword [R_XC],0 + rcr EAX,cl + setc ch + test EAX,EAX + pushfd + pop EDX + mov [R_D0+EBX*4],EAX + test cl,cl + jz OP_e090_1 + or dl,ch + mov [R_XC],dl + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e090_1: + mov ecx,[R_XC] + and ecx,byte 1 + or edx,ecx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e0b0: ; roxr.l D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov ECX,[R_D0+ECX*4] + and ecx,byte 63 + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + mov EAX,[R_D0+EBX*4] + bt dword [R_XC],0 + rcr EAX,cl + setc ch + test EAX,EAX + pushfd + pop EDX + mov [R_D0+EBX*4],EAX + test cl,cl + jz OP_e0b0_1 + or dl,ch + mov [R_XC],dl + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e0b0_1: + mov ecx,[R_XC] + and ecx,byte 1 + or edx,ecx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e110: ; roxl.b #8, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + mov EAX,[R_D0+EBX*4] + bt dword [R_XC],0 + rcl AL,cl + setc ch + test AL,AL + pushfd + pop EDX + mov [R_D0+EBX*4],AL + test cl,cl + jz OP_e110_1 + or dl,ch + mov [R_XC],dl + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e110_1: + mov ecx,[R_XC] + and ecx,byte 1 + or edx,ecx + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e130: ; roxl.b D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov ECX,[R_D0+ECX*4] + and ecx,byte 63 + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + mov EAX,[R_D0+EBX*4] + bt dword [R_XC],0 + rcl AL,cl + setc ch + test AL,AL + pushfd + pop EDX + mov [R_D0+EBX*4],AL + test cl,cl + jz OP_e130_1 + or dl,ch + mov [R_XC],dl + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e130_1: + mov ecx,[R_XC] + and ecx,byte 1 + or edx,ecx + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e150: ; roxl.w #8, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + mov EAX,[R_D0+EBX*4] + bt dword [R_XC],0 + rcl AX,cl + setc ch + test AX,AX + pushfd + pop EDX + mov [R_D0+EBX*4],AX + test cl,cl + jz OP_e150_1 + or dl,ch + mov [R_XC],dl + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e150_1: + mov ecx,[R_XC] + and ecx,byte 1 + or edx,ecx + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e170: ; roxl.w D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov ECX,[R_D0+ECX*4] + and ecx,byte 63 + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + mov EAX,[R_D0+EBX*4] + bt dword [R_XC],0 + rcl AX,cl + setc ch + test AX,AX + pushfd + pop EDX + mov [R_D0+EBX*4],AX + test cl,cl + jz OP_e170_1 + or dl,ch + mov [R_XC],dl + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e170_1: + mov ecx,[R_XC] + and ecx,byte 1 + or edx,ecx + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e190: ; roxl.l #8, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + mov EAX,[R_D0+EBX*4] + bt dword [R_XC],0 + rcl EAX,cl + setc ch + test EAX,EAX + pushfd + pop EDX + mov [R_D0+EBX*4],EAX + test cl,cl + jz OP_e190_1 + or dl,ch + mov [R_XC],dl + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e190_1: + mov ecx,[R_XC] + and ecx,byte 1 + or edx,ecx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e1b0: ; roxl.l D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov ECX,[R_D0+ECX*4] + and ecx,byte 63 + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + mov EAX,[R_D0+EBX*4] + bt dword [R_XC],0 + rcl EAX,cl + setc ch + test EAX,EAX + pushfd + pop EDX + mov [R_D0+EBX*4],EAX + test cl,cl + jz OP_e1b0_1 + or dl,ch + mov [R_XC],dl + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e1b0_1: + mov ecx,[R_XC] + and ecx,byte 1 + or edx,ecx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e4d0: ; roxr.w (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + bt dword [R_XC],0 + rcr ax,1 + setc bl + test AX,AX + pushfd + pop EDX + or dl,bl + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e4d8: ; roxr.w (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + bt dword [R_XC],0 + rcr ax,1 + setc bl + test AX,AX + pushfd + pop EDX + or dl,bl + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e4e0: ; roxr.w -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + bt dword [R_XC],0 + rcr ax,1 + setc bl + test AX,AX + pushfd + pop EDX + or dl,bl + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e4e8: ; roxr.w (-$1b18,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + bt dword [R_XC],0 + rcr ax,1 + setc bl + test AX,AX + pushfd + pop EDX + or dl,bl + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e4f0: ; roxr.w (-$10,A0,A6.w*4): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_e4f0_1 + cwde +OP_e4f0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + bt dword [R_XC],0 + rcr ax,1 + setc bl + test AX,AX + pushfd + pop EDX + or dl,bl + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e4f8: ; roxr.w $e4f8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + bt dword [R_XC],0 + rcr ax,1 + setc bl + test AX,AX + pushfd + pop EDX + or dl,bl + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e4f9: ; roxr.w $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + bt dword [R_XC],0 + rcr ax,1 + setc bl + test AX,AX + pushfd + pop EDX + or dl,bl + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e5d0: ; roxl.w (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + bt dword [R_XC],0 + rcl ax,1 + setc bl + test AX,AX + pushfd + pop EDX + or dl,bl + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e5d8: ; roxl.w (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + bt dword [R_XC],0 + rcl ax,1 + setc bl + test AX,AX + pushfd + pop EDX + or dl,bl + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + mov [R_XC],edx + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e5e0: ; roxl.w -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + bt dword [R_XC],0 + rcl ax,1 + setc bl + test AX,AX + pushfd + pop EDX + or dl,bl + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + mov [R_XC],edx + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e5e8: ; roxl.w (-$1a18,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + bt dword [R_XC],0 + rcl ax,1 + setc bl + test AX,AX + pushfd + pop EDX + or dl,bl + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e5f0: ; roxl.w ($3456): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_e5f0_1 + cwde +OP_e5f0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + bt dword [R_XC],0 + rcl ax,1 + setc bl + test AX,AX + pushfd + pop EDX + or dl,bl + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + mov [R_XC],edx + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e5f8: ; roxl.w $e5f8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + bt dword [R_XC],0 + rcl ax,1 + setc bl + test AX,AX + pushfd + pop EDX + or dl,bl + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + mov [R_XC],edx + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e5f9: ; roxl.w $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + bt dword [R_XC],0 + rcl ax,1 + setc bl + test AX,AX + pushfd + pop EDX + or dl,bl + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + mov [R_XC],edx + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e008: ; lsr.b #8, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + mov EAX,[R_D0+EBX*4] + shr AL,cl + pushfd + pop EDX + xor dh,dh + mov [R_D0+EBX*4],AL + jecxz OP_e008_1 + mov [R_XC],edx + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e008_1: + and dl,254 ;clear C flag + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e028: ; lsr.b D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov ECX,[R_D0+ECX*4] + and ecx,byte 63 + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + mov EAX,[R_D0+EBX*4] + cmp cl,8 ; 010110 Kenjo + jc OP_e028_0 ; + xor eax,eax ; +OP_e028_0: + shr AL,cl + pushfd + pop EDX + xor dh,dh + mov [R_D0+EBX*4],AL + jecxz OP_e028_1 + mov [R_XC],edx + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e028_1: + and dl,254 ;clear C flag + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e048: ; lsr.w #8, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + mov EAX,[R_D0+EBX*4] + shr AX,cl + pushfd + pop EDX + xor dh,dh + mov [R_D0+EBX*4],AX + jecxz OP_e048_1 + mov [R_XC],edx + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e048_1: + and dl,254 ;clear C flag + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e068: ; lsr.w D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov ECX,[R_D0+ECX*4] + and ecx,byte 63 + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + mov EAX,[R_D0+EBX*4] + cmp cl,16 ; 010110 Kenjo + jc OP_e068_0 ; + xor eax,eax ; +OP_e068_0: + shr AX,cl + pushfd + pop EDX + xor dh,dh + mov [R_D0+EBX*4],AX + jecxz OP_e068_1 + mov [R_XC],edx + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e068_1: + and dl,254 ;clear C flag + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e088: ; lsr.l #8, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + mov EAX,[R_D0+EBX*4] + shr EAX,cl + pushfd + pop EDX + xor dh,dh + mov [R_D0+EBX*4],EAX + jecxz OP_e088_1 + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e088_1: + and dl,254 ;clear C flag + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e0a8: ; lsr.l D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov ECX,[R_D0+ECX*4] + and ecx,byte 63 + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + mov EAX,[R_D0+EBX*4] + cmp cl,32 ; 010110 Kenjo + jc OP_e0a8_0 ; + xor eax,eax ; +OP_e0a8_0: + shr EAX,cl + pushfd + pop EDX + xor dh,dh + mov [R_D0+EBX*4],EAX + jecxz OP_e0a8_1 + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e0a8_1: + and dl,254 ;clear C flag + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e108: ; lsl.b #8, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + mov EAX,[R_D0+EBX*4] + shl AL,cl + pushfd + pop EDX + xor dh,dh + mov [R_D0+EBX*4],AL + jecxz OP_e108_1 + mov [R_XC],edx + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e108_1: + and dl,254 ;clear C flag + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e128: ; lsl.b D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov ECX,[R_D0+ECX*4] + and ecx,byte 63 + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + mov EAX,[R_D0+EBX*4] + cmp cl,8 ; 010110 Kenjo + jc OP_e128_0 ; + xor eax,eax ; +OP_e128_0: + shl AL,cl + pushfd + pop EDX + xor dh,dh + mov [R_D0+EBX*4],AL + jecxz OP_e128_1 + mov [R_XC],edx + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e128_1: + and dl,254 ;clear C flag + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e148: ; lsl.w #8, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + mov EAX,[R_D0+EBX*4] + shl AX,cl + pushfd + pop EDX + xor dh,dh + mov [R_D0+EBX*4],AX + jecxz OP_e148_1 + mov [R_XC],edx + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e148_1: + and dl,254 ;clear C flag + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e168: ; lsl.w D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov ECX,[R_D0+ECX*4] + and ecx,byte 63 + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + mov EAX,[R_D0+EBX*4] + cmp cl,16 ; 010110 Kenjo + jc OP_e168_0 ; + xor eax,eax ; +OP_e168_0: + shl AX,cl + pushfd + pop EDX + xor dh,dh + mov [R_D0+EBX*4],AX + jecxz OP_e168_1 + mov [R_XC],edx + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e168_1: + and dl,254 ;clear C flag + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e188: ; lsl.l #8, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + mov EAX,[R_D0+EBX*4] + shl EAX,cl + pushfd + pop EDX + xor dh,dh + mov [R_D0+EBX*4],EAX + jecxz OP_e188_1 + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e188_1: + and dl,254 ;clear C flag + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e1a8: ; lsl.l D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov ECX,[R_D0+ECX*4] + and ecx,byte 63 + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + mov EAX,[R_D0+EBX*4] + cmp cl,32 ; 010110 Kenjo + jc OP_e1a8_0 ; + xor eax,eax ; +OP_e1a8_0: + shl EAX,cl + pushfd + pop EDX + xor dh,dh + mov [R_D0+EBX*4],EAX + jecxz OP_e1a8_1 + mov [R_XC],edx + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e1a8_1: + and dl,254 ;clear C flag + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e2d0: ; lsr.w (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ax,1 + pushfd + pop EDX + mov [R_XC],edx + xor dh,dh + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov edx,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e2d8: ; lsr.w (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ax,1 + pushfd + pop EDX + mov [R_XC],edx + xor dh,dh + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov edx,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e2e0: ; lsr.w -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ax,1 + pushfd + pop EDX + mov [R_XC],edx + xor dh,dh + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov edx,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e2e8: ; lsr.w (-$1d18,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ax,1 + pushfd + pop EDX + mov [R_XC],edx + xor dh,dh + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov edx,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e2f0: ; lsr.w (-$10,A0,A6.w*2): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_e2f0_1 + cwde +OP_e2f0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ax,1 + pushfd + pop EDX + mov [R_XC],edx + xor dh,dh + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov edx,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e2f8: ; lsr.w $e2f8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ax,1 + pushfd + pop EDX + mov [R_XC],edx + xor dh,dh + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov edx,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e2f9: ; lsr.w $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shr ax,1 + pushfd + pop EDX + mov [R_XC],edx + xor dh,dh + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov edx,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e3d0: ; lsl.w (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shl ax,1 + pushfd + pop EDX + mov [R_XC],edx + xor dh,dh + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov edx,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e3d8: ; lsl.w (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shl ax,1 + pushfd + pop EDX + mov [R_XC],edx + xor dh,dh + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov edx,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e3e0: ; lsl.w -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shl ax,1 + pushfd + pop EDX + mov [R_XC],edx + xor dh,dh + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov edx,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e3e8: ; lsl.w (-$1c18,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shl ax,1 + pushfd + pop EDX + mov [R_XC],edx + xor dh,dh + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov edx,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e3f0: ; lsl.w ($3456): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_e3f0_1 + cwde +OP_e3f0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shl ax,1 + pushfd + pop EDX + mov [R_XC],edx + xor dh,dh + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov edx,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e3f8: ; lsl.w $e3f8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shl ax,1 + pushfd + pop EDX + mov [R_XC],edx + xor dh,dh + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov edx,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e3f9: ; lsl.w $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + shl ax,1 + pushfd + pop EDX + mov [R_XC],edx + xor dh,dh + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov edx,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e018: ; ror.b #8, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + mov EAX,[R_D0+EBX*4] + jecxz OP_e018_1 + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + ror AL,cl + setc ch +OP_e018_1: + test AL,AL + pushfd + pop EDX + or dl,ch + mov [R_D0+EBX*4],AL + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e038: ; ror.b D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov ECX,[R_D0+ECX*4] + and ecx,byte 63 + mov EAX,[R_D0+EBX*4] + jecxz OP_e038_1 + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + ror AL,cl + setc ch +OP_e038_1: + test AL,AL + pushfd + pop EDX + or dl,ch + mov [R_D0+EBX*4],AL + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e058: ; ror.w #8, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + mov EAX,[R_D0+EBX*4] + jecxz OP_e058_1 + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + ror AX,cl + setc ch +OP_e058_1: + test AX,AX + pushfd + pop EDX + or dl,ch + mov [R_D0+EBX*4],AX + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e078: ; ror.w D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov ECX,[R_D0+ECX*4] + and ecx,byte 63 + mov EAX,[R_D0+EBX*4] + jecxz OP_e078_1 + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + ror AX,cl + setc ch +OP_e078_1: + test AX,AX + pushfd + pop EDX + or dl,ch + mov [R_D0+EBX*4],AX + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e098: ; ror.l #8, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + mov EAX,[R_D0+EBX*4] + jecxz OP_e098_1 + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + ror EAX,cl + setc ch +OP_e098_1: + test EAX,EAX + pushfd + pop EDX + or dl,ch + mov [R_D0+EBX*4],EAX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e0b8: ; ror.l D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov ECX,[R_D0+ECX*4] + and ecx,byte 63 + mov EAX,[R_D0+EBX*4] + jecxz OP_e0b8_1 + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + ror EAX,cl + setc ch +OP_e0b8_1: + test EAX,EAX + pushfd + pop EDX + or dl,ch + mov [R_D0+EBX*4],EAX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e118: ; rol.b #8, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + mov EAX,[R_D0+EBX*4] + jecxz OP_e118_1 + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + rol AL,cl + setc ch +OP_e118_1: + test AL,AL + pushfd + pop EDX + or dl,ch + mov [R_D0+EBX*4],AL + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e138: ; rol.b D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov ECX,[R_D0+ECX*4] + and ecx,byte 63 + mov EAX,[R_D0+EBX*4] + jecxz OP_e138_1 + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + rol AL,cl + setc ch +OP_e138_1: + test AL,AL + pushfd + pop EDX + or dl,ch + mov [R_D0+EBX*4],AL + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e158: ; rol.w #8, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + mov EAX,[R_D0+EBX*4] + jecxz OP_e158_1 + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + rol AX,cl + setc ch +OP_e158_1: + test AX,AX + pushfd + pop EDX + or dl,ch + mov [R_D0+EBX*4],AX + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e178: ; rol.w D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov ECX,[R_D0+ECX*4] + and ecx,byte 63 + mov EAX,[R_D0+EBX*4] + jecxz OP_e178_1 + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + rol AX,cl + setc ch +OP_e178_1: + test AX,AX + pushfd + pop EDX + or dl,ch + mov [R_D0+EBX*4],AX + sub dword [_m68000_ICount],byte 6 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e198: ; rol.l #8, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + dec ecx ; Move range down + and ecx,byte 7 ; Mask out lower bits + inc ecx ; correct range + mov EAX,[R_D0+EBX*4] + jecxz OP_e198_1 + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + rol EAX,cl + setc ch +OP_e198_1: + test EAX,EAX + pushfd + pop EDX + or dl,ch + mov [R_D0+EBX*4],EAX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e1b8: ; rol.l D0, D0: + add esi,byte 2 + + mov ebx,ecx + and ebx,byte 7 + shr ecx,byte 9 + and ecx,byte 7 + mov ECX,[R_D0+ECX*4] + and ecx,byte 63 + mov EAX,[R_D0+EBX*4] + jecxz OP_e1b8_1 + mov edx,ecx + add edx,edx + sub dword [_m68000_ICount],edx + rol EAX,cl + setc ch +OP_e1b8_1: + test EAX,EAX + pushfd + pop EDX + or dl,ch + mov [R_D0+EBX*4],EAX + sub dword [_m68000_ICount],byte 8 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e6d0: ; ror.w (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + ror ax,1 + setc bl + test AX,AX + pushfd + pop EDX + or dl,bl + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e6d8: ; ror.w (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + ror ax,1 + setc bl + test AX,AX + pushfd + pop EDX + or dl,bl + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e6e0: ; ror.w -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + ror ax,1 + setc bl + test AX,AX + pushfd + pop EDX + or dl,bl + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e6e8: ; ror.w (-$1918,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + ror ax,1 + setc bl + test AX,AX + pushfd + pop EDX + or dl,bl + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e6f0: ; ror.w (-$10,A0,A6.w*8): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_e6f0_1 + cwde +OP_e6f0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + ror ax,1 + setc bl + test AX,AX + pushfd + pop EDX + or dl,bl + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e6f8: ; ror.w $e6f8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + ror ax,1 + setc bl + test AX,AX + pushfd + pop EDX + or dl,bl + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e6f9: ; ror.w $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + ror ax,1 + setc bl + test AX,AX + pushfd + pop EDX + or dl,bl + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e7d0: ; rol.w (A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + rol ax,1 + setc bl + test AX,AX + pushfd + pop EDX + or dl,bl + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e7d8: ; rol.w (A0)+: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + add dword [R_A0+ECX*4],byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + rol ax,1 + setc bl + test AX,AX + pushfd + pop EDX + or dl,bl + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 12 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e7e0: ; rol.w -(A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + sub EDI,byte 2 + mov [R_A0+ECX*4],EDI + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + rol ax,1 + setc bl + test AX,AX + pushfd + pop EDX + or dl,bl + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 14 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e7e8: ; rol.w (-$1818,A0): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EAX,word [esi+ebp] + mov EDI,[R_A0+ECX*4] + add esi,byte 2 + add edi,eax + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + rol ax,1 + setc bl + test AX,AX + pushfd + pop EDX + or dl,bl + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e7f0: ; rol.w ($3456): + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,[R_A0+ECX*4] + mov EAX,dword [esi+ebp] + add esi,byte 2 + mov edx,eax + shr eax,10 + and eax,byte 3Ch + mov eax,[R_D0+eax] + test dh,8H + jnz short OP_e7f0_1 + cwde +OP_e7f0_1: + add edi,eax + movsx edx,dl + add edi,edx + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + rol ax,1 + setc bl + test AX,AX + pushfd + pop EDX + or dl,bl + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 18 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e7f8: ; rol.w $e7f8.w: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + movsx EDI,word [esi+ebp] + add esi,byte 2 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + rol ax,1 + setc bl + test AX,AX + pushfd + pop EDX + or dl,bl + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_e7f9: ; rol.w $123456.l: + mov [R_PPC],esi ; Keep Previous PC + add esi,byte 2 + + and ecx,byte 7 + mov EDI,dword [esi+ebp] + rol EDI,16 + add esi,byte 4 + mov [R_PC],ESI + and EDI,0FFFFFFh + mov [Safe_ECX],ECX + mov [Safe_EDI],EDI + mov ecx,EDI + call @cpu_readmem24_word@4 + mov ECX,[Safe_ECX] + mov EDI,[Safe_EDI] + rol ax,1 + setc bl + test AX,AX + pushfd + pop EDX + or dl,bl + mov [R_PC],ESI + mov [R_CCR],edx + mov edx,EAX + mov ecx,EDI + call @cpu_writemem24_word@8 + mov EDX,[R_CCR] + sub dword [_m68000_ICount],byte 20 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_a000: ; dc.w $a000; opcode 1010: +; add esi,byte 2 + +; sub esi,byte 2 + mov al,10 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_0a000_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_0a000_Bank: + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_f000: ; 0gen #$123456; (2-3): +; add esi,byte 2 + +; sub esi,byte 2 + mov al,11 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_0f000_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_0f000_Bank: + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +ILLEGAL: +; sub esi,byte 2 + mov eax,4 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_0fffe_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_0fffe_Bank: + or dword [_m68000_ICount],byte 0 + jle near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4e74: ; rtd #$4e74; (1+): + test byte [CPU_TYPE], 3 ; CPU Check + jnz OP_4e74_Cnt ; 030/040? + mov al, 4 + jmp ILLEGAL +OP_4e74_Cnt: + mov [R_PPC],esi ; Keep Previous PC + mov eax,[R_A7] + mov [R_PC],ESI + mov [R_CCR],edx + mov ecx,EAX + and ecx,0FFFFFFh + call @cpu_readmem24_dword@4 + mov EDX,[R_CCR] + movsx EBX,word [esi+ebp] + mov esi,eax + add ebx,byte 4 + add dword [R_A7],ebx + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_04e74_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_04e74_Bank: + sub dword [_m68000_ICount],byte 16 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4e7a: ; movec D4, $e7a; (?): + test byte [CPU_TYPE], 3 ; CPU Check + jnz OP_4e7a_Cnt ; 030/040? + mov al, 4 + jmp ILLEGAL +OP_4e7a_Cnt: + test byte [R_SR_H],20h ; Supervisor Mode ? + jz short OP_4e7a_Trap + movzx ebx,word [esi+ebp+2] + add esi,byte 4 + mov eax,ebx + mov ecx,ebx + shr ebx,12 + and eax,byte 1 + shr ecx,10 + and ecx,2 + or ecx,eax + mov eax,[R_SFC+ecx*4] + mov [R_D0+ebx*4],eax + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4e7a_Trap: +; sub esi,byte 2 + mov al,8 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_04e7a_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_04e7a_Bank: + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4e7b: ; movec D4, $e7b; (?): + test byte [CPU_TYPE], 3 ; CPU Check + jnz OP_4e7b_Cnt ; 030/040? + mov al, 4 + jmp ILLEGAL +OP_4e7b_Cnt: + test byte [R_SR_H],20h ; Supervisor Mode ? + jz short OP_4e7b_Trap + movzx ebx,word [esi+ebp+2] + add esi,byte 4 + mov eax,ebx + mov ecx,ebx + shr ebx,12 + and eax,byte 1 + shr ecx,10 + and ecx,2 + or ecx,eax + mov eax,[R_D0+ebx*4] + test cl,2 + jne short OP_4e7b_Mask + and eax,byte 7 +OP_4e7b_Mask: + mov [R_SFC+ecx*4],eax + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + ALIGN 4 + +OP_4e7b_Trap: +; sub esi,byte 2 + mov al,8 + call Exception + + and esi,0ffffffh + mov eax,esi + shr eax,16 + cmp [asmbank],eax + je OP_04e7b_Bank + mov [asmbank],eax + mov [R_CCR],edx + mov ecx,esi + call @cpu_setOPbase24@4 + mov edx,[R_CCR] + mov ebp,dword [_OP_ROM] +OP_04e7b_Bank: + sub dword [_m68000_ICount],byte 4 + js near MainExit + + movzx ecx,word [esi+ebp] + jmp [OPCODETABLE+ecx*4] + + SECTION .data + + align 16 +_m68000_ICount DD 0 +_m68000_ICountBk DD 0 +_ICount DD 0 + + + +; Register Structure + +_regs +R_D0 DD 0 ; Data Registers +R_D1 DD 0 +R_D2 DD 0 +R_D3 DD 0 +R_D4 DD 0 +R_D5 DD 0 +R_D6 DD 0 +R_D7 DD 0 + +R_A0 DD 0 ; Address Registers +R_A1 DD 0 +R_A2 DD 0 +R_A3 DD 0 +R_A4 DD 0 +R_A5 DD 0 +R_A6 DD 0 +R_A7 DD 0 + +R_ISP DD 0 ; Supervisor Stack +R_SR_H DD 0 ; Status Register High TuSuuIII +R_CCR DD 0 ; CCR Register in Intel Format +R_XC DD 0 ; Extended Carry uuuuuuuX +R_PC DD 0 ; Program Counter +R_IRQ DD 0 ; IRQ Request Level + +R_SR DD 0 ; Motorola Format SR + +R_IRQ_CALLBACK DD 0 ; irq callback (get vector) + +R_PPC DD 0 ; Previous Program Counter +R_RESET_CALLBACK DD 0 ; Reset Callback +R_SFC DD 0 ; Source Function Call +R_DFC DD 0 ; Destination Function Call +R_USP DD 0 ; User Stack +R_VBR DD 0 ; Vector Base +asmbank DD 0 +BusErrorMin: + DD 0 +BusErrorMax: + DD 0 +CPU_TYPE: + DD 0 + + DD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + DD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + DD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + DD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + DD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + DD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + DD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + DD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + +Safe_EBX DD 0 +Safe_ECX DD 0 +Safe_EDI DD 0 + + ALIGN 16 + + +IntelFlag ; Intel Flag Lookup Table + DD 0000h,0001h,0800h,0801h,0040h,0041h,0840h,0841h + DD 0080h,0081h,0880h,0881h,00C0h,00C1h,08C0h,08C1h + DD 0100h,0101h,0900h,0901h,0140h,0141h,0940h,0941h + DD 0180h,0181h,0980h,0981h,01C0h,01C1h,09C0h,09C1h +exception_cycles + DB 0, 0, 0, 0, 38, 42, 44, 38, 38, 0, 38, 38, 0, 0, 0, 0 + DB 0, 0, 0, 0, 0, 0, 0, 0, 46, 46, 46, 46, 46, 46, 46, 46 + DB 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38 + +; RLE Compressed Jump Table + +COMPTABLE + +%include 'x68k/comptab.asm' + + DW 0,0,0 + + ALIGN 4 + SECTION .bss + +OPCODETABLE RESD 65536 diff --git a/x68k/adpcm.c b/x68k/adpcm.c new file mode 100644 index 0000000..9743ee6 --- /dev/null +++ b/x68k/adpcm.c @@ -0,0 +1,331 @@ +// --------------------------------------------------------------------------------------- +// ADPCM.C - ADPCM (OKI MSM6258V) +// な〜んか、X68Sound.dllに比べてカシャカシャした音になるんだよなぁ…… +// DSoundのクセってのもあるけど、それだけじゃなさそうな気もする +// --------------------------------------------------------------------------------------- + +#include + +#include "common.h" +#include "prop.h" +#include "pia.h" +#include "adpcm.h" +#include "dmac.h" + +#define ADPCM_BufSize 96000 +#define ADPCMMAX 2047 +#define ADPCMMIN -2048 +#define FM_IPSCALE 256L + +#define OVERSAMPLEMUL 2 + +#define INTERPOLATE(y, x) \ + (((((((-y[0]+3*y[1]-3*y[2]+y[3]) * x + FM_IPSCALE/2) / FM_IPSCALE \ + + 3 * (y[0]-2*y[1]+y[2])) * x + FM_IPSCALE/2) / FM_IPSCALE \ + - 2*y[0]-3*y[1]+6*y[2]-y[3]) * x + 3*FM_IPSCALE) / (6*FM_IPSCALE) + y[1]) + +static int ADPCM_VolumeShift = 65536; +static const int index_shift[16] = { + -1*16, -1*16, -1*16, -1*16, 2*16, 4*16, 6*16, 8*16, + -1*16, -1*16, -1*16, -1*16, 2*16, 4*16, 6*16, 8*16 }; +static const int ADPCM_Clocks[8] = { + 93750, 125000, 187500, 125000, 46875, 62500, 93750, 62500 }; +static int dif_table[49*16]; +static signed short ADPCM_BufR[ADPCM_BufSize]; +static signed short ADPCM_BufL[ADPCM_BufSize]; + +static long ADPCM_WrPtr = 0; +static long ADPCM_RdPtr = 0; +static DWORD ADPCM_SampleRate = 44100*12; + DWORD ADPCM_ClockRate = 7800*12; +static DWORD ADPCM_Count = 0; +static int ADPCM_Step = 0; +static int ADPCM_Out = 0; +static BYTE ADPCM_Playing = 0; + BYTE ADPCM_Clock = 0; +static int ADPCM_PreCounter = 0; +static int ADPCM_DifBuf = 0; + + +static int ADPCM_Pan = 0x00; +static int OldR = 0, OldL = 0; +static int Outs[8]; +static int OutsIp[4]; +static int OutsIpR[4]; +static int OutsIpL[4]; + +int ADPCM_IsReady(void) +{ + return 1; +} + + +// ----------------------------------------------------------------------- +// てーぶる初期化 +// ----------------------------------------------------------------------- +static void ADPCM_InitTable(void) +{ + int step, n; + double val; + static int bit[16][4] = + { + { 1, 0, 0, 0}, { 1, 0, 0, 1}, { 1, 0, 1, 0}, { 1, 0, 1, 1}, + { 1, 1, 0, 0}, { 1, 1, 0, 1}, { 1, 1, 1, 0}, { 1, 1, 1, 1}, + {-1, 0, 0, 0}, {-1, 0, 0, 1}, {-1, 0, 1, 0}, {-1, 0, 1, 1}, + {-1, 1, 0, 0}, {-1, 1, 0, 1}, {-1, 1, 1, 0}, {-1, 1, 1, 1} + }; + + for (step=0; step<=48; step++) { + val = floor(16.0 * pow ((double)1.1, (double)step)); + for (n=0; n<16; n++) { + dif_table[step*16+n] = bit[n][0] * + (int)(val * bit[n][1] + + val/2 * bit[n][2] + + val/4 * bit[n][3] + + val/8); + } + } +} + + +#define LimitMix(val) { \ + if ( val > 0x7fff ) val = 0x7fff; \ + else if ( val < -0x8000 ) val = -0x8000; \ +} + +// ----------------------------------------------------------------------- +// MPUクロック経過分だけバッファにデータを溜めておく +// ----------------------------------------------------------------------- +void FASTCALL ADPCM_PreUpdate(DWORD clock) +{ + /*if (!ADPCM_Playing) return;*/ + ADPCM_PreCounter += ((ADPCM_ClockRate/24)*clock); + while ( ADPCM_PreCounter>=10000000L ) { // ↓ データの送りすぎ防止(A-JAX)。200サンプリングくらいまでは許そう…。 + ADPCM_DifBuf -= ( (ADPCM_SampleRate*400)/ADPCM_ClockRate ); + if ( ADPCM_DifBuf<=0 ) { + ADPCM_DifBuf = 0; + DMA_Exec(3); + } + ADPCM_PreCounter -= 10000000L; + } +} + + +// ----------------------------------------------------------------------- +// DSoundが指定してくる分だけバッファにデータを書き出す +// ----------------------------------------------------------------------- +void FASTCALL ADPCM_Update(signed short *buffer, DWORD length) +{ + int outs; + signed int outl, outr; + + if ( length<=0 ) return; + while ( length ) { + int tmp; + if ( (ADPCM_WrPtr==ADPCM_RdPtr)&&(!(DMA[3].CCR&0x40)) ) DMA_Exec(3); + if ( ADPCM_WrPtr!=ADPCM_RdPtr ) { + OldR = outr = ADPCM_BufL[ADPCM_RdPtr]; + OldL = outl = ADPCM_BufR[ADPCM_RdPtr]; + ADPCM_RdPtr++; + if ( ADPCM_RdPtr>=ADPCM_BufSize ) ADPCM_RdPtr = 0; + } else { + outr = OldR; + outl = OldL; + } + + if ( Config.Sound_LPF ) { + outr = (int)(outr*40*ADPCM_VolumeShift); + outs = (outr + Outs[3]*2 + Outs[2] + Outs[1]*157 - Outs[0]*61) >> 8; + Outs[2] = Outs[3]; + Outs[3] = outr; + Outs[0] = Outs[1]; + Outs[1] = outs; + } else { + outs = (int)(outr*ADPCM_VolumeShift); + } + + OutsIpR[0] = OutsIpR[1]; + OutsIpR[1] = OutsIpR[2]; + OutsIpR[2] = OutsIpR[3]; + OutsIpR[3] = outs; + + if ( Config.Sound_LPF ) { + outl = (int)(outl*40*ADPCM_VolumeShift); + outs = (outl + Outs[7]*2 + Outs[6] + Outs[5]*157 - Outs[4]*61) >> 8; + Outs[6] = Outs[7]; + Outs[7] = outl; + Outs[4] = Outs[5]; + Outs[5] = outs; + } else { + outs = (int)(outl*ADPCM_VolumeShift); + } + + OutsIpL[0] = OutsIpL[1]; + OutsIpL[1] = OutsIpL[2]; + OutsIpL[2] = OutsIpL[3]; + OutsIpL[3] = outs; + +#if 1 + tmp = INTERPOLATE(OutsIpR, 0); + if ( tmp>32767 ) tmp = 32767; else if ( tmp<(-32768) ) tmp = -32768; + *(buffer++) = (short)tmp; + tmp = INTERPOLATE(OutsIpL, 0); + if ( tmp>32767 ) tmp = 32767; else if ( tmp<(-32768) ) tmp = -32768; + *(buffer++) = (short)tmp; +#else + *(buffer++) = (short)OutsIpR[3]; + *(buffer++) = (short)OutsIpL[3]; +#endif + + length--; + } + + ADPCM_DifBuf = ADPCM_WrPtr-ADPCM_RdPtr; + if ( ADPCM_DifBuf<0 ) ADPCM_DifBuf += ADPCM_BufSize; +} + + +// ----------------------------------------------------------------------- +// 1nibble(4bit)をデコード +// ----------------------------------------------------------------------- +INLINE void ADPCM_WriteOne(int val) +{ + ADPCM_Out += dif_table[ADPCM_Step+val]; + if ( ADPCM_Out>ADPCMMAX ) ADPCM_Out = ADPCMMAX; else if ( ADPCM_Out(48*16) ) ADPCM_Step = (48*16); else if ( ADPCM_Step<0 ) ADPCM_Step = 0; + + if ( OutsIp[0]==-1 ) { + OutsIp[0] = + OutsIp[1] = + OutsIp[2] = + OutsIp[3] = ADPCM_Out; + } else { + OutsIp[0] = OutsIp[1]; + OutsIp[1] = OutsIp[2]; + OutsIp[2] = OutsIp[3]; + OutsIp[3] = ADPCM_Out; + } + + while ( ADPCM_SampleRate>ADPCM_Count ) { + if ( ADPCM_Playing ) { + int ratio = (((ADPCM_Count/100)*FM_IPSCALE)/(ADPCM_SampleRate/100)); + int tmp = INTERPOLATE(OutsIp, ratio); + if ( tmp>ADPCMMAX ) tmp = ADPCMMAX; else if ( tmp=ADPCM_BufSize ) ADPCM_WrPtr = 0; + } + ADPCM_Count += ADPCM_ClockRate; + } + ADPCM_Count -= ADPCM_SampleRate; +} + + +// ----------------------------------------------------------------------- +// I/O Write +// ----------------------------------------------------------------------- +void FASTCALL ADPCM_Write(DWORD adr, BYTE data) +{ + if ( adr==0xe92001 ) { + if ( data&1 ) { + ADPCM_Playing = 0; + } else if ( data&2 ) { + if ( !ADPCM_Playing ) { + ADPCM_Step = 0; + ADPCM_Out = 0; + OldL = OldR = -2; + ADPCM_Playing = 1; + } + OutsIp[0] = OutsIp[1] = OutsIp[2] = OutsIp[3] = -1; + } + } else if ( adr==0xe92003 ) { + if ( ADPCM_Playing ) { + ADPCM_WriteOne((int)(data&15)); + ADPCM_WriteOne((int)((data>>4)&15)); + } + } +} + + +// ----------------------------------------------------------------------- +// I/O Read(ステータスチェック) +// ----------------------------------------------------------------------- +BYTE FASTCALL ADPCM_Read(DWORD adr) +{ + if ( adr==0xe92001 ) + return ((ADPCM_Playing)?0xc0:0x40); + else + return 0x00; +} + + +// ----------------------------------------------------------------------- +// ぼりゅーむ +// ----------------------------------------------------------------------- +void ADPCM_SetVolume(BYTE vol) +{ + if ( vol>16 ) vol=16; +// if ( vol<0 ) vol=0; + + if ( vol ) + ADPCM_VolumeShift = (int)((double)16/pow(1.189207115, (16-vol))); + else + ADPCM_VolumeShift = 0; // Mute +} + + +// ----------------------------------------------------------------------- +// Panning +// ----------------------------------------------------------------------- +void ADPCM_SetPan(int n) +{ + if ( (ADPCM_Pan&0x0c)!=(n&0x0c) ) { + ADPCM_Count = 0; + ADPCM_Clock = (ADPCM_Clock&4)|((n>>2)&3); + ADPCM_ClockRate = ADPCM_Clocks[ADPCM_Clock]; + } + ADPCM_Pan = n; +} + + +// ----------------------------------------------------------------------- +// Clock +// ----------------------------------------------------------------------- +void ADPCM_SetClock(int n) +{ + if ( (ADPCM_Clock&4)!=n ) { + ADPCM_Count = 0; + ADPCM_Clock = n|((ADPCM_Pan>>2)&3); + ADPCM_ClockRate = ADPCM_Clocks[ADPCM_Clock]; + } +} + + +// ----------------------------------------------------------------------- +// 初期化 +// ----------------------------------------------------------------------- +void ADPCM_Init(DWORD samplerate) +{ + ADPCM_WrPtr = 0; + ADPCM_RdPtr = 0; + ADPCM_Out = 0; + ADPCM_Step = 0; + ADPCM_Playing = 0; + ADPCM_SampleRate = (samplerate*12); + ADPCM_PreCounter = 0; + memset(Outs, 0, sizeof(Outs)); + OutsIp[0] = OutsIp[1] = OutsIp[2] = OutsIp[3] = -1; + OutsIpR[0] = OutsIpR[1] = OutsIpR[2] = OutsIpR[3] = 0; + OutsIpL[0] = OutsIpL[1] = OutsIpL[2] = OutsIpL[3] = 0; + OldL = OldR = 0; + + ADPCM_SetPan(0x0b); + ADPCM_InitTable(); +} diff --git a/x68k/adpcm.h b/x68k/adpcm.h new file mode 100644 index 0000000..9b6fe18 --- /dev/null +++ b/x68k/adpcm.h @@ -0,0 +1,20 @@ +#ifndef _winx68k_adpcm_h +#define _winx68k_adpcm_h + +extern BYTE ADPCM_Clock; +extern DWORD ADPCM_ClockRate; + +void FASTCALL ADPCM_PreUpdate(DWORD clock); +void FASTCALL ADPCM_Update(signed short *buffer, DWORD length); + +void FASTCALL ADPCM_Write(DWORD adr, BYTE data); +BYTE FASTCALL ADPCM_Read(DWORD adr); + +void ADPCM_SetVolume(BYTE vol); +void ADPCM_SetPan(int n); +void ADPCM_SetClock(int n); + +void ADPCM_Init(DWORD samplerate); +int ADPCM_IsReady(void); + +#endif diff --git a/x68k/bg.c b/x68k/bg.c new file mode 100644 index 0000000..2239b3d --- /dev/null +++ b/x68k/bg.c @@ -0,0 +1,608 @@ +// --------------------------------------------------------------------------------------- +// BG.C - BGとスプライト +// ToDo:透明色の処理チェック(特に対Text間) +// --------------------------------------------------------------------------------------- + +#include "common.h" +#include "windraw.h" +#include "winx68k.h" +#include "palette.h" +#include "tvram.h" +#include "crtc.h" +#include "bg.h" + +#include "m68000.h" +#include "memory.h" + + BYTE BG[0x8000]; + BYTE Sprite_Regs[0x800]; + BYTE BG_Regs[0x12]; + WORD BG_CHREND = 0; + WORD BG_BG0TOP = 0; + WORD BG_BG0END = 0; + WORD BG_BG1TOP = 0; + WORD BG_BG1END = 0; + BYTE BG_CHRSIZE = 16; + DWORD BG_AdrMask = 511; + DWORD BG0ScrollX = 0, BG0ScrollY = 0; + DWORD BG1ScrollX = 0, BG1ScrollY = 0; + + long BG_HAdjust = 0; + long BG_VLINE = 0; + + BYTE BG_Dirty0[64*64]; + BYTE BG_Dirty1[64*64]; + BYTE BGCHR8[8*8*256]; + BYTE BGCHR16[16*16*256]; + + WORD BG_LineBuf[1600]; + WORD BG_PriBuf[1600]; + + DWORD VLINEBG = 0; + + +// ----------------------------------------------------------------------- +// 初期化 +// ----------------------------------------------------------------------- +void BG_Init(void) +{ + DWORD i; + ZeroMemory(Sprite_Regs, 0x800); + ZeroMemory(BG, 0x8000); + ZeroMemory(BGCHR8, 8*8*256); + ZeroMemory(BGCHR16, 16*16*256); + ZeroMemory(BG_LineBuf, 1600*2); + for (i=0; i<0x12; i++) + BG_Write(0xeb0800+i, 0); + BG_CHREND = 0x8000; +} + + +// ----------------------------------------------------------------------- +// I/O Read +// ----------------------------------------------------------------------- +BYTE FASTCALL BG_Read(DWORD adr) +{ + if ((adr>=0xeb0000)&&(adr<0xeb0400)) + { + adr -= 0xeb0000; + adr ^= 1; + return Sprite_Regs[adr]; + } + else if ((adr>=0xeb0800)&&(adr<0xeb0812)) + return BG_Regs[adr-0xeb0800]; + else if ((adr>=0xeb8000)&&(adr<0xec0000)) + return BG[adr-0xeb8000]; + else + return 0xff; +} + + +// ----------------------------------------------------------------------- +// I/O Write +// ----------------------------------------------------------------------- +void FASTCALL BG_Write(DWORD adr, BYTE data) +{ + DWORD bg16chr; + int s1, s2, v = 0; + s1 = (((BG_Regs[0x11] &4)?2:1)-((BG_Regs[0x11] &16)?1:0)); + s2 = (((CRTC_Regs[0x29]&4)?2:1)-((CRTC_Regs[0x29]&16)?1:0)); + if ( !(BG_Regs[0x11]&16) ) v = ((BG_Regs[0x0f]>>s1)-(CRTC_Regs[0x0d]>>s2)); + if ((adr>=0xeb0000)&&(adr<0xeb0400)) + { + adr &= 0x3ff; + adr ^= 1; + if (Sprite_Regs[adr] != data) + { +#ifdef USE_ASM + _asm + { + mov ebx, adr + and ebx, 3f8h + mov bx, word ptr Sprite_Regs[ebx+2] + sub bx, 16 + add ebx, BG_VLINE + sub ebx, v + and ebx, 3ffh + mov al, 16 + spsetdirtylp1: + mov byte ptr TextDirtyLine[ebx], 1 + inc bx + and bx, 3ffh + dec al + jnz spsetdirtylp1 + } + Sprite_Regs[adr] = data; + _asm + { + mov ebx, adr + and ebx, 3f8h + mov bx, word ptr Sprite_Regs[ebx+2] + sub bx, 16 + add ebx, BG_VLINE + sub ebx, v + and ebx, 3ffh + mov al, 16 + spsetdirtylp2: + mov byte ptr TextDirtyLine[ebx], 1 + inc bx + and bx, 3ffh + dec al + jnz spsetdirtylp2 + } +#elif defined(USE_GAS) && defined(__i386__) + asm ( + "mov %0, %%ebx;" + "and $0x3f8, %%ebx;" + "mov Sprite_Regs + 2(%%ebx), %%bx;" + "sub $16, %%bx;" + "add (%1), %%ebx;" + "sub %2, %%ebx;" + "and $0x3ff, %%ebx;" + "mov $16, %%al;" + "0:" + "movb $1, TextDirtyLine(%%ebx);" + "inc %%bx;" + "and $0x3ff, %%bx;" + "dec %%al;" + "jnz 0b;" + : /* output: nothing */ + : "m" (adr), "g" (BG_VLINE), "m" (v) + : "ax", "bx", "memory"); + + Sprite_Regs[adr] = data; + + asm ( + "mov %0, %%ebx;" + "and $0x3f8, %%ebx;" + "mov Sprite_Regs + 2(%%ebx), %%bx;" + "sub $16, %%bx;" + "add (%1), %%ebx;" + "sub %2, %%ebx;" + "and $0x3ff, %%ebx;" + "mov $16, %%al;" + "0:" + "movb $1, TextDirtyLine(%%ebx);" + "inc %%bx;" + "and $0x3ff, %%bx;" + "dec %%al;" + "jnz 0b;" + : /* output: nothing */ + : "m" (adr), "g" (BG_VLINE), "m" (v) + : "ax", "bx", "memory"); +#else /* !USE_ASM && !(USE_GAS && __i386__) */ + WORD t, *pw = (WORD *)Sprite_Regs; + int i; + + t = (pw[((adr-v) & 0x3f8) + 1] - 16 + BG_VLINE) & 0x3ff; + for (i = 0; i < 16; i++) { + TextDirtyLine[t] = 1; + t = (t + 1) & 0x3ff; + } + + Sprite_Regs[adr] = data; + + t = (pw[((adr-v) & 0x3f8) + 1] - 16 + BG_VLINE) & 0x3ff; + for (i = 0; i < 16; i++) { + TextDirtyLine[t] = 1; + t = (t + 1) & 0x3ff; + } +#endif /* USE_ASM */ + } + } + else if ((adr>=0xeb0800)&&(adr<0xeb0812)) + { + adr -= 0xeb0800; + if (BG_Regs[adr]==data) return; // データに変化が無ければ帰る + BG_Regs[adr] = data; + switch(adr) + { + case 0x00: + case 0x01: + BG0ScrollX = (((DWORD)BG_Regs[0x00]<<8)+BG_Regs[0x01])&BG_AdrMask; + TVRAM_SetAllDirty(); + break; + case 0x02: + case 0x03: + BG0ScrollY = (((DWORD)BG_Regs[0x02]<<8)+BG_Regs[0x03])&BG_AdrMask; + TVRAM_SetAllDirty(); + break; + case 0x04: + case 0x05: + BG1ScrollX = (((DWORD)BG_Regs[0x04]<<8)+BG_Regs[0x05])&BG_AdrMask; + TVRAM_SetAllDirty(); + break; + case 0x06: + case 0x07: + BG1ScrollY = (((DWORD)BG_Regs[0x06]<<8)+BG_Regs[0x07])&BG_AdrMask; + TVRAM_SetAllDirty(); + break; + + case 0x08: // BG On/Off Changed + TVRAM_SetAllDirty(); + break; + + case 0x0d: + BG_HAdjust = ((long)BG_Regs[0x0d]-(CRTC_HSTART+4))*8; // 水平方向は解像度による1/2はいらない?(Tetris) + TVRAM_SetAllDirty(); + break; + case 0x0f: + BG_VLINE = ((long)BG_Regs[0x0f]-CRTC_VSTART)/((BG_Regs[0x11]&4)?1:2); // BGとその他がずれてる時の差分 + TVRAM_SetAllDirty(); + break; + + case 0x11: // BG ScreenRes Changed + if (data&3) + { + if ((BG_BG0TOP==0x4000)||(BG_BG1TOP==0x4000)) + BG_CHREND = 0x4000; + else if ((BG_BG0TOP==0x6000)||(BG_BG1TOP==0x6000)) + BG_CHREND = 0x6000; + else + BG_CHREND = 0x8000; + } + else + BG_CHREND = 0x2000; + BG_CHRSIZE = ((data&3)?16:8); + BG_AdrMask = ((data&3)?1023:511); + BG_HAdjust = ((long)BG_Regs[0x0d]-(CRTC_HSTART+4))*8; // 水平方向は解像度による1/2はいらない?(Tetris) + BG_VLINE = ((long)BG_Regs[0x0f]-CRTC_VSTART)/((BG_Regs[0x11]&4)?1:2); // BGとその他がずれてる時の差分 + break; + case 0x09: // BG Plane Cfg Changed + TVRAM_SetAllDirty(); + if (data&0x08) + { + if (data&0x30) + { + BG_BG1TOP = 0x6000; + BG_BG1END = 0x8000; + } + else + { + BG_BG1TOP = 0x4000; + BG_BG1END = 0x6000; + } + } + else + BG_BG1TOP = BG_BG1END = 0; + if (data&0x01) + { + if (data&0x06) + { + BG_BG0TOP = 0x6000; + BG_BG0END = 0x8000; + } + else + { + BG_BG0TOP = 0x4000; + BG_BG0END = 0x6000; + } + } + else + BG_BG0TOP = BG_BG0END = 0; + if (BG_Regs[0x11]&3) + { + if ((BG_BG0TOP==0x4000)||(BG_BG1TOP==0x4000)) + BG_CHREND = 0x4000; + else if ((BG_BG0TOP==0x6000)||(BG_BG1TOP==0x6000)) + BG_CHREND = 0x6000; + else + BG_CHREND = 0x8000; + } + break; + case 0x0b: + break; + } + Draw_DrawFlag = 1; + + } + else if ((adr>=0xeb8000)&&(adr<0xec0000)) + { + adr -= 0xeb8000; + if (BG[adr]==data) return; // データに変化が無ければ帰る + BG[adr] = data; + if (adr<0x2000) + { + BGCHR8[adr*2] = data>>4; + BGCHR8[adr*2+1] = data&15; + } + bg16chr = ((adr&3)*2)+((adr&0x3c)*4)+((adr&0x40)>>3)+((adr&0x7f80)*2); + BGCHR16[bg16chr] = data>>4; + BGCHR16[bg16chr+1] = data&15; + + if (adr=BG_BG1TOP)&&(adr=BG_BG0TOP)&&(adr= 0; --n) { + if ((sct[n].sprite_ply & 3) == pri) { + SPRITECTRLTBL_T *sctp = &sct[n]; + + t = (sctp->sprite_posx + BG_HAdjust) & 0x3ff; + if (t > TextDotX + 16) + continue; + + y = sct->sprite_posy & 0x3ff; + y -= VLINEBG; + y += BG_VLINE; + y = -y; + y += 16; + + // add y, 16; jnc .spline_lpcnt + if (y <= 15) { + BYTE *p; + DWORD pal; + int i; + + if (sctp->sprite_ctrl < 0x4000) { + // spline_flipx + p = &BGCHR16[(sctp->sprite_ctrl * 256) + (y * 16)]; + + for (i = 0; i < 16; ++i, ++t) { + pal = *p++ & 0xf; + if (pal) { + pal |= (sctp->sprite_ctrl >> 4) & 0xf0; + if (BG_PriBuf[t] >= n) { + BG_LineBuf[t] = TextPal[pal]; + Text_TrFlag[t] |= 2; + BG_PriBuf[t] = n; + } + } + } + } else { + // spline_fxflipx + p = &BGCHR16[(sctp->sprite_ctrl * 256) + (y * 16)]; + + for (i = 0; i < 16; ++i, ++t) { + pal = *p-- & 0xf; + if (pal) { + pal |= (sctp->sprite_ctrl >> 4) & 0xf0; + if (BG_PriBuf[t] >= n) { + BG_LineBuf[t] = TextPal[pal]; + Text_TrFlag[t] |= 2; + BG_PriBuf[t] = n; + } + } + } + } + } + } + } +} + +INLINE void +BG_DrawLineMcr8(int bg) +{ + WORD *bgtop; + DWORD *bgscrx, *bgscry; + DWORD x, y; + DWORD t0, t1; + + if (bg == 0) { + bgtop = &BG_BG0TOP; + bgscrx = &BG0ScrollX; + bgscry = &BG0ScrollY; + } else { + bgtop = &BG_BG1TOP; + bgscrx = &BG1ScrollX; + bgscry = &BG1ScrollY; + } + + t0 = (*bgscry + VLINEBG) - BG_VLINE; + t1 = *bgscrx - BG_HAdjust; + + y = *bgtop + (t0 & 0x1f8) << 4; + x = (y1 & 0x1f8) >> 2; + + esi = BG[x + y]; +} + +INLINE void +BG_DrawLineMcr16(int bg) +{ +} + +INLINE void +BG_DrawLineMcr8_ng(int bg) +{ +} + +INLINE void +BG_DrawLineMcr16_ng(int bg) +{ +} + +LABEL void FASTCALL +BG_DrawLine(int opaq, int gd) +{ + int i; + + if (opaq) { + for (i = 16; i < TextDotX + 16; ++i) { + BG_LineBuf[i] = TextPal[0]; + BG_PriBuf[i] = 0xffff; + } + } else { + for (i = 16; i < TextDotX + 16; ++i) { + BG_PriBuf[i] = 0xffff; + } + } + + if (gd) { + Sprite_DrawLineMcr(1); + Sprite_DrawLineMcr(2); + if (BG_Regs[9] & 1) { + if (BG_CHRSIZE == 8) { + BG_DrawLineMcr8(0); + } else { + BG_DrawLineMcr16(0); + } + } + } else { + Sprite_DrawLineMcr(1); + if (BG_CHRSIZE == 8) { + if (BG_Regs[9] & 8) { + BG_DrawLineMcr8_ng(1); + } + Sprite_DrawLineMcr(2); + if (BG_Regs[9] & 1) { + BG_DrawLineMcr8_ng(0); + } + } else { + if (BG_Regs[9] & 8) { + BG_DrawLineMcr16_ng(1); + } + Sprite_DrawLineMcr(2); + if (BG_Regs[9] & 1) { + BG_DrawLineMcr16_ng(0); + } + } + } + Sprite_DrawLineMcr(3); +} +#endif /* USE_ASM */ diff --git a/x68k/bg.h b/x68k/bg.h new file mode 100644 index 0000000..365f10d --- /dev/null +++ b/x68k/bg.h @@ -0,0 +1,29 @@ +#ifndef _winx68k_bg +#define _winx68k_bg + +#include "common.h" + +extern BYTE BG_DrawWork0[1024*1024]; +extern BYTE BG_DrawWork1[1024*1024]; +extern DWORD BG0ScrollX, BG0ScrollY; +extern DWORD BG1ScrollX, BG1ScrollY; +extern DWORD BG_AdrMask; +extern BYTE BG_CHRSIZE; +extern BYTE BG_Regs[0x12]; +extern WORD BG_BG0TOP; +extern WORD BG_BG1TOP; +extern long BG_HAdjust; +extern long BG_VLINE; +extern DWORD VLINEBG; + +extern BYTE Sprite_DrawWork[1024*1024]; +extern WORD BG_LineBuf[1600]; + +void BG_Init(void); + +BYTE FASTCALL BG_Read(DWORD adr); +void FASTCALL BG_Write(DWORD adr, BYTE data); + +void FASTCALL BG_DrawLine(int opaq, int gd); + +#endif diff --git a/x68k/bg.x86 b/x68k/bg.x86 new file mode 100644 index 0000000..2f4c82a --- /dev/null +++ b/x68k/bg.x86 @@ -0,0 +1,346 @@ +#define BGOUT_BUFFER (BG_LineBuf) // �o���o�b�t�@�������� + +#define BG_DrawLineMcr8(label, bgtop, scrx, scry) \ + __asm { mov edx, scry } \ + __asm { add edx, VLINEBG } \ + __asm { sub edx, BG_VLINE } \ + __asm { mov ebp, edx } \ + __asm { and ebp, 7 } \ + __asm { shl bp, 3 } \ + __asm { and edx, 01f8h } \ + __asm { shl edx, 4 } \ + __asm { add dx, bgtop } \ + __asm { mov eax, scrx } \ + __asm { sub eax, BG_HAdjust } \ + __asm { mov ecx, eax } \ + __asm { and eax, 7 } \ + __asm { xor al, 15 } \ + __asm { mov edi, eax } \ + __asm { and ecx, 01f8h } \ + __asm { shr cx, 2 } \ + __asm { mov ebx, TextDotX } \ + __asm { shl ebx, 13 } \ +bg8_##label##_linelp: \ + __asm { movzx esi, word ptr BG[ecx+edx] } \ + __asm { mov bx, si } \ + __asm { and si, 0ff00h } \ + __asm { shr si, 2 } \ + __asm { cmp bl, 40h } \ + __asm { jc bg8_##label##_flipx } \ + __asm { js bg8_##label##_fxflipy } \ + __asm { jge bg8_##label##_fxflipx } \ + __asm { add esi, offset BGCHR8 + 00000038h } \ + __asm { sub esi, ebp } \ + __asm { jmp bg8_##label##_flip } \ +bg8_##label##_fxflipy: \ + __asm { add esi, offset BGCHR8 + 0000003fh } \ + __asm { sub esi, ebp } \ + __asm { std } \ + __asm { jmp bg8_##label##_out } \ +bg8_##label##_fxflipx: \ + __asm { lea esi, BGCHR8[esi+ebp+7] } \ + __asm { std } \ + __asm { jmp bg8_##label##_out } \ +bg8_##label##_flipx: \ + __asm { lea esi, BGCHR8[esi+ebp] } \ +bg8_##label##_flip: \ + __asm { cld } \ +bg8_##label##_out: \ + __asm { mov bh, 8 } \ + __asm { shl bl, 4 } \ +bg8_##label##_outlp: \ + __asm { lodsb } \ + __asm { or al, bl } \ + __asm { and ax, 00ffh } \ + __asm { je bg8_##label##_outed } \ + __asm { test ax, 000fh } \ + __asm { mov ax, word ptr TextPal[eax*2] } \ + __asm { jne bg8_##label##_outcont } \ + __asm { test byte ptr (Text_TrFlag+1)[edi], 2 } \ + __asm { jne bg8_##label##_outed } \ +bg8_##label##_outcont: \ + __asm { mov word ptr (BG_LineBuf+2)[edi*2], ax } \ + __asm { or byte ptr (Text_TrFlag+1)[edi], 2 } \ +bg8_##label##_outed: \ + __asm { inc edi } \ + __asm { dec bh } \ + __asm { jne bg8_##label##_outlp } \ + __asm { add cl, 2 } \ + __asm { and cl, 7fh } \ + __asm { sub ebx, 10000h } \ + __asm { jns bg8_##label##_linelp } + + +#define BG_DrawLineMcr16(label, bgtop, scrx, scry) \ + __asm { mov edx, scry } \ + __asm { add edx, VLINEBG } \ + __asm { sub edx, BG_VLINE } \ + __asm { mov ebp, edx } \ + __asm { and ebp, 15 } \ + __asm { shl bp, 4 } \ + __asm { and edx, 03f0h } \ + __asm { shl edx, 3 } \ + __asm { add dx, bgtop } \ + __asm { mov eax, scrx } \ + __asm { sub eax, BG_HAdjust } \ + __asm { mov ecx, eax } \ + __asm { and eax, 15 } \ + __asm { xor al, 15 } \ + __asm { mov edi, eax } \ + __asm { and ecx, 03f0h } \ + __asm { shr cx, 3 } \ + __asm { mov ebx, TextDotX } \ + __asm { shl ebx, 12 } \ +bg16_##label##_linelp: \ + __asm { movzx esi, word ptr BG[ecx+edx] } \ + __asm { mov bx, si } \ + __asm { and si, 0ff00h } \ + __asm { cmp bl, 40h } \ + __asm { jc bg16_##label##_flipx } \ + __asm { js bg16_##label##_fxflipy } \ + __asm { jge bg16_##label##_fxflipx } \ + __asm { add esi, offset BGCHR16 + 000000f0h } \ + __asm { sub esi, ebp } \ + __asm { jmp bg16_##label##_flip } \ +bg16_##label##_fxflipy: \ + __asm { add esi, offset BGCHR16 + 000000ffh } \ + __asm { sub esi, ebp } \ + __asm { std } \ + __asm { jmp bg16_##label##_out } \ +bg16_##label##_fxflipx: \ + __asm { lea esi, BGCHR16[esi+ebp+15] } \ + __asm { std } \ + __asm { jmp bg16_##label##_out } \ +bg16_##label##_flipx: \ + __asm { lea esi, BGCHR16[esi+ebp] } \ +bg16_##label##_flip: \ + __asm { cld } \ +bg16_##label##_out: \ + __asm { mov bh, 16 } \ + __asm { shl bl, 4 } \ +bg16_##label##_outlp: \ + __asm { lodsb } \ + __asm { or al, bl } \ + __asm { and ax, 00ffh } \ + __asm { je bg16_##label##_outed } \ + __asm { test ax, 000fh } \ + __asm { mov ax, word ptr TextPal[eax*2] } \ + __asm { jne bg16_##label##_outcont } \ + __asm { test byte ptr (Text_TrFlag+1)[edi], 2 } \ + __asm { jne bg16_##label##_outed } \ +bg16_##label##_outcont: \ + __asm { mov word ptr (BG_LineBuf+2)[edi*2], ax } \ + __asm { or byte ptr (Text_TrFlag+1)[edi], 2 } \ +bg16_##label##_outed: \ + __asm { inc edi } \ + __asm { dec bh } \ + __asm { jne bg16_##label##_outlp } \ + __asm { add cl, 2 } \ + __asm { and cl, 7fh } \ + __asm { sub ebx, 10000h } \ + __asm { jns bg16_##label##_linelp } + + + +#define BG_DrawLineMcr8_ng(label, bgtop, scrx, scry) \ + __asm { mov edx, scry } \ + __asm { add edx, VLINEBG } \ + __asm { sub edx, BG_VLINE } \ + __asm { mov ebp, edx } \ + __asm { and ebp, 7 } \ + __asm { shl bp, 3 } \ + __asm { and edx, 01f8h } \ + __asm { shl edx, 4 } \ + __asm { add dx, bgtop } \ + __asm { mov eax, scrx } \ + __asm { sub eax, BG_HAdjust } \ + __asm { mov ecx, eax } \ + __asm { and eax, 7 } \ + __asm { xor al, 15 } \ + __asm { mov edi, eax } \ + __asm { and ecx, 01f8h } \ + __asm { shr cx, 2 } \ + __asm { mov ebx, TextDotX } \ + __asm { shl ebx, 13 } \ +bg8_ng_##label##_linelp: \ + __asm { movzx esi, word ptr BG[ecx+edx] } \ + __asm { mov bx, si } \ + __asm { and si, 0ff00h } \ + __asm { shr si, 2 } \ + __asm { cmp bl, 40h } \ + __asm { jc bg8_ng_##label##_flipx } \ + __asm { js bg8_ng_##label##_fxflipy } \ + __asm { jge bg8_ng_##label##_fxflipx } \ + __asm { add esi, offset BGCHR8 + 00000038h } \ + __asm { sub esi, ebp } \ + __asm { jmp bg8_ng_##label##_flip } \ +bg8_ng_##label##_fxflipy: \ + __asm { add esi, offset BGCHR8 + 0000003fh } \ + __asm { sub esi, ebp } \ + __asm { std } \ + __asm { jmp bg8_ng_##label##_out } \ +bg8_ng_##label##_fxflipx: \ + __asm { lea esi, BGCHR8[esi+ebp+7] } \ + __asm { std } \ + __asm { jmp bg8_ng_##label##_out } \ +bg8_ng_##label##_flipx: \ + __asm { lea esi, BGCHR8[esi+ebp] } \ +bg8_ng_##label##_flip: \ + __asm { cld } \ +bg8_ng_##label##_out: \ + __asm { mov bh, 8 } \ + __asm { shl bl, 4 } \ +bg8_ng_##label##_outlp: \ + __asm { lodsb } \ + __asm { and ax, 000fh } \ + __asm { je bg8_ng_##label##_outed } \ + __asm { or al, bl } \ + __asm { mov ax, word ptr TextPal[eax*2] } \ + __asm { mov word ptr (BG_LineBuf+2)[edi*2], ax } \ + __asm { or byte ptr (Text_TrFlag+1)[edi], 2 } \ +bg8_ng_##label##_outed: \ + __asm { inc edi } \ + __asm { dec bh } \ + __asm { jne bg8_ng_##label##_outlp } \ + __asm { add cl, 2 } \ + __asm { and cl, 7fh } \ + __asm { sub ebx, 10000h } \ + __asm { jns bg8_ng_##label##_linelp } + + +#define BG_DrawLineMcr16_ng(label, bgtop, scrx, scry) \ + __asm { mov edx, scry } \ + __asm { add edx, VLINEBG } \ + __asm { sub edx, BG_VLINE } \ + __asm { mov ebp, edx } \ + __asm { and ebp, 15 } \ + __asm { shl bp, 4 } \ + __asm { and edx, 03f0h } \ + __asm { shl edx, 3 } \ + __asm { add dx, bgtop } \ + __asm { mov eax, scrx } \ + __asm { sub eax, 0/*BG_HAdjust*/ } \ + __asm { mov ecx, eax } \ + __asm { and eax, 15 } \ + __asm { xor al, 15 } \ + __asm { mov edi, eax } \ + __asm { and ecx, 03f0h } \ + __asm { shr cx, 3 } \ + __asm { mov ebx, TextDotX } \ + __asm { shl ebx, 12 } \ +bg16_ng_##label##_linelp: \ + __asm { movzx esi, word ptr BG[ecx+edx] } \ + __asm { mov bx, si } \ + __asm { and si, 0ff00h } \ + __asm { cmp bl, 40h } \ + __asm { jc bg16_ng_##label##_flipx } \ + __asm { js bg16_ng_##label##_fxflipy } \ + __asm { jge bg16_ng_##label##_fxflipx } \ + __asm { add esi, offset BGCHR16 + 000000f0h } \ + __asm { sub esi, ebp } \ + __asm { jmp bg16_ng_##label##_flip } \ +bg16_ng_##label##_fxflipy: \ + __asm { add esi, offset BGCHR16 + 000000ffh } \ + __asm { sub esi, ebp } \ + __asm { std } \ + __asm { jmp bg16_ng_##label##_out } \ +bg16_ng_##label##_fxflipx: \ + __asm { lea esi, BGCHR16[esi+ebp+15] } \ + __asm { std } \ + __asm { jmp bg16_ng_##label##_out } \ +bg16_ng_##label##_flipx: \ + __asm { lea esi, BGCHR16[esi+ebp] } \ +bg16_ng_##label##_flip: \ + __asm { cld } \ +bg16_ng_##label##_out: \ + __asm { mov bh, 16 } \ + __asm { shl bl, 4 } \ +bg16_ng_##label##_outlp: \ + __asm { lodsb } \ + __asm { and ax, 000fh } \ + __asm { je bg16_ng_##label##_outed } \ + __asm { or al, bl } \ + __asm { mov ax, word ptr TextPal[eax*2] } \ + __asm { mov word ptr (BG_LineBuf+2)[edi*2], ax } \ + __asm { or byte ptr (Text_TrFlag+1)[edi], 2 } \ +bg16_ng_##label##_outed: \ + __asm { inc edi } \ + __asm { dec bh } \ + __asm { jne bg16_ng_##label##_outlp } \ + __asm { add cl, 2 } \ + __asm { and cl, 7fh } \ + __asm { sub ebx, 10000h } \ + __asm { jns bg16_ng_##label##_linelp } + + +struct { + WORD sprite_posx; + WORD sprite_posy; + WORD sprite_ctrl; + BYTE sprite_ply; + BYTE dummy; +} SPRITECTRLTBL; + +#define Sprite_DrawLineMcr(label, pri) \ + __asm { mov ebp, TextDotX } \ + __asm { add ebp, 16 } \ + __asm { mov edx, 127*8 } \ +spline_##label##_lp: \ + __asm { mov al, Sprite_Regs[edx].sprite_ply } \ + __asm { and al, 3 } \ + __asm { cmp al, pri } \ + __asm { je spline_##label##_plyhit } \ +spline_##label##_lpcnt: \ + __asm { sub dx, 8 } \ + __asm { jns spline_##label##_lp } \ + __asm { jmp spline_##label##_ed } \ +spline_##label##_plyhit: \ + __asm { movzx edi, Sprite_Regs[edx].sprite_posx } \ + __asm { add edi, BG_HAdjust } \ + __asm { and di, 03ffh } \ + __asm { cmp edi, ebp } \ + __asm { jnc spline_##label##_lpcnt } \ + __asm { movzx eax, Sprite_Regs[edx].sprite_posy } \ + __asm { and ax, 03ffh } \ + __asm { sub eax, VLINEBG } \ + __asm { add eax, BG_VLINE } \ + __asm { neg eax } \ + __asm { add eax, 16 } \ + __asm { jnc spline_##label##_lpcnt } \ + __asm { shl al, 4 } \ + __asm { movzx esi, Sprite_Regs[edx].sprite_ctrl } \ + __asm { mov bx, si } \ + __asm { shl si, 8 } \ + __asm { cmp bh, 40h } \ + __asm { jc spline_##label##_flipx } \ + __asm { js spline_##label##_fxflipy } \ + __asm { jge spline_##label##_fxflipx } \ + __asm { xor al, 0f0h } \ +spline_##label##_flipx: \ + __asm { lea esi, BGCHR16[esi + eax] } \ + __asm { cld } \ +spline_##label##_out: \ + __asm { shl bh, 4 } \ + __asm { mov ecx, 16 } \ +spline_##label##_outlp: \ + __asm { lodsb } \ + __asm { and ax, 000fh } \ + __asm { je spline_##label##_trans } \ + __asm { or al, bh } \ + __asm { cmp word ptr BG_PriBuf[edi*2], dx } \ + __asm { jc spline_##label##_trans } \ + __asm { mov ax, word ptr TextPal[eax*2] } \ + __asm { mov word ptr BG_LineBuf[edi*2], ax } \ + __asm { or byte ptr (Text_TrFlag)[edi], 2 } \ + __asm { mov word ptr BG_PriBuf[edi*2], dx } \ +spline_##label##_trans: \ + __asm { inc edi } \ + __asm { loop spline_##label##_outlp } \ + __asm { jmp spline_##label##_lpcnt } \ +spline_##label##_fxflipy: \ + __asm { xor al, 0f0h } \ +spline_##label##_fxflipx: \ + __asm { lea esi, BGCHR16[esi + eax + 15] } \ + __asm { std } \ + __asm { jmp spline_##label##_out } \ +spline_##label##_ed: diff --git a/x68k/bga.asm b/x68k/bga.asm new file mode 100644 index 0000000..797b257 --- /dev/null +++ b/x68k/bga.asm @@ -0,0 +1,485 @@ +; $Id: bga.asm,v 1.1.1.1 2003/04/28 18:06:56 nonaka Exp $ + +bits 32 + +extern VLINEBG ; DWORD +extern Sprite_Regs ; BYTE [0x800] + +extern BG ; BYTE [0x8000] +extern BGCHR8 ; BYTE [8*8*256] +extern BGCHR16 ; BYTE [16*16*256] +extern BG_LineBuf ; WORD [1600] +extern BG_PriBuf ; WORD [1600] +extern BG_VLINE ; long +extern BG_HAdjust ; long +extern BG_CHRSIZE ; BYTE +extern BG_Regs ; BYTE [0x12] + +extern BG_BG0TOP ; WORD +extern BG0ScrollX ; DWORD +extern BG0ScrollY ; DWORD +extern BG_BG1TOP ; WORD +extern BG1ScrollX ; DWORD +extern BG1ScrollY ; DWORD + +extern TextDotX ; DWORD +extern TextPal ; WORD [256] +extern Text_TrFlag ; BYTE [1024] + + +%macro BG_DrawLineMcr8 4 +bg8_%1: + mov edx, [%4] + add edx, [VLINEBG] + sub edx, [BG_VLINE] + mov ebp, edx + and ebp, 7 + shl bp, 3 + and edx, 1f8h + shl edx, 4 + add dx, [%2] + mov eax, [%3] + sub eax, [BG_HAdjust] + mov ecx, eax + and eax, 7 + xor al, 15 + mov edi, eax + and ecx, 1f8h + shr cx, 2 + mov ebx, [TextDotX] + shl ebx, 13 +bg8_%1_linelp: + movzx esi, word [BG + ecx + edx] + mov bx, si + and si, 0ff00h + shr si, 2 + cmp bl, 40h + jc bg8_%1_flipx + js bg8_%1_fxflipy + jge bg8_%1_fxflipx + add esi, BGCHR8 + 38h + sub esi, ebp + jmp bg8_%1_flip +bg8_%1_fxflipy: + add esi, BGCHR8 + 3fh + sub esi, ebp + std + jmp bg8_%1_out +bg8_%1_fxflipx: + lea esi, [BGCHR8 + esi + ebp + 7] + std + jmp bg8_%1_out +bg8_%1_flipx: + lea esi, [BGCHR8 + esi + ebp] +bg8_%1_flip: + cld +bg8_%1_out: + mov bh, 8 + shl bl, 4 +bg8_%1_outlp: + lodsb + or al, bl + and ax, 0ffh + je bg8_%1_outed + test ax, 0fh + mov ax, [TextPal + eax * 2] + jne bg8_%1_outcont + test byte [Text_TrFlag + 1 + edi], 2 + jne bg8_%1_outed +bg8_%1_outcont: + mov [BG_LineBuf + 2 + edi * 2], ax + or byte [Text_TrFlag + 1 + edi], 2 +bg8_%1_outed: + inc edi + dec bh + jne bg8_%1_outlp + add cl, 2 + and cl, 7fh + sub ebx, 10000h + jns bg8_%1_linelp +%endmacro + +%macro BG_DrawLineMcr16 4 +bg16_%1: + mov edx, [%4] + add edx, [VLINEBG] + sub edx, [BG_VLINE] + mov ebp, edx + and ebp, 15 + shl bp, 4 + and edx, 3f0h + shl edx, 3 + add dx, [%2] + mov eax, [%3] + sub eax, [BG_HAdjust] + mov ecx, eax + and eax, 15 + xor al, 15 + mov edi, eax + and ecx, 3f0h + shr cx, 3 + mov ebx, [TextDotX] + shl ebx, 12 +bg16_%1_linelp: + movzx esi, word [BG + ecx + edx] + mov bx, si + and si, 0ff00h + cmp bl, 40h + jc bg16_%1_flipx + js bg16_%1_fxflipy + jge bg16_%1_fxflipx + add esi, BGCHR16 + 0f0h + sub esi, ebp + jmp bg16_%1_flip +bg16_%1_fxflipy: + add esi, BGCHR16 + 0ffh + sub esi, ebp + std + jmp bg16_%1_out +bg16_%1_fxflipx: + lea esi, [BGCHR16 + esi + ebp + 15] + std + jmp bg16_%1_out +bg16_%1_flipx: + lea esi, [BGCHR16 + esi + ebp] +bg16_%1_flip: + cld +bg16_%1_out: + mov bh, 16 + shl bl, 4 +bg16_%1_outlp: + lodsb + or al, bl + and ax, 0ffh + je bg16_%1_outed + test ax, 0fh + mov ax, [TextPal + eax * 2] + jne bg16_%1_outcont + test byte [Text_TrFlag + 1 + edi], 2 + jne bg16_%1_outed +bg16_%1_outcont: + mov word [BG_LineBuf + 2 + edi * 2], ax + or byte [Text_TrFlag + 1 + edi], 2 +bg16_%1_outed: + inc edi + dec bh + jne bg16_%1_outlp + add cl, 2 + and cl, 7fh + sub ebx, 10000h + jns bg16_%1_linelp +%endmacro + +%macro BG_DrawLineMcr8_ng 4 +bg8_ng_%1: + mov edx, [%4] + add edx, [VLINEBG] + sub edx, [BG_VLINE] + mov ebp, edx + and ebp, 7 + shl bp, 3 + and edx, 1f8h + shl edx, 4 + add dx, [%2] + mov eax, [%3] + sub eax, [BG_HAdjust] + mov ecx, eax + and eax, 7 + xor al, 15 + mov edi, eax + and ecx, 1f8h + shr cx, 2 + mov ebx, [TextDotX] + shl ebx, 13 +bg8_ng_%1_linelp: + movzx esi, word [BG + ecx + edx] + mov bx, si + and si, 0ff00h + shr si, 2 + cmp bl, 40h + jc bg8_ng_%1_flipx + js bg8_ng_%1_fxflipy + jge bg8_ng_%1_fxflipx + add esi, BGCHR8 + 38h + sub esi, ebp + jmp bg8_ng_%1_flip +bg8_ng_%1_fxflipy: + add esi, BGCHR8 + 3fh + sub esi, ebp + std + jmp bg8_ng_%1_out +bg8_ng_%1_fxflipx: + lea esi, [BGCHR8 + esi + ebp + 7] + std + jmp bg8_ng_%1_out +bg8_ng_%1_flipx: + lea esi, [BGCHR8 + esi + ebp] +bg8_ng_%1_flip: + cld +bg8_ng_%1_out: + mov bh, 8 + shl bl, 4 +bg8_ng_%1_outlp: + lodsb + and ax, 0fh + je bg8_ng_%1_outed + or al, bl + mov ax, [TextPal + eax * 2] + mov [BG_LineBuf + 2 + edi * 2], ax + or byte [Text_TrFlag + 1 + edi], 2 +bg8_ng_%1_outed: + inc edi + dec bh + jne bg8_ng_%1_outlp + add cl, 2 + and cl, 7fh + sub ebx, 10000h + jns bg8_ng_%1_linelp +%endmacro + +%macro BG_DrawLineMcr16_ng 4 +bg16_ng_%1: + mov edx, [%4] + add edx, [VLINEBG] + sub edx, [BG_VLINE] + mov ebp, edx + and ebp, 15 + shl bp, 4 + and edx, 3f0h + shl edx, 3 + add dx, [%2] + mov eax, [%3] +; sub eax, 0 /*BG_HAdjust*/ + mov ecx, eax + and eax, 15 + xor al, 15 + mov edi, eax + and ecx, 3f0h + shr cx, 3 + mov ebx, [TextDotX] + shl ebx, 12 +bg16_ng_%1_linelp: + movzx esi, word [BG + ecx + edx] + mov bx, si + and si, 0ff00h + cmp bl, 40h + jc bg16_ng_%1_flipx + js bg16_ng_%1_fxflipy + jge bg16_ng_%1_fxflipx + add esi, BGCHR16 + 0f0h + sub esi, ebp + jmp bg16_ng_%1_flip +bg16_ng_%1_fxflipy: + add esi, BGCHR16 + 0ffh + sub esi, ebp + std + jmp bg16_ng_%1_out +bg16_ng_%1_fxflipx: + lea esi, [BGCHR16 + esi + ebp + 15] + std + jmp bg16_ng_%1_out +bg16_ng_%1_flipx: + lea esi, [BGCHR16 + esi + ebp] +bg16_ng_%1_flip: + cld +bg16_ng_%1_out: + mov bh, 16 + shl bl, 4 +bg16_ng_%1_outlp: + lodsb + and ax, 0fh + je bg16_ng_%1_outed + or al, bl + mov ax, [TextPal + eax * 2] + mov [BG_LineBuf + 2 + edi * 2], ax + or byte [Text_TrFlag + 1 + edi], 2 +bg16_ng_%1_outed: + inc edi + dec bh + jne bg16_ng_%1_outlp + add cl, 2 + and cl, 7fh + sub ebx, 10000h + jns bg16_ng_%1_linelp +%endmacro + +struc spritectrltbl + .sprite_posx resw 1 + .sprite_posy resw 1 + .sprite_ctrl resw 1 + .sprite_ply resb 1 + .dummy resb 1 +endstruc + +%macro Sprite_DrawLineMcr 2 + mov ebp, [TextDotX] + add ebp, 16 + mov edx, 127 * 8 +spline_%1_lp: + mov al, [Sprite_Regs + spritectrltbl.sprite_ply + edx] + and al, 3 + cmp al, %2 + je spline_%1_plyhit +spline_%1_lpcnt: + sub dx, 8 + jns spline_%1_lp + jmp spline_%1_ed +spline_%1_plyhit: + movzx edi, word [Sprite_Regs + spritectrltbl.sprite_posx + edx] + add edi, [BG_HAdjust] + and di, 3ffh + cmp edi, ebp + jnc spline_%1_lpcnt + movzx eax, word [Sprite_Regs + spritectrltbl.sprite_posy + edx] + and ax, 3ffh + sub eax, [VLINEBG] + add eax, [BG_VLINE] + neg eax + add eax, 16 + jnc spline_%1_lpcnt + shl al, 4 + movzx esi, word [Sprite_Regs + spritectrltbl.sprite_ctrl + edx] + mov bx, si + shl si, 8 + cmp bh, 40h + jc spline_%1_flipx + js spline_%1_fxflipy + jge spline_%1_fxflipx + xor al, 0f0h +spline_%1_flipx: + lea esi, [BGCHR16 + esi + eax] + cld +spline_%1_out: + shl bh, 4 + mov ecx, 16 +spline_%1_outlp: + lodsb + and ax, 0fh + je spline_%1_trans + or al, bh + cmp [BG_PriBuf + edi * 2], dx + jc spline_%1_trans + mov ax, [TextPal + eax * 2] + mov [BG_LineBuf + edi * 2], ax + or byte [Text_TrFlag + edi], 2 + mov [BG_PriBuf + edi * 2], dx +spline_%1_trans: + inc edi + loop spline_%1_outlp + jmp spline_%1_lpcnt +spline_%1_fxflipy: + xor al, 0f0h +spline_%1_fxflipx: + lea esi, [BGCHR16 + esi + eax + 15] + std + jmp spline_%1_out +spline_%1_ed: +%endmacro + + section .text + +; +; LABEL void FASTCALL BG_DrawLine(int opaq, int gd) +; + global BG_DrawLine + align 16 +BG_DrawLine: + pushf + push ebx + push esi + push edi + push edx + push ebp + + mov ecx, [esp + 1ch] ; opaq + mov edx, [esp + 20h] ; gd + + mov ax, word [TextPal] + shl eax, 16 + mov ax, word [TextPal] + mov ebx, 0xffffffff + mov edi, 16*2 + or ecx, ecx ; ecx = opaq + jz noclrloop + mov ecx, [TextDotX] + shr ecx, 1 +BGLineClr_lp: + mov dword [BG_LineBuf + edi], eax + mov dword [BG_PriBuf + edi], ebx ; SP間のプライオリティ情報初期化 + add edi, 4 + loop BGLineClr_lp + jmp bgclrloopend + +noclrloop: + mov ecx, [TextDotX] + shr ecx, 1 +BGLineClr_lp2: + mov dword [BG_PriBuf + edi], ebx ; SP間のプライオリティ情報初期化 + add edi, 4 + loop BGLineClr_lp2 + +bgclrloopend: + or edx, edx ; edx = gd + je near BG_NOGRP + + cmp byte [BG_CHRSIZE], 8 + jne near BG16 + + Sprite_DrawLineMcr 81, 1 +; test byte [BG_Regs + 9], 8 +; je near BG8_1skiped +; BG_DrawLineMcr8 1, BG_BG1TOP, BG1ScrollX, BG1ScrollY +;BG8_1skiped: + Sprite_DrawLineMcr 82, 2 + test byte [BG_Regs + 9], 1 + je near BG_0skiped + BG_DrawLineMcr8 0, BG_BG0TOP, BG0ScrollX, BG0ScrollY + jmp BG_0skiped + +BG16: + Sprite_DrawLineMcr 161, 1 +; test byte [BG_Regs + 9], 8 +; je near BG16_1skiped +; BG_DrawLineMcr16 1, BG_BG1TOP, BG1ScrollX, BG1ScrollY +;BG16_1skiped: + Sprite_DrawLineMcr 162, 2 + test byte [BG_Regs + 9], 1 + je near BG_0skiped + BG_DrawLineMcr16 0, BG_BG0TOP, BG0ScrollX, BG0ScrollY + jmp BG_0skiped + +BG_NOGRP: + cmp byte [BG_CHRSIZE], 8 + jne near BG16_ng + + Sprite_DrawLineMcr ng81, 1 + test byte [BG_Regs + 9], 8 + je near BG8_ng_1skiped + BG_DrawLineMcr8_ng 1, BG_BG1TOP, BG1ScrollX, BG1ScrollY +BG8_ng_1skiped: + Sprite_DrawLineMcr ng82, 2 + test byte [BG_Regs + 9], 1 + je near BG_0skiped + BG_DrawLineMcr8_ng 0, BG_BG0TOP, BG0ScrollX, BG0ScrollY + jmp BG_0skiped + +BG16_ng: + Sprite_DrawLineMcr ng161, 1 +; test byte [BG_Regs + 9], 8 +; je near BG16_ng_1skiped +; BG_DrawLineMcr16_ng 1, BG_BG1TOP, BG1ScrollX, BG1ScrollY +;BG16_ng_1skiped: + Sprite_DrawLineMcr ng162, 2 + test byte [BG_Regs + 9], 1 + je near BG_0skiped + BG_DrawLineMcr16_ng 0, BG_BG0TOP, BG0ScrollX, BG0ScrollY +BG_0skiped: + Sprite_DrawLineMcr 163, 3 + + pop ebp + pop edx + pop edi + pop esi + pop ebx + popf + ret diff --git a/x68k/comptab.asm b/x68k/comptab.asm new file mode 100644 index 0000000..a3d2e37 --- /dev/null +++ b/x68k/comptab.asm @@ -0,0 +1,8128 @@ +DD OP_1000 +DD (OP_0000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_0010 - OP_1000) + (8 * 1000000h) +DD (OP_0018 - OP_1000) + (7 * 1000000h) +DD (OP_001f - OP_1000) + (1 * 1000000h) +DD (OP_0020 - OP_1000) + (7 * 1000000h) +DD (OP_0027 - OP_1000) + (1 * 1000000h) +DD (OP_0028 - OP_1000) + (8 * 1000000h) +DD (OP_0030 - OP_1000) + (8 * 1000000h) +DD (OP_0038 - OP_1000) + (1 * 1000000h) +DD (OP_0039 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (2 * 1000000h) +DD (OP_003c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_0040 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_0050 - OP_1000) + (8 * 1000000h) +DD (OP_0058 - OP_1000) + (8 * 1000000h) +DD (OP_0060 - OP_1000) + (8 * 1000000h) +DD (OP_0068 - OP_1000) + (8 * 1000000h) +DD (OP_0070 - OP_1000) + (8 * 1000000h) +DD (OP_0078 - OP_1000) + (1 * 1000000h) +DD (OP_0079 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (2 * 1000000h) +DD (OP_007c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_0080 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_0090 - OP_1000) + (8 * 1000000h) +DD (OP_0098 - OP_1000) + (8 * 1000000h) +DD (OP_00a0 - OP_1000) + (8 * 1000000h) +DD (OP_00a8 - OP_1000) + (8 * 1000000h) +DD (OP_00b0 - OP_1000) + (8 * 1000000h) +DD (OP_00b8 - OP_1000) + (1 * 1000000h) +DD (OP_00b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (ILLEGAL - OP_1000) + (64 * 1000000h) +DD (OP_0100 - OP_1000) + (8 * 1000000h) +DD (OP_0108 - OP_1000) + (8 * 1000000h) +DD (OP_0110 - OP_1000) + (8 * 1000000h) +DD (OP_0118 - OP_1000) + (8 * 1000000h) +DD (OP_0120 - OP_1000) + (8 * 1000000h) +DD (OP_0128 - OP_1000) + (8 * 1000000h) +DD (OP_0130 - OP_1000) + (8 * 1000000h) +DD (OP_0138 - OP_1000) + (1 * 1000000h) +DD (OP_0139 - OP_1000) + (1 * 1000000h) +DD (OP_013a - OP_1000) + (1 * 1000000h) +DD (OP_013b - OP_1000) + (1 * 1000000h) +DD (OP_013c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_0140 - OP_1000) + (8 * 1000000h) +DD (OP_0148 - OP_1000) + (8 * 1000000h) +DD (OP_0150 - OP_1000) + (8 * 1000000h) +DD (OP_0158 - OP_1000) + (8 * 1000000h) +DD (OP_0160 - OP_1000) + (8 * 1000000h) +DD (OP_0168 - OP_1000) + (8 * 1000000h) +DD (OP_0170 - OP_1000) + (8 * 1000000h) +DD (OP_0178 - OP_1000) + (1 * 1000000h) +DD (OP_0179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_0180 - OP_1000) + (8 * 1000000h) +DD (OP_0188 - OP_1000) + (8 * 1000000h) +DD (OP_0190 - OP_1000) + (8 * 1000000h) +DD (OP_0198 - OP_1000) + (8 * 1000000h) +DD (OP_01a0 - OP_1000) + (8 * 1000000h) +DD (OP_01a8 - OP_1000) + (8 * 1000000h) +DD (OP_01b0 - OP_1000) + (8 * 1000000h) +DD (OP_01b8 - OP_1000) + (1 * 1000000h) +DD (OP_01b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_01c0 - OP_1000) + (8 * 1000000h) +DD (OP_01c8 - OP_1000) + (8 * 1000000h) +DD (OP_01d0 - OP_1000) + (8 * 1000000h) +DD (OP_01d8 - OP_1000) + (8 * 1000000h) +DD (OP_01e0 - OP_1000) + (8 * 1000000h) +DD (OP_01e8 - OP_1000) + (8 * 1000000h) +DD (OP_01f0 - OP_1000) + (8 * 1000000h) +DD (OP_01f8 - OP_1000) + (1 * 1000000h) +DD (OP_01f9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_0200 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_0210 - OP_1000) + (8 * 1000000h) +DD (OP_0218 - OP_1000) + (7 * 1000000h) +DD (OP_021f - OP_1000) + (1 * 1000000h) +DD (OP_0220 - OP_1000) + (7 * 1000000h) +DD (OP_0227 - OP_1000) + (1 * 1000000h) +DD (OP_0228 - OP_1000) + (8 * 1000000h) +DD (OP_0230 - OP_1000) + (8 * 1000000h) +DD (OP_0238 - OP_1000) + (1 * 1000000h) +DD (OP_0239 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (2 * 1000000h) +DD (OP_023c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_0240 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_0250 - OP_1000) + (8 * 1000000h) +DD (OP_0258 - OP_1000) + (8 * 1000000h) +DD (OP_0260 - OP_1000) + (8 * 1000000h) +DD (OP_0268 - OP_1000) + (8 * 1000000h) +DD (OP_0270 - OP_1000) + (8 * 1000000h) +DD (OP_0278 - OP_1000) + (1 * 1000000h) +DD (OP_0279 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (2 * 1000000h) +DD (OP_027c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_0280 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_0290 - OP_1000) + (8 * 1000000h) +DD (OP_0298 - OP_1000) + (8 * 1000000h) +DD (OP_02a0 - OP_1000) + (8 * 1000000h) +DD (OP_02a8 - OP_1000) + (8 * 1000000h) +DD (OP_02b0 - OP_1000) + (8 * 1000000h) +DD (OP_02b8 - OP_1000) + (1 * 1000000h) +DD (OP_02b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (ILLEGAL - OP_1000) + (64 * 1000000h) +DD (OP_0100 - OP_1000) + (8 * 1000000h) +DD (OP_0108 - OP_1000) + (8 * 1000000h) +DD (OP_0110 - OP_1000) + (8 * 1000000h) +DD (OP_0118 - OP_1000) + (8 * 1000000h) +DD (OP_0120 - OP_1000) + (8 * 1000000h) +DD (OP_0128 - OP_1000) + (8 * 1000000h) +DD (OP_0130 - OP_1000) + (8 * 1000000h) +DD (OP_0138 - OP_1000) + (1 * 1000000h) +DD (OP_0139 - OP_1000) + (1 * 1000000h) +DD (OP_013a - OP_1000) + (1 * 1000000h) +DD (OP_013b - OP_1000) + (1 * 1000000h) +DD (OP_013c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_0140 - OP_1000) + (8 * 1000000h) +DD (OP_0148 - OP_1000) + (8 * 1000000h) +DD (OP_0150 - OP_1000) + (8 * 1000000h) +DD (OP_0158 - OP_1000) + (8 * 1000000h) +DD (OP_0160 - OP_1000) + (8 * 1000000h) +DD (OP_0168 - OP_1000) + (8 * 1000000h) +DD (OP_0170 - OP_1000) + (8 * 1000000h) +DD (OP_0178 - OP_1000) + (1 * 1000000h) +DD (OP_0179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_0180 - OP_1000) + (8 * 1000000h) +DD (OP_0188 - OP_1000) + (8 * 1000000h) +DD (OP_0190 - OP_1000) + (8 * 1000000h) +DD (OP_0198 - OP_1000) + (8 * 1000000h) +DD (OP_01a0 - OP_1000) + (8 * 1000000h) +DD (OP_01a8 - OP_1000) + (8 * 1000000h) +DD (OP_01b0 - OP_1000) + (8 * 1000000h) +DD (OP_01b8 - OP_1000) + (1 * 1000000h) +DD (OP_01b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_01c0 - OP_1000) + (8 * 1000000h) +DD (OP_01c8 - OP_1000) + (8 * 1000000h) +DD (OP_01d0 - OP_1000) + (8 * 1000000h) +DD (OP_01d8 - OP_1000) + (8 * 1000000h) +DD (OP_01e0 - OP_1000) + (8 * 1000000h) +DD (OP_01e8 - OP_1000) + (8 * 1000000h) +DD (OP_01f0 - OP_1000) + (8 * 1000000h) +DD (OP_01f8 - OP_1000) + (1 * 1000000h) +DD (OP_01f9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_0400 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_0410 - OP_1000) + (8 * 1000000h) +DD (OP_0418 - OP_1000) + (7 * 1000000h) +DD (OP_041f - OP_1000) + (1 * 1000000h) +DD (OP_0420 - OP_1000) + (7 * 1000000h) +DD (OP_0427 - OP_1000) + (1 * 1000000h) +DD (OP_0428 - OP_1000) + (8 * 1000000h) +DD (OP_0430 - OP_1000) + (8 * 1000000h) +DD (OP_0438 - OP_1000) + (1 * 1000000h) +DD (OP_0439 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_0440 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_0450 - OP_1000) + (8 * 1000000h) +DD (OP_0458 - OP_1000) + (8 * 1000000h) +DD (OP_0460 - OP_1000) + (8 * 1000000h) +DD (OP_0468 - OP_1000) + (8 * 1000000h) +DD (OP_0470 - OP_1000) + (8 * 1000000h) +DD (OP_0478 - OP_1000) + (1 * 1000000h) +DD (OP_0479 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_0480 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_0490 - OP_1000) + (8 * 1000000h) +DD (OP_0498 - OP_1000) + (8 * 1000000h) +DD (OP_04a0 - OP_1000) + (8 * 1000000h) +DD (OP_04a8 - OP_1000) + (8 * 1000000h) +DD (OP_04b0 - OP_1000) + (8 * 1000000h) +DD (OP_04b8 - OP_1000) + (1 * 1000000h) +DD (OP_04b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (ILLEGAL - OP_1000) + (64 * 1000000h) +DD (OP_0100 - OP_1000) + (8 * 1000000h) +DD (OP_0108 - OP_1000) + (8 * 1000000h) +DD (OP_0110 - OP_1000) + (8 * 1000000h) +DD (OP_0118 - OP_1000) + (8 * 1000000h) +DD (OP_0120 - OP_1000) + (8 * 1000000h) +DD (OP_0128 - OP_1000) + (8 * 1000000h) +DD (OP_0130 - OP_1000) + (8 * 1000000h) +DD (OP_0138 - OP_1000) + (1 * 1000000h) +DD (OP_0139 - OP_1000) + (1 * 1000000h) +DD (OP_013a - OP_1000) + (1 * 1000000h) +DD (OP_013b - OP_1000) + (1 * 1000000h) +DD (OP_013c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_0140 - OP_1000) + (8 * 1000000h) +DD (OP_0148 - OP_1000) + (8 * 1000000h) +DD (OP_0150 - OP_1000) + (8 * 1000000h) +DD (OP_0158 - OP_1000) + (8 * 1000000h) +DD (OP_0160 - OP_1000) + (8 * 1000000h) +DD (OP_0168 - OP_1000) + (8 * 1000000h) +DD (OP_0170 - OP_1000) + (8 * 1000000h) +DD (OP_0178 - OP_1000) + (1 * 1000000h) +DD (OP_0179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_0180 - OP_1000) + (8 * 1000000h) +DD (OP_0188 - OP_1000) + (8 * 1000000h) +DD (OP_0190 - OP_1000) + (8 * 1000000h) +DD (OP_0198 - OP_1000) + (8 * 1000000h) +DD (OP_01a0 - OP_1000) + (8 * 1000000h) +DD (OP_01a8 - OP_1000) + (8 * 1000000h) +DD (OP_01b0 - OP_1000) + (8 * 1000000h) +DD (OP_01b8 - OP_1000) + (1 * 1000000h) +DD (OP_01b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_01c0 - OP_1000) + (8 * 1000000h) +DD (OP_01c8 - OP_1000) + (8 * 1000000h) +DD (OP_01d0 - OP_1000) + (8 * 1000000h) +DD (OP_01d8 - OP_1000) + (8 * 1000000h) +DD (OP_01e0 - OP_1000) + (8 * 1000000h) +DD (OP_01e8 - OP_1000) + (8 * 1000000h) +DD (OP_01f0 - OP_1000) + (8 * 1000000h) +DD (OP_01f8 - OP_1000) + (1 * 1000000h) +DD (OP_01f9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_0600 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_0610 - OP_1000) + (8 * 1000000h) +DD (OP_0618 - OP_1000) + (7 * 1000000h) +DD (OP_061f - OP_1000) + (1 * 1000000h) +DD (OP_0620 - OP_1000) + (7 * 1000000h) +DD (OP_0627 - OP_1000) + (1 * 1000000h) +DD (OP_0628 - OP_1000) + (8 * 1000000h) +DD (OP_0630 - OP_1000) + (8 * 1000000h) +DD (OP_0638 - OP_1000) + (1 * 1000000h) +DD (OP_0639 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_0640 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_0650 - OP_1000) + (8 * 1000000h) +DD (OP_0658 - OP_1000) + (8 * 1000000h) +DD (OP_0660 - OP_1000) + (8 * 1000000h) +DD (OP_0668 - OP_1000) + (8 * 1000000h) +DD (OP_0670 - OP_1000) + (8 * 1000000h) +DD (OP_0678 - OP_1000) + (1 * 1000000h) +DD (OP_0679 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_0680 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_0690 - OP_1000) + (8 * 1000000h) +DD (OP_0698 - OP_1000) + (8 * 1000000h) +DD (OP_06a0 - OP_1000) + (8 * 1000000h) +DD (OP_06a8 - OP_1000) + (8 * 1000000h) +DD (OP_06b0 - OP_1000) + (8 * 1000000h) +DD (OP_06b8 - OP_1000) + (1 * 1000000h) +DD (OP_06b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (ILLEGAL - OP_1000) + (64 * 1000000h) +DD (OP_0100 - OP_1000) + (8 * 1000000h) +DD (OP_0108 - OP_1000) + (8 * 1000000h) +DD (OP_0110 - OP_1000) + (8 * 1000000h) +DD (OP_0118 - OP_1000) + (8 * 1000000h) +DD (OP_0120 - OP_1000) + (8 * 1000000h) +DD (OP_0128 - OP_1000) + (8 * 1000000h) +DD (OP_0130 - OP_1000) + (8 * 1000000h) +DD (OP_0138 - OP_1000) + (1 * 1000000h) +DD (OP_0139 - OP_1000) + (1 * 1000000h) +DD (OP_013a - OP_1000) + (1 * 1000000h) +DD (OP_013b - OP_1000) + (1 * 1000000h) +DD (OP_013c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_0140 - OP_1000) + (8 * 1000000h) +DD (OP_0148 - OP_1000) + (8 * 1000000h) +DD (OP_0150 - OP_1000) + (8 * 1000000h) +DD (OP_0158 - OP_1000) + (8 * 1000000h) +DD (OP_0160 - OP_1000) + (8 * 1000000h) +DD (OP_0168 - OP_1000) + (8 * 1000000h) +DD (OP_0170 - OP_1000) + (8 * 1000000h) +DD (OP_0178 - OP_1000) + (1 * 1000000h) +DD (OP_0179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_0180 - OP_1000) + (8 * 1000000h) +DD (OP_0188 - OP_1000) + (8 * 1000000h) +DD (OP_0190 - OP_1000) + (8 * 1000000h) +DD (OP_0198 - OP_1000) + (8 * 1000000h) +DD (OP_01a0 - OP_1000) + (8 * 1000000h) +DD (OP_01a8 - OP_1000) + (8 * 1000000h) +DD (OP_01b0 - OP_1000) + (8 * 1000000h) +DD (OP_01b8 - OP_1000) + (1 * 1000000h) +DD (OP_01b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_01c0 - OP_1000) + (8 * 1000000h) +DD (OP_01c8 - OP_1000) + (8 * 1000000h) +DD (OP_01d0 - OP_1000) + (8 * 1000000h) +DD (OP_01d8 - OP_1000) + (8 * 1000000h) +DD (OP_01e0 - OP_1000) + (8 * 1000000h) +DD (OP_01e8 - OP_1000) + (8 * 1000000h) +DD (OP_01f0 - OP_1000) + (8 * 1000000h) +DD (OP_01f8 - OP_1000) + (1 * 1000000h) +DD (OP_01f9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_0800 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_0810 - OP_1000) + (8 * 1000000h) +DD (OP_0818 - OP_1000) + (8 * 1000000h) +DD (OP_0820 - OP_1000) + (8 * 1000000h) +DD (OP_0828 - OP_1000) + (8 * 1000000h) +DD (OP_0830 - OP_1000) + (8 * 1000000h) +DD (OP_0838 - OP_1000) + (1 * 1000000h) +DD (OP_0839 - OP_1000) + (1 * 1000000h) +DD (OP_083a - OP_1000) + (1 * 1000000h) +DD (OP_083b - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (4 * 1000000h) +DD (OP_0840 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_0850 - OP_1000) + (8 * 1000000h) +DD (OP_0858 - OP_1000) + (8 * 1000000h) +DD (OP_0860 - OP_1000) + (8 * 1000000h) +DD (OP_0868 - OP_1000) + (8 * 1000000h) +DD (OP_0870 - OP_1000) + (8 * 1000000h) +DD (OP_0878 - OP_1000) + (1 * 1000000h) +DD (OP_0879 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_0880 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_0890 - OP_1000) + (8 * 1000000h) +DD (OP_0898 - OP_1000) + (8 * 1000000h) +DD (OP_08a0 - OP_1000) + (8 * 1000000h) +DD (OP_08a8 - OP_1000) + (8 * 1000000h) +DD (OP_08b0 - OP_1000) + (8 * 1000000h) +DD (OP_08b8 - OP_1000) + (1 * 1000000h) +DD (OP_08b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_08c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_08d0 - OP_1000) + (8 * 1000000h) +DD (OP_08d8 - OP_1000) + (8 * 1000000h) +DD (OP_08e0 - OP_1000) + (8 * 1000000h) +DD (OP_08e8 - OP_1000) + (8 * 1000000h) +DD (OP_08f0 - OP_1000) + (8 * 1000000h) +DD (OP_08f8 - OP_1000) + (1 * 1000000h) +DD (OP_08f9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_0100 - OP_1000) + (8 * 1000000h) +DD (OP_0108 - OP_1000) + (8 * 1000000h) +DD (OP_0110 - OP_1000) + (8 * 1000000h) +DD (OP_0118 - OP_1000) + (8 * 1000000h) +DD (OP_0120 - OP_1000) + (8 * 1000000h) +DD (OP_0128 - OP_1000) + (8 * 1000000h) +DD (OP_0130 - OP_1000) + (8 * 1000000h) +DD (OP_0138 - OP_1000) + (1 * 1000000h) +DD (OP_0139 - OP_1000) + (1 * 1000000h) +DD (OP_013a - OP_1000) + (1 * 1000000h) +DD (OP_013b - OP_1000) + (1 * 1000000h) +DD (OP_013c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_0140 - OP_1000) + (8 * 1000000h) +DD (OP_0148 - OP_1000) + (8 * 1000000h) +DD (OP_0150 - OP_1000) + (8 * 1000000h) +DD (OP_0158 - OP_1000) + (8 * 1000000h) +DD (OP_0160 - OP_1000) + (8 * 1000000h) +DD (OP_0168 - OP_1000) + (8 * 1000000h) +DD (OP_0170 - OP_1000) + (8 * 1000000h) +DD (OP_0178 - OP_1000) + (1 * 1000000h) +DD (OP_0179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_0180 - OP_1000) + (8 * 1000000h) +DD (OP_0188 - OP_1000) + (8 * 1000000h) +DD (OP_0190 - OP_1000) + (8 * 1000000h) +DD (OP_0198 - OP_1000) + (8 * 1000000h) +DD (OP_01a0 - OP_1000) + (8 * 1000000h) +DD (OP_01a8 - OP_1000) + (8 * 1000000h) +DD (OP_01b0 - OP_1000) + (8 * 1000000h) +DD (OP_01b8 - OP_1000) + (1 * 1000000h) +DD (OP_01b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_01c0 - OP_1000) + (8 * 1000000h) +DD (OP_01c8 - OP_1000) + (8 * 1000000h) +DD (OP_01d0 - OP_1000) + (8 * 1000000h) +DD (OP_01d8 - OP_1000) + (8 * 1000000h) +DD (OP_01e0 - OP_1000) + (8 * 1000000h) +DD (OP_01e8 - OP_1000) + (8 * 1000000h) +DD (OP_01f0 - OP_1000) + (8 * 1000000h) +DD (OP_01f8 - OP_1000) + (1 * 1000000h) +DD (OP_01f9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_0a00 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_0a10 - OP_1000) + (8 * 1000000h) +DD (OP_0a18 - OP_1000) + (7 * 1000000h) +DD (OP_0a1f - OP_1000) + (1 * 1000000h) +DD (OP_0a20 - OP_1000) + (7 * 1000000h) +DD (OP_0a27 - OP_1000) + (1 * 1000000h) +DD (OP_0a28 - OP_1000) + (8 * 1000000h) +DD (OP_0a30 - OP_1000) + (8 * 1000000h) +DD (OP_0a38 - OP_1000) + (1 * 1000000h) +DD (OP_0a39 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (2 * 1000000h) +DD (OP_0a3c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_0a40 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_0a50 - OP_1000) + (8 * 1000000h) +DD (OP_0a58 - OP_1000) + (8 * 1000000h) +DD (OP_0a60 - OP_1000) + (8 * 1000000h) +DD (OP_0a68 - OP_1000) + (8 * 1000000h) +DD (OP_0a70 - OP_1000) + (8 * 1000000h) +DD (OP_0a78 - OP_1000) + (1 * 1000000h) +DD (OP_0a79 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (2 * 1000000h) +DD (OP_0a7c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_0a80 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_0a90 - OP_1000) + (8 * 1000000h) +DD (OP_0a98 - OP_1000) + (8 * 1000000h) +DD (OP_0aa0 - OP_1000) + (8 * 1000000h) +DD (OP_0aa8 - OP_1000) + (8 * 1000000h) +DD (OP_0ab0 - OP_1000) + (8 * 1000000h) +DD (OP_0ab8 - OP_1000) + (1 * 1000000h) +DD (OP_0ab9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (ILLEGAL - OP_1000) + (64 * 1000000h) +DD (OP_0100 - OP_1000) + (8 * 1000000h) +DD (OP_0108 - OP_1000) + (8 * 1000000h) +DD (OP_0110 - OP_1000) + (8 * 1000000h) +DD (OP_0118 - OP_1000) + (8 * 1000000h) +DD (OP_0120 - OP_1000) + (8 * 1000000h) +DD (OP_0128 - OP_1000) + (8 * 1000000h) +DD (OP_0130 - OP_1000) + (8 * 1000000h) +DD (OP_0138 - OP_1000) + (1 * 1000000h) +DD (OP_0139 - OP_1000) + (1 * 1000000h) +DD (OP_013a - OP_1000) + (1 * 1000000h) +DD (OP_013b - OP_1000) + (1 * 1000000h) +DD (OP_013c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_0140 - OP_1000) + (8 * 1000000h) +DD (OP_0148 - OP_1000) + (8 * 1000000h) +DD (OP_0150 - OP_1000) + (8 * 1000000h) +DD (OP_0158 - OP_1000) + (8 * 1000000h) +DD (OP_0160 - OP_1000) + (8 * 1000000h) +DD (OP_0168 - OP_1000) + (8 * 1000000h) +DD (OP_0170 - OP_1000) + (8 * 1000000h) +DD (OP_0178 - OP_1000) + (1 * 1000000h) +DD (OP_0179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_0180 - OP_1000) + (8 * 1000000h) +DD (OP_0188 - OP_1000) + (8 * 1000000h) +DD (OP_0190 - OP_1000) + (8 * 1000000h) +DD (OP_0198 - OP_1000) + (8 * 1000000h) +DD (OP_01a0 - OP_1000) + (8 * 1000000h) +DD (OP_01a8 - OP_1000) + (8 * 1000000h) +DD (OP_01b0 - OP_1000) + (8 * 1000000h) +DD (OP_01b8 - OP_1000) + (1 * 1000000h) +DD (OP_01b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_01c0 - OP_1000) + (8 * 1000000h) +DD (OP_01c8 - OP_1000) + (8 * 1000000h) +DD (OP_01d0 - OP_1000) + (8 * 1000000h) +DD (OP_01d8 - OP_1000) + (8 * 1000000h) +DD (OP_01e0 - OP_1000) + (8 * 1000000h) +DD (OP_01e8 - OP_1000) + (8 * 1000000h) +DD (OP_01f0 - OP_1000) + (8 * 1000000h) +DD (OP_01f8 - OP_1000) + (1 * 1000000h) +DD (OP_01f9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_0c00 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_0c10 - OP_1000) + (8 * 1000000h) +DD (OP_0c18 - OP_1000) + (7 * 1000000h) +DD (OP_0c1f - OP_1000) + (1 * 1000000h) +DD (OP_0c20 - OP_1000) + (7 * 1000000h) +DD (OP_0c27 - OP_1000) + (1 * 1000000h) +DD (OP_0c28 - OP_1000) + (8 * 1000000h) +DD (OP_0c30 - OP_1000) + (8 * 1000000h) +DD (OP_0c38 - OP_1000) + (1 * 1000000h) +DD (OP_0c39 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (2 * 1000000h) +DD (OP_0c3c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_0c40 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_0c50 - OP_1000) + (8 * 1000000h) +DD (OP_0c58 - OP_1000) + (8 * 1000000h) +DD (OP_0c60 - OP_1000) + (8 * 1000000h) +DD (OP_0c68 - OP_1000) + (8 * 1000000h) +DD (OP_0c70 - OP_1000) + (8 * 1000000h) +DD (OP_0c78 - OP_1000) + (1 * 1000000h) +DD (OP_0c79 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (2 * 1000000h) +DD (OP_0c7c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_0c80 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_0c90 - OP_1000) + (8 * 1000000h) +DD (OP_0c98 - OP_1000) + (8 * 1000000h) +DD (OP_0ca0 - OP_1000) + (8 * 1000000h) +DD (OP_0ca8 - OP_1000) + (8 * 1000000h) +DD (OP_0cb0 - OP_1000) + (8 * 1000000h) +DD (OP_0cb8 - OP_1000) + (1 * 1000000h) +DD (OP_0cb9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (ILLEGAL - OP_1000) + (64 * 1000000h) +DD (OP_0100 - OP_1000) + (8 * 1000000h) +DD (OP_0108 - OP_1000) + (8 * 1000000h) +DD (OP_0110 - OP_1000) + (8 * 1000000h) +DD (OP_0118 - OP_1000) + (8 * 1000000h) +DD (OP_0120 - OP_1000) + (8 * 1000000h) +DD (OP_0128 - OP_1000) + (8 * 1000000h) +DD (OP_0130 - OP_1000) + (8 * 1000000h) +DD (OP_0138 - OP_1000) + (1 * 1000000h) +DD (OP_0139 - OP_1000) + (1 * 1000000h) +DD (OP_013a - OP_1000) + (1 * 1000000h) +DD (OP_013b - OP_1000) + (1 * 1000000h) +DD (OP_013c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_0140 - OP_1000) + (8 * 1000000h) +DD (OP_0148 - OP_1000) + (8 * 1000000h) +DD (OP_0150 - OP_1000) + (8 * 1000000h) +DD (OP_0158 - OP_1000) + (8 * 1000000h) +DD (OP_0160 - OP_1000) + (8 * 1000000h) +DD (OP_0168 - OP_1000) + (8 * 1000000h) +DD (OP_0170 - OP_1000) + (8 * 1000000h) +DD (OP_0178 - OP_1000) + (1 * 1000000h) +DD (OP_0179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_0180 - OP_1000) + (8 * 1000000h) +DD (OP_0188 - OP_1000) + (8 * 1000000h) +DD (OP_0190 - OP_1000) + (8 * 1000000h) +DD (OP_0198 - OP_1000) + (8 * 1000000h) +DD (OP_01a0 - OP_1000) + (8 * 1000000h) +DD (OP_01a8 - OP_1000) + (8 * 1000000h) +DD (OP_01b0 - OP_1000) + (8 * 1000000h) +DD (OP_01b8 - OP_1000) + (1 * 1000000h) +DD (OP_01b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_01c0 - OP_1000) + (8 * 1000000h) +DD (OP_01c8 - OP_1000) + (8 * 1000000h) +DD (OP_01d0 - OP_1000) + (8 * 1000000h) +DD (OP_01d8 - OP_1000) + (8 * 1000000h) +DD (OP_01e0 - OP_1000) + (8 * 1000000h) +DD (OP_01e8 - OP_1000) + (8 * 1000000h) +DD (OP_01f0 - OP_1000) + (8 * 1000000h) +DD (OP_01f8 - OP_1000) + (1 * 1000000h) +DD (OP_01f9 - OP_1000) + (1 * 1000000h) +DD ILLEGAL - OP_1000 +DW 262 +DD (OP_0100 - OP_1000) + (8 * 1000000h) +DD (OP_0108 - OP_1000) + (8 * 1000000h) +DD (OP_0110 - OP_1000) + (8 * 1000000h) +DD (OP_0118 - OP_1000) + (8 * 1000000h) +DD (OP_0120 - OP_1000) + (8 * 1000000h) +DD (OP_0128 - OP_1000) + (8 * 1000000h) +DD (OP_0130 - OP_1000) + (8 * 1000000h) +DD (OP_0138 - OP_1000) + (1 * 1000000h) +DD (OP_0139 - OP_1000) + (1 * 1000000h) +DD (OP_013a - OP_1000) + (1 * 1000000h) +DD (OP_013b - OP_1000) + (1 * 1000000h) +DD (OP_013c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_0140 - OP_1000) + (8 * 1000000h) +DD (OP_0148 - OP_1000) + (8 * 1000000h) +DD (OP_0150 - OP_1000) + (8 * 1000000h) +DD (OP_0158 - OP_1000) + (8 * 1000000h) +DD (OP_0160 - OP_1000) + (8 * 1000000h) +DD (OP_0168 - OP_1000) + (8 * 1000000h) +DD (OP_0170 - OP_1000) + (8 * 1000000h) +DD (OP_0178 - OP_1000) + (1 * 1000000h) +DD (OP_0179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_0180 - OP_1000) + (8 * 1000000h) +DD (OP_0188 - OP_1000) + (8 * 1000000h) +DD (OP_0190 - OP_1000) + (8 * 1000000h) +DD (OP_0198 - OP_1000) + (8 * 1000000h) +DD (OP_01a0 - OP_1000) + (8 * 1000000h) +DD (OP_01a8 - OP_1000) + (8 * 1000000h) +DD (OP_01b0 - OP_1000) + (8 * 1000000h) +DD (OP_01b8 - OP_1000) + (1 * 1000000h) +DD (OP_01b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_01c0 - OP_1000) + (8 * 1000000h) +DD (OP_01c8 - OP_1000) + (8 * 1000000h) +DD (OP_01d0 - OP_1000) + (8 * 1000000h) +DD (OP_01d8 - OP_1000) + (8 * 1000000h) +DD (OP_01e0 - OP_1000) + (8 * 1000000h) +DD (OP_01e8 - OP_1000) + (8 * 1000000h) +DD (OP_01f0 - OP_1000) + (8 * 1000000h) +DD (OP_01f8 - OP_1000) + (1 * 1000000h) +DD (OP_01f9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_1000 - OP_1000) + (16 * 1000000h) +DD (OP_1010 - OP_1000) + (8 * 1000000h) +DD (OP_1018 - OP_1000) + (7 * 1000000h) +DD (OP_101f - OP_1000) + (1 * 1000000h) +DD (OP_1020 - OP_1000) + (7 * 1000000h) +DD (OP_1027 - OP_1000) + (1 * 1000000h) +DD (OP_1028 - OP_1000) + (8 * 1000000h) +DD (OP_1030 - OP_1000) + (8 * 1000000h) +DD (OP_1038 - OP_1000) + (1 * 1000000h) +DD (OP_1039 - OP_1000) + (1 * 1000000h) +DD (OP_103a - OP_1000) + (1 * 1000000h) +DD (OP_103b - OP_1000) + (1 * 1000000h) +DD (OP_103c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (67 * 1000000h) +DD (OP_1080 - OP_1000) + (16 * 1000000h) +DD (OP_1090 - OP_1000) + (8 * 1000000h) +DD (OP_1098 - OP_1000) + (7 * 1000000h) +DD (OP_109f - OP_1000) + (1 * 1000000h) +DD (OP_10a0 - OP_1000) + (7 * 1000000h) +DD (OP_10a7 - OP_1000) + (1 * 1000000h) +DD (OP_10a8 - OP_1000) + (8 * 1000000h) +DD (OP_10b0 - OP_1000) + (8 * 1000000h) +DD (OP_10b8 - OP_1000) + (1 * 1000000h) +DD (OP_10b9 - OP_1000) + (1 * 1000000h) +DD (OP_10ba - OP_1000) + (1 * 1000000h) +DD (OP_10bb - OP_1000) + (1 * 1000000h) +DD (OP_10bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_10c0 - OP_1000) + (16 * 1000000h) +DD (OP_10d0 - OP_1000) + (8 * 1000000h) +DD (OP_10d8 - OP_1000) + (7 * 1000000h) +DD (OP_10df - OP_1000) + (1 * 1000000h) +DD (OP_10e0 - OP_1000) + (7 * 1000000h) +DD (OP_10e7 - OP_1000) + (1 * 1000000h) +DD (OP_10e8 - OP_1000) + (8 * 1000000h) +DD (OP_10f0 - OP_1000) + (8 * 1000000h) +DD (OP_10f8 - OP_1000) + (1 * 1000000h) +DD (OP_10f9 - OP_1000) + (1 * 1000000h) +DD (OP_10fa - OP_1000) + (1 * 1000000h) +DD (OP_10fb - OP_1000) + (1 * 1000000h) +DD (OP_10fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_1100 - OP_1000) + (16 * 1000000h) +DD (OP_1110 - OP_1000) + (8 * 1000000h) +DD (OP_1118 - OP_1000) + (7 * 1000000h) +DD (OP_111f - OP_1000) + (1 * 1000000h) +DD (OP_1120 - OP_1000) + (7 * 1000000h) +DD (OP_1127 - OP_1000) + (1 * 1000000h) +DD (OP_1128 - OP_1000) + (8 * 1000000h) +DD (OP_1130 - OP_1000) + (8 * 1000000h) +DD (OP_1138 - OP_1000) + (1 * 1000000h) +DD (OP_1139 - OP_1000) + (1 * 1000000h) +DD (OP_113a - OP_1000) + (1 * 1000000h) +DD (OP_113b - OP_1000) + (1 * 1000000h) +DD (OP_113c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_1140 - OP_1000) + (16 * 1000000h) +DD (OP_1150 - OP_1000) + (8 * 1000000h) +DD (OP_1158 - OP_1000) + (7 * 1000000h) +DD (OP_115f - OP_1000) + (1 * 1000000h) +DD (OP_1160 - OP_1000) + (7 * 1000000h) +DD (OP_1167 - OP_1000) + (1 * 1000000h) +DD (OP_1168 - OP_1000) + (8 * 1000000h) +DD (OP_1170 - OP_1000) + (8 * 1000000h) +DD (OP_1178 - OP_1000) + (1 * 1000000h) +DD (OP_1179 - OP_1000) + (1 * 1000000h) +DD (OP_117a - OP_1000) + (1 * 1000000h) +DD (OP_117b - OP_1000) + (1 * 1000000h) +DD (OP_117c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_1180 - OP_1000) + (16 * 1000000h) +DD (OP_1190 - OP_1000) + (8 * 1000000h) +DD (OP_1198 - OP_1000) + (7 * 1000000h) +DD (OP_119f - OP_1000) + (1 * 1000000h) +DD (OP_11a0 - OP_1000) + (7 * 1000000h) +DD (OP_11a7 - OP_1000) + (1 * 1000000h) +DD (OP_11a8 - OP_1000) + (8 * 1000000h) +DD (OP_11b0 - OP_1000) + (8 * 1000000h) +DD (OP_11b8 - OP_1000) + (1 * 1000000h) +DD (OP_11b9 - OP_1000) + (1 * 1000000h) +DD (OP_11ba - OP_1000) + (1 * 1000000h) +DD (OP_11bb - OP_1000) + (1 * 1000000h) +DD (OP_11bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_11c0 - OP_1000) + (16 * 1000000h) +DD (OP_11d0 - OP_1000) + (8 * 1000000h) +DD (OP_11d8 - OP_1000) + (7 * 1000000h) +DD (OP_11df - OP_1000) + (1 * 1000000h) +DD (OP_11e0 - OP_1000) + (7 * 1000000h) +DD (OP_11e7 - OP_1000) + (1 * 1000000h) +DD (OP_11e8 - OP_1000) + (8 * 1000000h) +DD (OP_11f0 - OP_1000) + (8 * 1000000h) +DD (OP_11f8 - OP_1000) + (1 * 1000000h) +DD (OP_11f9 - OP_1000) + (1 * 1000000h) +DD (OP_11fa - OP_1000) + (1 * 1000000h) +DD (OP_11fb - OP_1000) + (1 * 1000000h) +DD (OP_11fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_1000 - OP_1000) + (16 * 1000000h) +DD (OP_1010 - OP_1000) + (8 * 1000000h) +DD (OP_1018 - OP_1000) + (7 * 1000000h) +DD (OP_101f - OP_1000) + (1 * 1000000h) +DD (OP_1020 - OP_1000) + (7 * 1000000h) +DD (OP_1027 - OP_1000) + (1 * 1000000h) +DD (OP_1028 - OP_1000) + (8 * 1000000h) +DD (OP_1030 - OP_1000) + (8 * 1000000h) +DD (OP_1038 - OP_1000) + (1 * 1000000h) +DD (OP_1039 - OP_1000) + (1 * 1000000h) +DD (OP_103a - OP_1000) + (1 * 1000000h) +DD (OP_103b - OP_1000) + (1 * 1000000h) +DD (OP_103c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (67 * 1000000h) +DD (OP_1080 - OP_1000) + (16 * 1000000h) +DD (OP_1090 - OP_1000) + (8 * 1000000h) +DD (OP_1098 - OP_1000) + (7 * 1000000h) +DD (OP_109f - OP_1000) + (1 * 1000000h) +DD (OP_10a0 - OP_1000) + (7 * 1000000h) +DD (OP_10a7 - OP_1000) + (1 * 1000000h) +DD (OP_10a8 - OP_1000) + (8 * 1000000h) +DD (OP_10b0 - OP_1000) + (8 * 1000000h) +DD (OP_10b8 - OP_1000) + (1 * 1000000h) +DD (OP_10b9 - OP_1000) + (1 * 1000000h) +DD (OP_10ba - OP_1000) + (1 * 1000000h) +DD (OP_10bb - OP_1000) + (1 * 1000000h) +DD (OP_10bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_10c0 - OP_1000) + (16 * 1000000h) +DD (OP_10d0 - OP_1000) + (8 * 1000000h) +DD (OP_10d8 - OP_1000) + (7 * 1000000h) +DD (OP_10df - OP_1000) + (1 * 1000000h) +DD (OP_10e0 - OP_1000) + (7 * 1000000h) +DD (OP_10e7 - OP_1000) + (1 * 1000000h) +DD (OP_10e8 - OP_1000) + (8 * 1000000h) +DD (OP_10f0 - OP_1000) + (8 * 1000000h) +DD (OP_10f8 - OP_1000) + (1 * 1000000h) +DD (OP_10f9 - OP_1000) + (1 * 1000000h) +DD (OP_10fa - OP_1000) + (1 * 1000000h) +DD (OP_10fb - OP_1000) + (1 * 1000000h) +DD (OP_10fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_1100 - OP_1000) + (16 * 1000000h) +DD (OP_1110 - OP_1000) + (8 * 1000000h) +DD (OP_1118 - OP_1000) + (7 * 1000000h) +DD (OP_111f - OP_1000) + (1 * 1000000h) +DD (OP_1120 - OP_1000) + (7 * 1000000h) +DD (OP_1127 - OP_1000) + (1 * 1000000h) +DD (OP_1128 - OP_1000) + (8 * 1000000h) +DD (OP_1130 - OP_1000) + (8 * 1000000h) +DD (OP_1138 - OP_1000) + (1 * 1000000h) +DD (OP_1139 - OP_1000) + (1 * 1000000h) +DD (OP_113a - OP_1000) + (1 * 1000000h) +DD (OP_113b - OP_1000) + (1 * 1000000h) +DD (OP_113c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_1140 - OP_1000) + (16 * 1000000h) +DD (OP_1150 - OP_1000) + (8 * 1000000h) +DD (OP_1158 - OP_1000) + (7 * 1000000h) +DD (OP_115f - OP_1000) + (1 * 1000000h) +DD (OP_1160 - OP_1000) + (7 * 1000000h) +DD (OP_1167 - OP_1000) + (1 * 1000000h) +DD (OP_1168 - OP_1000) + (8 * 1000000h) +DD (OP_1170 - OP_1000) + (8 * 1000000h) +DD (OP_1178 - OP_1000) + (1 * 1000000h) +DD (OP_1179 - OP_1000) + (1 * 1000000h) +DD (OP_117a - OP_1000) + (1 * 1000000h) +DD (OP_117b - OP_1000) + (1 * 1000000h) +DD (OP_117c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_1180 - OP_1000) + (16 * 1000000h) +DD (OP_1190 - OP_1000) + (8 * 1000000h) +DD (OP_1198 - OP_1000) + (7 * 1000000h) +DD (OP_119f - OP_1000) + (1 * 1000000h) +DD (OP_11a0 - OP_1000) + (7 * 1000000h) +DD (OP_11a7 - OP_1000) + (1 * 1000000h) +DD (OP_11a8 - OP_1000) + (8 * 1000000h) +DD (OP_11b0 - OP_1000) + (8 * 1000000h) +DD (OP_11b8 - OP_1000) + (1 * 1000000h) +DD (OP_11b9 - OP_1000) + (1 * 1000000h) +DD (OP_11ba - OP_1000) + (1 * 1000000h) +DD (OP_11bb - OP_1000) + (1 * 1000000h) +DD (OP_11bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_13c0 - OP_1000) + (16 * 1000000h) +DD (OP_13d0 - OP_1000) + (8 * 1000000h) +DD (OP_13d8 - OP_1000) + (7 * 1000000h) +DD (OP_13df - OP_1000) + (1 * 1000000h) +DD (OP_13e0 - OP_1000) + (7 * 1000000h) +DD (OP_13e7 - OP_1000) + (1 * 1000000h) +DD (OP_13e8 - OP_1000) + (8 * 1000000h) +DD (OP_13f0 - OP_1000) + (8 * 1000000h) +DD (OP_13f8 - OP_1000) + (1 * 1000000h) +DD (OP_13f9 - OP_1000) + (1 * 1000000h) +DD (OP_13fa - OP_1000) + (1 * 1000000h) +DD (OP_13fb - OP_1000) + (1 * 1000000h) +DD (OP_13fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_1000 - OP_1000) + (16 * 1000000h) +DD (OP_1010 - OP_1000) + (8 * 1000000h) +DD (OP_1018 - OP_1000) + (7 * 1000000h) +DD (OP_101f - OP_1000) + (1 * 1000000h) +DD (OP_1020 - OP_1000) + (7 * 1000000h) +DD (OP_1027 - OP_1000) + (1 * 1000000h) +DD (OP_1028 - OP_1000) + (8 * 1000000h) +DD (OP_1030 - OP_1000) + (8 * 1000000h) +DD (OP_1038 - OP_1000) + (1 * 1000000h) +DD (OP_1039 - OP_1000) + (1 * 1000000h) +DD (OP_103a - OP_1000) + (1 * 1000000h) +DD (OP_103b - OP_1000) + (1 * 1000000h) +DD (OP_103c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (67 * 1000000h) +DD (OP_1080 - OP_1000) + (16 * 1000000h) +DD (OP_1090 - OP_1000) + (8 * 1000000h) +DD (OP_1098 - OP_1000) + (7 * 1000000h) +DD (OP_109f - OP_1000) + (1 * 1000000h) +DD (OP_10a0 - OP_1000) + (7 * 1000000h) +DD (OP_10a7 - OP_1000) + (1 * 1000000h) +DD (OP_10a8 - OP_1000) + (8 * 1000000h) +DD (OP_10b0 - OP_1000) + (8 * 1000000h) +DD (OP_10b8 - OP_1000) + (1 * 1000000h) +DD (OP_10b9 - OP_1000) + (1 * 1000000h) +DD (OP_10ba - OP_1000) + (1 * 1000000h) +DD (OP_10bb - OP_1000) + (1 * 1000000h) +DD (OP_10bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_10c0 - OP_1000) + (16 * 1000000h) +DD (OP_10d0 - OP_1000) + (8 * 1000000h) +DD (OP_10d8 - OP_1000) + (7 * 1000000h) +DD (OP_10df - OP_1000) + (1 * 1000000h) +DD (OP_10e0 - OP_1000) + (7 * 1000000h) +DD (OP_10e7 - OP_1000) + (1 * 1000000h) +DD (OP_10e8 - OP_1000) + (8 * 1000000h) +DD (OP_10f0 - OP_1000) + (8 * 1000000h) +DD (OP_10f8 - OP_1000) + (1 * 1000000h) +DD (OP_10f9 - OP_1000) + (1 * 1000000h) +DD (OP_10fa - OP_1000) + (1 * 1000000h) +DD (OP_10fb - OP_1000) + (1 * 1000000h) +DD (OP_10fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_1100 - OP_1000) + (16 * 1000000h) +DD (OP_1110 - OP_1000) + (8 * 1000000h) +DD (OP_1118 - OP_1000) + (7 * 1000000h) +DD (OP_111f - OP_1000) + (1 * 1000000h) +DD (OP_1120 - OP_1000) + (7 * 1000000h) +DD (OP_1127 - OP_1000) + (1 * 1000000h) +DD (OP_1128 - OP_1000) + (8 * 1000000h) +DD (OP_1130 - OP_1000) + (8 * 1000000h) +DD (OP_1138 - OP_1000) + (1 * 1000000h) +DD (OP_1139 - OP_1000) + (1 * 1000000h) +DD (OP_113a - OP_1000) + (1 * 1000000h) +DD (OP_113b - OP_1000) + (1 * 1000000h) +DD (OP_113c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_1140 - OP_1000) + (16 * 1000000h) +DD (OP_1150 - OP_1000) + (8 * 1000000h) +DD (OP_1158 - OP_1000) + (7 * 1000000h) +DD (OP_115f - OP_1000) + (1 * 1000000h) +DD (OP_1160 - OP_1000) + (7 * 1000000h) +DD (OP_1167 - OP_1000) + (1 * 1000000h) +DD (OP_1168 - OP_1000) + (8 * 1000000h) +DD (OP_1170 - OP_1000) + (8 * 1000000h) +DD (OP_1178 - OP_1000) + (1 * 1000000h) +DD (OP_1179 - OP_1000) + (1 * 1000000h) +DD (OP_117a - OP_1000) + (1 * 1000000h) +DD (OP_117b - OP_1000) + (1 * 1000000h) +DD (OP_117c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_1180 - OP_1000) + (16 * 1000000h) +DD (OP_1190 - OP_1000) + (8 * 1000000h) +DD (OP_1198 - OP_1000) + (7 * 1000000h) +DD (OP_119f - OP_1000) + (1 * 1000000h) +DD (OP_11a0 - OP_1000) + (7 * 1000000h) +DD (OP_11a7 - OP_1000) + (1 * 1000000h) +DD (OP_11a8 - OP_1000) + (8 * 1000000h) +DD (OP_11b0 - OP_1000) + (8 * 1000000h) +DD (OP_11b8 - OP_1000) + (1 * 1000000h) +DD (OP_11b9 - OP_1000) + (1 * 1000000h) +DD (OP_11ba - OP_1000) + (1 * 1000000h) +DD (OP_11bb - OP_1000) + (1 * 1000000h) +DD (OP_11bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (67 * 1000000h) +DD (OP_1000 - OP_1000) + (16 * 1000000h) +DD (OP_1010 - OP_1000) + (8 * 1000000h) +DD (OP_1018 - OP_1000) + (7 * 1000000h) +DD (OP_101f - OP_1000) + (1 * 1000000h) +DD (OP_1020 - OP_1000) + (7 * 1000000h) +DD (OP_1027 - OP_1000) + (1 * 1000000h) +DD (OP_1028 - OP_1000) + (8 * 1000000h) +DD (OP_1030 - OP_1000) + (8 * 1000000h) +DD (OP_1038 - OP_1000) + (1 * 1000000h) +DD (OP_1039 - OP_1000) + (1 * 1000000h) +DD (OP_103a - OP_1000) + (1 * 1000000h) +DD (OP_103b - OP_1000) + (1 * 1000000h) +DD (OP_103c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (67 * 1000000h) +DD (OP_1080 - OP_1000) + (16 * 1000000h) +DD (OP_1090 - OP_1000) + (8 * 1000000h) +DD (OP_1098 - OP_1000) + (7 * 1000000h) +DD (OP_109f - OP_1000) + (1 * 1000000h) +DD (OP_10a0 - OP_1000) + (7 * 1000000h) +DD (OP_10a7 - OP_1000) + (1 * 1000000h) +DD (OP_10a8 - OP_1000) + (8 * 1000000h) +DD (OP_10b0 - OP_1000) + (8 * 1000000h) +DD (OP_10b8 - OP_1000) + (1 * 1000000h) +DD (OP_10b9 - OP_1000) + (1 * 1000000h) +DD (OP_10ba - OP_1000) + (1 * 1000000h) +DD (OP_10bb - OP_1000) + (1 * 1000000h) +DD (OP_10bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_10c0 - OP_1000) + (16 * 1000000h) +DD (OP_10d0 - OP_1000) + (8 * 1000000h) +DD (OP_10d8 - OP_1000) + (7 * 1000000h) +DD (OP_10df - OP_1000) + (1 * 1000000h) +DD (OP_10e0 - OP_1000) + (7 * 1000000h) +DD (OP_10e7 - OP_1000) + (1 * 1000000h) +DD (OP_10e8 - OP_1000) + (8 * 1000000h) +DD (OP_10f0 - OP_1000) + (8 * 1000000h) +DD (OP_10f8 - OP_1000) + (1 * 1000000h) +DD (OP_10f9 - OP_1000) + (1 * 1000000h) +DD (OP_10fa - OP_1000) + (1 * 1000000h) +DD (OP_10fb - OP_1000) + (1 * 1000000h) +DD (OP_10fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_1100 - OP_1000) + (16 * 1000000h) +DD (OP_1110 - OP_1000) + (8 * 1000000h) +DD (OP_1118 - OP_1000) + (7 * 1000000h) +DD (OP_111f - OP_1000) + (1 * 1000000h) +DD (OP_1120 - OP_1000) + (7 * 1000000h) +DD (OP_1127 - OP_1000) + (1 * 1000000h) +DD (OP_1128 - OP_1000) + (8 * 1000000h) +DD (OP_1130 - OP_1000) + (8 * 1000000h) +DD (OP_1138 - OP_1000) + (1 * 1000000h) +DD (OP_1139 - OP_1000) + (1 * 1000000h) +DD (OP_113a - OP_1000) + (1 * 1000000h) +DD (OP_113b - OP_1000) + (1 * 1000000h) +DD (OP_113c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_1140 - OP_1000) + (16 * 1000000h) +DD (OP_1150 - OP_1000) + (8 * 1000000h) +DD (OP_1158 - OP_1000) + (7 * 1000000h) +DD (OP_115f - OP_1000) + (1 * 1000000h) +DD (OP_1160 - OP_1000) + (7 * 1000000h) +DD (OP_1167 - OP_1000) + (1 * 1000000h) +DD (OP_1168 - OP_1000) + (8 * 1000000h) +DD (OP_1170 - OP_1000) + (8 * 1000000h) +DD (OP_1178 - OP_1000) + (1 * 1000000h) +DD (OP_1179 - OP_1000) + (1 * 1000000h) +DD (OP_117a - OP_1000) + (1 * 1000000h) +DD (OP_117b - OP_1000) + (1 * 1000000h) +DD (OP_117c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_1180 - OP_1000) + (16 * 1000000h) +DD (OP_1190 - OP_1000) + (8 * 1000000h) +DD (OP_1198 - OP_1000) + (7 * 1000000h) +DD (OP_119f - OP_1000) + (1 * 1000000h) +DD (OP_11a0 - OP_1000) + (7 * 1000000h) +DD (OP_11a7 - OP_1000) + (1 * 1000000h) +DD (OP_11a8 - OP_1000) + (8 * 1000000h) +DD (OP_11b0 - OP_1000) + (8 * 1000000h) +DD (OP_11b8 - OP_1000) + (1 * 1000000h) +DD (OP_11b9 - OP_1000) + (1 * 1000000h) +DD (OP_11ba - OP_1000) + (1 * 1000000h) +DD (OP_11bb - OP_1000) + (1 * 1000000h) +DD (OP_11bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (67 * 1000000h) +DD (OP_1000 - OP_1000) + (16 * 1000000h) +DD (OP_1010 - OP_1000) + (8 * 1000000h) +DD (OP_1018 - OP_1000) + (7 * 1000000h) +DD (OP_101f - OP_1000) + (1 * 1000000h) +DD (OP_1020 - OP_1000) + (7 * 1000000h) +DD (OP_1027 - OP_1000) + (1 * 1000000h) +DD (OP_1028 - OP_1000) + (8 * 1000000h) +DD (OP_1030 - OP_1000) + (8 * 1000000h) +DD (OP_1038 - OP_1000) + (1 * 1000000h) +DD (OP_1039 - OP_1000) + (1 * 1000000h) +DD (OP_103a - OP_1000) + (1 * 1000000h) +DD (OP_103b - OP_1000) + (1 * 1000000h) +DD (OP_103c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (67 * 1000000h) +DD (OP_1080 - OP_1000) + (16 * 1000000h) +DD (OP_1090 - OP_1000) + (8 * 1000000h) +DD (OP_1098 - OP_1000) + (7 * 1000000h) +DD (OP_109f - OP_1000) + (1 * 1000000h) +DD (OP_10a0 - OP_1000) + (7 * 1000000h) +DD (OP_10a7 - OP_1000) + (1 * 1000000h) +DD (OP_10a8 - OP_1000) + (8 * 1000000h) +DD (OP_10b0 - OP_1000) + (8 * 1000000h) +DD (OP_10b8 - OP_1000) + (1 * 1000000h) +DD (OP_10b9 - OP_1000) + (1 * 1000000h) +DD (OP_10ba - OP_1000) + (1 * 1000000h) +DD (OP_10bb - OP_1000) + (1 * 1000000h) +DD (OP_10bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_10c0 - OP_1000) + (16 * 1000000h) +DD (OP_10d0 - OP_1000) + (8 * 1000000h) +DD (OP_10d8 - OP_1000) + (7 * 1000000h) +DD (OP_10df - OP_1000) + (1 * 1000000h) +DD (OP_10e0 - OP_1000) + (7 * 1000000h) +DD (OP_10e7 - OP_1000) + (1 * 1000000h) +DD (OP_10e8 - OP_1000) + (8 * 1000000h) +DD (OP_10f0 - OP_1000) + (8 * 1000000h) +DD (OP_10f8 - OP_1000) + (1 * 1000000h) +DD (OP_10f9 - OP_1000) + (1 * 1000000h) +DD (OP_10fa - OP_1000) + (1 * 1000000h) +DD (OP_10fb - OP_1000) + (1 * 1000000h) +DD (OP_10fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_1100 - OP_1000) + (16 * 1000000h) +DD (OP_1110 - OP_1000) + (8 * 1000000h) +DD (OP_1118 - OP_1000) + (7 * 1000000h) +DD (OP_111f - OP_1000) + (1 * 1000000h) +DD (OP_1120 - OP_1000) + (7 * 1000000h) +DD (OP_1127 - OP_1000) + (1 * 1000000h) +DD (OP_1128 - OP_1000) + (8 * 1000000h) +DD (OP_1130 - OP_1000) + (8 * 1000000h) +DD (OP_1138 - OP_1000) + (1 * 1000000h) +DD (OP_1139 - OP_1000) + (1 * 1000000h) +DD (OP_113a - OP_1000) + (1 * 1000000h) +DD (OP_113b - OP_1000) + (1 * 1000000h) +DD (OP_113c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_1140 - OP_1000) + (16 * 1000000h) +DD (OP_1150 - OP_1000) + (8 * 1000000h) +DD (OP_1158 - OP_1000) + (7 * 1000000h) +DD (OP_115f - OP_1000) + (1 * 1000000h) +DD (OP_1160 - OP_1000) + (7 * 1000000h) +DD (OP_1167 - OP_1000) + (1 * 1000000h) +DD (OP_1168 - OP_1000) + (8 * 1000000h) +DD (OP_1170 - OP_1000) + (8 * 1000000h) +DD (OP_1178 - OP_1000) + (1 * 1000000h) +DD (OP_1179 - OP_1000) + (1 * 1000000h) +DD (OP_117a - OP_1000) + (1 * 1000000h) +DD (OP_117b - OP_1000) + (1 * 1000000h) +DD (OP_117c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_1180 - OP_1000) + (16 * 1000000h) +DD (OP_1190 - OP_1000) + (8 * 1000000h) +DD (OP_1198 - OP_1000) + (7 * 1000000h) +DD (OP_119f - OP_1000) + (1 * 1000000h) +DD (OP_11a0 - OP_1000) + (7 * 1000000h) +DD (OP_11a7 - OP_1000) + (1 * 1000000h) +DD (OP_11a8 - OP_1000) + (8 * 1000000h) +DD (OP_11b0 - OP_1000) + (8 * 1000000h) +DD (OP_11b8 - OP_1000) + (1 * 1000000h) +DD (OP_11b9 - OP_1000) + (1 * 1000000h) +DD (OP_11ba - OP_1000) + (1 * 1000000h) +DD (OP_11bb - OP_1000) + (1 * 1000000h) +DD (OP_11bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (67 * 1000000h) +DD (OP_1000 - OP_1000) + (16 * 1000000h) +DD (OP_1010 - OP_1000) + (8 * 1000000h) +DD (OP_1018 - OP_1000) + (7 * 1000000h) +DD (OP_101f - OP_1000) + (1 * 1000000h) +DD (OP_1020 - OP_1000) + (7 * 1000000h) +DD (OP_1027 - OP_1000) + (1 * 1000000h) +DD (OP_1028 - OP_1000) + (8 * 1000000h) +DD (OP_1030 - OP_1000) + (8 * 1000000h) +DD (OP_1038 - OP_1000) + (1 * 1000000h) +DD (OP_1039 - OP_1000) + (1 * 1000000h) +DD (OP_103a - OP_1000) + (1 * 1000000h) +DD (OP_103b - OP_1000) + (1 * 1000000h) +DD (OP_103c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (67 * 1000000h) +DD (OP_1080 - OP_1000) + (16 * 1000000h) +DD (OP_1090 - OP_1000) + (8 * 1000000h) +DD (OP_1098 - OP_1000) + (7 * 1000000h) +DD (OP_109f - OP_1000) + (1 * 1000000h) +DD (OP_10a0 - OP_1000) + (7 * 1000000h) +DD (OP_10a7 - OP_1000) + (1 * 1000000h) +DD (OP_10a8 - OP_1000) + (8 * 1000000h) +DD (OP_10b0 - OP_1000) + (8 * 1000000h) +DD (OP_10b8 - OP_1000) + (1 * 1000000h) +DD (OP_10b9 - OP_1000) + (1 * 1000000h) +DD (OP_10ba - OP_1000) + (1 * 1000000h) +DD (OP_10bb - OP_1000) + (1 * 1000000h) +DD (OP_10bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_10c0 - OP_1000) + (16 * 1000000h) +DD (OP_10d0 - OP_1000) + (8 * 1000000h) +DD (OP_10d8 - OP_1000) + (7 * 1000000h) +DD (OP_10df - OP_1000) + (1 * 1000000h) +DD (OP_10e0 - OP_1000) + (7 * 1000000h) +DD (OP_10e7 - OP_1000) + (1 * 1000000h) +DD (OP_10e8 - OP_1000) + (8 * 1000000h) +DD (OP_10f0 - OP_1000) + (8 * 1000000h) +DD (OP_10f8 - OP_1000) + (1 * 1000000h) +DD (OP_10f9 - OP_1000) + (1 * 1000000h) +DD (OP_10fa - OP_1000) + (1 * 1000000h) +DD (OP_10fb - OP_1000) + (1 * 1000000h) +DD (OP_10fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_1100 - OP_1000) + (16 * 1000000h) +DD (OP_1110 - OP_1000) + (8 * 1000000h) +DD (OP_1118 - OP_1000) + (7 * 1000000h) +DD (OP_111f - OP_1000) + (1 * 1000000h) +DD (OP_1120 - OP_1000) + (7 * 1000000h) +DD (OP_1127 - OP_1000) + (1 * 1000000h) +DD (OP_1128 - OP_1000) + (8 * 1000000h) +DD (OP_1130 - OP_1000) + (8 * 1000000h) +DD (OP_1138 - OP_1000) + (1 * 1000000h) +DD (OP_1139 - OP_1000) + (1 * 1000000h) +DD (OP_113a - OP_1000) + (1 * 1000000h) +DD (OP_113b - OP_1000) + (1 * 1000000h) +DD (OP_113c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_1140 - OP_1000) + (16 * 1000000h) +DD (OP_1150 - OP_1000) + (8 * 1000000h) +DD (OP_1158 - OP_1000) + (7 * 1000000h) +DD (OP_115f - OP_1000) + (1 * 1000000h) +DD (OP_1160 - OP_1000) + (7 * 1000000h) +DD (OP_1167 - OP_1000) + (1 * 1000000h) +DD (OP_1168 - OP_1000) + (8 * 1000000h) +DD (OP_1170 - OP_1000) + (8 * 1000000h) +DD (OP_1178 - OP_1000) + (1 * 1000000h) +DD (OP_1179 - OP_1000) + (1 * 1000000h) +DD (OP_117a - OP_1000) + (1 * 1000000h) +DD (OP_117b - OP_1000) + (1 * 1000000h) +DD (OP_117c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_1180 - OP_1000) + (16 * 1000000h) +DD (OP_1190 - OP_1000) + (8 * 1000000h) +DD (OP_1198 - OP_1000) + (7 * 1000000h) +DD (OP_119f - OP_1000) + (1 * 1000000h) +DD (OP_11a0 - OP_1000) + (7 * 1000000h) +DD (OP_11a7 - OP_1000) + (1 * 1000000h) +DD (OP_11a8 - OP_1000) + (8 * 1000000h) +DD (OP_11b0 - OP_1000) + (8 * 1000000h) +DD (OP_11b8 - OP_1000) + (1 * 1000000h) +DD (OP_11b9 - OP_1000) + (1 * 1000000h) +DD (OP_11ba - OP_1000) + (1 * 1000000h) +DD (OP_11bb - OP_1000) + (1 * 1000000h) +DD (OP_11bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (67 * 1000000h) +DD (OP_1000 - OP_1000) + (16 * 1000000h) +DD (OP_1010 - OP_1000) + (8 * 1000000h) +DD (OP_1018 - OP_1000) + (7 * 1000000h) +DD (OP_101f - OP_1000) + (1 * 1000000h) +DD (OP_1020 - OP_1000) + (7 * 1000000h) +DD (OP_1027 - OP_1000) + (1 * 1000000h) +DD (OP_1028 - OP_1000) + (8 * 1000000h) +DD (OP_1030 - OP_1000) + (8 * 1000000h) +DD (OP_1038 - OP_1000) + (1 * 1000000h) +DD (OP_1039 - OP_1000) + (1 * 1000000h) +DD (OP_103a - OP_1000) + (1 * 1000000h) +DD (OP_103b - OP_1000) + (1 * 1000000h) +DD (OP_103c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (67 * 1000000h) +DD (OP_1080 - OP_1000) + (16 * 1000000h) +DD (OP_1090 - OP_1000) + (8 * 1000000h) +DD (OP_1098 - OP_1000) + (7 * 1000000h) +DD (OP_109f - OP_1000) + (1 * 1000000h) +DD (OP_10a0 - OP_1000) + (7 * 1000000h) +DD (OP_10a7 - OP_1000) + (1 * 1000000h) +DD (OP_10a8 - OP_1000) + (8 * 1000000h) +DD (OP_10b0 - OP_1000) + (8 * 1000000h) +DD (OP_10b8 - OP_1000) + (1 * 1000000h) +DD (OP_10b9 - OP_1000) + (1 * 1000000h) +DD (OP_10ba - OP_1000) + (1 * 1000000h) +DD (OP_10bb - OP_1000) + (1 * 1000000h) +DD (OP_10bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_10c0 - OP_1000) + (16 * 1000000h) +DD (OP_10d0 - OP_1000) + (8 * 1000000h) +DD (OP_10d8 - OP_1000) + (7 * 1000000h) +DD (OP_10df - OP_1000) + (1 * 1000000h) +DD (OP_10e0 - OP_1000) + (7 * 1000000h) +DD (OP_10e7 - OP_1000) + (1 * 1000000h) +DD (OP_10e8 - OP_1000) + (8 * 1000000h) +DD (OP_10f0 - OP_1000) + (8 * 1000000h) +DD (OP_10f8 - OP_1000) + (1 * 1000000h) +DD (OP_10f9 - OP_1000) + (1 * 1000000h) +DD (OP_10fa - OP_1000) + (1 * 1000000h) +DD (OP_10fb - OP_1000) + (1 * 1000000h) +DD (OP_10fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_1100 - OP_1000) + (16 * 1000000h) +DD (OP_1110 - OP_1000) + (8 * 1000000h) +DD (OP_1118 - OP_1000) + (7 * 1000000h) +DD (OP_111f - OP_1000) + (1 * 1000000h) +DD (OP_1120 - OP_1000) + (7 * 1000000h) +DD (OP_1127 - OP_1000) + (1 * 1000000h) +DD (OP_1128 - OP_1000) + (8 * 1000000h) +DD (OP_1130 - OP_1000) + (8 * 1000000h) +DD (OP_1138 - OP_1000) + (1 * 1000000h) +DD (OP_1139 - OP_1000) + (1 * 1000000h) +DD (OP_113a - OP_1000) + (1 * 1000000h) +DD (OP_113b - OP_1000) + (1 * 1000000h) +DD (OP_113c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_1140 - OP_1000) + (16 * 1000000h) +DD (OP_1150 - OP_1000) + (8 * 1000000h) +DD (OP_1158 - OP_1000) + (7 * 1000000h) +DD (OP_115f - OP_1000) + (1 * 1000000h) +DD (OP_1160 - OP_1000) + (7 * 1000000h) +DD (OP_1167 - OP_1000) + (1 * 1000000h) +DD (OP_1168 - OP_1000) + (8 * 1000000h) +DD (OP_1170 - OP_1000) + (8 * 1000000h) +DD (OP_1178 - OP_1000) + (1 * 1000000h) +DD (OP_1179 - OP_1000) + (1 * 1000000h) +DD (OP_117a - OP_1000) + (1 * 1000000h) +DD (OP_117b - OP_1000) + (1 * 1000000h) +DD (OP_117c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_1180 - OP_1000) + (16 * 1000000h) +DD (OP_1190 - OP_1000) + (8 * 1000000h) +DD (OP_1198 - OP_1000) + (7 * 1000000h) +DD (OP_119f - OP_1000) + (1 * 1000000h) +DD (OP_11a0 - OP_1000) + (7 * 1000000h) +DD (OP_11a7 - OP_1000) + (1 * 1000000h) +DD (OP_11a8 - OP_1000) + (8 * 1000000h) +DD (OP_11b0 - OP_1000) + (8 * 1000000h) +DD (OP_11b8 - OP_1000) + (1 * 1000000h) +DD (OP_11b9 - OP_1000) + (1 * 1000000h) +DD (OP_11ba - OP_1000) + (1 * 1000000h) +DD (OP_11bb - OP_1000) + (1 * 1000000h) +DD (OP_11bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (67 * 1000000h) +DD (OP_1000 - OP_1000) + (16 * 1000000h) +DD (OP_1010 - OP_1000) + (8 * 1000000h) +DD (OP_1018 - OP_1000) + (7 * 1000000h) +DD (OP_101f - OP_1000) + (1 * 1000000h) +DD (OP_1020 - OP_1000) + (7 * 1000000h) +DD (OP_1027 - OP_1000) + (1 * 1000000h) +DD (OP_1028 - OP_1000) + (8 * 1000000h) +DD (OP_1030 - OP_1000) + (8 * 1000000h) +DD (OP_1038 - OP_1000) + (1 * 1000000h) +DD (OP_1039 - OP_1000) + (1 * 1000000h) +DD (OP_103a - OP_1000) + (1 * 1000000h) +DD (OP_103b - OP_1000) + (1 * 1000000h) +DD (OP_103c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (67 * 1000000h) +DD (OP_1080 - OP_1000) + (16 * 1000000h) +DD (OP_1090 - OP_1000) + (8 * 1000000h) +DD (OP_1098 - OP_1000) + (7 * 1000000h) +DD (OP_109f - OP_1000) + (1 * 1000000h) +DD (OP_10a0 - OP_1000) + (7 * 1000000h) +DD (OP_10a7 - OP_1000) + (1 * 1000000h) +DD (OP_10a8 - OP_1000) + (8 * 1000000h) +DD (OP_10b0 - OP_1000) + (8 * 1000000h) +DD (OP_10b8 - OP_1000) + (1 * 1000000h) +DD (OP_10b9 - OP_1000) + (1 * 1000000h) +DD (OP_10ba - OP_1000) + (1 * 1000000h) +DD (OP_10bb - OP_1000) + (1 * 1000000h) +DD (OP_10bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_1ec0 - OP_1000) + (16 * 1000000h) +DD (OP_1ed0 - OP_1000) + (8 * 1000000h) +DD (OP_1ed8 - OP_1000) + (7 * 1000000h) +DD (OP_1edf - OP_1000) + (1 * 1000000h) +DD (OP_1ee0 - OP_1000) + (7 * 1000000h) +DD (OP_1ee7 - OP_1000) + (1 * 1000000h) +DD (OP_1ee8 - OP_1000) + (8 * 1000000h) +DD (OP_1ef0 - OP_1000) + (8 * 1000000h) +DD (OP_1ef8 - OP_1000) + (1 * 1000000h) +DD (OP_1ef9 - OP_1000) + (1 * 1000000h) +DD (OP_1efa - OP_1000) + (1 * 1000000h) +DD (OP_1efb - OP_1000) + (1 * 1000000h) +DD (OP_1efc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_1f00 - OP_1000) + (16 * 1000000h) +DD (OP_1f10 - OP_1000) + (8 * 1000000h) +DD (OP_1f18 - OP_1000) + (7 * 1000000h) +DD (OP_1f1f - OP_1000) + (1 * 1000000h) +DD (OP_1f20 - OP_1000) + (7 * 1000000h) +DD (OP_1f27 - OP_1000) + (1 * 1000000h) +DD (OP_1f28 - OP_1000) + (8 * 1000000h) +DD (OP_1f30 - OP_1000) + (8 * 1000000h) +DD (OP_1f38 - OP_1000) + (1 * 1000000h) +DD (OP_1f39 - OP_1000) + (1 * 1000000h) +DD (OP_1f3a - OP_1000) + (1 * 1000000h) +DD (OP_1f3b - OP_1000) + (1 * 1000000h) +DD (OP_1f3c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_1140 - OP_1000) + (16 * 1000000h) +DD (OP_1150 - OP_1000) + (8 * 1000000h) +DD (OP_1158 - OP_1000) + (7 * 1000000h) +DD (OP_115f - OP_1000) + (1 * 1000000h) +DD (OP_1160 - OP_1000) + (7 * 1000000h) +DD (OP_1167 - OP_1000) + (1 * 1000000h) +DD (OP_1168 - OP_1000) + (8 * 1000000h) +DD (OP_1170 - OP_1000) + (8 * 1000000h) +DD (OP_1178 - OP_1000) + (1 * 1000000h) +DD (OP_1179 - OP_1000) + (1 * 1000000h) +DD (OP_117a - OP_1000) + (1 * 1000000h) +DD (OP_117b - OP_1000) + (1 * 1000000h) +DD (OP_117c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_1180 - OP_1000) + (16 * 1000000h) +DD (OP_1190 - OP_1000) + (8 * 1000000h) +DD (OP_1198 - OP_1000) + (7 * 1000000h) +DD (OP_119f - OP_1000) + (1 * 1000000h) +DD (OP_11a0 - OP_1000) + (7 * 1000000h) +DD (OP_11a7 - OP_1000) + (1 * 1000000h) +DD (OP_11a8 - OP_1000) + (8 * 1000000h) +DD (OP_11b0 - OP_1000) + (8 * 1000000h) +DD (OP_11b8 - OP_1000) + (1 * 1000000h) +DD (OP_11b9 - OP_1000) + (1 * 1000000h) +DD (OP_11ba - OP_1000) + (1 * 1000000h) +DD (OP_11bb - OP_1000) + (1 * 1000000h) +DD (OP_11bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (67 * 1000000h) +DD (OP_2000 - OP_1000) + (16 * 1000000h) +DD (OP_2010 - OP_1000) + (8 * 1000000h) +DD (OP_2018 - OP_1000) + (8 * 1000000h) +DD (OP_2020 - OP_1000) + (8 * 1000000h) +DD (OP_2028 - OP_1000) + (8 * 1000000h) +DD (OP_2030 - OP_1000) + (8 * 1000000h) +DD (OP_2038 - OP_1000) + (1 * 1000000h) +DD (OP_2039 - OP_1000) + (1 * 1000000h) +DD (OP_203a - OP_1000) + (1 * 1000000h) +DD (OP_203b - OP_1000) + (1 * 1000000h) +DD (OP_203c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2040 - OP_1000) + (16 * 1000000h) +DD (OP_2050 - OP_1000) + (8 * 1000000h) +DD (OP_2058 - OP_1000) + (8 * 1000000h) +DD (OP_2060 - OP_1000) + (8 * 1000000h) +DD (OP_2068 - OP_1000) + (8 * 1000000h) +DD (OP_2070 - OP_1000) + (8 * 1000000h) +DD (OP_2078 - OP_1000) + (1 * 1000000h) +DD (OP_2079 - OP_1000) + (1 * 1000000h) +DD (OP_207a - OP_1000) + (1 * 1000000h) +DD (OP_207b - OP_1000) + (1 * 1000000h) +DD (OP_207c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2080 - OP_1000) + (16 * 1000000h) +DD (OP_2090 - OP_1000) + (8 * 1000000h) +DD (OP_2098 - OP_1000) + (8 * 1000000h) +DD (OP_20a0 - OP_1000) + (8 * 1000000h) +DD (OP_20a8 - OP_1000) + (8 * 1000000h) +DD (OP_20b0 - OP_1000) + (8 * 1000000h) +DD (OP_20b8 - OP_1000) + (1 * 1000000h) +DD (OP_20b9 - OP_1000) + (1 * 1000000h) +DD (OP_20ba - OP_1000) + (1 * 1000000h) +DD (OP_20bb - OP_1000) + (1 * 1000000h) +DD (OP_20bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_20c0 - OP_1000) + (16 * 1000000h) +DD (OP_20d0 - OP_1000) + (8 * 1000000h) +DD (OP_20d8 - OP_1000) + (8 * 1000000h) +DD (OP_20e0 - OP_1000) + (8 * 1000000h) +DD (OP_20e8 - OP_1000) + (8 * 1000000h) +DD (OP_20f0 - OP_1000) + (8 * 1000000h) +DD (OP_20f8 - OP_1000) + (1 * 1000000h) +DD (OP_20f9 - OP_1000) + (1 * 1000000h) +DD (OP_20fa - OP_1000) + (1 * 1000000h) +DD (OP_20fb - OP_1000) + (1 * 1000000h) +DD (OP_20fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2100 - OP_1000) + (16 * 1000000h) +DD (OP_2110 - OP_1000) + (8 * 1000000h) +DD (OP_2118 - OP_1000) + (8 * 1000000h) +DD (OP_2120 - OP_1000) + (8 * 1000000h) +DD (OP_2128 - OP_1000) + (8 * 1000000h) +DD (OP_2130 - OP_1000) + (8 * 1000000h) +DD (OP_2138 - OP_1000) + (1 * 1000000h) +DD (OP_2139 - OP_1000) + (1 * 1000000h) +DD (OP_213a - OP_1000) + (1 * 1000000h) +DD (OP_213b - OP_1000) + (1 * 1000000h) +DD (OP_213c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2140 - OP_1000) + (16 * 1000000h) +DD (OP_2150 - OP_1000) + (8 * 1000000h) +DD (OP_2158 - OP_1000) + (8 * 1000000h) +DD (OP_2160 - OP_1000) + (8 * 1000000h) +DD (OP_2168 - OP_1000) + (8 * 1000000h) +DD (OP_2170 - OP_1000) + (8 * 1000000h) +DD (OP_2178 - OP_1000) + (1 * 1000000h) +DD (OP_2179 - OP_1000) + (1 * 1000000h) +DD (OP_217a - OP_1000) + (1 * 1000000h) +DD (OP_217b - OP_1000) + (1 * 1000000h) +DD (OP_217c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2180 - OP_1000) + (16 * 1000000h) +DD (OP_2190 - OP_1000) + (8 * 1000000h) +DD (OP_2198 - OP_1000) + (8 * 1000000h) +DD (OP_21a0 - OP_1000) + (8 * 1000000h) +DD (OP_21a8 - OP_1000) + (8 * 1000000h) +DD (OP_21b0 - OP_1000) + (8 * 1000000h) +DD (OP_21b8 - OP_1000) + (1 * 1000000h) +DD (OP_21b9 - OP_1000) + (1 * 1000000h) +DD (OP_21ba - OP_1000) + (1 * 1000000h) +DD (OP_21bb - OP_1000) + (1 * 1000000h) +DD (OP_21bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_21c0 - OP_1000) + (16 * 1000000h) +DD (OP_21d0 - OP_1000) + (8 * 1000000h) +DD (OP_21d8 - OP_1000) + (8 * 1000000h) +DD (OP_21e0 - OP_1000) + (8 * 1000000h) +DD (OP_21e8 - OP_1000) + (8 * 1000000h) +DD (OP_21f0 - OP_1000) + (8 * 1000000h) +DD (OP_21f8 - OP_1000) + (1 * 1000000h) +DD (OP_21f9 - OP_1000) + (1 * 1000000h) +DD (OP_21fa - OP_1000) + (1 * 1000000h) +DD (OP_21fb - OP_1000) + (1 * 1000000h) +DD (OP_21fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2000 - OP_1000) + (16 * 1000000h) +DD (OP_2010 - OP_1000) + (8 * 1000000h) +DD (OP_2018 - OP_1000) + (8 * 1000000h) +DD (OP_2020 - OP_1000) + (8 * 1000000h) +DD (OP_2028 - OP_1000) + (8 * 1000000h) +DD (OP_2030 - OP_1000) + (8 * 1000000h) +DD (OP_2038 - OP_1000) + (1 * 1000000h) +DD (OP_2039 - OP_1000) + (1 * 1000000h) +DD (OP_203a - OP_1000) + (1 * 1000000h) +DD (OP_203b - OP_1000) + (1 * 1000000h) +DD (OP_203c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2040 - OP_1000) + (16 * 1000000h) +DD (OP_2050 - OP_1000) + (8 * 1000000h) +DD (OP_2058 - OP_1000) + (8 * 1000000h) +DD (OP_2060 - OP_1000) + (8 * 1000000h) +DD (OP_2068 - OP_1000) + (8 * 1000000h) +DD (OP_2070 - OP_1000) + (8 * 1000000h) +DD (OP_2078 - OP_1000) + (1 * 1000000h) +DD (OP_2079 - OP_1000) + (1 * 1000000h) +DD (OP_207a - OP_1000) + (1 * 1000000h) +DD (OP_207b - OP_1000) + (1 * 1000000h) +DD (OP_207c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2080 - OP_1000) + (16 * 1000000h) +DD (OP_2090 - OP_1000) + (8 * 1000000h) +DD (OP_2098 - OP_1000) + (8 * 1000000h) +DD (OP_20a0 - OP_1000) + (8 * 1000000h) +DD (OP_20a8 - OP_1000) + (8 * 1000000h) +DD (OP_20b0 - OP_1000) + (8 * 1000000h) +DD (OP_20b8 - OP_1000) + (1 * 1000000h) +DD (OP_20b9 - OP_1000) + (1 * 1000000h) +DD (OP_20ba - OP_1000) + (1 * 1000000h) +DD (OP_20bb - OP_1000) + (1 * 1000000h) +DD (OP_20bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_20c0 - OP_1000) + (16 * 1000000h) +DD (OP_20d0 - OP_1000) + (8 * 1000000h) +DD (OP_20d8 - OP_1000) + (8 * 1000000h) +DD (OP_20e0 - OP_1000) + (8 * 1000000h) +DD (OP_20e8 - OP_1000) + (8 * 1000000h) +DD (OP_20f0 - OP_1000) + (8 * 1000000h) +DD (OP_20f8 - OP_1000) + (1 * 1000000h) +DD (OP_20f9 - OP_1000) + (1 * 1000000h) +DD (OP_20fa - OP_1000) + (1 * 1000000h) +DD (OP_20fb - OP_1000) + (1 * 1000000h) +DD (OP_20fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2100 - OP_1000) + (16 * 1000000h) +DD (OP_2110 - OP_1000) + (8 * 1000000h) +DD (OP_2118 - OP_1000) + (8 * 1000000h) +DD (OP_2120 - OP_1000) + (8 * 1000000h) +DD (OP_2128 - OP_1000) + (8 * 1000000h) +DD (OP_2130 - OP_1000) + (8 * 1000000h) +DD (OP_2138 - OP_1000) + (1 * 1000000h) +DD (OP_2139 - OP_1000) + (1 * 1000000h) +DD (OP_213a - OP_1000) + (1 * 1000000h) +DD (OP_213b - OP_1000) + (1 * 1000000h) +DD (OP_213c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2140 - OP_1000) + (16 * 1000000h) +DD (OP_2150 - OP_1000) + (8 * 1000000h) +DD (OP_2158 - OP_1000) + (8 * 1000000h) +DD (OP_2160 - OP_1000) + (8 * 1000000h) +DD (OP_2168 - OP_1000) + (8 * 1000000h) +DD (OP_2170 - OP_1000) + (8 * 1000000h) +DD (OP_2178 - OP_1000) + (1 * 1000000h) +DD (OP_2179 - OP_1000) + (1 * 1000000h) +DD (OP_217a - OP_1000) + (1 * 1000000h) +DD (OP_217b - OP_1000) + (1 * 1000000h) +DD (OP_217c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2180 - OP_1000) + (16 * 1000000h) +DD (OP_2190 - OP_1000) + (8 * 1000000h) +DD (OP_2198 - OP_1000) + (8 * 1000000h) +DD (OP_21a0 - OP_1000) + (8 * 1000000h) +DD (OP_21a8 - OP_1000) + (8 * 1000000h) +DD (OP_21b0 - OP_1000) + (8 * 1000000h) +DD (OP_21b8 - OP_1000) + (1 * 1000000h) +DD (OP_21b9 - OP_1000) + (1 * 1000000h) +DD (OP_21ba - OP_1000) + (1 * 1000000h) +DD (OP_21bb - OP_1000) + (1 * 1000000h) +DD (OP_21bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_23c0 - OP_1000) + (16 * 1000000h) +DD (OP_23d0 - OP_1000) + (8 * 1000000h) +DD (OP_23d8 - OP_1000) + (8 * 1000000h) +DD (OP_23e0 - OP_1000) + (8 * 1000000h) +DD (OP_23e8 - OP_1000) + (8 * 1000000h) +DD (OP_23f0 - OP_1000) + (8 * 1000000h) +DD (OP_23f8 - OP_1000) + (1 * 1000000h) +DD (OP_23f9 - OP_1000) + (1 * 1000000h) +DD (OP_23fa - OP_1000) + (1 * 1000000h) +DD (OP_23fb - OP_1000) + (1 * 1000000h) +DD (OP_23fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2000 - OP_1000) + (16 * 1000000h) +DD (OP_2010 - OP_1000) + (8 * 1000000h) +DD (OP_2018 - OP_1000) + (8 * 1000000h) +DD (OP_2020 - OP_1000) + (8 * 1000000h) +DD (OP_2028 - OP_1000) + (8 * 1000000h) +DD (OP_2030 - OP_1000) + (8 * 1000000h) +DD (OP_2038 - OP_1000) + (1 * 1000000h) +DD (OP_2039 - OP_1000) + (1 * 1000000h) +DD (OP_203a - OP_1000) + (1 * 1000000h) +DD (OP_203b - OP_1000) + (1 * 1000000h) +DD (OP_203c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2040 - OP_1000) + (16 * 1000000h) +DD (OP_2050 - OP_1000) + (8 * 1000000h) +DD (OP_2058 - OP_1000) + (8 * 1000000h) +DD (OP_2060 - OP_1000) + (8 * 1000000h) +DD (OP_2068 - OP_1000) + (8 * 1000000h) +DD (OP_2070 - OP_1000) + (8 * 1000000h) +DD (OP_2078 - OP_1000) + (1 * 1000000h) +DD (OP_2079 - OP_1000) + (1 * 1000000h) +DD (OP_207a - OP_1000) + (1 * 1000000h) +DD (OP_207b - OP_1000) + (1 * 1000000h) +DD (OP_207c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2080 - OP_1000) + (16 * 1000000h) +DD (OP_2090 - OP_1000) + (8 * 1000000h) +DD (OP_2098 - OP_1000) + (8 * 1000000h) +DD (OP_20a0 - OP_1000) + (8 * 1000000h) +DD (OP_20a8 - OP_1000) + (8 * 1000000h) +DD (OP_20b0 - OP_1000) + (8 * 1000000h) +DD (OP_20b8 - OP_1000) + (1 * 1000000h) +DD (OP_20b9 - OP_1000) + (1 * 1000000h) +DD (OP_20ba - OP_1000) + (1 * 1000000h) +DD (OP_20bb - OP_1000) + (1 * 1000000h) +DD (OP_20bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_20c0 - OP_1000) + (16 * 1000000h) +DD (OP_20d0 - OP_1000) + (8 * 1000000h) +DD (OP_20d8 - OP_1000) + (8 * 1000000h) +DD (OP_20e0 - OP_1000) + (8 * 1000000h) +DD (OP_20e8 - OP_1000) + (8 * 1000000h) +DD (OP_20f0 - OP_1000) + (8 * 1000000h) +DD (OP_20f8 - OP_1000) + (1 * 1000000h) +DD (OP_20f9 - OP_1000) + (1 * 1000000h) +DD (OP_20fa - OP_1000) + (1 * 1000000h) +DD (OP_20fb - OP_1000) + (1 * 1000000h) +DD (OP_20fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2100 - OP_1000) + (16 * 1000000h) +DD (OP_2110 - OP_1000) + (8 * 1000000h) +DD (OP_2118 - OP_1000) + (8 * 1000000h) +DD (OP_2120 - OP_1000) + (8 * 1000000h) +DD (OP_2128 - OP_1000) + (8 * 1000000h) +DD (OP_2130 - OP_1000) + (8 * 1000000h) +DD (OP_2138 - OP_1000) + (1 * 1000000h) +DD (OP_2139 - OP_1000) + (1 * 1000000h) +DD (OP_213a - OP_1000) + (1 * 1000000h) +DD (OP_213b - OP_1000) + (1 * 1000000h) +DD (OP_213c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2140 - OP_1000) + (16 * 1000000h) +DD (OP_2150 - OP_1000) + (8 * 1000000h) +DD (OP_2158 - OP_1000) + (8 * 1000000h) +DD (OP_2160 - OP_1000) + (8 * 1000000h) +DD (OP_2168 - OP_1000) + (8 * 1000000h) +DD (OP_2170 - OP_1000) + (8 * 1000000h) +DD (OP_2178 - OP_1000) + (1 * 1000000h) +DD (OP_2179 - OP_1000) + (1 * 1000000h) +DD (OP_217a - OP_1000) + (1 * 1000000h) +DD (OP_217b - OP_1000) + (1 * 1000000h) +DD (OP_217c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2180 - OP_1000) + (16 * 1000000h) +DD (OP_2190 - OP_1000) + (8 * 1000000h) +DD (OP_2198 - OP_1000) + (8 * 1000000h) +DD (OP_21a0 - OP_1000) + (8 * 1000000h) +DD (OP_21a8 - OP_1000) + (8 * 1000000h) +DD (OP_21b0 - OP_1000) + (8 * 1000000h) +DD (OP_21b8 - OP_1000) + (1 * 1000000h) +DD (OP_21b9 - OP_1000) + (1 * 1000000h) +DD (OP_21ba - OP_1000) + (1 * 1000000h) +DD (OP_21bb - OP_1000) + (1 * 1000000h) +DD (OP_21bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (67 * 1000000h) +DD (OP_2000 - OP_1000) + (16 * 1000000h) +DD (OP_2010 - OP_1000) + (8 * 1000000h) +DD (OP_2018 - OP_1000) + (8 * 1000000h) +DD (OP_2020 - OP_1000) + (8 * 1000000h) +DD (OP_2028 - OP_1000) + (8 * 1000000h) +DD (OP_2030 - OP_1000) + (8 * 1000000h) +DD (OP_2038 - OP_1000) + (1 * 1000000h) +DD (OP_2039 - OP_1000) + (1 * 1000000h) +DD (OP_203a - OP_1000) + (1 * 1000000h) +DD (OP_203b - OP_1000) + (1 * 1000000h) +DD (OP_203c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2040 - OP_1000) + (16 * 1000000h) +DD (OP_2050 - OP_1000) + (8 * 1000000h) +DD (OP_2058 - OP_1000) + (8 * 1000000h) +DD (OP_2060 - OP_1000) + (8 * 1000000h) +DD (OP_2068 - OP_1000) + (8 * 1000000h) +DD (OP_2070 - OP_1000) + (8 * 1000000h) +DD (OP_2078 - OP_1000) + (1 * 1000000h) +DD (OP_2079 - OP_1000) + (1 * 1000000h) +DD (OP_207a - OP_1000) + (1 * 1000000h) +DD (OP_207b - OP_1000) + (1 * 1000000h) +DD (OP_207c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2080 - OP_1000) + (16 * 1000000h) +DD (OP_2090 - OP_1000) + (8 * 1000000h) +DD (OP_2098 - OP_1000) + (8 * 1000000h) +DD (OP_20a0 - OP_1000) + (8 * 1000000h) +DD (OP_20a8 - OP_1000) + (8 * 1000000h) +DD (OP_20b0 - OP_1000) + (8 * 1000000h) +DD (OP_20b8 - OP_1000) + (1 * 1000000h) +DD (OP_20b9 - OP_1000) + (1 * 1000000h) +DD (OP_20ba - OP_1000) + (1 * 1000000h) +DD (OP_20bb - OP_1000) + (1 * 1000000h) +DD (OP_20bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_20c0 - OP_1000) + (16 * 1000000h) +DD (OP_20d0 - OP_1000) + (8 * 1000000h) +DD (OP_20d8 - OP_1000) + (8 * 1000000h) +DD (OP_20e0 - OP_1000) + (8 * 1000000h) +DD (OP_20e8 - OP_1000) + (8 * 1000000h) +DD (OP_20f0 - OP_1000) + (8 * 1000000h) +DD (OP_20f8 - OP_1000) + (1 * 1000000h) +DD (OP_20f9 - OP_1000) + (1 * 1000000h) +DD (OP_20fa - OP_1000) + (1 * 1000000h) +DD (OP_20fb - OP_1000) + (1 * 1000000h) +DD (OP_20fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2100 - OP_1000) + (16 * 1000000h) +DD (OP_2110 - OP_1000) + (8 * 1000000h) +DD (OP_2118 - OP_1000) + (8 * 1000000h) +DD (OP_2120 - OP_1000) + (8 * 1000000h) +DD (OP_2128 - OP_1000) + (8 * 1000000h) +DD (OP_2130 - OP_1000) + (8 * 1000000h) +DD (OP_2138 - OP_1000) + (1 * 1000000h) +DD (OP_2139 - OP_1000) + (1 * 1000000h) +DD (OP_213a - OP_1000) + (1 * 1000000h) +DD (OP_213b - OP_1000) + (1 * 1000000h) +DD (OP_213c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2140 - OP_1000) + (16 * 1000000h) +DD (OP_2150 - OP_1000) + (8 * 1000000h) +DD (OP_2158 - OP_1000) + (8 * 1000000h) +DD (OP_2160 - OP_1000) + (8 * 1000000h) +DD (OP_2168 - OP_1000) + (8 * 1000000h) +DD (OP_2170 - OP_1000) + (8 * 1000000h) +DD (OP_2178 - OP_1000) + (1 * 1000000h) +DD (OP_2179 - OP_1000) + (1 * 1000000h) +DD (OP_217a - OP_1000) + (1 * 1000000h) +DD (OP_217b - OP_1000) + (1 * 1000000h) +DD (OP_217c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2180 - OP_1000) + (16 * 1000000h) +DD (OP_2190 - OP_1000) + (8 * 1000000h) +DD (OP_2198 - OP_1000) + (8 * 1000000h) +DD (OP_21a0 - OP_1000) + (8 * 1000000h) +DD (OP_21a8 - OP_1000) + (8 * 1000000h) +DD (OP_21b0 - OP_1000) + (8 * 1000000h) +DD (OP_21b8 - OP_1000) + (1 * 1000000h) +DD (OP_21b9 - OP_1000) + (1 * 1000000h) +DD (OP_21ba - OP_1000) + (1 * 1000000h) +DD (OP_21bb - OP_1000) + (1 * 1000000h) +DD (OP_21bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (67 * 1000000h) +DD (OP_2000 - OP_1000) + (16 * 1000000h) +DD (OP_2010 - OP_1000) + (8 * 1000000h) +DD (OP_2018 - OP_1000) + (8 * 1000000h) +DD (OP_2020 - OP_1000) + (8 * 1000000h) +DD (OP_2028 - OP_1000) + (8 * 1000000h) +DD (OP_2030 - OP_1000) + (8 * 1000000h) +DD (OP_2038 - OP_1000) + (1 * 1000000h) +DD (OP_2039 - OP_1000) + (1 * 1000000h) +DD (OP_203a - OP_1000) + (1 * 1000000h) +DD (OP_203b - OP_1000) + (1 * 1000000h) +DD (OP_203c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2040 - OP_1000) + (16 * 1000000h) +DD (OP_2050 - OP_1000) + (8 * 1000000h) +DD (OP_2058 - OP_1000) + (8 * 1000000h) +DD (OP_2060 - OP_1000) + (8 * 1000000h) +DD (OP_2068 - OP_1000) + (8 * 1000000h) +DD (OP_2070 - OP_1000) + (8 * 1000000h) +DD (OP_2078 - OP_1000) + (1 * 1000000h) +DD (OP_2079 - OP_1000) + (1 * 1000000h) +DD (OP_207a - OP_1000) + (1 * 1000000h) +DD (OP_207b - OP_1000) + (1 * 1000000h) +DD (OP_207c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2080 - OP_1000) + (16 * 1000000h) +DD (OP_2090 - OP_1000) + (8 * 1000000h) +DD (OP_2098 - OP_1000) + (8 * 1000000h) +DD (OP_20a0 - OP_1000) + (8 * 1000000h) +DD (OP_20a8 - OP_1000) + (8 * 1000000h) +DD (OP_20b0 - OP_1000) + (8 * 1000000h) +DD (OP_20b8 - OP_1000) + (1 * 1000000h) +DD (OP_20b9 - OP_1000) + (1 * 1000000h) +DD (OP_20ba - OP_1000) + (1 * 1000000h) +DD (OP_20bb - OP_1000) + (1 * 1000000h) +DD (OP_20bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_20c0 - OP_1000) + (16 * 1000000h) +DD (OP_20d0 - OP_1000) + (8 * 1000000h) +DD (OP_20d8 - OP_1000) + (8 * 1000000h) +DD (OP_20e0 - OP_1000) + (8 * 1000000h) +DD (OP_20e8 - OP_1000) + (8 * 1000000h) +DD (OP_20f0 - OP_1000) + (8 * 1000000h) +DD (OP_20f8 - OP_1000) + (1 * 1000000h) +DD (OP_20f9 - OP_1000) + (1 * 1000000h) +DD (OP_20fa - OP_1000) + (1 * 1000000h) +DD (OP_20fb - OP_1000) + (1 * 1000000h) +DD (OP_20fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2100 - OP_1000) + (16 * 1000000h) +DD (OP_2110 - OP_1000) + (8 * 1000000h) +DD (OP_2118 - OP_1000) + (8 * 1000000h) +DD (OP_2120 - OP_1000) + (8 * 1000000h) +DD (OP_2128 - OP_1000) + (8 * 1000000h) +DD (OP_2130 - OP_1000) + (8 * 1000000h) +DD (OP_2138 - OP_1000) + (1 * 1000000h) +DD (OP_2139 - OP_1000) + (1 * 1000000h) +DD (OP_213a - OP_1000) + (1 * 1000000h) +DD (OP_213b - OP_1000) + (1 * 1000000h) +DD (OP_213c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2140 - OP_1000) + (16 * 1000000h) +DD (OP_2150 - OP_1000) + (8 * 1000000h) +DD (OP_2158 - OP_1000) + (8 * 1000000h) +DD (OP_2160 - OP_1000) + (8 * 1000000h) +DD (OP_2168 - OP_1000) + (8 * 1000000h) +DD (OP_2170 - OP_1000) + (8 * 1000000h) +DD (OP_2178 - OP_1000) + (1 * 1000000h) +DD (OP_2179 - OP_1000) + (1 * 1000000h) +DD (OP_217a - OP_1000) + (1 * 1000000h) +DD (OP_217b - OP_1000) + (1 * 1000000h) +DD (OP_217c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2180 - OP_1000) + (16 * 1000000h) +DD (OP_2190 - OP_1000) + (8 * 1000000h) +DD (OP_2198 - OP_1000) + (8 * 1000000h) +DD (OP_21a0 - OP_1000) + (8 * 1000000h) +DD (OP_21a8 - OP_1000) + (8 * 1000000h) +DD (OP_21b0 - OP_1000) + (8 * 1000000h) +DD (OP_21b8 - OP_1000) + (1 * 1000000h) +DD (OP_21b9 - OP_1000) + (1 * 1000000h) +DD (OP_21ba - OP_1000) + (1 * 1000000h) +DD (OP_21bb - OP_1000) + (1 * 1000000h) +DD (OP_21bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (67 * 1000000h) +DD (OP_2000 - OP_1000) + (16 * 1000000h) +DD (OP_2010 - OP_1000) + (8 * 1000000h) +DD (OP_2018 - OP_1000) + (8 * 1000000h) +DD (OP_2020 - OP_1000) + (8 * 1000000h) +DD (OP_2028 - OP_1000) + (8 * 1000000h) +DD (OP_2030 - OP_1000) + (8 * 1000000h) +DD (OP_2038 - OP_1000) + (1 * 1000000h) +DD (OP_2039 - OP_1000) + (1 * 1000000h) +DD (OP_203a - OP_1000) + (1 * 1000000h) +DD (OP_203b - OP_1000) + (1 * 1000000h) +DD (OP_203c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2040 - OP_1000) + (16 * 1000000h) +DD (OP_2050 - OP_1000) + (8 * 1000000h) +DD (OP_2058 - OP_1000) + (8 * 1000000h) +DD (OP_2060 - OP_1000) + (8 * 1000000h) +DD (OP_2068 - OP_1000) + (8 * 1000000h) +DD (OP_2070 - OP_1000) + (8 * 1000000h) +DD (OP_2078 - OP_1000) + (1 * 1000000h) +DD (OP_2079 - OP_1000) + (1 * 1000000h) +DD (OP_207a - OP_1000) + (1 * 1000000h) +DD (OP_207b - OP_1000) + (1 * 1000000h) +DD (OP_207c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2080 - OP_1000) + (16 * 1000000h) +DD (OP_2090 - OP_1000) + (8 * 1000000h) +DD (OP_2098 - OP_1000) + (8 * 1000000h) +DD (OP_20a0 - OP_1000) + (8 * 1000000h) +DD (OP_20a8 - OP_1000) + (8 * 1000000h) +DD (OP_20b0 - OP_1000) + (8 * 1000000h) +DD (OP_20b8 - OP_1000) + (1 * 1000000h) +DD (OP_20b9 - OP_1000) + (1 * 1000000h) +DD (OP_20ba - OP_1000) + (1 * 1000000h) +DD (OP_20bb - OP_1000) + (1 * 1000000h) +DD (OP_20bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_20c0 - OP_1000) + (16 * 1000000h) +DD (OP_20d0 - OP_1000) + (8 * 1000000h) +DD (OP_20d8 - OP_1000) + (8 * 1000000h) +DD (OP_20e0 - OP_1000) + (8 * 1000000h) +DD (OP_20e8 - OP_1000) + (8 * 1000000h) +DD (OP_20f0 - OP_1000) + (8 * 1000000h) +DD (OP_20f8 - OP_1000) + (1 * 1000000h) +DD (OP_20f9 - OP_1000) + (1 * 1000000h) +DD (OP_20fa - OP_1000) + (1 * 1000000h) +DD (OP_20fb - OP_1000) + (1 * 1000000h) +DD (OP_20fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2100 - OP_1000) + (16 * 1000000h) +DD (OP_2110 - OP_1000) + (8 * 1000000h) +DD (OP_2118 - OP_1000) + (8 * 1000000h) +DD (OP_2120 - OP_1000) + (8 * 1000000h) +DD (OP_2128 - OP_1000) + (8 * 1000000h) +DD (OP_2130 - OP_1000) + (8 * 1000000h) +DD (OP_2138 - OP_1000) + (1 * 1000000h) +DD (OP_2139 - OP_1000) + (1 * 1000000h) +DD (OP_213a - OP_1000) + (1 * 1000000h) +DD (OP_213b - OP_1000) + (1 * 1000000h) +DD (OP_213c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2140 - OP_1000) + (16 * 1000000h) +DD (OP_2150 - OP_1000) + (8 * 1000000h) +DD (OP_2158 - OP_1000) + (8 * 1000000h) +DD (OP_2160 - OP_1000) + (8 * 1000000h) +DD (OP_2168 - OP_1000) + (8 * 1000000h) +DD (OP_2170 - OP_1000) + (8 * 1000000h) +DD (OP_2178 - OP_1000) + (1 * 1000000h) +DD (OP_2179 - OP_1000) + (1 * 1000000h) +DD (OP_217a - OP_1000) + (1 * 1000000h) +DD (OP_217b - OP_1000) + (1 * 1000000h) +DD (OP_217c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2180 - OP_1000) + (16 * 1000000h) +DD (OP_2190 - OP_1000) + (8 * 1000000h) +DD (OP_2198 - OP_1000) + (8 * 1000000h) +DD (OP_21a0 - OP_1000) + (8 * 1000000h) +DD (OP_21a8 - OP_1000) + (8 * 1000000h) +DD (OP_21b0 - OP_1000) + (8 * 1000000h) +DD (OP_21b8 - OP_1000) + (1 * 1000000h) +DD (OP_21b9 - OP_1000) + (1 * 1000000h) +DD (OP_21ba - OP_1000) + (1 * 1000000h) +DD (OP_21bb - OP_1000) + (1 * 1000000h) +DD (OP_21bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (67 * 1000000h) +DD (OP_2000 - OP_1000) + (16 * 1000000h) +DD (OP_2010 - OP_1000) + (8 * 1000000h) +DD (OP_2018 - OP_1000) + (8 * 1000000h) +DD (OP_2020 - OP_1000) + (8 * 1000000h) +DD (OP_2028 - OP_1000) + (8 * 1000000h) +DD (OP_2030 - OP_1000) + (8 * 1000000h) +DD (OP_2038 - OP_1000) + (1 * 1000000h) +DD (OP_2039 - OP_1000) + (1 * 1000000h) +DD (OP_203a - OP_1000) + (1 * 1000000h) +DD (OP_203b - OP_1000) + (1 * 1000000h) +DD (OP_203c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2040 - OP_1000) + (16 * 1000000h) +DD (OP_2050 - OP_1000) + (8 * 1000000h) +DD (OP_2058 - OP_1000) + (8 * 1000000h) +DD (OP_2060 - OP_1000) + (8 * 1000000h) +DD (OP_2068 - OP_1000) + (8 * 1000000h) +DD (OP_2070 - OP_1000) + (8 * 1000000h) +DD (OP_2078 - OP_1000) + (1 * 1000000h) +DD (OP_2079 - OP_1000) + (1 * 1000000h) +DD (OP_207a - OP_1000) + (1 * 1000000h) +DD (OP_207b - OP_1000) + (1 * 1000000h) +DD (OP_207c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2080 - OP_1000) + (16 * 1000000h) +DD (OP_2090 - OP_1000) + (8 * 1000000h) +DD (OP_2098 - OP_1000) + (8 * 1000000h) +DD (OP_20a0 - OP_1000) + (8 * 1000000h) +DD (OP_20a8 - OP_1000) + (8 * 1000000h) +DD (OP_20b0 - OP_1000) + (8 * 1000000h) +DD (OP_20b8 - OP_1000) + (1 * 1000000h) +DD (OP_20b9 - OP_1000) + (1 * 1000000h) +DD (OP_20ba - OP_1000) + (1 * 1000000h) +DD (OP_20bb - OP_1000) + (1 * 1000000h) +DD (OP_20bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_20c0 - OP_1000) + (16 * 1000000h) +DD (OP_20d0 - OP_1000) + (8 * 1000000h) +DD (OP_20d8 - OP_1000) + (8 * 1000000h) +DD (OP_20e0 - OP_1000) + (8 * 1000000h) +DD (OP_20e8 - OP_1000) + (8 * 1000000h) +DD (OP_20f0 - OP_1000) + (8 * 1000000h) +DD (OP_20f8 - OP_1000) + (1 * 1000000h) +DD (OP_20f9 - OP_1000) + (1 * 1000000h) +DD (OP_20fa - OP_1000) + (1 * 1000000h) +DD (OP_20fb - OP_1000) + (1 * 1000000h) +DD (OP_20fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2100 - OP_1000) + (16 * 1000000h) +DD (OP_2110 - OP_1000) + (8 * 1000000h) +DD (OP_2118 - OP_1000) + (8 * 1000000h) +DD (OP_2120 - OP_1000) + (8 * 1000000h) +DD (OP_2128 - OP_1000) + (8 * 1000000h) +DD (OP_2130 - OP_1000) + (8 * 1000000h) +DD (OP_2138 - OP_1000) + (1 * 1000000h) +DD (OP_2139 - OP_1000) + (1 * 1000000h) +DD (OP_213a - OP_1000) + (1 * 1000000h) +DD (OP_213b - OP_1000) + (1 * 1000000h) +DD (OP_213c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2140 - OP_1000) + (16 * 1000000h) +DD (OP_2150 - OP_1000) + (8 * 1000000h) +DD (OP_2158 - OP_1000) + (8 * 1000000h) +DD (OP_2160 - OP_1000) + (8 * 1000000h) +DD (OP_2168 - OP_1000) + (8 * 1000000h) +DD (OP_2170 - OP_1000) + (8 * 1000000h) +DD (OP_2178 - OP_1000) + (1 * 1000000h) +DD (OP_2179 - OP_1000) + (1 * 1000000h) +DD (OP_217a - OP_1000) + (1 * 1000000h) +DD (OP_217b - OP_1000) + (1 * 1000000h) +DD (OP_217c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2180 - OP_1000) + (16 * 1000000h) +DD (OP_2190 - OP_1000) + (8 * 1000000h) +DD (OP_2198 - OP_1000) + (8 * 1000000h) +DD (OP_21a0 - OP_1000) + (8 * 1000000h) +DD (OP_21a8 - OP_1000) + (8 * 1000000h) +DD (OP_21b0 - OP_1000) + (8 * 1000000h) +DD (OP_21b8 - OP_1000) + (1 * 1000000h) +DD (OP_21b9 - OP_1000) + (1 * 1000000h) +DD (OP_21ba - OP_1000) + (1 * 1000000h) +DD (OP_21bb - OP_1000) + (1 * 1000000h) +DD (OP_21bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (67 * 1000000h) +DD (OP_2000 - OP_1000) + (16 * 1000000h) +DD (OP_2010 - OP_1000) + (8 * 1000000h) +DD (OP_2018 - OP_1000) + (8 * 1000000h) +DD (OP_2020 - OP_1000) + (8 * 1000000h) +DD (OP_2028 - OP_1000) + (8 * 1000000h) +DD (OP_2030 - OP_1000) + (8 * 1000000h) +DD (OP_2038 - OP_1000) + (1 * 1000000h) +DD (OP_2039 - OP_1000) + (1 * 1000000h) +DD (OP_203a - OP_1000) + (1 * 1000000h) +DD (OP_203b - OP_1000) + (1 * 1000000h) +DD (OP_203c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2040 - OP_1000) + (16 * 1000000h) +DD (OP_2050 - OP_1000) + (8 * 1000000h) +DD (OP_2058 - OP_1000) + (8 * 1000000h) +DD (OP_2060 - OP_1000) + (8 * 1000000h) +DD (OP_2068 - OP_1000) + (8 * 1000000h) +DD (OP_2070 - OP_1000) + (8 * 1000000h) +DD (OP_2078 - OP_1000) + (1 * 1000000h) +DD (OP_2079 - OP_1000) + (1 * 1000000h) +DD (OP_207a - OP_1000) + (1 * 1000000h) +DD (OP_207b - OP_1000) + (1 * 1000000h) +DD (OP_207c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2080 - OP_1000) + (16 * 1000000h) +DD (OP_2090 - OP_1000) + (8 * 1000000h) +DD (OP_2098 - OP_1000) + (8 * 1000000h) +DD (OP_20a0 - OP_1000) + (8 * 1000000h) +DD (OP_20a8 - OP_1000) + (8 * 1000000h) +DD (OP_20b0 - OP_1000) + (8 * 1000000h) +DD (OP_20b8 - OP_1000) + (1 * 1000000h) +DD (OP_20b9 - OP_1000) + (1 * 1000000h) +DD (OP_20ba - OP_1000) + (1 * 1000000h) +DD (OP_20bb - OP_1000) + (1 * 1000000h) +DD (OP_20bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_20c0 - OP_1000) + (16 * 1000000h) +DD (OP_20d0 - OP_1000) + (8 * 1000000h) +DD (OP_20d8 - OP_1000) + (8 * 1000000h) +DD (OP_20e0 - OP_1000) + (8 * 1000000h) +DD (OP_20e8 - OP_1000) + (8 * 1000000h) +DD (OP_20f0 - OP_1000) + (8 * 1000000h) +DD (OP_20f8 - OP_1000) + (1 * 1000000h) +DD (OP_20f9 - OP_1000) + (1 * 1000000h) +DD (OP_20fa - OP_1000) + (1 * 1000000h) +DD (OP_20fb - OP_1000) + (1 * 1000000h) +DD (OP_20fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2100 - OP_1000) + (16 * 1000000h) +DD (OP_2110 - OP_1000) + (8 * 1000000h) +DD (OP_2118 - OP_1000) + (8 * 1000000h) +DD (OP_2120 - OP_1000) + (8 * 1000000h) +DD (OP_2128 - OP_1000) + (8 * 1000000h) +DD (OP_2130 - OP_1000) + (8 * 1000000h) +DD (OP_2138 - OP_1000) + (1 * 1000000h) +DD (OP_2139 - OP_1000) + (1 * 1000000h) +DD (OP_213a - OP_1000) + (1 * 1000000h) +DD (OP_213b - OP_1000) + (1 * 1000000h) +DD (OP_213c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2140 - OP_1000) + (16 * 1000000h) +DD (OP_2150 - OP_1000) + (8 * 1000000h) +DD (OP_2158 - OP_1000) + (8 * 1000000h) +DD (OP_2160 - OP_1000) + (8 * 1000000h) +DD (OP_2168 - OP_1000) + (8 * 1000000h) +DD (OP_2170 - OP_1000) + (8 * 1000000h) +DD (OP_2178 - OP_1000) + (1 * 1000000h) +DD (OP_2179 - OP_1000) + (1 * 1000000h) +DD (OP_217a - OP_1000) + (1 * 1000000h) +DD (OP_217b - OP_1000) + (1 * 1000000h) +DD (OP_217c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_2180 - OP_1000) + (16 * 1000000h) +DD (OP_2190 - OP_1000) + (8 * 1000000h) +DD (OP_2198 - OP_1000) + (8 * 1000000h) +DD (OP_21a0 - OP_1000) + (8 * 1000000h) +DD (OP_21a8 - OP_1000) + (8 * 1000000h) +DD (OP_21b0 - OP_1000) + (8 * 1000000h) +DD (OP_21b8 - OP_1000) + (1 * 1000000h) +DD (OP_21b9 - OP_1000) + (1 * 1000000h) +DD (OP_21ba - OP_1000) + (1 * 1000000h) +DD (OP_21bb - OP_1000) + (1 * 1000000h) +DD (OP_21bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (67 * 1000000h) +DD (OP_3000 - OP_1000) + (16 * 1000000h) +DD (OP_3010 - OP_1000) + (8 * 1000000h) +DD (OP_3018 - OP_1000) + (8 * 1000000h) +DD (OP_3020 - OP_1000) + (8 * 1000000h) +DD (OP_3028 - OP_1000) + (8 * 1000000h) +DD (OP_3030 - OP_1000) + (8 * 1000000h) +DD (OP_3038 - OP_1000) + (1 * 1000000h) +DD (OP_3039 - OP_1000) + (1 * 1000000h) +DD (OP_303a - OP_1000) + (1 * 1000000h) +DD (OP_303b - OP_1000) + (1 * 1000000h) +DD (OP_303c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3040 - OP_1000) + (16 * 1000000h) +DD (OP_3050 - OP_1000) + (8 * 1000000h) +DD (OP_3058 - OP_1000) + (8 * 1000000h) +DD (OP_3060 - OP_1000) + (8 * 1000000h) +DD (OP_3068 - OP_1000) + (8 * 1000000h) +DD (OP_3070 - OP_1000) + (8 * 1000000h) +DD (OP_3078 - OP_1000) + (1 * 1000000h) +DD (OP_3079 - OP_1000) + (1 * 1000000h) +DD (OP_307a - OP_1000) + (1 * 1000000h) +DD (OP_307b - OP_1000) + (1 * 1000000h) +DD (OP_307c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3080 - OP_1000) + (16 * 1000000h) +DD (OP_3090 - OP_1000) + (8 * 1000000h) +DD (OP_3098 - OP_1000) + (8 * 1000000h) +DD (OP_30a0 - OP_1000) + (8 * 1000000h) +DD (OP_30a8 - OP_1000) + (8 * 1000000h) +DD (OP_30b0 - OP_1000) + (8 * 1000000h) +DD (OP_30b8 - OP_1000) + (1 * 1000000h) +DD (OP_30b9 - OP_1000) + (1 * 1000000h) +DD (OP_30ba - OP_1000) + (1 * 1000000h) +DD (OP_30bb - OP_1000) + (1 * 1000000h) +DD (OP_30bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_30c0 - OP_1000) + (16 * 1000000h) +DD (OP_30d0 - OP_1000) + (8 * 1000000h) +DD (OP_30d8 - OP_1000) + (8 * 1000000h) +DD (OP_30e0 - OP_1000) + (8 * 1000000h) +DD (OP_30e8 - OP_1000) + (8 * 1000000h) +DD (OP_30f0 - OP_1000) + (8 * 1000000h) +DD (OP_30f8 - OP_1000) + (1 * 1000000h) +DD (OP_30f9 - OP_1000) + (1 * 1000000h) +DD (OP_30fa - OP_1000) + (1 * 1000000h) +DD (OP_30fb - OP_1000) + (1 * 1000000h) +DD (OP_30fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3100 - OP_1000) + (16 * 1000000h) +DD (OP_3110 - OP_1000) + (8 * 1000000h) +DD (OP_3118 - OP_1000) + (8 * 1000000h) +DD (OP_3120 - OP_1000) + (8 * 1000000h) +DD (OP_3128 - OP_1000) + (8 * 1000000h) +DD (OP_3130 - OP_1000) + (8 * 1000000h) +DD (OP_3138 - OP_1000) + (1 * 1000000h) +DD (OP_3139 - OP_1000) + (1 * 1000000h) +DD (OP_313a - OP_1000) + (1 * 1000000h) +DD (OP_313b - OP_1000) + (1 * 1000000h) +DD (OP_313c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3140 - OP_1000) + (16 * 1000000h) +DD (OP_3150 - OP_1000) + (8 * 1000000h) +DD (OP_3158 - OP_1000) + (8 * 1000000h) +DD (OP_3160 - OP_1000) + (8 * 1000000h) +DD (OP_3168 - OP_1000) + (8 * 1000000h) +DD (OP_3170 - OP_1000) + (8 * 1000000h) +DD (OP_3178 - OP_1000) + (1 * 1000000h) +DD (OP_3179 - OP_1000) + (1 * 1000000h) +DD (OP_317a - OP_1000) + (1 * 1000000h) +DD (OP_317b - OP_1000) + (1 * 1000000h) +DD (OP_317c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3180 - OP_1000) + (16 * 1000000h) +DD (OP_3190 - OP_1000) + (8 * 1000000h) +DD (OP_3198 - OP_1000) + (8 * 1000000h) +DD (OP_31a0 - OP_1000) + (8 * 1000000h) +DD (OP_31a8 - OP_1000) + (8 * 1000000h) +DD (OP_31b0 - OP_1000) + (8 * 1000000h) +DD (OP_31b8 - OP_1000) + (1 * 1000000h) +DD (OP_31b9 - OP_1000) + (1 * 1000000h) +DD (OP_31ba - OP_1000) + (1 * 1000000h) +DD (OP_31bb - OP_1000) + (1 * 1000000h) +DD (OP_31bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_31c0 - OP_1000) + (16 * 1000000h) +DD (OP_31d0 - OP_1000) + (8 * 1000000h) +DD (OP_31d8 - OP_1000) + (8 * 1000000h) +DD (OP_31e0 - OP_1000) + (8 * 1000000h) +DD (OP_31e8 - OP_1000) + (8 * 1000000h) +DD (OP_31f0 - OP_1000) + (8 * 1000000h) +DD (OP_31f8 - OP_1000) + (1 * 1000000h) +DD (OP_31f9 - OP_1000) + (1 * 1000000h) +DD (OP_31fa - OP_1000) + (1 * 1000000h) +DD (OP_31fb - OP_1000) + (1 * 1000000h) +DD (OP_31fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3000 - OP_1000) + (16 * 1000000h) +DD (OP_3010 - OP_1000) + (8 * 1000000h) +DD (OP_3018 - OP_1000) + (8 * 1000000h) +DD (OP_3020 - OP_1000) + (8 * 1000000h) +DD (OP_3028 - OP_1000) + (8 * 1000000h) +DD (OP_3030 - OP_1000) + (8 * 1000000h) +DD (OP_3038 - OP_1000) + (1 * 1000000h) +DD (OP_3039 - OP_1000) + (1 * 1000000h) +DD (OP_303a - OP_1000) + (1 * 1000000h) +DD (OP_303b - OP_1000) + (1 * 1000000h) +DD (OP_303c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3040 - OP_1000) + (16 * 1000000h) +DD (OP_3050 - OP_1000) + (8 * 1000000h) +DD (OP_3058 - OP_1000) + (8 * 1000000h) +DD (OP_3060 - OP_1000) + (8 * 1000000h) +DD (OP_3068 - OP_1000) + (8 * 1000000h) +DD (OP_3070 - OP_1000) + (8 * 1000000h) +DD (OP_3078 - OP_1000) + (1 * 1000000h) +DD (OP_3079 - OP_1000) + (1 * 1000000h) +DD (OP_307a - OP_1000) + (1 * 1000000h) +DD (OP_307b - OP_1000) + (1 * 1000000h) +DD (OP_307c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3080 - OP_1000) + (16 * 1000000h) +DD (OP_3090 - OP_1000) + (8 * 1000000h) +DD (OP_3098 - OP_1000) + (8 * 1000000h) +DD (OP_30a0 - OP_1000) + (8 * 1000000h) +DD (OP_30a8 - OP_1000) + (8 * 1000000h) +DD (OP_30b0 - OP_1000) + (8 * 1000000h) +DD (OP_30b8 - OP_1000) + (1 * 1000000h) +DD (OP_30b9 - OP_1000) + (1 * 1000000h) +DD (OP_30ba - OP_1000) + (1 * 1000000h) +DD (OP_30bb - OP_1000) + (1 * 1000000h) +DD (OP_30bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_30c0 - OP_1000) + (16 * 1000000h) +DD (OP_30d0 - OP_1000) + (8 * 1000000h) +DD (OP_30d8 - OP_1000) + (8 * 1000000h) +DD (OP_30e0 - OP_1000) + (8 * 1000000h) +DD (OP_30e8 - OP_1000) + (8 * 1000000h) +DD (OP_30f0 - OP_1000) + (8 * 1000000h) +DD (OP_30f8 - OP_1000) + (1 * 1000000h) +DD (OP_30f9 - OP_1000) + (1 * 1000000h) +DD (OP_30fa - OP_1000) + (1 * 1000000h) +DD (OP_30fb - OP_1000) + (1 * 1000000h) +DD (OP_30fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3100 - OP_1000) + (16 * 1000000h) +DD (OP_3110 - OP_1000) + (8 * 1000000h) +DD (OP_3118 - OP_1000) + (8 * 1000000h) +DD (OP_3120 - OP_1000) + (8 * 1000000h) +DD (OP_3128 - OP_1000) + (8 * 1000000h) +DD (OP_3130 - OP_1000) + (8 * 1000000h) +DD (OP_3138 - OP_1000) + (1 * 1000000h) +DD (OP_3139 - OP_1000) + (1 * 1000000h) +DD (OP_313a - OP_1000) + (1 * 1000000h) +DD (OP_313b - OP_1000) + (1 * 1000000h) +DD (OP_313c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3140 - OP_1000) + (16 * 1000000h) +DD (OP_3150 - OP_1000) + (8 * 1000000h) +DD (OP_3158 - OP_1000) + (8 * 1000000h) +DD (OP_3160 - OP_1000) + (8 * 1000000h) +DD (OP_3168 - OP_1000) + (8 * 1000000h) +DD (OP_3170 - OP_1000) + (8 * 1000000h) +DD (OP_3178 - OP_1000) + (1 * 1000000h) +DD (OP_3179 - OP_1000) + (1 * 1000000h) +DD (OP_317a - OP_1000) + (1 * 1000000h) +DD (OP_317b - OP_1000) + (1 * 1000000h) +DD (OP_317c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3180 - OP_1000) + (16 * 1000000h) +DD (OP_3190 - OP_1000) + (8 * 1000000h) +DD (OP_3198 - OP_1000) + (8 * 1000000h) +DD (OP_31a0 - OP_1000) + (8 * 1000000h) +DD (OP_31a8 - OP_1000) + (8 * 1000000h) +DD (OP_31b0 - OP_1000) + (8 * 1000000h) +DD (OP_31b8 - OP_1000) + (1 * 1000000h) +DD (OP_31b9 - OP_1000) + (1 * 1000000h) +DD (OP_31ba - OP_1000) + (1 * 1000000h) +DD (OP_31bb - OP_1000) + (1 * 1000000h) +DD (OP_31bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_33c0 - OP_1000) + (16 * 1000000h) +DD (OP_33d0 - OP_1000) + (8 * 1000000h) +DD (OP_33d8 - OP_1000) + (8 * 1000000h) +DD (OP_33e0 - OP_1000) + (8 * 1000000h) +DD (OP_33e8 - OP_1000) + (8 * 1000000h) +DD (OP_33f0 - OP_1000) + (8 * 1000000h) +DD (OP_33f8 - OP_1000) + (1 * 1000000h) +DD (OP_33f9 - OP_1000) + (1 * 1000000h) +DD (OP_33fa - OP_1000) + (1 * 1000000h) +DD (OP_33fb - OP_1000) + (1 * 1000000h) +DD (OP_33fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3000 - OP_1000) + (16 * 1000000h) +DD (OP_3010 - OP_1000) + (8 * 1000000h) +DD (OP_3018 - OP_1000) + (8 * 1000000h) +DD (OP_3020 - OP_1000) + (8 * 1000000h) +DD (OP_3028 - OP_1000) + (8 * 1000000h) +DD (OP_3030 - OP_1000) + (8 * 1000000h) +DD (OP_3038 - OP_1000) + (1 * 1000000h) +DD (OP_3039 - OP_1000) + (1 * 1000000h) +DD (OP_303a - OP_1000) + (1 * 1000000h) +DD (OP_303b - OP_1000) + (1 * 1000000h) +DD (OP_303c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3040 - OP_1000) + (16 * 1000000h) +DD (OP_3050 - OP_1000) + (8 * 1000000h) +DD (OP_3058 - OP_1000) + (8 * 1000000h) +DD (OP_3060 - OP_1000) + (8 * 1000000h) +DD (OP_3068 - OP_1000) + (8 * 1000000h) +DD (OP_3070 - OP_1000) + (8 * 1000000h) +DD (OP_3078 - OP_1000) + (1 * 1000000h) +DD (OP_3079 - OP_1000) + (1 * 1000000h) +DD (OP_307a - OP_1000) + (1 * 1000000h) +DD (OP_307b - OP_1000) + (1 * 1000000h) +DD (OP_307c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3080 - OP_1000) + (16 * 1000000h) +DD (OP_3090 - OP_1000) + (8 * 1000000h) +DD (OP_3098 - OP_1000) + (8 * 1000000h) +DD (OP_30a0 - OP_1000) + (8 * 1000000h) +DD (OP_30a8 - OP_1000) + (8 * 1000000h) +DD (OP_30b0 - OP_1000) + (8 * 1000000h) +DD (OP_30b8 - OP_1000) + (1 * 1000000h) +DD (OP_30b9 - OP_1000) + (1 * 1000000h) +DD (OP_30ba - OP_1000) + (1 * 1000000h) +DD (OP_30bb - OP_1000) + (1 * 1000000h) +DD (OP_30bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_30c0 - OP_1000) + (16 * 1000000h) +DD (OP_30d0 - OP_1000) + (8 * 1000000h) +DD (OP_30d8 - OP_1000) + (8 * 1000000h) +DD (OP_30e0 - OP_1000) + (8 * 1000000h) +DD (OP_30e8 - OP_1000) + (8 * 1000000h) +DD (OP_30f0 - OP_1000) + (8 * 1000000h) +DD (OP_30f8 - OP_1000) + (1 * 1000000h) +DD (OP_30f9 - OP_1000) + (1 * 1000000h) +DD (OP_30fa - OP_1000) + (1 * 1000000h) +DD (OP_30fb - OP_1000) + (1 * 1000000h) +DD (OP_30fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3100 - OP_1000) + (16 * 1000000h) +DD (OP_3110 - OP_1000) + (8 * 1000000h) +DD (OP_3118 - OP_1000) + (8 * 1000000h) +DD (OP_3120 - OP_1000) + (8 * 1000000h) +DD (OP_3128 - OP_1000) + (8 * 1000000h) +DD (OP_3130 - OP_1000) + (8 * 1000000h) +DD (OP_3138 - OP_1000) + (1 * 1000000h) +DD (OP_3139 - OP_1000) + (1 * 1000000h) +DD (OP_313a - OP_1000) + (1 * 1000000h) +DD (OP_313b - OP_1000) + (1 * 1000000h) +DD (OP_313c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3140 - OP_1000) + (16 * 1000000h) +DD (OP_3150 - OP_1000) + (8 * 1000000h) +DD (OP_3158 - OP_1000) + (8 * 1000000h) +DD (OP_3160 - OP_1000) + (8 * 1000000h) +DD (OP_3168 - OP_1000) + (8 * 1000000h) +DD (OP_3170 - OP_1000) + (8 * 1000000h) +DD (OP_3178 - OP_1000) + (1 * 1000000h) +DD (OP_3179 - OP_1000) + (1 * 1000000h) +DD (OP_317a - OP_1000) + (1 * 1000000h) +DD (OP_317b - OP_1000) + (1 * 1000000h) +DD (OP_317c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3180 - OP_1000) + (16 * 1000000h) +DD (OP_3190 - OP_1000) + (8 * 1000000h) +DD (OP_3198 - OP_1000) + (8 * 1000000h) +DD (OP_31a0 - OP_1000) + (8 * 1000000h) +DD (OP_31a8 - OP_1000) + (8 * 1000000h) +DD (OP_31b0 - OP_1000) + (8 * 1000000h) +DD (OP_31b8 - OP_1000) + (1 * 1000000h) +DD (OP_31b9 - OP_1000) + (1 * 1000000h) +DD (OP_31ba - OP_1000) + (1 * 1000000h) +DD (OP_31bb - OP_1000) + (1 * 1000000h) +DD (OP_31bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (67 * 1000000h) +DD (OP_3000 - OP_1000) + (16 * 1000000h) +DD (OP_3010 - OP_1000) + (8 * 1000000h) +DD (OP_3018 - OP_1000) + (8 * 1000000h) +DD (OP_3020 - OP_1000) + (8 * 1000000h) +DD (OP_3028 - OP_1000) + (8 * 1000000h) +DD (OP_3030 - OP_1000) + (8 * 1000000h) +DD (OP_3038 - OP_1000) + (1 * 1000000h) +DD (OP_3039 - OP_1000) + (1 * 1000000h) +DD (OP_303a - OP_1000) + (1 * 1000000h) +DD (OP_303b - OP_1000) + (1 * 1000000h) +DD (OP_303c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3040 - OP_1000) + (16 * 1000000h) +DD (OP_3050 - OP_1000) + (8 * 1000000h) +DD (OP_3058 - OP_1000) + (8 * 1000000h) +DD (OP_3060 - OP_1000) + (8 * 1000000h) +DD (OP_3068 - OP_1000) + (8 * 1000000h) +DD (OP_3070 - OP_1000) + (8 * 1000000h) +DD (OP_3078 - OP_1000) + (1 * 1000000h) +DD (OP_3079 - OP_1000) + (1 * 1000000h) +DD (OP_307a - OP_1000) + (1 * 1000000h) +DD (OP_307b - OP_1000) + (1 * 1000000h) +DD (OP_307c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3080 - OP_1000) + (16 * 1000000h) +DD (OP_3090 - OP_1000) + (8 * 1000000h) +DD (OP_3098 - OP_1000) + (8 * 1000000h) +DD (OP_30a0 - OP_1000) + (8 * 1000000h) +DD (OP_30a8 - OP_1000) + (8 * 1000000h) +DD (OP_30b0 - OP_1000) + (8 * 1000000h) +DD (OP_30b8 - OP_1000) + (1 * 1000000h) +DD (OP_30b9 - OP_1000) + (1 * 1000000h) +DD (OP_30ba - OP_1000) + (1 * 1000000h) +DD (OP_30bb - OP_1000) + (1 * 1000000h) +DD (OP_30bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_30c0 - OP_1000) + (16 * 1000000h) +DD (OP_30d0 - OP_1000) + (8 * 1000000h) +DD (OP_30d8 - OP_1000) + (8 * 1000000h) +DD (OP_30e0 - OP_1000) + (8 * 1000000h) +DD (OP_30e8 - OP_1000) + (8 * 1000000h) +DD (OP_30f0 - OP_1000) + (8 * 1000000h) +DD (OP_30f8 - OP_1000) + (1 * 1000000h) +DD (OP_30f9 - OP_1000) + (1 * 1000000h) +DD (OP_30fa - OP_1000) + (1 * 1000000h) +DD (OP_30fb - OP_1000) + (1 * 1000000h) +DD (OP_30fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3100 - OP_1000) + (16 * 1000000h) +DD (OP_3110 - OP_1000) + (8 * 1000000h) +DD (OP_3118 - OP_1000) + (8 * 1000000h) +DD (OP_3120 - OP_1000) + (8 * 1000000h) +DD (OP_3128 - OP_1000) + (8 * 1000000h) +DD (OP_3130 - OP_1000) + (8 * 1000000h) +DD (OP_3138 - OP_1000) + (1 * 1000000h) +DD (OP_3139 - OP_1000) + (1 * 1000000h) +DD (OP_313a - OP_1000) + (1 * 1000000h) +DD (OP_313b - OP_1000) + (1 * 1000000h) +DD (OP_313c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3140 - OP_1000) + (16 * 1000000h) +DD (OP_3150 - OP_1000) + (8 * 1000000h) +DD (OP_3158 - OP_1000) + (8 * 1000000h) +DD (OP_3160 - OP_1000) + (8 * 1000000h) +DD (OP_3168 - OP_1000) + (8 * 1000000h) +DD (OP_3170 - OP_1000) + (8 * 1000000h) +DD (OP_3178 - OP_1000) + (1 * 1000000h) +DD (OP_3179 - OP_1000) + (1 * 1000000h) +DD (OP_317a - OP_1000) + (1 * 1000000h) +DD (OP_317b - OP_1000) + (1 * 1000000h) +DD (OP_317c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3180 - OP_1000) + (16 * 1000000h) +DD (OP_3190 - OP_1000) + (8 * 1000000h) +DD (OP_3198 - OP_1000) + (8 * 1000000h) +DD (OP_31a0 - OP_1000) + (8 * 1000000h) +DD (OP_31a8 - OP_1000) + (8 * 1000000h) +DD (OP_31b0 - OP_1000) + (8 * 1000000h) +DD (OP_31b8 - OP_1000) + (1 * 1000000h) +DD (OP_31b9 - OP_1000) + (1 * 1000000h) +DD (OP_31ba - OP_1000) + (1 * 1000000h) +DD (OP_31bb - OP_1000) + (1 * 1000000h) +DD (OP_31bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (67 * 1000000h) +DD (OP_3000 - OP_1000) + (16 * 1000000h) +DD (OP_3010 - OP_1000) + (8 * 1000000h) +DD (OP_3018 - OP_1000) + (8 * 1000000h) +DD (OP_3020 - OP_1000) + (8 * 1000000h) +DD (OP_3028 - OP_1000) + (8 * 1000000h) +DD (OP_3030 - OP_1000) + (8 * 1000000h) +DD (OP_3038 - OP_1000) + (1 * 1000000h) +DD (OP_3039 - OP_1000) + (1 * 1000000h) +DD (OP_303a - OP_1000) + (1 * 1000000h) +DD (OP_303b - OP_1000) + (1 * 1000000h) +DD (OP_303c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3040 - OP_1000) + (16 * 1000000h) +DD (OP_3050 - OP_1000) + (8 * 1000000h) +DD (OP_3058 - OP_1000) + (8 * 1000000h) +DD (OP_3060 - OP_1000) + (8 * 1000000h) +DD (OP_3068 - OP_1000) + (8 * 1000000h) +DD (OP_3070 - OP_1000) + (8 * 1000000h) +DD (OP_3078 - OP_1000) + (1 * 1000000h) +DD (OP_3079 - OP_1000) + (1 * 1000000h) +DD (OP_307a - OP_1000) + (1 * 1000000h) +DD (OP_307b - OP_1000) + (1 * 1000000h) +DD (OP_307c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3080 - OP_1000) + (16 * 1000000h) +DD (OP_3090 - OP_1000) + (8 * 1000000h) +DD (OP_3098 - OP_1000) + (8 * 1000000h) +DD (OP_30a0 - OP_1000) + (8 * 1000000h) +DD (OP_30a8 - OP_1000) + (8 * 1000000h) +DD (OP_30b0 - OP_1000) + (8 * 1000000h) +DD (OP_30b8 - OP_1000) + (1 * 1000000h) +DD (OP_30b9 - OP_1000) + (1 * 1000000h) +DD (OP_30ba - OP_1000) + (1 * 1000000h) +DD (OP_30bb - OP_1000) + (1 * 1000000h) +DD (OP_30bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_30c0 - OP_1000) + (16 * 1000000h) +DD (OP_30d0 - OP_1000) + (8 * 1000000h) +DD (OP_30d8 - OP_1000) + (8 * 1000000h) +DD (OP_30e0 - OP_1000) + (8 * 1000000h) +DD (OP_30e8 - OP_1000) + (8 * 1000000h) +DD (OP_30f0 - OP_1000) + (8 * 1000000h) +DD (OP_30f8 - OP_1000) + (1 * 1000000h) +DD (OP_30f9 - OP_1000) + (1 * 1000000h) +DD (OP_30fa - OP_1000) + (1 * 1000000h) +DD (OP_30fb - OP_1000) + (1 * 1000000h) +DD (OP_30fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3100 - OP_1000) + (16 * 1000000h) +DD (OP_3110 - OP_1000) + (8 * 1000000h) +DD (OP_3118 - OP_1000) + (8 * 1000000h) +DD (OP_3120 - OP_1000) + (8 * 1000000h) +DD (OP_3128 - OP_1000) + (8 * 1000000h) +DD (OP_3130 - OP_1000) + (8 * 1000000h) +DD (OP_3138 - OP_1000) + (1 * 1000000h) +DD (OP_3139 - OP_1000) + (1 * 1000000h) +DD (OP_313a - OP_1000) + (1 * 1000000h) +DD (OP_313b - OP_1000) + (1 * 1000000h) +DD (OP_313c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3140 - OP_1000) + (16 * 1000000h) +DD (OP_3150 - OP_1000) + (8 * 1000000h) +DD (OP_3158 - OP_1000) + (8 * 1000000h) +DD (OP_3160 - OP_1000) + (8 * 1000000h) +DD (OP_3168 - OP_1000) + (8 * 1000000h) +DD (OP_3170 - OP_1000) + (8 * 1000000h) +DD (OP_3178 - OP_1000) + (1 * 1000000h) +DD (OP_3179 - OP_1000) + (1 * 1000000h) +DD (OP_317a - OP_1000) + (1 * 1000000h) +DD (OP_317b - OP_1000) + (1 * 1000000h) +DD (OP_317c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3180 - OP_1000) + (16 * 1000000h) +DD (OP_3190 - OP_1000) + (8 * 1000000h) +DD (OP_3198 - OP_1000) + (8 * 1000000h) +DD (OP_31a0 - OP_1000) + (8 * 1000000h) +DD (OP_31a8 - OP_1000) + (8 * 1000000h) +DD (OP_31b0 - OP_1000) + (8 * 1000000h) +DD (OP_31b8 - OP_1000) + (1 * 1000000h) +DD (OP_31b9 - OP_1000) + (1 * 1000000h) +DD (OP_31ba - OP_1000) + (1 * 1000000h) +DD (OP_31bb - OP_1000) + (1 * 1000000h) +DD (OP_31bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (67 * 1000000h) +DD (OP_3000 - OP_1000) + (16 * 1000000h) +DD (OP_3010 - OP_1000) + (8 * 1000000h) +DD (OP_3018 - OP_1000) + (8 * 1000000h) +DD (OP_3020 - OP_1000) + (8 * 1000000h) +DD (OP_3028 - OP_1000) + (8 * 1000000h) +DD (OP_3030 - OP_1000) + (8 * 1000000h) +DD (OP_3038 - OP_1000) + (1 * 1000000h) +DD (OP_3039 - OP_1000) + (1 * 1000000h) +DD (OP_303a - OP_1000) + (1 * 1000000h) +DD (OP_303b - OP_1000) + (1 * 1000000h) +DD (OP_303c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3040 - OP_1000) + (16 * 1000000h) +DD (OP_3050 - OP_1000) + (8 * 1000000h) +DD (OP_3058 - OP_1000) + (8 * 1000000h) +DD (OP_3060 - OP_1000) + (8 * 1000000h) +DD (OP_3068 - OP_1000) + (8 * 1000000h) +DD (OP_3070 - OP_1000) + (8 * 1000000h) +DD (OP_3078 - OP_1000) + (1 * 1000000h) +DD (OP_3079 - OP_1000) + (1 * 1000000h) +DD (OP_307a - OP_1000) + (1 * 1000000h) +DD (OP_307b - OP_1000) + (1 * 1000000h) +DD (OP_307c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3080 - OP_1000) + (16 * 1000000h) +DD (OP_3090 - OP_1000) + (8 * 1000000h) +DD (OP_3098 - OP_1000) + (8 * 1000000h) +DD (OP_30a0 - OP_1000) + (8 * 1000000h) +DD (OP_30a8 - OP_1000) + (8 * 1000000h) +DD (OP_30b0 - OP_1000) + (8 * 1000000h) +DD (OP_30b8 - OP_1000) + (1 * 1000000h) +DD (OP_30b9 - OP_1000) + (1 * 1000000h) +DD (OP_30ba - OP_1000) + (1 * 1000000h) +DD (OP_30bb - OP_1000) + (1 * 1000000h) +DD (OP_30bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_30c0 - OP_1000) + (16 * 1000000h) +DD (OP_30d0 - OP_1000) + (8 * 1000000h) +DD (OP_30d8 - OP_1000) + (8 * 1000000h) +DD (OP_30e0 - OP_1000) + (8 * 1000000h) +DD (OP_30e8 - OP_1000) + (8 * 1000000h) +DD (OP_30f0 - OP_1000) + (8 * 1000000h) +DD (OP_30f8 - OP_1000) + (1 * 1000000h) +DD (OP_30f9 - OP_1000) + (1 * 1000000h) +DD (OP_30fa - OP_1000) + (1 * 1000000h) +DD (OP_30fb - OP_1000) + (1 * 1000000h) +DD (OP_30fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3100 - OP_1000) + (16 * 1000000h) +DD (OP_3110 - OP_1000) + (8 * 1000000h) +DD (OP_3118 - OP_1000) + (8 * 1000000h) +DD (OP_3120 - OP_1000) + (8 * 1000000h) +DD (OP_3128 - OP_1000) + (8 * 1000000h) +DD (OP_3130 - OP_1000) + (8 * 1000000h) +DD (OP_3138 - OP_1000) + (1 * 1000000h) +DD (OP_3139 - OP_1000) + (1 * 1000000h) +DD (OP_313a - OP_1000) + (1 * 1000000h) +DD (OP_313b - OP_1000) + (1 * 1000000h) +DD (OP_313c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3140 - OP_1000) + (16 * 1000000h) +DD (OP_3150 - OP_1000) + (8 * 1000000h) +DD (OP_3158 - OP_1000) + (8 * 1000000h) +DD (OP_3160 - OP_1000) + (8 * 1000000h) +DD (OP_3168 - OP_1000) + (8 * 1000000h) +DD (OP_3170 - OP_1000) + (8 * 1000000h) +DD (OP_3178 - OP_1000) + (1 * 1000000h) +DD (OP_3179 - OP_1000) + (1 * 1000000h) +DD (OP_317a - OP_1000) + (1 * 1000000h) +DD (OP_317b - OP_1000) + (1 * 1000000h) +DD (OP_317c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3180 - OP_1000) + (16 * 1000000h) +DD (OP_3190 - OP_1000) + (8 * 1000000h) +DD (OP_3198 - OP_1000) + (8 * 1000000h) +DD (OP_31a0 - OP_1000) + (8 * 1000000h) +DD (OP_31a8 - OP_1000) + (8 * 1000000h) +DD (OP_31b0 - OP_1000) + (8 * 1000000h) +DD (OP_31b8 - OP_1000) + (1 * 1000000h) +DD (OP_31b9 - OP_1000) + (1 * 1000000h) +DD (OP_31ba - OP_1000) + (1 * 1000000h) +DD (OP_31bb - OP_1000) + (1 * 1000000h) +DD (OP_31bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (67 * 1000000h) +DD (OP_3000 - OP_1000) + (16 * 1000000h) +DD (OP_3010 - OP_1000) + (8 * 1000000h) +DD (OP_3018 - OP_1000) + (8 * 1000000h) +DD (OP_3020 - OP_1000) + (8 * 1000000h) +DD (OP_3028 - OP_1000) + (8 * 1000000h) +DD (OP_3030 - OP_1000) + (8 * 1000000h) +DD (OP_3038 - OP_1000) + (1 * 1000000h) +DD (OP_3039 - OP_1000) + (1 * 1000000h) +DD (OP_303a - OP_1000) + (1 * 1000000h) +DD (OP_303b - OP_1000) + (1 * 1000000h) +DD (OP_303c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3040 - OP_1000) + (16 * 1000000h) +DD (OP_3050 - OP_1000) + (8 * 1000000h) +DD (OP_3058 - OP_1000) + (8 * 1000000h) +DD (OP_3060 - OP_1000) + (8 * 1000000h) +DD (OP_3068 - OP_1000) + (8 * 1000000h) +DD (OP_3070 - OP_1000) + (8 * 1000000h) +DD (OP_3078 - OP_1000) + (1 * 1000000h) +DD (OP_3079 - OP_1000) + (1 * 1000000h) +DD (OP_307a - OP_1000) + (1 * 1000000h) +DD (OP_307b - OP_1000) + (1 * 1000000h) +DD (OP_307c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3080 - OP_1000) + (16 * 1000000h) +DD (OP_3090 - OP_1000) + (8 * 1000000h) +DD (OP_3098 - OP_1000) + (8 * 1000000h) +DD (OP_30a0 - OP_1000) + (8 * 1000000h) +DD (OP_30a8 - OP_1000) + (8 * 1000000h) +DD (OP_30b0 - OP_1000) + (8 * 1000000h) +DD (OP_30b8 - OP_1000) + (1 * 1000000h) +DD (OP_30b9 - OP_1000) + (1 * 1000000h) +DD (OP_30ba - OP_1000) + (1 * 1000000h) +DD (OP_30bb - OP_1000) + (1 * 1000000h) +DD (OP_30bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_30c0 - OP_1000) + (16 * 1000000h) +DD (OP_30d0 - OP_1000) + (8 * 1000000h) +DD (OP_30d8 - OP_1000) + (8 * 1000000h) +DD (OP_30e0 - OP_1000) + (8 * 1000000h) +DD (OP_30e8 - OP_1000) + (8 * 1000000h) +DD (OP_30f0 - OP_1000) + (8 * 1000000h) +DD (OP_30f8 - OP_1000) + (1 * 1000000h) +DD (OP_30f9 - OP_1000) + (1 * 1000000h) +DD (OP_30fa - OP_1000) + (1 * 1000000h) +DD (OP_30fb - OP_1000) + (1 * 1000000h) +DD (OP_30fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3100 - OP_1000) + (16 * 1000000h) +DD (OP_3110 - OP_1000) + (8 * 1000000h) +DD (OP_3118 - OP_1000) + (8 * 1000000h) +DD (OP_3120 - OP_1000) + (8 * 1000000h) +DD (OP_3128 - OP_1000) + (8 * 1000000h) +DD (OP_3130 - OP_1000) + (8 * 1000000h) +DD (OP_3138 - OP_1000) + (1 * 1000000h) +DD (OP_3139 - OP_1000) + (1 * 1000000h) +DD (OP_313a - OP_1000) + (1 * 1000000h) +DD (OP_313b - OP_1000) + (1 * 1000000h) +DD (OP_313c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3140 - OP_1000) + (16 * 1000000h) +DD (OP_3150 - OP_1000) + (8 * 1000000h) +DD (OP_3158 - OP_1000) + (8 * 1000000h) +DD (OP_3160 - OP_1000) + (8 * 1000000h) +DD (OP_3168 - OP_1000) + (8 * 1000000h) +DD (OP_3170 - OP_1000) + (8 * 1000000h) +DD (OP_3178 - OP_1000) + (1 * 1000000h) +DD (OP_3179 - OP_1000) + (1 * 1000000h) +DD (OP_317a - OP_1000) + (1 * 1000000h) +DD (OP_317b - OP_1000) + (1 * 1000000h) +DD (OP_317c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3180 - OP_1000) + (16 * 1000000h) +DD (OP_3190 - OP_1000) + (8 * 1000000h) +DD (OP_3198 - OP_1000) + (8 * 1000000h) +DD (OP_31a0 - OP_1000) + (8 * 1000000h) +DD (OP_31a8 - OP_1000) + (8 * 1000000h) +DD (OP_31b0 - OP_1000) + (8 * 1000000h) +DD (OP_31b8 - OP_1000) + (1 * 1000000h) +DD (OP_31b9 - OP_1000) + (1 * 1000000h) +DD (OP_31ba - OP_1000) + (1 * 1000000h) +DD (OP_31bb - OP_1000) + (1 * 1000000h) +DD (OP_31bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (67 * 1000000h) +DD (OP_3000 - OP_1000) + (16 * 1000000h) +DD (OP_3010 - OP_1000) + (8 * 1000000h) +DD (OP_3018 - OP_1000) + (8 * 1000000h) +DD (OP_3020 - OP_1000) + (8 * 1000000h) +DD (OP_3028 - OP_1000) + (8 * 1000000h) +DD (OP_3030 - OP_1000) + (8 * 1000000h) +DD (OP_3038 - OP_1000) + (1 * 1000000h) +DD (OP_3039 - OP_1000) + (1 * 1000000h) +DD (OP_303a - OP_1000) + (1 * 1000000h) +DD (OP_303b - OP_1000) + (1 * 1000000h) +DD (OP_303c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3040 - OP_1000) + (16 * 1000000h) +DD (OP_3050 - OP_1000) + (8 * 1000000h) +DD (OP_3058 - OP_1000) + (8 * 1000000h) +DD (OP_3060 - OP_1000) + (8 * 1000000h) +DD (OP_3068 - OP_1000) + (8 * 1000000h) +DD (OP_3070 - OP_1000) + (8 * 1000000h) +DD (OP_3078 - OP_1000) + (1 * 1000000h) +DD (OP_3079 - OP_1000) + (1 * 1000000h) +DD (OP_307a - OP_1000) + (1 * 1000000h) +DD (OP_307b - OP_1000) + (1 * 1000000h) +DD (OP_307c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3080 - OP_1000) + (16 * 1000000h) +DD (OP_3090 - OP_1000) + (8 * 1000000h) +DD (OP_3098 - OP_1000) + (8 * 1000000h) +DD (OP_30a0 - OP_1000) + (8 * 1000000h) +DD (OP_30a8 - OP_1000) + (8 * 1000000h) +DD (OP_30b0 - OP_1000) + (8 * 1000000h) +DD (OP_30b8 - OP_1000) + (1 * 1000000h) +DD (OP_30b9 - OP_1000) + (1 * 1000000h) +DD (OP_30ba - OP_1000) + (1 * 1000000h) +DD (OP_30bb - OP_1000) + (1 * 1000000h) +DD (OP_30bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_30c0 - OP_1000) + (16 * 1000000h) +DD (OP_30d0 - OP_1000) + (8 * 1000000h) +DD (OP_30d8 - OP_1000) + (8 * 1000000h) +DD (OP_30e0 - OP_1000) + (8 * 1000000h) +DD (OP_30e8 - OP_1000) + (8 * 1000000h) +DD (OP_30f0 - OP_1000) + (8 * 1000000h) +DD (OP_30f8 - OP_1000) + (1 * 1000000h) +DD (OP_30f9 - OP_1000) + (1 * 1000000h) +DD (OP_30fa - OP_1000) + (1 * 1000000h) +DD (OP_30fb - OP_1000) + (1 * 1000000h) +DD (OP_30fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3100 - OP_1000) + (16 * 1000000h) +DD (OP_3110 - OP_1000) + (8 * 1000000h) +DD (OP_3118 - OP_1000) + (8 * 1000000h) +DD (OP_3120 - OP_1000) + (8 * 1000000h) +DD (OP_3128 - OP_1000) + (8 * 1000000h) +DD (OP_3130 - OP_1000) + (8 * 1000000h) +DD (OP_3138 - OP_1000) + (1 * 1000000h) +DD (OP_3139 - OP_1000) + (1 * 1000000h) +DD (OP_313a - OP_1000) + (1 * 1000000h) +DD (OP_313b - OP_1000) + (1 * 1000000h) +DD (OP_313c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3140 - OP_1000) + (16 * 1000000h) +DD (OP_3150 - OP_1000) + (8 * 1000000h) +DD (OP_3158 - OP_1000) + (8 * 1000000h) +DD (OP_3160 - OP_1000) + (8 * 1000000h) +DD (OP_3168 - OP_1000) + (8 * 1000000h) +DD (OP_3170 - OP_1000) + (8 * 1000000h) +DD (OP_3178 - OP_1000) + (1 * 1000000h) +DD (OP_3179 - OP_1000) + (1 * 1000000h) +DD (OP_317a - OP_1000) + (1 * 1000000h) +DD (OP_317b - OP_1000) + (1 * 1000000h) +DD (OP_317c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_3180 - OP_1000) + (16 * 1000000h) +DD (OP_3190 - OP_1000) + (8 * 1000000h) +DD (OP_3198 - OP_1000) + (8 * 1000000h) +DD (OP_31a0 - OP_1000) + (8 * 1000000h) +DD (OP_31a8 - OP_1000) + (8 * 1000000h) +DD (OP_31b0 - OP_1000) + (8 * 1000000h) +DD (OP_31b8 - OP_1000) + (1 * 1000000h) +DD (OP_31b9 - OP_1000) + (1 * 1000000h) +DD (OP_31ba - OP_1000) + (1 * 1000000h) +DD (OP_31bb - OP_1000) + (1 * 1000000h) +DD (OP_31bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (67 * 1000000h) +DD (OP_4000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_4010 - OP_1000) + (8 * 1000000h) +DD (OP_4018 - OP_1000) + (8 * 1000000h) +DD (OP_4020 - OP_1000) + (8 * 1000000h) +DD (OP_4028 - OP_1000) + (8 * 1000000h) +DD (OP_4030 - OP_1000) + (8 * 1000000h) +DD (OP_4038 - OP_1000) + (1 * 1000000h) +DD (OP_4039 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_4040 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_4050 - OP_1000) + (8 * 1000000h) +DD (OP_4058 - OP_1000) + (8 * 1000000h) +DD (OP_4060 - OP_1000) + (8 * 1000000h) +DD (OP_4068 - OP_1000) + (8 * 1000000h) +DD (OP_4070 - OP_1000) + (8 * 1000000h) +DD (OP_4078 - OP_1000) + (1 * 1000000h) +DD (OP_4079 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_4080 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_4090 - OP_1000) + (8 * 1000000h) +DD (OP_4098 - OP_1000) + (8 * 1000000h) +DD (OP_40a0 - OP_1000) + (8 * 1000000h) +DD (OP_40a8 - OP_1000) + (8 * 1000000h) +DD (OP_40b0 - OP_1000) + (8 * 1000000h) +DD (OP_40b8 - OP_1000) + (1 * 1000000h) +DD (OP_40b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_40c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_40d0 - OP_1000) + (8 * 1000000h) +DD (OP_40d8 - OP_1000) + (8 * 1000000h) +DD (OP_40e0 - OP_1000) + (8 * 1000000h) +DD (OP_40e8 - OP_1000) + (8 * 1000000h) +DD (OP_40f0 - OP_1000) + (8 * 1000000h) +DD (OP_40f8 - OP_1000) + (1 * 1000000h) +DD (OP_40f9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (134 * 1000000h) +DD (OP_4180 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (15 * 1000000h) +DD (OP_4190 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (7 * 1000000h) +DD (OP_4198 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (7 * 1000000h) +DD (OP_41a0 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (7 * 1000000h) +DD (OP_41a8 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (7 * 1000000h) +DD (OP_41b0 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (7 * 1000000h) +DD (OP_41b8 - OP_1000) + (1 * 1000000h) +DD (OP_41b9 - OP_1000) + (1 * 1000000h) +DD (OP_41ba - OP_1000) + (1 * 1000000h) +DD (OP_41bb - OP_1000) + (1 * 1000000h) +DD (OP_41bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (19 * 1000000h) +DD (OP_41d0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (16 * 1000000h) +DD (OP_41e8 - OP_1000) + (8 * 1000000h) +DD (OP_41f0 - OP_1000) + (8 * 1000000h) +DD (OP_41f8 - OP_1000) + (1 * 1000000h) +DD (OP_41f9 - OP_1000) + (1 * 1000000h) +DD (OP_41fa - OP_1000) + (1 * 1000000h) +DD (OP_41fb - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (4 * 1000000h) +DD (OP_4200 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_4210 - OP_1000) + (8 * 1000000h) +DD (OP_4218 - OP_1000) + (8 * 1000000h) +DD (OP_4220 - OP_1000) + (8 * 1000000h) +DD (OP_4228 - OP_1000) + (8 * 1000000h) +DD (OP_4230 - OP_1000) + (8 * 1000000h) +DD (OP_4238 - OP_1000) + (1 * 1000000h) +DD (OP_4239 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_4240 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_4250 - OP_1000) + (8 * 1000000h) +DD (OP_4258 - OP_1000) + (8 * 1000000h) +DD (OP_4260 - OP_1000) + (8 * 1000000h) +DD (OP_4268 - OP_1000) + (8 * 1000000h) +DD (OP_4270 - OP_1000) + (8 * 1000000h) +DD (OP_4278 - OP_1000) + (1 * 1000000h) +DD (OP_4279 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_4280 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_4290 - OP_1000) + (8 * 1000000h) +DD (OP_4298 - OP_1000) + (8 * 1000000h) +DD (OP_42a0 - OP_1000) + (8 * 1000000h) +DD (OP_42a8 - OP_1000) + (8 * 1000000h) +DD (OP_42b0 - OP_1000) + (8 * 1000000h) +DD (OP_42b8 - OP_1000) + (1 * 1000000h) +DD (OP_42b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_42c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_42d0 - OP_1000) + (8 * 1000000h) +DD (OP_42d8 - OP_1000) + (8 * 1000000h) +DD (OP_42e0 - OP_1000) + (8 * 1000000h) +DD (OP_42e8 - OP_1000) + (8 * 1000000h) +DD (OP_42f0 - OP_1000) + (8 * 1000000h) +DD (OP_42f8 - OP_1000) + (1 * 1000000h) +DD (OP_42f9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (214 * 1000000h) +DD (OP_41d0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (16 * 1000000h) +DD (OP_41e8 - OP_1000) + (8 * 1000000h) +DD (OP_41f0 - OP_1000) + (8 * 1000000h) +DD (OP_41f8 - OP_1000) + (1 * 1000000h) +DD (OP_41f9 - OP_1000) + (1 * 1000000h) +DD (OP_41fa - OP_1000) + (1 * 1000000h) +DD (OP_41fb - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (4 * 1000000h) +DD (OP_4400 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_4410 - OP_1000) + (8 * 1000000h) +DD (OP_4418 - OP_1000) + (8 * 1000000h) +DD (OP_4420 - OP_1000) + (8 * 1000000h) +DD (OP_4428 - OP_1000) + (8 * 1000000h) +DD (OP_4430 - OP_1000) + (8 * 1000000h) +DD (OP_4438 - OP_1000) + (1 * 1000000h) +DD (OP_4439 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_4440 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_4450 - OP_1000) + (8 * 1000000h) +DD (OP_4458 - OP_1000) + (8 * 1000000h) +DD (OP_4460 - OP_1000) + (8 * 1000000h) +DD (OP_4468 - OP_1000) + (8 * 1000000h) +DD (OP_4470 - OP_1000) + (8 * 1000000h) +DD (OP_4478 - OP_1000) + (1 * 1000000h) +DD (OP_4479 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_4480 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_4490 - OP_1000) + (8 * 1000000h) +DD (OP_4498 - OP_1000) + (8 * 1000000h) +DD (OP_44a0 - OP_1000) + (8 * 1000000h) +DD (OP_44a8 - OP_1000) + (8 * 1000000h) +DD (OP_44b0 - OP_1000) + (8 * 1000000h) +DD (OP_44b8 - OP_1000) + (1 * 1000000h) +DD (OP_44b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_44c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_44d0 - OP_1000) + (8 * 1000000h) +DD (OP_44d8 - OP_1000) + (8 * 1000000h) +DD (OP_44e0 - OP_1000) + (8 * 1000000h) +DD (OP_44e8 - OP_1000) + (8 * 1000000h) +DD (OP_44f0 - OP_1000) + (8 * 1000000h) +DD (OP_44f8 - OP_1000) + (1 * 1000000h) +DD (OP_44f9 - OP_1000) + (1 * 1000000h) +DD (OP_44fa - OP_1000) + (1 * 1000000h) +DD (OP_44fb - OP_1000) + (1 * 1000000h) +DD (OP_44fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (211 * 1000000h) +DD (OP_41d0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (16 * 1000000h) +DD (OP_41e8 - OP_1000) + (8 * 1000000h) +DD (OP_41f0 - OP_1000) + (8 * 1000000h) +DD (OP_41f8 - OP_1000) + (1 * 1000000h) +DD (OP_41f9 - OP_1000) + (1 * 1000000h) +DD (OP_41fa - OP_1000) + (1 * 1000000h) +DD (OP_41fb - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (4 * 1000000h) +DD (OP_4600 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_4610 - OP_1000) + (8 * 1000000h) +DD (OP_4618 - OP_1000) + (8 * 1000000h) +DD (OP_4620 - OP_1000) + (8 * 1000000h) +DD (OP_4628 - OP_1000) + (8 * 1000000h) +DD (OP_4630 - OP_1000) + (8 * 1000000h) +DD (OP_4638 - OP_1000) + (1 * 1000000h) +DD (OP_4639 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_4640 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_4650 - OP_1000) + (8 * 1000000h) +DD (OP_4658 - OP_1000) + (8 * 1000000h) +DD (OP_4660 - OP_1000) + (8 * 1000000h) +DD (OP_4668 - OP_1000) + (8 * 1000000h) +DD (OP_4670 - OP_1000) + (8 * 1000000h) +DD (OP_4678 - OP_1000) + (1 * 1000000h) +DD (OP_4679 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_4680 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_4690 - OP_1000) + (8 * 1000000h) +DD (OP_4698 - OP_1000) + (8 * 1000000h) +DD (OP_46a0 - OP_1000) + (8 * 1000000h) +DD (OP_46a8 - OP_1000) + (8 * 1000000h) +DD (OP_46b0 - OP_1000) + (8 * 1000000h) +DD (OP_46b8 - OP_1000) + (1 * 1000000h) +DD (OP_46b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_46c0 - OP_1000) + (8 * 1000000h) +;DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_46d0 - OP_1000) + (8 * 1000000h) +DD (OP_46d8 - OP_1000) + (8 * 1000000h) +DD (OP_46e0 - OP_1000) + (8 * 1000000h) +DD (OP_46e8 - OP_1000) + (8 * 1000000h) +DD (OP_46f0 - OP_1000) + (8 * 1000000h) +DD (OP_46f8 - OP_1000) + (1 * 1000000h) +DD (OP_46f9 - OP_1000) + (1 * 1000000h) +DD (OP_46fa - OP_1000) + (1 * 1000000h) +DD (OP_46fb - OP_1000) + (1 * 1000000h) +DD (OP_46fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (211 * 1000000h) +DD (OP_41d0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (16 * 1000000h) +DD (OP_41e8 - OP_1000) + (8 * 1000000h) +DD (OP_41f0 - OP_1000) + (8 * 1000000h) +DD (OP_41f8 - OP_1000) + (1 * 1000000h) +DD (OP_41f9 - OP_1000) + (1 * 1000000h) +DD (OP_41fa - OP_1000) + (1 * 1000000h) +DD (OP_41fb - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (4 * 1000000h) +DD (OP_4800 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_4810 - OP_1000) + (8 * 1000000h) +DD (OP_4818 - OP_1000) + (8 * 1000000h) +DD (OP_4820 - OP_1000) + (8 * 1000000h) +DD (OP_4828 - OP_1000) + (8 * 1000000h) +DD (OP_4830 - OP_1000) + (8 * 1000000h) +DD (OP_4838 - OP_1000) + (1 * 1000000h) +DD (OP_4839 - OP_1000) + (1 * 1000000h) +DD (OP_483a - OP_1000) + (1 * 1000000h) +DD (OP_483b - OP_1000) + (1 * 1000000h) +DD (OP_483c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_4840 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_4850 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (16 * 1000000h) +DD (OP_4868 - OP_1000) + (8 * 1000000h) +DD (OP_4870 - OP_1000) + (8 * 1000000h) +DD (OP_4878 - OP_1000) + (1 * 1000000h) +DD (OP_4879 - OP_1000) + (1 * 1000000h) +DD (OP_487a - OP_1000) + (1 * 1000000h) +DD (OP_487b - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (4 * 1000000h) +DD (OP_4880 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_4890 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_48a0 - OP_1000) + (8 * 1000000h) +DD (OP_48a8 - OP_1000) + (8 * 1000000h) +DD (OP_48b0 - OP_1000) + (8 * 1000000h) +DD (OP_48b8 - OP_1000) + (1 * 1000000h) +DD (OP_48b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_48c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_48d0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_48e0 - OP_1000) + (8 * 1000000h) +DD (OP_48e8 - OP_1000) + (8 * 1000000h) +DD (OP_48f0 - OP_1000) + (8 * 1000000h) +DD (OP_48f8 - OP_1000) + (1 * 1000000h) +DD (OP_48f9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (214 * 1000000h) +DD (OP_41d0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (16 * 1000000h) +DD (OP_41e8 - OP_1000) + (8 * 1000000h) +DD (OP_41f0 - OP_1000) + (8 * 1000000h) +DD (OP_41f8 - OP_1000) + (1 * 1000000h) +DD (OP_41f9 - OP_1000) + (1 * 1000000h) +DD (OP_41fa - OP_1000) + (1 * 1000000h) +DD (OP_41fb - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (4 * 1000000h) +DD (OP_4a00 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_4a10 - OP_1000) + (8 * 1000000h) +DD (OP_4a18 - OP_1000) + (8 * 1000000h) +DD (OP_4a20 - OP_1000) + (8 * 1000000h) +DD (OP_4a28 - OP_1000) + (8 * 1000000h) +DD (OP_4a30 - OP_1000) + (8 * 1000000h) +DD (OP_4a38 - OP_1000) + (1 * 1000000h) +DD (OP_4a39 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_4a40 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_4a50 - OP_1000) + (8 * 1000000h) +DD (OP_4a58 - OP_1000) + (8 * 1000000h) +DD (OP_4a60 - OP_1000) + (8 * 1000000h) +DD (OP_4a68 - OP_1000) + (8 * 1000000h) +DD (OP_4a70 - OP_1000) + (8 * 1000000h) +DD (OP_4a78 - OP_1000) + (1 * 1000000h) +DD (OP_4a79 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_4a80 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_4a90 - OP_1000) + (8 * 1000000h) +DD (OP_4a98 - OP_1000) + (8 * 1000000h) +DD (OP_4aa0 - OP_1000) + (8 * 1000000h) +DD (OP_4aa8 - OP_1000) + (8 * 1000000h) +DD (OP_4ab0 - OP_1000) + (8 * 1000000h) +DD (OP_4ab8 - OP_1000) + (1 * 1000000h) +DD (OP_4ab9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_4ac0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_4ad0 - OP_1000) + (8 * 1000000h) +DD (OP_4ad8 - OP_1000) + (8 * 1000000h) +DD (OP_4ae0 - OP_1000) + (8 * 1000000h) +DD (OP_4ae8 - OP_1000) + (8 * 1000000h) +DD (OP_4af0 - OP_1000) + (8 * 1000000h) +DD (OP_4af8 - OP_1000) + (1 * 1000000h) +DD (OP_4af9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (214 * 1000000h) +DD (OP_41d0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (16 * 1000000h) +DD (OP_41e8 - OP_1000) + (8 * 1000000h) +DD (OP_41f0 - OP_1000) + (8 * 1000000h) +DD (OP_41f8 - OP_1000) + (1 * 1000000h) +DD (OP_41f9 - OP_1000) + (1 * 1000000h) +DD (OP_41fa - OP_1000) + (1 * 1000000h) +DD (OP_41fb - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (148 * 1000000h) +DD (OP_4c90 - OP_1000) + (8 * 1000000h) +DD (OP_4c98 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_4ca8 - OP_1000) + (8 * 1000000h) +DD (OP_4cb0 - OP_1000) + (8 * 1000000h) +DD (OP_4cb8 - OP_1000) + (1 * 1000000h) +DD (OP_4cb9 - OP_1000) + (1 * 1000000h) +DD (OP_4cba - OP_1000) + (1 * 1000000h) +DD (OP_4cbb - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (20 * 1000000h) +DD (OP_4cd0 - OP_1000) + (8 * 1000000h) +DD (OP_4cd8 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_4ce8 - OP_1000) + (8 * 1000000h) +DD (OP_4cf0 - OP_1000) + (8 * 1000000h) +DD (OP_4cf8 - OP_1000) + (1 * 1000000h) +DD (OP_4cf9 - OP_1000) + (1 * 1000000h) +DD (OP_4cfa - OP_1000) + (1 * 1000000h) +DD (OP_4cfb - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (212 * 1000000h) +DD (OP_41d0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (16 * 1000000h) +DD (OP_41e8 - OP_1000) + (8 * 1000000h) +DD (OP_41f0 - OP_1000) + (8 * 1000000h) +DD (OP_41f8 - OP_1000) + (1 * 1000000h) +DD (OP_41f9 - OP_1000) + (1 * 1000000h) +DD (OP_41fa - OP_1000) + (1 * 1000000h) +DD (OP_41fb - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (68 * 1000000h) +DD (OP_4e40 - OP_1000) + (16 * 1000000h) +DD (OP_4e50 - OP_1000) + (8 * 1000000h) +DD (OP_4e58 - OP_1000) + (8 * 1000000h) +DD (OP_4e60 - OP_1000) + (8 * 1000000h) +DD (OP_4e68 - OP_1000) + (8 * 1000000h) +DD (OP_4e70 - OP_1000) + (1 * 1000000h) +DD (OP_4e71 - OP_1000) + (1 * 1000000h) +DD (OP_4e72 - OP_1000) + (1 * 1000000h) +DD (OP_4e73 - OP_1000) + (1 * 1000000h) +DD (OP_4e74 - OP_1000) + (1 * 1000000h) +DD (OP_4e75 - OP_1000) + (1 * 1000000h) +DD (OP_4e76 - OP_1000) + (1 * 1000000h) +DD (OP_4e77 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (2 * 1000000h) +DD (OP_4e7a - OP_1000) + (1 * 1000000h) +DD (OP_4e7b - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (20 * 1000000h) +DD (OP_4e90 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (16 * 1000000h) +DD (OP_4ea8 - OP_1000) + (8 * 1000000h) +DD (OP_4eb0 - OP_1000) + (8 * 1000000h) +DD (OP_4eb8 - OP_1000) + (1 * 1000000h) +DD (OP_4eb9 - OP_1000) + (1 * 1000000h) +DD (OP_4eba - OP_1000) + (1 * 1000000h) +DD (OP_4ebb - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (20 * 1000000h) +DD (OP_4ed0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (16 * 1000000h) +DD (OP_4ee8 - OP_1000) + (8 * 1000000h) +DD (OP_4ef0 - OP_1000) + (8 * 1000000h) +DD (OP_4ef8 - OP_1000) + (1 * 1000000h) +DD (OP_4ef9 - OP_1000) + (1 * 1000000h) +DD (OP_4efa - OP_1000) + (1 * 1000000h) +DD (OP_4efb - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (212 * 1000000h) +DD (OP_41d0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (16 * 1000000h) +DD (OP_41e8 - OP_1000) + (8 * 1000000h) +DD (OP_41f0 - OP_1000) + (8 * 1000000h) +DD (OP_41f8 - OP_1000) + (1 * 1000000h) +DD (OP_41f9 - OP_1000) + (1 * 1000000h) +DD (OP_41fa - OP_1000) + (1 * 1000000h) +DD (OP_41fb - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (4 * 1000000h) +DD (OP_5000 - OP_1000) + (8 * 1000000h) +DD (OP_5088 - OP_1000) + (8 * 1000000h) +DD (OP_5010 - OP_1000) + (8 * 1000000h) +DD (OP_5018 - OP_1000) + (7 * 1000000h) +DD (OP_501f - OP_1000) + (1 * 1000000h) +DD (OP_5020 - OP_1000) + (7 * 1000000h) +DD (OP_5027 - OP_1000) + (1 * 1000000h) +DD (OP_5028 - OP_1000) + (8 * 1000000h) +DD (OP_5030 - OP_1000) + (8 * 1000000h) +DD (OP_5038 - OP_1000) + (1 * 1000000h) +DD (OP_5039 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5040 - OP_1000) + (8 * 1000000h) +DD (OP_5088 - OP_1000) + (8 * 1000000h) +DD (OP_5050 - OP_1000) + (8 * 1000000h) +DD (OP_5058 - OP_1000) + (8 * 1000000h) +DD (OP_5060 - OP_1000) + (8 * 1000000h) +DD (OP_5068 - OP_1000) + (8 * 1000000h) +DD (OP_5070 - OP_1000) + (8 * 1000000h) +DD (OP_5078 - OP_1000) + (1 * 1000000h) +DD (OP_5079 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5080 - OP_1000) + (8 * 1000000h) +DD (OP_5088 - OP_1000) + (8 * 1000000h) +DD (OP_5090 - OP_1000) + (8 * 1000000h) +DD (OP_5098 - OP_1000) + (8 * 1000000h) +DD (OP_50a0 - OP_1000) + (8 * 1000000h) +DD (OP_50a8 - OP_1000) + (8 * 1000000h) +DD (OP_50b0 - OP_1000) + (8 * 1000000h) +DD (OP_50b8 - OP_1000) + (1 * 1000000h) +DD (OP_50b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_50c0 - OP_1000) + (8 * 1000000h) +DD (OP_50c8 - OP_1000) + (8 * 1000000h) +DD (OP_50d0 - OP_1000) + (8 * 1000000h) +DD (OP_50d8 - OP_1000) + (7 * 1000000h) +DD (OP_50df - OP_1000) + (1 * 1000000h) +DD (OP_50e0 - OP_1000) + (7 * 1000000h) +DD (OP_50e7 - OP_1000) + (1 * 1000000h) +DD (OP_50e8 - OP_1000) + (8 * 1000000h) +DD (OP_50f0 - OP_1000) + (8 * 1000000h) +DD (OP_50f8 - OP_1000) + (1 * 1000000h) +DD (OP_50f9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5100 - OP_1000) + (8 * 1000000h) +DD (OP_5188 - OP_1000) + (8 * 1000000h) +DD (OP_5110 - OP_1000) + (8 * 1000000h) +DD (OP_5118 - OP_1000) + (7 * 1000000h) +DD (OP_511f - OP_1000) + (1 * 1000000h) +DD (OP_5120 - OP_1000) + (7 * 1000000h) +DD (OP_5127 - OP_1000) + (1 * 1000000h) +DD (OP_5128 - OP_1000) + (8 * 1000000h) +DD (OP_5130 - OP_1000) + (8 * 1000000h) +DD (OP_5138 - OP_1000) + (1 * 1000000h) +DD (OP_5139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5140 - OP_1000) + (8 * 1000000h) +DD (OP_5188 - OP_1000) + (8 * 1000000h) +DD (OP_5150 - OP_1000) + (8 * 1000000h) +DD (OP_5158 - OP_1000) + (8 * 1000000h) +DD (OP_5160 - OP_1000) + (8 * 1000000h) +DD (OP_5168 - OP_1000) + (8 * 1000000h) +DD (OP_5170 - OP_1000) + (8 * 1000000h) +DD (OP_5178 - OP_1000) + (1 * 1000000h) +DD (OP_5179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5180 - OP_1000) + (8 * 1000000h) +DD (OP_5188 - OP_1000) + (8 * 1000000h) +DD (OP_5190 - OP_1000) + (8 * 1000000h) +DD (OP_5198 - OP_1000) + (8 * 1000000h) +DD (OP_51a0 - OP_1000) + (8 * 1000000h) +DD (OP_51a8 - OP_1000) + (8 * 1000000h) +DD (OP_51b0 - OP_1000) + (8 * 1000000h) +DD (OP_51b8 - OP_1000) + (1 * 1000000h) +DD (OP_51b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_51c0 - OP_1000) + (8 * 1000000h) +DD (OP_51c8 - OP_1000) + (8 * 1000000h) +DD (OP_51d0 - OP_1000) + (8 * 1000000h) +DD (OP_51d8 - OP_1000) + (7 * 1000000h) +DD (OP_51df - OP_1000) + (1 * 1000000h) +DD (OP_51e0 - OP_1000) + (7 * 1000000h) +DD (OP_51e7 - OP_1000) + (1 * 1000000h) +DD (OP_51e8 - OP_1000) + (8 * 1000000h) +DD (OP_51f0 - OP_1000) + (8 * 1000000h) +DD (OP_51f8 - OP_1000) + (1 * 1000000h) +DD (OP_51f9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5000 - OP_1000) + (8 * 1000000h) +DD (OP_5088 - OP_1000) + (8 * 1000000h) +DD (OP_5010 - OP_1000) + (8 * 1000000h) +DD (OP_5018 - OP_1000) + (7 * 1000000h) +DD (OP_501f - OP_1000) + (1 * 1000000h) +DD (OP_5020 - OP_1000) + (7 * 1000000h) +DD (OP_5027 - OP_1000) + (1 * 1000000h) +DD (OP_5028 - OP_1000) + (8 * 1000000h) +DD (OP_5030 - OP_1000) + (8 * 1000000h) +DD (OP_5038 - OP_1000) + (1 * 1000000h) +DD (OP_5039 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5040 - OP_1000) + (8 * 1000000h) +DD (OP_5088 - OP_1000) + (8 * 1000000h) +DD (OP_5050 - OP_1000) + (8 * 1000000h) +DD (OP_5058 - OP_1000) + (8 * 1000000h) +DD (OP_5060 - OP_1000) + (8 * 1000000h) +DD (OP_5068 - OP_1000) + (8 * 1000000h) +DD (OP_5070 - OP_1000) + (8 * 1000000h) +DD (OP_5078 - OP_1000) + (1 * 1000000h) +DD (OP_5079 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5080 - OP_1000) + (8 * 1000000h) +DD (OP_5088 - OP_1000) + (8 * 1000000h) +DD (OP_5090 - OP_1000) + (8 * 1000000h) +DD (OP_5098 - OP_1000) + (8 * 1000000h) +DD (OP_50a0 - OP_1000) + (8 * 1000000h) +DD (OP_50a8 - OP_1000) + (8 * 1000000h) +DD (OP_50b0 - OP_1000) + (8 * 1000000h) +DD (OP_50b8 - OP_1000) + (1 * 1000000h) +DD (OP_50b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_52c0 - OP_1000) + (8 * 1000000h) +DD (OP_52c8 - OP_1000) + (8 * 1000000h) +DD (OP_52d0 - OP_1000) + (8 * 1000000h) +DD (OP_52d8 - OP_1000) + (7 * 1000000h) +DD (OP_52df - OP_1000) + (1 * 1000000h) +DD (OP_52e0 - OP_1000) + (7 * 1000000h) +DD (OP_52e7 - OP_1000) + (1 * 1000000h) +DD (OP_52e8 - OP_1000) + (8 * 1000000h) +DD (OP_52f0 - OP_1000) + (8 * 1000000h) +DD (OP_52f8 - OP_1000) + (1 * 1000000h) +DD (OP_52f9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5100 - OP_1000) + (8 * 1000000h) +DD (OP_5188 - OP_1000) + (8 * 1000000h) +DD (OP_5110 - OP_1000) + (8 * 1000000h) +DD (OP_5118 - OP_1000) + (7 * 1000000h) +DD (OP_511f - OP_1000) + (1 * 1000000h) +DD (OP_5120 - OP_1000) + (7 * 1000000h) +DD (OP_5127 - OP_1000) + (1 * 1000000h) +DD (OP_5128 - OP_1000) + (8 * 1000000h) +DD (OP_5130 - OP_1000) + (8 * 1000000h) +DD (OP_5138 - OP_1000) + (1 * 1000000h) +DD (OP_5139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5140 - OP_1000) + (8 * 1000000h) +DD (OP_5188 - OP_1000) + (8 * 1000000h) +DD (OP_5150 - OP_1000) + (8 * 1000000h) +DD (OP_5158 - OP_1000) + (8 * 1000000h) +DD (OP_5160 - OP_1000) + (8 * 1000000h) +DD (OP_5168 - OP_1000) + (8 * 1000000h) +DD (OP_5170 - OP_1000) + (8 * 1000000h) +DD (OP_5178 - OP_1000) + (1 * 1000000h) +DD (OP_5179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5180 - OP_1000) + (8 * 1000000h) +DD (OP_5188 - OP_1000) + (8 * 1000000h) +DD (OP_5190 - OP_1000) + (8 * 1000000h) +DD (OP_5198 - OP_1000) + (8 * 1000000h) +DD (OP_51a0 - OP_1000) + (8 * 1000000h) +DD (OP_51a8 - OP_1000) + (8 * 1000000h) +DD (OP_51b0 - OP_1000) + (8 * 1000000h) +DD (OP_51b8 - OP_1000) + (1 * 1000000h) +DD (OP_51b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_53c0 - OP_1000) + (8 * 1000000h) +DD (OP_53c8 - OP_1000) + (8 * 1000000h) +DD (OP_53d0 - OP_1000) + (8 * 1000000h) +DD (OP_53d8 - OP_1000) + (7 * 1000000h) +DD (OP_53df - OP_1000) + (1 * 1000000h) +DD (OP_53e0 - OP_1000) + (7 * 1000000h) +DD (OP_53e7 - OP_1000) + (1 * 1000000h) +DD (OP_53e8 - OP_1000) + (8 * 1000000h) +DD (OP_53f0 - OP_1000) + (8 * 1000000h) +DD (OP_53f8 - OP_1000) + (1 * 1000000h) +DD (OP_53f9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5000 - OP_1000) + (8 * 1000000h) +DD (OP_5088 - OP_1000) + (8 * 1000000h) +DD (OP_5010 - OP_1000) + (8 * 1000000h) +DD (OP_5018 - OP_1000) + (7 * 1000000h) +DD (OP_501f - OP_1000) + (1 * 1000000h) +DD (OP_5020 - OP_1000) + (7 * 1000000h) +DD (OP_5027 - OP_1000) + (1 * 1000000h) +DD (OP_5028 - OP_1000) + (8 * 1000000h) +DD (OP_5030 - OP_1000) + (8 * 1000000h) +DD (OP_5038 - OP_1000) + (1 * 1000000h) +DD (OP_5039 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5040 - OP_1000) + (8 * 1000000h) +DD (OP_5088 - OP_1000) + (8 * 1000000h) +DD (OP_5050 - OP_1000) + (8 * 1000000h) +DD (OP_5058 - OP_1000) + (8 * 1000000h) +DD (OP_5060 - OP_1000) + (8 * 1000000h) +DD (OP_5068 - OP_1000) + (8 * 1000000h) +DD (OP_5070 - OP_1000) + (8 * 1000000h) +DD (OP_5078 - OP_1000) + (1 * 1000000h) +DD (OP_5079 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5080 - OP_1000) + (8 * 1000000h) +DD (OP_5088 - OP_1000) + (8 * 1000000h) +DD (OP_5090 - OP_1000) + (8 * 1000000h) +DD (OP_5098 - OP_1000) + (8 * 1000000h) +DD (OP_50a0 - OP_1000) + (8 * 1000000h) +DD (OP_50a8 - OP_1000) + (8 * 1000000h) +DD (OP_50b0 - OP_1000) + (8 * 1000000h) +DD (OP_50b8 - OP_1000) + (1 * 1000000h) +DD (OP_50b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_54c0 - OP_1000) + (8 * 1000000h) +DD (OP_54c8 - OP_1000) + (8 * 1000000h) +DD (OP_54d0 - OP_1000) + (8 * 1000000h) +DD (OP_54d8 - OP_1000) + (7 * 1000000h) +DD (OP_54df - OP_1000) + (1 * 1000000h) +DD (OP_54e0 - OP_1000) + (7 * 1000000h) +DD (OP_54e7 - OP_1000) + (1 * 1000000h) +DD (OP_54e8 - OP_1000) + (8 * 1000000h) +DD (OP_54f0 - OP_1000) + (8 * 1000000h) +DD (OP_54f8 - OP_1000) + (1 * 1000000h) +DD (OP_54f9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5100 - OP_1000) + (8 * 1000000h) +DD (OP_5188 - OP_1000) + (8 * 1000000h) +DD (OP_5110 - OP_1000) + (8 * 1000000h) +DD (OP_5118 - OP_1000) + (7 * 1000000h) +DD (OP_511f - OP_1000) + (1 * 1000000h) +DD (OP_5120 - OP_1000) + (7 * 1000000h) +DD (OP_5127 - OP_1000) + (1 * 1000000h) +DD (OP_5128 - OP_1000) + (8 * 1000000h) +DD (OP_5130 - OP_1000) + (8 * 1000000h) +DD (OP_5138 - OP_1000) + (1 * 1000000h) +DD (OP_5139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5140 - OP_1000) + (8 * 1000000h) +DD (OP_5188 - OP_1000) + (8 * 1000000h) +DD (OP_5150 - OP_1000) + (8 * 1000000h) +DD (OP_5158 - OP_1000) + (8 * 1000000h) +DD (OP_5160 - OP_1000) + (8 * 1000000h) +DD (OP_5168 - OP_1000) + (8 * 1000000h) +DD (OP_5170 - OP_1000) + (8 * 1000000h) +DD (OP_5178 - OP_1000) + (1 * 1000000h) +DD (OP_5179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5180 - OP_1000) + (8 * 1000000h) +DD (OP_5188 - OP_1000) + (8 * 1000000h) +DD (OP_5190 - OP_1000) + (8 * 1000000h) +DD (OP_5198 - OP_1000) + (8 * 1000000h) +DD (OP_51a0 - OP_1000) + (8 * 1000000h) +DD (OP_51a8 - OP_1000) + (8 * 1000000h) +DD (OP_51b0 - OP_1000) + (8 * 1000000h) +DD (OP_51b8 - OP_1000) + (1 * 1000000h) +DD (OP_51b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_55c0 - OP_1000) + (8 * 1000000h) +DD (OP_55c8 - OP_1000) + (8 * 1000000h) +DD (OP_55d0 - OP_1000) + (8 * 1000000h) +DD (OP_55d8 - OP_1000) + (7 * 1000000h) +DD (OP_55df - OP_1000) + (1 * 1000000h) +DD (OP_55e0 - OP_1000) + (7 * 1000000h) +DD (OP_55e7 - OP_1000) + (1 * 1000000h) +DD (OP_55e8 - OP_1000) + (8 * 1000000h) +DD (OP_55f0 - OP_1000) + (8 * 1000000h) +DD (OP_55f8 - OP_1000) + (1 * 1000000h) +DD (OP_55f9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5000 - OP_1000) + (8 * 1000000h) +DD (OP_5088 - OP_1000) + (8 * 1000000h) +DD (OP_5010 - OP_1000) + (8 * 1000000h) +DD (OP_5018 - OP_1000) + (7 * 1000000h) +DD (OP_501f - OP_1000) + (1 * 1000000h) +DD (OP_5020 - OP_1000) + (7 * 1000000h) +DD (OP_5027 - OP_1000) + (1 * 1000000h) +DD (OP_5028 - OP_1000) + (8 * 1000000h) +DD (OP_5030 - OP_1000) + (8 * 1000000h) +DD (OP_5038 - OP_1000) + (1 * 1000000h) +DD (OP_5039 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5040 - OP_1000) + (8 * 1000000h) +DD (OP_5088 - OP_1000) + (8 * 1000000h) +DD (OP_5050 - OP_1000) + (8 * 1000000h) +DD (OP_5058 - OP_1000) + (8 * 1000000h) +DD (OP_5060 - OP_1000) + (8 * 1000000h) +DD (OP_5068 - OP_1000) + (8 * 1000000h) +DD (OP_5070 - OP_1000) + (8 * 1000000h) +DD (OP_5078 - OP_1000) + (1 * 1000000h) +DD (OP_5079 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5080 - OP_1000) + (8 * 1000000h) +DD (OP_5088 - OP_1000) + (8 * 1000000h) +DD (OP_5090 - OP_1000) + (8 * 1000000h) +DD (OP_5098 - OP_1000) + (8 * 1000000h) +DD (OP_50a0 - OP_1000) + (8 * 1000000h) +DD (OP_50a8 - OP_1000) + (8 * 1000000h) +DD (OP_50b0 - OP_1000) + (8 * 1000000h) +DD (OP_50b8 - OP_1000) + (1 * 1000000h) +DD (OP_50b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_56c0 - OP_1000) + (8 * 1000000h) +DD (OP_56c8 - OP_1000) + (8 * 1000000h) +DD (OP_56d0 - OP_1000) + (8 * 1000000h) +DD (OP_56d8 - OP_1000) + (7 * 1000000h) +DD (OP_56df - OP_1000) + (1 * 1000000h) +DD (OP_56e0 - OP_1000) + (7 * 1000000h) +DD (OP_56e7 - OP_1000) + (1 * 1000000h) +DD (OP_56e8 - OP_1000) + (8 * 1000000h) +DD (OP_56f0 - OP_1000) + (8 * 1000000h) +DD (OP_56f8 - OP_1000) + (1 * 1000000h) +DD (OP_56f9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5100 - OP_1000) + (8 * 1000000h) +DD (OP_5188 - OP_1000) + (8 * 1000000h) +DD (OP_5110 - OP_1000) + (8 * 1000000h) +DD (OP_5118 - OP_1000) + (7 * 1000000h) +DD (OP_511f - OP_1000) + (1 * 1000000h) +DD (OP_5120 - OP_1000) + (7 * 1000000h) +DD (OP_5127 - OP_1000) + (1 * 1000000h) +DD (OP_5128 - OP_1000) + (8 * 1000000h) +DD (OP_5130 - OP_1000) + (8 * 1000000h) +DD (OP_5138 - OP_1000) + (1 * 1000000h) +DD (OP_5139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5140 - OP_1000) + (8 * 1000000h) +DD (OP_5188 - OP_1000) + (8 * 1000000h) +DD (OP_5150 - OP_1000) + (8 * 1000000h) +DD (OP_5158 - OP_1000) + (8 * 1000000h) +DD (OP_5160 - OP_1000) + (8 * 1000000h) +DD (OP_5168 - OP_1000) + (8 * 1000000h) +DD (OP_5170 - OP_1000) + (8 * 1000000h) +DD (OP_5178 - OP_1000) + (1 * 1000000h) +DD (OP_5179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5180 - OP_1000) + (8 * 1000000h) +DD (OP_5188 - OP_1000) + (8 * 1000000h) +DD (OP_5190 - OP_1000) + (8 * 1000000h) +DD (OP_5198 - OP_1000) + (8 * 1000000h) +DD (OP_51a0 - OP_1000) + (8 * 1000000h) +DD (OP_51a8 - OP_1000) + (8 * 1000000h) +DD (OP_51b0 - OP_1000) + (8 * 1000000h) +DD (OP_51b8 - OP_1000) + (1 * 1000000h) +DD (OP_51b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_57c0 - OP_1000) + (8 * 1000000h) +DD (OP_57c8 - OP_1000) + (8 * 1000000h) +DD (OP_57d0 - OP_1000) + (8 * 1000000h) +DD (OP_57d8 - OP_1000) + (7 * 1000000h) +DD (OP_57df - OP_1000) + (1 * 1000000h) +DD (OP_57e0 - OP_1000) + (7 * 1000000h) +DD (OP_57e7 - OP_1000) + (1 * 1000000h) +DD (OP_57e8 - OP_1000) + (8 * 1000000h) +DD (OP_57f0 - OP_1000) + (8 * 1000000h) +DD (OP_57f8 - OP_1000) + (1 * 1000000h) +DD (OP_57f9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5000 - OP_1000) + (8 * 1000000h) +DD (OP_5088 - OP_1000) + (8 * 1000000h) +DD (OP_5010 - OP_1000) + (8 * 1000000h) +DD (OP_5018 - OP_1000) + (7 * 1000000h) +DD (OP_501f - OP_1000) + (1 * 1000000h) +DD (OP_5020 - OP_1000) + (7 * 1000000h) +DD (OP_5027 - OP_1000) + (1 * 1000000h) +DD (OP_5028 - OP_1000) + (8 * 1000000h) +DD (OP_5030 - OP_1000) + (8 * 1000000h) +DD (OP_5038 - OP_1000) + (1 * 1000000h) +DD (OP_5039 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5040 - OP_1000) + (8 * 1000000h) +DD (OP_5088 - OP_1000) + (8 * 1000000h) +DD (OP_5050 - OP_1000) + (8 * 1000000h) +DD (OP_5058 - OP_1000) + (8 * 1000000h) +DD (OP_5060 - OP_1000) + (8 * 1000000h) +DD (OP_5068 - OP_1000) + (8 * 1000000h) +DD (OP_5070 - OP_1000) + (8 * 1000000h) +DD (OP_5078 - OP_1000) + (1 * 1000000h) +DD (OP_5079 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5080 - OP_1000) + (8 * 1000000h) +DD (OP_5088 - OP_1000) + (8 * 1000000h) +DD (OP_5090 - OP_1000) + (8 * 1000000h) +DD (OP_5098 - OP_1000) + (8 * 1000000h) +DD (OP_50a0 - OP_1000) + (8 * 1000000h) +DD (OP_50a8 - OP_1000) + (8 * 1000000h) +DD (OP_50b0 - OP_1000) + (8 * 1000000h) +DD (OP_50b8 - OP_1000) + (1 * 1000000h) +DD (OP_50b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_58c0 - OP_1000) + (8 * 1000000h) +DD (OP_58c8 - OP_1000) + (8 * 1000000h) +DD (OP_58d0 - OP_1000) + (8 * 1000000h) +DD (OP_58d8 - OP_1000) + (7 * 1000000h) +DD (OP_58df - OP_1000) + (1 * 1000000h) +DD (OP_58e0 - OP_1000) + (7 * 1000000h) +DD (OP_58e7 - OP_1000) + (1 * 1000000h) +DD (OP_58e8 - OP_1000) + (8 * 1000000h) +DD (OP_58f0 - OP_1000) + (8 * 1000000h) +DD (OP_58f8 - OP_1000) + (1 * 1000000h) +DD (OP_58f9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5100 - OP_1000) + (8 * 1000000h) +DD (OP_5188 - OP_1000) + (8 * 1000000h) +DD (OP_5110 - OP_1000) + (8 * 1000000h) +DD (OP_5118 - OP_1000) + (7 * 1000000h) +DD (OP_511f - OP_1000) + (1 * 1000000h) +DD (OP_5120 - OP_1000) + (7 * 1000000h) +DD (OP_5127 - OP_1000) + (1 * 1000000h) +DD (OP_5128 - OP_1000) + (8 * 1000000h) +DD (OP_5130 - OP_1000) + (8 * 1000000h) +DD (OP_5138 - OP_1000) + (1 * 1000000h) +DD (OP_5139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5140 - OP_1000) + (8 * 1000000h) +DD (OP_5188 - OP_1000) + (8 * 1000000h) +DD (OP_5150 - OP_1000) + (8 * 1000000h) +DD (OP_5158 - OP_1000) + (8 * 1000000h) +DD (OP_5160 - OP_1000) + (8 * 1000000h) +DD (OP_5168 - OP_1000) + (8 * 1000000h) +DD (OP_5170 - OP_1000) + (8 * 1000000h) +DD (OP_5178 - OP_1000) + (1 * 1000000h) +DD (OP_5179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5180 - OP_1000) + (8 * 1000000h) +DD (OP_5188 - OP_1000) + (8 * 1000000h) +DD (OP_5190 - OP_1000) + (8 * 1000000h) +DD (OP_5198 - OP_1000) + (8 * 1000000h) +DD (OP_51a0 - OP_1000) + (8 * 1000000h) +DD (OP_51a8 - OP_1000) + (8 * 1000000h) +DD (OP_51b0 - OP_1000) + (8 * 1000000h) +DD (OP_51b8 - OP_1000) + (1 * 1000000h) +DD (OP_51b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_59c0 - OP_1000) + (8 * 1000000h) +DD (OP_59c8 - OP_1000) + (8 * 1000000h) +DD (OP_59d0 - OP_1000) + (8 * 1000000h) +DD (OP_59d8 - OP_1000) + (7 * 1000000h) +DD (OP_59df - OP_1000) + (1 * 1000000h) +DD (OP_59e0 - OP_1000) + (7 * 1000000h) +DD (OP_59e7 - OP_1000) + (1 * 1000000h) +DD (OP_59e8 - OP_1000) + (8 * 1000000h) +DD (OP_59f0 - OP_1000) + (8 * 1000000h) +DD (OP_59f8 - OP_1000) + (1 * 1000000h) +DD (OP_59f9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5000 - OP_1000) + (8 * 1000000h) +DD (OP_5088 - OP_1000) + (8 * 1000000h) +DD (OP_5010 - OP_1000) + (8 * 1000000h) +DD (OP_5018 - OP_1000) + (7 * 1000000h) +DD (OP_501f - OP_1000) + (1 * 1000000h) +DD (OP_5020 - OP_1000) + (7 * 1000000h) +DD (OP_5027 - OP_1000) + (1 * 1000000h) +DD (OP_5028 - OP_1000) + (8 * 1000000h) +DD (OP_5030 - OP_1000) + (8 * 1000000h) +DD (OP_5038 - OP_1000) + (1 * 1000000h) +DD (OP_5039 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5040 - OP_1000) + (8 * 1000000h) +DD (OP_5088 - OP_1000) + (8 * 1000000h) +DD (OP_5050 - OP_1000) + (8 * 1000000h) +DD (OP_5058 - OP_1000) + (8 * 1000000h) +DD (OP_5060 - OP_1000) + (8 * 1000000h) +DD (OP_5068 - OP_1000) + (8 * 1000000h) +DD (OP_5070 - OP_1000) + (8 * 1000000h) +DD (OP_5078 - OP_1000) + (1 * 1000000h) +DD (OP_5079 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5080 - OP_1000) + (8 * 1000000h) +DD (OP_5088 - OP_1000) + (8 * 1000000h) +DD (OP_5090 - OP_1000) + (8 * 1000000h) +DD (OP_5098 - OP_1000) + (8 * 1000000h) +DD (OP_50a0 - OP_1000) + (8 * 1000000h) +DD (OP_50a8 - OP_1000) + (8 * 1000000h) +DD (OP_50b0 - OP_1000) + (8 * 1000000h) +DD (OP_50b8 - OP_1000) + (1 * 1000000h) +DD (OP_50b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5ac0 - OP_1000) + (8 * 1000000h) +DD (OP_5ac8 - OP_1000) + (8 * 1000000h) +DD (OP_5ad0 - OP_1000) + (8 * 1000000h) +DD (OP_5ad8 - OP_1000) + (7 * 1000000h) +DD (OP_5adf - OP_1000) + (1 * 1000000h) +DD (OP_5ae0 - OP_1000) + (7 * 1000000h) +DD (OP_5ae7 - OP_1000) + (1 * 1000000h) +DD (OP_5ae8 - OP_1000) + (8 * 1000000h) +DD (OP_5af0 - OP_1000) + (8 * 1000000h) +DD (OP_5af8 - OP_1000) + (1 * 1000000h) +DD (OP_5af9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5100 - OP_1000) + (8 * 1000000h) +DD (OP_5188 - OP_1000) + (8 * 1000000h) +DD (OP_5110 - OP_1000) + (8 * 1000000h) +DD (OP_5118 - OP_1000) + (7 * 1000000h) +DD (OP_511f - OP_1000) + (1 * 1000000h) +DD (OP_5120 - OP_1000) + (7 * 1000000h) +DD (OP_5127 - OP_1000) + (1 * 1000000h) +DD (OP_5128 - OP_1000) + (8 * 1000000h) +DD (OP_5130 - OP_1000) + (8 * 1000000h) +DD (OP_5138 - OP_1000) + (1 * 1000000h) +DD (OP_5139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5140 - OP_1000) + (8 * 1000000h) +DD (OP_5188 - OP_1000) + (8 * 1000000h) +DD (OP_5150 - OP_1000) + (8 * 1000000h) +DD (OP_5158 - OP_1000) + (8 * 1000000h) +DD (OP_5160 - OP_1000) + (8 * 1000000h) +DD (OP_5168 - OP_1000) + (8 * 1000000h) +DD (OP_5170 - OP_1000) + (8 * 1000000h) +DD (OP_5178 - OP_1000) + (1 * 1000000h) +DD (OP_5179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5180 - OP_1000) + (8 * 1000000h) +DD (OP_5188 - OP_1000) + (8 * 1000000h) +DD (OP_5190 - OP_1000) + (8 * 1000000h) +DD (OP_5198 - OP_1000) + (8 * 1000000h) +DD (OP_51a0 - OP_1000) + (8 * 1000000h) +DD (OP_51a8 - OP_1000) + (8 * 1000000h) +DD (OP_51b0 - OP_1000) + (8 * 1000000h) +DD (OP_51b8 - OP_1000) + (1 * 1000000h) +DD (OP_51b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5bc0 - OP_1000) + (8 * 1000000h) +DD (OP_5bc8 - OP_1000) + (8 * 1000000h) +DD (OP_5bd0 - OP_1000) + (8 * 1000000h) +DD (OP_5bd8 - OP_1000) + (7 * 1000000h) +DD (OP_5bdf - OP_1000) + (1 * 1000000h) +DD (OP_5be0 - OP_1000) + (7 * 1000000h) +DD (OP_5be7 - OP_1000) + (1 * 1000000h) +DD (OP_5be8 - OP_1000) + (8 * 1000000h) +DD (OP_5bf0 - OP_1000) + (8 * 1000000h) +DD (OP_5bf8 - OP_1000) + (1 * 1000000h) +DD (OP_5bf9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5000 - OP_1000) + (8 * 1000000h) +DD (OP_5088 - OP_1000) + (8 * 1000000h) +DD (OP_5010 - OP_1000) + (8 * 1000000h) +DD (OP_5018 - OP_1000) + (7 * 1000000h) +DD (OP_501f - OP_1000) + (1 * 1000000h) +DD (OP_5020 - OP_1000) + (7 * 1000000h) +DD (OP_5027 - OP_1000) + (1 * 1000000h) +DD (OP_5028 - OP_1000) + (8 * 1000000h) +DD (OP_5030 - OP_1000) + (8 * 1000000h) +DD (OP_5038 - OP_1000) + (1 * 1000000h) +DD (OP_5039 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5040 - OP_1000) + (8 * 1000000h) +DD (OP_5088 - OP_1000) + (8 * 1000000h) +DD (OP_5050 - OP_1000) + (8 * 1000000h) +DD (OP_5058 - OP_1000) + (8 * 1000000h) +DD (OP_5060 - OP_1000) + (8 * 1000000h) +DD (OP_5068 - OP_1000) + (8 * 1000000h) +DD (OP_5070 - OP_1000) + (8 * 1000000h) +DD (OP_5078 - OP_1000) + (1 * 1000000h) +DD (OP_5079 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5080 - OP_1000) + (8 * 1000000h) +DD (OP_5088 - OP_1000) + (8 * 1000000h) +DD (OP_5090 - OP_1000) + (8 * 1000000h) +DD (OP_5098 - OP_1000) + (8 * 1000000h) +DD (OP_50a0 - OP_1000) + (8 * 1000000h) +DD (OP_50a8 - OP_1000) + (8 * 1000000h) +DD (OP_50b0 - OP_1000) + (8 * 1000000h) +DD (OP_50b8 - OP_1000) + (1 * 1000000h) +DD (OP_50b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5cc0 - OP_1000) + (8 * 1000000h) +DD (OP_5cc8 - OP_1000) + (8 * 1000000h) +DD (OP_5cd0 - OP_1000) + (8 * 1000000h) +DD (OP_5cd8 - OP_1000) + (7 * 1000000h) +DD (OP_5cdf - OP_1000) + (1 * 1000000h) +DD (OP_5ce0 - OP_1000) + (7 * 1000000h) +DD (OP_5ce7 - OP_1000) + (1 * 1000000h) +DD (OP_5ce8 - OP_1000) + (8 * 1000000h) +DD (OP_5cf0 - OP_1000) + (8 * 1000000h) +DD (OP_5cf8 - OP_1000) + (1 * 1000000h) +DD (OP_5cf9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5100 - OP_1000) + (8 * 1000000h) +DD (OP_5188 - OP_1000) + (8 * 1000000h) +DD (OP_5110 - OP_1000) + (8 * 1000000h) +DD (OP_5118 - OP_1000) + (7 * 1000000h) +DD (OP_511f - OP_1000) + (1 * 1000000h) +DD (OP_5120 - OP_1000) + (7 * 1000000h) +DD (OP_5127 - OP_1000) + (1 * 1000000h) +DD (OP_5128 - OP_1000) + (8 * 1000000h) +DD (OP_5130 - OP_1000) + (8 * 1000000h) +DD (OP_5138 - OP_1000) + (1 * 1000000h) +DD (OP_5139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5140 - OP_1000) + (8 * 1000000h) +DD (OP_5188 - OP_1000) + (8 * 1000000h) +DD (OP_5150 - OP_1000) + (8 * 1000000h) +DD (OP_5158 - OP_1000) + (8 * 1000000h) +DD (OP_5160 - OP_1000) + (8 * 1000000h) +DD (OP_5168 - OP_1000) + (8 * 1000000h) +DD (OP_5170 - OP_1000) + (8 * 1000000h) +DD (OP_5178 - OP_1000) + (1 * 1000000h) +DD (OP_5179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5180 - OP_1000) + (8 * 1000000h) +DD (OP_5188 - OP_1000) + (8 * 1000000h) +DD (OP_5190 - OP_1000) + (8 * 1000000h) +DD (OP_5198 - OP_1000) + (8 * 1000000h) +DD (OP_51a0 - OP_1000) + (8 * 1000000h) +DD (OP_51a8 - OP_1000) + (8 * 1000000h) +DD (OP_51b0 - OP_1000) + (8 * 1000000h) +DD (OP_51b8 - OP_1000) + (1 * 1000000h) +DD (OP_51b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5dc0 - OP_1000) + (8 * 1000000h) +DD (OP_5dc8 - OP_1000) + (8 * 1000000h) +DD (OP_5dd0 - OP_1000) + (8 * 1000000h) +DD (OP_5dd8 - OP_1000) + (7 * 1000000h) +DD (OP_5ddf - OP_1000) + (1 * 1000000h) +DD (OP_5de0 - OP_1000) + (7 * 1000000h) +DD (OP_5de7 - OP_1000) + (1 * 1000000h) +DD (OP_5de8 - OP_1000) + (8 * 1000000h) +DD (OP_5df0 - OP_1000) + (8 * 1000000h) +DD (OP_5df8 - OP_1000) + (1 * 1000000h) +DD (OP_5df9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5000 - OP_1000) + (8 * 1000000h) +DD (OP_5088 - OP_1000) + (8 * 1000000h) +DD (OP_5010 - OP_1000) + (8 * 1000000h) +DD (OP_5018 - OP_1000) + (7 * 1000000h) +DD (OP_501f - OP_1000) + (1 * 1000000h) +DD (OP_5020 - OP_1000) + (7 * 1000000h) +DD (OP_5027 - OP_1000) + (1 * 1000000h) +DD (OP_5028 - OP_1000) + (8 * 1000000h) +DD (OP_5030 - OP_1000) + (8 * 1000000h) +DD (OP_5038 - OP_1000) + (1 * 1000000h) +DD (OP_5039 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5040 - OP_1000) + (8 * 1000000h) +DD (OP_5088 - OP_1000) + (8 * 1000000h) +DD (OP_5050 - OP_1000) + (8 * 1000000h) +DD (OP_5058 - OP_1000) + (8 * 1000000h) +DD (OP_5060 - OP_1000) + (8 * 1000000h) +DD (OP_5068 - OP_1000) + (8 * 1000000h) +DD (OP_5070 - OP_1000) + (8 * 1000000h) +DD (OP_5078 - OP_1000) + (1 * 1000000h) +DD (OP_5079 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5080 - OP_1000) + (8 * 1000000h) +DD (OP_5088 - OP_1000) + (8 * 1000000h) +DD (OP_5090 - OP_1000) + (8 * 1000000h) +DD (OP_5098 - OP_1000) + (8 * 1000000h) +DD (OP_50a0 - OP_1000) + (8 * 1000000h) +DD (OP_50a8 - OP_1000) + (8 * 1000000h) +DD (OP_50b0 - OP_1000) + (8 * 1000000h) +DD (OP_50b8 - OP_1000) + (1 * 1000000h) +DD (OP_50b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5ec0 - OP_1000) + (8 * 1000000h) +DD (OP_5ec8 - OP_1000) + (8 * 1000000h) +DD (OP_5ed0 - OP_1000) + (8 * 1000000h) +DD (OP_5ed8 - OP_1000) + (7 * 1000000h) +DD (OP_5edf - OP_1000) + (1 * 1000000h) +DD (OP_5ee0 - OP_1000) + (7 * 1000000h) +DD (OP_5ee7 - OP_1000) + (1 * 1000000h) +DD (OP_5ee8 - OP_1000) + (8 * 1000000h) +DD (OP_5ef0 - OP_1000) + (8 * 1000000h) +DD (OP_5ef8 - OP_1000) + (1 * 1000000h) +DD (OP_5ef9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5100 - OP_1000) + (8 * 1000000h) +DD (OP_5188 - OP_1000) + (8 * 1000000h) +DD (OP_5110 - OP_1000) + (8 * 1000000h) +DD (OP_5118 - OP_1000) + (7 * 1000000h) +DD (OP_511f - OP_1000) + (1 * 1000000h) +DD (OP_5120 - OP_1000) + (7 * 1000000h) +DD (OP_5127 - OP_1000) + (1 * 1000000h) +DD (OP_5128 - OP_1000) + (8 * 1000000h) +DD (OP_5130 - OP_1000) + (8 * 1000000h) +DD (OP_5138 - OP_1000) + (1 * 1000000h) +DD (OP_5139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5140 - OP_1000) + (8 * 1000000h) +DD (OP_5188 - OP_1000) + (8 * 1000000h) +DD (OP_5150 - OP_1000) + (8 * 1000000h) +DD (OP_5158 - OP_1000) + (8 * 1000000h) +DD (OP_5160 - OP_1000) + (8 * 1000000h) +DD (OP_5168 - OP_1000) + (8 * 1000000h) +DD (OP_5170 - OP_1000) + (8 * 1000000h) +DD (OP_5178 - OP_1000) + (1 * 1000000h) +DD (OP_5179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5180 - OP_1000) + (8 * 1000000h) +DD (OP_5188 - OP_1000) + (8 * 1000000h) +DD (OP_5190 - OP_1000) + (8 * 1000000h) +DD (OP_5198 - OP_1000) + (8 * 1000000h) +DD (OP_51a0 - OP_1000) + (8 * 1000000h) +DD (OP_51a8 - OP_1000) + (8 * 1000000h) +DD (OP_51b0 - OP_1000) + (8 * 1000000h) +DD (OP_51b8 - OP_1000) + (1 * 1000000h) +DD (OP_51b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_5fc0 - OP_1000) + (8 * 1000000h) +DD (OP_5fc8 - OP_1000) + (8 * 1000000h) +DD (OP_5fd0 - OP_1000) + (8 * 1000000h) +DD (OP_5fd8 - OP_1000) + (7 * 1000000h) +DD (OP_5fdf - OP_1000) + (1 * 1000000h) +DD (OP_5fe0 - OP_1000) + (7 * 1000000h) +DD (OP_5fe7 - OP_1000) + (1 * 1000000h) +DD (OP_5fe8 - OP_1000) + (8 * 1000000h) +DD (OP_5ff0 - OP_1000) + (8 * 1000000h) +DD (OP_5ff8 - OP_1000) + (1 * 1000000h) +DD (OP_5ff9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_6000 - OP_1000) + (1 * 1000000h) +DD (OP_6001 - OP_1000) + (254 * 1000000h) +DD (OP_60ff - OP_1000) + (1 * 1000000h) +DD (OP_6100 - OP_1000) + (1 * 1000000h) +DD (OP_6101 - OP_1000) + (254 * 1000000h) +DD (OP_61ff - OP_1000) + (1 * 1000000h) +DD (OP_6200 - OP_1000) + (1 * 1000000h) +DD (OP_6201 - OP_1000) + (254 * 1000000h) +DD (OP_62ff - OP_1000) + (1 * 1000000h) +DD (OP_6300 - OP_1000) + (1 * 1000000h) +DD (OP_6301 - OP_1000) + (254 * 1000000h) +DD (OP_63ff - OP_1000) + (1 * 1000000h) +DD (OP_6400 - OP_1000) + (1 * 1000000h) +DD (OP_6401 - OP_1000) + (254 * 1000000h) +DD (OP_64ff - OP_1000) + (1 * 1000000h) +DD (OP_6500 - OP_1000) + (1 * 1000000h) +DD (OP_6501 - OP_1000) + (254 * 1000000h) +DD (OP_65ff - OP_1000) + (1 * 1000000h) +DD (OP_6600 - OP_1000) + (1 * 1000000h) +DD (OP_6601 - OP_1000) + (254 * 1000000h) +DD (OP_66ff - OP_1000) + (1 * 1000000h) +DD (OP_6700 - OP_1000) + (1 * 1000000h) +DD (OP_6701 - OP_1000) + (254 * 1000000h) +DD (OP_67ff - OP_1000) + (1 * 1000000h) +DD (OP_6800 - OP_1000) + (1 * 1000000h) +DD (OP_6801 - OP_1000) + (254 * 1000000h) +DD (OP_68ff - OP_1000) + (1 * 1000000h) +DD (OP_6900 - OP_1000) + (1 * 1000000h) +DD (OP_6901 - OP_1000) + (254 * 1000000h) +DD (OP_69ff - OP_1000) + (1 * 1000000h) +DD (OP_6a00 - OP_1000) + (1 * 1000000h) +DD (OP_6a01 - OP_1000) + (254 * 1000000h) +DD (OP_6aff - OP_1000) + (1 * 1000000h) +DD (OP_6b00 - OP_1000) + (1 * 1000000h) +DD (OP_6b01 - OP_1000) + (254 * 1000000h) +DD (OP_6bff - OP_1000) + (1 * 1000000h) +DD (OP_6c00 - OP_1000) + (1 * 1000000h) +DD (OP_6c01 - OP_1000) + (254 * 1000000h) +DD (OP_6cff - OP_1000) + (1 * 1000000h) +DD (OP_6d00 - OP_1000) + (1 * 1000000h) +DD (OP_6d01 - OP_1000) + (254 * 1000000h) +DD (OP_6dff - OP_1000) + (1 * 1000000h) +DD (OP_6e00 - OP_1000) + (1 * 1000000h) +DD (OP_6e01 - OP_1000) + (254 * 1000000h) +DD (OP_6eff - OP_1000) + (1 * 1000000h) +DD (OP_6f00 - OP_1000) + (1 * 1000000h) +DD (OP_6f01 - OP_1000) + (254 * 1000000h) +DD (OP_6fff - OP_1000) + (1 * 1000000h) +DD OP_7000 - OP_1000 +DW 4096 +DD (OP_8000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_8010 - OP_1000) + (8 * 1000000h) +DD (OP_8018 - OP_1000) + (7 * 1000000h) +DD (OP_801f - OP_1000) + (1 * 1000000h) +DD (OP_8020 - OP_1000) + (7 * 1000000h) +DD (OP_8027 - OP_1000) + (1 * 1000000h) +DD (OP_8028 - OP_1000) + (8 * 1000000h) +DD (OP_8030 - OP_1000) + (8 * 1000000h) +DD (OP_8038 - OP_1000) + (1 * 1000000h) +DD (OP_8039 - OP_1000) + (1 * 1000000h) +DD (OP_803a - OP_1000) + (1 * 1000000h) +DD (OP_803b - OP_1000) + (1 * 1000000h) +DD (OP_803c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_8040 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_8050 - OP_1000) + (8 * 1000000h) +DD (OP_8058 - OP_1000) + (8 * 1000000h) +DD (OP_8060 - OP_1000) + (8 * 1000000h) +DD (OP_8068 - OP_1000) + (8 * 1000000h) +DD (OP_8070 - OP_1000) + (8 * 1000000h) +DD (OP_8078 - OP_1000) + (1 * 1000000h) +DD (OP_8079 - OP_1000) + (1 * 1000000h) +DD (OP_807a - OP_1000) + (1 * 1000000h) +DD (OP_807b - OP_1000) + (1 * 1000000h) +DD (OP_807c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_8080 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_8090 - OP_1000) + (8 * 1000000h) +DD (OP_8098 - OP_1000) + (8 * 1000000h) +DD (OP_80a0 - OP_1000) + (8 * 1000000h) +DD (OP_80a8 - OP_1000) + (8 * 1000000h) +DD (OP_80b0 - OP_1000) + (8 * 1000000h) +DD (OP_80b8 - OP_1000) + (1 * 1000000h) +DD (OP_80b9 - OP_1000) + (1 * 1000000h) +DD (OP_80ba - OP_1000) + (1 * 1000000h) +DD (OP_80bb - OP_1000) + (1 * 1000000h) +DD (OP_80bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_80c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_80d0 - OP_1000) + (8 * 1000000h) +DD (OP_80d8 - OP_1000) + (8 * 1000000h) +DD (OP_80e0 - OP_1000) + (8 * 1000000h) +DD (OP_80e8 - OP_1000) + (8 * 1000000h) +DD (OP_80f0 - OP_1000) + (8 * 1000000h) +DD (OP_80f8 - OP_1000) + (1 * 1000000h) +DD (OP_80f9 - OP_1000) + (1 * 1000000h) +DD (OP_80fa - OP_1000) + (1 * 1000000h) +DD (OP_80fb - OP_1000) + (1 * 1000000h) +DD (OP_80fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_8100 - OP_1000) + (8 * 1000000h) +DD (OP_8108 - OP_1000) + (8 * 1000000h) +DD (OP_8110 - OP_1000) + (8 * 1000000h) +DD (OP_8118 - OP_1000) + (7 * 1000000h) +DD (OP_811f - OP_1000) + (1 * 1000000h) +DD (OP_8120 - OP_1000) + (7 * 1000000h) +DD (OP_8127 - OP_1000) + (1 * 1000000h) +DD (OP_8128 - OP_1000) + (8 * 1000000h) +DD (OP_8130 - OP_1000) + (8 * 1000000h) +DD (OP_8138 - OP_1000) + (1 * 1000000h) +DD (OP_8139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (22 * 1000000h) +DD (OP_8150 - OP_1000) + (8 * 1000000h) +DD (OP_8158 - OP_1000) + (8 * 1000000h) +DD (OP_8160 - OP_1000) + (8 * 1000000h) +DD (OP_8168 - OP_1000) + (8 * 1000000h) +DD (OP_8170 - OP_1000) + (8 * 1000000h) +DD (OP_8178 - OP_1000) + (1 * 1000000h) +DD (OP_8179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (22 * 1000000h) +DD (OP_8190 - OP_1000) + (8 * 1000000h) +DD (OP_8198 - OP_1000) + (8 * 1000000h) +DD (OP_81a0 - OP_1000) + (8 * 1000000h) +DD (OP_81a8 - OP_1000) + (8 * 1000000h) +DD (OP_81b0 - OP_1000) + (8 * 1000000h) +DD (OP_81b8 - OP_1000) + (1 * 1000000h) +DD (OP_81b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_81c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_81d0 - OP_1000) + (8 * 1000000h) +DD (OP_81d8 - OP_1000) + (8 * 1000000h) +DD (OP_81e0 - OP_1000) + (8 * 1000000h) +DD (OP_81e8 - OP_1000) + (8 * 1000000h) +DD (OP_81f0 - OP_1000) + (8 * 1000000h) +DD (OP_81f8 - OP_1000) + (1 * 1000000h) +DD (OP_81f9 - OP_1000) + (1 * 1000000h) +DD (OP_81fa - OP_1000) + (1 * 1000000h) +DD (OP_81fb - OP_1000) + (1 * 1000000h) +DD (OP_81fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_8000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_8010 - OP_1000) + (8 * 1000000h) +DD (OP_8018 - OP_1000) + (7 * 1000000h) +DD (OP_801f - OP_1000) + (1 * 1000000h) +DD (OP_8020 - OP_1000) + (7 * 1000000h) +DD (OP_8027 - OP_1000) + (1 * 1000000h) +DD (OP_8028 - OP_1000) + (8 * 1000000h) +DD (OP_8030 - OP_1000) + (8 * 1000000h) +DD (OP_8038 - OP_1000) + (1 * 1000000h) +DD (OP_8039 - OP_1000) + (1 * 1000000h) +DD (OP_803a - OP_1000) + (1 * 1000000h) +DD (OP_803b - OP_1000) + (1 * 1000000h) +DD (OP_803c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_8040 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_8050 - OP_1000) + (8 * 1000000h) +DD (OP_8058 - OP_1000) + (8 * 1000000h) +DD (OP_8060 - OP_1000) + (8 * 1000000h) +DD (OP_8068 - OP_1000) + (8 * 1000000h) +DD (OP_8070 - OP_1000) + (8 * 1000000h) +DD (OP_8078 - OP_1000) + (1 * 1000000h) +DD (OP_8079 - OP_1000) + (1 * 1000000h) +DD (OP_807a - OP_1000) + (1 * 1000000h) +DD (OP_807b - OP_1000) + (1 * 1000000h) +DD (OP_807c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_8080 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_8090 - OP_1000) + (8 * 1000000h) +DD (OP_8098 - OP_1000) + (8 * 1000000h) +DD (OP_80a0 - OP_1000) + (8 * 1000000h) +DD (OP_80a8 - OP_1000) + (8 * 1000000h) +DD (OP_80b0 - OP_1000) + (8 * 1000000h) +DD (OP_80b8 - OP_1000) + (1 * 1000000h) +DD (OP_80b9 - OP_1000) + (1 * 1000000h) +DD (OP_80ba - OP_1000) + (1 * 1000000h) +DD (OP_80bb - OP_1000) + (1 * 1000000h) +DD (OP_80bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_80c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_80d0 - OP_1000) + (8 * 1000000h) +DD (OP_80d8 - OP_1000) + (8 * 1000000h) +DD (OP_80e0 - OP_1000) + (8 * 1000000h) +DD (OP_80e8 - OP_1000) + (8 * 1000000h) +DD (OP_80f0 - OP_1000) + (8 * 1000000h) +DD (OP_80f8 - OP_1000) + (1 * 1000000h) +DD (OP_80f9 - OP_1000) + (1 * 1000000h) +DD (OP_80fa - OP_1000) + (1 * 1000000h) +DD (OP_80fb - OP_1000) + (1 * 1000000h) +DD (OP_80fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_8100 - OP_1000) + (8 * 1000000h) +DD (OP_8108 - OP_1000) + (8 * 1000000h) +DD (OP_8110 - OP_1000) + (8 * 1000000h) +DD (OP_8118 - OP_1000) + (7 * 1000000h) +DD (OP_811f - OP_1000) + (1 * 1000000h) +DD (OP_8120 - OP_1000) + (7 * 1000000h) +DD (OP_8127 - OP_1000) + (1 * 1000000h) +DD (OP_8128 - OP_1000) + (8 * 1000000h) +DD (OP_8130 - OP_1000) + (8 * 1000000h) +DD (OP_8138 - OP_1000) + (1 * 1000000h) +DD (OP_8139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (22 * 1000000h) +DD (OP_8150 - OP_1000) + (8 * 1000000h) +DD (OP_8158 - OP_1000) + (8 * 1000000h) +DD (OP_8160 - OP_1000) + (8 * 1000000h) +DD (OP_8168 - OP_1000) + (8 * 1000000h) +DD (OP_8170 - OP_1000) + (8 * 1000000h) +DD (OP_8178 - OP_1000) + (1 * 1000000h) +DD (OP_8179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (22 * 1000000h) +DD (OP_8190 - OP_1000) + (8 * 1000000h) +DD (OP_8198 - OP_1000) + (8 * 1000000h) +DD (OP_81a0 - OP_1000) + (8 * 1000000h) +DD (OP_81a8 - OP_1000) + (8 * 1000000h) +DD (OP_81b0 - OP_1000) + (8 * 1000000h) +DD (OP_81b8 - OP_1000) + (1 * 1000000h) +DD (OP_81b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_81c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_81d0 - OP_1000) + (8 * 1000000h) +DD (OP_81d8 - OP_1000) + (8 * 1000000h) +DD (OP_81e0 - OP_1000) + (8 * 1000000h) +DD (OP_81e8 - OP_1000) + (8 * 1000000h) +DD (OP_81f0 - OP_1000) + (8 * 1000000h) +DD (OP_81f8 - OP_1000) + (1 * 1000000h) +DD (OP_81f9 - OP_1000) + (1 * 1000000h) +DD (OP_81fa - OP_1000) + (1 * 1000000h) +DD (OP_81fb - OP_1000) + (1 * 1000000h) +DD (OP_81fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_8000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_8010 - OP_1000) + (8 * 1000000h) +DD (OP_8018 - OP_1000) + (7 * 1000000h) +DD (OP_801f - OP_1000) + (1 * 1000000h) +DD (OP_8020 - OP_1000) + (7 * 1000000h) +DD (OP_8027 - OP_1000) + (1 * 1000000h) +DD (OP_8028 - OP_1000) + (8 * 1000000h) +DD (OP_8030 - OP_1000) + (8 * 1000000h) +DD (OP_8038 - OP_1000) + (1 * 1000000h) +DD (OP_8039 - OP_1000) + (1 * 1000000h) +DD (OP_803a - OP_1000) + (1 * 1000000h) +DD (OP_803b - OP_1000) + (1 * 1000000h) +DD (OP_803c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_8040 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_8050 - OP_1000) + (8 * 1000000h) +DD (OP_8058 - OP_1000) + (8 * 1000000h) +DD (OP_8060 - OP_1000) + (8 * 1000000h) +DD (OP_8068 - OP_1000) + (8 * 1000000h) +DD (OP_8070 - OP_1000) + (8 * 1000000h) +DD (OP_8078 - OP_1000) + (1 * 1000000h) +DD (OP_8079 - OP_1000) + (1 * 1000000h) +DD (OP_807a - OP_1000) + (1 * 1000000h) +DD (OP_807b - OP_1000) + (1 * 1000000h) +DD (OP_807c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_8080 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_8090 - OP_1000) + (8 * 1000000h) +DD (OP_8098 - OP_1000) + (8 * 1000000h) +DD (OP_80a0 - OP_1000) + (8 * 1000000h) +DD (OP_80a8 - OP_1000) + (8 * 1000000h) +DD (OP_80b0 - OP_1000) + (8 * 1000000h) +DD (OP_80b8 - OP_1000) + (1 * 1000000h) +DD (OP_80b9 - OP_1000) + (1 * 1000000h) +DD (OP_80ba - OP_1000) + (1 * 1000000h) +DD (OP_80bb - OP_1000) + (1 * 1000000h) +DD (OP_80bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_80c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_80d0 - OP_1000) + (8 * 1000000h) +DD (OP_80d8 - OP_1000) + (8 * 1000000h) +DD (OP_80e0 - OP_1000) + (8 * 1000000h) +DD (OP_80e8 - OP_1000) + (8 * 1000000h) +DD (OP_80f0 - OP_1000) + (8 * 1000000h) +DD (OP_80f8 - OP_1000) + (1 * 1000000h) +DD (OP_80f9 - OP_1000) + (1 * 1000000h) +DD (OP_80fa - OP_1000) + (1 * 1000000h) +DD (OP_80fb - OP_1000) + (1 * 1000000h) +DD (OP_80fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_8100 - OP_1000) + (8 * 1000000h) +DD (OP_8108 - OP_1000) + (8 * 1000000h) +DD (OP_8110 - OP_1000) + (8 * 1000000h) +DD (OP_8118 - OP_1000) + (7 * 1000000h) +DD (OP_811f - OP_1000) + (1 * 1000000h) +DD (OP_8120 - OP_1000) + (7 * 1000000h) +DD (OP_8127 - OP_1000) + (1 * 1000000h) +DD (OP_8128 - OP_1000) + (8 * 1000000h) +DD (OP_8130 - OP_1000) + (8 * 1000000h) +DD (OP_8138 - OP_1000) + (1 * 1000000h) +DD (OP_8139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (22 * 1000000h) +DD (OP_8150 - OP_1000) + (8 * 1000000h) +DD (OP_8158 - OP_1000) + (8 * 1000000h) +DD (OP_8160 - OP_1000) + (8 * 1000000h) +DD (OP_8168 - OP_1000) + (8 * 1000000h) +DD (OP_8170 - OP_1000) + (8 * 1000000h) +DD (OP_8178 - OP_1000) + (1 * 1000000h) +DD (OP_8179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (22 * 1000000h) +DD (OP_8190 - OP_1000) + (8 * 1000000h) +DD (OP_8198 - OP_1000) + (8 * 1000000h) +DD (OP_81a0 - OP_1000) + (8 * 1000000h) +DD (OP_81a8 - OP_1000) + (8 * 1000000h) +DD (OP_81b0 - OP_1000) + (8 * 1000000h) +DD (OP_81b8 - OP_1000) + (1 * 1000000h) +DD (OP_81b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_81c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_81d0 - OP_1000) + (8 * 1000000h) +DD (OP_81d8 - OP_1000) + (8 * 1000000h) +DD (OP_81e0 - OP_1000) + (8 * 1000000h) +DD (OP_81e8 - OP_1000) + (8 * 1000000h) +DD (OP_81f0 - OP_1000) + (8 * 1000000h) +DD (OP_81f8 - OP_1000) + (1 * 1000000h) +DD (OP_81f9 - OP_1000) + (1 * 1000000h) +DD (OP_81fa - OP_1000) + (1 * 1000000h) +DD (OP_81fb - OP_1000) + (1 * 1000000h) +DD (OP_81fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_8000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_8010 - OP_1000) + (8 * 1000000h) +DD (OP_8018 - OP_1000) + (7 * 1000000h) +DD (OP_801f - OP_1000) + (1 * 1000000h) +DD (OP_8020 - OP_1000) + (7 * 1000000h) +DD (OP_8027 - OP_1000) + (1 * 1000000h) +DD (OP_8028 - OP_1000) + (8 * 1000000h) +DD (OP_8030 - OP_1000) + (8 * 1000000h) +DD (OP_8038 - OP_1000) + (1 * 1000000h) +DD (OP_8039 - OP_1000) + (1 * 1000000h) +DD (OP_803a - OP_1000) + (1 * 1000000h) +DD (OP_803b - OP_1000) + (1 * 1000000h) +DD (OP_803c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_8040 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_8050 - OP_1000) + (8 * 1000000h) +DD (OP_8058 - OP_1000) + (8 * 1000000h) +DD (OP_8060 - OP_1000) + (8 * 1000000h) +DD (OP_8068 - OP_1000) + (8 * 1000000h) +DD (OP_8070 - OP_1000) + (8 * 1000000h) +DD (OP_8078 - OP_1000) + (1 * 1000000h) +DD (OP_8079 - OP_1000) + (1 * 1000000h) +DD (OP_807a - OP_1000) + (1 * 1000000h) +DD (OP_807b - OP_1000) + (1 * 1000000h) +DD (OP_807c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_8080 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_8090 - OP_1000) + (8 * 1000000h) +DD (OP_8098 - OP_1000) + (8 * 1000000h) +DD (OP_80a0 - OP_1000) + (8 * 1000000h) +DD (OP_80a8 - OP_1000) + (8 * 1000000h) +DD (OP_80b0 - OP_1000) + (8 * 1000000h) +DD (OP_80b8 - OP_1000) + (1 * 1000000h) +DD (OP_80b9 - OP_1000) + (1 * 1000000h) +DD (OP_80ba - OP_1000) + (1 * 1000000h) +DD (OP_80bb - OP_1000) + (1 * 1000000h) +DD (OP_80bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_80c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_80d0 - OP_1000) + (8 * 1000000h) +DD (OP_80d8 - OP_1000) + (8 * 1000000h) +DD (OP_80e0 - OP_1000) + (8 * 1000000h) +DD (OP_80e8 - OP_1000) + (8 * 1000000h) +DD (OP_80f0 - OP_1000) + (8 * 1000000h) +DD (OP_80f8 - OP_1000) + (1 * 1000000h) +DD (OP_80f9 - OP_1000) + (1 * 1000000h) +DD (OP_80fa - OP_1000) + (1 * 1000000h) +DD (OP_80fb - OP_1000) + (1 * 1000000h) +DD (OP_80fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_8100 - OP_1000) + (8 * 1000000h) +DD (OP_8108 - OP_1000) + (8 * 1000000h) +DD (OP_8110 - OP_1000) + (8 * 1000000h) +DD (OP_8118 - OP_1000) + (7 * 1000000h) +DD (OP_811f - OP_1000) + (1 * 1000000h) +DD (OP_8120 - OP_1000) + (7 * 1000000h) +DD (OP_8127 - OP_1000) + (1 * 1000000h) +DD (OP_8128 - OP_1000) + (8 * 1000000h) +DD (OP_8130 - OP_1000) + (8 * 1000000h) +DD (OP_8138 - OP_1000) + (1 * 1000000h) +DD (OP_8139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (22 * 1000000h) +DD (OP_8150 - OP_1000) + (8 * 1000000h) +DD (OP_8158 - OP_1000) + (8 * 1000000h) +DD (OP_8160 - OP_1000) + (8 * 1000000h) +DD (OP_8168 - OP_1000) + (8 * 1000000h) +DD (OP_8170 - OP_1000) + (8 * 1000000h) +DD (OP_8178 - OP_1000) + (1 * 1000000h) +DD (OP_8179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (22 * 1000000h) +DD (OP_8190 - OP_1000) + (8 * 1000000h) +DD (OP_8198 - OP_1000) + (8 * 1000000h) +DD (OP_81a0 - OP_1000) + (8 * 1000000h) +DD (OP_81a8 - OP_1000) + (8 * 1000000h) +DD (OP_81b0 - OP_1000) + (8 * 1000000h) +DD (OP_81b8 - OP_1000) + (1 * 1000000h) +DD (OP_81b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_81c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_81d0 - OP_1000) + (8 * 1000000h) +DD (OP_81d8 - OP_1000) + (8 * 1000000h) +DD (OP_81e0 - OP_1000) + (8 * 1000000h) +DD (OP_81e8 - OP_1000) + (8 * 1000000h) +DD (OP_81f0 - OP_1000) + (8 * 1000000h) +DD (OP_81f8 - OP_1000) + (1 * 1000000h) +DD (OP_81f9 - OP_1000) + (1 * 1000000h) +DD (OP_81fa - OP_1000) + (1 * 1000000h) +DD (OP_81fb - OP_1000) + (1 * 1000000h) +DD (OP_81fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_8000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_8010 - OP_1000) + (8 * 1000000h) +DD (OP_8018 - OP_1000) + (7 * 1000000h) +DD (OP_801f - OP_1000) + (1 * 1000000h) +DD (OP_8020 - OP_1000) + (7 * 1000000h) +DD (OP_8027 - OP_1000) + (1 * 1000000h) +DD (OP_8028 - OP_1000) + (8 * 1000000h) +DD (OP_8030 - OP_1000) + (8 * 1000000h) +DD (OP_8038 - OP_1000) + (1 * 1000000h) +DD (OP_8039 - OP_1000) + (1 * 1000000h) +DD (OP_803a - OP_1000) + (1 * 1000000h) +DD (OP_803b - OP_1000) + (1 * 1000000h) +DD (OP_803c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_8040 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_8050 - OP_1000) + (8 * 1000000h) +DD (OP_8058 - OP_1000) + (8 * 1000000h) +DD (OP_8060 - OP_1000) + (8 * 1000000h) +DD (OP_8068 - OP_1000) + (8 * 1000000h) +DD (OP_8070 - OP_1000) + (8 * 1000000h) +DD (OP_8078 - OP_1000) + (1 * 1000000h) +DD (OP_8079 - OP_1000) + (1 * 1000000h) +DD (OP_807a - OP_1000) + (1 * 1000000h) +DD (OP_807b - OP_1000) + (1 * 1000000h) +DD (OP_807c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_8080 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_8090 - OP_1000) + (8 * 1000000h) +DD (OP_8098 - OP_1000) + (8 * 1000000h) +DD (OP_80a0 - OP_1000) + (8 * 1000000h) +DD (OP_80a8 - OP_1000) + (8 * 1000000h) +DD (OP_80b0 - OP_1000) + (8 * 1000000h) +DD (OP_80b8 - OP_1000) + (1 * 1000000h) +DD (OP_80b9 - OP_1000) + (1 * 1000000h) +DD (OP_80ba - OP_1000) + (1 * 1000000h) +DD (OP_80bb - OP_1000) + (1 * 1000000h) +DD (OP_80bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_80c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_80d0 - OP_1000) + (8 * 1000000h) +DD (OP_80d8 - OP_1000) + (8 * 1000000h) +DD (OP_80e0 - OP_1000) + (8 * 1000000h) +DD (OP_80e8 - OP_1000) + (8 * 1000000h) +DD (OP_80f0 - OP_1000) + (8 * 1000000h) +DD (OP_80f8 - OP_1000) + (1 * 1000000h) +DD (OP_80f9 - OP_1000) + (1 * 1000000h) +DD (OP_80fa - OP_1000) + (1 * 1000000h) +DD (OP_80fb - OP_1000) + (1 * 1000000h) +DD (OP_80fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_8100 - OP_1000) + (8 * 1000000h) +DD (OP_8108 - OP_1000) + (8 * 1000000h) +DD (OP_8110 - OP_1000) + (8 * 1000000h) +DD (OP_8118 - OP_1000) + (7 * 1000000h) +DD (OP_811f - OP_1000) + (1 * 1000000h) +DD (OP_8120 - OP_1000) + (7 * 1000000h) +DD (OP_8127 - OP_1000) + (1 * 1000000h) +DD (OP_8128 - OP_1000) + (8 * 1000000h) +DD (OP_8130 - OP_1000) + (8 * 1000000h) +DD (OP_8138 - OP_1000) + (1 * 1000000h) +DD (OP_8139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (22 * 1000000h) +DD (OP_8150 - OP_1000) + (8 * 1000000h) +DD (OP_8158 - OP_1000) + (8 * 1000000h) +DD (OP_8160 - OP_1000) + (8 * 1000000h) +DD (OP_8168 - OP_1000) + (8 * 1000000h) +DD (OP_8170 - OP_1000) + (8 * 1000000h) +DD (OP_8178 - OP_1000) + (1 * 1000000h) +DD (OP_8179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (22 * 1000000h) +DD (OP_8190 - OP_1000) + (8 * 1000000h) +DD (OP_8198 - OP_1000) + (8 * 1000000h) +DD (OP_81a0 - OP_1000) + (8 * 1000000h) +DD (OP_81a8 - OP_1000) + (8 * 1000000h) +DD (OP_81b0 - OP_1000) + (8 * 1000000h) +DD (OP_81b8 - OP_1000) + (1 * 1000000h) +DD (OP_81b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_81c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_81d0 - OP_1000) + (8 * 1000000h) +DD (OP_81d8 - OP_1000) + (8 * 1000000h) +DD (OP_81e0 - OP_1000) + (8 * 1000000h) +DD (OP_81e8 - OP_1000) + (8 * 1000000h) +DD (OP_81f0 - OP_1000) + (8 * 1000000h) +DD (OP_81f8 - OP_1000) + (1 * 1000000h) +DD (OP_81f9 - OP_1000) + (1 * 1000000h) +DD (OP_81fa - OP_1000) + (1 * 1000000h) +DD (OP_81fb - OP_1000) + (1 * 1000000h) +DD (OP_81fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_8000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_8010 - OP_1000) + (8 * 1000000h) +DD (OP_8018 - OP_1000) + (7 * 1000000h) +DD (OP_801f - OP_1000) + (1 * 1000000h) +DD (OP_8020 - OP_1000) + (7 * 1000000h) +DD (OP_8027 - OP_1000) + (1 * 1000000h) +DD (OP_8028 - OP_1000) + (8 * 1000000h) +DD (OP_8030 - OP_1000) + (8 * 1000000h) +DD (OP_8038 - OP_1000) + (1 * 1000000h) +DD (OP_8039 - OP_1000) + (1 * 1000000h) +DD (OP_803a - OP_1000) + (1 * 1000000h) +DD (OP_803b - OP_1000) + (1 * 1000000h) +DD (OP_803c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_8040 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_8050 - OP_1000) + (8 * 1000000h) +DD (OP_8058 - OP_1000) + (8 * 1000000h) +DD (OP_8060 - OP_1000) + (8 * 1000000h) +DD (OP_8068 - OP_1000) + (8 * 1000000h) +DD (OP_8070 - OP_1000) + (8 * 1000000h) +DD (OP_8078 - OP_1000) + (1 * 1000000h) +DD (OP_8079 - OP_1000) + (1 * 1000000h) +DD (OP_807a - OP_1000) + (1 * 1000000h) +DD (OP_807b - OP_1000) + (1 * 1000000h) +DD (OP_807c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_8080 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_8090 - OP_1000) + (8 * 1000000h) +DD (OP_8098 - OP_1000) + (8 * 1000000h) +DD (OP_80a0 - OP_1000) + (8 * 1000000h) +DD (OP_80a8 - OP_1000) + (8 * 1000000h) +DD (OP_80b0 - OP_1000) + (8 * 1000000h) +DD (OP_80b8 - OP_1000) + (1 * 1000000h) +DD (OP_80b9 - OP_1000) + (1 * 1000000h) +DD (OP_80ba - OP_1000) + (1 * 1000000h) +DD (OP_80bb - OP_1000) + (1 * 1000000h) +DD (OP_80bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_80c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_80d0 - OP_1000) + (8 * 1000000h) +DD (OP_80d8 - OP_1000) + (8 * 1000000h) +DD (OP_80e0 - OP_1000) + (8 * 1000000h) +DD (OP_80e8 - OP_1000) + (8 * 1000000h) +DD (OP_80f0 - OP_1000) + (8 * 1000000h) +DD (OP_80f8 - OP_1000) + (1 * 1000000h) +DD (OP_80f9 - OP_1000) + (1 * 1000000h) +DD (OP_80fa - OP_1000) + (1 * 1000000h) +DD (OP_80fb - OP_1000) + (1 * 1000000h) +DD (OP_80fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_8100 - OP_1000) + (8 * 1000000h) +DD (OP_8108 - OP_1000) + (8 * 1000000h) +DD (OP_8110 - OP_1000) + (8 * 1000000h) +DD (OP_8118 - OP_1000) + (7 * 1000000h) +DD (OP_811f - OP_1000) + (1 * 1000000h) +DD (OP_8120 - OP_1000) + (7 * 1000000h) +DD (OP_8127 - OP_1000) + (1 * 1000000h) +DD (OP_8128 - OP_1000) + (8 * 1000000h) +DD (OP_8130 - OP_1000) + (8 * 1000000h) +DD (OP_8138 - OP_1000) + (1 * 1000000h) +DD (OP_8139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (22 * 1000000h) +DD (OP_8150 - OP_1000) + (8 * 1000000h) +DD (OP_8158 - OP_1000) + (8 * 1000000h) +DD (OP_8160 - OP_1000) + (8 * 1000000h) +DD (OP_8168 - OP_1000) + (8 * 1000000h) +DD (OP_8170 - OP_1000) + (8 * 1000000h) +DD (OP_8178 - OP_1000) + (1 * 1000000h) +DD (OP_8179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (22 * 1000000h) +DD (OP_8190 - OP_1000) + (8 * 1000000h) +DD (OP_8198 - OP_1000) + (8 * 1000000h) +DD (OP_81a0 - OP_1000) + (8 * 1000000h) +DD (OP_81a8 - OP_1000) + (8 * 1000000h) +DD (OP_81b0 - OP_1000) + (8 * 1000000h) +DD (OP_81b8 - OP_1000) + (1 * 1000000h) +DD (OP_81b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_81c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_81d0 - OP_1000) + (8 * 1000000h) +DD (OP_81d8 - OP_1000) + (8 * 1000000h) +DD (OP_81e0 - OP_1000) + (8 * 1000000h) +DD (OP_81e8 - OP_1000) + (8 * 1000000h) +DD (OP_81f0 - OP_1000) + (8 * 1000000h) +DD (OP_81f8 - OP_1000) + (1 * 1000000h) +DD (OP_81f9 - OP_1000) + (1 * 1000000h) +DD (OP_81fa - OP_1000) + (1 * 1000000h) +DD (OP_81fb - OP_1000) + (1 * 1000000h) +DD (OP_81fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_8000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_8010 - OP_1000) + (8 * 1000000h) +DD (OP_8018 - OP_1000) + (7 * 1000000h) +DD (OP_801f - OP_1000) + (1 * 1000000h) +DD (OP_8020 - OP_1000) + (7 * 1000000h) +DD (OP_8027 - OP_1000) + (1 * 1000000h) +DD (OP_8028 - OP_1000) + (8 * 1000000h) +DD (OP_8030 - OP_1000) + (8 * 1000000h) +DD (OP_8038 - OP_1000) + (1 * 1000000h) +DD (OP_8039 - OP_1000) + (1 * 1000000h) +DD (OP_803a - OP_1000) + (1 * 1000000h) +DD (OP_803b - OP_1000) + (1 * 1000000h) +DD (OP_803c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_8040 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_8050 - OP_1000) + (8 * 1000000h) +DD (OP_8058 - OP_1000) + (8 * 1000000h) +DD (OP_8060 - OP_1000) + (8 * 1000000h) +DD (OP_8068 - OP_1000) + (8 * 1000000h) +DD (OP_8070 - OP_1000) + (8 * 1000000h) +DD (OP_8078 - OP_1000) + (1 * 1000000h) +DD (OP_8079 - OP_1000) + (1 * 1000000h) +DD (OP_807a - OP_1000) + (1 * 1000000h) +DD (OP_807b - OP_1000) + (1 * 1000000h) +DD (OP_807c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_8080 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_8090 - OP_1000) + (8 * 1000000h) +DD (OP_8098 - OP_1000) + (8 * 1000000h) +DD (OP_80a0 - OP_1000) + (8 * 1000000h) +DD (OP_80a8 - OP_1000) + (8 * 1000000h) +DD (OP_80b0 - OP_1000) + (8 * 1000000h) +DD (OP_80b8 - OP_1000) + (1 * 1000000h) +DD (OP_80b9 - OP_1000) + (1 * 1000000h) +DD (OP_80ba - OP_1000) + (1 * 1000000h) +DD (OP_80bb - OP_1000) + (1 * 1000000h) +DD (OP_80bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_80c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_80d0 - OP_1000) + (8 * 1000000h) +DD (OP_80d8 - OP_1000) + (8 * 1000000h) +DD (OP_80e0 - OP_1000) + (8 * 1000000h) +DD (OP_80e8 - OP_1000) + (8 * 1000000h) +DD (OP_80f0 - OP_1000) + (8 * 1000000h) +DD (OP_80f8 - OP_1000) + (1 * 1000000h) +DD (OP_80f9 - OP_1000) + (1 * 1000000h) +DD (OP_80fa - OP_1000) + (1 * 1000000h) +DD (OP_80fb - OP_1000) + (1 * 1000000h) +DD (OP_80fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_8100 - OP_1000) + (8 * 1000000h) +DD (OP_8108 - OP_1000) + (8 * 1000000h) +DD (OP_8110 - OP_1000) + (8 * 1000000h) +DD (OP_8118 - OP_1000) + (7 * 1000000h) +DD (OP_811f - OP_1000) + (1 * 1000000h) +DD (OP_8120 - OP_1000) + (7 * 1000000h) +DD (OP_8127 - OP_1000) + (1 * 1000000h) +DD (OP_8128 - OP_1000) + (8 * 1000000h) +DD (OP_8130 - OP_1000) + (8 * 1000000h) +DD (OP_8138 - OP_1000) + (1 * 1000000h) +DD (OP_8139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (22 * 1000000h) +DD (OP_8150 - OP_1000) + (8 * 1000000h) +DD (OP_8158 - OP_1000) + (8 * 1000000h) +DD (OP_8160 - OP_1000) + (8 * 1000000h) +DD (OP_8168 - OP_1000) + (8 * 1000000h) +DD (OP_8170 - OP_1000) + (8 * 1000000h) +DD (OP_8178 - OP_1000) + (1 * 1000000h) +DD (OP_8179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (22 * 1000000h) +DD (OP_8190 - OP_1000) + (8 * 1000000h) +DD (OP_8198 - OP_1000) + (8 * 1000000h) +DD (OP_81a0 - OP_1000) + (8 * 1000000h) +DD (OP_81a8 - OP_1000) + (8 * 1000000h) +DD (OP_81b0 - OP_1000) + (8 * 1000000h) +DD (OP_81b8 - OP_1000) + (1 * 1000000h) +DD (OP_81b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_81c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_81d0 - OP_1000) + (8 * 1000000h) +DD (OP_81d8 - OP_1000) + (8 * 1000000h) +DD (OP_81e0 - OP_1000) + (8 * 1000000h) +DD (OP_81e8 - OP_1000) + (8 * 1000000h) +DD (OP_81f0 - OP_1000) + (8 * 1000000h) +DD (OP_81f8 - OP_1000) + (1 * 1000000h) +DD (OP_81f9 - OP_1000) + (1 * 1000000h) +DD (OP_81fa - OP_1000) + (1 * 1000000h) +DD (OP_81fb - OP_1000) + (1 * 1000000h) +DD (OP_81fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_8000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_8010 - OP_1000) + (8 * 1000000h) +DD (OP_8018 - OP_1000) + (7 * 1000000h) +DD (OP_801f - OP_1000) + (1 * 1000000h) +DD (OP_8020 - OP_1000) + (7 * 1000000h) +DD (OP_8027 - OP_1000) + (1 * 1000000h) +DD (OP_8028 - OP_1000) + (8 * 1000000h) +DD (OP_8030 - OP_1000) + (8 * 1000000h) +DD (OP_8038 - OP_1000) + (1 * 1000000h) +DD (OP_8039 - OP_1000) + (1 * 1000000h) +DD (OP_803a - OP_1000) + (1 * 1000000h) +DD (OP_803b - OP_1000) + (1 * 1000000h) +DD (OP_803c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_8040 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_8050 - OP_1000) + (8 * 1000000h) +DD (OP_8058 - OP_1000) + (8 * 1000000h) +DD (OP_8060 - OP_1000) + (8 * 1000000h) +DD (OP_8068 - OP_1000) + (8 * 1000000h) +DD (OP_8070 - OP_1000) + (8 * 1000000h) +DD (OP_8078 - OP_1000) + (1 * 1000000h) +DD (OP_8079 - OP_1000) + (1 * 1000000h) +DD (OP_807a - OP_1000) + (1 * 1000000h) +DD (OP_807b - OP_1000) + (1 * 1000000h) +DD (OP_807c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_8080 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_8090 - OP_1000) + (8 * 1000000h) +DD (OP_8098 - OP_1000) + (8 * 1000000h) +DD (OP_80a0 - OP_1000) + (8 * 1000000h) +DD (OP_80a8 - OP_1000) + (8 * 1000000h) +DD (OP_80b0 - OP_1000) + (8 * 1000000h) +DD (OP_80b8 - OP_1000) + (1 * 1000000h) +DD (OP_80b9 - OP_1000) + (1 * 1000000h) +DD (OP_80ba - OP_1000) + (1 * 1000000h) +DD (OP_80bb - OP_1000) + (1 * 1000000h) +DD (OP_80bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_80c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_80d0 - OP_1000) + (8 * 1000000h) +DD (OP_80d8 - OP_1000) + (8 * 1000000h) +DD (OP_80e0 - OP_1000) + (8 * 1000000h) +DD (OP_80e8 - OP_1000) + (8 * 1000000h) +DD (OP_80f0 - OP_1000) + (8 * 1000000h) +DD (OP_80f8 - OP_1000) + (1 * 1000000h) +DD (OP_80f9 - OP_1000) + (1 * 1000000h) +DD (OP_80fa - OP_1000) + (1 * 1000000h) +DD (OP_80fb - OP_1000) + (1 * 1000000h) +DD (OP_80fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_8100 - OP_1000) + (8 * 1000000h) +DD (OP_8108 - OP_1000) + (8 * 1000000h) +DD (OP_8110 - OP_1000) + (8 * 1000000h) +DD (OP_8118 - OP_1000) + (7 * 1000000h) +DD (OP_811f - OP_1000) + (1 * 1000000h) +DD (OP_8120 - OP_1000) + (7 * 1000000h) +DD (OP_8127 - OP_1000) + (1 * 1000000h) +DD (OP_8128 - OP_1000) + (8 * 1000000h) +DD (OP_8130 - OP_1000) + (8 * 1000000h) +DD (OP_8138 - OP_1000) + (1 * 1000000h) +DD (OP_8139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (22 * 1000000h) +DD (OP_8150 - OP_1000) + (8 * 1000000h) +DD (OP_8158 - OP_1000) + (8 * 1000000h) +DD (OP_8160 - OP_1000) + (8 * 1000000h) +DD (OP_8168 - OP_1000) + (8 * 1000000h) +DD (OP_8170 - OP_1000) + (8 * 1000000h) +DD (OP_8178 - OP_1000) + (1 * 1000000h) +DD (OP_8179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (22 * 1000000h) +DD (OP_8190 - OP_1000) + (8 * 1000000h) +DD (OP_8198 - OP_1000) + (8 * 1000000h) +DD (OP_81a0 - OP_1000) + (8 * 1000000h) +DD (OP_81a8 - OP_1000) + (8 * 1000000h) +DD (OP_81b0 - OP_1000) + (8 * 1000000h) +DD (OP_81b8 - OP_1000) + (1 * 1000000h) +DD (OP_81b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_81c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_81d0 - OP_1000) + (8 * 1000000h) +DD (OP_81d8 - OP_1000) + (8 * 1000000h) +DD (OP_81e0 - OP_1000) + (8 * 1000000h) +DD (OP_81e8 - OP_1000) + (8 * 1000000h) +DD (OP_81f0 - OP_1000) + (8 * 1000000h) +DD (OP_81f8 - OP_1000) + (1 * 1000000h) +DD (OP_81f9 - OP_1000) + (1 * 1000000h) +DD (OP_81fa - OP_1000) + (1 * 1000000h) +DD (OP_81fb - OP_1000) + (1 * 1000000h) +DD (OP_81fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_9010 - OP_1000) + (8 * 1000000h) +DD (OP_9018 - OP_1000) + (7 * 1000000h) +DD (OP_901f - OP_1000) + (1 * 1000000h) +DD (OP_9020 - OP_1000) + (7 * 1000000h) +DD (OP_9027 - OP_1000) + (1 * 1000000h) +DD (OP_9028 - OP_1000) + (8 * 1000000h) +DD (OP_9030 - OP_1000) + (8 * 1000000h) +DD (OP_9038 - OP_1000) + (1 * 1000000h) +DD (OP_9039 - OP_1000) + (1 * 1000000h) +DD (OP_903a - OP_1000) + (1 * 1000000h) +DD (OP_903b - OP_1000) + (1 * 1000000h) +DD (OP_903c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9040 - OP_1000) + (16 * 1000000h) +DD (OP_9050 - OP_1000) + (8 * 1000000h) +DD (OP_9058 - OP_1000) + (8 * 1000000h) +DD (OP_9060 - OP_1000) + (8 * 1000000h) +DD (OP_9068 - OP_1000) + (8 * 1000000h) +DD (OP_9070 - OP_1000) + (8 * 1000000h) +DD (OP_9078 - OP_1000) + (1 * 1000000h) +DD (OP_9079 - OP_1000) + (1 * 1000000h) +DD (OP_907a - OP_1000) + (1 * 1000000h) +DD (OP_907b - OP_1000) + (1 * 1000000h) +DD (OP_907c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9080 - OP_1000) + (16 * 1000000h) +DD (OP_9090 - OP_1000) + (8 * 1000000h) +DD (OP_9098 - OP_1000) + (8 * 1000000h) +DD (OP_90a0 - OP_1000) + (8 * 1000000h) +DD (OP_90a8 - OP_1000) + (8 * 1000000h) +DD (OP_90b0 - OP_1000) + (8 * 1000000h) +DD (OP_90b8 - OP_1000) + (1 * 1000000h) +DD (OP_90b9 - OP_1000) + (1 * 1000000h) +DD (OP_90ba - OP_1000) + (1 * 1000000h) +DD (OP_90bb - OP_1000) + (1 * 1000000h) +DD (OP_90bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_90c0 - OP_1000) + (16 * 1000000h) +DD (OP_90d0 - OP_1000) + (8 * 1000000h) +DD (OP_90d8 - OP_1000) + (8 * 1000000h) +DD (OP_90e0 - OP_1000) + (8 * 1000000h) +DD (OP_90e8 - OP_1000) + (8 * 1000000h) +DD (OP_90f0 - OP_1000) + (8 * 1000000h) +DD (OP_90f8 - OP_1000) + (1 * 1000000h) +DD (OP_90f9 - OP_1000) + (1 * 1000000h) +DD (OP_90fa - OP_1000) + (1 * 1000000h) +DD (OP_90fb - OP_1000) + (1 * 1000000h) +DD (OP_90fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9100 - OP_1000) + (8 * 1000000h) +DD (OP_9108 - OP_1000) + (8 * 1000000h) +DD (OP_9110 - OP_1000) + (8 * 1000000h) +DD (OP_9118 - OP_1000) + (7 * 1000000h) +DD (OP_911f - OP_1000) + (1 * 1000000h) +DD (OP_9120 - OP_1000) + (7 * 1000000h) +DD (OP_9127 - OP_1000) + (1 * 1000000h) +DD (OP_9128 - OP_1000) + (8 * 1000000h) +DD (OP_9130 - OP_1000) + (8 * 1000000h) +DD (OP_9138 - OP_1000) + (1 * 1000000h) +DD (OP_9139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_9140 - OP_1000) + (8 * 1000000h) +DD (OP_9148 - OP_1000) + (8 * 1000000h) +DD (OP_9150 - OP_1000) + (8 * 1000000h) +DD (OP_9158 - OP_1000) + (8 * 1000000h) +DD (OP_9160 - OP_1000) + (8 * 1000000h) +DD (OP_9168 - OP_1000) + (8 * 1000000h) +DD (OP_9170 - OP_1000) + (8 * 1000000h) +DD (OP_9178 - OP_1000) + (1 * 1000000h) +DD (OP_9179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_9180 - OP_1000) + (8 * 1000000h) +DD (OP_9188 - OP_1000) + (8 * 1000000h) +DD (OP_9190 - OP_1000) + (8 * 1000000h) +DD (OP_9198 - OP_1000) + (8 * 1000000h) +DD (OP_91a0 - OP_1000) + (8 * 1000000h) +DD (OP_91a8 - OP_1000) + (8 * 1000000h) +DD (OP_91b0 - OP_1000) + (8 * 1000000h) +DD (OP_91b8 - OP_1000) + (1 * 1000000h) +DD (OP_91b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_91c0 - OP_1000) + (16 * 1000000h) +DD (OP_91d0 - OP_1000) + (8 * 1000000h) +DD (OP_91d8 - OP_1000) + (8 * 1000000h) +DD (OP_91e0 - OP_1000) + (8 * 1000000h) +DD (OP_91e8 - OP_1000) + (8 * 1000000h) +DD (OP_91f0 - OP_1000) + (8 * 1000000h) +DD (OP_91f8 - OP_1000) + (1 * 1000000h) +DD (OP_91f9 - OP_1000) + (1 * 1000000h) +DD (OP_91fa - OP_1000) + (1 * 1000000h) +DD (OP_91fb - OP_1000) + (1 * 1000000h) +DD (OP_91fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_9010 - OP_1000) + (8 * 1000000h) +DD (OP_9018 - OP_1000) + (7 * 1000000h) +DD (OP_901f - OP_1000) + (1 * 1000000h) +DD (OP_9020 - OP_1000) + (7 * 1000000h) +DD (OP_9027 - OP_1000) + (1 * 1000000h) +DD (OP_9028 - OP_1000) + (8 * 1000000h) +DD (OP_9030 - OP_1000) + (8 * 1000000h) +DD (OP_9038 - OP_1000) + (1 * 1000000h) +DD (OP_9039 - OP_1000) + (1 * 1000000h) +DD (OP_903a - OP_1000) + (1 * 1000000h) +DD (OP_903b - OP_1000) + (1 * 1000000h) +DD (OP_903c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9040 - OP_1000) + (16 * 1000000h) +DD (OP_9050 - OP_1000) + (8 * 1000000h) +DD (OP_9058 - OP_1000) + (8 * 1000000h) +DD (OP_9060 - OP_1000) + (8 * 1000000h) +DD (OP_9068 - OP_1000) + (8 * 1000000h) +DD (OP_9070 - OP_1000) + (8 * 1000000h) +DD (OP_9078 - OP_1000) + (1 * 1000000h) +DD (OP_9079 - OP_1000) + (1 * 1000000h) +DD (OP_907a - OP_1000) + (1 * 1000000h) +DD (OP_907b - OP_1000) + (1 * 1000000h) +DD (OP_907c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9080 - OP_1000) + (16 * 1000000h) +DD (OP_9090 - OP_1000) + (8 * 1000000h) +DD (OP_9098 - OP_1000) + (8 * 1000000h) +DD (OP_90a0 - OP_1000) + (8 * 1000000h) +DD (OP_90a8 - OP_1000) + (8 * 1000000h) +DD (OP_90b0 - OP_1000) + (8 * 1000000h) +DD (OP_90b8 - OP_1000) + (1 * 1000000h) +DD (OP_90b9 - OP_1000) + (1 * 1000000h) +DD (OP_90ba - OP_1000) + (1 * 1000000h) +DD (OP_90bb - OP_1000) + (1 * 1000000h) +DD (OP_90bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_90c0 - OP_1000) + (16 * 1000000h) +DD (OP_90d0 - OP_1000) + (8 * 1000000h) +DD (OP_90d8 - OP_1000) + (8 * 1000000h) +DD (OP_90e0 - OP_1000) + (8 * 1000000h) +DD (OP_90e8 - OP_1000) + (8 * 1000000h) +DD (OP_90f0 - OP_1000) + (8 * 1000000h) +DD (OP_90f8 - OP_1000) + (1 * 1000000h) +DD (OP_90f9 - OP_1000) + (1 * 1000000h) +DD (OP_90fa - OP_1000) + (1 * 1000000h) +DD (OP_90fb - OP_1000) + (1 * 1000000h) +DD (OP_90fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9100 - OP_1000) + (8 * 1000000h) +DD (OP_9108 - OP_1000) + (8 * 1000000h) +DD (OP_9110 - OP_1000) + (8 * 1000000h) +DD (OP_9118 - OP_1000) + (7 * 1000000h) +DD (OP_911f - OP_1000) + (1 * 1000000h) +DD (OP_9120 - OP_1000) + (7 * 1000000h) +DD (OP_9127 - OP_1000) + (1 * 1000000h) +DD (OP_9128 - OP_1000) + (8 * 1000000h) +DD (OP_9130 - OP_1000) + (8 * 1000000h) +DD (OP_9138 - OP_1000) + (1 * 1000000h) +DD (OP_9139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_9140 - OP_1000) + (8 * 1000000h) +DD (OP_9148 - OP_1000) + (8 * 1000000h) +DD (OP_9150 - OP_1000) + (8 * 1000000h) +DD (OP_9158 - OP_1000) + (8 * 1000000h) +DD (OP_9160 - OP_1000) + (8 * 1000000h) +DD (OP_9168 - OP_1000) + (8 * 1000000h) +DD (OP_9170 - OP_1000) + (8 * 1000000h) +DD (OP_9178 - OP_1000) + (1 * 1000000h) +DD (OP_9179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_9180 - OP_1000) + (8 * 1000000h) +DD (OP_9188 - OP_1000) + (8 * 1000000h) +DD (OP_9190 - OP_1000) + (8 * 1000000h) +DD (OP_9198 - OP_1000) + (8 * 1000000h) +DD (OP_91a0 - OP_1000) + (8 * 1000000h) +DD (OP_91a8 - OP_1000) + (8 * 1000000h) +DD (OP_91b0 - OP_1000) + (8 * 1000000h) +DD (OP_91b8 - OP_1000) + (1 * 1000000h) +DD (OP_91b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_91c0 - OP_1000) + (16 * 1000000h) +DD (OP_91d0 - OP_1000) + (8 * 1000000h) +DD (OP_91d8 - OP_1000) + (8 * 1000000h) +DD (OP_91e0 - OP_1000) + (8 * 1000000h) +DD (OP_91e8 - OP_1000) + (8 * 1000000h) +DD (OP_91f0 - OP_1000) + (8 * 1000000h) +DD (OP_91f8 - OP_1000) + (1 * 1000000h) +DD (OP_91f9 - OP_1000) + (1 * 1000000h) +DD (OP_91fa - OP_1000) + (1 * 1000000h) +DD (OP_91fb - OP_1000) + (1 * 1000000h) +DD (OP_91fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_9010 - OP_1000) + (8 * 1000000h) +DD (OP_9018 - OP_1000) + (7 * 1000000h) +DD (OP_901f - OP_1000) + (1 * 1000000h) +DD (OP_9020 - OP_1000) + (7 * 1000000h) +DD (OP_9027 - OP_1000) + (1 * 1000000h) +DD (OP_9028 - OP_1000) + (8 * 1000000h) +DD (OP_9030 - OP_1000) + (8 * 1000000h) +DD (OP_9038 - OP_1000) + (1 * 1000000h) +DD (OP_9039 - OP_1000) + (1 * 1000000h) +DD (OP_903a - OP_1000) + (1 * 1000000h) +DD (OP_903b - OP_1000) + (1 * 1000000h) +DD (OP_903c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9040 - OP_1000) + (16 * 1000000h) +DD (OP_9050 - OP_1000) + (8 * 1000000h) +DD (OP_9058 - OP_1000) + (8 * 1000000h) +DD (OP_9060 - OP_1000) + (8 * 1000000h) +DD (OP_9068 - OP_1000) + (8 * 1000000h) +DD (OP_9070 - OP_1000) + (8 * 1000000h) +DD (OP_9078 - OP_1000) + (1 * 1000000h) +DD (OP_9079 - OP_1000) + (1 * 1000000h) +DD (OP_907a - OP_1000) + (1 * 1000000h) +DD (OP_907b - OP_1000) + (1 * 1000000h) +DD (OP_907c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9080 - OP_1000) + (16 * 1000000h) +DD (OP_9090 - OP_1000) + (8 * 1000000h) +DD (OP_9098 - OP_1000) + (8 * 1000000h) +DD (OP_90a0 - OP_1000) + (8 * 1000000h) +DD (OP_90a8 - OP_1000) + (8 * 1000000h) +DD (OP_90b0 - OP_1000) + (8 * 1000000h) +DD (OP_90b8 - OP_1000) + (1 * 1000000h) +DD (OP_90b9 - OP_1000) + (1 * 1000000h) +DD (OP_90ba - OP_1000) + (1 * 1000000h) +DD (OP_90bb - OP_1000) + (1 * 1000000h) +DD (OP_90bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_90c0 - OP_1000) + (16 * 1000000h) +DD (OP_90d0 - OP_1000) + (8 * 1000000h) +DD (OP_90d8 - OP_1000) + (8 * 1000000h) +DD (OP_90e0 - OP_1000) + (8 * 1000000h) +DD (OP_90e8 - OP_1000) + (8 * 1000000h) +DD (OP_90f0 - OP_1000) + (8 * 1000000h) +DD (OP_90f8 - OP_1000) + (1 * 1000000h) +DD (OP_90f9 - OP_1000) + (1 * 1000000h) +DD (OP_90fa - OP_1000) + (1 * 1000000h) +DD (OP_90fb - OP_1000) + (1 * 1000000h) +DD (OP_90fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9100 - OP_1000) + (8 * 1000000h) +DD (OP_9108 - OP_1000) + (8 * 1000000h) +DD (OP_9110 - OP_1000) + (8 * 1000000h) +DD (OP_9118 - OP_1000) + (7 * 1000000h) +DD (OP_911f - OP_1000) + (1 * 1000000h) +DD (OP_9120 - OP_1000) + (7 * 1000000h) +DD (OP_9127 - OP_1000) + (1 * 1000000h) +DD (OP_9128 - OP_1000) + (8 * 1000000h) +DD (OP_9130 - OP_1000) + (8 * 1000000h) +DD (OP_9138 - OP_1000) + (1 * 1000000h) +DD (OP_9139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_9140 - OP_1000) + (8 * 1000000h) +DD (OP_9148 - OP_1000) + (8 * 1000000h) +DD (OP_9150 - OP_1000) + (8 * 1000000h) +DD (OP_9158 - OP_1000) + (8 * 1000000h) +DD (OP_9160 - OP_1000) + (8 * 1000000h) +DD (OP_9168 - OP_1000) + (8 * 1000000h) +DD (OP_9170 - OP_1000) + (8 * 1000000h) +DD (OP_9178 - OP_1000) + (1 * 1000000h) +DD (OP_9179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_9180 - OP_1000) + (8 * 1000000h) +DD (OP_9188 - OP_1000) + (8 * 1000000h) +DD (OP_9190 - OP_1000) + (8 * 1000000h) +DD (OP_9198 - OP_1000) + (8 * 1000000h) +DD (OP_91a0 - OP_1000) + (8 * 1000000h) +DD (OP_91a8 - OP_1000) + (8 * 1000000h) +DD (OP_91b0 - OP_1000) + (8 * 1000000h) +DD (OP_91b8 - OP_1000) + (1 * 1000000h) +DD (OP_91b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_91c0 - OP_1000) + (16 * 1000000h) +DD (OP_91d0 - OP_1000) + (8 * 1000000h) +DD (OP_91d8 - OP_1000) + (8 * 1000000h) +DD (OP_91e0 - OP_1000) + (8 * 1000000h) +DD (OP_91e8 - OP_1000) + (8 * 1000000h) +DD (OP_91f0 - OP_1000) + (8 * 1000000h) +DD (OP_91f8 - OP_1000) + (1 * 1000000h) +DD (OP_91f9 - OP_1000) + (1 * 1000000h) +DD (OP_91fa - OP_1000) + (1 * 1000000h) +DD (OP_91fb - OP_1000) + (1 * 1000000h) +DD (OP_91fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_9010 - OP_1000) + (8 * 1000000h) +DD (OP_9018 - OP_1000) + (7 * 1000000h) +DD (OP_901f - OP_1000) + (1 * 1000000h) +DD (OP_9020 - OP_1000) + (7 * 1000000h) +DD (OP_9027 - OP_1000) + (1 * 1000000h) +DD (OP_9028 - OP_1000) + (8 * 1000000h) +DD (OP_9030 - OP_1000) + (8 * 1000000h) +DD (OP_9038 - OP_1000) + (1 * 1000000h) +DD (OP_9039 - OP_1000) + (1 * 1000000h) +DD (OP_903a - OP_1000) + (1 * 1000000h) +DD (OP_903b - OP_1000) + (1 * 1000000h) +DD (OP_903c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9040 - OP_1000) + (16 * 1000000h) +DD (OP_9050 - OP_1000) + (8 * 1000000h) +DD (OP_9058 - OP_1000) + (8 * 1000000h) +DD (OP_9060 - OP_1000) + (8 * 1000000h) +DD (OP_9068 - OP_1000) + (8 * 1000000h) +DD (OP_9070 - OP_1000) + (8 * 1000000h) +DD (OP_9078 - OP_1000) + (1 * 1000000h) +DD (OP_9079 - OP_1000) + (1 * 1000000h) +DD (OP_907a - OP_1000) + (1 * 1000000h) +DD (OP_907b - OP_1000) + (1 * 1000000h) +DD (OP_907c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9080 - OP_1000) + (16 * 1000000h) +DD (OP_9090 - OP_1000) + (8 * 1000000h) +DD (OP_9098 - OP_1000) + (8 * 1000000h) +DD (OP_90a0 - OP_1000) + (8 * 1000000h) +DD (OP_90a8 - OP_1000) + (8 * 1000000h) +DD (OP_90b0 - OP_1000) + (8 * 1000000h) +DD (OP_90b8 - OP_1000) + (1 * 1000000h) +DD (OP_90b9 - OP_1000) + (1 * 1000000h) +DD (OP_90ba - OP_1000) + (1 * 1000000h) +DD (OP_90bb - OP_1000) + (1 * 1000000h) +DD (OP_90bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_90c0 - OP_1000) + (16 * 1000000h) +DD (OP_90d0 - OP_1000) + (8 * 1000000h) +DD (OP_90d8 - OP_1000) + (8 * 1000000h) +DD (OP_90e0 - OP_1000) + (8 * 1000000h) +DD (OP_90e8 - OP_1000) + (8 * 1000000h) +DD (OP_90f0 - OP_1000) + (8 * 1000000h) +DD (OP_90f8 - OP_1000) + (1 * 1000000h) +DD (OP_90f9 - OP_1000) + (1 * 1000000h) +DD (OP_90fa - OP_1000) + (1 * 1000000h) +DD (OP_90fb - OP_1000) + (1 * 1000000h) +DD (OP_90fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9100 - OP_1000) + (8 * 1000000h) +DD (OP_9108 - OP_1000) + (8 * 1000000h) +DD (OP_9110 - OP_1000) + (8 * 1000000h) +DD (OP_9118 - OP_1000) + (7 * 1000000h) +DD (OP_911f - OP_1000) + (1 * 1000000h) +DD (OP_9120 - OP_1000) + (7 * 1000000h) +DD (OP_9127 - OP_1000) + (1 * 1000000h) +DD (OP_9128 - OP_1000) + (8 * 1000000h) +DD (OP_9130 - OP_1000) + (8 * 1000000h) +DD (OP_9138 - OP_1000) + (1 * 1000000h) +DD (OP_9139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_9140 - OP_1000) + (8 * 1000000h) +DD (OP_9148 - OP_1000) + (8 * 1000000h) +DD (OP_9150 - OP_1000) + (8 * 1000000h) +DD (OP_9158 - OP_1000) + (8 * 1000000h) +DD (OP_9160 - OP_1000) + (8 * 1000000h) +DD (OP_9168 - OP_1000) + (8 * 1000000h) +DD (OP_9170 - OP_1000) + (8 * 1000000h) +DD (OP_9178 - OP_1000) + (1 * 1000000h) +DD (OP_9179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_9180 - OP_1000) + (8 * 1000000h) +DD (OP_9188 - OP_1000) + (8 * 1000000h) +DD (OP_9190 - OP_1000) + (8 * 1000000h) +DD (OP_9198 - OP_1000) + (8 * 1000000h) +DD (OP_91a0 - OP_1000) + (8 * 1000000h) +DD (OP_91a8 - OP_1000) + (8 * 1000000h) +DD (OP_91b0 - OP_1000) + (8 * 1000000h) +DD (OP_91b8 - OP_1000) + (1 * 1000000h) +DD (OP_91b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_91c0 - OP_1000) + (16 * 1000000h) +DD (OP_91d0 - OP_1000) + (8 * 1000000h) +DD (OP_91d8 - OP_1000) + (8 * 1000000h) +DD (OP_91e0 - OP_1000) + (8 * 1000000h) +DD (OP_91e8 - OP_1000) + (8 * 1000000h) +DD (OP_91f0 - OP_1000) + (8 * 1000000h) +DD (OP_91f8 - OP_1000) + (1 * 1000000h) +DD (OP_91f9 - OP_1000) + (1 * 1000000h) +DD (OP_91fa - OP_1000) + (1 * 1000000h) +DD (OP_91fb - OP_1000) + (1 * 1000000h) +DD (OP_91fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_9010 - OP_1000) + (8 * 1000000h) +DD (OP_9018 - OP_1000) + (7 * 1000000h) +DD (OP_901f - OP_1000) + (1 * 1000000h) +DD (OP_9020 - OP_1000) + (7 * 1000000h) +DD (OP_9027 - OP_1000) + (1 * 1000000h) +DD (OP_9028 - OP_1000) + (8 * 1000000h) +DD (OP_9030 - OP_1000) + (8 * 1000000h) +DD (OP_9038 - OP_1000) + (1 * 1000000h) +DD (OP_9039 - OP_1000) + (1 * 1000000h) +DD (OP_903a - OP_1000) + (1 * 1000000h) +DD (OP_903b - OP_1000) + (1 * 1000000h) +DD (OP_903c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9040 - OP_1000) + (16 * 1000000h) +DD (OP_9050 - OP_1000) + (8 * 1000000h) +DD (OP_9058 - OP_1000) + (8 * 1000000h) +DD (OP_9060 - OP_1000) + (8 * 1000000h) +DD (OP_9068 - OP_1000) + (8 * 1000000h) +DD (OP_9070 - OP_1000) + (8 * 1000000h) +DD (OP_9078 - OP_1000) + (1 * 1000000h) +DD (OP_9079 - OP_1000) + (1 * 1000000h) +DD (OP_907a - OP_1000) + (1 * 1000000h) +DD (OP_907b - OP_1000) + (1 * 1000000h) +DD (OP_907c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9080 - OP_1000) + (16 * 1000000h) +DD (OP_9090 - OP_1000) + (8 * 1000000h) +DD (OP_9098 - OP_1000) + (8 * 1000000h) +DD (OP_90a0 - OP_1000) + (8 * 1000000h) +DD (OP_90a8 - OP_1000) + (8 * 1000000h) +DD (OP_90b0 - OP_1000) + (8 * 1000000h) +DD (OP_90b8 - OP_1000) + (1 * 1000000h) +DD (OP_90b9 - OP_1000) + (1 * 1000000h) +DD (OP_90ba - OP_1000) + (1 * 1000000h) +DD (OP_90bb - OP_1000) + (1 * 1000000h) +DD (OP_90bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_90c0 - OP_1000) + (16 * 1000000h) +DD (OP_90d0 - OP_1000) + (8 * 1000000h) +DD (OP_90d8 - OP_1000) + (8 * 1000000h) +DD (OP_90e0 - OP_1000) + (8 * 1000000h) +DD (OP_90e8 - OP_1000) + (8 * 1000000h) +DD (OP_90f0 - OP_1000) + (8 * 1000000h) +DD (OP_90f8 - OP_1000) + (1 * 1000000h) +DD (OP_90f9 - OP_1000) + (1 * 1000000h) +DD (OP_90fa - OP_1000) + (1 * 1000000h) +DD (OP_90fb - OP_1000) + (1 * 1000000h) +DD (OP_90fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9100 - OP_1000) + (8 * 1000000h) +DD (OP_9108 - OP_1000) + (8 * 1000000h) +DD (OP_9110 - OP_1000) + (8 * 1000000h) +DD (OP_9118 - OP_1000) + (7 * 1000000h) +DD (OP_911f - OP_1000) + (1 * 1000000h) +DD (OP_9120 - OP_1000) + (7 * 1000000h) +DD (OP_9127 - OP_1000) + (1 * 1000000h) +DD (OP_9128 - OP_1000) + (8 * 1000000h) +DD (OP_9130 - OP_1000) + (8 * 1000000h) +DD (OP_9138 - OP_1000) + (1 * 1000000h) +DD (OP_9139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_9140 - OP_1000) + (8 * 1000000h) +DD (OP_9148 - OP_1000) + (8 * 1000000h) +DD (OP_9150 - OP_1000) + (8 * 1000000h) +DD (OP_9158 - OP_1000) + (8 * 1000000h) +DD (OP_9160 - OP_1000) + (8 * 1000000h) +DD (OP_9168 - OP_1000) + (8 * 1000000h) +DD (OP_9170 - OP_1000) + (8 * 1000000h) +DD (OP_9178 - OP_1000) + (1 * 1000000h) +DD (OP_9179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_9180 - OP_1000) + (8 * 1000000h) +DD (OP_9188 - OP_1000) + (8 * 1000000h) +DD (OP_9190 - OP_1000) + (8 * 1000000h) +DD (OP_9198 - OP_1000) + (8 * 1000000h) +DD (OP_91a0 - OP_1000) + (8 * 1000000h) +DD (OP_91a8 - OP_1000) + (8 * 1000000h) +DD (OP_91b0 - OP_1000) + (8 * 1000000h) +DD (OP_91b8 - OP_1000) + (1 * 1000000h) +DD (OP_91b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_91c0 - OP_1000) + (16 * 1000000h) +DD (OP_91d0 - OP_1000) + (8 * 1000000h) +DD (OP_91d8 - OP_1000) + (8 * 1000000h) +DD (OP_91e0 - OP_1000) + (8 * 1000000h) +DD (OP_91e8 - OP_1000) + (8 * 1000000h) +DD (OP_91f0 - OP_1000) + (8 * 1000000h) +DD (OP_91f8 - OP_1000) + (1 * 1000000h) +DD (OP_91f9 - OP_1000) + (1 * 1000000h) +DD (OP_91fa - OP_1000) + (1 * 1000000h) +DD (OP_91fb - OP_1000) + (1 * 1000000h) +DD (OP_91fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_9010 - OP_1000) + (8 * 1000000h) +DD (OP_9018 - OP_1000) + (7 * 1000000h) +DD (OP_901f - OP_1000) + (1 * 1000000h) +DD (OP_9020 - OP_1000) + (7 * 1000000h) +DD (OP_9027 - OP_1000) + (1 * 1000000h) +DD (OP_9028 - OP_1000) + (8 * 1000000h) +DD (OP_9030 - OP_1000) + (8 * 1000000h) +DD (OP_9038 - OP_1000) + (1 * 1000000h) +DD (OP_9039 - OP_1000) + (1 * 1000000h) +DD (OP_903a - OP_1000) + (1 * 1000000h) +DD (OP_903b - OP_1000) + (1 * 1000000h) +DD (OP_903c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9040 - OP_1000) + (16 * 1000000h) +DD (OP_9050 - OP_1000) + (8 * 1000000h) +DD (OP_9058 - OP_1000) + (8 * 1000000h) +DD (OP_9060 - OP_1000) + (8 * 1000000h) +DD (OP_9068 - OP_1000) + (8 * 1000000h) +DD (OP_9070 - OP_1000) + (8 * 1000000h) +DD (OP_9078 - OP_1000) + (1 * 1000000h) +DD (OP_9079 - OP_1000) + (1 * 1000000h) +DD (OP_907a - OP_1000) + (1 * 1000000h) +DD (OP_907b - OP_1000) + (1 * 1000000h) +DD (OP_907c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9080 - OP_1000) + (16 * 1000000h) +DD (OP_9090 - OP_1000) + (8 * 1000000h) +DD (OP_9098 - OP_1000) + (8 * 1000000h) +DD (OP_90a0 - OP_1000) + (8 * 1000000h) +DD (OP_90a8 - OP_1000) + (8 * 1000000h) +DD (OP_90b0 - OP_1000) + (8 * 1000000h) +DD (OP_90b8 - OP_1000) + (1 * 1000000h) +DD (OP_90b9 - OP_1000) + (1 * 1000000h) +DD (OP_90ba - OP_1000) + (1 * 1000000h) +DD (OP_90bb - OP_1000) + (1 * 1000000h) +DD (OP_90bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_90c0 - OP_1000) + (16 * 1000000h) +DD (OP_90d0 - OP_1000) + (8 * 1000000h) +DD (OP_90d8 - OP_1000) + (8 * 1000000h) +DD (OP_90e0 - OP_1000) + (8 * 1000000h) +DD (OP_90e8 - OP_1000) + (8 * 1000000h) +DD (OP_90f0 - OP_1000) + (8 * 1000000h) +DD (OP_90f8 - OP_1000) + (1 * 1000000h) +DD (OP_90f9 - OP_1000) + (1 * 1000000h) +DD (OP_90fa - OP_1000) + (1 * 1000000h) +DD (OP_90fb - OP_1000) + (1 * 1000000h) +DD (OP_90fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9100 - OP_1000) + (8 * 1000000h) +DD (OP_9108 - OP_1000) + (8 * 1000000h) +DD (OP_9110 - OP_1000) + (8 * 1000000h) +DD (OP_9118 - OP_1000) + (7 * 1000000h) +DD (OP_911f - OP_1000) + (1 * 1000000h) +DD (OP_9120 - OP_1000) + (7 * 1000000h) +DD (OP_9127 - OP_1000) + (1 * 1000000h) +DD (OP_9128 - OP_1000) + (8 * 1000000h) +DD (OP_9130 - OP_1000) + (8 * 1000000h) +DD (OP_9138 - OP_1000) + (1 * 1000000h) +DD (OP_9139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_9140 - OP_1000) + (8 * 1000000h) +DD (OP_9148 - OP_1000) + (8 * 1000000h) +DD (OP_9150 - OP_1000) + (8 * 1000000h) +DD (OP_9158 - OP_1000) + (8 * 1000000h) +DD (OP_9160 - OP_1000) + (8 * 1000000h) +DD (OP_9168 - OP_1000) + (8 * 1000000h) +DD (OP_9170 - OP_1000) + (8 * 1000000h) +DD (OP_9178 - OP_1000) + (1 * 1000000h) +DD (OP_9179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_9180 - OP_1000) + (8 * 1000000h) +DD (OP_9188 - OP_1000) + (8 * 1000000h) +DD (OP_9190 - OP_1000) + (8 * 1000000h) +DD (OP_9198 - OP_1000) + (8 * 1000000h) +DD (OP_91a0 - OP_1000) + (8 * 1000000h) +DD (OP_91a8 - OP_1000) + (8 * 1000000h) +DD (OP_91b0 - OP_1000) + (8 * 1000000h) +DD (OP_91b8 - OP_1000) + (1 * 1000000h) +DD (OP_91b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_91c0 - OP_1000) + (16 * 1000000h) +DD (OP_91d0 - OP_1000) + (8 * 1000000h) +DD (OP_91d8 - OP_1000) + (8 * 1000000h) +DD (OP_91e0 - OP_1000) + (8 * 1000000h) +DD (OP_91e8 - OP_1000) + (8 * 1000000h) +DD (OP_91f0 - OP_1000) + (8 * 1000000h) +DD (OP_91f8 - OP_1000) + (1 * 1000000h) +DD (OP_91f9 - OP_1000) + (1 * 1000000h) +DD (OP_91fa - OP_1000) + (1 * 1000000h) +DD (OP_91fb - OP_1000) + (1 * 1000000h) +DD (OP_91fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_9010 - OP_1000) + (8 * 1000000h) +DD (OP_9018 - OP_1000) + (7 * 1000000h) +DD (OP_901f - OP_1000) + (1 * 1000000h) +DD (OP_9020 - OP_1000) + (7 * 1000000h) +DD (OP_9027 - OP_1000) + (1 * 1000000h) +DD (OP_9028 - OP_1000) + (8 * 1000000h) +DD (OP_9030 - OP_1000) + (8 * 1000000h) +DD (OP_9038 - OP_1000) + (1 * 1000000h) +DD (OP_9039 - OP_1000) + (1 * 1000000h) +DD (OP_903a - OP_1000) + (1 * 1000000h) +DD (OP_903b - OP_1000) + (1 * 1000000h) +DD (OP_903c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9040 - OP_1000) + (16 * 1000000h) +DD (OP_9050 - OP_1000) + (8 * 1000000h) +DD (OP_9058 - OP_1000) + (8 * 1000000h) +DD (OP_9060 - OP_1000) + (8 * 1000000h) +DD (OP_9068 - OP_1000) + (8 * 1000000h) +DD (OP_9070 - OP_1000) + (8 * 1000000h) +DD (OP_9078 - OP_1000) + (1 * 1000000h) +DD (OP_9079 - OP_1000) + (1 * 1000000h) +DD (OP_907a - OP_1000) + (1 * 1000000h) +DD (OP_907b - OP_1000) + (1 * 1000000h) +DD (OP_907c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9080 - OP_1000) + (16 * 1000000h) +DD (OP_9090 - OP_1000) + (8 * 1000000h) +DD (OP_9098 - OP_1000) + (8 * 1000000h) +DD (OP_90a0 - OP_1000) + (8 * 1000000h) +DD (OP_90a8 - OP_1000) + (8 * 1000000h) +DD (OP_90b0 - OP_1000) + (8 * 1000000h) +DD (OP_90b8 - OP_1000) + (1 * 1000000h) +DD (OP_90b9 - OP_1000) + (1 * 1000000h) +DD (OP_90ba - OP_1000) + (1 * 1000000h) +DD (OP_90bb - OP_1000) + (1 * 1000000h) +DD (OP_90bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_90c0 - OP_1000) + (16 * 1000000h) +DD (OP_90d0 - OP_1000) + (8 * 1000000h) +DD (OP_90d8 - OP_1000) + (8 * 1000000h) +DD (OP_90e0 - OP_1000) + (8 * 1000000h) +DD (OP_90e8 - OP_1000) + (8 * 1000000h) +DD (OP_90f0 - OP_1000) + (8 * 1000000h) +DD (OP_90f8 - OP_1000) + (1 * 1000000h) +DD (OP_90f9 - OP_1000) + (1 * 1000000h) +DD (OP_90fa - OP_1000) + (1 * 1000000h) +DD (OP_90fb - OP_1000) + (1 * 1000000h) +DD (OP_90fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9100 - OP_1000) + (8 * 1000000h) +DD (OP_9108 - OP_1000) + (8 * 1000000h) +DD (OP_9110 - OP_1000) + (8 * 1000000h) +DD (OP_9118 - OP_1000) + (7 * 1000000h) +DD (OP_911f - OP_1000) + (1 * 1000000h) +DD (OP_9120 - OP_1000) + (7 * 1000000h) +DD (OP_9127 - OP_1000) + (1 * 1000000h) +DD (OP_9128 - OP_1000) + (8 * 1000000h) +DD (OP_9130 - OP_1000) + (8 * 1000000h) +DD (OP_9138 - OP_1000) + (1 * 1000000h) +DD (OP_9139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_9140 - OP_1000) + (8 * 1000000h) +DD (OP_9148 - OP_1000) + (8 * 1000000h) +DD (OP_9150 - OP_1000) + (8 * 1000000h) +DD (OP_9158 - OP_1000) + (8 * 1000000h) +DD (OP_9160 - OP_1000) + (8 * 1000000h) +DD (OP_9168 - OP_1000) + (8 * 1000000h) +DD (OP_9170 - OP_1000) + (8 * 1000000h) +DD (OP_9178 - OP_1000) + (1 * 1000000h) +DD (OP_9179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_9180 - OP_1000) + (8 * 1000000h) +DD (OP_9188 - OP_1000) + (8 * 1000000h) +DD (OP_9190 - OP_1000) + (8 * 1000000h) +DD (OP_9198 - OP_1000) + (8 * 1000000h) +DD (OP_91a0 - OP_1000) + (8 * 1000000h) +DD (OP_91a8 - OP_1000) + (8 * 1000000h) +DD (OP_91b0 - OP_1000) + (8 * 1000000h) +DD (OP_91b8 - OP_1000) + (1 * 1000000h) +DD (OP_91b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_91c0 - OP_1000) + (16 * 1000000h) +DD (OP_91d0 - OP_1000) + (8 * 1000000h) +DD (OP_91d8 - OP_1000) + (8 * 1000000h) +DD (OP_91e0 - OP_1000) + (8 * 1000000h) +DD (OP_91e8 - OP_1000) + (8 * 1000000h) +DD (OP_91f0 - OP_1000) + (8 * 1000000h) +DD (OP_91f8 - OP_1000) + (1 * 1000000h) +DD (OP_91f9 - OP_1000) + (1 * 1000000h) +DD (OP_91fa - OP_1000) + (1 * 1000000h) +DD (OP_91fb - OP_1000) + (1 * 1000000h) +DD (OP_91fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_9010 - OP_1000) + (8 * 1000000h) +DD (OP_9018 - OP_1000) + (7 * 1000000h) +DD (OP_901f - OP_1000) + (1 * 1000000h) +DD (OP_9020 - OP_1000) + (7 * 1000000h) +DD (OP_9027 - OP_1000) + (1 * 1000000h) +DD (OP_9028 - OP_1000) + (8 * 1000000h) +DD (OP_9030 - OP_1000) + (8 * 1000000h) +DD (OP_9038 - OP_1000) + (1 * 1000000h) +DD (OP_9039 - OP_1000) + (1 * 1000000h) +DD (OP_903a - OP_1000) + (1 * 1000000h) +DD (OP_903b - OP_1000) + (1 * 1000000h) +DD (OP_903c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9040 - OP_1000) + (16 * 1000000h) +DD (OP_9050 - OP_1000) + (8 * 1000000h) +DD (OP_9058 - OP_1000) + (8 * 1000000h) +DD (OP_9060 - OP_1000) + (8 * 1000000h) +DD (OP_9068 - OP_1000) + (8 * 1000000h) +DD (OP_9070 - OP_1000) + (8 * 1000000h) +DD (OP_9078 - OP_1000) + (1 * 1000000h) +DD (OP_9079 - OP_1000) + (1 * 1000000h) +DD (OP_907a - OP_1000) + (1 * 1000000h) +DD (OP_907b - OP_1000) + (1 * 1000000h) +DD (OP_907c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9080 - OP_1000) + (16 * 1000000h) +DD (OP_9090 - OP_1000) + (8 * 1000000h) +DD (OP_9098 - OP_1000) + (8 * 1000000h) +DD (OP_90a0 - OP_1000) + (8 * 1000000h) +DD (OP_90a8 - OP_1000) + (8 * 1000000h) +DD (OP_90b0 - OP_1000) + (8 * 1000000h) +DD (OP_90b8 - OP_1000) + (1 * 1000000h) +DD (OP_90b9 - OP_1000) + (1 * 1000000h) +DD (OP_90ba - OP_1000) + (1 * 1000000h) +DD (OP_90bb - OP_1000) + (1 * 1000000h) +DD (OP_90bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_90c0 - OP_1000) + (16 * 1000000h) +DD (OP_90d0 - OP_1000) + (8 * 1000000h) +DD (OP_90d8 - OP_1000) + (8 * 1000000h) +DD (OP_90e0 - OP_1000) + (8 * 1000000h) +DD (OP_90e8 - OP_1000) + (8 * 1000000h) +DD (OP_90f0 - OP_1000) + (8 * 1000000h) +DD (OP_90f8 - OP_1000) + (1 * 1000000h) +DD (OP_90f9 - OP_1000) + (1 * 1000000h) +DD (OP_90fa - OP_1000) + (1 * 1000000h) +DD (OP_90fb - OP_1000) + (1 * 1000000h) +DD (OP_90fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_9100 - OP_1000) + (8 * 1000000h) +DD (OP_9108 - OP_1000) + (8 * 1000000h) +DD (OP_9110 - OP_1000) + (8 * 1000000h) +DD (OP_9118 - OP_1000) + (7 * 1000000h) +DD (OP_911f - OP_1000) + (1 * 1000000h) +DD (OP_9120 - OP_1000) + (7 * 1000000h) +DD (OP_9127 - OP_1000) + (1 * 1000000h) +DD (OP_9128 - OP_1000) + (8 * 1000000h) +DD (OP_9130 - OP_1000) + (8 * 1000000h) +DD (OP_9138 - OP_1000) + (1 * 1000000h) +DD (OP_9139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_9140 - OP_1000) + (8 * 1000000h) +DD (OP_9148 - OP_1000) + (8 * 1000000h) +DD (OP_9150 - OP_1000) + (8 * 1000000h) +DD (OP_9158 - OP_1000) + (8 * 1000000h) +DD (OP_9160 - OP_1000) + (8 * 1000000h) +DD (OP_9168 - OP_1000) + (8 * 1000000h) +DD (OP_9170 - OP_1000) + (8 * 1000000h) +DD (OP_9178 - OP_1000) + (1 * 1000000h) +DD (OP_9179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_9180 - OP_1000) + (8 * 1000000h) +DD (OP_9188 - OP_1000) + (8 * 1000000h) +DD (OP_9190 - OP_1000) + (8 * 1000000h) +DD (OP_9198 - OP_1000) + (8 * 1000000h) +DD (OP_91a0 - OP_1000) + (8 * 1000000h) +DD (OP_91a8 - OP_1000) + (8 * 1000000h) +DD (OP_91b0 - OP_1000) + (8 * 1000000h) +DD (OP_91b8 - OP_1000) + (1 * 1000000h) +DD (OP_91b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_91c0 - OP_1000) + (16 * 1000000h) +DD (OP_91d0 - OP_1000) + (8 * 1000000h) +DD (OP_91d8 - OP_1000) + (8 * 1000000h) +DD (OP_91e0 - OP_1000) + (8 * 1000000h) +DD (OP_91e8 - OP_1000) + (8 * 1000000h) +DD (OP_91f0 - OP_1000) + (8 * 1000000h) +DD (OP_91f8 - OP_1000) + (1 * 1000000h) +DD (OP_91f9 - OP_1000) + (1 * 1000000h) +DD (OP_91fa - OP_1000) + (1 * 1000000h) +DD (OP_91fb - OP_1000) + (1 * 1000000h) +DD (OP_91fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD OP_a000 - OP_1000 +DW 4096 +DD (OP_b000 - OP_1000) + (16 * 1000000h) +DD (OP_b010 - OP_1000) + (8 * 1000000h) +DD (OP_b018 - OP_1000) + (7 * 1000000h) +DD (OP_b01f - OP_1000) + (1 * 1000000h) +DD (OP_b020 - OP_1000) + (7 * 1000000h) +DD (OP_b027 - OP_1000) + (1 * 1000000h) +DD (OP_b028 - OP_1000) + (8 * 1000000h) +DD (OP_b030 - OP_1000) + (8 * 1000000h) +DD (OP_b038 - OP_1000) + (1 * 1000000h) +DD (OP_b039 - OP_1000) + (1 * 1000000h) +DD (OP_b03a - OP_1000) + (1 * 1000000h) +DD (OP_b03b - OP_1000) + (1 * 1000000h) +DD (OP_b03c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b040 - OP_1000) + (16 * 1000000h) +DD (OP_b050 - OP_1000) + (8 * 1000000h) +DD (OP_b058 - OP_1000) + (8 * 1000000h) +DD (OP_b060 - OP_1000) + (8 * 1000000h) +DD (OP_b068 - OP_1000) + (8 * 1000000h) +DD (OP_b070 - OP_1000) + (8 * 1000000h) +DD (OP_b078 - OP_1000) + (1 * 1000000h) +DD (OP_b079 - OP_1000) + (1 * 1000000h) +DD (OP_b07a - OP_1000) + (1 * 1000000h) +DD (OP_b07b - OP_1000) + (1 * 1000000h) +DD (OP_b07c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b080 - OP_1000) + (16 * 1000000h) +DD (OP_b090 - OP_1000) + (8 * 1000000h) +DD (OP_b098 - OP_1000) + (8 * 1000000h) +DD (OP_b0a0 - OP_1000) + (8 * 1000000h) +DD (OP_b0a8 - OP_1000) + (8 * 1000000h) +DD (OP_b0b0 - OP_1000) + (8 * 1000000h) +DD (OP_b0b8 - OP_1000) + (1 * 1000000h) +DD (OP_b0b9 - OP_1000) + (1 * 1000000h) +DD (OP_b0ba - OP_1000) + (1 * 1000000h) +DD (OP_b0bb - OP_1000) + (1 * 1000000h) +DD (OP_b0bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b0c0 - OP_1000) + (16 * 1000000h) +DD (OP_b0d0 - OP_1000) + (8 * 1000000h) +DD (OP_b0d8 - OP_1000) + (8 * 1000000h) +DD (OP_b0e0 - OP_1000) + (8 * 1000000h) +DD (OP_b0e8 - OP_1000) + (8 * 1000000h) +DD (OP_b0f0 - OP_1000) + (8 * 1000000h) +DD (OP_b0f8 - OP_1000) + (1 * 1000000h) +DD (OP_b0f9 - OP_1000) + (1 * 1000000h) +DD (OP_b0fa - OP_1000) + (1 * 1000000h) +DD (OP_b0fb - OP_1000) + (1 * 1000000h) +DD (OP_b0fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b100 - OP_1000) + (8 * 1000000h) +DD (OP_b108 - OP_1000) + (8 * 1000000h) +DD (OP_b110 - OP_1000) + (8 * 1000000h) +DD (OP_b118 - OP_1000) + (7 * 1000000h) +DD (OP_b11f - OP_1000) + (1 * 1000000h) +DD (OP_b120 - OP_1000) + (7 * 1000000h) +DD (OP_b127 - OP_1000) + (1 * 1000000h) +DD (OP_b128 - OP_1000) + (8 * 1000000h) +DD (OP_b130 - OP_1000) + (8 * 1000000h) +DD (OP_b138 - OP_1000) + (1 * 1000000h) +DD (OP_b139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_b140 - OP_1000) + (8 * 1000000h) +DD (OP_b148 - OP_1000) + (8 * 1000000h) +DD (OP_b150 - OP_1000) + (8 * 1000000h) +DD (OP_b158 - OP_1000) + (8 * 1000000h) +DD (OP_b160 - OP_1000) + (8 * 1000000h) +DD (OP_b168 - OP_1000) + (8 * 1000000h) +DD (OP_b170 - OP_1000) + (8 * 1000000h) +DD (OP_b178 - OP_1000) + (1 * 1000000h) +DD (OP_b179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_b180 - OP_1000) + (8 * 1000000h) +DD (OP_b188 - OP_1000) + (8 * 1000000h) +DD (OP_b190 - OP_1000) + (8 * 1000000h) +DD (OP_b198 - OP_1000) + (8 * 1000000h) +DD (OP_b1a0 - OP_1000) + (8 * 1000000h) +DD (OP_b1a8 - OP_1000) + (8 * 1000000h) +DD (OP_b1b0 - OP_1000) + (8 * 1000000h) +DD (OP_b1b8 - OP_1000) + (1 * 1000000h) +DD (OP_b1b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_b1c0 - OP_1000) + (16 * 1000000h) +DD (OP_b1d0 - OP_1000) + (8 * 1000000h) +DD (OP_b1d8 - OP_1000) + (8 * 1000000h) +DD (OP_b1e0 - OP_1000) + (8 * 1000000h) +DD (OP_b1e8 - OP_1000) + (8 * 1000000h) +DD (OP_b1f0 - OP_1000) + (8 * 1000000h) +DD (OP_b1f8 - OP_1000) + (1 * 1000000h) +DD (OP_b1f9 - OP_1000) + (1 * 1000000h) +DD (OP_b1fa - OP_1000) + (1 * 1000000h) +DD (OP_b1fb - OP_1000) + (1 * 1000000h) +DD (OP_b1fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b000 - OP_1000) + (16 * 1000000h) +DD (OP_b010 - OP_1000) + (8 * 1000000h) +DD (OP_b018 - OP_1000) + (7 * 1000000h) +DD (OP_b01f - OP_1000) + (1 * 1000000h) +DD (OP_b020 - OP_1000) + (7 * 1000000h) +DD (OP_b027 - OP_1000) + (1 * 1000000h) +DD (OP_b028 - OP_1000) + (8 * 1000000h) +DD (OP_b030 - OP_1000) + (8 * 1000000h) +DD (OP_b038 - OP_1000) + (1 * 1000000h) +DD (OP_b039 - OP_1000) + (1 * 1000000h) +DD (OP_b03a - OP_1000) + (1 * 1000000h) +DD (OP_b03b - OP_1000) + (1 * 1000000h) +DD (OP_b03c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b040 - OP_1000) + (16 * 1000000h) +DD (OP_b050 - OP_1000) + (8 * 1000000h) +DD (OP_b058 - OP_1000) + (8 * 1000000h) +DD (OP_b060 - OP_1000) + (8 * 1000000h) +DD (OP_b068 - OP_1000) + (8 * 1000000h) +DD (OP_b070 - OP_1000) + (8 * 1000000h) +DD (OP_b078 - OP_1000) + (1 * 1000000h) +DD (OP_b079 - OP_1000) + (1 * 1000000h) +DD (OP_b07a - OP_1000) + (1 * 1000000h) +DD (OP_b07b - OP_1000) + (1 * 1000000h) +DD (OP_b07c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b080 - OP_1000) + (16 * 1000000h) +DD (OP_b090 - OP_1000) + (8 * 1000000h) +DD (OP_b098 - OP_1000) + (8 * 1000000h) +DD (OP_b0a0 - OP_1000) + (8 * 1000000h) +DD (OP_b0a8 - OP_1000) + (8 * 1000000h) +DD (OP_b0b0 - OP_1000) + (8 * 1000000h) +DD (OP_b0b8 - OP_1000) + (1 * 1000000h) +DD (OP_b0b9 - OP_1000) + (1 * 1000000h) +DD (OP_b0ba - OP_1000) + (1 * 1000000h) +DD (OP_b0bb - OP_1000) + (1 * 1000000h) +DD (OP_b0bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b0c0 - OP_1000) + (16 * 1000000h) +DD (OP_b0d0 - OP_1000) + (8 * 1000000h) +DD (OP_b0d8 - OP_1000) + (8 * 1000000h) +DD (OP_b0e0 - OP_1000) + (8 * 1000000h) +DD (OP_b0e8 - OP_1000) + (8 * 1000000h) +DD (OP_b0f0 - OP_1000) + (8 * 1000000h) +DD (OP_b0f8 - OP_1000) + (1 * 1000000h) +DD (OP_b0f9 - OP_1000) + (1 * 1000000h) +DD (OP_b0fa - OP_1000) + (1 * 1000000h) +DD (OP_b0fb - OP_1000) + (1 * 1000000h) +DD (OP_b0fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b100 - OP_1000) + (8 * 1000000h) +DD (OP_b108 - OP_1000) + (8 * 1000000h) +DD (OP_b110 - OP_1000) + (8 * 1000000h) +DD (OP_b118 - OP_1000) + (7 * 1000000h) +DD (OP_b11f - OP_1000) + (1 * 1000000h) +DD (OP_b120 - OP_1000) + (7 * 1000000h) +DD (OP_b127 - OP_1000) + (1 * 1000000h) +DD (OP_b128 - OP_1000) + (8 * 1000000h) +DD (OP_b130 - OP_1000) + (8 * 1000000h) +DD (OP_b138 - OP_1000) + (1 * 1000000h) +DD (OP_b139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_b140 - OP_1000) + (8 * 1000000h) +DD (OP_b148 - OP_1000) + (8 * 1000000h) +DD (OP_b150 - OP_1000) + (8 * 1000000h) +DD (OP_b158 - OP_1000) + (8 * 1000000h) +DD (OP_b160 - OP_1000) + (8 * 1000000h) +DD (OP_b168 - OP_1000) + (8 * 1000000h) +DD (OP_b170 - OP_1000) + (8 * 1000000h) +DD (OP_b178 - OP_1000) + (1 * 1000000h) +DD (OP_b179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_b180 - OP_1000) + (8 * 1000000h) +DD (OP_b188 - OP_1000) + (8 * 1000000h) +DD (OP_b190 - OP_1000) + (8 * 1000000h) +DD (OP_b198 - OP_1000) + (8 * 1000000h) +DD (OP_b1a0 - OP_1000) + (8 * 1000000h) +DD (OP_b1a8 - OP_1000) + (8 * 1000000h) +DD (OP_b1b0 - OP_1000) + (8 * 1000000h) +DD (OP_b1b8 - OP_1000) + (1 * 1000000h) +DD (OP_b1b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_b1c0 - OP_1000) + (16 * 1000000h) +DD (OP_b1d0 - OP_1000) + (8 * 1000000h) +DD (OP_b1d8 - OP_1000) + (8 * 1000000h) +DD (OP_b1e0 - OP_1000) + (8 * 1000000h) +DD (OP_b1e8 - OP_1000) + (8 * 1000000h) +DD (OP_b1f0 - OP_1000) + (8 * 1000000h) +DD (OP_b1f8 - OP_1000) + (1 * 1000000h) +DD (OP_b1f9 - OP_1000) + (1 * 1000000h) +DD (OP_b1fa - OP_1000) + (1 * 1000000h) +DD (OP_b1fb - OP_1000) + (1 * 1000000h) +DD (OP_b1fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b000 - OP_1000) + (16 * 1000000h) +DD (OP_b010 - OP_1000) + (8 * 1000000h) +DD (OP_b018 - OP_1000) + (7 * 1000000h) +DD (OP_b01f - OP_1000) + (1 * 1000000h) +DD (OP_b020 - OP_1000) + (7 * 1000000h) +DD (OP_b027 - OP_1000) + (1 * 1000000h) +DD (OP_b028 - OP_1000) + (8 * 1000000h) +DD (OP_b030 - OP_1000) + (8 * 1000000h) +DD (OP_b038 - OP_1000) + (1 * 1000000h) +DD (OP_b039 - OP_1000) + (1 * 1000000h) +DD (OP_b03a - OP_1000) + (1 * 1000000h) +DD (OP_b03b - OP_1000) + (1 * 1000000h) +DD (OP_b03c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b040 - OP_1000) + (16 * 1000000h) +DD (OP_b050 - OP_1000) + (8 * 1000000h) +DD (OP_b058 - OP_1000) + (8 * 1000000h) +DD (OP_b060 - OP_1000) + (8 * 1000000h) +DD (OP_b068 - OP_1000) + (8 * 1000000h) +DD (OP_b070 - OP_1000) + (8 * 1000000h) +DD (OP_b078 - OP_1000) + (1 * 1000000h) +DD (OP_b079 - OP_1000) + (1 * 1000000h) +DD (OP_b07a - OP_1000) + (1 * 1000000h) +DD (OP_b07b - OP_1000) + (1 * 1000000h) +DD (OP_b07c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b080 - OP_1000) + (16 * 1000000h) +DD (OP_b090 - OP_1000) + (8 * 1000000h) +DD (OP_b098 - OP_1000) + (8 * 1000000h) +DD (OP_b0a0 - OP_1000) + (8 * 1000000h) +DD (OP_b0a8 - OP_1000) + (8 * 1000000h) +DD (OP_b0b0 - OP_1000) + (8 * 1000000h) +DD (OP_b0b8 - OP_1000) + (1 * 1000000h) +DD (OP_b0b9 - OP_1000) + (1 * 1000000h) +DD (OP_b0ba - OP_1000) + (1 * 1000000h) +DD (OP_b0bb - OP_1000) + (1 * 1000000h) +DD (OP_b0bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b0c0 - OP_1000) + (16 * 1000000h) +DD (OP_b0d0 - OP_1000) + (8 * 1000000h) +DD (OP_b0d8 - OP_1000) + (8 * 1000000h) +DD (OP_b0e0 - OP_1000) + (8 * 1000000h) +DD (OP_b0e8 - OP_1000) + (8 * 1000000h) +DD (OP_b0f0 - OP_1000) + (8 * 1000000h) +DD (OP_b0f8 - OP_1000) + (1 * 1000000h) +DD (OP_b0f9 - OP_1000) + (1 * 1000000h) +DD (OP_b0fa - OP_1000) + (1 * 1000000h) +DD (OP_b0fb - OP_1000) + (1 * 1000000h) +DD (OP_b0fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b100 - OP_1000) + (8 * 1000000h) +DD (OP_b108 - OP_1000) + (8 * 1000000h) +DD (OP_b110 - OP_1000) + (8 * 1000000h) +DD (OP_b118 - OP_1000) + (7 * 1000000h) +DD (OP_b11f - OP_1000) + (1 * 1000000h) +DD (OP_b120 - OP_1000) + (7 * 1000000h) +DD (OP_b127 - OP_1000) + (1 * 1000000h) +DD (OP_b128 - OP_1000) + (8 * 1000000h) +DD (OP_b130 - OP_1000) + (8 * 1000000h) +DD (OP_b138 - OP_1000) + (1 * 1000000h) +DD (OP_b139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_b140 - OP_1000) + (8 * 1000000h) +DD (OP_b148 - OP_1000) + (8 * 1000000h) +DD (OP_b150 - OP_1000) + (8 * 1000000h) +DD (OP_b158 - OP_1000) + (8 * 1000000h) +DD (OP_b160 - OP_1000) + (8 * 1000000h) +DD (OP_b168 - OP_1000) + (8 * 1000000h) +DD (OP_b170 - OP_1000) + (8 * 1000000h) +DD (OP_b178 - OP_1000) + (1 * 1000000h) +DD (OP_b179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_b180 - OP_1000) + (8 * 1000000h) +DD (OP_b188 - OP_1000) + (8 * 1000000h) +DD (OP_b190 - OP_1000) + (8 * 1000000h) +DD (OP_b198 - OP_1000) + (8 * 1000000h) +DD (OP_b1a0 - OP_1000) + (8 * 1000000h) +DD (OP_b1a8 - OP_1000) + (8 * 1000000h) +DD (OP_b1b0 - OP_1000) + (8 * 1000000h) +DD (OP_b1b8 - OP_1000) + (1 * 1000000h) +DD (OP_b1b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_b1c0 - OP_1000) + (16 * 1000000h) +DD (OP_b1d0 - OP_1000) + (8 * 1000000h) +DD (OP_b1d8 - OP_1000) + (8 * 1000000h) +DD (OP_b1e0 - OP_1000) + (8 * 1000000h) +DD (OP_b1e8 - OP_1000) + (8 * 1000000h) +DD (OP_b1f0 - OP_1000) + (8 * 1000000h) +DD (OP_b1f8 - OP_1000) + (1 * 1000000h) +DD (OP_b1f9 - OP_1000) + (1 * 1000000h) +DD (OP_b1fa - OP_1000) + (1 * 1000000h) +DD (OP_b1fb - OP_1000) + (1 * 1000000h) +DD (OP_b1fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b000 - OP_1000) + (16 * 1000000h) +DD (OP_b010 - OP_1000) + (8 * 1000000h) +DD (OP_b018 - OP_1000) + (7 * 1000000h) +DD (OP_b01f - OP_1000) + (1 * 1000000h) +DD (OP_b020 - OP_1000) + (7 * 1000000h) +DD (OP_b027 - OP_1000) + (1 * 1000000h) +DD (OP_b028 - OP_1000) + (8 * 1000000h) +DD (OP_b030 - OP_1000) + (8 * 1000000h) +DD (OP_b038 - OP_1000) + (1 * 1000000h) +DD (OP_b039 - OP_1000) + (1 * 1000000h) +DD (OP_b03a - OP_1000) + (1 * 1000000h) +DD (OP_b03b - OP_1000) + (1 * 1000000h) +DD (OP_b03c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b040 - OP_1000) + (16 * 1000000h) +DD (OP_b050 - OP_1000) + (8 * 1000000h) +DD (OP_b058 - OP_1000) + (8 * 1000000h) +DD (OP_b060 - OP_1000) + (8 * 1000000h) +DD (OP_b068 - OP_1000) + (8 * 1000000h) +DD (OP_b070 - OP_1000) + (8 * 1000000h) +DD (OP_b078 - OP_1000) + (1 * 1000000h) +DD (OP_b079 - OP_1000) + (1 * 1000000h) +DD (OP_b07a - OP_1000) + (1 * 1000000h) +DD (OP_b07b - OP_1000) + (1 * 1000000h) +DD (OP_b07c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b080 - OP_1000) + (16 * 1000000h) +DD (OP_b090 - OP_1000) + (8 * 1000000h) +DD (OP_b098 - OP_1000) + (8 * 1000000h) +DD (OP_b0a0 - OP_1000) + (8 * 1000000h) +DD (OP_b0a8 - OP_1000) + (8 * 1000000h) +DD (OP_b0b0 - OP_1000) + (8 * 1000000h) +DD (OP_b0b8 - OP_1000) + (1 * 1000000h) +DD (OP_b0b9 - OP_1000) + (1 * 1000000h) +DD (OP_b0ba - OP_1000) + (1 * 1000000h) +DD (OP_b0bb - OP_1000) + (1 * 1000000h) +DD (OP_b0bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b0c0 - OP_1000) + (16 * 1000000h) +DD (OP_b0d0 - OP_1000) + (8 * 1000000h) +DD (OP_b0d8 - OP_1000) + (8 * 1000000h) +DD (OP_b0e0 - OP_1000) + (8 * 1000000h) +DD (OP_b0e8 - OP_1000) + (8 * 1000000h) +DD (OP_b0f0 - OP_1000) + (8 * 1000000h) +DD (OP_b0f8 - OP_1000) + (1 * 1000000h) +DD (OP_b0f9 - OP_1000) + (1 * 1000000h) +DD (OP_b0fa - OP_1000) + (1 * 1000000h) +DD (OP_b0fb - OP_1000) + (1 * 1000000h) +DD (OP_b0fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b100 - OP_1000) + (8 * 1000000h) +DD (OP_b108 - OP_1000) + (8 * 1000000h) +DD (OP_b110 - OP_1000) + (8 * 1000000h) +DD (OP_b118 - OP_1000) + (7 * 1000000h) +DD (OP_b11f - OP_1000) + (1 * 1000000h) +DD (OP_b120 - OP_1000) + (7 * 1000000h) +DD (OP_b127 - OP_1000) + (1 * 1000000h) +DD (OP_b128 - OP_1000) + (8 * 1000000h) +DD (OP_b130 - OP_1000) + (8 * 1000000h) +DD (OP_b138 - OP_1000) + (1 * 1000000h) +DD (OP_b139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_b140 - OP_1000) + (8 * 1000000h) +DD (OP_b148 - OP_1000) + (8 * 1000000h) +DD (OP_b150 - OP_1000) + (8 * 1000000h) +DD (OP_b158 - OP_1000) + (8 * 1000000h) +DD (OP_b160 - OP_1000) + (8 * 1000000h) +DD (OP_b168 - OP_1000) + (8 * 1000000h) +DD (OP_b170 - OP_1000) + (8 * 1000000h) +DD (OP_b178 - OP_1000) + (1 * 1000000h) +DD (OP_b179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_b180 - OP_1000) + (8 * 1000000h) +DD (OP_b188 - OP_1000) + (8 * 1000000h) +DD (OP_b190 - OP_1000) + (8 * 1000000h) +DD (OP_b198 - OP_1000) + (8 * 1000000h) +DD (OP_b1a0 - OP_1000) + (8 * 1000000h) +DD (OP_b1a8 - OP_1000) + (8 * 1000000h) +DD (OP_b1b0 - OP_1000) + (8 * 1000000h) +DD (OP_b1b8 - OP_1000) + (1 * 1000000h) +DD (OP_b1b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_b1c0 - OP_1000) + (16 * 1000000h) +DD (OP_b1d0 - OP_1000) + (8 * 1000000h) +DD (OP_b1d8 - OP_1000) + (8 * 1000000h) +DD (OP_b1e0 - OP_1000) + (8 * 1000000h) +DD (OP_b1e8 - OP_1000) + (8 * 1000000h) +DD (OP_b1f0 - OP_1000) + (8 * 1000000h) +DD (OP_b1f8 - OP_1000) + (1 * 1000000h) +DD (OP_b1f9 - OP_1000) + (1 * 1000000h) +DD (OP_b1fa - OP_1000) + (1 * 1000000h) +DD (OP_b1fb - OP_1000) + (1 * 1000000h) +DD (OP_b1fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b000 - OP_1000) + (16 * 1000000h) +DD (OP_b010 - OP_1000) + (8 * 1000000h) +DD (OP_b018 - OP_1000) + (7 * 1000000h) +DD (OP_b01f - OP_1000) + (1 * 1000000h) +DD (OP_b020 - OP_1000) + (7 * 1000000h) +DD (OP_b027 - OP_1000) + (1 * 1000000h) +DD (OP_b028 - OP_1000) + (8 * 1000000h) +DD (OP_b030 - OP_1000) + (8 * 1000000h) +DD (OP_b038 - OP_1000) + (1 * 1000000h) +DD (OP_b039 - OP_1000) + (1 * 1000000h) +DD (OP_b03a - OP_1000) + (1 * 1000000h) +DD (OP_b03b - OP_1000) + (1 * 1000000h) +DD (OP_b03c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b040 - OP_1000) + (16 * 1000000h) +DD (OP_b050 - OP_1000) + (8 * 1000000h) +DD (OP_b058 - OP_1000) + (8 * 1000000h) +DD (OP_b060 - OP_1000) + (8 * 1000000h) +DD (OP_b068 - OP_1000) + (8 * 1000000h) +DD (OP_b070 - OP_1000) + (8 * 1000000h) +DD (OP_b078 - OP_1000) + (1 * 1000000h) +DD (OP_b079 - OP_1000) + (1 * 1000000h) +DD (OP_b07a - OP_1000) + (1 * 1000000h) +DD (OP_b07b - OP_1000) + (1 * 1000000h) +DD (OP_b07c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b080 - OP_1000) + (16 * 1000000h) +DD (OP_b090 - OP_1000) + (8 * 1000000h) +DD (OP_b098 - OP_1000) + (8 * 1000000h) +DD (OP_b0a0 - OP_1000) + (8 * 1000000h) +DD (OP_b0a8 - OP_1000) + (8 * 1000000h) +DD (OP_b0b0 - OP_1000) + (8 * 1000000h) +DD (OP_b0b8 - OP_1000) + (1 * 1000000h) +DD (OP_b0b9 - OP_1000) + (1 * 1000000h) +DD (OP_b0ba - OP_1000) + (1 * 1000000h) +DD (OP_b0bb - OP_1000) + (1 * 1000000h) +DD (OP_b0bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b0c0 - OP_1000) + (16 * 1000000h) +DD (OP_b0d0 - OP_1000) + (8 * 1000000h) +DD (OP_b0d8 - OP_1000) + (8 * 1000000h) +DD (OP_b0e0 - OP_1000) + (8 * 1000000h) +DD (OP_b0e8 - OP_1000) + (8 * 1000000h) +DD (OP_b0f0 - OP_1000) + (8 * 1000000h) +DD (OP_b0f8 - OP_1000) + (1 * 1000000h) +DD (OP_b0f9 - OP_1000) + (1 * 1000000h) +DD (OP_b0fa - OP_1000) + (1 * 1000000h) +DD (OP_b0fb - OP_1000) + (1 * 1000000h) +DD (OP_b0fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b100 - OP_1000) + (8 * 1000000h) +DD (OP_b108 - OP_1000) + (8 * 1000000h) +DD (OP_b110 - OP_1000) + (8 * 1000000h) +DD (OP_b118 - OP_1000) + (7 * 1000000h) +DD (OP_b11f - OP_1000) + (1 * 1000000h) +DD (OP_b120 - OP_1000) + (7 * 1000000h) +DD (OP_b127 - OP_1000) + (1 * 1000000h) +DD (OP_b128 - OP_1000) + (8 * 1000000h) +DD (OP_b130 - OP_1000) + (8 * 1000000h) +DD (OP_b138 - OP_1000) + (1 * 1000000h) +DD (OP_b139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_b140 - OP_1000) + (8 * 1000000h) +DD (OP_b148 - OP_1000) + (8 * 1000000h) +DD (OP_b150 - OP_1000) + (8 * 1000000h) +DD (OP_b158 - OP_1000) + (8 * 1000000h) +DD (OP_b160 - OP_1000) + (8 * 1000000h) +DD (OP_b168 - OP_1000) + (8 * 1000000h) +DD (OP_b170 - OP_1000) + (8 * 1000000h) +DD (OP_b178 - OP_1000) + (1 * 1000000h) +DD (OP_b179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_b180 - OP_1000) + (8 * 1000000h) +DD (OP_b188 - OP_1000) + (8 * 1000000h) +DD (OP_b190 - OP_1000) + (8 * 1000000h) +DD (OP_b198 - OP_1000) + (8 * 1000000h) +DD (OP_b1a0 - OP_1000) + (8 * 1000000h) +DD (OP_b1a8 - OP_1000) + (8 * 1000000h) +DD (OP_b1b0 - OP_1000) + (8 * 1000000h) +DD (OP_b1b8 - OP_1000) + (1 * 1000000h) +DD (OP_b1b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_b1c0 - OP_1000) + (16 * 1000000h) +DD (OP_b1d0 - OP_1000) + (8 * 1000000h) +DD (OP_b1d8 - OP_1000) + (8 * 1000000h) +DD (OP_b1e0 - OP_1000) + (8 * 1000000h) +DD (OP_b1e8 - OP_1000) + (8 * 1000000h) +DD (OP_b1f0 - OP_1000) + (8 * 1000000h) +DD (OP_b1f8 - OP_1000) + (1 * 1000000h) +DD (OP_b1f9 - OP_1000) + (1 * 1000000h) +DD (OP_b1fa - OP_1000) + (1 * 1000000h) +DD (OP_b1fb - OP_1000) + (1 * 1000000h) +DD (OP_b1fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b000 - OP_1000) + (16 * 1000000h) +DD (OP_b010 - OP_1000) + (8 * 1000000h) +DD (OP_b018 - OP_1000) + (7 * 1000000h) +DD (OP_b01f - OP_1000) + (1 * 1000000h) +DD (OP_b020 - OP_1000) + (7 * 1000000h) +DD (OP_b027 - OP_1000) + (1 * 1000000h) +DD (OP_b028 - OP_1000) + (8 * 1000000h) +DD (OP_b030 - OP_1000) + (8 * 1000000h) +DD (OP_b038 - OP_1000) + (1 * 1000000h) +DD (OP_b039 - OP_1000) + (1 * 1000000h) +DD (OP_b03a - OP_1000) + (1 * 1000000h) +DD (OP_b03b - OP_1000) + (1 * 1000000h) +DD (OP_b03c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b040 - OP_1000) + (16 * 1000000h) +DD (OP_b050 - OP_1000) + (8 * 1000000h) +DD (OP_b058 - OP_1000) + (8 * 1000000h) +DD (OP_b060 - OP_1000) + (8 * 1000000h) +DD (OP_b068 - OP_1000) + (8 * 1000000h) +DD (OP_b070 - OP_1000) + (8 * 1000000h) +DD (OP_b078 - OP_1000) + (1 * 1000000h) +DD (OP_b079 - OP_1000) + (1 * 1000000h) +DD (OP_b07a - OP_1000) + (1 * 1000000h) +DD (OP_b07b - OP_1000) + (1 * 1000000h) +DD (OP_b07c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b080 - OP_1000) + (16 * 1000000h) +DD (OP_b090 - OP_1000) + (8 * 1000000h) +DD (OP_b098 - OP_1000) + (8 * 1000000h) +DD (OP_b0a0 - OP_1000) + (8 * 1000000h) +DD (OP_b0a8 - OP_1000) + (8 * 1000000h) +DD (OP_b0b0 - OP_1000) + (8 * 1000000h) +DD (OP_b0b8 - OP_1000) + (1 * 1000000h) +DD (OP_b0b9 - OP_1000) + (1 * 1000000h) +DD (OP_b0ba - OP_1000) + (1 * 1000000h) +DD (OP_b0bb - OP_1000) + (1 * 1000000h) +DD (OP_b0bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b0c0 - OP_1000) + (16 * 1000000h) +DD (OP_b0d0 - OP_1000) + (8 * 1000000h) +DD (OP_b0d8 - OP_1000) + (8 * 1000000h) +DD (OP_b0e0 - OP_1000) + (8 * 1000000h) +DD (OP_b0e8 - OP_1000) + (8 * 1000000h) +DD (OP_b0f0 - OP_1000) + (8 * 1000000h) +DD (OP_b0f8 - OP_1000) + (1 * 1000000h) +DD (OP_b0f9 - OP_1000) + (1 * 1000000h) +DD (OP_b0fa - OP_1000) + (1 * 1000000h) +DD (OP_b0fb - OP_1000) + (1 * 1000000h) +DD (OP_b0fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b100 - OP_1000) + (8 * 1000000h) +DD (OP_b108 - OP_1000) + (8 * 1000000h) +DD (OP_b110 - OP_1000) + (8 * 1000000h) +DD (OP_b118 - OP_1000) + (7 * 1000000h) +DD (OP_b11f - OP_1000) + (1 * 1000000h) +DD (OP_b120 - OP_1000) + (7 * 1000000h) +DD (OP_b127 - OP_1000) + (1 * 1000000h) +DD (OP_b128 - OP_1000) + (8 * 1000000h) +DD (OP_b130 - OP_1000) + (8 * 1000000h) +DD (OP_b138 - OP_1000) + (1 * 1000000h) +DD (OP_b139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_b140 - OP_1000) + (8 * 1000000h) +DD (OP_b148 - OP_1000) + (8 * 1000000h) +DD (OP_b150 - OP_1000) + (8 * 1000000h) +DD (OP_b158 - OP_1000) + (8 * 1000000h) +DD (OP_b160 - OP_1000) + (8 * 1000000h) +DD (OP_b168 - OP_1000) + (8 * 1000000h) +DD (OP_b170 - OP_1000) + (8 * 1000000h) +DD (OP_b178 - OP_1000) + (1 * 1000000h) +DD (OP_b179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_b180 - OP_1000) + (8 * 1000000h) +DD (OP_b188 - OP_1000) + (8 * 1000000h) +DD (OP_b190 - OP_1000) + (8 * 1000000h) +DD (OP_b198 - OP_1000) + (8 * 1000000h) +DD (OP_b1a0 - OP_1000) + (8 * 1000000h) +DD (OP_b1a8 - OP_1000) + (8 * 1000000h) +DD (OP_b1b0 - OP_1000) + (8 * 1000000h) +DD (OP_b1b8 - OP_1000) + (1 * 1000000h) +DD (OP_b1b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_b1c0 - OP_1000) + (16 * 1000000h) +DD (OP_b1d0 - OP_1000) + (8 * 1000000h) +DD (OP_b1d8 - OP_1000) + (8 * 1000000h) +DD (OP_b1e0 - OP_1000) + (8 * 1000000h) +DD (OP_b1e8 - OP_1000) + (8 * 1000000h) +DD (OP_b1f0 - OP_1000) + (8 * 1000000h) +DD (OP_b1f8 - OP_1000) + (1 * 1000000h) +DD (OP_b1f9 - OP_1000) + (1 * 1000000h) +DD (OP_b1fa - OP_1000) + (1 * 1000000h) +DD (OP_b1fb - OP_1000) + (1 * 1000000h) +DD (OP_b1fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b000 - OP_1000) + (16 * 1000000h) +DD (OP_b010 - OP_1000) + (8 * 1000000h) +DD (OP_b018 - OP_1000) + (7 * 1000000h) +DD (OP_b01f - OP_1000) + (1 * 1000000h) +DD (OP_b020 - OP_1000) + (7 * 1000000h) +DD (OP_b027 - OP_1000) + (1 * 1000000h) +DD (OP_b028 - OP_1000) + (8 * 1000000h) +DD (OP_b030 - OP_1000) + (8 * 1000000h) +DD (OP_b038 - OP_1000) + (1 * 1000000h) +DD (OP_b039 - OP_1000) + (1 * 1000000h) +DD (OP_b03a - OP_1000) + (1 * 1000000h) +DD (OP_b03b - OP_1000) + (1 * 1000000h) +DD (OP_b03c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b040 - OP_1000) + (16 * 1000000h) +DD (OP_b050 - OP_1000) + (8 * 1000000h) +DD (OP_b058 - OP_1000) + (8 * 1000000h) +DD (OP_b060 - OP_1000) + (8 * 1000000h) +DD (OP_b068 - OP_1000) + (8 * 1000000h) +DD (OP_b070 - OP_1000) + (8 * 1000000h) +DD (OP_b078 - OP_1000) + (1 * 1000000h) +DD (OP_b079 - OP_1000) + (1 * 1000000h) +DD (OP_b07a - OP_1000) + (1 * 1000000h) +DD (OP_b07b - OP_1000) + (1 * 1000000h) +DD (OP_b07c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b080 - OP_1000) + (16 * 1000000h) +DD (OP_b090 - OP_1000) + (8 * 1000000h) +DD (OP_b098 - OP_1000) + (8 * 1000000h) +DD (OP_b0a0 - OP_1000) + (8 * 1000000h) +DD (OP_b0a8 - OP_1000) + (8 * 1000000h) +DD (OP_b0b0 - OP_1000) + (8 * 1000000h) +DD (OP_b0b8 - OP_1000) + (1 * 1000000h) +DD (OP_b0b9 - OP_1000) + (1 * 1000000h) +DD (OP_b0ba - OP_1000) + (1 * 1000000h) +DD (OP_b0bb - OP_1000) + (1 * 1000000h) +DD (OP_b0bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b0c0 - OP_1000) + (16 * 1000000h) +DD (OP_b0d0 - OP_1000) + (8 * 1000000h) +DD (OP_b0d8 - OP_1000) + (8 * 1000000h) +DD (OP_b0e0 - OP_1000) + (8 * 1000000h) +DD (OP_b0e8 - OP_1000) + (8 * 1000000h) +DD (OP_b0f0 - OP_1000) + (8 * 1000000h) +DD (OP_b0f8 - OP_1000) + (1 * 1000000h) +DD (OP_b0f9 - OP_1000) + (1 * 1000000h) +DD (OP_b0fa - OP_1000) + (1 * 1000000h) +DD (OP_b0fb - OP_1000) + (1 * 1000000h) +DD (OP_b0fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b100 - OP_1000) + (8 * 1000000h) +DD (OP_b108 - OP_1000) + (8 * 1000000h) +DD (OP_b110 - OP_1000) + (8 * 1000000h) +DD (OP_b118 - OP_1000) + (7 * 1000000h) +DD (OP_b11f - OP_1000) + (1 * 1000000h) +DD (OP_b120 - OP_1000) + (7 * 1000000h) +DD (OP_b127 - OP_1000) + (1 * 1000000h) +DD (OP_b128 - OP_1000) + (8 * 1000000h) +DD (OP_b130 - OP_1000) + (8 * 1000000h) +DD (OP_b138 - OP_1000) + (1 * 1000000h) +DD (OP_b139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_b140 - OP_1000) + (8 * 1000000h) +DD (OP_b148 - OP_1000) + (8 * 1000000h) +DD (OP_b150 - OP_1000) + (8 * 1000000h) +DD (OP_b158 - OP_1000) + (8 * 1000000h) +DD (OP_b160 - OP_1000) + (8 * 1000000h) +DD (OP_b168 - OP_1000) + (8 * 1000000h) +DD (OP_b170 - OP_1000) + (8 * 1000000h) +DD (OP_b178 - OP_1000) + (1 * 1000000h) +DD (OP_b179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_b180 - OP_1000) + (8 * 1000000h) +DD (OP_b188 - OP_1000) + (8 * 1000000h) +DD (OP_b190 - OP_1000) + (8 * 1000000h) +DD (OP_b198 - OP_1000) + (8 * 1000000h) +DD (OP_b1a0 - OP_1000) + (8 * 1000000h) +DD (OP_b1a8 - OP_1000) + (8 * 1000000h) +DD (OP_b1b0 - OP_1000) + (8 * 1000000h) +DD (OP_b1b8 - OP_1000) + (1 * 1000000h) +DD (OP_b1b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_b1c0 - OP_1000) + (16 * 1000000h) +DD (OP_b1d0 - OP_1000) + (8 * 1000000h) +DD (OP_b1d8 - OP_1000) + (8 * 1000000h) +DD (OP_b1e0 - OP_1000) + (8 * 1000000h) +DD (OP_b1e8 - OP_1000) + (8 * 1000000h) +DD (OP_b1f0 - OP_1000) + (8 * 1000000h) +DD (OP_b1f8 - OP_1000) + (1 * 1000000h) +DD (OP_b1f9 - OP_1000) + (1 * 1000000h) +DD (OP_b1fa - OP_1000) + (1 * 1000000h) +DD (OP_b1fb - OP_1000) + (1 * 1000000h) +DD (OP_b1fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b000 - OP_1000) + (16 * 1000000h) +DD (OP_b010 - OP_1000) + (8 * 1000000h) +DD (OP_b018 - OP_1000) + (7 * 1000000h) +DD (OP_b01f - OP_1000) + (1 * 1000000h) +DD (OP_b020 - OP_1000) + (7 * 1000000h) +DD (OP_b027 - OP_1000) + (1 * 1000000h) +DD (OP_b028 - OP_1000) + (8 * 1000000h) +DD (OP_b030 - OP_1000) + (8 * 1000000h) +DD (OP_b038 - OP_1000) + (1 * 1000000h) +DD (OP_b039 - OP_1000) + (1 * 1000000h) +DD (OP_b03a - OP_1000) + (1 * 1000000h) +DD (OP_b03b - OP_1000) + (1 * 1000000h) +DD (OP_b03c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b040 - OP_1000) + (16 * 1000000h) +DD (OP_b050 - OP_1000) + (8 * 1000000h) +DD (OP_b058 - OP_1000) + (8 * 1000000h) +DD (OP_b060 - OP_1000) + (8 * 1000000h) +DD (OP_b068 - OP_1000) + (8 * 1000000h) +DD (OP_b070 - OP_1000) + (8 * 1000000h) +DD (OP_b078 - OP_1000) + (1 * 1000000h) +DD (OP_b079 - OP_1000) + (1 * 1000000h) +DD (OP_b07a - OP_1000) + (1 * 1000000h) +DD (OP_b07b - OP_1000) + (1 * 1000000h) +DD (OP_b07c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b080 - OP_1000) + (16 * 1000000h) +DD (OP_b090 - OP_1000) + (8 * 1000000h) +DD (OP_b098 - OP_1000) + (8 * 1000000h) +DD (OP_b0a0 - OP_1000) + (8 * 1000000h) +DD (OP_b0a8 - OP_1000) + (8 * 1000000h) +DD (OP_b0b0 - OP_1000) + (8 * 1000000h) +DD (OP_b0b8 - OP_1000) + (1 * 1000000h) +DD (OP_b0b9 - OP_1000) + (1 * 1000000h) +DD (OP_b0ba - OP_1000) + (1 * 1000000h) +DD (OP_b0bb - OP_1000) + (1 * 1000000h) +DD (OP_b0bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b0c0 - OP_1000) + (16 * 1000000h) +DD (OP_b0d0 - OP_1000) + (8 * 1000000h) +DD (OP_b0d8 - OP_1000) + (8 * 1000000h) +DD (OP_b0e0 - OP_1000) + (8 * 1000000h) +DD (OP_b0e8 - OP_1000) + (8 * 1000000h) +DD (OP_b0f0 - OP_1000) + (8 * 1000000h) +DD (OP_b0f8 - OP_1000) + (1 * 1000000h) +DD (OP_b0f9 - OP_1000) + (1 * 1000000h) +DD (OP_b0fa - OP_1000) + (1 * 1000000h) +DD (OP_b0fb - OP_1000) + (1 * 1000000h) +DD (OP_b0fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_b100 - OP_1000) + (8 * 1000000h) +DD (OP_b108 - OP_1000) + (8 * 1000000h) +DD (OP_b110 - OP_1000) + (8 * 1000000h) +DD (OP_b118 - OP_1000) + (7 * 1000000h) +DD (OP_b11f - OP_1000) + (1 * 1000000h) +DD (OP_b120 - OP_1000) + (7 * 1000000h) +DD (OP_b127 - OP_1000) + (1 * 1000000h) +DD (OP_b128 - OP_1000) + (8 * 1000000h) +DD (OP_b130 - OP_1000) + (8 * 1000000h) +DD (OP_b138 - OP_1000) + (1 * 1000000h) +DD (OP_b139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_b140 - OP_1000) + (8 * 1000000h) +DD (OP_b148 - OP_1000) + (8 * 1000000h) +DD (OP_b150 - OP_1000) + (8 * 1000000h) +DD (OP_b158 - OP_1000) + (8 * 1000000h) +DD (OP_b160 - OP_1000) + (8 * 1000000h) +DD (OP_b168 - OP_1000) + (8 * 1000000h) +DD (OP_b170 - OP_1000) + (8 * 1000000h) +DD (OP_b178 - OP_1000) + (1 * 1000000h) +DD (OP_b179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_b180 - OP_1000) + (8 * 1000000h) +DD (OP_b188 - OP_1000) + (8 * 1000000h) +DD (OP_b190 - OP_1000) + (8 * 1000000h) +DD (OP_b198 - OP_1000) + (8 * 1000000h) +DD (OP_b1a0 - OP_1000) + (8 * 1000000h) +DD (OP_b1a8 - OP_1000) + (8 * 1000000h) +DD (OP_b1b0 - OP_1000) + (8 * 1000000h) +DD (OP_b1b8 - OP_1000) + (1 * 1000000h) +DD (OP_b1b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_b1c0 - OP_1000) + (16 * 1000000h) +DD (OP_b1d0 - OP_1000) + (8 * 1000000h) +DD (OP_b1d8 - OP_1000) + (8 * 1000000h) +DD (OP_b1e0 - OP_1000) + (8 * 1000000h) +DD (OP_b1e8 - OP_1000) + (8 * 1000000h) +DD (OP_b1f0 - OP_1000) + (8 * 1000000h) +DD (OP_b1f8 - OP_1000) + (1 * 1000000h) +DD (OP_b1f9 - OP_1000) + (1 * 1000000h) +DD (OP_b1fa - OP_1000) + (1 * 1000000h) +DD (OP_b1fb - OP_1000) + (1 * 1000000h) +DD (OP_b1fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c010 - OP_1000) + (8 * 1000000h) +DD (OP_c018 - OP_1000) + (7 * 1000000h) +DD (OP_c01f - OP_1000) + (1 * 1000000h) +DD (OP_c020 - OP_1000) + (7 * 1000000h) +DD (OP_c027 - OP_1000) + (1 * 1000000h) +DD (OP_c028 - OP_1000) + (8 * 1000000h) +DD (OP_c030 - OP_1000) + (8 * 1000000h) +DD (OP_c038 - OP_1000) + (1 * 1000000h) +DD (OP_c039 - OP_1000) + (1 * 1000000h) +DD (OP_c03a - OP_1000) + (1 * 1000000h) +DD (OP_c03b - OP_1000) + (1 * 1000000h) +DD (OP_c03c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c040 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c050 - OP_1000) + (8 * 1000000h) +DD (OP_c058 - OP_1000) + (8 * 1000000h) +DD (OP_c060 - OP_1000) + (8 * 1000000h) +DD (OP_c068 - OP_1000) + (8 * 1000000h) +DD (OP_c070 - OP_1000) + (8 * 1000000h) +DD (OP_c078 - OP_1000) + (1 * 1000000h) +DD (OP_c079 - OP_1000) + (1 * 1000000h) +DD (OP_c07a - OP_1000) + (1 * 1000000h) +DD (OP_c07b - OP_1000) + (1 * 1000000h) +DD (OP_c07c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c080 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c090 - OP_1000) + (8 * 1000000h) +DD (OP_c098 - OP_1000) + (8 * 1000000h) +DD (OP_c0a0 - OP_1000) + (8 * 1000000h) +DD (OP_c0a8 - OP_1000) + (8 * 1000000h) +DD (OP_c0b0 - OP_1000) + (8 * 1000000h) +DD (OP_c0b8 - OP_1000) + (1 * 1000000h) +DD (OP_c0b9 - OP_1000) + (1 * 1000000h) +DD (OP_c0ba - OP_1000) + (1 * 1000000h) +DD (OP_c0bb - OP_1000) + (1 * 1000000h) +DD (OP_c0bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c0c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c0d0 - OP_1000) + (8 * 1000000h) +DD (OP_c0d8 - OP_1000) + (8 * 1000000h) +DD (OP_c0e0 - OP_1000) + (8 * 1000000h) +DD (OP_c0e8 - OP_1000) + (8 * 1000000h) +DD (OP_c0f0 - OP_1000) + (8 * 1000000h) +DD (OP_c0f8 - OP_1000) + (1 * 1000000h) +DD (OP_c0f9 - OP_1000) + (1 * 1000000h) +DD (OP_c0fa - OP_1000) + (1 * 1000000h) +DD (OP_c0fb - OP_1000) + (1 * 1000000h) +DD (OP_c0fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c100 - OP_1000) + (8 * 1000000h) +DD (OP_c108 - OP_1000) + (8 * 1000000h) +DD (OP_c110 - OP_1000) + (8 * 1000000h) +DD (OP_c118 - OP_1000) + (7 * 1000000h) +DD (OP_c11f - OP_1000) + (1 * 1000000h) +DD (OP_c120 - OP_1000) + (7 * 1000000h) +DD (OP_c127 - OP_1000) + (1 * 1000000h) +DD (OP_c128 - OP_1000) + (8 * 1000000h) +DD (OP_c130 - OP_1000) + (8 * 1000000h) +DD (OP_c138 - OP_1000) + (1 * 1000000h) +DD (OP_c139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_c140 - OP_1000) + (8 * 1000000h) +DD (OP_c148 - OP_1000) + (8 * 1000000h) +DD (OP_c150 - OP_1000) + (8 * 1000000h) +DD (OP_c158 - OP_1000) + (8 * 1000000h) +DD (OP_c160 - OP_1000) + (8 * 1000000h) +DD (OP_c168 - OP_1000) + (8 * 1000000h) +DD (OP_c170 - OP_1000) + (8 * 1000000h) +DD (OP_c178 - OP_1000) + (1 * 1000000h) +DD (OP_c179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (14 * 1000000h) +DD (OP_c188 - OP_1000) + (8 * 1000000h) +DD (OP_c190 - OP_1000) + (8 * 1000000h) +DD (OP_c198 - OP_1000) + (8 * 1000000h) +DD (OP_c1a0 - OP_1000) + (8 * 1000000h) +DD (OP_c1a8 - OP_1000) + (8 * 1000000h) +DD (OP_c1b0 - OP_1000) + (8 * 1000000h) +DD (OP_c1b8 - OP_1000) + (1 * 1000000h) +DD (OP_c1b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_c1c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c1d0 - OP_1000) + (8 * 1000000h) +DD (OP_c1d8 - OP_1000) + (8 * 1000000h) +DD (OP_c1e0 - OP_1000) + (8 * 1000000h) +DD (OP_c1e8 - OP_1000) + (8 * 1000000h) +DD (OP_c1f0 - OP_1000) + (8 * 1000000h) +DD (OP_c1f8 - OP_1000) + (1 * 1000000h) +DD (OP_c1f9 - OP_1000) + (1 * 1000000h) +DD (OP_c1fa - OP_1000) + (1 * 1000000h) +DD (OP_c1fb - OP_1000) + (1 * 1000000h) +DD (OP_c1fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c010 - OP_1000) + (8 * 1000000h) +DD (OP_c018 - OP_1000) + (7 * 1000000h) +DD (OP_c01f - OP_1000) + (1 * 1000000h) +DD (OP_c020 - OP_1000) + (7 * 1000000h) +DD (OP_c027 - OP_1000) + (1 * 1000000h) +DD (OP_c028 - OP_1000) + (8 * 1000000h) +DD (OP_c030 - OP_1000) + (8 * 1000000h) +DD (OP_c038 - OP_1000) + (1 * 1000000h) +DD (OP_c039 - OP_1000) + (1 * 1000000h) +DD (OP_c03a - OP_1000) + (1 * 1000000h) +DD (OP_c03b - OP_1000) + (1 * 1000000h) +DD (OP_c03c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c040 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c050 - OP_1000) + (8 * 1000000h) +DD (OP_c058 - OP_1000) + (8 * 1000000h) +DD (OP_c060 - OP_1000) + (8 * 1000000h) +DD (OP_c068 - OP_1000) + (8 * 1000000h) +DD (OP_c070 - OP_1000) + (8 * 1000000h) +DD (OP_c078 - OP_1000) + (1 * 1000000h) +DD (OP_c079 - OP_1000) + (1 * 1000000h) +DD (OP_c07a - OP_1000) + (1 * 1000000h) +DD (OP_c07b - OP_1000) + (1 * 1000000h) +DD (OP_c07c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c080 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c090 - OP_1000) + (8 * 1000000h) +DD (OP_c098 - OP_1000) + (8 * 1000000h) +DD (OP_c0a0 - OP_1000) + (8 * 1000000h) +DD (OP_c0a8 - OP_1000) + (8 * 1000000h) +DD (OP_c0b0 - OP_1000) + (8 * 1000000h) +DD (OP_c0b8 - OP_1000) + (1 * 1000000h) +DD (OP_c0b9 - OP_1000) + (1 * 1000000h) +DD (OP_c0ba - OP_1000) + (1 * 1000000h) +DD (OP_c0bb - OP_1000) + (1 * 1000000h) +DD (OP_c0bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c0c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c0d0 - OP_1000) + (8 * 1000000h) +DD (OP_c0d8 - OP_1000) + (8 * 1000000h) +DD (OP_c0e0 - OP_1000) + (8 * 1000000h) +DD (OP_c0e8 - OP_1000) + (8 * 1000000h) +DD (OP_c0f0 - OP_1000) + (8 * 1000000h) +DD (OP_c0f8 - OP_1000) + (1 * 1000000h) +DD (OP_c0f9 - OP_1000) + (1 * 1000000h) +DD (OP_c0fa - OP_1000) + (1 * 1000000h) +DD (OP_c0fb - OP_1000) + (1 * 1000000h) +DD (OP_c0fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c100 - OP_1000) + (8 * 1000000h) +DD (OP_c108 - OP_1000) + (8 * 1000000h) +DD (OP_c110 - OP_1000) + (8 * 1000000h) +DD (OP_c118 - OP_1000) + (7 * 1000000h) +DD (OP_c11f - OP_1000) + (1 * 1000000h) +DD (OP_c120 - OP_1000) + (7 * 1000000h) +DD (OP_c127 - OP_1000) + (1 * 1000000h) +DD (OP_c128 - OP_1000) + (8 * 1000000h) +DD (OP_c130 - OP_1000) + (8 * 1000000h) +DD (OP_c138 - OP_1000) + (1 * 1000000h) +DD (OP_c139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_c140 - OP_1000) + (8 * 1000000h) +DD (OP_c148 - OP_1000) + (8 * 1000000h) +DD (OP_c150 - OP_1000) + (8 * 1000000h) +DD (OP_c158 - OP_1000) + (8 * 1000000h) +DD (OP_c160 - OP_1000) + (8 * 1000000h) +DD (OP_c168 - OP_1000) + (8 * 1000000h) +DD (OP_c170 - OP_1000) + (8 * 1000000h) +DD (OP_c178 - OP_1000) + (1 * 1000000h) +DD (OP_c179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (14 * 1000000h) +DD (OP_c188 - OP_1000) + (8 * 1000000h) +DD (OP_c190 - OP_1000) + (8 * 1000000h) +DD (OP_c198 - OP_1000) + (8 * 1000000h) +DD (OP_c1a0 - OP_1000) + (8 * 1000000h) +DD (OP_c1a8 - OP_1000) + (8 * 1000000h) +DD (OP_c1b0 - OP_1000) + (8 * 1000000h) +DD (OP_c1b8 - OP_1000) + (1 * 1000000h) +DD (OP_c1b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_c1c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c1d0 - OP_1000) + (8 * 1000000h) +DD (OP_c1d8 - OP_1000) + (8 * 1000000h) +DD (OP_c1e0 - OP_1000) + (8 * 1000000h) +DD (OP_c1e8 - OP_1000) + (8 * 1000000h) +DD (OP_c1f0 - OP_1000) + (8 * 1000000h) +DD (OP_c1f8 - OP_1000) + (1 * 1000000h) +DD (OP_c1f9 - OP_1000) + (1 * 1000000h) +DD (OP_c1fa - OP_1000) + (1 * 1000000h) +DD (OP_c1fb - OP_1000) + (1 * 1000000h) +DD (OP_c1fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c010 - OP_1000) + (8 * 1000000h) +DD (OP_c018 - OP_1000) + (7 * 1000000h) +DD (OP_c01f - OP_1000) + (1 * 1000000h) +DD (OP_c020 - OP_1000) + (7 * 1000000h) +DD (OP_c027 - OP_1000) + (1 * 1000000h) +DD (OP_c028 - OP_1000) + (8 * 1000000h) +DD (OP_c030 - OP_1000) + (8 * 1000000h) +DD (OP_c038 - OP_1000) + (1 * 1000000h) +DD (OP_c039 - OP_1000) + (1 * 1000000h) +DD (OP_c03a - OP_1000) + (1 * 1000000h) +DD (OP_c03b - OP_1000) + (1 * 1000000h) +DD (OP_c03c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c040 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c050 - OP_1000) + (8 * 1000000h) +DD (OP_c058 - OP_1000) + (8 * 1000000h) +DD (OP_c060 - OP_1000) + (8 * 1000000h) +DD (OP_c068 - OP_1000) + (8 * 1000000h) +DD (OP_c070 - OP_1000) + (8 * 1000000h) +DD (OP_c078 - OP_1000) + (1 * 1000000h) +DD (OP_c079 - OP_1000) + (1 * 1000000h) +DD (OP_c07a - OP_1000) + (1 * 1000000h) +DD (OP_c07b - OP_1000) + (1 * 1000000h) +DD (OP_c07c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c080 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c090 - OP_1000) + (8 * 1000000h) +DD (OP_c098 - OP_1000) + (8 * 1000000h) +DD (OP_c0a0 - OP_1000) + (8 * 1000000h) +DD (OP_c0a8 - OP_1000) + (8 * 1000000h) +DD (OP_c0b0 - OP_1000) + (8 * 1000000h) +DD (OP_c0b8 - OP_1000) + (1 * 1000000h) +DD (OP_c0b9 - OP_1000) + (1 * 1000000h) +DD (OP_c0ba - OP_1000) + (1 * 1000000h) +DD (OP_c0bb - OP_1000) + (1 * 1000000h) +DD (OP_c0bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c0c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c0d0 - OP_1000) + (8 * 1000000h) +DD (OP_c0d8 - OP_1000) + (8 * 1000000h) +DD (OP_c0e0 - OP_1000) + (8 * 1000000h) +DD (OP_c0e8 - OP_1000) + (8 * 1000000h) +DD (OP_c0f0 - OP_1000) + (8 * 1000000h) +DD (OP_c0f8 - OP_1000) + (1 * 1000000h) +DD (OP_c0f9 - OP_1000) + (1 * 1000000h) +DD (OP_c0fa - OP_1000) + (1 * 1000000h) +DD (OP_c0fb - OP_1000) + (1 * 1000000h) +DD (OP_c0fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c100 - OP_1000) + (8 * 1000000h) +DD (OP_c108 - OP_1000) + (8 * 1000000h) +DD (OP_c110 - OP_1000) + (8 * 1000000h) +DD (OP_c118 - OP_1000) + (7 * 1000000h) +DD (OP_c11f - OP_1000) + (1 * 1000000h) +DD (OP_c120 - OP_1000) + (7 * 1000000h) +DD (OP_c127 - OP_1000) + (1 * 1000000h) +DD (OP_c128 - OP_1000) + (8 * 1000000h) +DD (OP_c130 - OP_1000) + (8 * 1000000h) +DD (OP_c138 - OP_1000) + (1 * 1000000h) +DD (OP_c139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_c140 - OP_1000) + (8 * 1000000h) +DD (OP_c148 - OP_1000) + (8 * 1000000h) +DD (OP_c150 - OP_1000) + (8 * 1000000h) +DD (OP_c158 - OP_1000) + (8 * 1000000h) +DD (OP_c160 - OP_1000) + (8 * 1000000h) +DD (OP_c168 - OP_1000) + (8 * 1000000h) +DD (OP_c170 - OP_1000) + (8 * 1000000h) +DD (OP_c178 - OP_1000) + (1 * 1000000h) +DD (OP_c179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (14 * 1000000h) +DD (OP_c188 - OP_1000) + (8 * 1000000h) +DD (OP_c190 - OP_1000) + (8 * 1000000h) +DD (OP_c198 - OP_1000) + (8 * 1000000h) +DD (OP_c1a0 - OP_1000) + (8 * 1000000h) +DD (OP_c1a8 - OP_1000) + (8 * 1000000h) +DD (OP_c1b0 - OP_1000) + (8 * 1000000h) +DD (OP_c1b8 - OP_1000) + (1 * 1000000h) +DD (OP_c1b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_c1c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c1d0 - OP_1000) + (8 * 1000000h) +DD (OP_c1d8 - OP_1000) + (8 * 1000000h) +DD (OP_c1e0 - OP_1000) + (8 * 1000000h) +DD (OP_c1e8 - OP_1000) + (8 * 1000000h) +DD (OP_c1f0 - OP_1000) + (8 * 1000000h) +DD (OP_c1f8 - OP_1000) + (1 * 1000000h) +DD (OP_c1f9 - OP_1000) + (1 * 1000000h) +DD (OP_c1fa - OP_1000) + (1 * 1000000h) +DD (OP_c1fb - OP_1000) + (1 * 1000000h) +DD (OP_c1fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c010 - OP_1000) + (8 * 1000000h) +DD (OP_c018 - OP_1000) + (7 * 1000000h) +DD (OP_c01f - OP_1000) + (1 * 1000000h) +DD (OP_c020 - OP_1000) + (7 * 1000000h) +DD (OP_c027 - OP_1000) + (1 * 1000000h) +DD (OP_c028 - OP_1000) + (8 * 1000000h) +DD (OP_c030 - OP_1000) + (8 * 1000000h) +DD (OP_c038 - OP_1000) + (1 * 1000000h) +DD (OP_c039 - OP_1000) + (1 * 1000000h) +DD (OP_c03a - OP_1000) + (1 * 1000000h) +DD (OP_c03b - OP_1000) + (1 * 1000000h) +DD (OP_c03c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c040 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c050 - OP_1000) + (8 * 1000000h) +DD (OP_c058 - OP_1000) + (8 * 1000000h) +DD (OP_c060 - OP_1000) + (8 * 1000000h) +DD (OP_c068 - OP_1000) + (8 * 1000000h) +DD (OP_c070 - OP_1000) + (8 * 1000000h) +DD (OP_c078 - OP_1000) + (1 * 1000000h) +DD (OP_c079 - OP_1000) + (1 * 1000000h) +DD (OP_c07a - OP_1000) + (1 * 1000000h) +DD (OP_c07b - OP_1000) + (1 * 1000000h) +DD (OP_c07c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c080 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c090 - OP_1000) + (8 * 1000000h) +DD (OP_c098 - OP_1000) + (8 * 1000000h) +DD (OP_c0a0 - OP_1000) + (8 * 1000000h) +DD (OP_c0a8 - OP_1000) + (8 * 1000000h) +DD (OP_c0b0 - OP_1000) + (8 * 1000000h) +DD (OP_c0b8 - OP_1000) + (1 * 1000000h) +DD (OP_c0b9 - OP_1000) + (1 * 1000000h) +DD (OP_c0ba - OP_1000) + (1 * 1000000h) +DD (OP_c0bb - OP_1000) + (1 * 1000000h) +DD (OP_c0bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c0c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c0d0 - OP_1000) + (8 * 1000000h) +DD (OP_c0d8 - OP_1000) + (8 * 1000000h) +DD (OP_c0e0 - OP_1000) + (8 * 1000000h) +DD (OP_c0e8 - OP_1000) + (8 * 1000000h) +DD (OP_c0f0 - OP_1000) + (8 * 1000000h) +DD (OP_c0f8 - OP_1000) + (1 * 1000000h) +DD (OP_c0f9 - OP_1000) + (1 * 1000000h) +DD (OP_c0fa - OP_1000) + (1 * 1000000h) +DD (OP_c0fb - OP_1000) + (1 * 1000000h) +DD (OP_c0fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c100 - OP_1000) + (8 * 1000000h) +DD (OP_c108 - OP_1000) + (8 * 1000000h) +DD (OP_c110 - OP_1000) + (8 * 1000000h) +DD (OP_c118 - OP_1000) + (7 * 1000000h) +DD (OP_c11f - OP_1000) + (1 * 1000000h) +DD (OP_c120 - OP_1000) + (7 * 1000000h) +DD (OP_c127 - OP_1000) + (1 * 1000000h) +DD (OP_c128 - OP_1000) + (8 * 1000000h) +DD (OP_c130 - OP_1000) + (8 * 1000000h) +DD (OP_c138 - OP_1000) + (1 * 1000000h) +DD (OP_c139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_c140 - OP_1000) + (8 * 1000000h) +DD (OP_c148 - OP_1000) + (8 * 1000000h) +DD (OP_c150 - OP_1000) + (8 * 1000000h) +DD (OP_c158 - OP_1000) + (8 * 1000000h) +DD (OP_c160 - OP_1000) + (8 * 1000000h) +DD (OP_c168 - OP_1000) + (8 * 1000000h) +DD (OP_c170 - OP_1000) + (8 * 1000000h) +DD (OP_c178 - OP_1000) + (1 * 1000000h) +DD (OP_c179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (14 * 1000000h) +DD (OP_c188 - OP_1000) + (8 * 1000000h) +DD (OP_c190 - OP_1000) + (8 * 1000000h) +DD (OP_c198 - OP_1000) + (8 * 1000000h) +DD (OP_c1a0 - OP_1000) + (8 * 1000000h) +DD (OP_c1a8 - OP_1000) + (8 * 1000000h) +DD (OP_c1b0 - OP_1000) + (8 * 1000000h) +DD (OP_c1b8 - OP_1000) + (1 * 1000000h) +DD (OP_c1b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_c1c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c1d0 - OP_1000) + (8 * 1000000h) +DD (OP_c1d8 - OP_1000) + (8 * 1000000h) +DD (OP_c1e0 - OP_1000) + (8 * 1000000h) +DD (OP_c1e8 - OP_1000) + (8 * 1000000h) +DD (OP_c1f0 - OP_1000) + (8 * 1000000h) +DD (OP_c1f8 - OP_1000) + (1 * 1000000h) +DD (OP_c1f9 - OP_1000) + (1 * 1000000h) +DD (OP_c1fa - OP_1000) + (1 * 1000000h) +DD (OP_c1fb - OP_1000) + (1 * 1000000h) +DD (OP_c1fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c010 - OP_1000) + (8 * 1000000h) +DD (OP_c018 - OP_1000) + (7 * 1000000h) +DD (OP_c01f - OP_1000) + (1 * 1000000h) +DD (OP_c020 - OP_1000) + (7 * 1000000h) +DD (OP_c027 - OP_1000) + (1 * 1000000h) +DD (OP_c028 - OP_1000) + (8 * 1000000h) +DD (OP_c030 - OP_1000) + (8 * 1000000h) +DD (OP_c038 - OP_1000) + (1 * 1000000h) +DD (OP_c039 - OP_1000) + (1 * 1000000h) +DD (OP_c03a - OP_1000) + (1 * 1000000h) +DD (OP_c03b - OP_1000) + (1 * 1000000h) +DD (OP_c03c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c040 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c050 - OP_1000) + (8 * 1000000h) +DD (OP_c058 - OP_1000) + (8 * 1000000h) +DD (OP_c060 - OP_1000) + (8 * 1000000h) +DD (OP_c068 - OP_1000) + (8 * 1000000h) +DD (OP_c070 - OP_1000) + (8 * 1000000h) +DD (OP_c078 - OP_1000) + (1 * 1000000h) +DD (OP_c079 - OP_1000) + (1 * 1000000h) +DD (OP_c07a - OP_1000) + (1 * 1000000h) +DD (OP_c07b - OP_1000) + (1 * 1000000h) +DD (OP_c07c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c080 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c090 - OP_1000) + (8 * 1000000h) +DD (OP_c098 - OP_1000) + (8 * 1000000h) +DD (OP_c0a0 - OP_1000) + (8 * 1000000h) +DD (OP_c0a8 - OP_1000) + (8 * 1000000h) +DD (OP_c0b0 - OP_1000) + (8 * 1000000h) +DD (OP_c0b8 - OP_1000) + (1 * 1000000h) +DD (OP_c0b9 - OP_1000) + (1 * 1000000h) +DD (OP_c0ba - OP_1000) + (1 * 1000000h) +DD (OP_c0bb - OP_1000) + (1 * 1000000h) +DD (OP_c0bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c0c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c0d0 - OP_1000) + (8 * 1000000h) +DD (OP_c0d8 - OP_1000) + (8 * 1000000h) +DD (OP_c0e0 - OP_1000) + (8 * 1000000h) +DD (OP_c0e8 - OP_1000) + (8 * 1000000h) +DD (OP_c0f0 - OP_1000) + (8 * 1000000h) +DD (OP_c0f8 - OP_1000) + (1 * 1000000h) +DD (OP_c0f9 - OP_1000) + (1 * 1000000h) +DD (OP_c0fa - OP_1000) + (1 * 1000000h) +DD (OP_c0fb - OP_1000) + (1 * 1000000h) +DD (OP_c0fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c100 - OP_1000) + (8 * 1000000h) +DD (OP_c108 - OP_1000) + (8 * 1000000h) +DD (OP_c110 - OP_1000) + (8 * 1000000h) +DD (OP_c118 - OP_1000) + (7 * 1000000h) +DD (OP_c11f - OP_1000) + (1 * 1000000h) +DD (OP_c120 - OP_1000) + (7 * 1000000h) +DD (OP_c127 - OP_1000) + (1 * 1000000h) +DD (OP_c128 - OP_1000) + (8 * 1000000h) +DD (OP_c130 - OP_1000) + (8 * 1000000h) +DD (OP_c138 - OP_1000) + (1 * 1000000h) +DD (OP_c139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_c140 - OP_1000) + (8 * 1000000h) +DD (OP_c148 - OP_1000) + (8 * 1000000h) +DD (OP_c150 - OP_1000) + (8 * 1000000h) +DD (OP_c158 - OP_1000) + (8 * 1000000h) +DD (OP_c160 - OP_1000) + (8 * 1000000h) +DD (OP_c168 - OP_1000) + (8 * 1000000h) +DD (OP_c170 - OP_1000) + (8 * 1000000h) +DD (OP_c178 - OP_1000) + (1 * 1000000h) +DD (OP_c179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (14 * 1000000h) +DD (OP_c188 - OP_1000) + (8 * 1000000h) +DD (OP_c190 - OP_1000) + (8 * 1000000h) +DD (OP_c198 - OP_1000) + (8 * 1000000h) +DD (OP_c1a0 - OP_1000) + (8 * 1000000h) +DD (OP_c1a8 - OP_1000) + (8 * 1000000h) +DD (OP_c1b0 - OP_1000) + (8 * 1000000h) +DD (OP_c1b8 - OP_1000) + (1 * 1000000h) +DD (OP_c1b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_c1c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c1d0 - OP_1000) + (8 * 1000000h) +DD (OP_c1d8 - OP_1000) + (8 * 1000000h) +DD (OP_c1e0 - OP_1000) + (8 * 1000000h) +DD (OP_c1e8 - OP_1000) + (8 * 1000000h) +DD (OP_c1f0 - OP_1000) + (8 * 1000000h) +DD (OP_c1f8 - OP_1000) + (1 * 1000000h) +DD (OP_c1f9 - OP_1000) + (1 * 1000000h) +DD (OP_c1fa - OP_1000) + (1 * 1000000h) +DD (OP_c1fb - OP_1000) + (1 * 1000000h) +DD (OP_c1fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c010 - OP_1000) + (8 * 1000000h) +DD (OP_c018 - OP_1000) + (7 * 1000000h) +DD (OP_c01f - OP_1000) + (1 * 1000000h) +DD (OP_c020 - OP_1000) + (7 * 1000000h) +DD (OP_c027 - OP_1000) + (1 * 1000000h) +DD (OP_c028 - OP_1000) + (8 * 1000000h) +DD (OP_c030 - OP_1000) + (8 * 1000000h) +DD (OP_c038 - OP_1000) + (1 * 1000000h) +DD (OP_c039 - OP_1000) + (1 * 1000000h) +DD (OP_c03a - OP_1000) + (1 * 1000000h) +DD (OP_c03b - OP_1000) + (1 * 1000000h) +DD (OP_c03c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c040 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c050 - OP_1000) + (8 * 1000000h) +DD (OP_c058 - OP_1000) + (8 * 1000000h) +DD (OP_c060 - OP_1000) + (8 * 1000000h) +DD (OP_c068 - OP_1000) + (8 * 1000000h) +DD (OP_c070 - OP_1000) + (8 * 1000000h) +DD (OP_c078 - OP_1000) + (1 * 1000000h) +DD (OP_c079 - OP_1000) + (1 * 1000000h) +DD (OP_c07a - OP_1000) + (1 * 1000000h) +DD (OP_c07b - OP_1000) + (1 * 1000000h) +DD (OP_c07c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c080 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c090 - OP_1000) + (8 * 1000000h) +DD (OP_c098 - OP_1000) + (8 * 1000000h) +DD (OP_c0a0 - OP_1000) + (8 * 1000000h) +DD (OP_c0a8 - OP_1000) + (8 * 1000000h) +DD (OP_c0b0 - OP_1000) + (8 * 1000000h) +DD (OP_c0b8 - OP_1000) + (1 * 1000000h) +DD (OP_c0b9 - OP_1000) + (1 * 1000000h) +DD (OP_c0ba - OP_1000) + (1 * 1000000h) +DD (OP_c0bb - OP_1000) + (1 * 1000000h) +DD (OP_c0bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c0c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c0d0 - OP_1000) + (8 * 1000000h) +DD (OP_c0d8 - OP_1000) + (8 * 1000000h) +DD (OP_c0e0 - OP_1000) + (8 * 1000000h) +DD (OP_c0e8 - OP_1000) + (8 * 1000000h) +DD (OP_c0f0 - OP_1000) + (8 * 1000000h) +DD (OP_c0f8 - OP_1000) + (1 * 1000000h) +DD (OP_c0f9 - OP_1000) + (1 * 1000000h) +DD (OP_c0fa - OP_1000) + (1 * 1000000h) +DD (OP_c0fb - OP_1000) + (1 * 1000000h) +DD (OP_c0fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c100 - OP_1000) + (8 * 1000000h) +DD (OP_c108 - OP_1000) + (8 * 1000000h) +DD (OP_c110 - OP_1000) + (8 * 1000000h) +DD (OP_c118 - OP_1000) + (7 * 1000000h) +DD (OP_c11f - OP_1000) + (1 * 1000000h) +DD (OP_c120 - OP_1000) + (7 * 1000000h) +DD (OP_c127 - OP_1000) + (1 * 1000000h) +DD (OP_c128 - OP_1000) + (8 * 1000000h) +DD (OP_c130 - OP_1000) + (8 * 1000000h) +DD (OP_c138 - OP_1000) + (1 * 1000000h) +DD (OP_c139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_c140 - OP_1000) + (8 * 1000000h) +DD (OP_c148 - OP_1000) + (8 * 1000000h) +DD (OP_c150 - OP_1000) + (8 * 1000000h) +DD (OP_c158 - OP_1000) + (8 * 1000000h) +DD (OP_c160 - OP_1000) + (8 * 1000000h) +DD (OP_c168 - OP_1000) + (8 * 1000000h) +DD (OP_c170 - OP_1000) + (8 * 1000000h) +DD (OP_c178 - OP_1000) + (1 * 1000000h) +DD (OP_c179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (14 * 1000000h) +DD (OP_c188 - OP_1000) + (8 * 1000000h) +DD (OP_c190 - OP_1000) + (8 * 1000000h) +DD (OP_c198 - OP_1000) + (8 * 1000000h) +DD (OP_c1a0 - OP_1000) + (8 * 1000000h) +DD (OP_c1a8 - OP_1000) + (8 * 1000000h) +DD (OP_c1b0 - OP_1000) + (8 * 1000000h) +DD (OP_c1b8 - OP_1000) + (1 * 1000000h) +DD (OP_c1b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_c1c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c1d0 - OP_1000) + (8 * 1000000h) +DD (OP_c1d8 - OP_1000) + (8 * 1000000h) +DD (OP_c1e0 - OP_1000) + (8 * 1000000h) +DD (OP_c1e8 - OP_1000) + (8 * 1000000h) +DD (OP_c1f0 - OP_1000) + (8 * 1000000h) +DD (OP_c1f8 - OP_1000) + (1 * 1000000h) +DD (OP_c1f9 - OP_1000) + (1 * 1000000h) +DD (OP_c1fa - OP_1000) + (1 * 1000000h) +DD (OP_c1fb - OP_1000) + (1 * 1000000h) +DD (OP_c1fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c010 - OP_1000) + (8 * 1000000h) +DD (OP_c018 - OP_1000) + (7 * 1000000h) +DD (OP_c01f - OP_1000) + (1 * 1000000h) +DD (OP_c020 - OP_1000) + (7 * 1000000h) +DD (OP_c027 - OP_1000) + (1 * 1000000h) +DD (OP_c028 - OP_1000) + (8 * 1000000h) +DD (OP_c030 - OP_1000) + (8 * 1000000h) +DD (OP_c038 - OP_1000) + (1 * 1000000h) +DD (OP_c039 - OP_1000) + (1 * 1000000h) +DD (OP_c03a - OP_1000) + (1 * 1000000h) +DD (OP_c03b - OP_1000) + (1 * 1000000h) +DD (OP_c03c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c040 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c050 - OP_1000) + (8 * 1000000h) +DD (OP_c058 - OP_1000) + (8 * 1000000h) +DD (OP_c060 - OP_1000) + (8 * 1000000h) +DD (OP_c068 - OP_1000) + (8 * 1000000h) +DD (OP_c070 - OP_1000) + (8 * 1000000h) +DD (OP_c078 - OP_1000) + (1 * 1000000h) +DD (OP_c079 - OP_1000) + (1 * 1000000h) +DD (OP_c07a - OP_1000) + (1 * 1000000h) +DD (OP_c07b - OP_1000) + (1 * 1000000h) +DD (OP_c07c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c080 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c090 - OP_1000) + (8 * 1000000h) +DD (OP_c098 - OP_1000) + (8 * 1000000h) +DD (OP_c0a0 - OP_1000) + (8 * 1000000h) +DD (OP_c0a8 - OP_1000) + (8 * 1000000h) +DD (OP_c0b0 - OP_1000) + (8 * 1000000h) +DD (OP_c0b8 - OP_1000) + (1 * 1000000h) +DD (OP_c0b9 - OP_1000) + (1 * 1000000h) +DD (OP_c0ba - OP_1000) + (1 * 1000000h) +DD (OP_c0bb - OP_1000) + (1 * 1000000h) +DD (OP_c0bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c0c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c0d0 - OP_1000) + (8 * 1000000h) +DD (OP_c0d8 - OP_1000) + (8 * 1000000h) +DD (OP_c0e0 - OP_1000) + (8 * 1000000h) +DD (OP_c0e8 - OP_1000) + (8 * 1000000h) +DD (OP_c0f0 - OP_1000) + (8 * 1000000h) +DD (OP_c0f8 - OP_1000) + (1 * 1000000h) +DD (OP_c0f9 - OP_1000) + (1 * 1000000h) +DD (OP_c0fa - OP_1000) + (1 * 1000000h) +DD (OP_c0fb - OP_1000) + (1 * 1000000h) +DD (OP_c0fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c100 - OP_1000) + (8 * 1000000h) +DD (OP_c108 - OP_1000) + (8 * 1000000h) +DD (OP_c110 - OP_1000) + (8 * 1000000h) +DD (OP_c118 - OP_1000) + (7 * 1000000h) +DD (OP_c11f - OP_1000) + (1 * 1000000h) +DD (OP_c120 - OP_1000) + (7 * 1000000h) +DD (OP_c127 - OP_1000) + (1 * 1000000h) +DD (OP_c128 - OP_1000) + (8 * 1000000h) +DD (OP_c130 - OP_1000) + (8 * 1000000h) +DD (OP_c138 - OP_1000) + (1 * 1000000h) +DD (OP_c139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_c140 - OP_1000) + (8 * 1000000h) +DD (OP_c148 - OP_1000) + (8 * 1000000h) +DD (OP_c150 - OP_1000) + (8 * 1000000h) +DD (OP_c158 - OP_1000) + (8 * 1000000h) +DD (OP_c160 - OP_1000) + (8 * 1000000h) +DD (OP_c168 - OP_1000) + (8 * 1000000h) +DD (OP_c170 - OP_1000) + (8 * 1000000h) +DD (OP_c178 - OP_1000) + (1 * 1000000h) +DD (OP_c179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (14 * 1000000h) +DD (OP_c188 - OP_1000) + (8 * 1000000h) +DD (OP_c190 - OP_1000) + (8 * 1000000h) +DD (OP_c198 - OP_1000) + (8 * 1000000h) +DD (OP_c1a0 - OP_1000) + (8 * 1000000h) +DD (OP_c1a8 - OP_1000) + (8 * 1000000h) +DD (OP_c1b0 - OP_1000) + (8 * 1000000h) +DD (OP_c1b8 - OP_1000) + (1 * 1000000h) +DD (OP_c1b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_c1c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c1d0 - OP_1000) + (8 * 1000000h) +DD (OP_c1d8 - OP_1000) + (8 * 1000000h) +DD (OP_c1e0 - OP_1000) + (8 * 1000000h) +DD (OP_c1e8 - OP_1000) + (8 * 1000000h) +DD (OP_c1f0 - OP_1000) + (8 * 1000000h) +DD (OP_c1f8 - OP_1000) + (1 * 1000000h) +DD (OP_c1f9 - OP_1000) + (1 * 1000000h) +DD (OP_c1fa - OP_1000) + (1 * 1000000h) +DD (OP_c1fb - OP_1000) + (1 * 1000000h) +DD (OP_c1fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c010 - OP_1000) + (8 * 1000000h) +DD (OP_c018 - OP_1000) + (7 * 1000000h) +DD (OP_c01f - OP_1000) + (1 * 1000000h) +DD (OP_c020 - OP_1000) + (7 * 1000000h) +DD (OP_c027 - OP_1000) + (1 * 1000000h) +DD (OP_c028 - OP_1000) + (8 * 1000000h) +DD (OP_c030 - OP_1000) + (8 * 1000000h) +DD (OP_c038 - OP_1000) + (1 * 1000000h) +DD (OP_c039 - OP_1000) + (1 * 1000000h) +DD (OP_c03a - OP_1000) + (1 * 1000000h) +DD (OP_c03b - OP_1000) + (1 * 1000000h) +DD (OP_c03c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c040 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c050 - OP_1000) + (8 * 1000000h) +DD (OP_c058 - OP_1000) + (8 * 1000000h) +DD (OP_c060 - OP_1000) + (8 * 1000000h) +DD (OP_c068 - OP_1000) + (8 * 1000000h) +DD (OP_c070 - OP_1000) + (8 * 1000000h) +DD (OP_c078 - OP_1000) + (1 * 1000000h) +DD (OP_c079 - OP_1000) + (1 * 1000000h) +DD (OP_c07a - OP_1000) + (1 * 1000000h) +DD (OP_c07b - OP_1000) + (1 * 1000000h) +DD (OP_c07c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c080 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c090 - OP_1000) + (8 * 1000000h) +DD (OP_c098 - OP_1000) + (8 * 1000000h) +DD (OP_c0a0 - OP_1000) + (8 * 1000000h) +DD (OP_c0a8 - OP_1000) + (8 * 1000000h) +DD (OP_c0b0 - OP_1000) + (8 * 1000000h) +DD (OP_c0b8 - OP_1000) + (1 * 1000000h) +DD (OP_c0b9 - OP_1000) + (1 * 1000000h) +DD (OP_c0ba - OP_1000) + (1 * 1000000h) +DD (OP_c0bb - OP_1000) + (1 * 1000000h) +DD (OP_c0bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c0c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c0d0 - OP_1000) + (8 * 1000000h) +DD (OP_c0d8 - OP_1000) + (8 * 1000000h) +DD (OP_c0e0 - OP_1000) + (8 * 1000000h) +DD (OP_c0e8 - OP_1000) + (8 * 1000000h) +DD (OP_c0f0 - OP_1000) + (8 * 1000000h) +DD (OP_c0f8 - OP_1000) + (1 * 1000000h) +DD (OP_c0f9 - OP_1000) + (1 * 1000000h) +DD (OP_c0fa - OP_1000) + (1 * 1000000h) +DD (OP_c0fb - OP_1000) + (1 * 1000000h) +DD (OP_c0fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_c100 - OP_1000) + (8 * 1000000h) +DD (OP_c108 - OP_1000) + (8 * 1000000h) +DD (OP_c110 - OP_1000) + (8 * 1000000h) +DD (OP_c118 - OP_1000) + (7 * 1000000h) +DD (OP_c11f - OP_1000) + (1 * 1000000h) +DD (OP_c120 - OP_1000) + (7 * 1000000h) +DD (OP_c127 - OP_1000) + (1 * 1000000h) +DD (OP_c128 - OP_1000) + (8 * 1000000h) +DD (OP_c130 - OP_1000) + (8 * 1000000h) +DD (OP_c138 - OP_1000) + (1 * 1000000h) +DD (OP_c139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_c140 - OP_1000) + (8 * 1000000h) +DD (OP_c148 - OP_1000) + (8 * 1000000h) +DD (OP_c150 - OP_1000) + (8 * 1000000h) +DD (OP_c158 - OP_1000) + (8 * 1000000h) +DD (OP_c160 - OP_1000) + (8 * 1000000h) +DD (OP_c168 - OP_1000) + (8 * 1000000h) +DD (OP_c170 - OP_1000) + (8 * 1000000h) +DD (OP_c178 - OP_1000) + (1 * 1000000h) +DD (OP_c179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (14 * 1000000h) +DD (OP_c188 - OP_1000) + (8 * 1000000h) +DD (OP_c190 - OP_1000) + (8 * 1000000h) +DD (OP_c198 - OP_1000) + (8 * 1000000h) +DD (OP_c1a0 - OP_1000) + (8 * 1000000h) +DD (OP_c1a8 - OP_1000) + (8 * 1000000h) +DD (OP_c1b0 - OP_1000) + (8 * 1000000h) +DD (OP_c1b8 - OP_1000) + (1 * 1000000h) +DD (OP_c1b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_c1c0 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_c1d0 - OP_1000) + (8 * 1000000h) +DD (OP_c1d8 - OP_1000) + (8 * 1000000h) +DD (OP_c1e0 - OP_1000) + (8 * 1000000h) +DD (OP_c1e8 - OP_1000) + (8 * 1000000h) +DD (OP_c1f0 - OP_1000) + (8 * 1000000h) +DD (OP_c1f8 - OP_1000) + (1 * 1000000h) +DD (OP_c1f9 - OP_1000) + (1 * 1000000h) +DD (OP_c1fa - OP_1000) + (1 * 1000000h) +DD (OP_c1fb - OP_1000) + (1 * 1000000h) +DD (OP_c1fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_d010 - OP_1000) + (8 * 1000000h) +DD (OP_d018 - OP_1000) + (7 * 1000000h) +DD (OP_d01f - OP_1000) + (1 * 1000000h) +DD (OP_d020 - OP_1000) + (7 * 1000000h) +DD (OP_d027 - OP_1000) + (1 * 1000000h) +DD (OP_d028 - OP_1000) + (8 * 1000000h) +DD (OP_d030 - OP_1000) + (8 * 1000000h) +DD (OP_d038 - OP_1000) + (1 * 1000000h) +DD (OP_d039 - OP_1000) + (1 * 1000000h) +DD (OP_d03a - OP_1000) + (1 * 1000000h) +DD (OP_d03b - OP_1000) + (1 * 1000000h) +DD (OP_d03c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d040 - OP_1000) + (16 * 1000000h) +DD (OP_d050 - OP_1000) + (8 * 1000000h) +DD (OP_d058 - OP_1000) + (8 * 1000000h) +DD (OP_d060 - OP_1000) + (8 * 1000000h) +DD (OP_d068 - OP_1000) + (8 * 1000000h) +DD (OP_d070 - OP_1000) + (8 * 1000000h) +DD (OP_d078 - OP_1000) + (1 * 1000000h) +DD (OP_d079 - OP_1000) + (1 * 1000000h) +DD (OP_d07a - OP_1000) + (1 * 1000000h) +DD (OP_d07b - OP_1000) + (1 * 1000000h) +DD (OP_d07c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d080 - OP_1000) + (16 * 1000000h) +DD (OP_d090 - OP_1000) + (8 * 1000000h) +DD (OP_d098 - OP_1000) + (8 * 1000000h) +DD (OP_d0a0 - OP_1000) + (8 * 1000000h) +DD (OP_d0a8 - OP_1000) + (8 * 1000000h) +DD (OP_d0b0 - OP_1000) + (8 * 1000000h) +DD (OP_d0b8 - OP_1000) + (1 * 1000000h) +DD (OP_d0b9 - OP_1000) + (1 * 1000000h) +DD (OP_d0ba - OP_1000) + (1 * 1000000h) +DD (OP_d0bb - OP_1000) + (1 * 1000000h) +DD (OP_d0bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d0c0 - OP_1000) + (16 * 1000000h) +DD (OP_d0d0 - OP_1000) + (8 * 1000000h) +DD (OP_d0d8 - OP_1000) + (8 * 1000000h) +DD (OP_d0e0 - OP_1000) + (8 * 1000000h) +DD (OP_d0e8 - OP_1000) + (8 * 1000000h) +DD (OP_d0f0 - OP_1000) + (8 * 1000000h) +DD (OP_d0f8 - OP_1000) + (1 * 1000000h) +DD (OP_d0f9 - OP_1000) + (1 * 1000000h) +DD (OP_d0fa - OP_1000) + (1 * 1000000h) +DD (OP_d0fb - OP_1000) + (1 * 1000000h) +DD (OP_d0fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d100 - OP_1000) + (8 * 1000000h) +DD (OP_d108 - OP_1000) + (8 * 1000000h) +DD (OP_d110 - OP_1000) + (8 * 1000000h) +DD (OP_d118 - OP_1000) + (7 * 1000000h) +DD (OP_d11f - OP_1000) + (1 * 1000000h) +DD (OP_d120 - OP_1000) + (7 * 1000000h) +DD (OP_d127 - OP_1000) + (1 * 1000000h) +DD (OP_d128 - OP_1000) + (8 * 1000000h) +DD (OP_d130 - OP_1000) + (8 * 1000000h) +DD (OP_d138 - OP_1000) + (1 * 1000000h) +DD (OP_d139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_d140 - OP_1000) + (8 * 1000000h) +DD (OP_d148 - OP_1000) + (8 * 1000000h) +DD (OP_d150 - OP_1000) + (8 * 1000000h) +DD (OP_d158 - OP_1000) + (8 * 1000000h) +DD (OP_d160 - OP_1000) + (8 * 1000000h) +DD (OP_d168 - OP_1000) + (8 * 1000000h) +DD (OP_d170 - OP_1000) + (8 * 1000000h) +DD (OP_d178 - OP_1000) + (1 * 1000000h) +DD (OP_d179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_d180 - OP_1000) + (8 * 1000000h) +DD (OP_d188 - OP_1000) + (8 * 1000000h) +DD (OP_d190 - OP_1000) + (8 * 1000000h) +DD (OP_d198 - OP_1000) + (8 * 1000000h) +DD (OP_d1a0 - OP_1000) + (8 * 1000000h) +DD (OP_d1a8 - OP_1000) + (8 * 1000000h) +DD (OP_d1b0 - OP_1000) + (8 * 1000000h) +DD (OP_d1b8 - OP_1000) + (1 * 1000000h) +DD (OP_d1b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_d1c0 - OP_1000) + (16 * 1000000h) +DD (OP_d1d0 - OP_1000) + (8 * 1000000h) +DD (OP_d1d8 - OP_1000) + (8 * 1000000h) +DD (OP_d1e0 - OP_1000) + (8 * 1000000h) +DD (OP_d1e8 - OP_1000) + (8 * 1000000h) +DD (OP_d1f0 - OP_1000) + (8 * 1000000h) +DD (OP_d1f8 - OP_1000) + (1 * 1000000h) +DD (OP_d1f9 - OP_1000) + (1 * 1000000h) +DD (OP_d1fa - OP_1000) + (1 * 1000000h) +DD (OP_d1fb - OP_1000) + (1 * 1000000h) +DD (OP_d1fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_d010 - OP_1000) + (8 * 1000000h) +DD (OP_d018 - OP_1000) + (7 * 1000000h) +DD (OP_d01f - OP_1000) + (1 * 1000000h) +DD (OP_d020 - OP_1000) + (7 * 1000000h) +DD (OP_d027 - OP_1000) + (1 * 1000000h) +DD (OP_d028 - OP_1000) + (8 * 1000000h) +DD (OP_d030 - OP_1000) + (8 * 1000000h) +DD (OP_d038 - OP_1000) + (1 * 1000000h) +DD (OP_d039 - OP_1000) + (1 * 1000000h) +DD (OP_d03a - OP_1000) + (1 * 1000000h) +DD (OP_d03b - OP_1000) + (1 * 1000000h) +DD (OP_d03c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d040 - OP_1000) + (16 * 1000000h) +DD (OP_d050 - OP_1000) + (8 * 1000000h) +DD (OP_d058 - OP_1000) + (8 * 1000000h) +DD (OP_d060 - OP_1000) + (8 * 1000000h) +DD (OP_d068 - OP_1000) + (8 * 1000000h) +DD (OP_d070 - OP_1000) + (8 * 1000000h) +DD (OP_d078 - OP_1000) + (1 * 1000000h) +DD (OP_d079 - OP_1000) + (1 * 1000000h) +DD (OP_d07a - OP_1000) + (1 * 1000000h) +DD (OP_d07b - OP_1000) + (1 * 1000000h) +DD (OP_d07c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d080 - OP_1000) + (16 * 1000000h) +DD (OP_d090 - OP_1000) + (8 * 1000000h) +DD (OP_d098 - OP_1000) + (8 * 1000000h) +DD (OP_d0a0 - OP_1000) + (8 * 1000000h) +DD (OP_d0a8 - OP_1000) + (8 * 1000000h) +DD (OP_d0b0 - OP_1000) + (8 * 1000000h) +DD (OP_d0b8 - OP_1000) + (1 * 1000000h) +DD (OP_d0b9 - OP_1000) + (1 * 1000000h) +DD (OP_d0ba - OP_1000) + (1 * 1000000h) +DD (OP_d0bb - OP_1000) + (1 * 1000000h) +DD (OP_d0bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d0c0 - OP_1000) + (16 * 1000000h) +DD (OP_d0d0 - OP_1000) + (8 * 1000000h) +DD (OP_d0d8 - OP_1000) + (8 * 1000000h) +DD (OP_d0e0 - OP_1000) + (8 * 1000000h) +DD (OP_d0e8 - OP_1000) + (8 * 1000000h) +DD (OP_d0f0 - OP_1000) + (8 * 1000000h) +DD (OP_d0f8 - OP_1000) + (1 * 1000000h) +DD (OP_d0f9 - OP_1000) + (1 * 1000000h) +DD (OP_d0fa - OP_1000) + (1 * 1000000h) +DD (OP_d0fb - OP_1000) + (1 * 1000000h) +DD (OP_d0fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d100 - OP_1000) + (8 * 1000000h) +DD (OP_d108 - OP_1000) + (8 * 1000000h) +DD (OP_d110 - OP_1000) + (8 * 1000000h) +DD (OP_d118 - OP_1000) + (7 * 1000000h) +DD (OP_d11f - OP_1000) + (1 * 1000000h) +DD (OP_d120 - OP_1000) + (7 * 1000000h) +DD (OP_d127 - OP_1000) + (1 * 1000000h) +DD (OP_d128 - OP_1000) + (8 * 1000000h) +DD (OP_d130 - OP_1000) + (8 * 1000000h) +DD (OP_d138 - OP_1000) + (1 * 1000000h) +DD (OP_d139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_d140 - OP_1000) + (8 * 1000000h) +DD (OP_d148 - OP_1000) + (8 * 1000000h) +DD (OP_d150 - OP_1000) + (8 * 1000000h) +DD (OP_d158 - OP_1000) + (8 * 1000000h) +DD (OP_d160 - OP_1000) + (8 * 1000000h) +DD (OP_d168 - OP_1000) + (8 * 1000000h) +DD (OP_d170 - OP_1000) + (8 * 1000000h) +DD (OP_d178 - OP_1000) + (1 * 1000000h) +DD (OP_d179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_d180 - OP_1000) + (8 * 1000000h) +DD (OP_d188 - OP_1000) + (8 * 1000000h) +DD (OP_d190 - OP_1000) + (8 * 1000000h) +DD (OP_d198 - OP_1000) + (8 * 1000000h) +DD (OP_d1a0 - OP_1000) + (8 * 1000000h) +DD (OP_d1a8 - OP_1000) + (8 * 1000000h) +DD (OP_d1b0 - OP_1000) + (8 * 1000000h) +DD (OP_d1b8 - OP_1000) + (1 * 1000000h) +DD (OP_d1b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_d1c0 - OP_1000) + (16 * 1000000h) +DD (OP_d1d0 - OP_1000) + (8 * 1000000h) +DD (OP_d1d8 - OP_1000) + (8 * 1000000h) +DD (OP_d1e0 - OP_1000) + (8 * 1000000h) +DD (OP_d1e8 - OP_1000) + (8 * 1000000h) +DD (OP_d1f0 - OP_1000) + (8 * 1000000h) +DD (OP_d1f8 - OP_1000) + (1 * 1000000h) +DD (OP_d1f9 - OP_1000) + (1 * 1000000h) +DD (OP_d1fa - OP_1000) + (1 * 1000000h) +DD (OP_d1fb - OP_1000) + (1 * 1000000h) +DD (OP_d1fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_d010 - OP_1000) + (8 * 1000000h) +DD (OP_d018 - OP_1000) + (7 * 1000000h) +DD (OP_d01f - OP_1000) + (1 * 1000000h) +DD (OP_d020 - OP_1000) + (7 * 1000000h) +DD (OP_d027 - OP_1000) + (1 * 1000000h) +DD (OP_d028 - OP_1000) + (8 * 1000000h) +DD (OP_d030 - OP_1000) + (8 * 1000000h) +DD (OP_d038 - OP_1000) + (1 * 1000000h) +DD (OP_d039 - OP_1000) + (1 * 1000000h) +DD (OP_d03a - OP_1000) + (1 * 1000000h) +DD (OP_d03b - OP_1000) + (1 * 1000000h) +DD (OP_d03c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d040 - OP_1000) + (16 * 1000000h) +DD (OP_d050 - OP_1000) + (8 * 1000000h) +DD (OP_d058 - OP_1000) + (8 * 1000000h) +DD (OP_d060 - OP_1000) + (8 * 1000000h) +DD (OP_d068 - OP_1000) + (8 * 1000000h) +DD (OP_d070 - OP_1000) + (8 * 1000000h) +DD (OP_d078 - OP_1000) + (1 * 1000000h) +DD (OP_d079 - OP_1000) + (1 * 1000000h) +DD (OP_d07a - OP_1000) + (1 * 1000000h) +DD (OP_d07b - OP_1000) + (1 * 1000000h) +DD (OP_d07c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d080 - OP_1000) + (16 * 1000000h) +DD (OP_d090 - OP_1000) + (8 * 1000000h) +DD (OP_d098 - OP_1000) + (8 * 1000000h) +DD (OP_d0a0 - OP_1000) + (8 * 1000000h) +DD (OP_d0a8 - OP_1000) + (8 * 1000000h) +DD (OP_d0b0 - OP_1000) + (8 * 1000000h) +DD (OP_d0b8 - OP_1000) + (1 * 1000000h) +DD (OP_d0b9 - OP_1000) + (1 * 1000000h) +DD (OP_d0ba - OP_1000) + (1 * 1000000h) +DD (OP_d0bb - OP_1000) + (1 * 1000000h) +DD (OP_d0bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d0c0 - OP_1000) + (16 * 1000000h) +DD (OP_d0d0 - OP_1000) + (8 * 1000000h) +DD (OP_d0d8 - OP_1000) + (8 * 1000000h) +DD (OP_d0e0 - OP_1000) + (8 * 1000000h) +DD (OP_d0e8 - OP_1000) + (8 * 1000000h) +DD (OP_d0f0 - OP_1000) + (8 * 1000000h) +DD (OP_d0f8 - OP_1000) + (1 * 1000000h) +DD (OP_d0f9 - OP_1000) + (1 * 1000000h) +DD (OP_d0fa - OP_1000) + (1 * 1000000h) +DD (OP_d0fb - OP_1000) + (1 * 1000000h) +DD (OP_d0fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d100 - OP_1000) + (8 * 1000000h) +DD (OP_d108 - OP_1000) + (8 * 1000000h) +DD (OP_d110 - OP_1000) + (8 * 1000000h) +DD (OP_d118 - OP_1000) + (7 * 1000000h) +DD (OP_d11f - OP_1000) + (1 * 1000000h) +DD (OP_d120 - OP_1000) + (7 * 1000000h) +DD (OP_d127 - OP_1000) + (1 * 1000000h) +DD (OP_d128 - OP_1000) + (8 * 1000000h) +DD (OP_d130 - OP_1000) + (8 * 1000000h) +DD (OP_d138 - OP_1000) + (1 * 1000000h) +DD (OP_d139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_d140 - OP_1000) + (8 * 1000000h) +DD (OP_d148 - OP_1000) + (8 * 1000000h) +DD (OP_d150 - OP_1000) + (8 * 1000000h) +DD (OP_d158 - OP_1000) + (8 * 1000000h) +DD (OP_d160 - OP_1000) + (8 * 1000000h) +DD (OP_d168 - OP_1000) + (8 * 1000000h) +DD (OP_d170 - OP_1000) + (8 * 1000000h) +DD (OP_d178 - OP_1000) + (1 * 1000000h) +DD (OP_d179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_d180 - OP_1000) + (8 * 1000000h) +DD (OP_d188 - OP_1000) + (8 * 1000000h) +DD (OP_d190 - OP_1000) + (8 * 1000000h) +DD (OP_d198 - OP_1000) + (8 * 1000000h) +DD (OP_d1a0 - OP_1000) + (8 * 1000000h) +DD (OP_d1a8 - OP_1000) + (8 * 1000000h) +DD (OP_d1b0 - OP_1000) + (8 * 1000000h) +DD (OP_d1b8 - OP_1000) + (1 * 1000000h) +DD (OP_d1b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_d1c0 - OP_1000) + (16 * 1000000h) +DD (OP_d1d0 - OP_1000) + (8 * 1000000h) +DD (OP_d1d8 - OP_1000) + (8 * 1000000h) +DD (OP_d1e0 - OP_1000) + (8 * 1000000h) +DD (OP_d1e8 - OP_1000) + (8 * 1000000h) +DD (OP_d1f0 - OP_1000) + (8 * 1000000h) +DD (OP_d1f8 - OP_1000) + (1 * 1000000h) +DD (OP_d1f9 - OP_1000) + (1 * 1000000h) +DD (OP_d1fa - OP_1000) + (1 * 1000000h) +DD (OP_d1fb - OP_1000) + (1 * 1000000h) +DD (OP_d1fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_d010 - OP_1000) + (8 * 1000000h) +DD (OP_d018 - OP_1000) + (7 * 1000000h) +DD (OP_d01f - OP_1000) + (1 * 1000000h) +DD (OP_d020 - OP_1000) + (7 * 1000000h) +DD (OP_d027 - OP_1000) + (1 * 1000000h) +DD (OP_d028 - OP_1000) + (8 * 1000000h) +DD (OP_d030 - OP_1000) + (8 * 1000000h) +DD (OP_d038 - OP_1000) + (1 * 1000000h) +DD (OP_d039 - OP_1000) + (1 * 1000000h) +DD (OP_d03a - OP_1000) + (1 * 1000000h) +DD (OP_d03b - OP_1000) + (1 * 1000000h) +DD (OP_d03c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d040 - OP_1000) + (16 * 1000000h) +DD (OP_d050 - OP_1000) + (8 * 1000000h) +DD (OP_d058 - OP_1000) + (8 * 1000000h) +DD (OP_d060 - OP_1000) + (8 * 1000000h) +DD (OP_d068 - OP_1000) + (8 * 1000000h) +DD (OP_d070 - OP_1000) + (8 * 1000000h) +DD (OP_d078 - OP_1000) + (1 * 1000000h) +DD (OP_d079 - OP_1000) + (1 * 1000000h) +DD (OP_d07a - OP_1000) + (1 * 1000000h) +DD (OP_d07b - OP_1000) + (1 * 1000000h) +DD (OP_d07c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d080 - OP_1000) + (16 * 1000000h) +DD (OP_d090 - OP_1000) + (8 * 1000000h) +DD (OP_d098 - OP_1000) + (8 * 1000000h) +DD (OP_d0a0 - OP_1000) + (8 * 1000000h) +DD (OP_d0a8 - OP_1000) + (8 * 1000000h) +DD (OP_d0b0 - OP_1000) + (8 * 1000000h) +DD (OP_d0b8 - OP_1000) + (1 * 1000000h) +DD (OP_d0b9 - OP_1000) + (1 * 1000000h) +DD (OP_d0ba - OP_1000) + (1 * 1000000h) +DD (OP_d0bb - OP_1000) + (1 * 1000000h) +DD (OP_d0bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d0c0 - OP_1000) + (16 * 1000000h) +DD (OP_d0d0 - OP_1000) + (8 * 1000000h) +DD (OP_d0d8 - OP_1000) + (8 * 1000000h) +DD (OP_d0e0 - OP_1000) + (8 * 1000000h) +DD (OP_d0e8 - OP_1000) + (8 * 1000000h) +DD (OP_d0f0 - OP_1000) + (8 * 1000000h) +DD (OP_d0f8 - OP_1000) + (1 * 1000000h) +DD (OP_d0f9 - OP_1000) + (1 * 1000000h) +DD (OP_d0fa - OP_1000) + (1 * 1000000h) +DD (OP_d0fb - OP_1000) + (1 * 1000000h) +DD (OP_d0fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d100 - OP_1000) + (8 * 1000000h) +DD (OP_d108 - OP_1000) + (8 * 1000000h) +DD (OP_d110 - OP_1000) + (8 * 1000000h) +DD (OP_d118 - OP_1000) + (7 * 1000000h) +DD (OP_d11f - OP_1000) + (1 * 1000000h) +DD (OP_d120 - OP_1000) + (7 * 1000000h) +DD (OP_d127 - OP_1000) + (1 * 1000000h) +DD (OP_d128 - OP_1000) + (8 * 1000000h) +DD (OP_d130 - OP_1000) + (8 * 1000000h) +DD (OP_d138 - OP_1000) + (1 * 1000000h) +DD (OP_d139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_d140 - OP_1000) + (8 * 1000000h) +DD (OP_d148 - OP_1000) + (8 * 1000000h) +DD (OP_d150 - OP_1000) + (8 * 1000000h) +DD (OP_d158 - OP_1000) + (8 * 1000000h) +DD (OP_d160 - OP_1000) + (8 * 1000000h) +DD (OP_d168 - OP_1000) + (8 * 1000000h) +DD (OP_d170 - OP_1000) + (8 * 1000000h) +DD (OP_d178 - OP_1000) + (1 * 1000000h) +DD (OP_d179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_d180 - OP_1000) + (8 * 1000000h) +DD (OP_d188 - OP_1000) + (8 * 1000000h) +DD (OP_d190 - OP_1000) + (8 * 1000000h) +DD (OP_d198 - OP_1000) + (8 * 1000000h) +DD (OP_d1a0 - OP_1000) + (8 * 1000000h) +DD (OP_d1a8 - OP_1000) + (8 * 1000000h) +DD (OP_d1b0 - OP_1000) + (8 * 1000000h) +DD (OP_d1b8 - OP_1000) + (1 * 1000000h) +DD (OP_d1b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_d1c0 - OP_1000) + (16 * 1000000h) +DD (OP_d1d0 - OP_1000) + (8 * 1000000h) +DD (OP_d1d8 - OP_1000) + (8 * 1000000h) +DD (OP_d1e0 - OP_1000) + (8 * 1000000h) +DD (OP_d1e8 - OP_1000) + (8 * 1000000h) +DD (OP_d1f0 - OP_1000) + (8 * 1000000h) +DD (OP_d1f8 - OP_1000) + (1 * 1000000h) +DD (OP_d1f9 - OP_1000) + (1 * 1000000h) +DD (OP_d1fa - OP_1000) + (1 * 1000000h) +DD (OP_d1fb - OP_1000) + (1 * 1000000h) +DD (OP_d1fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_d010 - OP_1000) + (8 * 1000000h) +DD (OP_d018 - OP_1000) + (7 * 1000000h) +DD (OP_d01f - OP_1000) + (1 * 1000000h) +DD (OP_d020 - OP_1000) + (7 * 1000000h) +DD (OP_d027 - OP_1000) + (1 * 1000000h) +DD (OP_d028 - OP_1000) + (8 * 1000000h) +DD (OP_d030 - OP_1000) + (8 * 1000000h) +DD (OP_d038 - OP_1000) + (1 * 1000000h) +DD (OP_d039 - OP_1000) + (1 * 1000000h) +DD (OP_d03a - OP_1000) + (1 * 1000000h) +DD (OP_d03b - OP_1000) + (1 * 1000000h) +DD (OP_d03c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d040 - OP_1000) + (16 * 1000000h) +DD (OP_d050 - OP_1000) + (8 * 1000000h) +DD (OP_d058 - OP_1000) + (8 * 1000000h) +DD (OP_d060 - OP_1000) + (8 * 1000000h) +DD (OP_d068 - OP_1000) + (8 * 1000000h) +DD (OP_d070 - OP_1000) + (8 * 1000000h) +DD (OP_d078 - OP_1000) + (1 * 1000000h) +DD (OP_d079 - OP_1000) + (1 * 1000000h) +DD (OP_d07a - OP_1000) + (1 * 1000000h) +DD (OP_d07b - OP_1000) + (1 * 1000000h) +DD (OP_d07c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d080 - OP_1000) + (16 * 1000000h) +DD (OP_d090 - OP_1000) + (8 * 1000000h) +DD (OP_d098 - OP_1000) + (8 * 1000000h) +DD (OP_d0a0 - OP_1000) + (8 * 1000000h) +DD (OP_d0a8 - OP_1000) + (8 * 1000000h) +DD (OP_d0b0 - OP_1000) + (8 * 1000000h) +DD (OP_d0b8 - OP_1000) + (1 * 1000000h) +DD (OP_d0b9 - OP_1000) + (1 * 1000000h) +DD (OP_d0ba - OP_1000) + (1 * 1000000h) +DD (OP_d0bb - OP_1000) + (1 * 1000000h) +DD (OP_d0bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d0c0 - OP_1000) + (16 * 1000000h) +DD (OP_d0d0 - OP_1000) + (8 * 1000000h) +DD (OP_d0d8 - OP_1000) + (8 * 1000000h) +DD (OP_d0e0 - OP_1000) + (8 * 1000000h) +DD (OP_d0e8 - OP_1000) + (8 * 1000000h) +DD (OP_d0f0 - OP_1000) + (8 * 1000000h) +DD (OP_d0f8 - OP_1000) + (1 * 1000000h) +DD (OP_d0f9 - OP_1000) + (1 * 1000000h) +DD (OP_d0fa - OP_1000) + (1 * 1000000h) +DD (OP_d0fb - OP_1000) + (1 * 1000000h) +DD (OP_d0fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d100 - OP_1000) + (8 * 1000000h) +DD (OP_d108 - OP_1000) + (8 * 1000000h) +DD (OP_d110 - OP_1000) + (8 * 1000000h) +DD (OP_d118 - OP_1000) + (7 * 1000000h) +DD (OP_d11f - OP_1000) + (1 * 1000000h) +DD (OP_d120 - OP_1000) + (7 * 1000000h) +DD (OP_d127 - OP_1000) + (1 * 1000000h) +DD (OP_d128 - OP_1000) + (8 * 1000000h) +DD (OP_d130 - OP_1000) + (8 * 1000000h) +DD (OP_d138 - OP_1000) + (1 * 1000000h) +DD (OP_d139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_d140 - OP_1000) + (8 * 1000000h) +DD (OP_d148 - OP_1000) + (8 * 1000000h) +DD (OP_d150 - OP_1000) + (8 * 1000000h) +DD (OP_d158 - OP_1000) + (8 * 1000000h) +DD (OP_d160 - OP_1000) + (8 * 1000000h) +DD (OP_d168 - OP_1000) + (8 * 1000000h) +DD (OP_d170 - OP_1000) + (8 * 1000000h) +DD (OP_d178 - OP_1000) + (1 * 1000000h) +DD (OP_d179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_d180 - OP_1000) + (8 * 1000000h) +DD (OP_d188 - OP_1000) + (8 * 1000000h) +DD (OP_d190 - OP_1000) + (8 * 1000000h) +DD (OP_d198 - OP_1000) + (8 * 1000000h) +DD (OP_d1a0 - OP_1000) + (8 * 1000000h) +DD (OP_d1a8 - OP_1000) + (8 * 1000000h) +DD (OP_d1b0 - OP_1000) + (8 * 1000000h) +DD (OP_d1b8 - OP_1000) + (1 * 1000000h) +DD (OP_d1b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_d1c0 - OP_1000) + (16 * 1000000h) +DD (OP_d1d0 - OP_1000) + (8 * 1000000h) +DD (OP_d1d8 - OP_1000) + (8 * 1000000h) +DD (OP_d1e0 - OP_1000) + (8 * 1000000h) +DD (OP_d1e8 - OP_1000) + (8 * 1000000h) +DD (OP_d1f0 - OP_1000) + (8 * 1000000h) +DD (OP_d1f8 - OP_1000) + (1 * 1000000h) +DD (OP_d1f9 - OP_1000) + (1 * 1000000h) +DD (OP_d1fa - OP_1000) + (1 * 1000000h) +DD (OP_d1fb - OP_1000) + (1 * 1000000h) +DD (OP_d1fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_d010 - OP_1000) + (8 * 1000000h) +DD (OP_d018 - OP_1000) + (7 * 1000000h) +DD (OP_d01f - OP_1000) + (1 * 1000000h) +DD (OP_d020 - OP_1000) + (7 * 1000000h) +DD (OP_d027 - OP_1000) + (1 * 1000000h) +DD (OP_d028 - OP_1000) + (8 * 1000000h) +DD (OP_d030 - OP_1000) + (8 * 1000000h) +DD (OP_d038 - OP_1000) + (1 * 1000000h) +DD (OP_d039 - OP_1000) + (1 * 1000000h) +DD (OP_d03a - OP_1000) + (1 * 1000000h) +DD (OP_d03b - OP_1000) + (1 * 1000000h) +DD (OP_d03c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d040 - OP_1000) + (16 * 1000000h) +DD (OP_d050 - OP_1000) + (8 * 1000000h) +DD (OP_d058 - OP_1000) + (8 * 1000000h) +DD (OP_d060 - OP_1000) + (8 * 1000000h) +DD (OP_d068 - OP_1000) + (8 * 1000000h) +DD (OP_d070 - OP_1000) + (8 * 1000000h) +DD (OP_d078 - OP_1000) + (1 * 1000000h) +DD (OP_d079 - OP_1000) + (1 * 1000000h) +DD (OP_d07a - OP_1000) + (1 * 1000000h) +DD (OP_d07b - OP_1000) + (1 * 1000000h) +DD (OP_d07c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d080 - OP_1000) + (16 * 1000000h) +DD (OP_d090 - OP_1000) + (8 * 1000000h) +DD (OP_d098 - OP_1000) + (8 * 1000000h) +DD (OP_d0a0 - OP_1000) + (8 * 1000000h) +DD (OP_d0a8 - OP_1000) + (8 * 1000000h) +DD (OP_d0b0 - OP_1000) + (8 * 1000000h) +DD (OP_d0b8 - OP_1000) + (1 * 1000000h) +DD (OP_d0b9 - OP_1000) + (1 * 1000000h) +DD (OP_d0ba - OP_1000) + (1 * 1000000h) +DD (OP_d0bb - OP_1000) + (1 * 1000000h) +DD (OP_d0bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d0c0 - OP_1000) + (16 * 1000000h) +DD (OP_d0d0 - OP_1000) + (8 * 1000000h) +DD (OP_d0d8 - OP_1000) + (8 * 1000000h) +DD (OP_d0e0 - OP_1000) + (8 * 1000000h) +DD (OP_d0e8 - OP_1000) + (8 * 1000000h) +DD (OP_d0f0 - OP_1000) + (8 * 1000000h) +DD (OP_d0f8 - OP_1000) + (1 * 1000000h) +DD (OP_d0f9 - OP_1000) + (1 * 1000000h) +DD (OP_d0fa - OP_1000) + (1 * 1000000h) +DD (OP_d0fb - OP_1000) + (1 * 1000000h) +DD (OP_d0fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d100 - OP_1000) + (8 * 1000000h) +DD (OP_d108 - OP_1000) + (8 * 1000000h) +DD (OP_d110 - OP_1000) + (8 * 1000000h) +DD (OP_d118 - OP_1000) + (7 * 1000000h) +DD (OP_d11f - OP_1000) + (1 * 1000000h) +DD (OP_d120 - OP_1000) + (7 * 1000000h) +DD (OP_d127 - OP_1000) + (1 * 1000000h) +DD (OP_d128 - OP_1000) + (8 * 1000000h) +DD (OP_d130 - OP_1000) + (8 * 1000000h) +DD (OP_d138 - OP_1000) + (1 * 1000000h) +DD (OP_d139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_d140 - OP_1000) + (8 * 1000000h) +DD (OP_d148 - OP_1000) + (8 * 1000000h) +DD (OP_d150 - OP_1000) + (8 * 1000000h) +DD (OP_d158 - OP_1000) + (8 * 1000000h) +DD (OP_d160 - OP_1000) + (8 * 1000000h) +DD (OP_d168 - OP_1000) + (8 * 1000000h) +DD (OP_d170 - OP_1000) + (8 * 1000000h) +DD (OP_d178 - OP_1000) + (1 * 1000000h) +DD (OP_d179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_d180 - OP_1000) + (8 * 1000000h) +DD (OP_d188 - OP_1000) + (8 * 1000000h) +DD (OP_d190 - OP_1000) + (8 * 1000000h) +DD (OP_d198 - OP_1000) + (8 * 1000000h) +DD (OP_d1a0 - OP_1000) + (8 * 1000000h) +DD (OP_d1a8 - OP_1000) + (8 * 1000000h) +DD (OP_d1b0 - OP_1000) + (8 * 1000000h) +DD (OP_d1b8 - OP_1000) + (1 * 1000000h) +DD (OP_d1b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_d1c0 - OP_1000) + (16 * 1000000h) +DD (OP_d1d0 - OP_1000) + (8 * 1000000h) +DD (OP_d1d8 - OP_1000) + (8 * 1000000h) +DD (OP_d1e0 - OP_1000) + (8 * 1000000h) +DD (OP_d1e8 - OP_1000) + (8 * 1000000h) +DD (OP_d1f0 - OP_1000) + (8 * 1000000h) +DD (OP_d1f8 - OP_1000) + (1 * 1000000h) +DD (OP_d1f9 - OP_1000) + (1 * 1000000h) +DD (OP_d1fa - OP_1000) + (1 * 1000000h) +DD (OP_d1fb - OP_1000) + (1 * 1000000h) +DD (OP_d1fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_d010 - OP_1000) + (8 * 1000000h) +DD (OP_d018 - OP_1000) + (7 * 1000000h) +DD (OP_d01f - OP_1000) + (1 * 1000000h) +DD (OP_d020 - OP_1000) + (7 * 1000000h) +DD (OP_d027 - OP_1000) + (1 * 1000000h) +DD (OP_d028 - OP_1000) + (8 * 1000000h) +DD (OP_d030 - OP_1000) + (8 * 1000000h) +DD (OP_d038 - OP_1000) + (1 * 1000000h) +DD (OP_d039 - OP_1000) + (1 * 1000000h) +DD (OP_d03a - OP_1000) + (1 * 1000000h) +DD (OP_d03b - OP_1000) + (1 * 1000000h) +DD (OP_d03c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d040 - OP_1000) + (16 * 1000000h) +DD (OP_d050 - OP_1000) + (8 * 1000000h) +DD (OP_d058 - OP_1000) + (8 * 1000000h) +DD (OP_d060 - OP_1000) + (8 * 1000000h) +DD (OP_d068 - OP_1000) + (8 * 1000000h) +DD (OP_d070 - OP_1000) + (8 * 1000000h) +DD (OP_d078 - OP_1000) + (1 * 1000000h) +DD (OP_d079 - OP_1000) + (1 * 1000000h) +DD (OP_d07a - OP_1000) + (1 * 1000000h) +DD (OP_d07b - OP_1000) + (1 * 1000000h) +DD (OP_d07c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d080 - OP_1000) + (16 * 1000000h) +DD (OP_d090 - OP_1000) + (8 * 1000000h) +DD (OP_d098 - OP_1000) + (8 * 1000000h) +DD (OP_d0a0 - OP_1000) + (8 * 1000000h) +DD (OP_d0a8 - OP_1000) + (8 * 1000000h) +DD (OP_d0b0 - OP_1000) + (8 * 1000000h) +DD (OP_d0b8 - OP_1000) + (1 * 1000000h) +DD (OP_d0b9 - OP_1000) + (1 * 1000000h) +DD (OP_d0ba - OP_1000) + (1 * 1000000h) +DD (OP_d0bb - OP_1000) + (1 * 1000000h) +DD (OP_d0bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d0c0 - OP_1000) + (16 * 1000000h) +DD (OP_d0d0 - OP_1000) + (8 * 1000000h) +DD (OP_d0d8 - OP_1000) + (8 * 1000000h) +DD (OP_d0e0 - OP_1000) + (8 * 1000000h) +DD (OP_d0e8 - OP_1000) + (8 * 1000000h) +DD (OP_d0f0 - OP_1000) + (8 * 1000000h) +DD (OP_d0f8 - OP_1000) + (1 * 1000000h) +DD (OP_d0f9 - OP_1000) + (1 * 1000000h) +DD (OP_d0fa - OP_1000) + (1 * 1000000h) +DD (OP_d0fb - OP_1000) + (1 * 1000000h) +DD (OP_d0fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d100 - OP_1000) + (8 * 1000000h) +DD (OP_d108 - OP_1000) + (8 * 1000000h) +DD (OP_d110 - OP_1000) + (8 * 1000000h) +DD (OP_d118 - OP_1000) + (7 * 1000000h) +DD (OP_d11f - OP_1000) + (1 * 1000000h) +DD (OP_d120 - OP_1000) + (7 * 1000000h) +DD (OP_d127 - OP_1000) + (1 * 1000000h) +DD (OP_d128 - OP_1000) + (8 * 1000000h) +DD (OP_d130 - OP_1000) + (8 * 1000000h) +DD (OP_d138 - OP_1000) + (1 * 1000000h) +DD (OP_d139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_d140 - OP_1000) + (8 * 1000000h) +DD (OP_d148 - OP_1000) + (8 * 1000000h) +DD (OP_d150 - OP_1000) + (8 * 1000000h) +DD (OP_d158 - OP_1000) + (8 * 1000000h) +DD (OP_d160 - OP_1000) + (8 * 1000000h) +DD (OP_d168 - OP_1000) + (8 * 1000000h) +DD (OP_d170 - OP_1000) + (8 * 1000000h) +DD (OP_d178 - OP_1000) + (1 * 1000000h) +DD (OP_d179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_d180 - OP_1000) + (8 * 1000000h) +DD (OP_d188 - OP_1000) + (8 * 1000000h) +DD (OP_d190 - OP_1000) + (8 * 1000000h) +DD (OP_d198 - OP_1000) + (8 * 1000000h) +DD (OP_d1a0 - OP_1000) + (8 * 1000000h) +DD (OP_d1a8 - OP_1000) + (8 * 1000000h) +DD (OP_d1b0 - OP_1000) + (8 * 1000000h) +DD (OP_d1b8 - OP_1000) + (1 * 1000000h) +DD (OP_d1b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_d1c0 - OP_1000) + (16 * 1000000h) +DD (OP_d1d0 - OP_1000) + (8 * 1000000h) +DD (OP_d1d8 - OP_1000) + (8 * 1000000h) +DD (OP_d1e0 - OP_1000) + (8 * 1000000h) +DD (OP_d1e8 - OP_1000) + (8 * 1000000h) +DD (OP_d1f0 - OP_1000) + (8 * 1000000h) +DD (OP_d1f8 - OP_1000) + (1 * 1000000h) +DD (OP_d1f9 - OP_1000) + (1 * 1000000h) +DD (OP_d1fa - OP_1000) + (1 * 1000000h) +DD (OP_d1fb - OP_1000) + (1 * 1000000h) +DD (OP_d1fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d000 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (8 * 1000000h) +DD (OP_d010 - OP_1000) + (8 * 1000000h) +DD (OP_d018 - OP_1000) + (7 * 1000000h) +DD (OP_d01f - OP_1000) + (1 * 1000000h) +DD (OP_d020 - OP_1000) + (7 * 1000000h) +DD (OP_d027 - OP_1000) + (1 * 1000000h) +DD (OP_d028 - OP_1000) + (8 * 1000000h) +DD (OP_d030 - OP_1000) + (8 * 1000000h) +DD (OP_d038 - OP_1000) + (1 * 1000000h) +DD (OP_d039 - OP_1000) + (1 * 1000000h) +DD (OP_d03a - OP_1000) + (1 * 1000000h) +DD (OP_d03b - OP_1000) + (1 * 1000000h) +DD (OP_d03c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d040 - OP_1000) + (16 * 1000000h) +DD (OP_d050 - OP_1000) + (8 * 1000000h) +DD (OP_d058 - OP_1000) + (8 * 1000000h) +DD (OP_d060 - OP_1000) + (8 * 1000000h) +DD (OP_d068 - OP_1000) + (8 * 1000000h) +DD (OP_d070 - OP_1000) + (8 * 1000000h) +DD (OP_d078 - OP_1000) + (1 * 1000000h) +DD (OP_d079 - OP_1000) + (1 * 1000000h) +DD (OP_d07a - OP_1000) + (1 * 1000000h) +DD (OP_d07b - OP_1000) + (1 * 1000000h) +DD (OP_d07c - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d080 - OP_1000) + (16 * 1000000h) +DD (OP_d090 - OP_1000) + (8 * 1000000h) +DD (OP_d098 - OP_1000) + (8 * 1000000h) +DD (OP_d0a0 - OP_1000) + (8 * 1000000h) +DD (OP_d0a8 - OP_1000) + (8 * 1000000h) +DD (OP_d0b0 - OP_1000) + (8 * 1000000h) +DD (OP_d0b8 - OP_1000) + (1 * 1000000h) +DD (OP_d0b9 - OP_1000) + (1 * 1000000h) +DD (OP_d0ba - OP_1000) + (1 * 1000000h) +DD (OP_d0bb - OP_1000) + (1 * 1000000h) +DD (OP_d0bc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d0c0 - OP_1000) + (16 * 1000000h) +DD (OP_d0d0 - OP_1000) + (8 * 1000000h) +DD (OP_d0d8 - OP_1000) + (8 * 1000000h) +DD (OP_d0e0 - OP_1000) + (8 * 1000000h) +DD (OP_d0e8 - OP_1000) + (8 * 1000000h) +DD (OP_d0f0 - OP_1000) + (8 * 1000000h) +DD (OP_d0f8 - OP_1000) + (1 * 1000000h) +DD (OP_d0f9 - OP_1000) + (1 * 1000000h) +DD (OP_d0fa - OP_1000) + (1 * 1000000h) +DD (OP_d0fb - OP_1000) + (1 * 1000000h) +DD (OP_d0fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_d100 - OP_1000) + (8 * 1000000h) +DD (OP_d108 - OP_1000) + (8 * 1000000h) +DD (OP_d110 - OP_1000) + (8 * 1000000h) +DD (OP_d118 - OP_1000) + (7 * 1000000h) +DD (OP_d11f - OP_1000) + (1 * 1000000h) +DD (OP_d120 - OP_1000) + (7 * 1000000h) +DD (OP_d127 - OP_1000) + (1 * 1000000h) +DD (OP_d128 - OP_1000) + (8 * 1000000h) +DD (OP_d130 - OP_1000) + (8 * 1000000h) +DD (OP_d138 - OP_1000) + (1 * 1000000h) +DD (OP_d139 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_d140 - OP_1000) + (8 * 1000000h) +DD (OP_d148 - OP_1000) + (8 * 1000000h) +DD (OP_d150 - OP_1000) + (8 * 1000000h) +DD (OP_d158 - OP_1000) + (8 * 1000000h) +DD (OP_d160 - OP_1000) + (8 * 1000000h) +DD (OP_d168 - OP_1000) + (8 * 1000000h) +DD (OP_d170 - OP_1000) + (8 * 1000000h) +DD (OP_d178 - OP_1000) + (1 * 1000000h) +DD (OP_d179 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_d180 - OP_1000) + (8 * 1000000h) +DD (OP_d188 - OP_1000) + (8 * 1000000h) +DD (OP_d190 - OP_1000) + (8 * 1000000h) +DD (OP_d198 - OP_1000) + (8 * 1000000h) +DD (OP_d1a0 - OP_1000) + (8 * 1000000h) +DD (OP_d1a8 - OP_1000) + (8 * 1000000h) +DD (OP_d1b0 - OP_1000) + (8 * 1000000h) +DD (OP_d1b8 - OP_1000) + (1 * 1000000h) +DD (OP_d1b9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_d1c0 - OP_1000) + (16 * 1000000h) +DD (OP_d1d0 - OP_1000) + (8 * 1000000h) +DD (OP_d1d8 - OP_1000) + (8 * 1000000h) +DD (OP_d1e0 - OP_1000) + (8 * 1000000h) +DD (OP_d1e8 - OP_1000) + (8 * 1000000h) +DD (OP_d1f0 - OP_1000) + (8 * 1000000h) +DD (OP_d1f8 - OP_1000) + (1 * 1000000h) +DD (OP_d1f9 - OP_1000) + (1 * 1000000h) +DD (OP_d1fa - OP_1000) + (1 * 1000000h) +DD (OP_d1fb - OP_1000) + (1 * 1000000h) +DD (OP_d1fc - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (3 * 1000000h) +DD (OP_e000 - OP_1000) + (8 * 1000000h) +DD (OP_e008 - OP_1000) + (8 * 1000000h) +DD (OP_e010 - OP_1000) + (8 * 1000000h) +DD (OP_e018 - OP_1000) + (8 * 1000000h) +DD (OP_e020 - OP_1000) + (8 * 1000000h) +DD (OP_e028 - OP_1000) + (8 * 1000000h) +DD (OP_e030 - OP_1000) + (8 * 1000000h) +DD (OP_e038 - OP_1000) + (8 * 1000000h) +DD (OP_e040 - OP_1000) + (8 * 1000000h) +DD (OP_e048 - OP_1000) + (8 * 1000000h) +DD (OP_e050 - OP_1000) + (8 * 1000000h) +DD (OP_e058 - OP_1000) + (8 * 1000000h) +DD (OP_e060 - OP_1000) + (8 * 1000000h) +DD (OP_e068 - OP_1000) + (8 * 1000000h) +DD (OP_e070 - OP_1000) + (8 * 1000000h) +DD (OP_e078 - OP_1000) + (8 * 1000000h) +DD (OP_e080 - OP_1000) + (8 * 1000000h) +DD (OP_e088 - OP_1000) + (8 * 1000000h) +DD (OP_e090 - OP_1000) + (8 * 1000000h) +DD (OP_e098 - OP_1000) + (8 * 1000000h) +DD (OP_e0a0 - OP_1000) + (8 * 1000000h) +DD (OP_e0a8 - OP_1000) + (8 * 1000000h) +DD (OP_e0b0 - OP_1000) + (8 * 1000000h) +DD (OP_e0b8 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (16 * 1000000h) +DD (OP_e0d0 - OP_1000) + (8 * 1000000h) +DD (OP_e0d8 - OP_1000) + (8 * 1000000h) +DD (OP_e0e0 - OP_1000) + (8 * 1000000h) +DD (OP_e0e8 - OP_1000) + (8 * 1000000h) +DD (OP_e0f0 - OP_1000) + (8 * 1000000h) +DD (OP_e0f8 - OP_1000) + (1 * 1000000h) +DD (OP_e0f9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_e100 - OP_1000) + (8 * 1000000h) +DD (OP_e108 - OP_1000) + (8 * 1000000h) +DD (OP_e110 - OP_1000) + (8 * 1000000h) +DD (OP_e118 - OP_1000) + (8 * 1000000h) +DD (OP_e120 - OP_1000) + (8 * 1000000h) +DD (OP_e128 - OP_1000) + (8 * 1000000h) +DD (OP_e130 - OP_1000) + (8 * 1000000h) +DD (OP_e138 - OP_1000) + (8 * 1000000h) +DD (OP_e140 - OP_1000) + (8 * 1000000h) +DD (OP_e148 - OP_1000) + (8 * 1000000h) +DD (OP_e150 - OP_1000) + (8 * 1000000h) +DD (OP_e158 - OP_1000) + (8 * 1000000h) +DD (OP_e160 - OP_1000) + (8 * 1000000h) +DD (OP_e168 - OP_1000) + (8 * 1000000h) +DD (OP_e170 - OP_1000) + (8 * 1000000h) +DD (OP_e178 - OP_1000) + (8 * 1000000h) +DD (OP_e180 - OP_1000) + (8 * 1000000h) +DD (OP_e188 - OP_1000) + (8 * 1000000h) +DD (OP_e190 - OP_1000) + (8 * 1000000h) +DD (OP_e198 - OP_1000) + (8 * 1000000h) +DD (OP_e1a0 - OP_1000) + (8 * 1000000h) +DD (OP_e1a8 - OP_1000) + (8 * 1000000h) +DD (OP_e1b0 - OP_1000) + (8 * 1000000h) +DD (OP_e1b8 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (16 * 1000000h) +DD (OP_e1d0 - OP_1000) + (8 * 1000000h) +DD (OP_e1d8 - OP_1000) + (8 * 1000000h) +DD (OP_e1e0 - OP_1000) + (8 * 1000000h) +DD (OP_e1e8 - OP_1000) + (8 * 1000000h) +DD (OP_e1f0 - OP_1000) + (8 * 1000000h) +DD (OP_e1f8 - OP_1000) + (1 * 1000000h) +DD (OP_e1f9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_e000 - OP_1000) + (8 * 1000000h) +DD (OP_e008 - OP_1000) + (8 * 1000000h) +DD (OP_e010 - OP_1000) + (8 * 1000000h) +DD (OP_e018 - OP_1000) + (8 * 1000000h) +DD (OP_e020 - OP_1000) + (8 * 1000000h) +DD (OP_e028 - OP_1000) + (8 * 1000000h) +DD (OP_e030 - OP_1000) + (8 * 1000000h) +DD (OP_e038 - OP_1000) + (8 * 1000000h) +DD (OP_e040 - OP_1000) + (8 * 1000000h) +DD (OP_e048 - OP_1000) + (8 * 1000000h) +DD (OP_e050 - OP_1000) + (8 * 1000000h) +DD (OP_e058 - OP_1000) + (8 * 1000000h) +DD (OP_e060 - OP_1000) + (8 * 1000000h) +DD (OP_e068 - OP_1000) + (8 * 1000000h) +DD (OP_e070 - OP_1000) + (8 * 1000000h) +DD (OP_e078 - OP_1000) + (8 * 1000000h) +DD (OP_e080 - OP_1000) + (8 * 1000000h) +DD (OP_e088 - OP_1000) + (8 * 1000000h) +DD (OP_e090 - OP_1000) + (8 * 1000000h) +DD (OP_e098 - OP_1000) + (8 * 1000000h) +DD (OP_e0a0 - OP_1000) + (8 * 1000000h) +DD (OP_e0a8 - OP_1000) + (8 * 1000000h) +DD (OP_e0b0 - OP_1000) + (8 * 1000000h) +DD (OP_e0b8 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (16 * 1000000h) +DD (OP_e2d0 - OP_1000) + (8 * 1000000h) +DD (OP_e2d8 - OP_1000) + (8 * 1000000h) +DD (OP_e2e0 - OP_1000) + (8 * 1000000h) +DD (OP_e2e8 - OP_1000) + (8 * 1000000h) +DD (OP_e2f0 - OP_1000) + (8 * 1000000h) +DD (OP_e2f8 - OP_1000) + (1 * 1000000h) +DD (OP_e2f9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_e300 - OP_1000) + (8 * 1000000h) +DD (OP_e108 - OP_1000) + (8 * 1000000h) +DD (OP_e110 - OP_1000) + (8 * 1000000h) +DD (OP_e118 - OP_1000) + (8 * 1000000h) +DD (OP_e120 - OP_1000) + (8 * 1000000h) +DD (OP_e128 - OP_1000) + (8 * 1000000h) +DD (OP_e130 - OP_1000) + (8 * 1000000h) +DD (OP_e138 - OP_1000) + (8 * 1000000h) +DD (OP_e340 - OP_1000) + (8 * 1000000h) +DD (OP_e148 - OP_1000) + (8 * 1000000h) +DD (OP_e150 - OP_1000) + (8 * 1000000h) +DD (OP_e158 - OP_1000) + (8 * 1000000h) +DD (OP_e160 - OP_1000) + (8 * 1000000h) +DD (OP_e168 - OP_1000) + (8 * 1000000h) +DD (OP_e170 - OP_1000) + (8 * 1000000h) +DD (OP_e178 - OP_1000) + (8 * 1000000h) +DD (OP_e380 - OP_1000) + (8 * 1000000h) +DD (OP_e188 - OP_1000) + (8 * 1000000h) +DD (OP_e190 - OP_1000) + (8 * 1000000h) +DD (OP_e198 - OP_1000) + (8 * 1000000h) +DD (OP_e1a0 - OP_1000) + (8 * 1000000h) +DD (OP_e1a8 - OP_1000) + (8 * 1000000h) +DD (OP_e1b0 - OP_1000) + (8 * 1000000h) +DD (OP_e1b8 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (16 * 1000000h) +DD (OP_e3d0 - OP_1000) + (8 * 1000000h) +DD (OP_e3d8 - OP_1000) + (8 * 1000000h) +DD (OP_e3e0 - OP_1000) + (8 * 1000000h) +DD (OP_e3e8 - OP_1000) + (8 * 1000000h) +DD (OP_e3f0 - OP_1000) + (8 * 1000000h) +DD (OP_e3f8 - OP_1000) + (1 * 1000000h) +DD (OP_e3f9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_e000 - OP_1000) + (8 * 1000000h) +DD (OP_e008 - OP_1000) + (8 * 1000000h) +DD (OP_e010 - OP_1000) + (8 * 1000000h) +DD (OP_e018 - OP_1000) + (8 * 1000000h) +DD (OP_e020 - OP_1000) + (8 * 1000000h) +DD (OP_e028 - OP_1000) + (8 * 1000000h) +DD (OP_e030 - OP_1000) + (8 * 1000000h) +DD (OP_e038 - OP_1000) + (8 * 1000000h) +DD (OP_e040 - OP_1000) + (8 * 1000000h) +DD (OP_e048 - OP_1000) + (8 * 1000000h) +DD (OP_e050 - OP_1000) + (8 * 1000000h) +DD (OP_e058 - OP_1000) + (8 * 1000000h) +DD (OP_e060 - OP_1000) + (8 * 1000000h) +DD (OP_e068 - OP_1000) + (8 * 1000000h) +DD (OP_e070 - OP_1000) + (8 * 1000000h) +DD (OP_e078 - OP_1000) + (8 * 1000000h) +DD (OP_e080 - OP_1000) + (8 * 1000000h) +DD (OP_e088 - OP_1000) + (8 * 1000000h) +DD (OP_e090 - OP_1000) + (8 * 1000000h) +DD (OP_e098 - OP_1000) + (8 * 1000000h) +DD (OP_e0a0 - OP_1000) + (8 * 1000000h) +DD (OP_e0a8 - OP_1000) + (8 * 1000000h) +DD (OP_e0b0 - OP_1000) + (8 * 1000000h) +DD (OP_e0b8 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (16 * 1000000h) +DD (OP_e4d0 - OP_1000) + (8 * 1000000h) +DD (OP_e4d8 - OP_1000) + (8 * 1000000h) +DD (OP_e4e0 - OP_1000) + (8 * 1000000h) +DD (OP_e4e8 - OP_1000) + (8 * 1000000h) +DD (OP_e4f0 - OP_1000) + (8 * 1000000h) +DD (OP_e4f8 - OP_1000) + (1 * 1000000h) +DD (OP_e4f9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_e100 - OP_1000) + (8 * 1000000h) +DD (OP_e108 - OP_1000) + (8 * 1000000h) +DD (OP_e110 - OP_1000) + (8 * 1000000h) +DD (OP_e118 - OP_1000) + (8 * 1000000h) +DD (OP_e120 - OP_1000) + (8 * 1000000h) +DD (OP_e128 - OP_1000) + (8 * 1000000h) +DD (OP_e130 - OP_1000) + (8 * 1000000h) +DD (OP_e138 - OP_1000) + (8 * 1000000h) +DD (OP_e140 - OP_1000) + (8 * 1000000h) +DD (OP_e148 - OP_1000) + (8 * 1000000h) +DD (OP_e150 - OP_1000) + (8 * 1000000h) +DD (OP_e158 - OP_1000) + (8 * 1000000h) +DD (OP_e160 - OP_1000) + (8 * 1000000h) +DD (OP_e168 - OP_1000) + (8 * 1000000h) +DD (OP_e170 - OP_1000) + (8 * 1000000h) +DD (OP_e178 - OP_1000) + (8 * 1000000h) +DD (OP_e180 - OP_1000) + (8 * 1000000h) +DD (OP_e188 - OP_1000) + (8 * 1000000h) +DD (OP_e190 - OP_1000) + (8 * 1000000h) +DD (OP_e198 - OP_1000) + (8 * 1000000h) +DD (OP_e1a0 - OP_1000) + (8 * 1000000h) +DD (OP_e1a8 - OP_1000) + (8 * 1000000h) +DD (OP_e1b0 - OP_1000) + (8 * 1000000h) +DD (OP_e1b8 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (16 * 1000000h) +DD (OP_e5d0 - OP_1000) + (8 * 1000000h) +DD (OP_e5d8 - OP_1000) + (8 * 1000000h) +DD (OP_e5e0 - OP_1000) + (8 * 1000000h) +DD (OP_e5e8 - OP_1000) + (8 * 1000000h) +DD (OP_e5f0 - OP_1000) + (8 * 1000000h) +DD (OP_e5f8 - OP_1000) + (1 * 1000000h) +DD (OP_e5f9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_e000 - OP_1000) + (8 * 1000000h) +DD (OP_e008 - OP_1000) + (8 * 1000000h) +DD (OP_e010 - OP_1000) + (8 * 1000000h) +DD (OP_e018 - OP_1000) + (8 * 1000000h) +DD (OP_e020 - OP_1000) + (8 * 1000000h) +DD (OP_e028 - OP_1000) + (8 * 1000000h) +DD (OP_e030 - OP_1000) + (8 * 1000000h) +DD (OP_e038 - OP_1000) + (8 * 1000000h) +DD (OP_e040 - OP_1000) + (8 * 1000000h) +DD (OP_e048 - OP_1000) + (8 * 1000000h) +DD (OP_e050 - OP_1000) + (8 * 1000000h) +DD (OP_e058 - OP_1000) + (8 * 1000000h) +DD (OP_e060 - OP_1000) + (8 * 1000000h) +DD (OP_e068 - OP_1000) + (8 * 1000000h) +DD (OP_e070 - OP_1000) + (8 * 1000000h) +DD (OP_e078 - OP_1000) + (8 * 1000000h) +DD (OP_e080 - OP_1000) + (8 * 1000000h) +DD (OP_e088 - OP_1000) + (8 * 1000000h) +DD (OP_e090 - OP_1000) + (8 * 1000000h) +DD (OP_e098 - OP_1000) + (8 * 1000000h) +DD (OP_e0a0 - OP_1000) + (8 * 1000000h) +DD (OP_e0a8 - OP_1000) + (8 * 1000000h) +DD (OP_e0b0 - OP_1000) + (8 * 1000000h) +DD (OP_e0b8 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (16 * 1000000h) +DD (OP_e6d0 - OP_1000) + (8 * 1000000h) +DD (OP_e6d8 - OP_1000) + (8 * 1000000h) +DD (OP_e6e0 - OP_1000) + (8 * 1000000h) +DD (OP_e6e8 - OP_1000) + (8 * 1000000h) +DD (OP_e6f0 - OP_1000) + (8 * 1000000h) +DD (OP_e6f8 - OP_1000) + (1 * 1000000h) +DD (OP_e6f9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_e100 - OP_1000) + (8 * 1000000h) +DD (OP_e108 - OP_1000) + (8 * 1000000h) +DD (OP_e110 - OP_1000) + (8 * 1000000h) +DD (OP_e118 - OP_1000) + (8 * 1000000h) +DD (OP_e120 - OP_1000) + (8 * 1000000h) +DD (OP_e128 - OP_1000) + (8 * 1000000h) +DD (OP_e130 - OP_1000) + (8 * 1000000h) +DD (OP_e138 - OP_1000) + (8 * 1000000h) +DD (OP_e140 - OP_1000) + (8 * 1000000h) +DD (OP_e148 - OP_1000) + (8 * 1000000h) +DD (OP_e150 - OP_1000) + (8 * 1000000h) +DD (OP_e158 - OP_1000) + (8 * 1000000h) +DD (OP_e160 - OP_1000) + (8 * 1000000h) +DD (OP_e168 - OP_1000) + (8 * 1000000h) +DD (OP_e170 - OP_1000) + (8 * 1000000h) +DD (OP_e178 - OP_1000) + (8 * 1000000h) +DD (OP_e180 - OP_1000) + (8 * 1000000h) +DD (OP_e188 - OP_1000) + (8 * 1000000h) +DD (OP_e190 - OP_1000) + (8 * 1000000h) +DD (OP_e198 - OP_1000) + (8 * 1000000h) +DD (OP_e1a0 - OP_1000) + (8 * 1000000h) +DD (OP_e1a8 - OP_1000) + (8 * 1000000h) +DD (OP_e1b0 - OP_1000) + (8 * 1000000h) +DD (OP_e1b8 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (16 * 1000000h) +DD (OP_e7d0 - OP_1000) + (8 * 1000000h) +DD (OP_e7d8 - OP_1000) + (8 * 1000000h) +DD (OP_e7e0 - OP_1000) + (8 * 1000000h) +DD (OP_e7e8 - OP_1000) + (8 * 1000000h) +DD (OP_e7f0 - OP_1000) + (8 * 1000000h) +DD (OP_e7f8 - OP_1000) + (1 * 1000000h) +DD (OP_e7f9 - OP_1000) + (1 * 1000000h) +DD (ILLEGAL - OP_1000) + (6 * 1000000h) +DD (OP_e000 - OP_1000) + (8 * 1000000h) +DD (OP_e008 - OP_1000) + (8 * 1000000h) +DD (OP_e010 - OP_1000) + (8 * 1000000h) +DD (OP_e018 - OP_1000) + (8 * 1000000h) +DD (OP_e020 - OP_1000) + (8 * 1000000h) +DD (OP_e028 - OP_1000) + (8 * 1000000h) +DD (OP_e030 - OP_1000) + (8 * 1000000h) +DD (OP_e038 - OP_1000) + (8 * 1000000h) +DD (OP_e040 - OP_1000) + (8 * 1000000h) +DD (OP_e048 - OP_1000) + (8 * 1000000h) +DD (OP_e050 - OP_1000) + (8 * 1000000h) +DD (OP_e058 - OP_1000) + (8 * 1000000h) +DD (OP_e060 - OP_1000) + (8 * 1000000h) +DD (OP_e068 - OP_1000) + (8 * 1000000h) +DD (OP_e070 - OP_1000) + (8 * 1000000h) +DD (OP_e078 - OP_1000) + (8 * 1000000h) +DD (OP_e080 - OP_1000) + (8 * 1000000h) +DD (OP_e088 - OP_1000) + (8 * 1000000h) +DD (OP_e090 - OP_1000) + (8 * 1000000h) +DD (OP_e098 - OP_1000) + (8 * 1000000h) +DD (OP_e0a0 - OP_1000) + (8 * 1000000h) +DD (OP_e0a8 - OP_1000) + (8 * 1000000h) +DD (OP_e0b0 - OP_1000) + (8 * 1000000h) +DD (OP_e0b8 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (64 * 1000000h) +DD (OP_e100 - OP_1000) + (8 * 1000000h) +DD (OP_e108 - OP_1000) + (8 * 1000000h) +DD (OP_e110 - OP_1000) + (8 * 1000000h) +DD (OP_e118 - OP_1000) + (8 * 1000000h) +DD (OP_e120 - OP_1000) + (8 * 1000000h) +DD (OP_e128 - OP_1000) + (8 * 1000000h) +DD (OP_e130 - OP_1000) + (8 * 1000000h) +DD (OP_e138 - OP_1000) + (8 * 1000000h) +DD (OP_e140 - OP_1000) + (8 * 1000000h) +DD (OP_e148 - OP_1000) + (8 * 1000000h) +DD (OP_e150 - OP_1000) + (8 * 1000000h) +DD (OP_e158 - OP_1000) + (8 * 1000000h) +DD (OP_e160 - OP_1000) + (8 * 1000000h) +DD (OP_e168 - OP_1000) + (8 * 1000000h) +DD (OP_e170 - OP_1000) + (8 * 1000000h) +DD (OP_e178 - OP_1000) + (8 * 1000000h) +DD (OP_e180 - OP_1000) + (8 * 1000000h) +DD (OP_e188 - OP_1000) + (8 * 1000000h) +DD (OP_e190 - OP_1000) + (8 * 1000000h) +DD (OP_e198 - OP_1000) + (8 * 1000000h) +DD (OP_e1a0 - OP_1000) + (8 * 1000000h) +DD (OP_e1a8 - OP_1000) + (8 * 1000000h) +DD (OP_e1b0 - OP_1000) + (8 * 1000000h) +DD (OP_e1b8 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (64 * 1000000h) +DD (OP_e000 - OP_1000) + (8 * 1000000h) +DD (OP_e008 - OP_1000) + (8 * 1000000h) +DD (OP_e010 - OP_1000) + (8 * 1000000h) +DD (OP_e018 - OP_1000) + (8 * 1000000h) +DD (OP_e020 - OP_1000) + (8 * 1000000h) +DD (OP_e028 - OP_1000) + (8 * 1000000h) +DD (OP_e030 - OP_1000) + (8 * 1000000h) +DD (OP_e038 - OP_1000) + (8 * 1000000h) +DD (OP_e040 - OP_1000) + (8 * 1000000h) +DD (OP_e048 - OP_1000) + (8 * 1000000h) +DD (OP_e050 - OP_1000) + (8 * 1000000h) +DD (OP_e058 - OP_1000) + (8 * 1000000h) +DD (OP_e060 - OP_1000) + (8 * 1000000h) +DD (OP_e068 - OP_1000) + (8 * 1000000h) +DD (OP_e070 - OP_1000) + (8 * 1000000h) +DD (OP_e078 - OP_1000) + (8 * 1000000h) +DD (OP_e080 - OP_1000) + (8 * 1000000h) +DD (OP_e088 - OP_1000) + (8 * 1000000h) +DD (OP_e090 - OP_1000) + (8 * 1000000h) +DD (OP_e098 - OP_1000) + (8 * 1000000h) +DD (OP_e0a0 - OP_1000) + (8 * 1000000h) +DD (OP_e0a8 - OP_1000) + (8 * 1000000h) +DD (OP_e0b0 - OP_1000) + (8 * 1000000h) +DD (OP_e0b8 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (64 * 1000000h) +DD (OP_e100 - OP_1000) + (8 * 1000000h) +DD (OP_e108 - OP_1000) + (8 * 1000000h) +DD (OP_e110 - OP_1000) + (8 * 1000000h) +DD (OP_e118 - OP_1000) + (8 * 1000000h) +DD (OP_e120 - OP_1000) + (8 * 1000000h) +DD (OP_e128 - OP_1000) + (8 * 1000000h) +DD (OP_e130 - OP_1000) + (8 * 1000000h) +DD (OP_e138 - OP_1000) + (8 * 1000000h) +DD (OP_e140 - OP_1000) + (8 * 1000000h) +DD (OP_e148 - OP_1000) + (8 * 1000000h) +DD (OP_e150 - OP_1000) + (8 * 1000000h) +DD (OP_e158 - OP_1000) + (8 * 1000000h) +DD (OP_e160 - OP_1000) + (8 * 1000000h) +DD (OP_e168 - OP_1000) + (8 * 1000000h) +DD (OP_e170 - OP_1000) + (8 * 1000000h) +DD (OP_e178 - OP_1000) + (8 * 1000000h) +DD (OP_e180 - OP_1000) + (8 * 1000000h) +DD (OP_e188 - OP_1000) + (8 * 1000000h) +DD (OP_e190 - OP_1000) + (8 * 1000000h) +DD (OP_e198 - OP_1000) + (8 * 1000000h) +DD (OP_e1a0 - OP_1000) + (8 * 1000000h) +DD (OP_e1a8 - OP_1000) + (8 * 1000000h) +DD (OP_e1b0 - OP_1000) + (8 * 1000000h) +DD (OP_e1b8 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (64 * 1000000h) +DD (OP_e000 - OP_1000) + (8 * 1000000h) +DD (OP_e008 - OP_1000) + (8 * 1000000h) +DD (OP_e010 - OP_1000) + (8 * 1000000h) +DD (OP_e018 - OP_1000) + (8 * 1000000h) +DD (OP_e020 - OP_1000) + (8 * 1000000h) +DD (OP_e028 - OP_1000) + (8 * 1000000h) +DD (OP_e030 - OP_1000) + (8 * 1000000h) +DD (OP_e038 - OP_1000) + (8 * 1000000h) +DD (OP_e040 - OP_1000) + (8 * 1000000h) +DD (OP_e048 - OP_1000) + (8 * 1000000h) +DD (OP_e050 - OP_1000) + (8 * 1000000h) +DD (OP_e058 - OP_1000) + (8 * 1000000h) +DD (OP_e060 - OP_1000) + (8 * 1000000h) +DD (OP_e068 - OP_1000) + (8 * 1000000h) +DD (OP_e070 - OP_1000) + (8 * 1000000h) +DD (OP_e078 - OP_1000) + (8 * 1000000h) +DD (OP_e080 - OP_1000) + (8 * 1000000h) +DD (OP_e088 - OP_1000) + (8 * 1000000h) +DD (OP_e090 - OP_1000) + (8 * 1000000h) +DD (OP_e098 - OP_1000) + (8 * 1000000h) +DD (OP_e0a0 - OP_1000) + (8 * 1000000h) +DD (OP_e0a8 - OP_1000) + (8 * 1000000h) +DD (OP_e0b0 - OP_1000) + (8 * 1000000h) +DD (OP_e0b8 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (64 * 1000000h) +DD (OP_e100 - OP_1000) + (8 * 1000000h) +DD (OP_e108 - OP_1000) + (8 * 1000000h) +DD (OP_e110 - OP_1000) + (8 * 1000000h) +DD (OP_e118 - OP_1000) + (8 * 1000000h) +DD (OP_e120 - OP_1000) + (8 * 1000000h) +DD (OP_e128 - OP_1000) + (8 * 1000000h) +DD (OP_e130 - OP_1000) + (8 * 1000000h) +DD (OP_e138 - OP_1000) + (8 * 1000000h) +DD (OP_e140 - OP_1000) + (8 * 1000000h) +DD (OP_e148 - OP_1000) + (8 * 1000000h) +DD (OP_e150 - OP_1000) + (8 * 1000000h) +DD (OP_e158 - OP_1000) + (8 * 1000000h) +DD (OP_e160 - OP_1000) + (8 * 1000000h) +DD (OP_e168 - OP_1000) + (8 * 1000000h) +DD (OP_e170 - OP_1000) + (8 * 1000000h) +DD (OP_e178 - OP_1000) + (8 * 1000000h) +DD (OP_e180 - OP_1000) + (8 * 1000000h) +DD (OP_e188 - OP_1000) + (8 * 1000000h) +DD (OP_e190 - OP_1000) + (8 * 1000000h) +DD (OP_e198 - OP_1000) + (8 * 1000000h) +DD (OP_e1a0 - OP_1000) + (8 * 1000000h) +DD (OP_e1a8 - OP_1000) + (8 * 1000000h) +DD (OP_e1b0 - OP_1000) + (8 * 1000000h) +DD (OP_e1b8 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (64 * 1000000h) +DD (OP_e000 - OP_1000) + (8 * 1000000h) +DD (OP_e008 - OP_1000) + (8 * 1000000h) +DD (OP_e010 - OP_1000) + (8 * 1000000h) +DD (OP_e018 - OP_1000) + (8 * 1000000h) +DD (OP_e020 - OP_1000) + (8 * 1000000h) +DD (OP_e028 - OP_1000) + (8 * 1000000h) +DD (OP_e030 - OP_1000) + (8 * 1000000h) +DD (OP_e038 - OP_1000) + (8 * 1000000h) +DD (OP_e040 - OP_1000) + (8 * 1000000h) +DD (OP_e048 - OP_1000) + (8 * 1000000h) +DD (OP_e050 - OP_1000) + (8 * 1000000h) +DD (OP_e058 - OP_1000) + (8 * 1000000h) +DD (OP_e060 - OP_1000) + (8 * 1000000h) +DD (OP_e068 - OP_1000) + (8 * 1000000h) +DD (OP_e070 - OP_1000) + (8 * 1000000h) +DD (OP_e078 - OP_1000) + (8 * 1000000h) +DD (OP_e080 - OP_1000) + (8 * 1000000h) +DD (OP_e088 - OP_1000) + (8 * 1000000h) +DD (OP_e090 - OP_1000) + (8 * 1000000h) +DD (OP_e098 - OP_1000) + (8 * 1000000h) +DD (OP_e0a0 - OP_1000) + (8 * 1000000h) +DD (OP_e0a8 - OP_1000) + (8 * 1000000h) +DD (OP_e0b0 - OP_1000) + (8 * 1000000h) +DD (OP_e0b8 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (64 * 1000000h) +DD (OP_e100 - OP_1000) + (8 * 1000000h) +DD (OP_e108 - OP_1000) + (8 * 1000000h) +DD (OP_e110 - OP_1000) + (8 * 1000000h) +DD (OP_e118 - OP_1000) + (8 * 1000000h) +DD (OP_e120 - OP_1000) + (8 * 1000000h) +DD (OP_e128 - OP_1000) + (8 * 1000000h) +DD (OP_e130 - OP_1000) + (8 * 1000000h) +DD (OP_e138 - OP_1000) + (8 * 1000000h) +DD (OP_e140 - OP_1000) + (8 * 1000000h) +DD (OP_e148 - OP_1000) + (8 * 1000000h) +DD (OP_e150 - OP_1000) + (8 * 1000000h) +DD (OP_e158 - OP_1000) + (8 * 1000000h) +DD (OP_e160 - OP_1000) + (8 * 1000000h) +DD (OP_e168 - OP_1000) + (8 * 1000000h) +DD (OP_e170 - OP_1000) + (8 * 1000000h) +DD (OP_e178 - OP_1000) + (8 * 1000000h) +DD (OP_e180 - OP_1000) + (8 * 1000000h) +DD (OP_e188 - OP_1000) + (8 * 1000000h) +DD (OP_e190 - OP_1000) + (8 * 1000000h) +DD (OP_e198 - OP_1000) + (8 * 1000000h) +DD (OP_e1a0 - OP_1000) + (8 * 1000000h) +DD (OP_e1a8 - OP_1000) + (8 * 1000000h) +DD (OP_e1b0 - OP_1000) + (8 * 1000000h) +DD (OP_e1b8 - OP_1000) + (8 * 1000000h) +DD (ILLEGAL - OP_1000) + (64 * 1000000h) +DD OP_f000 - OP_1000 +DW 4096 diff --git a/x68k/cpu_glue.c b/x68k/cpu_glue.c new file mode 100644 index 0000000..ece34bb --- /dev/null +++ b/x68k/cpu_glue.c @@ -0,0 +1,14 @@ +#include + +#include "common.h" +#include "m68000.h" + +int m68000_ICountBk; + +void +Error(const char *s) +{ + + printf("%s\n", s); + assert(0); +} diff --git a/x68k/crtc.c b/x68k/crtc.c new file mode 100644 index 0000000..652092d --- /dev/null +++ b/x68k/crtc.c @@ -0,0 +1,504 @@ +// --------------------------------------------------------------------------------------- +// CRTC.C - CRT Controller / Video Controller +// --------------------------------------------------------------------------------------- + +#include "common.h" +#include "windraw.h" +#include "winx68k.h" +#include "tvram.h" +#include "gvram.h" +#include "bg.h" +#include "m68000.h" +#include "crtc.h" + + +static WORD FastClearMask[16] = { + 0xffff, 0xfff0, 0xff0f, 0xff00, 0xf0ff, 0xf0f0, 0xf00f, 0xf000, + 0x0fff, 0x0ff0, 0x0f0f, 0x0f00, 0x00ff, 0x00f0, 0x000f, 0x0000 +}; + BYTE CRTC_Regs[24*2]; + BYTE CRTC_Mode = 0; + DWORD TextDotX = 768, TextDotY = 512; + WORD CRTC_VSTART, CRTC_VEND; + WORD CRTC_HSTART, CRTC_HEND; + DWORD TextScrollX = 0, TextScrollY = 0; + DWORD GrphScrollX[4] = {0, 0, 0, 0}; // 配列にしちゃった… + DWORD GrphScrollY[4] = {0, 0, 0, 0}; + + BYTE CRTC_FastClr = 0; + BYTE CRTC_SispScan = 0; + DWORD CRTC_FastClrLine = 0; + WORD CRTC_FastClrMask = 0; + WORD CRTC_IntLine = 0; + BYTE CRTC_VStep = 2; + + BYTE VCReg0[2] = {0, 0}; + BYTE VCReg1[2] = {0, 0}; + BYTE VCReg2[2] = {0, 0}; + + BYTE CRTC_RCFlag[2] = {0, 0}; + int HSYNC_CLK = 324; + + +// ----------------------------------------------------------------------- +// らすたーこぴー +// ----------------------------------------------------------------------- +void CRTC_RasterCopy(void) +{ + DWORD src, dst, line; + + line = (((DWORD)CRTC_Regs[0x2d])<<2); + src = (((DWORD)CRTC_Regs[0x2c])<<9); + dst = (((DWORD)CRTC_Regs[0x2d])<<9); + +#ifdef USE_ASM + if (CRTC_Regs[0x2b]&1) + _asm + { + mov ebx, src + mov edx, dst + mov cl, 128 + loop0: + mov eax, dword ptr TVRAM[ebx] + mov dword ptr TVRAM[edx], eax + add ebx, 4 + add edx, 4 + dec cl + jnz loop0 + } + if (CRTC_Regs[0x2b]&2) + _asm + { + mov ebx, src + mov edx, dst + mov cl, 128 + loop1: + mov eax, dword ptr TVRAM[ebx+0x20000] + mov dword ptr TVRAM[edx+0x20000], eax + add ebx, 4 + add edx, 4 + dec cl + jnz loop1 + } + if (CRTC_Regs[0x2b]&4) + _asm + { + mov ebx, src + mov edx, dst + mov cl, 128 + loop2: + mov eax, dword ptr TVRAM[ebx+0x40000] + mov dword ptr TVRAM[edx+0x40000], eax + add ebx, 4 + add edx, 4 + dec cl + jnz loop2 + } + if (CRTC_Regs[0x2b]&8) + _asm + { + mov ebx, src + mov edx, dst + mov cl, 128 + loop3: + mov eax, dword ptr TVRAM[ebx+0x60000] + mov dword ptr TVRAM[edx+0x60000], eax + add ebx, 4 + add edx, 4 + dec cl + jnz loop3 + } + + _asm + { + mov ecx, line + sub ecx, TextScrollY + and ecx, 1023 + mov dl, 4 + rcdirtylp: + mov byte ptr TextDirtyLine[ecx], 1 + inc cx + and cx, 1023 + dec dl + jnz rcdirtylp + } +#elif defined(USE_GAS) && defined(__i386__) + if (CRTC_Regs[0x2b] & 1) { + asm ( + "mov %0, %%ebx;" + "mov %1, %%edx;" + "mov $128, %%cl;" + "0:" + "mov TVRAM(%%ebx), %%eax;" + "mov %%eax, TVRAM(%%edx);" + "add $4, %%ebx;" + "add $4, %%edx;" + "dec %%cl;" + "jnz 0b;" + : /* output: nothing */ + : "m" (src), "m" (dst) + : "ax", "bx", "cx", "dx", "memory"); + } + + if (CRTC_Regs[0x2b] & 2) { + asm ( + "mov %0, %%ebx;" + "mov %1, %%edx;" + "mov $128, %%cl;" + "0:" + "mov TVRAM + 0x20000(%%ebx), %%eax;" + "mov %%eax, TVRAM + 0x20000(%%edx);" + "add $4, %%ebx;" + "add $4, %%edx;" + "dec %%cl;" + "jnz 0b;" + : /* output: nothing */ + : "m" (src), "m" (dst) + : "ax", "bx", "cx", "dx", "memory"); + } + + if (CRTC_Regs[0x2b] & 4) { + asm ( + "mov %0, %%ebx;" + "mov %1, %%edx;" + "mov $128, %%cl;" + "0:" + "mov TVRAM + 0x40000(%%ebx), %%eax;" + "mov %%eax, TVRAM + 0x40000(%%edx);" + "add $4, %%ebx;" + "add $4, %%edx;" + "dec %%cl;" + "jnz 0b;" + : /* output: nothing */ + : "m" (src), "m" (dst) + : "ax", "bx", "cx", "dx", "memory"); + } + + if (CRTC_Regs[0x2b] & 8) { + asm ( + "mov %0, %%ebx;" + "mov %1, %%edx;" + "mov $128, %%cl;" + "0:" + "mov TVRAM + 0x60000(%%ebx), %%eax;" + "mov %%eax, TVRAM + 0x60000(%%edx);" + "add $4, %%ebx;" + "add $4, %%edx;" + "dec %%cl;" + "jnz 0b;" + : /* output: nothing */ + : "m" (src), "m" (dst) + : "ax", "bx", "cx", "dx", "memory"); + } + + asm ( + "mov %0, %%ecx;" + "sub (%1), %%ecx;" + "and $1023, %%ecx;" + "mov $4, %%dl;" + "0:" + "movb $1, TextDirtyLine(%%ecx);" + "inc %%ecx;" + "and $1023, %%ecx;" + "dec %%dl;" + "jnz 0b;" + : /* output: nothing */ + : "m" (line), "g" (TextScrollY) + : "cx", "dx", "memory"); +#else /* !USE_ASM && !(USE_GAS && __i386__) */ +{ + static const DWORD off[4] = { 0, 0x20000, 0x40000, 0x60000 }; + int i, bit; + + for (bit = 0; bit < 4; bit++) { + if (CRTC_Regs[0x2b] & (1 << bit)) { + memmove(&TVRAM[dst + off[bit]], &TVRAM[src + off[bit]], + sizeof(DWORD) * 128); + } + } + + line = (line - TextScrollY) & 0x3ff; + for (i = 0; i < 4; i++) { + TextDirtyLine[line] = 1; + line = (line + 1) & 0x3ff; + } +} +#endif /* USE_ASM */ + + TVRAM_RCUpdate(); +} + + +// ----------------------------------------------------------------------- +// びでおこんとろーるれじすた +// ----------------------------------------------------------------------- +// Reg0の色モードは、ぱっと見CRTCと同じだけど役割違うので注意。 +// CRTCはGVRAMへのアクセス方法(メモリマップ上での見え方)が変わるのに対し、 +// VCtrlは、GVRAM→画面の展開方法を制御する。 +// つまり、アクセス方法(CRTC)は16bitモードで、表示は256色モードってな使い +// 方も許されるのれす。 +// コットン起動時やYs(電波版)OPなどで使われてまふ。 + +BYTE FASTCALL VCtrl_Read(DWORD adr) +{ + BYTE ret = 0xff; + switch(adr&0x701) + { + case 0x400: + case 0x401: + ret = VCReg0[adr&1]; + break; + case 0x500: + case 0x501: + ret = VCReg1[adr&1]; + break; + case 0x600: + case 0x601: + ret = VCReg2[adr&1]; + break; + } + return ret; +} + + +void FASTCALL VCtrl_Write(DWORD adr, BYTE data) +{ + BYTE old; + switch(adr&0x701) + { + case 0x401: + if (VCReg0[adr&1] != data) + { + VCReg0[adr&1] = data; + TVRAM_SetAllDirty(); + } + break; + case 0x500: + case 0x501: + if (VCReg1[adr&1] != data) + { + VCReg1[adr&1] = data; + TVRAM_SetAllDirty(); + } + break; + case 0x600: + case 0x601: + if (VCReg2[adr&1] != data) + { + old = VCReg2[adr&1]; + VCReg2[adr&1] = data; + TVRAM_SetAllDirty(); + } + break; + } +} + + +// ----------------------------------------------------------------------- +// CRTCれじすた +// ----------------------------------------------------------------------- +// レジスタアクセスのコードが汚い ^^; + +void CRTC_Init(void) +{ + ZeroMemory(CRTC_Regs, 48); + TextScrollX = 0, TextScrollY = 0; + ZeroMemory(GrphScrollX, sizeof(GrphScrollX)); + ZeroMemory(GrphScrollY, sizeof(GrphScrollY)); +} + + +BYTE FASTCALL CRTC_Read(DWORD adr) +{ + BYTE ret; + if (adr<0xe803ff) { + int reg = adr&0x3f; + if ( (reg>=0x28)&&(reg<=0x2b) ) return CRTC_Regs[reg]; + else return 0; + } else if ( adr==0xe80481 ) { +// FastClearの注意点: +// FastClrビットに1を書き込むと、その時点ではReadBackしても1は見えない。 +// 1書き込み後の最初の垂直帰線期間で1が立ち、消去を開始する。 +// 1垂直同期期間で消去がおわり、0に戻る……らしひ(PITAPAT) + if (CRTC_FastClr) + ret = CRTC_Mode | 0x02; + else + ret = CRTC_Mode & 0xfd; + + return ret; + } + else + return 0x00; +} + + +void FASTCALL CRTC_Write(DWORD adr, BYTE data) +{ + BYTE old; + BYTE reg = (BYTE)(adr&0x3f); + if (adr<0xe80400) + { + if ( reg>=0x30 ) return; + if (CRTC_Regs[reg]==data) return; + old = CRTC_Regs[reg]; + CRTC_Regs[reg] = data; + TVRAM_SetAllDirty(); + switch(reg) + { + case 0x04: + case 0x05: + CRTC_HSTART = (((WORD)CRTC_Regs[0x4]<<8)+CRTC_Regs[0x5]); + TextDotX = (CRTC_HEND-CRTC_HSTART)*8; + BG_HAdjust = ((long)BG_Regs[0x0d]-(CRTC_HSTART+4))*8; // 水平方向は解像度による1/2はいらない?(Tetris) + WinDraw_ChangeSize(); + break; + case 0x06: + case 0x07: + CRTC_HEND = (((WORD)CRTC_Regs[0x6]<<8)+CRTC_Regs[0x7]); + TextDotX = (CRTC_HEND-CRTC_HSTART)*8; + WinDraw_ChangeSize(); + break; + case 0x08: + case 0x09: + VLINE_TOTAL = (((WORD)CRTC_Regs[8]<<8)+CRTC_Regs[9]); + HSYNC_CLK = ((CRTC_Regs[0x29]&0x10)?VSYNC_HIGH:VSYNC_NORM)/VLINE_TOTAL; + break; + case 0x0c: + case 0x0d: + CRTC_VSTART = (((WORD)CRTC_Regs[0xc]<<8)+CRTC_Regs[0xd]); + BG_VLINE = ((long)BG_Regs[0x0f]-CRTC_VSTART)/((BG_Regs[0x11]&4)?1:2); // BGとその他がずれてる時の差分 + TextDotY = CRTC_VEND-CRTC_VSTART; + if ((CRTC_Regs[0x29]&0x14)==0x10) + { + TextDotY/=2; + CRTC_VStep = 1; + } + else if ((CRTC_Regs[0x29]&0x14)==0x04) + { + TextDotY*=2; + CRTC_VStep = 4; + } + else + CRTC_VStep = 2; + WinDraw_ChangeSize(); + break; + case 0x0e: + case 0x0f: + CRTC_VEND = (((WORD)CRTC_Regs[0xe]<<8)+CRTC_Regs[0xf]); + TextDotY = CRTC_VEND-CRTC_VSTART; + if ((CRTC_Regs[0x29]&0x14)==0x10) + { + TextDotY/=2; + CRTC_VStep = 1; + } + else if ((CRTC_Regs[0x29]&0x14)==0x04) + { + TextDotY*=2; + CRTC_VStep = 4; + } + else + CRTC_VStep = 2; + WinDraw_ChangeSize(); + break; + case 0x28: + TVRAM_SetAllDirty(); + break; + case 0x29: + HSYNC_CLK = ((CRTC_Regs[0x29]&0x10)?VSYNC_HIGH:VSYNC_NORM)/VLINE_TOTAL; + TextDotY = CRTC_VEND-CRTC_VSTART; + if ((CRTC_Regs[0x29]&0x14)==0x10) + { + TextDotY/=2; + CRTC_VStep = 1; + } + else if ((CRTC_Regs[0x29]&0x14)==0x04) + { + TextDotY*=2; + CRTC_VStep = 4; + } + else + CRTC_VStep = 2; + WinDraw_ChangeSize(); + break; + case 0x12: + case 0x13: + CRTC_IntLine = (((WORD)CRTC_Regs[0x12]<<8)+CRTC_Regs[0x13])&1023; + break; + case 0x14: + case 0x15: + TextScrollX = (((DWORD)CRTC_Regs[0x14]<<8)+CRTC_Regs[0x15])&1023; + break; + case 0x16: + case 0x17: + TextScrollY = (((DWORD)CRTC_Regs[0x16]<<8)+CRTC_Regs[0x17])&1023; + break; + case 0x18: + case 0x19: + GrphScrollX[0] = (((DWORD)CRTC_Regs[0x18]<<8)+CRTC_Regs[0x19])&1023; + break; + case 0x1a: + case 0x1b: + GrphScrollY[0] = (((DWORD)CRTC_Regs[0x1a]<<8)+CRTC_Regs[0x1b])&1023; + break; + case 0x1c: + case 0x1d: + GrphScrollX[1] = (((DWORD)CRTC_Regs[0x1c]<<8)+CRTC_Regs[0x1d])&511; + break; + case 0x1e: + case 0x1f: + GrphScrollY[1] = (((DWORD)CRTC_Regs[0x1e]<<8)+CRTC_Regs[0x1f])&511; + break; + case 0x20: + case 0x21: + GrphScrollX[2] = (((DWORD)CRTC_Regs[0x20]<<8)+CRTC_Regs[0x21])&511; + break; + case 0x22: + case 0x23: + GrphScrollY[2] = (((DWORD)CRTC_Regs[0x22]<<8)+CRTC_Regs[0x23])&511; + break; + case 0x24: + case 0x25: + GrphScrollX[3] = (((DWORD)CRTC_Regs[0x24]<<8)+CRTC_Regs[0x25])&511; + break; + case 0x26: + case 0x27: + GrphScrollY[3] = (((DWORD)CRTC_Regs[0x26]<<8)+CRTC_Regs[0x27])&511; + break; + case 0x2a: + case 0x2b: + break; + case 0x2c: // CRTC動作ポートのラスタコピーをONにしておいて(しておいたまま)、 + case 0x2d: // Src/Dstだけ次々変えていくのも許されるらしい(ドラキュラとか) + CRTC_RCFlag[reg-0x2c] = 1; // Dst変更後に実行される? + if ((CRTC_Mode&8)&&/*(CRTC_RCFlag[0])&&*/(CRTC_RCFlag[1])) + { + CRTC_RasterCopy(); + CRTC_RCFlag[0] = 0; + CRTC_RCFlag[1] = 0; + } + break; + } + } + else if (adr==0xe80481) + { // CRTC動作ポート + CRTC_Mode = (data|(CRTC_Mode&2)); + if (CRTC_Mode&8) + { // Raster Copy + CRTC_RasterCopy(); + CRTC_RCFlag[0] = 0; + CRTC_RCFlag[1] = 0; + } + if (CRTC_Mode&2) // 高速クリア + { + CRTC_FastClrLine = vline; + // この時点のマスクが有効らしい(クォース) + CRTC_FastClrMask = FastClearMask[CRTC_Regs[0x2b]&15]; +/*{ +FILE *fp; +fp=fopen("_crtc.txt", "a"); +fprintf(fp, "FastClr\n"); +fclose(fp); +}*/ + } + } +} diff --git a/x68k/crtc.h b/x68k/crtc.h new file mode 100644 index 0000000..f32d977 --- /dev/null +++ b/x68k/crtc.h @@ -0,0 +1,39 @@ +#ifndef _winx68k_crtc +#define _winx68k_crtc + +#include "common.h" + +#define VSYNC_HIGH 180310L +#define VSYNC_NORM 162707L + +extern BYTE CRTC_Regs[48]; +extern BYTE CRTC_Mode; +extern WORD CRTC_VSTART, CRTC_VEND; +extern WORD CRTC_HSTART, CRTC_HEND; +extern DWORD TextDotX, TextDotY; +extern DWORD TextScrollX, TextScrollY; +extern BYTE VCReg0[2]; +extern BYTE VCReg1[2]; +extern BYTE VCReg2[2]; +extern WORD CRTC_IntLine; +extern BYTE CRTC_FastClr; +extern BYTE CRTC_DispScan; +extern DWORD CRTC_FastClrLine; +extern WORD CRTC_FastClrMask; +extern BYTE CRTC_VStep; +extern int HSYNC_CLK; + +extern DWORD GrphScrollX[]; +extern DWORD GrphScrollY[]; + +void CRTC_Init(void); + +void CRTC_RasterCopy(void); + +BYTE FASTCALL CRTC_Read(DWORD adr); +void FASTCALL CRTC_Write(DWORD adr, BYTE data); + +BYTE FASTCALL VCtrl_Read(DWORD adr); +void FASTCALL VCtrl_Write(DWORD adr, BYTE data); + +#endif diff --git a/x68k/d68k.c b/x68k/d68k.c new file mode 100644 index 0000000..7c4d687 --- /dev/null +++ b/x68k/d68k.c @@ -0,0 +1,3079 @@ +/* ======================================================================== */ +/* ========================= LICENSING & COPYRIGHT ======================== */ +/* ======================================================================== */ + +static const char* copyright_notice = +"DEBABELIZER\n" +"Version 2.3 internal alpha 1\n" +"A portable Motorola M680x0 disassembler.\n" +"Copyright 1999 Karl Stenerud. All rights reserved.\n" +"\n" +"This code is freeware and may be freely used as long as this copyright\n" +"notice remains unaltered in the source code and any binary files\n" +"containing this code in compiled form.\n" +"\n" +"The latest version of this code can be obtained at:\n" +"(home page pending)\n" +; + + +/* ======================================================================== */ +/* ================================ INCLUDES ============================== */ +/* ======================================================================== */ + +#include +#include +#include +#include "d68k.h" +#include "d68kconf.h" + +#ifndef CLIB_DECL +#define CLIB_DECL +#endif + +/* ======================================================================== */ +/* ============================ GENERAL DEFINES =========================== */ +/* ======================================================================== */ + +/* unsigned int and int must be at least 32 bits wide */ +#undef uint +#define uint unsigned int + +/* Bit Isolation Functions */ +#define BIT_0(A) ((A) & 0x00000001) +#define BIT_1(A) ((A) & 0x00000002) +#define BIT_2(A) ((A) & 0x00000004) +#define BIT_3(A) ((A) & 0x00000008) +#define BIT_4(A) ((A) & 0x00000010) +#define BIT_5(A) ((A) & 0x00000020) +#define BIT_6(A) ((A) & 0x00000040) +#define BIT_7(A) ((A) & 0x00000080) +#define BIT_8(A) ((A) & 0x00000100) +#define BIT_9(A) ((A) & 0x00000200) +#define BIT_A(A) ((A) & 0x00000400) +#define BIT_B(A) ((A) & 0x00000800) +#define BIT_C(A) ((A) & 0x00001000) +#define BIT_D(A) ((A) & 0x00002000) +#define BIT_E(A) ((A) & 0x00004000) +#define BIT_F(A) ((A) & 0x00008000) +#define BIT_10(A) ((A) & 0x00010000) +#define BIT_11(A) ((A) & 0x00020000) +#define BIT_12(A) ((A) & 0x00040000) +#define BIT_13(A) ((A) & 0x00080000) +#define BIT_14(A) ((A) & 0x00100000) +#define BIT_15(A) ((A) & 0x00200000) +#define BIT_16(A) ((A) & 0x00400000) +#define BIT_17(A) ((A) & 0x00800000) +#define BIT_18(A) ((A) & 0x01000000) +#define BIT_19(A) ((A) & 0x02000000) +#define BIT_1A(A) ((A) & 0x04000000) +#define BIT_1B(A) ((A) & 0x08000000) +#define BIT_1C(A) ((A) & 0x10000000) +#define BIT_1D(A) ((A) & 0x20000000) +#define BIT_1E(A) ((A) & 0x40000000) +#define BIT_1F(A) ((A) & 0x80000000) + + +/* Extension word formats */ +#define EXT_8BIT_DISPLACEMENT(A) ((A)&0xff) +#define EXT_FULL(A) BIT_8(A) +#define EXT_EFFECTIVE_ZERO(A) (((A)&0xe4) == 0xc4 || ((A)&0xe2) == 0xc0) +#define EXT_BASE_REGISTER_PRESENT(A) (!BIT_7(A)) +#define EXT_INDEX_REGISTER_PRESENT(A) (!BIT_6(A)) +#define EXT_INDEX_REGISTER(A) (((A)>>12)&7) +#define EXT_INDEX_PRE_POST(A) (EXT_INDEX_PRESENT(A) && (A)&3) +#define EXT_INDEX_PRE(A) (EXT_INDEX_PRESENT(A) && ((A)&7) < 4 && ((A)&7) != 0) +#define EXT_INDEX_POST(A) (EXT_INDEX_PRESENT(A) && ((A)&7) > 4) +#define EXT_INDEX_SCALE(A) (((A)>>9)&3) +#define EXT_INDEX_LONG(A) BIT_B(A) +#define EXT_INDEX_AR(A) BIT_F(A) +#define EXT_BASE_DISPLACEMENT_PRESENT(A) (((A)&0x30) > 0x10) +#define EXT_BASE_DISPLACEMENT_WORD(A) (((A)&0x30) == 0x20) +#define EXT_BASE_DISPLACEMENT_LONG(A) (((A)&0x30) == 0x30) +#define EXT_OUTER_DISPLACEMENT_PRESENT(A) (((A)&3) > 1 && ((A)&0x47) < 0x44) +#define EXT_OUTER_DISPLACEMENT_WORD(A) (((A)&3) == 2 && ((A)&0x47) < 0x44) +#define EXT_OUTER_DISPLACEMENT_LONG(A) (((A)&3) == 3 && ((A)&0x47) < 0x44) + + + +/* ======================================================================== */ +/* =============================== PROTOTYPES ============================= */ +/* ======================================================================== */ + +/* Read external memory */ +uint read_8 (uint address); +uint read_16 (uint address); +uint read_32 (uint address); + +/* Read data at the PC and increment PC */ +uint read_imm_8(void); +uint read_imm_16(void); +uint read_imm_32(void); + +/* Read data at the PC but don't imcrement the PC */ +uint peek_imm_8(void); +uint peek_imm_16(void); +uint peek_imm_32(void); + +/* make signed integers 100% portably */ +static int make_int_8(int value); +static int make_int_16(int value); + +/* make a string of a hex value */ +static char* make_signed_hex_str_8(uint val); +static char* make_signed_hex_str_16(uint val); +static char* make_signed_hex_str_32(uint val); + +/* make string of ea mode */ +static char* get_ea_mode_str(uint instruction, uint size); + +char* get_ea_mode_str_8(uint instruction); +char* get_ea_mode_str_16(uint instruction); +char* get_ea_mode_str_32(uint instruction); + +/* make string of immediate value */ +static char* get_imm_str_s(uint size); +static char* get_imm_str_u(uint size); + +char* get_imm_str_s8(void); +char* get_imm_str_s16(void); +char* get_imm_str_s32(void); + +/* Stuff to build the opcode handler jump table */ +static void build_opcode_table(void); +static int valid_ea(uint opcode, uint mask); +static int CLIB_DECL compare_nof_true_bits(const void *aptr, const void *bptr); + + +/* used to build opcode handler jump table */ +typedef struct +{ + void (*opcode_handler)(void); /* handler function */ + uint mask; /* mask on opcode */ + uint match; /* what to match after masking */ + uint ea_mask; /* what ea modes are allowed */ +} opcode_struct; + + + +/* ======================================================================== */ +/* ================================= DATA ================================= */ +/* ======================================================================== */ + +/* Opcode handler jump table */ +static void (*g_instruction_table[0x10000])(void); +/* Flag if disassembler initialized */ +static int g_initialized = 0; + +static char g_dasm_str[100]; /* string to hold disassembly */ +static char g_helper_str[100]; /* string to hold helpful info */ +static uint g_cpu_pc; /* program counter */ +static uint g_cpu_ir; /* instruction register */ + +/* used by ops like asr, ror, addq, etc */ +static uint g_3bit_qdata_table[8] = {8, 1, 2, 3, 4, 5, 6, 7}; + +static uint g_5bit_data_table[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 +}; + +static char* g_cc[16] = +{"t", "f", "hi", "ls", "cc", "cs", "ne", "eq", "vc", "vs", "pl", "mi", "ge", "lt", "gt", "le"}; + +static char* g_cpcc[64] = +{/* 000 001 010 011 100 101 110 111 */ + "f", "eq", "ogt", "oge", "olt", "ole", "ogl", "or", /* 000 */ + "un", "ueq", "ugt", "uge", "ult", "ule", "ne", "t", /* 001 */ + "sf", "seq", "gt", "ge", "lt", "le", "gl" "gle", /* 010 */ + "ngle", "ngl", "nle", "nlt", "nge", "ngt", "sne", "st", /* 011 */ + "?", "?", "?", "?", "?", "?", "?", "?", /* 100 */ + "?", "?", "?", "?", "?", "?", "?", "?", /* 101 */ + "?", "?", "?", "?", "?", "?", "?", "?", /* 110 */ + "?", "?", "?", "?", "?", "?", "?", "?" /* 111 */ +}; + +/* ======================================================================== */ +/* =========================== UTILITY FUNCTIONS ========================== */ +/* ======================================================================== */ + +/* Pass up the memory requests */ +#define read_8(address) (m68k_read_memory_8((address)&0xffffff)&0xff) +#define read_16(address) (m68k_read_memory_16((address)&0xffffff)&0xffff) +#define read_32(address) (m68k_read_memory_32((address)&0xffffff)&0xffffffff) + +#define read_imm_8() m68k_read_memory_8(((g_cpu_pc+=2)-1)&0xffffff) +#define read_imm_16() m68k_read_memory_16(((g_cpu_pc+=2)-2)&0xffffff) +#define read_imm_32() m68k_read_memory_32(((g_cpu_pc+=4)-4)&0xffffff) + +#define peek_imm_8() m68k_read_memory_8(g_cpu_pc & 0xffffff) +#define peek_imm_16() m68k_read_memory_16(g_cpu_pc & 0xffffff) +#define peek_imm_32() m68k_read_memory_32(g_cpu_pc & 0xffffff) + +/* Fake a split interface */ +#define get_ea_mode_str_8(instruction) get_ea_mode_str(instruction, 0) +#define get_ea_mode_str_16(instruction) get_ea_mode_str(instruction, 1) +#define get_ea_mode_str_32(instruction) get_ea_mode_str(instruction, 2) + +#define get_imm_str_s8() get_imm_str_s(0) +#define get_imm_str_s16() get_imm_str_s(1) +#define get_imm_str_s32() get_imm_str_s(2) + +#define get_imm_str_u8() get_imm_str_u(0) +#define get_imm_str_u16() get_imm_str_u(1) +#define get_imm_str_u32() get_imm_str_u(2) + + +/* 100% portable signed int generators */ +static int make_int_8(int value) +{ + return (value & 0x80) ? value | ~0xff : value & 0xff; +} + +static int make_int_16(int value) +{ + return (value & 0x8000) ? value | ~0xffff : value & 0xffff; +} + + +/* Get string representation of hex values */ +static char* make_signed_hex_str_8(uint val) +{ + static char str[20]; + + val &= 0xff; + + if(val & 0x80) + sprintf(str, "-$%x", (0-val) & 0x7f); + else + sprintf(str, "$%x", val & 0x7f); + + return str; +} + +static char* make_signed_hex_str_16(uint val) +{ + static char str[20]; + + val &= 0xffff; + + if(val & 0x8000) + sprintf(str, "-$%x", (0-val) & 0x7fff); + else + sprintf(str, "$%x", val & 0x7fff); + + return str; +} + +static char* make_signed_hex_str_32(uint val) +{ + static char str[20]; + + val &= 0xffffffff; + + if(val & 0x80000000) + sprintf(str, "-$%x", (0-val) & 0x7fffffff); + else + sprintf(str, "$%x", val & 0x7fffffff); + + return str; +} + + +/* make string of immediate value */ +static char* get_imm_str_s(uint size) +{ + static char str[15]; + if(size == 0) + sprintf(str, "#%s", make_signed_hex_str_8(read_imm_8())); + else if(size == 1) + sprintf(str, "#%s", make_signed_hex_str_16(read_imm_16())); + else + sprintf(str, "#%s", make_signed_hex_str_32(read_imm_32())); + return str; +} + +static char* get_imm_str_u(uint size) +{ + static char str[15]; + if(size == 0) + sprintf(str, "#$%x", read_imm_8() & 0xff); + else if(size == 1) + sprintf(str, "#$%x", read_imm_16() & 0xffff); + else + sprintf(str, "#$%x", read_imm_32() & 0xffffffff); + return str; +} + +/* Make string of effective address mode */ +static char* get_ea_mode_str(uint instruction, uint size) +{ + static char b1[64]; + static char b2[64]; + static char* mode = b2; + uint extension; + uint base; + uint outer; + char base_reg[4]; + char index_reg[8]; + uint preindex; + uint postindex; + uint comma = 0; + uint temp_value = 0; + + /* Switch buffers so we don't clobber on a double-call to this function */ + mode = mode == b1 ? b2 : b1; + + switch(instruction & 0x3f) + { + case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: + /* data register direct */ + sprintf(mode, "D%d", instruction&7); + break; + case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f: + /* address register direct */ + sprintf(mode, "A%d", instruction&7); + break; + case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: + /* address register indirect */ + sprintf(mode, "(A%d)", instruction&7); + break; + case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f: + /* address register indirect with postincrement */ + sprintf(mode, "(A%d)+", instruction&7); + break; + case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: + /* address register indirect with predecrement */ + sprintf(mode, "-(A%d)", instruction&7); + break; + case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f: + /* address register indirect with displacement*/ + sprintf(mode, "(%s,A%d)", make_signed_hex_str_16(read_imm_16()), instruction&7); + break; + case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: + /* address register indirect with index */ + extension = read_imm_16(); + + if(EXT_FULL(extension)) + { + if(EXT_EFFECTIVE_ZERO(extension)) + { + strcpy(mode, "0"); + break; + } + base = EXT_BASE_DISPLACEMENT_PRESENT(extension) ? (EXT_BASE_DISPLACEMENT_LONG(extension) ? read_imm_32() : read_imm_16()) : 0; + outer = EXT_OUTER_DISPLACEMENT_PRESENT(extension) ? (EXT_OUTER_DISPLACEMENT_LONG(extension) ? read_imm_32() : read_imm_16()) : 0; + if(EXT_BASE_REGISTER_PRESENT(extension)) + sprintf(base_reg, "A%d", instruction&7); + else + *base_reg = 0; + if(EXT_INDEX_REGISTER_PRESENT(extension)) + { + sprintf(index_reg, "%c%d.%c", EXT_INDEX_AR(extension) ? 'A' : 'D', EXT_INDEX_REGISTER(extension), EXT_INDEX_LONG(extension) ? 'l' : 'w'); + if(EXT_INDEX_SCALE(extension)) + sprintf(index_reg+strlen(index_reg), "*%d", 1 << EXT_INDEX_SCALE(extension)); + } + else + *index_reg = 0; + preindex = (extension&7) > 0 && (extension&7) < 4; + postindex = (extension&7) > 4; + + strcpy(mode, "("); + if(preindex || postindex) + strcat(mode, "["); + if(base) + { + strcat(mode, make_signed_hex_str_16(base)); + comma = 1; + } + if(*base_reg) + { + if(comma) + strcat(mode, ","); + strcat(mode, base_reg); + comma = 1; + } + if(postindex) + { + strcat(mode, "]"); + comma = 1; + } + if(*index_reg) + { + if(comma) + strcat(mode, ","); + strcat(mode, index_reg); + comma = 1; + } + if(preindex) + { + strcat(mode, "]"); + comma = 1; + } + if(outer) + { + if(comma) + strcat(mode, ","); + strcat(mode, make_signed_hex_str_16(outer)); + } + strcat(mode, ")"); + break; + } + + if(EXT_8BIT_DISPLACEMENT(extension) == 0) + 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'); + else + 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'); + if(EXT_INDEX_SCALE(extension)) + sprintf(mode+strlen(mode), "*%d", 1 << EXT_INDEX_SCALE(extension)); + strcat(mode, ")"); + break; + case 0x38: + /* absolute short address */ + sprintf(mode, "$%x.w", read_imm_16()); + break; + case 0x39: + /* absolute long address */ + sprintf(mode, "$%x.l", read_imm_32()); + break; + case 0x3a: + /* program counter with displacement */ + temp_value = read_imm_16(); + sprintf(mode, "(%s,PC)", make_signed_hex_str_16(temp_value)); + sprintf(g_helper_str, "; ($%x)", (make_int_16(temp_value) + g_cpu_pc-2) & 0xffffffff); + break; + case 0x3b: + /* program counter with index */ + extension = read_imm_16(); + + if(EXT_FULL(extension)) + { + if(EXT_EFFECTIVE_ZERO(extension)) + { + strcpy(mode, "0"); + break; + } + base = EXT_BASE_DISPLACEMENT_PRESENT(extension) ? (EXT_BASE_DISPLACEMENT_LONG(extension) ? read_imm_32() : read_imm_16()) : 0; + outer = EXT_OUTER_DISPLACEMENT_PRESENT(extension) ? (EXT_OUTER_DISPLACEMENT_LONG(extension) ? read_imm_32() : read_imm_16()) : 0; + if(EXT_BASE_REGISTER_PRESENT(extension)) + strcpy(base_reg, "PC"); + else + *base_reg = 0; + if(EXT_INDEX_REGISTER_PRESENT(extension)) + { + sprintf(index_reg, "%c%d.%c", EXT_INDEX_AR(extension) ? 'A' : 'D', EXT_INDEX_REGISTER(extension), EXT_INDEX_LONG(extension) ? 'l' : 'w'); + if(EXT_INDEX_SCALE(extension)) + sprintf(index_reg+strlen(index_reg), "*%d", 1 << EXT_INDEX_SCALE(extension)); + } + else + *index_reg = 0; + preindex = (extension&7) > 0 && (extension&7) < 4; + postindex = (extension&7) > 4; + + strcpy(mode, "("); + if(preindex || postindex) + strcat(mode, "["); + if(base) + { + strcat(mode, make_signed_hex_str_16(base)); + comma = 1; + } + if(*base_reg) + { + if(comma) + strcat(mode, ","); + strcat(mode, base_reg); + comma = 1; + } + if(postindex) + { + strcat(mode, "]"); + comma = 1; + } + if(*index_reg) + { + if(comma) + strcat(mode, ","); + strcat(mode, index_reg); + comma = 1; + } + if(preindex) + { + strcat(mode, "]"); + comma = 1; + } + if(outer) + { + if(comma) + strcat(mode, ","); + strcat(mode, make_signed_hex_str_16(outer)); + } + strcat(mode, ")"); + break; + } + + if(EXT_8BIT_DISPLACEMENT(extension) == 0) + sprintf(mode, "(PC,%c%d.%c", EXT_INDEX_AR(extension) ? 'A' : 'D', EXT_INDEX_REGISTER(extension), EXT_INDEX_LONG(extension) ? 'l' : 'w'); + else + 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'); + if(EXT_INDEX_SCALE(extension)) + sprintf(mode+strlen(mode), "*%d", 1 << EXT_INDEX_SCALE(extension)); + strcat(mode, ")"); + break; + case 0x3c: + /* Immediate */ + sprintf(mode, "%s", get_imm_str_u(size)); + break; + default: + sprintf(mode, "INVALID %x", instruction & 0x3f); + } + return mode; +} + + + +/* ======================================================================== */ +/* ================================= API ================================== */ +/* ======================================================================== */ + +/* Disasemble one instruction at pc and store in str_buff */ +int m68k_disassemble(char* str_buff, int pc) +{ + if(!g_initialized) + { + build_opcode_table(); + g_initialized = 1; + } + g_cpu_pc = pc; + g_helper_str[0] = 0; + g_cpu_ir = read_imm_16(); + g_instruction_table[g_cpu_ir](); + sprintf(str_buff, "%s%s", g_dasm_str, g_helper_str); + return g_cpu_pc - pc; +} + +char* m68k_disassemble_quick(int pc) +{ + static char dasm_str[200]; + + if(!g_initialized) + { + build_opcode_table(); + g_initialized = 1; + } + g_cpu_pc = pc; + g_helper_str[0] = 0; + g_cpu_ir = read_imm_16(); + g_instruction_table[g_cpu_ir](); + sprintf(dasm_str, "%s%s", g_dasm_str, g_helper_str); + return dasm_str; +} + + +/* ======================================================================== */ +/* ========================= INSTRUCTION HANDLERS ========================= */ +/* ======================================================================== */ +/* Instruction handler function names follow this convention: + * + * d68000_NAME_EXTENSIONS(void) + * where NAME is the name of the opcode it handles and EXTENSIONS are any + * extensions for special instances of that opcode. + * + * Examples: + * d68000_add_er_8(): add opcode, from effective address to register, + * size = byte + * + * d68000_asr_s_8(): arithmetic shift right, static count, size = byte + * + * + * Common extensions: + * 8 : size = byte + * 16 : size = word + * 32 : size = long + * rr : register to register + * mm : memory to memory + * r : register + * s : static + * er : effective address -> register + * re : register -> effective address + * ea : using effective address mode of operation + * d : data register direct + * a : address register direct + * ai : address register indirect + * pi : address register indirect with postincrement + * pd : address register indirect with predecrement + * di : address register indirect with displacement + * ix : address register indirect with index + * aw : absolute word + * al : absolute long + */ + +static void d68000_1010(void) +{ + sprintf(g_dasm_str, "dc.w $%04x; opcode 1010", g_cpu_ir); +} + + +static void d68000_1111(void) +{ + sprintf(g_dasm_str, "dc.w $%04x; opcode 1111", g_cpu_ir); +} + + +static void d68000_abcd_rr(void) +{ + sprintf(g_dasm_str, "abcd D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7); +} + + +static void d68000_abcd_mm(void) +{ + sprintf(g_dasm_str, "abcd -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7); +} + +static void d68000_add_er_8(void) +{ + sprintf(g_dasm_str, "add.b %s, D%d", get_ea_mode_str_8(g_cpu_ir), (g_cpu_ir>>9)&7); +} + + +static void d68000_add_er_16(void) +{ + sprintf(g_dasm_str, "add.w %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7); +} + +static void d68000_add_er_32(void) +{ + sprintf(g_dasm_str, "add.l %s, D%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7); +} + +static void d68000_add_re_8(void) +{ + sprintf(g_dasm_str, "add.b D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68000_add_re_16(void) +{ + sprintf(g_dasm_str, "add.w D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_16(g_cpu_ir)); +} + +static void d68000_add_re_32(void) +{ + sprintf(g_dasm_str, "add.l D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68000_adda_16(void) +{ + sprintf(g_dasm_str, "adda.w %s, A%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7); +} + +static void d68000_adda_32(void) +{ + sprintf(g_dasm_str, "adda.l %s, A%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7); +} + +static void d68000_addi_8(void) +{ + char* str = get_imm_str_s8(); + sprintf(g_dasm_str, "addi.b %s, %s", str, get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68000_addi_16(void) +{ + char* str = get_imm_str_s16(); + sprintf(g_dasm_str, "addi.w %s, %s", str, get_ea_mode_str_16(g_cpu_ir)); +} + +static void d68000_addi_32(void) +{ + char* str = get_imm_str_s32(); + sprintf(g_dasm_str, "addi.l %s, %s", str, get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68000_addq_8(void) +{ + 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)); +} + +static void d68000_addq_16(void) +{ + 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)); +} + +static void d68000_addq_32(void) +{ + 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)); +} + +static void d68000_addx_rr_8(void) +{ + sprintf(g_dasm_str, "addx.b D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7); +} + +static void d68000_addx_rr_16(void) +{ + sprintf(g_dasm_str, "addx.w D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7); +} + +static void d68000_addx_rr_32(void) +{ + sprintf(g_dasm_str, "addx.l D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7); +} + +static void d68000_addx_mm_8(void) +{ + sprintf(g_dasm_str, "addx.b -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7); +} + +static void d68000_addx_mm_16(void) +{ + sprintf(g_dasm_str, "addx.w -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7); +} + +static void d68000_addx_mm_32(void) +{ + sprintf(g_dasm_str, "addx.l -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7); +} + +static void d68000_and_er_8(void) +{ + sprintf(g_dasm_str, "and.b %s, D%d", get_ea_mode_str_8(g_cpu_ir), (g_cpu_ir>>9)&7); +} + +static void d68000_and_er_16(void) +{ + sprintf(g_dasm_str, "and.w %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7); +} + +static void d68000_and_er_32(void) +{ + sprintf(g_dasm_str, "and.l %s, D%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7); +} + +static void d68000_and_re_8(void) +{ + sprintf(g_dasm_str, "and.b D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68000_and_re_16(void) +{ + sprintf(g_dasm_str, "and.w D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_16(g_cpu_ir)); +} + +static void d68000_and_re_32(void) +{ + sprintf(g_dasm_str, "and.l D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68000_andi_8(void) +{ + char* str = get_imm_str_u8(); + sprintf(g_dasm_str, "andi.b %s, %s", str, get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68000_andi_16(void) +{ + char* str = get_imm_str_u16(); + sprintf(g_dasm_str, "andi.w %s, %s", str, get_ea_mode_str_16(g_cpu_ir)); +} + +static void d68000_andi_32(void) +{ + char* str = get_imm_str_u32(); + sprintf(g_dasm_str, "andi.l %s, %s", str, get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68000_andi_to_ccr(void) +{ + sprintf(g_dasm_str, "andi %s, CCR", get_imm_str_u8()); +} + +static void d68000_andi_to_sr(void) +{ + sprintf(g_dasm_str, "andi %s, SR", get_imm_str_u16()); +} + +static void d68000_asr_s_8(void) +{ + sprintf(g_dasm_str, "asr.b #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7); +} + +static void d68000_asr_s_16(void) +{ + sprintf(g_dasm_str, "asr.w #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7); +} + +static void d68000_asr_s_32(void) +{ + sprintf(g_dasm_str, "asr.l #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7); +} + +static void d68000_asr_r_8(void) +{ + sprintf(g_dasm_str, "asr.b D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7); +} + +static void d68000_asr_r_16(void) +{ + sprintf(g_dasm_str, "asr.w D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7); +} + +static void d68000_asr_r_32(void) +{ + sprintf(g_dasm_str, "asr.l D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7); +} + +static void d68000_asr_ea(void) +{ + sprintf(g_dasm_str, "asr.w %s", get_ea_mode_str_16(g_cpu_ir)); +} + +static void d68000_asl_s_8(void) +{ + sprintf(g_dasm_str, "asl.b #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7); +} + +static void d68000_asl_s_16(void) +{ + sprintf(g_dasm_str, "asl.w #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7); +} + +static void d68000_asl_s_32(void) +{ + sprintf(g_dasm_str, "asl.l #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7); +} + +static void d68000_asl_r_8(void) +{ + sprintf(g_dasm_str, "asl.b D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7); +} + +static void d68000_asl_r_16(void) +{ + sprintf(g_dasm_str, "asl.w D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7); +} + +static void d68000_asl_r_32(void) +{ + sprintf(g_dasm_str, "asl.l D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7); +} + +static void d68000_asl_ea(void) +{ + sprintf(g_dasm_str, "asl.w %s", get_ea_mode_str_16(g_cpu_ir)); +} + +static void d68000_bcc_8(void) +{ + uint temp_pc = g_cpu_pc; + sprintf(g_dasm_str, "b%-2s %x", g_cc[(g_cpu_ir>>8)&0xf], temp_pc + make_int_8(g_cpu_ir)); +} + +static void d68000_bcc_16(void) +{ + uint temp_pc = g_cpu_pc; + sprintf(g_dasm_str, "b%-2s %x", g_cc[(g_cpu_ir>>8)&0xf], temp_pc + make_int_16(read_imm_16())); +} + +static void d68020_bcc_32(void) +{ + uint temp_pc = g_cpu_pc; + sprintf(g_dasm_str, "b%-2s %x; (2+)", g_cc[(g_cpu_ir>>8)&0xf], temp_pc + read_imm_32()); +} + +static void d68000_bchg_r(void) +{ + sprintf(g_dasm_str, "bchg D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68000_bchg_s(void) +{ + char* str = get_imm_str_s8(); + sprintf(g_dasm_str, "bchg %s, %s", str, get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68000_bclr_r(void) +{ + sprintf(g_dasm_str, "bclr D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68000_bclr_s(void) +{ + char* str = get_imm_str_s8(); + sprintf(g_dasm_str, "bclr %s, %s", str, get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68010_bkpt(void) +{ + sprintf(g_dasm_str, "bkpt #%d; (1+)", g_cpu_ir&7); +} + +static void d68020_bfchg(void) +{ + uint extension = read_imm_16(); + char offset[3]; + char width[3]; + + if(BIT_B(extension)) + sprintf(offset, "D%d", (extension>>6)&7); + else + sprintf(offset, "%d", (extension>>6)&31); + if(BIT_5(extension)) + sprintf(width, "D%d", (extension>>6)&7); + else + sprintf(width, "%d", g_5bit_data_table[(extension>>6)&31]); + sprintf(g_dasm_str, "bfchg %s {%s:%s}; (2+)", get_ea_mode_str_8(g_cpu_ir), offset, width); +} + +static void d68020_bfclr(void) +{ + uint extension = read_imm_16(); + char offset[3]; + char width[3]; + + if(BIT_B(extension)) + sprintf(offset, "D%d", (extension>>6)&7); + else + sprintf(offset, "%d", (extension>>6)&31); + if(BIT_5(extension)) + sprintf(width, "D%d", (extension>>6)&7); + else + sprintf(width, "%d", g_5bit_data_table[(extension>>6)&31]); + sprintf(g_dasm_str, "bfclr %s {%s:%s}; (2+)", get_ea_mode_str_8(g_cpu_ir), offset, width); +} + +static void d68020_bfexts(void) +{ + uint extension = read_imm_16(); + char offset[3]; + char width[3]; + + if(BIT_B(extension)) + sprintf(offset, "D%d", (extension>>6)&7); + else + sprintf(offset, "%d", (extension>>6)&31); + if(BIT_5(extension)) + sprintf(width, "D%d", (extension>>6)&7); + else + sprintf(width, "%d", g_5bit_data_table[(extension>>6)&31]); + sprintf(g_dasm_str, "bfexts %s {%s:%s}, D%d; (2+)", get_ea_mode_str_8(g_cpu_ir), offset, width, (extension>>12)&7); +} + +static void d68020_bfextu(void) +{ + uint extension = read_imm_16(); + char offset[3]; + char width[3]; + + if(BIT_B(extension)) + sprintf(offset, "D%d", (extension>>6)&7); + else + sprintf(offset, "%d", (extension>>6)&31); + if(BIT_5(extension)) + sprintf(width, "D%d", (extension>>6)&7); + else + sprintf(width, "%d", g_5bit_data_table[(extension>>6)&31]); + sprintf(g_dasm_str, "bfextu %s {%s:%s}, D%d; (2+)", get_ea_mode_str_8(g_cpu_ir), offset, width, (extension>>12)&7); +} + +static void d68020_bfffo(void) +{ + uint extension = read_imm_16(); + char offset[3]; + char width[3]; + + if(BIT_B(extension)) + sprintf(offset, "D%d", (extension>>6)&7); + else + sprintf(offset, "%d", (extension>>6)&31); + if(BIT_5(extension)) + sprintf(width, "D%d", (extension>>6)&7); + else + sprintf(width, "%d", g_5bit_data_table[(extension>>6)&31]); + sprintf(g_dasm_str, "bfffo %s {%s:%s}, D%d; (2+)", get_ea_mode_str_8(g_cpu_ir), offset, width, (extension>>12)&7); +} + +static void d68020_bfins(void) +{ + uint extension = read_imm_16(); + char offset[3]; + char width[3]; + + if(BIT_B(extension)) + sprintf(offset, "D%d", (extension>>6)&7); + else + sprintf(offset, "%d", (extension>>6)&31); + if(BIT_5(extension)) + sprintf(width, "D%d", (extension>>6)&7); + else + sprintf(width, "%d", g_5bit_data_table[(extension>>6)&31]); + sprintf(g_dasm_str, "bfins %s {%s:%s}, D%d; (2+)", get_ea_mode_str_8(g_cpu_ir), offset, width, (extension>>12)&7); +} + +static void d68020_bfset(void) +{ + uint extension = read_imm_16(); + char offset[3]; + char width[3]; + + if(BIT_B(extension)) + sprintf(offset, "D%d", (extension>>6)&7); + else + sprintf(offset, "%d", (extension>>6)&31); + if(BIT_5(extension)) + sprintf(width, "D%d", (extension>>6)&7); + else + sprintf(width, "%d", g_5bit_data_table[(extension>>6)&31]); + sprintf(g_dasm_str, "bfset %s {%s:%s}; (2+)", get_ea_mode_str_8(g_cpu_ir), offset, width); +} + +static void d68020_bftst(void) +{ + uint extension = read_imm_16(); + char offset[3]; + char width[3]; + + if(BIT_B(extension)) + sprintf(offset, "D%d", (extension>>6)&7); + else + sprintf(offset, "%d", (extension>>6)&31); + if(BIT_5(extension)) + sprintf(width, "D%d", (extension>>6)&7); + else + sprintf(width, "%d", g_5bit_data_table[(extension>>6)&31]); + sprintf(g_dasm_str, "bftst %s {%s:%s}; (2+)", get_ea_mode_str_8(g_cpu_ir), offset, width); +} + +static void d68000_bra_8(void) +{ + uint temp_pc = g_cpu_pc; + sprintf(g_dasm_str, "bra %x", temp_pc + make_int_8(g_cpu_ir)); +} + +static void d68000_bra_16(void) +{ + uint temp_pc = g_cpu_pc; + sprintf(g_dasm_str, "bra %x", temp_pc + make_int_16(read_imm_16())); +} + +static void d68020_bra_32(void) +{ + uint temp_pc = g_cpu_pc; + sprintf(g_dasm_str, "bra %x; (2+)", temp_pc + read_imm_32()); +} + +static void d68000_bset_r(void) +{ + sprintf(g_dasm_str, "bset D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68000_bset_s(void) +{ + char* str = get_imm_str_s8(); + sprintf(g_dasm_str, "bset %s, %s", str, get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68000_bsr_8(void) +{ + uint temp_pc = g_cpu_pc; + sprintf(g_dasm_str, "bsr %x", temp_pc + make_int_8(g_cpu_ir)); +} + +static void d68000_bsr_16(void) +{ + uint temp_pc = g_cpu_pc; + sprintf(g_dasm_str, "bsr %x", temp_pc + make_int_16(read_imm_16())); +} + +static void d68020_bsr_32(void) +{ + uint temp_pc = g_cpu_pc; + sprintf(g_dasm_str, "bsr %x; (2+)", temp_pc + peek_imm_32()); +} + +static void d68000_btst_r(void) +{ + sprintf(g_dasm_str, "btst D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68000_btst_s(void) +{ + char* str = get_imm_str_s8(); + sprintf(g_dasm_str, "btst %s, %s", str, get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68020_callm(void) +{ + char* str = get_imm_str_u8(); + sprintf(g_dasm_str, "callm %s, %s; (2)", str, get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68020_cas_8(void) +{ + uint extension = read_imm_16(); + 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)); +} + +static void d68020_cas_16(void) +{ + uint extension = read_imm_16(); + 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)); +} + +static void d68020_cas_32(void) +{ + uint extension = read_imm_16(); + 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)); +} + +static void d68020_cas2_16(void) +{ + uint extension = read_imm_32(); + sprintf(g_dasm_str, "cas2.w D%d:D%d:D%d:D%d, (%c%d):(%c%d); (2+)", + (extension>>16)&7, extension&7, (extension>>22)&7, (extension>>6)&7, + BIT_1F(extension) ? 'A' : 'D', (extension>>28)&7, + BIT_F(extension) ? 'A' : 'D', (extension>>12)&7); +} + +static void d68020_cas2_32(void) +{ + uint extension = read_imm_32(); + sprintf(g_dasm_str, "cas2.l D%d:D%d:D%d:D%d, (%c%d):(%c%d); (2+)", + (extension>>16)&7, extension&7, (extension>>22)&7, (extension>>6)&7, + BIT_1F(extension) ? 'A' : 'D', (extension>>28)&7, + BIT_F(extension) ? 'A' : 'D', (extension>>12)&7); +} + +static void d68000_chk_16(void) +{ + sprintf(g_dasm_str, "chk.w %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7); +} + +static void d68020_chk_32(void) +{ + sprintf(g_dasm_str, "chk.l %s, D%d; (2+)", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7); +} + +static void d68020_chk2_cmp2_8(void) +{ + uint extension = read_imm_16(); + 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); +} + +static void d68020_chk2_cmp2_16(void) +{ + uint extension = read_imm_16(); + 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); +} + +static void d68020_chk2_cmp2_32(void) +{ + uint extension = read_imm_16(); + 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); +} + +static void d68040_cinv(void) +{ + switch((g_cpu_ir>>3)&3) + { + case 0: + sprintf(g_dasm_str, "cinv (illegal scope); (4)"); + break; + case 1: + sprintf(g_dasm_str, "cinvl %d, (A%d); (4)", (g_cpu_ir>>6)&3, g_cpu_ir&7); + break; + case 2: + sprintf(g_dasm_str, "cinvp %d, (A%d); (4)", (g_cpu_ir>>6)&3, g_cpu_ir&7); + break; + case 3: + sprintf(g_dasm_str, "cinva %d; (4)", (g_cpu_ir>>6)&3); + break; + } +} + +static void d68000_clr_8(void) +{ + sprintf(g_dasm_str, "clr.b %s", get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68000_clr_16(void) +{ + sprintf(g_dasm_str, "clr.w %s", get_ea_mode_str_16(g_cpu_ir)); +} + +static void d68000_clr_32(void) +{ + sprintf(g_dasm_str, "clr.l %s", get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68000_cmp_8(void) +{ + sprintf(g_dasm_str, "cmp.b %s, D%d", get_ea_mode_str_8(g_cpu_ir), (g_cpu_ir>>9)&7); +} + +static void d68000_cmp_16(void) +{ + sprintf(g_dasm_str, "cmp.w %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7); +} + +static void d68000_cmp_32(void) +{ + sprintf(g_dasm_str, "cmp.l %s, D%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7); +} + +static void d68000_cmpa_16(void) +{ + sprintf(g_dasm_str, "cmpa.w %s, A%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7); +} + +static void d68000_cmpa_32(void) +{ + sprintf(g_dasm_str, "cmpa.l %s, A%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7); +} + +static void d68000_cmpi_8(void) +{ + char* str = get_imm_str_s8(); + sprintf(g_dasm_str, "cmpi.b %s, %s", str, get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68020_cmpi_pcdi_8(void) +{ + char* str = get_imm_str_s8(); + sprintf(g_dasm_str, "cmpi.b %s, %s; (2+)", str, get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68020_cmpi_pcix_8(void) +{ + char* str = get_imm_str_s8(); + sprintf(g_dasm_str, "cmpi.b %s, %s; (2+)", str, get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68000_cmpi_16(void) +{ + char* str = get_imm_str_s16(); + sprintf(g_dasm_str, "cmpi.w %s, %s", str, get_ea_mode_str_16(g_cpu_ir)); +} + +static void d68020_cmpi_pcdi_16(void) +{ + char* str = get_imm_str_s16(); + sprintf(g_dasm_str, "cmpi.w %s, %s; (2+)", str, get_ea_mode_str_16(g_cpu_ir)); +} + +static void d68020_cmpi_pcix_16(void) +{ + char* str = get_imm_str_s16(); + sprintf(g_dasm_str, "cmpi.w %s, %s; (2+)", str, get_ea_mode_str_16(g_cpu_ir)); +} + +static void d68000_cmpi_32(void) +{ + char* str = get_imm_str_s32(); + sprintf(g_dasm_str, "cmpi.l %s, %s", str, get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68020_cmpi_pcdi_32(void) +{ + char* str = get_imm_str_s32(); + sprintf(g_dasm_str, "cmpi.l %s, %s; (2+)", str, get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68020_cmpi_pcix_32(void) +{ + char* str = get_imm_str_s32(); + sprintf(g_dasm_str, "cmpi.l %s, %s; (2+)", str, get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68000_cmpm_8(void) +{ + sprintf(g_dasm_str, "cmpm.b (A%d)+, (A%d)+", g_cpu_ir&7, (g_cpu_ir>>9)&7); +} + +static void d68000_cmpm_16(void) +{ + sprintf(g_dasm_str, "cmpm.w (A%d)+, (A%d)+", g_cpu_ir&7, (g_cpu_ir>>9)&7); +} + +static void d68000_cmpm_32(void) +{ + sprintf(g_dasm_str, "cmpm.l (A%d)+, (A%d)+", g_cpu_ir&7, (g_cpu_ir>>9)&7); +} + +static void d68020_cpbcc_16(void) +{ + uint extension = read_imm_16(); + uint new_pc = g_cpu_pc; + new_pc += make_int_16(peek_imm_16()); + 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); +} + +static void d68020_cpbcc_32(void) +{ + uint extension = read_imm_16(); + uint new_pc = g_cpu_pc; + new_pc += peek_imm_32(); + 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); +} + +static void d68020_cpdbcc(void) +{ + uint extension1 = read_imm_16(); + uint extension2 = read_imm_16(); + uint new_pc = g_cpu_pc; + new_pc += make_int_16(peek_imm_16()); + 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); +} + +static void d68020_cpgen(void) +{ + sprintf(g_dasm_str, "%dgen %s; (2-3)", (g_cpu_ir>>9)&7, get_imm_str_u32()); +} + +static void d68020_cprestore(void) +{ + sprintf(g_dasm_str, "%drestore %s; (2-3)", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68020_cpsave(void) +{ + sprintf(g_dasm_str, "%dsave %s; (2-3)", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68020_cpscc(void) +{ + uint extension1 = read_imm_16(); + uint extension2 = read_imm_16(); + 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); +} + +static void d68020_cptrapcc_0(void) +{ + uint extension1 = read_imm_16(); + uint extension2 = read_imm_16(); + sprintf(g_dasm_str, "%dtrap%-4s; (extension = %x) (2-3)", (g_cpu_ir>>9)&7, g_cpcc[extension1&0x3f], extension2); +} + +static void d68020_cptrapcc_16(void) +{ + uint extension1 = read_imm_16(); + uint extension2 = read_imm_16(); + 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); +} + +static void d68020_cptrapcc_32(void) +{ + uint extension1 = read_imm_16(); + uint extension2 = read_imm_16(); + 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); +} + +static void d68040_cpush(void) +{ + switch((g_cpu_ir>>3)&3) + { + case 0: + sprintf(g_dasm_str, "cpush (illegal scope); (4)"); + break; + case 1: + sprintf(g_dasm_str, "cpushl %d, (A%d); (4)", (g_cpu_ir>>6)&3, g_cpu_ir&7); + break; + case 2: + sprintf(g_dasm_str, "cpushp %d, (A%d); (4)", (g_cpu_ir>>6)&3, g_cpu_ir&7); + break; + case 3: + sprintf(g_dasm_str, "cpusha %d; (4)", (g_cpu_ir>>6)&3); + break; + } +} + +static void d68000_dbra(void) +{ + uint temp_pc = g_cpu_pc; + sprintf(g_dasm_str, "dbra D%d, %x", g_cpu_ir & 7, temp_pc + make_int_16(read_imm_16())); +} + +static void d68000_dbcc(void) +{ + uint temp_pc = g_cpu_pc; + 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())); +} + +static void d68000_divs(void) +{ + sprintf(g_dasm_str, "divs.w %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7); +} + +static void d68000_divu(void) +{ + sprintf(g_dasm_str, "divu.w %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7); +} + +static void d68020_divl(void) +{ + uint extension = read_imm_16(); + + if((extension&7) == ((extension>>12)&7)) + 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); + else if(BIT_A(extension)) + 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); + else + 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); +} + +static void d68000_eor_8(void) +{ + sprintf(g_dasm_str, "eor.b D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68000_eor_16(void) +{ + sprintf(g_dasm_str, "eor.w D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_16(g_cpu_ir)); +} + +static void d68000_eor_32(void) +{ + sprintf(g_dasm_str, "eor.l D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68000_eori_8(void) +{ + char* str = get_imm_str_u8(); + sprintf(g_dasm_str, "eori.b %s, %s", str, get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68000_eori_16(void) +{ + char* str = get_imm_str_u16(); + sprintf(g_dasm_str, "eori.w %s, %s", str, get_ea_mode_str_16(g_cpu_ir)); +} + +static void d68000_eori_32(void) +{ + char* str = get_imm_str_u32(); + sprintf(g_dasm_str, "eori.l %s, %s", str, get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68000_eori_to_ccr(void) +{ + sprintf(g_dasm_str, "eori %s, CCR", get_imm_str_u8()); +} + +static void d68000_eori_to_sr(void) +{ + sprintf(g_dasm_str, "eori %s, SR", get_imm_str_u16()); +} + +static void d68000_exg_dd(void) +{ + sprintf(g_dasm_str, "exg D%d, D%d", ((g_cpu_ir>>9)&7), g_cpu_ir&7); +} + +static void d68000_exg_aa(void) +{ + sprintf(g_dasm_str, "exg A%d, A%d", ((g_cpu_ir>>9)&7), g_cpu_ir&7); +} + +static void d68000_exg_da(void) +{ + sprintf(g_dasm_str, "exg D%d, A%d", ((g_cpu_ir>>9)&7), g_cpu_ir&7); +} + +static void d68000_ext_16(void) +{ + sprintf(g_dasm_str, "ext.w D%d", g_cpu_ir&7); +} + +static void d68000_ext_32(void) +{ + sprintf(g_dasm_str, "ext.l D%d", g_cpu_ir&7); +} + +static void d68020_extb_32(void) +{ + sprintf(g_dasm_str, "extb.l D%d; (2+)", g_cpu_ir&7); +} + +static void d68000_jmp(void) +{ + sprintf(g_dasm_str, "jmp %s", get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68000_jsr(void) +{ + sprintf(g_dasm_str, "jsr %s", get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68000_lea(void) +{ + sprintf(g_dasm_str, "lea %s, A%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7); +} + +static void d68000_link_16(void) +{ + sprintf(g_dasm_str, "link A%d, %s", g_cpu_ir&7, get_imm_str_s16()); +} + +static void d68020_link_32(void) +{ + sprintf(g_dasm_str, "link A%d, %s; (2+)", g_cpu_ir&7, get_imm_str_s32()); +} + +static void d68000_lsr_s_8(void) +{ + sprintf(g_dasm_str, "lsr.b #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7); +} + +static void d68000_lsr_s_16(void) +{ + sprintf(g_dasm_str, "lsr.w #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7); +} + +static void d68000_lsr_s_32(void) +{ + sprintf(g_dasm_str, "lsr.l #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7); +} + +static void d68000_lsr_r_8(void) +{ + sprintf(g_dasm_str, "lsr.b D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7); +} + +static void d68000_lsr_r_16(void) +{ + sprintf(g_dasm_str, "lsr.w D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7); +} + +static void d68000_lsr_r_32(void) +{ + sprintf(g_dasm_str, "lsr.l D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7); +} + +static void d68000_lsr_ea(void) +{ + sprintf(g_dasm_str, "lsr.w %s", get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68000_lsl_s_8(void) +{ + sprintf(g_dasm_str, "lsl.b #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7); +} + +static void d68000_lsl_s_16(void) +{ + sprintf(g_dasm_str, "lsl.w #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7); +} + +static void d68000_lsl_s_32(void) +{ + sprintf(g_dasm_str, "lsl.l #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7); +} + +static void d68000_lsl_r_8(void) +{ + sprintf(g_dasm_str, "lsl.b D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7); +} + +static void d68000_lsl_r_16(void) +{ + sprintf(g_dasm_str, "lsl.w D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7); +} + +static void d68000_lsl_r_32(void) +{ + sprintf(g_dasm_str, "lsl.l D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7); +} + +static void d68000_lsl_ea(void) +{ + sprintf(g_dasm_str, "lsl.w %s", get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68000_move_8(void) +{ + char* str = get_ea_mode_str_8(g_cpu_ir); + sprintf(g_dasm_str, "move.b %s, %s", str, get_ea_mode_str_8(((g_cpu_ir>>9) & 7) | ((g_cpu_ir>>3) & 0x38))); +} + +static void d68000_move_16(void) +{ + char* str = get_ea_mode_str_16(g_cpu_ir); + sprintf(g_dasm_str, "move.w %s, %s", str, get_ea_mode_str_16(((g_cpu_ir>>9) & 7) | ((g_cpu_ir>>3) & 0x38))); +} + +static void d68000_move_32(void) +{ + char* str = get_ea_mode_str_32(g_cpu_ir); + sprintf(g_dasm_str, "move.l %s, %s", str, get_ea_mode_str_32(((g_cpu_ir>>9) & 7) | ((g_cpu_ir>>3) & 0x38))); +} + +static void d68000_movea_16(void) +{ + sprintf(g_dasm_str, "movea.w %s, A%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7); +} + +static void d68000_movea_32(void) +{ + sprintf(g_dasm_str, "movea.l %s, A%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7); +} + +static void d68000_move_to_ccr(void) +{ + sprintf(g_dasm_str, "move %s, CCR", get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68010_move_fr_ccr(void) +{ + sprintf(g_dasm_str, "move CCR, %s; (1+)", get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68000_move_fr_sr(void) +{ + sprintf(g_dasm_str, "move SR, %s", get_ea_mode_str_16(g_cpu_ir)); +} + +static void d68000_move_to_sr(void) +{ + sprintf(g_dasm_str, "move %s, SR", get_ea_mode_str_16(g_cpu_ir)); +} + +static void d68000_move_fr_usp(void) +{ + sprintf(g_dasm_str, "move USP, A%d", g_cpu_ir&7); +} + +static void d68000_move_to_usp(void) +{ + sprintf(g_dasm_str, "move A%d, USP", g_cpu_ir&7); +} + +static void d68010_movec(void) +{ + uint extension = read_imm_16(); + char* reg_name; + char* processor; + + switch(extension & 0xfff) + { + case 0x000: + reg_name = "SFC"; + processor = "1+"; + break; + case 0x001: + reg_name = "DFC"; + processor = "1+"; + break; + case 0x800: + reg_name = "USP"; + processor = "1+"; + break; + case 0x801: + reg_name = "VBR"; + processor = "1+"; + break; + case 0x002: + reg_name = "CACR"; + processor = "2+"; + break; + case 0x802: + reg_name = "CAAR"; + processor = "2,3"; + break; + case 0x803: + reg_name = "MSP"; + processor = "2+"; + break; + case 0x804: + reg_name = "ISP"; + processor = "2+"; + break; + case 0x003: + reg_name = "TC"; + processor = "4+"; + break; + case 0x004: + reg_name = "ITT0"; + processor = "4+"; + break; + case 0x005: + reg_name = "ITT1"; + processor = "4+"; + break; + case 0x006: + reg_name = "DTT0"; + processor = "4+"; + break; + case 0x007: + reg_name = "DTT1"; + processor = "4+"; + break; + case 0x805: + reg_name = "MMUSR"; + processor = "4+"; + break; + case 0x806: + reg_name = "URP"; + processor = "4+"; + break; + case 0x807: + reg_name = "SRP"; + processor = "4+"; + break; + default: + reg_name = make_signed_hex_str_16(extension & 0xfff); + processor = "?"; + } + + if(BIT_1(g_cpu_ir)) + sprintf(g_dasm_str, "movec %c%d, %s; (%s)", BIT_F(extension) ? 'A' : 'D', (extension>>12)&7, reg_name, processor); + else + sprintf(g_dasm_str, "movec %s, %c%d; (%s)", reg_name, BIT_F(extension) ? 'A' : 'D', (extension>>12)&7, processor); +} + +static void d68000_movem_pd_16(void) +{ + uint data = read_imm_16(); + char buffer[40]; + uint first; + uint run_length; + uint i; + + buffer[0] = 0; + for(i=0;i<8;i++) + { + if(data&(1<<(15-i))) + { + first = i; + run_length = 0; + for(i++;i<8;i++) + if(data&(1<<(15-i))) + run_length++; + if(buffer[0] != 0) + strcat(buffer, "/"); + sprintf(buffer+strlen(buffer), "D%d", first); + if(run_length > 0) + sprintf(buffer+strlen(buffer), "-D%d", first + run_length); + } + } + for(i=0;i<8;i++) + { + if(data&(1<<(7-i))) + { + first = i; + run_length = 0; + for(i++;i<8;i++) + if(data&(1<<(7-i))) + run_length++; + if(buffer[0] != 0) + strcat(buffer, "/"); + sprintf(buffer+strlen(buffer), "A%d", first); + if(run_length > 0) + sprintf(buffer+strlen(buffer), "-A%d", first + run_length); + } + } + sprintf(g_dasm_str, "movem.w %s, %s", buffer, get_ea_mode_str_16(g_cpu_ir)); +} + +static void d68000_movem_pd_32(void) +{ + uint data = read_imm_16(); + char buffer[40]; + uint first; + uint run_length; + uint i; + + buffer[0] = 0; + for(i=0;i<8;i++) + { + if(data&(1<<(15-i))) + { + first = i; + run_length = 0; + for(i++;i<8;i++) + if(data&(1<<(15-i))) + run_length++; + if(buffer[0] != 0) + strcat(buffer, "/"); + sprintf(buffer+strlen(buffer), "D%d", first); + if(run_length > 0) + sprintf(buffer+strlen(buffer), "-D%d", first + run_length); + } + } + for(i=0;i<8;i++) + { + if(data&(1<<(7-i))) + { + first = i; + run_length = 0; + for(i++;i<8;i++) + if(data&(1<<(7-i))) + run_length++; + if(buffer[0] != 0) + strcat(buffer, "/"); + sprintf(buffer+strlen(buffer), "A%d", first); + if(run_length > 0) + sprintf(buffer+strlen(buffer), "-A%d", first + run_length); + } + } + sprintf(g_dasm_str, "movem.l %s, %s", buffer, get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68000_movem_er_16(void) +{ + uint data = read_imm_16(); + char buffer[40]; + uint first; + uint run_length; + uint i; + + buffer[0] = 0; + for(i=0;i<8;i++) + { + if(data&(1< 0) + sprintf(buffer+strlen(buffer), "-D%d", first + run_length); + } + } + for(i=0;i<8;i++) + { + if(data&(1<<(i+8))) + { + first = i; + run_length = 0; + for(i++;i<8;i++) + if(data&(1<<(i+8))) + run_length++; + if(buffer[0] != 0) + strcat(buffer, "/"); + sprintf(buffer+strlen(buffer), "A%d", first); + if(run_length > 0) + sprintf(buffer+strlen(buffer), "-A%d", first + run_length); + } + } + sprintf(g_dasm_str, "movem.w %s, %s", get_ea_mode_str_16(g_cpu_ir), buffer); +} + +static void d68000_movem_er_32(void) +{ + uint data = read_imm_16(); + char buffer[40]; + uint first; + uint run_length; + uint i; + + buffer[0] = 0; + for(i=0;i<8;i++) + { + if(data&(1< 0) + sprintf(buffer+strlen(buffer), "-D%d", first + run_length); + } + } + for(i=0;i<8;i++) + { + if(data&(1<<(i+8))) + { + first = i; + run_length = 0; + for(i++;i<8;i++) + if(data&(1<<(i+8))) + run_length++; + if(buffer[0] != 0) + strcat(buffer, "/"); + sprintf(buffer+strlen(buffer), "A%d", first); + if(run_length > 0) + sprintf(buffer+strlen(buffer), "-A%d", first + run_length); + } + } + sprintf(g_dasm_str, "movem.l %s, %s", get_ea_mode_str_32(g_cpu_ir), buffer); +} + +static void d68000_movem_re_16(void) +{ + uint data = read_imm_16(); + char buffer[40]; + uint first; + uint run_length; + uint i; + + buffer[0] = 0; + for(i=0;i<8;i++) + { + if(data&(1< 0) + sprintf(buffer+strlen(buffer), "-D%d", first + run_length); + } + } + for(i=0;i<8;i++) + { + if(data&(1<<(i+8))) + { + first = i; + run_length = 0; + for(i++;i<8;i++) + if(data&(1<<(i+8))) + run_length++; + if(buffer[0] != 0) + strcat(buffer, "/"); + sprintf(buffer+strlen(buffer), "A%d", first); + if(run_length > 0) + sprintf(buffer+strlen(buffer), "-A%d", first + run_length); + } + } + sprintf(g_dasm_str, "movem.w %s, %s", buffer, get_ea_mode_str_16(g_cpu_ir)); +} + +static void d68000_movem_re_32(void) +{ + uint data = read_imm_16(); + char buffer[40]; + uint first; + uint run_length; + uint i; + + buffer[0] = 0; + for(i=0;i<8;i++) + { + if(data&(1< 0) + sprintf(buffer+strlen(buffer), "-D%d", first + run_length); + } + } + for(i=0;i<8;i++) + { + if(data&(1<<(i+8))) + { + first = i; + run_length = 0; + for(i++;i<8;i++) + if(data&(1<<(i+8))) + run_length++; + if(buffer[0] != 0) + strcat(buffer, "/"); + sprintf(buffer+strlen(buffer), "A%d", first); + if(run_length > 0) + sprintf(buffer+strlen(buffer), "-A%d", first + run_length); + } + } + sprintf(g_dasm_str, "movem.l %s, %s", buffer, get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68000_movep_re_16(void) +{ + sprintf(g_dasm_str, "movep.w D%d, ($%x,A%d)", (g_cpu_ir>>9)&7, read_imm_16(), g_cpu_ir&7); +} + +static void d68000_movep_re_32(void) +{ + sprintf(g_dasm_str, "movep.l D%d, ($%x,A%d)", (g_cpu_ir>>9)&7, read_imm_16(), g_cpu_ir&7); +} + +static void d68000_movep_er_16(void) +{ + sprintf(g_dasm_str, "movep.w ($%x,A%d), D%d", read_imm_16(), g_cpu_ir&7, (g_cpu_ir>>9)&7); +} + +static void d68000_movep_er_32(void) +{ + sprintf(g_dasm_str, "movep.l ($%x,A%d), D%d", read_imm_16(), g_cpu_ir&7, (g_cpu_ir>>9)&7); +} + +static void d68010_moves_8(void) +{ + uint extension = read_imm_16(); + if(BIT_B(extension)) + 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)); + else + 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); +} + +static void d68010_moves_16(void) +{ + uint extension = read_imm_16(); + if(BIT_B(extension)) + sprintf(g_dasm_str, "moves.b %c%d, %s; (1+)", BIT_F(extension) ? 'A' : 'D', (extension>>12)&7, get_ea_mode_str_16(g_cpu_ir)); + else + sprintf(g_dasm_str, "moves.b %s, %c%d; (1+)", get_ea_mode_str_16(g_cpu_ir), BIT_F(extension) ? 'A' : 'D', (extension>>12)&7); +} + +static void d68010_moves_32(void) +{ + uint extension = read_imm_16(); + if(BIT_B(extension)) + sprintf(g_dasm_str, "moves.b %c%d, %s; (1+)", BIT_F(extension) ? 'A' : 'D', (extension>>12)&7, get_ea_mode_str_32(g_cpu_ir)); + else + sprintf(g_dasm_str, "moves.b %s, %c%d; (1+)", get_ea_mode_str_32(g_cpu_ir), BIT_F(extension) ? 'A' : 'D', (extension>>12)&7); +} + +static void d68000_moveq(void) +{ + sprintf(g_dasm_str, "moveq #%s, D%d", make_signed_hex_str_8(g_cpu_ir), (g_cpu_ir>>9)&7); +} + +static void d68040_move16_pi_pi(void) +{ + sprintf(g_dasm_str, "move16 (A%d)+, (A%d)+; (4)", g_cpu_ir&7, (read_imm_16()>>12)&7); +} + +static void d68040_move16_pi_al(void) +{ + sprintf(g_dasm_str, "move16 (A%d)+, %s; (4)", g_cpu_ir&7, get_imm_str_u32()); +} + +static void d68040_move16_al_pi(void) +{ + sprintf(g_dasm_str, "move16 %s, (A%d)+; (4)", get_imm_str_u32(), g_cpu_ir&7); +} + +static void d68040_move16_ai_al(void) +{ + sprintf(g_dasm_str, "move16 (A%d), %s; (4)", g_cpu_ir&7, get_imm_str_u32()); +} + +static void d68040_move16_al_ai(void) +{ + sprintf(g_dasm_str, "move16 %s, (A%d); (4)", get_imm_str_u32(), g_cpu_ir&7); +} + +static void d68000_muls(void) +{ + sprintf(g_dasm_str, "muls.w %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7); +} + +static void d68000_mulu(void) +{ + sprintf(g_dasm_str, "mulu.w %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7); +} + +static void d68020_mull(void) +{ + uint extension = read_imm_16(); + + if(BIT_A(extension)) + 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); + else + 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); +} + +static void d68000_nbcd(void) +{ + sprintf(g_dasm_str, "nbcd %s", get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68000_neg_8(void) +{ + sprintf(g_dasm_str, "neg.b %s", get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68000_neg_16(void) +{ + sprintf(g_dasm_str, "neg.w %s", get_ea_mode_str_16(g_cpu_ir)); +} + +static void d68000_neg_32(void) +{ + sprintf(g_dasm_str, "neg.l %s", get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68000_negx_8(void) +{ + sprintf(g_dasm_str, "negx.b %s", get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68000_negx_16(void) +{ + sprintf(g_dasm_str, "negx.w %s", get_ea_mode_str_16(g_cpu_ir)); +} + +static void d68000_negx_32(void) +{ + sprintf(g_dasm_str, "negx.l %s", get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68000_nop(void) +{ + sprintf(g_dasm_str, "nop"); +} + +static void d68000_not_8(void) +{ + sprintf(g_dasm_str, "not.b %s", get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68000_not_16(void) +{ + sprintf(g_dasm_str, "not.w %s", get_ea_mode_str_16(g_cpu_ir)); +} + +static void d68000_not_32(void) +{ + sprintf(g_dasm_str, "not.l %s", get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68000_or_er_8(void) +{ + sprintf(g_dasm_str, "or.b %s, D%d", get_ea_mode_str_8(g_cpu_ir), (g_cpu_ir>>9)&7); +} + +static void d68000_or_er_16(void) +{ + sprintf(g_dasm_str, "or.w %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7); +} + +static void d68000_or_er_32(void) +{ + sprintf(g_dasm_str, "or.l %s, D%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7); +} + +static void d68000_or_re_8(void) +{ + sprintf(g_dasm_str, "or.b D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68000_or_re_16(void) +{ + sprintf(g_dasm_str, "or.w D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_16(g_cpu_ir)); +} + +static void d68000_or_re_32(void) +{ + sprintf(g_dasm_str, "or.l D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68000_ori_8(void) +{ + char* str = get_imm_str_u8(); + sprintf(g_dasm_str, "ori.b %s, %s", str, get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68000_ori_16(void) +{ + char* str = get_imm_str_u16(); + sprintf(g_dasm_str, "ori.w %s, %s", str, get_ea_mode_str_16(g_cpu_ir)); +} + +static void d68000_ori_32(void) +{ + char* str = get_imm_str_u32(); + sprintf(g_dasm_str, "ori.l %s, %s", str, get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68000_ori_to_ccr(void) +{ + sprintf(g_dasm_str, "ori %s, CCR", get_imm_str_u8()); +} + +static void d68000_ori_to_sr(void) +{ + sprintf(g_dasm_str, "ori %s, SR", get_imm_str_u16()); +} + +static void d68020_pack_rr(void) +{ + sprintf(g_dasm_str, "pack D%d, D%d, %s; (2+)", g_cpu_ir&7, (g_cpu_ir>>9)&7, get_imm_str_u16()); +} + +static void d68020_pack_mm(void) +{ + sprintf(g_dasm_str, "pack -(A%d), -(A%d), %s; (2+)", g_cpu_ir&7, (g_cpu_ir>>9)&7, get_imm_str_u16()); +} + +static void d68000_pea(void) +{ + sprintf(g_dasm_str, "pea %s", get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68000_reset(void) +{ + sprintf(g_dasm_str, "reset"); +} + +static void d68000_ror_s_8(void) +{ + sprintf(g_dasm_str, "ror.b #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7); +} + +static void d68000_ror_s_16(void) +{ + sprintf(g_dasm_str, "ror.w #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7],g_cpu_ir&7); +} + +static void d68000_ror_s_32(void) +{ + sprintf(g_dasm_str, "ror.l #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7); +} + +static void d68000_ror_r_8(void) +{ + sprintf(g_dasm_str, "ror.b D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7); +} + +static void d68000_ror_r_16(void) +{ + sprintf(g_dasm_str, "ror.w D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7); +} + +static void d68000_ror_r_32(void) +{ + sprintf(g_dasm_str, "ror.l D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7); +} + +static void d68000_ror_ea(void) +{ + sprintf(g_dasm_str, "ror.w %s", get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68000_rol_s_8(void) +{ + sprintf(g_dasm_str, "rol.b #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7); +} + +static void d68000_rol_s_16(void) +{ + sprintf(g_dasm_str, "rol.w #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7); +} + +static void d68000_rol_s_32(void) +{ + sprintf(g_dasm_str, "rol.l #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7); +} + +static void d68000_rol_r_8(void) +{ + sprintf(g_dasm_str, "rol.b D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7); +} + +static void d68000_rol_r_16(void) +{ + sprintf(g_dasm_str, "rol.w D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7); +} + +static void d68000_rol_r_32(void) +{ + sprintf(g_dasm_str, "rol.l D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7); +} + +static void d68000_rol_ea(void) +{ + sprintf(g_dasm_str, "rol.w %s", get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68000_roxr_s_8(void) +{ + sprintf(g_dasm_str, "roxr.b #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7); +} + +static void d68000_roxr_s_16(void) +{ + sprintf(g_dasm_str, "roxr.w #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7); +} + + +static void d68000_roxr_s_32(void) +{ + sprintf(g_dasm_str, "roxr.l #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7); +} + +static void d68000_roxr_r_8(void) +{ + sprintf(g_dasm_str, "roxr.b D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7); +} + +static void d68000_roxr_r_16(void) +{ + sprintf(g_dasm_str, "roxr.w D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7); +} + +static void d68000_roxr_r_32(void) +{ + sprintf(g_dasm_str, "roxr.l D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7); +} + +static void d68000_roxr_ea(void) +{ + sprintf(g_dasm_str, "roxr.w %s", get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68000_roxl_s_8(void) +{ + sprintf(g_dasm_str, "roxl.b #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7); +} + +static void d68000_roxl_s_16(void) +{ + sprintf(g_dasm_str, "roxl.w #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7); +} + +static void d68000_roxl_s_32(void) +{ + sprintf(g_dasm_str, "roxl.l #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7); +} + +static void d68000_roxl_r_8(void) +{ + sprintf(g_dasm_str, "roxl.b D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7); +} + +static void d68000_roxl_r_16(void) +{ + sprintf(g_dasm_str, "roxl.w D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7); +} + +static void d68000_roxl_r_32(void) +{ + sprintf(g_dasm_str, "roxl.l D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7); +} + +static void d68000_roxl_ea(void) +{ + sprintf(g_dasm_str, "roxl.w %s", get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68010_rtd(void) +{ + sprintf(g_dasm_str, "rtd %s; (1+)", get_imm_str_s16()); +} + +static void d68000_rte(void) +{ + sprintf(g_dasm_str, "rte"); +} + +static void d68020_rtm(void) +{ + sprintf(g_dasm_str, "rtm %c%d; (2+)", BIT_3(g_cpu_ir) ? 'A' : 'D', g_cpu_ir&7); +} + +static void d68000_rtr(void) +{ + sprintf(g_dasm_str, "rtr"); +} + +static void d68000_rts(void) +{ + sprintf(g_dasm_str, "rts"); +} + +static void d68000_sbcd_rr(void) +{ + sprintf(g_dasm_str, "sbcd D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7); +} + +static void d68000_sbcd_mm(void) +{ + sprintf(g_dasm_str, "sbcd -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7); +} + +static void d68000_scc(void) +{ + sprintf(g_dasm_str, "s%-2s %s", g_cc[(g_cpu_ir>>8)&0xf], get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68000_stop(void) +{ + sprintf(g_dasm_str, "stop %s", get_imm_str_s16()); +} + +static void d68000_sub_er_8(void) +{ + sprintf(g_dasm_str, "sub.b %s, D%d", get_ea_mode_str_8(g_cpu_ir), (g_cpu_ir>>9)&7); +} + +static void d68000_sub_er_16(void) +{ + sprintf(g_dasm_str, "sub.w %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7); +} + +static void d68000_sub_er_32(void) +{ + sprintf(g_dasm_str, "sub.l %s, D%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7); +} + +static void d68000_sub_re_8(void) +{ + sprintf(g_dasm_str, "sub.b D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68000_sub_re_16(void) +{ + sprintf(g_dasm_str, "sub.w D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_16(g_cpu_ir)); +} + +static void d68000_sub_re_32(void) +{ + sprintf(g_dasm_str, "sub.l D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68000_suba_16(void) +{ + sprintf(g_dasm_str, "suba.w %s, A%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7); +} + +static void d68000_suba_32(void) +{ + sprintf(g_dasm_str, "suba.l %s, A%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7); +} + +static void d68000_subi_8(void) +{ + char* str = get_imm_str_s8(); + sprintf(g_dasm_str, "subi.b %s, %s", str, get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68000_subi_16(void) +{ + char* str = get_imm_str_s16(); + sprintf(g_dasm_str, "subi.w %s, %s", str, get_ea_mode_str_16(g_cpu_ir)); +} + +static void d68000_subi_32(void) +{ + char* str = get_imm_str_s32(); + sprintf(g_dasm_str, "subi.l %s, %s", str, get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68000_subq_8(void) +{ + 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)); +} + +static void d68000_subq_16(void) +{ + 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)); +} + +static void d68000_subq_32(void) +{ + 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)); +} + +static void d68000_subx_rr_8(void) +{ + sprintf(g_dasm_str, "subx.b D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7); +} + +static void d68000_subx_rr_16(void) +{ + sprintf(g_dasm_str, "subx.w D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7); +} + +static void d68000_subx_rr_32(void) +{ + sprintf(g_dasm_str, "subx.l D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7); +} + +static void d68000_subx_mm_8(void) +{ + sprintf(g_dasm_str, "subx.b -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7); +} + +static void d68000_subx_mm_16(void) +{ + sprintf(g_dasm_str, "subx.w -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7); +} + +static void d68000_subx_mm_32(void) +{ + sprintf(g_dasm_str, "subx.l -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7); +} + +static void d68000_swap(void) +{ + sprintf(g_dasm_str, "swap D%d", g_cpu_ir&7); +} + +static void d68000_tas(void) +{ + sprintf(g_dasm_str, "tas %s", get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68000_trap(void) +{ + sprintf(g_dasm_str, "trap #$%x", g_cpu_ir&0xf); +} + +static void d68020_trapcc_0(void) +{ + sprintf(g_dasm_str, "trap%-2s; (2+)", g_cc[(g_cpu_ir>>8)&0xf]); +} + +static void d68020_trapcc_16(void) +{ + sprintf(g_dasm_str, "trap%-2s %s; (2+)", g_cc[(g_cpu_ir>>8)&0xf], get_imm_str_u16()); +} + +static void d68020_trapcc_32(void) +{ + sprintf(g_dasm_str, "trap%-2s %s; (2+)", g_cc[(g_cpu_ir>>8)&0xf], get_imm_str_u32()); +} + +static void d68000_trapv(void) +{ + sprintf(g_dasm_str, "trapv"); +} + +static void d68000_tst_8(void) +{ + sprintf(g_dasm_str, "tst.b %s", get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68020_tst_pcdi_8(void) +{ + sprintf(g_dasm_str, "tst.b %s; (2+)", get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68020_tst_pcix_8(void) +{ + sprintf(g_dasm_str, "tst.b %s; (2+)", get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68020_tst_i_8(void) +{ + sprintf(g_dasm_str, "tst.b %s; (2+)", get_ea_mode_str_8(g_cpu_ir)); +} + +static void d68000_tst_16(void) +{ + sprintf(g_dasm_str, "tst.w %s", get_ea_mode_str_16(g_cpu_ir)); +} + +static void d68020_tst_a_16(void) +{ + sprintf(g_dasm_str, "tst.w %s; (2+)", get_ea_mode_str_16(g_cpu_ir)); +} + +static void d68020_tst_pcdi_16(void) +{ + sprintf(g_dasm_str, "tst.w %s; (2+)", get_ea_mode_str_16(g_cpu_ir)); +} + +static void d68020_tst_pcix_16(void) +{ + sprintf(g_dasm_str, "tst.w %s; (2+)", get_ea_mode_str_16(g_cpu_ir)); +} + +static void d68020_tst_i_16(void) +{ + sprintf(g_dasm_str, "tst.w %s; (2+)", get_ea_mode_str_16(g_cpu_ir)); +} + +static void d68000_tst_32(void) +{ + sprintf(g_dasm_str, "tst.l %s", get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68020_tst_a_32(void) +{ + sprintf(g_dasm_str, "tst.l %s; (2+)", get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68020_tst_pcdi_32(void) +{ + sprintf(g_dasm_str, "tst.l %s; (2+)", get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68020_tst_pcix_32(void) +{ + sprintf(g_dasm_str, "tst.l %s; (2+)", get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68020_tst_i_32(void) +{ + sprintf(g_dasm_str, "tst.l %s; (2+)", get_ea_mode_str_32(g_cpu_ir)); +} + +static void d68000_unlk(void) +{ + sprintf(g_dasm_str, "unlk A%d", g_cpu_ir&7); +} + +static void d68020_unpk_rr(void) +{ + sprintf(g_dasm_str, "unpk D%d, D%d, %s; (2+)", g_cpu_ir&7, (g_cpu_ir>>9)&7, get_imm_str_u16()); +} + +static void d68020_unpk_mm(void) +{ + sprintf(g_dasm_str, "unpk -(A%d), -(A%d), %s; (2+)", g_cpu_ir&7, (g_cpu_ir>>9)&7, get_imm_str_u16()); +} + + +static void d68000_illegal(void) +{ + sprintf(g_dasm_str, "dc.w $%04x; ILLEGAL", g_cpu_ir); +} + + + +/* ======================================================================== */ +/* ======================= INSTRUCTION TABLE BUILDER ====================== */ +/* ======================================================================== */ + +/* EA Masks: +800 = data register direct +400 = address register direct +200 = address register indirect +100 = ARI postincrement + 80 = ARI pre-decrement + 40 = ARI displacement + 20 = ARI index + 10 = absolute short + 8 = absolute long + 4 = immediate / sr + 2 = pc displacement + 1 = pc idx +*/ + +static opcode_struct g_opcode_info[] = +{ +/* opcode handler mask match ea mask */ + {d68000_1010 , 0xf000, 0xa000, 0x000}, + {d68000_1111 , 0xf000, 0xf000, 0x000}, + {d68000_abcd_rr , 0xf1f8, 0xc100, 0x000}, + {d68000_abcd_mm , 0xf1f8, 0xc108, 0x000}, + {d68000_add_er_8 , 0xf1c0, 0xd000, 0xbff}, + {d68000_add_er_16 , 0xf1c0, 0xd040, 0xfff}, + {d68000_add_er_32 , 0xf1c0, 0xd080, 0xfff}, + {d68000_add_re_8 , 0xf1c0, 0xd100, 0x3f8}, + {d68000_add_re_16 , 0xf1c0, 0xd140, 0x3f8}, + {d68000_add_re_32 , 0xf1c0, 0xd180, 0x3f8}, + {d68000_adda_16 , 0xf1c0, 0xd0c0, 0xfff}, + {d68000_adda_32 , 0xf1c0, 0xd1c0, 0xfff}, + {d68000_addi_8 , 0xffc0, 0x0600, 0xbf8}, + {d68000_addi_16 , 0xffc0, 0x0640, 0xbf8}, + {d68000_addi_32 , 0xffc0, 0x0680, 0xbf8}, + {d68000_addq_8 , 0xf1c0, 0x5000, 0xbf8}, + {d68000_addq_16 , 0xf1c0, 0x5040, 0xff8}, + {d68000_addq_32 , 0xf1c0, 0x5080, 0xff8}, + {d68000_addx_rr_8 , 0xf1f8, 0xd100, 0x000}, + {d68000_addx_rr_16 , 0xf1f8, 0xd140, 0x000}, + {d68000_addx_rr_32 , 0xf1f8, 0xd180, 0x000}, + {d68000_addx_mm_8 , 0xf1f8, 0xd108, 0x000}, + {d68000_addx_mm_16 , 0xf1f8, 0xd148, 0x000}, + {d68000_addx_mm_32 , 0xf1f8, 0xd188, 0x000}, + {d68000_and_er_8 , 0xf1c0, 0xc000, 0xbff}, + {d68000_and_er_16 , 0xf1c0, 0xc040, 0xbff}, + {d68000_and_er_32 , 0xf1c0, 0xc080, 0xbff}, + {d68000_and_re_8 , 0xf1c0, 0xc100, 0x3f8}, + {d68000_and_re_16 , 0xf1c0, 0xc140, 0x3f8}, + {d68000_and_re_32 , 0xf1c0, 0xc180, 0x3f8}, + {d68000_andi_to_ccr , 0xffff, 0x023c, 0x000}, + {d68000_andi_to_sr , 0xffff, 0x027c, 0x000}, + {d68000_andi_8 , 0xffc0, 0x0200, 0xbf8}, + {d68000_andi_16 , 0xffc0, 0x0240, 0xbf8}, + {d68000_andi_32 , 0xffc0, 0x0280, 0xbf8}, + {d68000_asr_s_8 , 0xf1f8, 0xe000, 0x000}, + {d68000_asr_s_16 , 0xf1f8, 0xe040, 0x000}, + {d68000_asr_s_32 , 0xf1f8, 0xe080, 0x000}, + {d68000_asr_r_8 , 0xf1f8, 0xe020, 0x000}, + {d68000_asr_r_16 , 0xf1f8, 0xe060, 0x000}, + {d68000_asr_r_32 , 0xf1f8, 0xe0a0, 0x000}, + {d68000_asr_ea , 0xffc0, 0xe0c0, 0x3f8}, + {d68000_asl_s_8 , 0xf1f8, 0xe100, 0x000}, + {d68000_asl_s_16 , 0xf1f8, 0xe140, 0x000}, + {d68000_asl_s_32 , 0xf1f8, 0xe180, 0x000}, + {d68000_asl_r_8 , 0xf1f8, 0xe120, 0x000}, + {d68000_asl_r_16 , 0xf1f8, 0xe160, 0x000}, + {d68000_asl_r_32 , 0xf1f8, 0xe1a0, 0x000}, + {d68000_asl_ea , 0xffc0, 0xe1c0, 0x3f8}, + {d68000_bcc_8 , 0xf000, 0x6000, 0x000}, + {d68000_bcc_16 , 0xf0ff, 0x6000, 0x000}, + {d68020_bcc_32 , 0xf0ff, 0x60ff, 0x000}, + {d68000_bchg_r , 0xf1c0, 0x0140, 0xbf8}, + {d68000_bchg_s , 0xffc0, 0x0840, 0xbf8}, + {d68000_bclr_r , 0xf1c0, 0x0180, 0xbf8}, + {d68000_bclr_s , 0xffc0, 0x0880, 0xbf8}, + {d68020_bfchg , 0xffc0, 0xeac0, 0xa78}, + {d68020_bfclr , 0xffc0, 0xecc0, 0xa78}, + {d68020_bfexts , 0xffc0, 0xebc0, 0xa7b}, + {d68020_bfextu , 0xffc0, 0xe9c0, 0xa7b}, + {d68020_bfffo , 0xffc0, 0xedc0, 0xa7b}, + {d68020_bfins , 0xffc0, 0xefc0, 0xa78}, + {d68020_bfset , 0xffc0, 0xeec0, 0xa78}, + {d68020_bftst , 0xffc0, 0xe8c0, 0xa7b}, + {d68010_bkpt , 0xfff8, 0x4848, 0x000}, + {d68000_bra_8 , 0xff00, 0x6000, 0x000}, + {d68000_bra_16 , 0xffff, 0x6000, 0x000}, + {d68020_bra_32 , 0xffff, 0x60ff, 0x000}, + {d68000_bset_r , 0xf1c0, 0x01c0, 0xbf8}, + {d68000_bset_s , 0xffc0, 0x08c0, 0xbf8}, + {d68000_bsr_8 , 0xff00, 0x6100, 0x000}, + {d68000_bsr_16 , 0xffff, 0x6100, 0x000}, + {d68020_bsr_32 , 0xffff, 0x61ff, 0x000}, + {d68000_btst_r , 0xf1c0, 0x0100, 0xbff}, + {d68000_btst_s , 0xffc0, 0x0800, 0xbfb}, + {d68020_callm , 0xffc0, 0x06c0, 0x27b}, + {d68020_cas_8 , 0xffc0, 0x0ac0, 0x3f8}, + {d68020_cas_16 , 0xffc0, 0x0cc0, 0x3f8}, + {d68020_cas_32 , 0xffc0, 0x0ec0, 0x3f8}, + {d68020_cas2_16 , 0xffff, 0x0cfc, 0x000}, + {d68020_cas2_32 , 0xffff, 0x0efc, 0x000}, + {d68000_chk_16 , 0xf1c0, 0x4180, 0xbff}, + {d68020_chk_32 , 0xf1c0, 0x4100, 0xbff}, + {d68020_chk2_cmp2_8 , 0xffc0, 0x00c0, 0x27b}, + {d68020_chk2_cmp2_16 , 0xffc0, 0x02c0, 0x27b}, + {d68020_chk2_cmp2_32 , 0xffc0, 0x04c0, 0x27b}, + {d68040_cinv , 0xff20, 0xf400, 0x000}, + {d68000_clr_8 , 0xffc0, 0x4200, 0xbf8}, + {d68000_clr_16 , 0xffc0, 0x4240, 0xbf8}, + {d68000_clr_32 , 0xffc0, 0x4280, 0xbf8}, + {d68000_cmp_8 , 0xf1c0, 0xb000, 0xbff}, + {d68000_cmp_16 , 0xf1c0, 0xb040, 0xfff}, + {d68000_cmp_32 , 0xf1c0, 0xb080, 0xfff}, + {d68000_cmpa_16 , 0xf1c0, 0xb0c0, 0xfff}, + {d68000_cmpa_32 , 0xf1c0, 0xb1c0, 0xfff}, + {d68000_cmpi_8 , 0xffc0, 0x0c00, 0xbf8}, + {d68020_cmpi_pcdi_8 , 0xffff, 0x0c3a, 0x000}, + {d68020_cmpi_pcix_8 , 0xffff, 0x0c3b, 0x000}, + {d68000_cmpi_16 , 0xffc0, 0x0c40, 0xbf8}, + {d68020_cmpi_pcdi_16 , 0xffff, 0x0c7a, 0x000}, + {d68020_cmpi_pcix_16 , 0xffff, 0x0c7b, 0x000}, + {d68000_cmpi_32 , 0xffc0, 0x0c80, 0xbf8}, + {d68020_cmpi_pcdi_32 , 0xffff, 0x0cba, 0x000}, + {d68020_cmpi_pcix_32 , 0xffff, 0x0cbb, 0x000}, + {d68000_cmpm_8 , 0xf1f8, 0xb108, 0x000}, + {d68000_cmpm_16 , 0xf1f8, 0xb148, 0x000}, + {d68000_cmpm_32 , 0xf1f8, 0xb188, 0x000}, + {d68020_cpbcc_16 , 0xf1c0, 0xf080, 0x000}, + {d68020_cpbcc_32 , 0xf1c0, 0xf0c0, 0x000}, + {d68020_cpdbcc , 0xf1f8, 0xf048, 0x000}, + {d68020_cpgen , 0xf1c0, 0xf000, 0x000}, + {d68020_cprestore , 0xf1c0, 0xf140, 0x37f}, + {d68020_cpsave , 0xf1c0, 0xf100, 0x2f8}, + {d68020_cpscc , 0xf1c0, 0xf040, 0xbf8}, + {d68020_cptrapcc_0 , 0xf1ff, 0xf07c, 0x000}, + {d68020_cptrapcc_16 , 0xf1ff, 0xf07a, 0x000}, + {d68020_cptrapcc_32 , 0xf1ff, 0xf07b, 0x000}, + {d68040_cpush , 0xff20, 0xf420, 0x000}, + {d68000_dbcc , 0xf0f8, 0x50c8, 0x000}, + {d68000_dbra , 0xfff8, 0x51c8, 0x000}, + {d68000_divs , 0xf1c0, 0x81c0, 0xbff}, + {d68000_divu , 0xf1c0, 0x80c0, 0xbff}, + {d68020_divl , 0xffc0, 0x4c40, 0xbff}, + {d68000_eor_8 , 0xf1c0, 0xb100, 0xbf8}, + {d68000_eor_16 , 0xf1c0, 0xb140, 0xbf8}, + {d68000_eor_32 , 0xf1c0, 0xb180, 0xbf8}, + {d68000_eori_to_ccr , 0xffff, 0x0a3c, 0x000}, + {d68000_eori_to_sr , 0xffff, 0x0a7c, 0x000}, + {d68000_eori_8 , 0xffc0, 0x0a00, 0xbf8}, + {d68000_eori_16 , 0xffc0, 0x0a40, 0xbf8}, + {d68000_eori_32 , 0xffc0, 0x0a80, 0xbf8}, + {d68000_exg_dd , 0xf1f8, 0xc140, 0x000}, + {d68000_exg_aa , 0xf1f8, 0xc148, 0x000}, + {d68000_exg_da , 0xf1f8, 0xc188, 0x000}, + {d68020_extb_32 , 0xfff8, 0x49c0, 0x000}, + {d68000_ext_16 , 0xfff8, 0x4880, 0x000}, + {d68000_ext_32 , 0xfff8, 0x48c0, 0x000}, + {d68000_illegal , 0xffff, 0x4afc, 0x000}, + {d68000_jmp , 0xffc0, 0x4ec0, 0x27b}, + {d68000_jsr , 0xffc0, 0x4e80, 0x27b}, + {d68000_lea , 0xf1c0, 0x41c0, 0x27b}, + {d68000_link_16 , 0xfff8, 0x4e50, 0x000}, + {d68020_link_32 , 0xfff8, 0x4808, 0x000}, + {d68000_lsr_s_8 , 0xf1f8, 0xe008, 0x000}, + {d68000_lsr_s_16 , 0xf1f8, 0xe048, 0x000}, + {d68000_lsr_s_32 , 0xf1f8, 0xe088, 0x000}, + {d68000_lsr_r_8 , 0xf1f8, 0xe028, 0x000}, + {d68000_lsr_r_16 , 0xf1f8, 0xe068, 0x000}, + {d68000_lsr_r_32 , 0xf1f8, 0xe0a8, 0x000}, + {d68000_lsr_ea , 0xffc0, 0xe2c0, 0x3f8}, + {d68000_lsl_s_8 , 0xf1f8, 0xe108, 0x000}, + {d68000_lsl_s_16 , 0xf1f8, 0xe148, 0x000}, + {d68000_lsl_s_32 , 0xf1f8, 0xe188, 0x000}, + {d68000_lsl_r_8 , 0xf1f8, 0xe128, 0x000}, + {d68000_lsl_r_16 , 0xf1f8, 0xe168, 0x000}, + {d68000_lsl_r_32 , 0xf1f8, 0xe1a8, 0x000}, + {d68000_lsl_ea , 0xffc0, 0xe3c0, 0x3f8}, + {d68000_move_8 , 0xf000, 0x1000, 0xbff}, + {d68000_move_16 , 0xf000, 0x3000, 0xfff}, + {d68000_move_32 , 0xf000, 0x2000, 0xfff}, + {d68000_movea_16 , 0xf1c0, 0x3040, 0xfff}, + {d68000_movea_32 , 0xf1c0, 0x2040, 0xfff}, + {d68000_move_to_ccr , 0xffc0, 0x44c0, 0xbff}, + {d68010_move_fr_ccr , 0xffc0, 0x42c0, 0xbf8}, + {d68000_move_to_sr , 0xffc0, 0x46c0, 0xbff}, + {d68000_move_fr_sr , 0xffc0, 0x40c0, 0xbf8}, + {d68000_move_to_usp , 0xfff8, 0x4e60, 0x000}, + {d68000_move_fr_usp , 0xfff8, 0x4e68, 0x000}, + {d68010_movec , 0xfffe, 0x4e7a, 0x000}, + {d68000_movem_pd_16 , 0xfff8, 0x48a0, 0x000}, + {d68000_movem_pd_32 , 0xfff8, 0x48e0, 0x000}, + {d68000_movem_re_16 , 0xffc0, 0x4880, 0x2f8}, + {d68000_movem_re_32 , 0xffc0, 0x48c0, 0x2f8}, + {d68000_movem_er_16 , 0xffc0, 0x4c80, 0x37b}, + {d68000_movem_er_32 , 0xffc0, 0x4cc0, 0x37b}, + {d68000_movep_er_16 , 0xf1f8, 0x0108, 0x000}, + {d68000_movep_er_32 , 0xf1f8, 0x0148, 0x000}, + {d68000_movep_re_16 , 0xf1f8, 0x0188, 0x000}, + {d68000_movep_re_32 , 0xf1f8, 0x01c8, 0x000}, + {d68010_moves_8 , 0xffc0, 0x0e00, 0x3f8}, + {d68010_moves_16 , 0xffc0, 0x0e40, 0x3f8}, + {d68010_moves_32 , 0xffc0, 0x0e80, 0x3f8}, + {d68000_moveq , 0xf100, 0x7000, 0x000}, + {d68040_move16_pi_pi , 0xfff8, 0xf620, 0x000}, + {d68040_move16_pi_al , 0xfff8, 0xf600, 0x000}, + {d68040_move16_al_pi , 0xfff8, 0xf608, 0x000}, + {d68040_move16_ai_al , 0xfff8, 0xf610, 0x000}, + {d68040_move16_al_ai , 0xfff8, 0xf618, 0x000}, + {d68000_muls , 0xf1c0, 0xc1c0, 0xbff}, + {d68000_mulu , 0xf1c0, 0xc0c0, 0xbff}, + {d68020_mull , 0xffc0, 0x4c00, 0xbff}, + {d68000_nbcd , 0xffc0, 0x4800, 0xbf8}, + {d68000_neg_8 , 0xffc0, 0x4400, 0xbf8}, + {d68000_neg_16 , 0xffc0, 0x4440, 0xbf8}, + {d68000_neg_32 , 0xffc0, 0x4480, 0xbf8}, + {d68000_negx_8 , 0xffc0, 0x4000, 0xbf8}, + {d68000_negx_16 , 0xffc0, 0x4040, 0xbf8}, + {d68000_negx_32 , 0xffc0, 0x4080, 0xbf8}, + {d68000_nop , 0xffff, 0x4e71, 0x000}, + {d68000_not_8 , 0xffc0, 0x4600, 0xbf8}, + {d68000_not_16 , 0xffc0, 0x4640, 0xbf8}, + {d68000_not_32 , 0xffc0, 0x4680, 0xbf8}, + {d68000_or_er_8 , 0xf1c0, 0x8000, 0xbff}, + {d68000_or_er_16 , 0xf1c0, 0x8040, 0xbff}, + {d68000_or_er_32 , 0xf1c0, 0x8080, 0xbff}, + {d68000_or_re_8 , 0xf1c0, 0x8100, 0x3f8}, + {d68000_or_re_16 , 0xf1c0, 0x8140, 0x3f8}, + {d68000_or_re_32 , 0xf1c0, 0x8180, 0x3f8}, + {d68000_ori_to_ccr , 0xffff, 0x003c, 0x000}, + {d68000_ori_to_sr , 0xffff, 0x007c, 0x000}, + {d68000_ori_8 , 0xffc0, 0x0000, 0xbf8}, + {d68000_ori_16 , 0xffc0, 0x0040, 0xbf8}, + {d68000_ori_32 , 0xffc0, 0x0080, 0xbf8}, + {d68020_pack_rr , 0xf1f8, 0x8140, 0x000}, + {d68020_pack_mm , 0xf1f8, 0x8148, 0x000}, + {d68000_pea , 0xffc0, 0x4840, 0x27b}, + {d68000_reset , 0xffff, 0x4e70, 0x000}, + {d68000_ror_s_8 , 0xf1f8, 0xe018, 0x000}, + {d68000_ror_s_16 , 0xf1f8, 0xe058, 0x000}, + {d68000_ror_s_32 , 0xf1f8, 0xe098, 0x000}, + {d68000_ror_r_8 , 0xf1f8, 0xe038, 0x000}, + {d68000_ror_r_16 , 0xf1f8, 0xe078, 0x000}, + {d68000_ror_r_32 , 0xf1f8, 0xe0b8, 0x000}, + {d68000_ror_ea , 0xffc0, 0xe6c0, 0x3f8}, + {d68000_rol_s_8 , 0xf1f8, 0xe118, 0x000}, + {d68000_rol_s_16 , 0xf1f8, 0xe158, 0x000}, + {d68000_rol_s_32 , 0xf1f8, 0xe198, 0x000}, + {d68000_rol_r_8 , 0xf1f8, 0xe138, 0x000}, + {d68000_rol_r_16 , 0xf1f8, 0xe178, 0x000}, + {d68000_rol_r_32 , 0xf1f8, 0xe1b8, 0x000}, + {d68000_rol_ea , 0xffc0, 0xe7c0, 0x3f8}, + {d68000_roxr_s_8 , 0xf1f8, 0xe010, 0x000}, + {d68000_roxr_s_16 , 0xf1f8, 0xe050, 0x000}, + {d68000_roxr_s_32 , 0xf1f8, 0xe090, 0x000}, + {d68000_roxr_r_8 , 0xf1f8, 0xe030, 0x000}, + {d68000_roxr_r_16 , 0xf1f8, 0xe070, 0x000}, + {d68000_roxr_r_32 , 0xf1f8, 0xe0b0, 0x000}, + {d68000_roxr_ea , 0xffc0, 0xe4c0, 0x3f8}, + {d68000_roxl_s_8 , 0xf1f8, 0xe110, 0x000}, + {d68000_roxl_s_16 , 0xf1f8, 0xe150, 0x000}, + {d68000_roxl_s_32 , 0xf1f8, 0xe190, 0x000}, + {d68000_roxl_r_8 , 0xf1f8, 0xe130, 0x000}, + {d68000_roxl_r_16 , 0xf1f8, 0xe170, 0x000}, + {d68000_roxl_r_32 , 0xf1f8, 0xe1b0, 0x000}, + {d68000_roxl_ea , 0xffc0, 0xe5c0, 0x3f8}, + {d68010_rtd , 0xffff, 0x4e74, 0x000}, + {d68000_rte , 0xffff, 0x4e73, 0x000}, + {d68020_rtm , 0xfff0, 0x06c0, 0x000}, + {d68000_rtr , 0xffff, 0x4e77, 0x000}, + {d68000_rts , 0xffff, 0x4e75, 0x000}, + {d68000_sbcd_rr , 0xf1f8, 0x8100, 0x000}, + {d68000_sbcd_mm , 0xf1f8, 0x8108, 0x000}, + {d68000_scc , 0xf0c0, 0x50c0, 0xbf8}, + {d68000_stop , 0xffff, 0x4e72, 0x000}, + {d68000_sub_er_8 , 0xf1c0, 0x9000, 0xbff}, + {d68000_sub_er_16 , 0xf1c0, 0x9040, 0xfff}, + {d68000_sub_er_32 , 0xf1c0, 0x9080, 0xfff}, + {d68000_sub_re_8 , 0xf1c0, 0x9100, 0x3f8}, + {d68000_sub_re_16 , 0xf1c0, 0x9140, 0x3f8}, + {d68000_sub_re_32 , 0xf1c0, 0x9180, 0x3f8}, + {d68000_suba_16 , 0xf1c0, 0x90c0, 0xfff}, + {d68000_suba_32 , 0xf1c0, 0x91c0, 0xfff}, + {d68000_subi_8 , 0xffc0, 0x0400, 0xbf8}, + {d68000_subi_16 , 0xffc0, 0x0440, 0xbf8}, + {d68000_subi_32 , 0xffc0, 0x0480, 0xbf8}, + {d68000_subq_8 , 0xf1c0, 0x5100, 0xbf8}, + {d68000_subq_16 , 0xf1c0, 0x5140, 0xff8}, + {d68000_subq_32 , 0xf1c0, 0x5180, 0xff8}, + {d68000_subx_rr_8 , 0xf1f8, 0x9100, 0x000}, + {d68000_subx_rr_16 , 0xf1f8, 0x9140, 0x000}, + {d68000_subx_rr_32 , 0xf1f8, 0x9180, 0x000}, + {d68000_subx_mm_8 , 0xf1f8, 0x9108, 0x000}, + {d68000_subx_mm_16 , 0xf1f8, 0x9148, 0x000}, + {d68000_subx_mm_32 , 0xf1f8, 0x9188, 0x000}, + {d68000_swap , 0xfff8, 0x4840, 0x000}, + {d68000_tas , 0xffc0, 0x4ac0, 0xbf8}, + {d68000_trap , 0xfff0, 0x4e40, 0x000}, + {d68020_trapcc_0 , 0xf0ff, 0x50fc, 0x000}, + {d68020_trapcc_16 , 0xf0ff, 0x50fa, 0x000}, + {d68020_trapcc_32 , 0xf0ff, 0x50fb, 0x000}, + {d68000_trapv , 0xffff, 0x4e76, 0x000}, + {d68000_tst_8 , 0xffc0, 0x4a00, 0xbf8}, + {d68020_tst_pcdi_8 , 0xffff, 0x4a3a, 0x000}, + {d68020_tst_pcix_8 , 0xffff, 0x4a3b, 0x000}, + {d68020_tst_i_8 , 0xffff, 0x4a3c, 0x000}, + {d68000_tst_16 , 0xffc0, 0x4a40, 0xbf8}, + {d68020_tst_a_16 , 0xfff8, 0x4a48, 0x000}, + {d68020_tst_pcdi_16 , 0xffff, 0x4a7a, 0x000}, + {d68020_tst_pcix_16 , 0xffff, 0x4a7b, 0x000}, + {d68020_tst_i_16 , 0xffff, 0x4a7c, 0x000}, + {d68000_tst_32 , 0xffc0, 0x4a80, 0xbf8}, + {d68020_tst_a_32 , 0xfff8, 0x4a88, 0x000}, + {d68020_tst_pcdi_32 , 0xffff, 0x4aba, 0x000}, + {d68020_tst_pcix_32 , 0xffff, 0x4abb, 0x000}, + {d68020_tst_i_32 , 0xffff, 0x4abc, 0x000}, + {d68000_unlk , 0xfff8, 0x4e58, 0x000}, + {d68020_unpk_rr , 0xf1f8, 0x8180, 0x000}, + {d68020_unpk_mm , 0xf1f8, 0x8188, 0x000}, + {0, 0, 0, 0} +}; + +/* Check if opcode is using a valid ea mode */ +static int valid_ea(uint opcode, uint mask) +{ + if(mask == 0) + return 1; + + switch(opcode & 0x3f) + { + case 0x00: case 0x01: case 0x02: case 0x03: + case 0x04: case 0x05: case 0x06: case 0x07: + return (mask & 0x800) != 0; + case 0x08: case 0x09: case 0x0a: case 0x0b: + case 0x0c: case 0x0d: case 0x0e: case 0x0f: + return (mask & 0x400) != 0; + case 0x10: case 0x11: case 0x12: case 0x13: + case 0x14: case 0x15: case 0x16: case 0x17: + return (mask & 0x200) != 0; + case 0x18: case 0x19: case 0x1a: case 0x1b: + case 0x1c: case 0x1d: case 0x1e: case 0x1f: + return (mask & 0x100) != 0; + case 0x20: case 0x21: case 0x22: case 0x23: + case 0x24: case 0x25: case 0x26: case 0x27: + return (mask & 0x080) != 0; + case 0x28: case 0x29: case 0x2a: case 0x2b: + case 0x2c: case 0x2d: case 0x2e: case 0x2f: + return (mask & 0x040) != 0; + case 0x30: case 0x31: case 0x32: case 0x33: + case 0x34: case 0x35: case 0x36: case 0x37: + return (mask & 0x020) != 0; + case 0x38: + return (mask & 0x010) != 0; + case 0x39: + return (mask & 0x008) != 0; + case 0x3a: + return (mask & 0x002) != 0; + case 0x3b: + return (mask & 0x001) != 0; + case 0x3c: + return (mask & 0x004) != 0; + } + return 0; + +} + +/* Used by qsort */ +static int CLIB_DECL compare_nof_true_bits(const void *aptr, const void *bptr) +{ + uint a = ((opcode_struct*)aptr)->mask; + uint b = ((opcode_struct*)bptr)->mask; + + a = ((a & 0xAAAA) >> 1) + (a & 0x5555); + a = ((a & 0xCCCC) >> 2) + (a & 0x3333); + a = ((a & 0xF0F0) >> 4) + (a & 0x0F0F); + a = ((a & 0xFF00) >> 8) + (a & 0x00FF); + + b = ((b & 0xAAAA) >> 1) + (b & 0x5555); + b = ((b & 0xCCCC) >> 2) + (b & 0x3333); + b = ((b & 0xF0F0) >> 4) + (b & 0x0F0F); + b = ((b & 0xFF00) >> 8) + (b & 0x00FF); + + return b - a; /* reversed to get greatest to least sorting */ +} + +/* build the opcode handler jump table */ +static void build_opcode_table(void) +{ + uint i; + uint opcode; + opcode_struct* ostruct; + uint opcode_info_length = 0; + + (void)copyright_notice; + + for(ostruct = g_opcode_info;ostruct->opcode_handler != 0;ostruct++) + opcode_info_length++; + + qsort((void *)g_opcode_info, opcode_info_length, sizeof(g_opcode_info[0]), compare_nof_true_bits); + + for(i=0;i<0x10000;i++) + { + g_instruction_table[i] = d68000_illegal; /* default to illegal */ + opcode = i; + /* search through opcode info for a match */ + for(ostruct = g_opcode_info;ostruct->opcode_handler != 0;ostruct++) + { + /* match opcode mask and allowed ea modes */ + if((opcode & ostruct->mask) == ostruct->match) + { + /* Handle destination ea for move instructions */ + if((ostruct->opcode_handler == d68000_move_8 || + ostruct->opcode_handler == d68000_move_16 || + ostruct->opcode_handler == d68000_move_32) && + !valid_ea(((opcode>>9)&7) | ((opcode>>3)&0x38), 0xbf8)) + continue; + if(valid_ea(opcode, ostruct->ea_mask)) + { + g_instruction_table[i] = ostruct->opcode_handler; + break; + } + } + } + } +} + +int d68k_is_valid_instruction(int instruction) +{ + return g_instruction_table[instruction&0xffff] != d68000_illegal; +} + +/* ======================================================================== */ +/* ============================== END OF FILE ============================= */ +/* ======================================================================== */ diff --git a/x68k/d68k.h b/x68k/d68k.h new file mode 100644 index 0000000..e059af2 --- /dev/null +++ b/x68k/d68k.h @@ -0,0 +1,72 @@ +#ifndef D68K__HEADER +#define D68K__HEADER + +/* ======================================================================== */ +/* ========================= LICENSING & COPYRIGHT ======================== */ +/* ======================================================================== */ +/* + * DEBABELIZER + * Version 2.3 + * + * A portable Motorola M680x0 disassembler. + * Copyright 1999 Karl Stenerud. All rights reserved. + * + * This code is freeware and may be freely used as long as this copyright + * notice remains unaltered in the source code and any binary files + * containing this code in compiled form. + * + * The latest version of this code can be obtained at: + * (home page pending) + */ + + +/* ======================================================================== */ +/* ============================= INSTRUCTIONS ============================= */ +/* ======================================================================== */ +/* 1. edit d68kconf.h and modify according to your needs. + * 2. Implement in your host program the functions defined in + * "FUNCTIONS CALLED BY THE DISASSEMBLER" located later in this file. + * 3. Your first call to m68k_disassemble will initialize the disassembler. + */ + + +/* ======================================================================== */ +/* ================= FUNCTIONS CALLED BY THE DISASSEMBLER ================= */ +/* ======================================================================== */ + +/* You will have to implement these functions */ + +/* read memory */ +int m68k_read_memory_32 (int address); +int m68k_read_memory_16 (int address); +int m68k_read_memory_8 (int address); + + + +/* ======================================================================== */ +/* ====================== FUNCTIONS TO ACCESS THE CPU ===================== */ +/* ======================================================================== */ + +/* Disassemble 1 instructionat pc. Stores disassembly in str_buff and returns + * the size of the instruction in bytes. + */ +int m68k_disassemble(char* str_buff, int pc); + +/* Disassemble 1 instruction at pc. Return disassembly as string pointer */ +char* m68k_disassemble_quick(int pc); + + +/* ======================================================================== */ +/* ============================= CONFIGURATION ============================ */ +/* ======================================================================== */ + +/* Import the configuration for this build */ +#include "d68kconf.h" + + + +/* ======================================================================== */ +/* ============================== END OF FILE ============================= */ +/* ======================================================================== */ + +#endif /* D68K__HEADER */ diff --git a/x68k/d68kconf.h b/x68k/d68kconf.h new file mode 100644 index 0000000..c24529b --- /dev/null +++ b/x68k/d68kconf.h @@ -0,0 +1,36 @@ +#ifndef D68KCONF__HEADER +#define D68KCONF__HEADER + +/* ======================================================================== */ +/* ============================= CONFIGURATION ============================ */ +/* ======================================================================== */ + +/* Set to 1 if you are building MAME */ +#define M68000_BUILDING_MAME 1 + + + +/* ======================================================================== */ +/* ============================== MAME STUFF ============================== */ +/* ======================================================================== */ + +#if M68000_BUILDING_MAME + +#include "memory.h" +#define m68k_read_memory_8(address) Memory_ReadB(address) +#define m68k_read_memory_16(address) Memory_ReadW(address) +#define m68k_read_memory_32(address) Memory_ReadD(address) + + +#define Dasm68000(buff, pc) m68000_disassemble(buff, pc) + + +#endif /* M68000_BUILDING_MAME */ + + + +/* ======================================================================== */ +/* ============================== END OF FILE ============================= */ +/* ======================================================================== */ + +#endif /* D68KCONF__HEADER */ diff --git a/x68k/disk_d88.c b/x68k/disk_d88.c new file mode 100644 index 0000000..f7777f2 --- /dev/null +++ b/x68k/disk_d88.c @@ -0,0 +1,318 @@ +#include "common.h" +#include "fileio.h" +#include "fdc.h" +#include "fdd.h" +#include "disk_d88.h" + + +// セクター部 (16 Bytes) +typedef struct { + BYTE c; + BYTE h; + BYTE r; + BYTE n; + WORD sectors; // Sector Count + BYTE mfm_flg; // sides + BYTE del_flg; // DELETED DATA + BYTE stat; // STATUS (FDC ret) + BYTE reserved2[5]; // Reserved + WORD size; // Sector Size +// byte data[0]; // Sector Data +} D88_SECTOR; + +typedef struct D88_SECTINFO { + struct D88_SECTINFO* next; + D88_SECTOR sect; +} D88_SECTINFO; + +static D88_HEADER D88Head[4]; +static D88_SECTINFO* D88Trks[4][164]; +static char D88File[4][MAX_PATH]; +static D88_SECTINFO* D88Cur[4] = {0, 0, 0, 0}; +static D88_SECTINFO* D88Top[4] = {0, 0, 0, 0}; + +void D88_Init(void) +{ + int drv, trk; + + for (drv=0; drv<4; drv++) { + for (trk=0; trk<164; trk++) D88Trks[drv][trk] = 0; + ZeroMemory(&D88Head[drv], sizeof(D88_HEADER)); + ZeroMemory(D88File[drv], MAX_PATH); + } +} + + +void D88_Cleanup(void) +{ + int drv; + for (drv=0; drv<4; drv++) D88_Eject(drv); +} + + +int D88_SetFD(int drv, char* filename) +{ + int trk, sct; + FILEH fp; + D88_SECTOR d88s; + + strncpy(D88File[drv], filename, MAX_PATH); + D88File[drv][MAX_PATH-1] = 0; + + fp = File_Open(D88File[drv]); + if ( !fp ) { + ZeroMemory(D88File[drv], MAX_PATH); + return FALSE; + } + File_Seek(fp, 0, FSEEK_SET); + if ( File_Read(fp, &D88Head[drv], sizeof(D88_HEADER))!=sizeof(D88_HEADER) ) goto d88_set_error; + + if ( D88Head[drv].protect ) { + FDD_SetReadOnly(drv); + } + + for (trk=0; trk<164; trk++) { + long ptr = D88Head[drv].trackp[trk]; + D88_SECTINFO *si, *oldsi = NULL; + if ( (ptr>=(long)sizeof(D88_HEADER))&&(ptrnext = si; + } else { + D88Trks[drv][trk] = si; + } + memcpy(&si->sect, &d88s, sizeof(D88_SECTOR)); + if ( File_Read(fp, ((unsigned char*)si)+sizeof(D88_SECTINFO), d88s.size)!=d88s.size ) goto d88_set_error; + si->next = 0; + if (oldsi) oldsi = si; + } + } + } + File_Close(fp); + return TRUE; + +d88_set_error: + File_Close(fp); + FDD_SetReadOnly(drv); + return FALSE; +} + + +int D88_Eject(int drv) +{ + int trk, pos; + FILEH fp; + + if ( !D88File[drv][0] ) return FALSE; + + if ( !FDD_IsReadOnly(drv) ) { + fp = File_Open(D88File[drv]); + if ( fp ) { + pos = sizeof(D88_HEADER); + for (trk=0; trk<164; trk++) { + D88_SECTINFO *si = D88Trks[drv][trk]; + if ( si ) + D88Head[drv].trackp[trk] = pos; + else + D88Head[drv].trackp[trk] = 0; + while ( si ) { + pos += (sizeof(D88_SECTOR)+si->sect.size); + si = si->next; + } + } + D88Head[drv].fd_size = pos; + File_Write(fp, &D88Head[drv], sizeof(D88_HEADER)); + for (trk=0; trk<164; trk++) { + D88_SECTINFO *si = D88Trks[drv][trk]; + while ( si ) { + File_Write(fp, &si->sect, sizeof(D88_SECTOR)+si->sect.size); + si = si->next; + } + D88Trks[drv][trk] = 0; + } + File_Close(fp); + } + } + + for (trk=0; trk<164; trk++) { + D88_SECTINFO *si = D88Trks[drv][trk]; + while ( si ) { + D88_SECTINFO *nextsi = si->next; + free(si); + si = nextsi; + } + D88Trks[drv][trk] = 0; + } + ZeroMemory(&D88Head[drv], sizeof(D88_HEADER)); + ZeroMemory(D88File[drv], MAX_PATH); + + return TRUE; +} + + +int D88_Seek(int drv, int trk, FDCID* id) +{ + if ( (drv<0)||(drv>3) ) return FALSE; + if ( (trk<0)||(trk>163) ) return FALSE; + if ( !D88Trks[drv][trk] ) return FALSE; + if ( D88Top[drv]!=D88Trks[drv][trk] ) { + D88Cur[drv] = D88Top[drv] = D88Trks[drv][trk]; + } + id->c = D88Cur[drv]->sect.c; + id->h = D88Cur[drv]->sect.h; + id->r = D88Cur[drv]->sect.r; + id->n = D88Cur[drv]->sect.n; + return TRUE; +} + + +int D88_GetCurrentID(int drv, FDCID* id) +{ + if ( !D88Cur[drv] ) return FALSE; + id->c = D88Cur[drv]->sect.c; + id->h = D88Cur[drv]->sect.h; + id->r = D88Cur[drv]->sect.r; + id->n = D88Cur[drv]->sect.n; + return TRUE; +} + + +int D88_ReadID(int drv, FDCID* id) +{ + D88_SECTINFO *si = D88Cur[drv]; + int ret = 1; + if ( !si ) return FALSE; + id->c = si->sect.c; + id->h = si->sect.h; + id->r = si->sect.r; + id->n = si->sect.n; + if ( si->next ) + D88Cur[drv] = si->next; + else + D88Cur[drv] = D88Top[drv]; + if ( si->sect.del_flg&0x10 ) ret |= 2; + if ( si->sect.stat==0xa0 ) ret |= 4; + if ( si->sect.stat==0xb0 ) ret |= 8; + if ( si->sect.stat==0xf0 ) ret |= 16; + return ret; +} + + +int D88_WriteID(int drv, int trk, unsigned char* buf, int num) +{ + int i; + unsigned char c = buf[num<<2]; + if ( (drv<0)||(drv>3) ) return FALSE; + if ( (trk<0)||(trk>163) ) return FALSE; + if ( D88Trks[drv][trk] ) { + D88_SECTINFO *si = D88Trks[drv][trk]; + while ( si ) { + D88_SECTINFO *nextsi = si->next; + free(si); + si = nextsi; + } + D88Trks[drv][trk] = 0; + } + for (i=0; inext = si; + } else { + D88Trks[drv][trk] = si; + } + ZeroMemory(&si->sect, sizeof(D88_SECTOR)); + si->sect.c = buf[0]; + si->sect.h = buf[1]; + si->sect.r = buf[2]; + si->sect.n = buf[3]; + si->sect.sectors = num; + si->sect.size = size; + memset(((unsigned char*)si)+sizeof(D88_SECTINFO), c, size); + si->next = 0; + oldsi = si; + } + D88Cur[drv] = D88Top[drv] = D88Trks[drv][trk]; + return TRUE; + +d88_writeid_error: + return FALSE; +} + + +int D88_Read(int drv, FDCID* id, unsigned char* buf) +{ + D88_SECTINFO *si = D88Top[drv]; + if ( !si ) return FALSE; + do { + if ( (id->c==si->sect.c)&&(id->h==si->sect.h)&&(id->r==si->sect.r)&&(id->n==si->sect.n) ) { + int len = 128<n; + int ret = 1; + memcpy(buf, ((unsigned char*)si)+sizeof(D88_SECTINFO), len); + if ( si->next ) + D88Cur[drv] = si->next; + else + D88Cur[drv] = D88Top[drv]; + if ( si->sect.del_flg&0x10 ) ret |= 2; + if ( si->sect.stat==0xa0 ) ret |= 4; + if ( si->sect.stat==0xb0 ) ret |= 8; + if ( si->sect.stat==0xf0 ) ret |= 16; + return ret; + } + si = si->next; + } while ( si ); + D88Cur[drv] = D88Top[drv]; + return FALSE; +} + + +int D88_ReadDiag(int drv, FDCID* id, FDCID* retid, unsigned char* buf) +{ + D88_SECTINFO *si = D88Cur[drv]; + int size = 128<n; + int ret = 1; + if ( !si ) return FALSE; + memcpy(buf, ((unsigned char*)si)+sizeof(D88_SECTINFO), size); + if ( si->next ) + D88Cur[drv] = si->next; + else + D88Cur[drv] = D88Top[drv]; + retid->c = si->sect.c; + retid->r = si->sect.r; + retid->h = si->sect.h; + retid->n = si->sect.n; + if ( si->sect.del_flg&0x10 ) ret |= 2; + if ( si->sect.stat==0xa0 ) ret |= 4; + if ( si->sect.stat==0xb0 ) ret |= 8; + if ( si->sect.stat==0xf0 ) ret |= 16; + return ret; +} + + +int D88_Write(int drv, FDCID* id, unsigned char* buf, int del) +{ + D88_SECTINFO *si = D88Top[drv]; + if ( !si ) return FALSE; + if ( FDD_IsReadOnly(drv) ) return FALSE; + do { + if ( (id->c==si->sect.c)&&(id->h==si->sect.h)&&(id->r==si->sect.r)&&(id->n==si->sect.n) ) { + int len = 128<n; + memcpy(((unsigned char*)si)+sizeof(D88_SECTINFO), buf, len); + si->sect.del_flg = ((del)?0x10:0x00); + if ( si->next ) + D88Cur[drv] = si->next; + else + D88Cur[drv] = D88Top[drv]; + return TRUE; + } + si = si->next; + } while ( si ); + D88Cur[drv] = D88Top[drv]; + return FALSE; +} diff --git a/x68k/disk_d88.h b/x68k/disk_d88.h new file mode 100644 index 0000000..35ff403 --- /dev/null +++ b/x68k/disk_d88.h @@ -0,0 +1,25 @@ +#ifndef _winx68k_d88 +#define _winx68k_d88 + +typedef struct { // Header Part (size:2B0h) + BYTE fd_name[17]; // Disk Name + BYTE reserved1[9]; // Reserved + BYTE protect; // Write Protect bit:4 + BYTE fd_type; // Disk Format + long fd_size; // Disk Size + long trackp[164]; // Track_pointer +} D88_HEADER; + +void D88_Init(void); +void D88_Cleanup(void); +int D88_SetFD(int drive, char* filename); +int D88_Eject(int drive); +int D88_Seek(int drv, int trk, FDCID* id); +int D88_ReadID(int drv, FDCID* id); +int D88_WriteID(int drv, int trk, unsigned char* buf, int num); +int D88_Read(int drv, FDCID* id, unsigned char* buf); +int D88_ReadDiag(int drv, FDCID* id, FDCID* retid, unsigned char* buf); +int D88_Write(int drv, FDCID* id, unsigned char* buf, int del); +int D88_GetCurrentID(int drv, FDCID* id); + +#endif diff --git a/x68k/disk_dim.c b/x68k/disk_dim.c new file mode 100644 index 0000000..12f26cc --- /dev/null +++ b/x68k/disk_dim.c @@ -0,0 +1,353 @@ +#include "common.h" +#include "fileio.h" +#include "fdc.h" +#include "fdd.h" +#include "disk_dim.h" + +// DIM Image Header +typedef struct { + BYTE type; + BYTE trkflag[170]; + BYTE headerinfo[15]; + BYTE date[4]; + BYTE time[4]; + BYTE comment[61]; + BYTE overtrack; +} DIM_HEADER; + +// DIM Disk Type +enum { + DIM_2HD = 0, + DIM_2HS, + DIM_2HC, + DIM_2HDE, + DIM_2HQ = 9, +}; + +static const int SctLength[10] = { + 1024*8, 1024*9, 512*15, 1024*9, 0, 0, 0, 0, 0, 512*18 +}; + +static char DIMFile[4][MAX_PATH]; +static int DIMCur[4] = {0, 0, 0, 0}; +static int DIMTrk[4] = {0, 0, 0, 0}; +static unsigned char* DIMImg[4] = {0, 0, 0, 0}; + +void DIM_Init(void) +{ + int drv; + + for (drv=0; drv<4; drv++) { + DIMCur[drv] = 0; + DIMImg[drv] = 0; + ZeroMemory(DIMFile[drv], MAX_PATH); + } +} + + +void DIM_Cleanup(void) +{ + int drv; + for (drv=0; drv<4; drv++) DIM_Eject(drv); +} + + +int DIM_SetFD(int drv, char* filename) +{ + FILEH fp; + DIM_HEADER* dh; + unsigned int i, len; + unsigned char* p; + + strncpy(DIMFile[drv], filename, MAX_PATH); + DIMFile[drv][MAX_PATH-1] = 0; + + DIMImg[drv] = (unsigned char*)malloc(1024*9*170+sizeof(DIM_HEADER)); // Maximum size + if ( !DIMImg[drv] ) return FALSE; + memset(DIMImg[drv], 0xe5, 1024*9*170+sizeof(DIM_HEADER)); + fp = File_Open(DIMFile[drv]); + if ( !fp ) { + ZeroMemory(DIMFile[drv], MAX_PATH); + FDD_SetReadOnly(drv); + return FALSE; + } + + File_Seek(fp, 0, FSEEK_SET); + if ( File_Read(fp, DIMImg[drv], sizeof(DIM_HEADER))!=sizeof(DIM_HEADER) ) goto dim_set_error; + dh = (DIM_HEADER*)DIMImg[drv]; + if ( dh->type>9 ) goto dim_set_error; + len = SctLength[dh->type]; + if ( !len ) goto dim_set_error; + p = DIMImg[drv]+sizeof(DIM_HEADER); + for (i=0; i<170; i++) { + if ( dh->trkflag[i] ) { + if ( File_Read(fp, p, len)!=len ) goto dim_set_error; + } + p += len; + } + File_Close(fp); + if ( !dh->overtrack ) memset(dh->trkflag, 1, 170); + return TRUE; + +dim_set_error: + File_Close(fp); + FDD_SetReadOnly(drv); + return FALSE; +} + + +int DIM_Eject(int drv) +{ + FILEH fp; + DIM_HEADER* dh; + unsigned int i, len; + unsigned char* p; + + if ( !DIMImg[drv] ) { + ZeroMemory(DIMFile[drv], MAX_PATH); + return FALSE; + } + dh = (DIM_HEADER*)DIMImg[drv]; + len = SctLength[dh->type]; + p = DIMImg[drv]+sizeof(DIM_HEADER); + if ( !FDD_IsReadOnly(drv) ) { + fp = File_Open(DIMFile[drv]); + if ( !fp ) goto dim_eject_error; + File_Seek(fp, 0, FSEEK_SET); + if ( File_Write(fp, DIMImg[drv], sizeof(DIM_HEADER))!=sizeof(DIM_HEADER) ) goto dim_eject_error; + for (i=0; i<170; i++) { + if ( dh->trkflag[i] ) { + if ( File_Write(fp, p, len)!=len ) goto dim_eject_error; + } + p += len; + } + File_Close(fp); + } + free(DIMImg[drv]); + DIMImg[drv] = 0; + ZeroMemory(DIMFile[drv], MAX_PATH); + return TRUE; + +dim_eject_error: + free(DIMImg[drv]); + DIMImg[drv] = 0; + ZeroMemory(DIMFile[drv], MAX_PATH); + return FALSE; +} + + +static void SetID(int drv, FDCID* id, int c, int h, int r) +{ + int type = DIMImg[drv][0]; + switch (type) { + case DIM_2HD: // 1024byte/sct, 8sct/trk + id->n = 3; break; + case DIM_2HS: // 1024byte/sct, 9sct/trk + if ( (c)||(h)||(r!=1) ) r += 9; + id->n = 3; break; + case DIM_2HDE: + if ( (c)||(h)||(r!=1) ) h += 0x80; + id->n = 3; break; + case DIM_2HC: // 512byte/sct, 15sct/trk + case DIM_2HQ: // 512byte/sct, 18sct/trk + id->n = 2; break; + } + id->c = c; + id->h = h; + id->r = r; +} + + +static int IncTrk(int drv, int r) +{ + int type = DIMImg[drv][0]; + switch (type) { + case DIM_2HD: // 1024byte/sct, 8sct/trk + r = (r+1)&7; + break; + case DIM_2HS: // 1024byte/sct, 9sct/trk + if ( r>8 ) r -= 9; // 9SCDRV用 + case DIM_2HDE: + r = (r+1)%9; + break; + case DIM_2HC: // 512byte/sct, 15sct/trk + r = (r+1)%15; + break; + case DIM_2HQ: // 512byte/sct, 18sct/trk + r = (r+1)%18; + break; + } + return r; +} + + +static int GetPos(int drv, FDCID* id) +{ + int ret, c = id->c, h = id->h, r = id->r, n = id->n; + int type = DIMImg[drv][0]; + switch (type) { + case DIM_2HD: // 1024byte/sct, 8sct/trk + if ( (c<0)||(c>84)||(h<0)||(h>1)||(r<1)||(r>8)||(n!=3) ) return 0; + ret = SctLength[type]*(c*2+h)+((r-1)<<10); + ret += sizeof(DIM_HEADER); + break; + case DIM_2HS: // 1024byte/sct, 9sct/trk + if ( r>9 ) r -= 9; // 9SCDRV用 + if ( (c<0)||(c>84)||(h<0)||(h>1)||(r<1)||(r>9)||(n!=3) ) return 0; + ret = SctLength[type]*(c*2+h)+((r-1)<<10); + ret += sizeof(DIM_HEADER); + break; + case DIM_2HDE: + h &= 1; // 9SCDRV用 + if ( (c<0)||(c>84)||(h<0)||(h>1)||(r<1)||(r>9)||(n!=3) ) return 0; + ret = SctLength[type]*(c*2+h)+((r-1)<<10); + ret += sizeof(DIM_HEADER); + break; + case DIM_2HC: // 512byte/sct, 15sct/trk + if ( (c<0)||(c>84)||(h<0)||(h>1)||(r<1)||(r>15)||(n!=2) ) return 0; + ret = SctLength[type]*(c*2+h)+((r-1)<<9); + ret += sizeof(DIM_HEADER); + break; + case DIM_2HQ: // 512byte/sct, 18sct/trk + if ( (c<0)||(c>84)||(h<0)||(h>1)||(r<1)||(r>18)||(n!=2) ) return 0; + ret = SctLength[type]*(c*2+h)+((r-1)<<9); + ret += sizeof(DIM_HEADER); + break; + default: + ret = 0; + break; + } + return ret; +} + + +static int CheckTrack(int drv, int trk) +{ + DIM_HEADER* dh = (DIM_HEADER*)DIMImg[drv]; + switch (dh->type) { + case DIM_2HD: // 1024byte/sct, 8sct/trk + if ( ((trk>153)&&(!dh->overtrack))||(!dh->trkflag[trk]) ) return 0; + break; + case DIM_2HS: // 1024byte/sct, 9sct/trk + if ( ((trk>159)&&(!dh->overtrack))||(!dh->trkflag[trk]) ) return 0; + break; + case DIM_2HDE: + if ( ((trk>159)&&(!dh->overtrack))||(!dh->trkflag[trk]) ) return 0; + break; + case DIM_2HC: // 512byte/sct, 15sct/trk + if ( ((trk>159)&&(!dh->overtrack))||(!dh->trkflag[trk]) ) return 0; + break; + case DIM_2HQ: // 512byte/sct, 18sct/trk + if ( ((trk>159)&&(!dh->overtrack))||(!dh->trkflag[trk]) ) return 0; + break; + default: + return FALSE; + } + return TRUE; +} + + +int DIM_Seek(int drv, int trk, FDCID* id) +{ + if ( (drv<0)||(drv>3) ) return FALSE; + if ( (trk<0)||(trk>169) ) return FALSE; + if ( !DIMImg[drv] ) return FALSE; + if ( DIMTrk[drv]!=trk ) DIMCur[drv] = 0; + SetID(drv, id, trk>>1, trk&1, DIMCur[drv]+1); + DIMTrk[drv] = trk; + return TRUE; +} + + +int DIM_GetCurrentID(int drv, FDCID* id) +{ + if ( (drv<0)||(drv>3) ) return FALSE; + if ( (DIMTrk[drv]<0)||(DIMTrk[drv]>169) ) return FALSE; + if ( !DIMImg[drv] ) return FALSE; + if ( !CheckTrack(drv, DIMTrk[drv]) ) return FALSE; + SetID(drv, id, DIMTrk[drv]>>1,DIMTrk[drv]&1, DIMCur[drv]+1); + return TRUE; +} + + +int DIM_ReadID(int drv, FDCID* id) +{ + if ( (drv<0)||(drv>3) ) return FALSE; + if ( (DIMTrk[drv]<0)||(DIMTrk[drv]>169) ) return FALSE; + if ( !DIMImg[drv] ) return FALSE; + if ( !CheckTrack(drv, DIMTrk[drv]) ) return FALSE; + SetID(drv, id, DIMTrk[drv]>>1,DIMTrk[drv]&1, DIMCur[drv]+1); + DIMCur[drv] = IncTrk(drv, DIMCur[drv]); + return TRUE; +} + + +int DIM_WriteID(int drv, int trk, unsigned char* buf, int num) +{ +#if 0 + int i; + unsigned char c = buf[num<<2]; + if ( (drv<0)||(drv>3) ) return FALSE; + if ( (trk<0)||(trk>169) ) return FALSE; + if ( !DIMImg[drv] ) return FALSE; + if ( num!=8 ) return FALSE; + for (i=0; i<8; i++, buf+=4) { + if ( (((buf[0]<<1)+buf[1])!=trk)||(buf[2]<1)||(buf[2]>8)||(buf[3]!=3) ) return FALSE; + } + DIMTrk[drv] = trk; + return TRUE; +#else + (void)drv; + (void)trk; + (void)buf; + (void)num; + return FALSE; +#endif +} + + +int DIM_Read(int drv, FDCID* id, unsigned char* buf) +{ + int pos; + if ( (drv<0)||(drv>3) ) return FALSE; + if ( !DIMImg[drv] ) return FALSE; + if ( (((id->c<<1)+(id->h&1))!=DIMTrk[drv]) ) return FALSE; + if ( !CheckTrack(drv, (id->c<<1)+(id->h&1)) ) return FALSE; + pos = GetPos(drv, id); + if ( !pos ) return FALSE; + memcpy(buf, DIMImg[drv]+pos, (id->n==2)?512:1024); + DIMCur[drv] = IncTrk(drv, id->r-1); + return TRUE; +} + + +int DIM_ReadDiag(int drv, FDCID* id, FDCID* retid, unsigned char* buf) +{ + int pos; + (void)id; + if ( (drv<0)||(drv>3) ) return FALSE; + if ( !DIMImg[drv] ) return FALSE; + if ( !CheckTrack(drv, DIMTrk[drv]) ) return FALSE; + SetID(drv, retid, DIMTrk[drv]>>1, DIMTrk[drv]&1, DIMCur[drv]+1); + pos = GetPos(drv, retid); + if ( !pos ) return FALSE; + memcpy(buf, DIMImg[drv]+pos, (retid->n==2)?512:1024); + DIMCur[drv] = IncTrk(drv, DIMCur[drv]); + return TRUE; +} + + +int DIM_Write(int drv, FDCID* id, unsigned char* buf, int del) +{ + int pos; + (void)del; + if ( (drv<0)||(drv>3) ) return FALSE; + if ( !DIMImg[drv] ) return FALSE; + if ( (((id->c<<1)+(id->h&1))!=DIMTrk[drv]) ) return FALSE; + if ( !CheckTrack(drv, (id->c<<1)+(id->h&1)) ) return FALSE; + pos = GetPos(drv, id); + if ( !pos ) return FALSE; + memcpy(DIMImg[drv]+pos, buf, (id->n==2)?512:1024); + DIMCur[drv] = IncTrk(drv, id->r-1); + return TRUE; +} diff --git a/x68k/disk_dim.h b/x68k/disk_dim.h new file mode 100644 index 0000000..bf0314a --- /dev/null +++ b/x68k/disk_dim.h @@ -0,0 +1,16 @@ +#ifndef _winx68k_dim +#define _winx68k_dim + +void DIM_Init(void); +void DIM_Cleanup(void); +int DIM_SetFD(int drive, char* filename); +int DIM_Eject(int drive); +int DIM_Seek(int drv, int trk, FDCID* id); +int DIM_ReadID(int drv, FDCID* id); +int DIM_WriteID(int drv, int trk, unsigned char* buf, int num); +int DIM_Read(int drv, FDCID* id, unsigned char* buf); +int DIM_ReadDiag(int drv, FDCID* id, FDCID* retid, unsigned char* buf); +int DIM_Write(int drv, FDCID* id, unsigned char* buf, int del); +int DIM_GetCurrentID(int drv, FDCID* id); + +#endif diff --git a/x68k/disk_xdf.c b/x68k/disk_xdf.c new file mode 100644 index 0000000..42ab659 --- /dev/null +++ b/x68k/disk_xdf.c @@ -0,0 +1,190 @@ +#include "common.h" +#include "fileio.h" +#include "fdc.h" +#include "fdd.h" +#include "disk_xdf.h" + +static char XDFFile[4][MAX_PATH]; +static int XDFCur[4] = {0, 0, 0, 0}; +static int XDFTrk[4] = {0, 0, 0, 0}; +static unsigned char* XDFImg[4] = {0, 0, 0, 0}; + +void XDF_Init(void) +{ + int drv; + + for (drv=0; drv<4; drv++) { + XDFCur[drv] = 0; + XDFImg[drv] = 0; + ZeroMemory(XDFFile[drv], MAX_PATH); + } +} + + +void XDF_Cleanup(void) +{ + int drv; + for (drv=0; drv<4; drv++) XDF_Eject(drv); +} + + +int XDF_SetFD(int drv, char* filename) +{ + FILEH fp; + + strncpy(XDFFile[drv], filename, MAX_PATH); + XDFFile[drv][MAX_PATH-1] = 0; + + XDFImg[drv] = (unsigned char*)malloc(1261568); + if ( !XDFImg[drv] ) return FALSE; + memset(XDFImg[drv], 0xe5, 1261568); + fp = File_Open(XDFFile[drv]); + if ( !fp ) { + ZeroMemory(XDFFile[drv], MAX_PATH); + FDD_SetReadOnly(drv); + return FALSE; + } + File_Seek(fp, 0, FSEEK_SET); + File_Read(fp, XDFImg[drv], 1261568); + File_Close(fp); + return TRUE; +} + + +int XDF_Eject(int drv) +{ + FILEH fp; + + if ( !XDFImg[drv] ) { + ZeroMemory(XDFFile[drv], MAX_PATH); + return FALSE; + } + if ( !FDD_IsReadOnly(drv) ) { + fp = File_Open(XDFFile[drv]); + if ( !fp ) goto xdf_eject_error; + File_Seek(fp, 0, FSEEK_SET); + if ( File_Write(fp, XDFImg[drv], 1261568)!=1261568 ) goto xdf_eject_error; + File_Close(fp); + } + free(XDFImg[drv]); + XDFImg[drv] = 0; + ZeroMemory(XDFFile[drv], MAX_PATH); + return TRUE; + +xdf_eject_error: + free(XDFImg[drv]); + XDFImg[drv] = 0; + ZeroMemory(XDFFile[drv], MAX_PATH); + return FALSE; +} + + +int XDF_Seek(int drv, int trk, FDCID* id) +{ + if ( (drv<0)||(drv>3) ) return FALSE; + if ( (trk<0)||(trk>153) ) return FALSE; + if ( !XDFImg[drv] ) return FALSE; + if ( XDFTrk[drv]!=trk ) XDFCur[drv] = 0; + id->c = trk>>1; + id->h = trk&1; + id->r = XDFCur[drv]+1; + id->n = 3; + XDFTrk[drv] = trk; + return TRUE; +} + + +int XDF_GetCurrentID(int drv, FDCID* id) +{ + if ( (drv<0)||(drv>3) ) return FALSE; + if ( (XDFTrk[drv]<0)||(XDFTrk[drv]>153) ) return FALSE; + if ( !XDFImg[drv] ) return FALSE; + id->c = XDFTrk[drv]>>1; + id->h = XDFTrk[drv]&1; + id->r = XDFCur[drv]+1; + id->n = 3; + return TRUE; +} + + +int XDF_ReadID(int drv, FDCID* id) +{ + if ( (drv<0)||(drv>3) ) return FALSE; + if ( (XDFTrk[drv]<0)||(XDFTrk[drv]>153) ) return FALSE; + if ( !XDFImg[drv] ) return FALSE; + id->c = XDFTrk[drv]>>1; + id->h = XDFTrk[drv]&1; + id->r = XDFCur[drv]+1; + id->n = 3; + XDFCur[drv] = (XDFCur[drv]+1)&7; + return TRUE; +} + + +int XDF_WriteID(int drv, int trk, unsigned char* buf, int num) +{ + int i; + if ( (drv<0)||(drv>3) ) return FALSE; + if ( (trk<0)||(trk>153) ) return FALSE; + if ( !XDFImg[drv] ) return FALSE; + if ( num!=8 ) return FALSE; + for (i=0; i<8; i++, buf+=4) { + if ( (((buf[0]<<1)+buf[1])!=trk)||(buf[2]<1)||(buf[2]>8)||(buf[3]!=3) ) return FALSE; + } + XDFTrk[drv] = trk; + return TRUE; +} + + +int XDF_Read(int drv, FDCID* id, unsigned char* buf) +{ + int pos; + if ( (drv<0)||(drv>3) ) return FALSE; + if ( (XDFTrk[drv]<0)||(XDFTrk[drv]>153) ) return FALSE; + if ( !XDFImg[drv] ) return FALSE; + if ( (((id->c<<1)+id->h)!=XDFTrk[drv]) ) return FALSE; + if ( (id->r<1)||(id->r>8) ) return FALSE; + if ( (id->h!=0)&&(id->h!=1) ) return FALSE; + if ( id->n!=3 ) return FALSE; + pos = ((((id->c<<1)+(id->h))*8)+(id->r-1))<<10; + memcpy(buf, XDFImg[drv]+pos, 1024); + XDFCur[drv] = (id->r)&7; + return TRUE; +} + + +int XDF_ReadDiag(int drv, FDCID* id, FDCID* retid, unsigned char* buf) +{ + int pos; + (void)id; + if ( (drv<0)||(drv>3) ) return FALSE; + if ( (XDFTrk[drv]<0)||(XDFTrk[drv]>153) ) return FALSE; + if ( (XDFCur[drv]<0)||(XDFCur[drv]>8) ) return FALSE; + if ( !XDFImg[drv] ) return FALSE; + pos = ((XDFTrk[drv]*8)+XDFCur[drv])<<10; + memcpy(buf, XDFImg[drv]+pos, 1024); + retid->c = XDFTrk[drv]>>1; + retid->h = XDFTrk[drv]&1; + retid->r = XDFCur[drv]+1; + retid->n = 3; + XDFCur[drv] = (XDFCur[drv]+1)&7; + return TRUE; +} + + +int XDF_Write(int drv, FDCID* id, unsigned char* buf, int del) +{ + int pos; + (void)del; + if ( (drv<0)||(drv>3) ) return FALSE; + if ( (XDFTrk[drv]<0)||(XDFTrk[drv]>153) ) return FALSE; + if ( !XDFImg[drv] ) return FALSE; + if ( (((id->c<<1)+id->h)!=XDFTrk[drv]) ) return FALSE; + if ( (id->r<1)||(id->r>8) ) return FALSE; + if ( (id->h!=0)&&(id->h!=1) ) return FALSE; + if ( id->n!=3 ) return FALSE; + pos = ((((id->c<<1)+(id->h))*8)+(id->r-1))<<10; + memcpy(XDFImg[drv]+pos, buf, 1024); + XDFCur[drv] = (id->r)&7; + return TRUE; +} diff --git a/x68k/disk_xdf.h b/x68k/disk_xdf.h new file mode 100644 index 0000000..cc754e6 --- /dev/null +++ b/x68k/disk_xdf.h @@ -0,0 +1,16 @@ +#ifndef _winx68k_xdf +#define _winx68k_xdf + +void XDF_Init(void); +void XDF_Cleanup(void); +int XDF_SetFD(int drive, char* filename); +int XDF_Eject(int drive); +int XDF_Seek(int drv, int trk, FDCID* id); +int XDF_ReadID(int drv, FDCID* id); +int XDF_WriteID(int drv, int trk, unsigned char* buf, int num); +int XDF_Read(int drv, FDCID* id, unsigned char* buf); +int XDF_ReadDiag(int drv, FDCID* id, FDCID* retid, unsigned char* buf); +int XDF_Write(int drv, FDCID* id, unsigned char* buf, int del); +int XDF_GetCurrentID(int drv, FDCID* id); + +#endif diff --git a/x68k/dmac.c b/x68k/dmac.c new file mode 100644 index 0000000..05301c4 --- /dev/null +++ b/x68k/dmac.c @@ -0,0 +1,408 @@ +// --------------------------------------------------------------------------------------- +// DMAC.C - DMAコントローラ(HD63450) +// ToDo : もっと奇麗に ^^; +// --------------------------------------------------------------------------------------- + +#include "common.h" +#include "winx68k.h" +#include "m68000.h" +#include "memory.h" +#include "irqh.h" +#include "fdc.h" +#include "sasi.h" +#include "adpcm.h" +#include "mercury.h" +#include "dmac.h" + +dmac_ch DMA[4]; +int dmatrace = 0; + +static int DMA_IntCH = 0; +static int DMA_LastInt = 0; +static int (*IsReady[4])(void) = { 0, 0, 0, 0 }; + +#define DMAINT(ch) if ( DMA[ch].CCR&0x08 ) { DMA_IntCH |= (1<=0)&&(ch<=3) ) IsReady[ch] = func; +} + +// ----------------------------------------------------------------------- +// 割り込みベクタを返す +// ----------------------------------------------------------------------- +DWORD FASTCALL DMA_Int(BYTE irq) +{ + DWORD ret = 0xffffffff; + int bit = 0; + int i = DMA_LastInt; + IRQH_IRQCallBack(irq); + if ( irq==3 ) { + do { + bit = 1<>6); + + if ( adr>=0xe84100 ) return 0; // ばすえらー? + + p = (unsigned char*)&DMA[ch]; + + switch ( off ) { + case 0x00: + if ( (ch==2)&&(off==0) ) { +#ifndef NO_MERCURY + DMA[ch].CSR = (DMA[ch].CSR&0xfe)|(Mcry_LRTiming&1); +#else + DMA[ch].CSR = (DMA[ch].CSR&0xfe); + Mcry_LRTiming ^= 1; +#endif + } + break; + case 0x0a: case 0x0b: case 0x1a: case 0x1b: + p += (off^1); + break; + case 0x0c: case 0x0d: case 0x0e: case 0x0f: + case 0x14: case 0x15: case 0x16: case 0x17: + case 0x1c: case 0x1d: case 0x1e: case 0x1f: + p += ((off&0xfc)+3-(off&3)); + break; + default: + p += off; + } + return *p; +} + + +// ----------------------------------------------------------------------- +// I/O Write +// ----------------------------------------------------------------------- +void FASTCALL DMA_Write(DWORD adr, BYTE data) +{ + unsigned char* p; + int off = adr&0x3f, ch = ((adr-0xe84000)>>6); + BYTE old; + + if ( adr>=0xe84100 ) return; // ばすえらー? + + p = (unsigned char*)&DMA[ch]; + +/*if (ch==3) { +FILE* fp = fopen("_dma.txt", "a"); +fprintf(fp, "W $%02X $%02X\n", off, data); +fclose(fp); +}*/ + + switch ( off ) { + case 0x0a: case 0x0b: case 0x1a: case 0x1b: + p[off^1] = data; + break; + case 0x0c: case 0x0d: case 0x0e: case 0x0f: + case 0x14: case 0x15: case 0x16: case 0x17: + case 0x1c: case 0x1d: case 0x1e: case 0x1f: + p[(off&0xfc)+3-(off&3)] = data; + break; + case 0x00: + p[off] &= ((~data)|0x09); + break; + case 0x01: + p[off] &= (~data); + break; + case 0x07: + old = DMA[ch].CCR; + DMA[ch].CCR = (data&0xef) | (DMA[ch].CCR&0x80); // CCRのSTRは書き込みでは落とせない + if ( (data&0x10)&&(DMA[ch].CCR&0x80) ) { // Software Abort + DMAERR(ch,0x11) + break; + } + if ( data&0x20 ) { // Halt +// DMA[ch].CSR &= 0xf7; // 本来は落ちるはず。Nemesis'90で調子悪いので… + break; + } + if ( data&0x80 ) { // 動作開始 + if ( old&0x20 ) { // Halt解除 + DMA[ch].CSR |= 0x08; + DMA_Exec(ch); + } else { + if ( DMA[ch].CSR&0xf8 ) { // タイミングエラー + DMAERR(ch,0x02) + break; + } + DMA[ch].CSR |= 0x08; + if ( (DMA[ch].OCR&8)/*&&(!DMA[ch].MTC)*/ ) { // アレイ/リンクアレイチェイン + DMA[ch].MAR = dma_readmem24_dword(DMA[ch].BAR)&0xffffff; + DMA[ch].MTC = dma_readmem24_word(DMA[ch].BAR+4); + if (DMA[ch].OCR&4) { + DMA[ch].BAR = dma_readmem24_dword(DMA[ch].BAR+6); + } else { + DMA[ch].BAR += 6; + if ( !DMA[ch].BTC ) { // これもカウントエラー + DMAERR(ch,0x0f) + break; + } + } + } + if ( !DMA[ch].MTC ) { // カウントエラー + DMAERR(ch,0x0d) + break; + } + DMA[ch].CER = 0x00; + DMA_Exec(ch); // 開始直後にカウンタを見て動作チェックする場合があるので、少しだけ実行しておく + } + } + if ( (data&0x40)&&(!DMA[ch].MTC) ) { // Continuous Op. + if ( DMA[ch].CCR&0x80 ) { + if ( DMA[ch].CCR&0x40 ) { + DMAERR(ch,0x02) + } else if ( DMA[ch].OCR&8 ) { // アレイ/リンクアレイチェイン + DMAERR(ch,0x01) + } else { + DMA[ch].MAR = DMA[ch].BAR; + DMA[ch].MTC = DMA[ch].BTC; + DMA[ch].CSR |= 0x08; + DMA[ch].BAR = 0; + DMA[ch].BTC = 0; + if ( !DMA[ch].MAR ) { + DMA[ch].CSR |= 0x40; // ブロック転送終了ビット/割り込み + DMAINT(ch) + break; + } else if ( !DMA[ch].MTC ) { + DMAERR(ch,0x0d) + break; + } + DMA[ch].CCR &= 0xbf; + DMA_Exec(ch); + } + } else { // 非Active時のCNTビットは動作タイミングエラー + DMAERR(ch,0x02) + } + } + break; + case 0x3f: + if ( ch!=3 ) break; + default: + p[off] = data; + break; + } +} + + +// ----------------------------------------------------------------------- +// DMA実行 +// ----------------------------------------------------------------------- +int FASTCALL DMA_Exec(int ch) +{ + DWORD *src, *dst; + +// if ( DMA_IntCH&(1<Memory + src = &DMA[ch].DAR; + dst = &DMA[ch].MAR; + } else { // Memory->Device + src = &DMA[ch].MAR; + dst = &DMA[ch].DAR; + } + + while ( (DMA[ch].CSR&0x08) && (!(DMA[ch].CCR&0x20)) && (!(DMA[ch].CSR&0x80)) && (DMA[ch].MTC) && (((DMA[ch].OCR&3)!=2)||(IsReady[ch]())) ) { + BusErrFlag = 0; + switch ( ((DMA[ch].OCR>>4)&3)+((DMA[ch].DCR>>1)&4) ) { + case 0: + case 3: + dma_writemem24(*dst, dma_readmem24(*src)); + if ( DMA[ch].SCR&4 ) DMA[ch].MAR += 1; else if ( DMA[ch].SCR&8 ) DMA[ch].MAR -= 1; + if ( DMA[ch].SCR&1 ) DMA[ch].DAR += 2; else if ( DMA[ch].SCR&2 ) DMA[ch].DAR -= 2; + break; + case 1: + dma_writemem24(*dst, dma_readmem24(*src)); + if ( DMA[ch].SCR&4 ) DMA[ch].MAR += 1; else if ( DMA[ch].SCR&8 ) DMA[ch].MAR -= 1; + if ( DMA[ch].SCR&1 ) DMA[ch].DAR += 2; else if ( DMA[ch].SCR&2 ) DMA[ch].DAR -= 2; + dma_writemem24(*dst, dma_readmem24(*src)); + if ( DMA[ch].SCR&4 ) DMA[ch].MAR += 1; else if ( DMA[ch].SCR&8 ) DMA[ch].MAR -= 1; + if ( DMA[ch].SCR&1 ) DMA[ch].DAR += 2; else if ( DMA[ch].SCR&2 ) DMA[ch].DAR -= 2; + break; + case 2: + dma_writemem24(*dst, dma_readmem24(*src)); + if ( DMA[ch].SCR&4 ) DMA[ch].MAR += 1; else if ( DMA[ch].SCR&8 ) DMA[ch].MAR -= 1; + if ( DMA[ch].SCR&1 ) DMA[ch].DAR += 2; else if ( DMA[ch].SCR&2 ) DMA[ch].DAR -= 2; + dma_writemem24(*dst, dma_readmem24(*src)); + if ( DMA[ch].SCR&4 ) DMA[ch].MAR += 1; else if ( DMA[ch].SCR&8 ) DMA[ch].MAR -= 1; + if ( DMA[ch].SCR&1 ) DMA[ch].DAR += 2; else if ( DMA[ch].SCR&2 ) DMA[ch].DAR -= 2; + dma_writemem24(*dst, dma_readmem24(*src)); + if ( DMA[ch].SCR&4 ) DMA[ch].MAR += 1; else if ( DMA[ch].SCR&8 ) DMA[ch].MAR -= 1; + if ( DMA[ch].SCR&1 ) DMA[ch].DAR += 2; else if ( DMA[ch].SCR&2 ) DMA[ch].DAR -= 2; + dma_writemem24(*dst, dma_readmem24(*src)); + if ( DMA[ch].SCR&4 ) DMA[ch].MAR += 1; else if ( DMA[ch].SCR&8 ) DMA[ch].MAR -= 1; + if ( DMA[ch].SCR&1 ) DMA[ch].DAR += 2; else if ( DMA[ch].SCR&2 ) DMA[ch].DAR -= 2; + break; + case 4: + dma_writemem24(*dst, dma_readmem24(*src)); + if ( DMA[ch].SCR&4 ) DMA[ch].MAR += 1; else if ( DMA[ch].SCR&8 ) DMA[ch].MAR -= 1; + if ( DMA[ch].SCR&1 ) DMA[ch].DAR += 1; else if ( DMA[ch].SCR&2 ) DMA[ch].DAR -= 1; + break; + case 5: + dma_writemem24_word(*dst, dma_readmem24_word(*src)); + if ( DMA[ch].SCR&4 ) DMA[ch].MAR += 2; else if ( DMA[ch].SCR&8 ) DMA[ch].MAR -= 2; + if ( DMA[ch].SCR&1 ) DMA[ch].DAR += 2; else if ( DMA[ch].SCR&2 ) DMA[ch].DAR -= 2; + break; + case 6: + dma_writemem24_dword(*dst, dma_readmem24_dword(*src)); + if ( DMA[ch].SCR&4 ) DMA[ch].MAR += 4; else if ( DMA[ch].SCR&8 ) DMA[ch].MAR -= 4; + if ( DMA[ch].SCR&1 ) DMA[ch].DAR += 4; else if ( DMA[ch].SCR&2 ) DMA[ch].DAR -= 4; + break; + } + + if ( BusErrFlag ) { + switch ( BusErrFlag ) { + case 1: // BusErr/Read + if ( DMA[ch].OCR&0x80 ) // Device->Memory + DMAERR(ch,0x0a) + else + DMAERR(ch,0x09) + break; + case 2: // BusErr/Write + if ( DMA[ch].OCR&0x80 ) // Device->Memory + DMAERR(ch,0x09) + else + DMAERR(ch,0x0a) + break; + case 3: // AdrErr/Read + if ( DMA[ch].OCR&0x80 ) // Device->Memory + DMAERR(ch,0x06) + else + DMAERR(ch,0x05) + break; + case 4: // BusErr/Write + if ( DMA[ch].OCR&0x80 ) // Device->Memory + DMAERR(ch,0x05) + else + DMAERR(ch,0x06) + break; + } + BusErrFlag = 0; + break; + } + + DMA[ch].MTC--; + if ( !DMA[ch].MTC ) { // 指定分のバイト数転送終了 + if ( DMA[ch].OCR&8 ) { // チェインモードで動いている場合 + if ( DMA[ch].OCR&4 ) { // リンクアレイチェイン + if ( DMA[ch].BAR ) { + DMA[ch].MAR = dma_readmem24_dword(DMA[ch].BAR); + DMA[ch].MTC = dma_readmem24_word(DMA[ch].BAR+4); + DMA[ch].BAR = dma_readmem24_dword(DMA[ch].BAR+6); + if ( BusErrFlag ) { + if ( BusErrFlag==1 ) + DMAERR(ch,0x0b) + else + DMAERR(ch,0x07) + BusErrFlag = 0; + break; + } else if ( !DMA[ch].MTC ) { + DMAERR(ch,0x0d) + break; + } + } + } else { // アレイチェイン + DMA[ch].BTC--; + if ( DMA[ch].BTC ) { // 次のブロックがある + DMA[ch].MAR = dma_readmem24_dword(DMA[ch].BAR); + DMA[ch].MTC = dma_readmem24_word(DMA[ch].BAR+4); + DMA[ch].BAR += 6; + if ( BusErrFlag ) { + if ( BusErrFlag==1 ) + DMAERR(ch,0x0b) + else + DMAERR(ch,0x07) + BusErrFlag = 0; + break; + } else if ( !DMA[ch].MTC ) { + DMAERR(ch,0x0d) + break; + } + } + } + } else { // 通常モード(1ブロックのみ)終了 + if ( DMA[ch].CCR&0x40 ) { // Countinuous動作中 + DMA[ch].CSR |= 0x40; // ブロック転送終了ビット/割り込み + DMAINT(ch) + if ( DMA[ch].BAR ) { + DMA[ch].MAR = DMA[ch].BAR; + DMA[ch].MTC = DMA[ch].BTC; + DMA[ch].CSR |= 0x08; + DMA[ch].BAR = 0x00; + DMA[ch].BTC = 0x00; + if ( !DMA[ch].MTC ) { + DMAERR(ch,0x0d) + break; + } + DMA[ch].CCR &= 0xbf; + } + } + } + if ( !DMA[ch].MTC ) { + DMA[ch].CSR |= 0x80; + DMA[ch].CSR &= 0xf7; + DMAINT(ch) + } + } + if ( (DMA[ch].OCR&3)!=1 ) break; + } + return 0; +} + + +// ----------------------------------------------------------------------- +// 初期化 +// ----------------------------------------------------------------------- +void DMA_Init(void) +{ + int i; + DMA_IntCH = 0; + DMA_LastInt = 0; + for (i=0; i<4; i++) { + memset(&DMA[i], 0, sizeof(dmac_ch)); + DMA[i].CSR = 0; + DMA[i].CCR = 0; + DMA_SetReadyCB(i, DMA_DummyIsReady); + } + DMA_SetReadyCB(0, FDC_IsDataReady); + DMA_SetReadyCB(1, SASI_IsReady); +#ifndef NO_MERCURY + DMA_SetReadyCB(2, Mcry_IsReady); +#endif + DMA_SetReadyCB(3, ADPCM_IsReady); +} diff --git a/x68k/dmac.h b/x68k/dmac.h new file mode 100644 index 0000000..05171e0 --- /dev/null +++ b/x68k/dmac.h @@ -0,0 +1,50 @@ +#ifndef _winx68k_dmac +#define _winx68k_dmac + +#include "common.h" + +typedef struct +{ + BYTE CSR; // 00 + BYTE CER; + BYTE dmy0[2]; + BYTE DCR; // 04 + BYTE OCR; + BYTE SCR; + BYTE CCR; + BYTE dmy1[2]; // 08 + WORD MTC; + DWORD MAR; // 0C + BYTE dmy2[4]; // 10 + DWORD DAR; // 14 + BYTE dmy3[2]; // 18 + WORD BTC; + DWORD BAR; // 1C + BYTE dmy4[5]; // 20 + BYTE NIV; + BYTE dmy5; + BYTE EIV; + BYTE dmy6; // 28 + BYTE MFC; + BYTE dmy7[3]; + BYTE CPR; + BYTE dmy8[3]; + BYTE DFC; + BYTE dmy9[7]; + BYTE BFC; + BYTE dmya[5]; + BYTE GCR; + +} dmac_ch; + +extern dmac_ch DMA[4]; + +DWORD FASTCALL DMA_Int(BYTE irq); +BYTE FASTCALL DMA_Read(DWORD adr); +void FASTCALL DMA_Write(DWORD adr, BYTE data); + +int FASTCALL DMA_Exec(int ch); +void DMA_Init(void); +void DMA_SetReadyCB(int ch, int (*func)(void)); + +#endif //_winx68k_dmac diff --git a/x68k/fdc.c b/x68k/fdc.c new file mode 100644 index 0000000..3984f98 --- /dev/null +++ b/x68k/fdc.c @@ -0,0 +1,540 @@ +// --------------------------------------------------------------------------------------- +// FDC.C - Floppy Disk Controller (uPD72065) +// ToDo : 未実装コマンド、胡散臭い部分(多数)の見直し、DMACとの連携部の見直し +// D88でのエラー処理とかマシになったはず……でもその分汚い…… +// --------------------------------------------------------------------------------------- + +#include "fdc.h" +#include "fdd.h" +#include "ioc.h" +#include "irqh.h" +#include "dmac.h" +#include "m68000.h" +#include "fileio.h" +#include "winx68k.h" + +static const BYTE CMD_TABLE[32] = {0, 0, 8, 2, 1, 8, 8, 1, 0, 8, 1, 0, 8, 5, 0, 2, + 0, 8, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0}; +static const BYTE DAT_TABLE[32] = {0, 0, 7, 0, 1, 7, 7, 0, 2, 7, 7, 0, 7, 7, 0, 0, + 0, 7, 0, 0, 1, 0, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0}; + +/* Params for Read / ReadDel / ReadDiag / Write / WriteDel / ScanEq / ScanLEq / ScanHEq */ +typedef struct { + BYTE cmd; + BYTE us; + BYTE c; + BYTE h; + BYTE r; + BYTE n; + BYTE eot; + BYTE gsl; + BYTE dtl; +} FDCPRM0; + +/* Params for ReadID / Seek / SenseDevStat */ +typedef struct { + BYTE cmd; + BYTE us; + BYTE n; +} FDCPRM1; + +/* Params for WriteID */ +typedef struct { + BYTE cmd; + BYTE us; + BYTE n; + BYTE sc; + BYTE gap; + BYTE d; +} FDCPRM2; + + +/* Response for many commands */ +typedef struct { + BYTE st0; + BYTE st1; + BYTE st2; + BYTE c; + BYTE h; + BYTE r; + BYTE n; +} FDCRSP; + + +typedef struct { + int cmd; + + int cyl; + int drv; + int ready; + int ctrl; + int wexec; + + int rdptr; + int wrptr; + int rdnum; + int wrnum; + int bufnum; + int st0; + int st1; + int st2; + BYTE RspBuf[10]; + BYTE PrmBuf[10]; + BYTE DataBuf[0x8000]; + BYTE ScanBuf[0x8000]; +} FDC; + +static FDC fdc; + + +#define US(p) (p->us&3) +#define HD(p) ((p->us>>2)&1) +#define SK(p) ((p->us>>5)&1) +#define MF(p) ((p->us>>6)&1) +#define MT(p) ((p->us>>7)&1) + +// ----------------------------------------------------------------------- +// 割り込みベクタ +// ----------------------------------------------------------------------- +DWORD FASTCALL FDC_Int(BYTE irq) +{ + IRQH_IRQCallBack(irq); + if (irq==1) + return ((DWORD)IOC_IntVect); + else + return -1; +} + + +// ----------------------------------------------------------------------- +// 初期化 +// ----------------------------------------------------------------------- +void FDC_Init(void) +{ + memset(&fdc, 0, sizeof(FDC)); +} + + +void FDC_SetForceReady(int n) +{ + fdc.ready = n; +} + + +static void FDC_SetInt(void) +{ + IOC_IntStat |= 0x80; + if ( IOC_IntStat&4 ) IRQH_Int(1, &FDC_Int); +} + + +// ----------------------------------------------------------------------- +// Excution Phase の終了 +// ----------------------------------------------------------------------- +void FDC_EPhaseEnd(void) +{ + FDCID id; + FDCRSP* rsp = (FDCRSP*)fdc.RspBuf; + FDD_GetCurrentID(fdc.drv, &id); + rsp->c = id.c; + rsp->h = id.h; + rsp->r = id.r; + rsp->n = id.n; + rsp->st0 = fdc.st0; + rsp->st1 = fdc.st1; + rsp->st2 = fdc.st2; + fdc.bufnum = 0; + fdc.rdptr = 0; + fdc.wexec = 0; + FDC_SetInt(); +} + + +int FDC_IsDataReady(void) +{ + return ((fdc.bufnum)?1:0); +} + + + +static void FDC_ExecCmd(void) +{ + FDCPRM0* prm0 = (FDCPRM0*)fdc.PrmBuf; + FDCPRM1* prm1 = (FDCPRM1*)fdc.PrmBuf; + FDCPRM2* prm2 = (FDCPRM2*)fdc.PrmBuf; + FDCRSP* rsp = (FDCRSP*)fdc.RspBuf; + FDCID id; + int ret; + +/*{ +FILE* fp = fopen("_fdc.txt", "a"); +fprintf(fp, "Cmd:%d CurCy:%d \n", fdc.cmd, fdc.cyl); +fclose(fp); +}*/ + + switch ( fdc.cmd ) { + case 2: // ReadDiagnostic + fdc.st0 = prm1->us&7; + if ( (FDD_IsReady(fdc.drv))||(fdc.ready) ) { + if ( !FDD_Seek(fdc.drv, (fdc.cyl<<1)+HD(prm0), &id) ) { + fdc.st0 |= 0x40; + fdc.st1 |= 0x04; + } else { + FDCID retid; + id.c = prm0->c; + id.h = prm0->h; + id.r = prm0->r; + id.n = prm0->n; + ret = FDD_ReadDiag(fdc.drv, &id, &retid, fdc.DataBuf); + if ( !ret ) { + fdc.st0 |= 0x40; + fdc.st1 |= 0x04; + } else { + fdc.bufnum = (retid.n)?(128<n):(prm0->dtl); + if ( memcmp(&id, &retid, sizeof(FDCID)) ) fdc.st1 |= 0x24; + if ( ret&2 ) fdc.st2 |= 0x40; + if ( ret&0x0c ) fdc.st1 |= 0x20; + if ( ret&0x08 ) fdc.st2 |= 0x20; + if ( ret&0x10 ) fdc.st2 |= 0x01; + } + } + } else { + fdc.st0 |= 0x48; + } + if ( fdc.st0&0x40 ) FDC_EPhaseEnd(); + break; + case 3: // Specify + /* Nothing to do */ + break; + case 4: // SenseDeviceStatus + fdc.st0 = prm1->us&7; + rsp->st0 = fdc.st0; + if ( !fdc.cyl ) rsp->st0 |= 0x10; + if ( (FDD_IsReady(fdc.drv))||(fdc.ready) ) rsp->st0 |= 0x20; + if ( FDD_IsReadOnly(fdc.drv) ) rsp->st0 |= 0x40; +/*{ +FILE* fp = fopen("_fdc.txt", "a"); +fprintf(fp, " ### SDS Ret=$%02X\n", rsp->st0); +fclose(fp); +}*/ + break; + case 5: // WriteData + case 9: // WriteDeletedData + fdc.st0 = prm1->us&7; + if ( FDD_IsReadOnly(fdc.drv) ) { + fdc.st0 |= 0x40; + fdc.st1 |= 0x02; + } else if ( (FDD_IsReady(fdc.drv))||(fdc.ready) ) { + if ( !FDD_Seek(fdc.drv, (fdc.cyl<<1)+HD(prm0), &id) ) { + fdc.st0 |= 0x40; + fdc.st1 |= 0x04; + } else { + fdc.bufnum = (prm0->n)?(128<n):(prm0->dtl); + fdc.wexec = 1; + } + } else { + fdc.st0 |= 0x48; + } + if ( fdc.st0&0x40 ) FDC_EPhaseEnd(); + break; + case 6: // ReadData + case 12: // ReadDeletedData + case 17: // ScanEqual + case 25: // ScanLowOrEqual + case 29: // ScanHighOrEqual + fdc.st0 = prm1->us&7; + if ( (FDD_IsReady(fdc.drv))||(fdc.ready) ) { + if ( !FDD_Seek(fdc.drv, (fdc.cyl<<1)+HD(prm0), &id) ) { + fdc.st0 |= 0x40; + fdc.st1 |= 0x04; + } else { + id.c = prm0->c; + id.h = prm0->h; + id.r = prm0->r; + id.n = prm0->n; + if ( (fdc.cmd==6)||(fdc.cmd==12) ) + ret = FDD_Read(fdc.drv, &id, fdc.DataBuf); + else + ret = FDD_Read(fdc.drv, &id, fdc.ScanBuf); + if ( !ret ) { + fdc.st0 |= 0x40; + fdc.st1 |= 0x04; + } else { + fdc.bufnum = (prm0->n)?(128<n):(prm0->dtl); + if ( (fdc.cmd!=6)&&(fdc.cmd!=12) ) fdc.wexec = 1; + if ( ((ret&2)&&(fdc.cmd!=12))||((!(ret&2))&&(fdc.cmd==12)) ) fdc.st2 |= 0x40; + if ( ret&0x1c ) fdc.st0 |= 0x40; + if ( ret&0x0c ) fdc.st1 |= 0x20; + if ( ret&0x08 ) fdc.st2 |= 0x20; + if ( ret&0x10 ) fdc.st2 |= 0x01; + } + } + } else { + fdc.st0 |= 0x48; + } + if ( fdc.st0&0x40 ) FDC_EPhaseEnd(); +/*{ +FILE* fp = fopen("_fdc.txt", "a"); +fprintf(fp, " ### Read C:$%02X H:$%02X R:$%02X N:$%02X EOT=$%02X ret=$%02X/$%02X/$%02X\n", id.c, id.h, id.r, id.n, prm0->eot, fdc.st0, fdc.st1, fdc.st2); +fclose(fp); +}*/ + break; + case 7: // Recalibrate + fdc.st0 = prm1->us&7; + fdc.cyl = 0; + if ( (!FDD_IsReady(fdc.drv))&&(!fdc.ready) ) { + fdc.st0 |= 0x48; // FDなし + } else if ( (fdc.drv>=0)&&(fdc.drv<2) ) { + fdc.st0 |= 0x20; // FDあり、ドライブあり + } else { + fdc.st0 |= 0x50; // ドライブなし + } + FDC_SetInt(); + break; + case 8: // SenseIntStatus + rsp->st0 = fdc.st0; + rsp->st1 = fdc.cyl; + fdc.st0 = 0x80; + break; + case 10: // ReadID + memset(&id, 0, sizeof(FDCID)); + fdc.st0 = prm1->us&7; + if ( (FDD_IsReady(fdc.drv))||(fdc.ready) ) { + if ( !FDD_Seek(fdc.drv, (fdc.cyl<<1)+HD(prm0), &id) ) { + fdc.st0 |= 0x40; + fdc.st1 |= 0x04; + } else { + ret = FDD_ReadID(fdc.drv, &id); + if ( !ret ) { + fdc.st0 |= 0x40; + fdc.st1 |= 0x04; + } else { + if ( ret&2 ) fdc.st2 |= 0x40; + } + } + } else { + fdc.st0 |= 0x48; + } + rsp->c = id.c; + rsp->h = id.h; + rsp->r = id.r; + rsp->n = id.n; + rsp->st0 = fdc.st0; + rsp->st1 = fdc.st1; + rsp->st2 = fdc.st2; + FDC_SetInt(); + break; + case 13: // WriteID + fdc.st0 = prm1->us&7; + if ( FDD_IsReadOnly(fdc.drv) ) { + fdc.st0 |= 0x40; + fdc.st1 |= 0x02; + } else if ( (FDD_IsReady(fdc.drv))||(fdc.ready) ) { + fdc.bufnum = (prm2->sc)<<2; + fdc.wexec = 1; + } else { + fdc.st0 |= 0x48; + } + if ( fdc.st0&0x40 ) FDC_EPhaseEnd(); + break; + case 15: // Seek + fdc.st0 = prm1->us&0x07; + if ( FDD_IsReady(fdc.drv) ) { + fdc.cyl = prm1->n; + fdc.st0 |= 0x20; + } else { + fdc.st0 |= 0x48; + } + FDC_SetInt(); + break; + } +} + + +static void FDC_NextTrack(void) +{ + FDCPRM0* prm0 = (FDCPRM0*)fdc.PrmBuf; + if ( prm0->r==prm0->eot ) { + if ( (MT(prm0))&&(!HD(prm0))&&(!prm0->h) ) { + prm0->us |= 4; + prm0->h = 1; + prm0->r = 1; + } else { + FDC_EPhaseEnd(); + return; + } + } else { + prm0->r++; + } + FDC_ExecCmd(); +} + + +static void FDC_WriteBuffer(void) +{ + FDCPRM0* prm0 = (FDCPRM0*)fdc.PrmBuf; + FDCPRM2* prm2 = (FDCPRM2*)fdc.PrmBuf; + FDCID id; + int i; + + switch ( fdc.cmd ) { + case 5: // WriteData + case 9: // WriteDeletedData + id.c = prm0->c; + id.h = prm0->h; + id.r = prm0->r; + id.n = prm0->n; + if ( !FDD_Write(fdc.drv, &id, fdc.DataBuf, (fdc.cmd==9)?1:0) ) { + fdc.st0 |= 0x40; + fdc.st1 |= 0x04; + FDC_SetInt(); + } else { + FDC_NextTrack(); + } + break; + case 13: // WriteID + fdc.DataBuf[fdc.wrptr] = prm2->d; + if ( !FDD_WriteID(fdc.drv, (fdc.cyl<<1)+HD(prm2), fdc.DataBuf, prm2->sc) ) { + fdc.st0 |= 0x40; + fdc.st1 |= 0x04; + } + FDC_EPhaseEnd(); + break; + case 17: // ScanEqual + for (i=0; ifdc.DataBuf[i] ) { + fdc.st0 |= 0x40; + fdc.st2 &= 0xf7; + fdc.st2 |= 0x04; + FDC_EPhaseEnd(); + break; + } else if ( fdc.ScanBuf[i]fdc.DataBuf[i] ) { + break; + } + } + } + FDC_NextTrack(); + break; + } +} + + +// ----------------------------------------------------------------------- +// I/O Read +// ----------------------------------------------------------------------- +BYTE FASTCALL FDC_Read(DWORD adr) +{ + BYTE ret = 0x00; + if ( adr==0xe94001 ) { /* FDC Status */ + ret = 0x80; + ret |= ((fdc.rdnum)&&(!fdc.wexec))?0x40:0; + ret |= ((fdc.wrnum)||(fdc.rdnum))?0x10:0; + ret &= ((fdc.rdnum==1)&&(fdc.cmd==8))?0xaf:0xff; + } else if ( adr==0xe94003 ) { /* Read data */ + if ( fdc.bufnum ) { + ret = fdc.DataBuf[fdc.rdptr++]; + if ( fdc.rdptr>=fdc.bufnum ) { + fdc.rdptr = 0; + FDC_NextTrack(); + } + } else if ( fdc.rdnum ) { + ret = fdc.RspBuf[fdc.rdptr++]; + fdc.rdnum--; + } + } else if ( adr==0xe94005 ) { + if ( (fdc.ctrl&1)&&(FDD_IsReady(0)) ) ret = 0x80; + if ( (fdc.ctrl&2)&&(FDD_IsReady(1)) ) ret = 0x80; + } +/*{ +FILE* fp = fopen("_fdc.txt", "a"); +fprintf(fp, "Adr:$%08X ret=$%02X\n", adr, ret); +fclose(fp); +}*/ + return ret; +} + + +// ----------------------------------------------------------------------- +// I/O Write +// ----------------------------------------------------------------------- +void FASTCALL FDC_Write(DWORD adr, BYTE data) +{ + if ( adr==0xe94003 ) { + if ( fdc.bufnum ) { // WriteData + fdc.DataBuf[fdc.wrptr++] = data; + if ( fdc.wrptr>=fdc.bufnum ) { + FDC_WriteBuffer(); + fdc.wrptr = 0; + } + } else { + if ( fdc.wrnum ) { // Writing params + fdc.PrmBuf[fdc.wrptr++] = data; + fdc.wrnum--; + } else { // Command start + fdc.cmd = data&0x1f; + fdc.rdptr = 0; + fdc.wrptr = 0; + fdc.rdnum = 0; + fdc.wrnum = CMD_TABLE[fdc.cmd]; + fdc.PrmBuf[fdc.wrptr++] = data; + } + if ( !fdc.wrnum ) { + fdc.wrptr = 0; + fdc.rdnum = DAT_TABLE[fdc.cmd]; + fdc.st1 = 0; + fdc.st2 = 0; + if ( (fdc.cmd==17)||(fdc.cmd==25)||(fdc.cmd==29) ) fdc.st2 |= 8; + FDC_ExecCmd(); + } + } + } else if ( adr==0xe94005 ) { + if ( (fdc.ctrl&0x01)&&(!(data&0x01)) ) { // Drive0 control (Down edge) + if ( fdc.ctrl&0x20 ) FDD_EjectFD(0); + FDD_SetEMask(0, (fdc.ctrl&0x40)?1:0); + FDD_SetBlink(0, (fdc.ctrl&0x80)?1:0); + } + if ( (fdc.ctrl&0x02)&&(!(data&0x02)) ) { // Drive1 control (Down edge) + if ( fdc.ctrl&0x20 ) FDD_EjectFD(1); + FDD_SetEMask(1, (fdc.ctrl&0x40)?1:0); + FDD_SetBlink(1, (fdc.ctrl&0x80)?1:0); + } + fdc.ctrl = data; + } else if ( adr==0xe94007 ) { + fdc.drv = (data&0x80)?(data&3):(-1); + FDD_SetAccess(fdc.drv); +/*{ +FILE* fp = fopen("_fdc.txt", "a"); +fprintf(fp, "ActiveDrive=%d\n", fdc.drv); +fclose(fp); +}*/ + } +} diff --git a/x68k/fdc.h b/x68k/fdc.h new file mode 100644 index 0000000..c3e5a32 --- /dev/null +++ b/x68k/fdc.h @@ -0,0 +1,15 @@ +#ifndef _winx68k_fdc +#define _winx68k_fdc + +#include "common.h" + +void FDC_Init(void); +BYTE FASTCALL FDC_Read(DWORD adr); +void FASTCALL FDC_Write(DWORD adr, BYTE data); +short FDC_Flush(void); +void FDC_EPhaseEnd(void); +void FDC_SetForceReady(int n); +int FDC_IsDataReady(void); + +#endif //_winx68k_fdc + diff --git a/x68k/fdd.c b/x68k/fdd.c new file mode 100644 index 0000000..37efda7 --- /dev/null +++ b/x68k/fdd.c @@ -0,0 +1,312 @@ +// --------------------------------------------------------------------------------------- +// FDD.C - 内蔵FDD Unit(イメージファイルの管理とFD挿抜割り込みの発生) +// --------------------------------------------------------------------------------------- + +#include "common.h" +#include "fileio.h" +#include "status.h" +#include "irqh.h" +#include "ioc.h" +#include "fdc.h" +#include "fdd.h" +#include "disk_d88.h" +#include "disk_xdf.h" +#include "disk_dim.h" +#include + + +typedef struct { + int SetDelay[4]; + int Types[4]; + int ROnly[4]; + int EMask[4]; + int Blink[4]; + int Access; +} FDDINFO; + +static FDDINFO fdd; +static int (*SetFD[4])(int, char*) = { 0, XDF_SetFD, D88_SetFD, DIM_SetFD }; +static int (*Eject[4])(int) = { 0, XDF_Eject, D88_Eject, DIM_Eject }; +static int (*Seek[4])(int, int, FDCID*) = { 0, XDF_Seek, D88_Seek, DIM_Seek }; +static int (*ReadID[4])(int, FDCID*) = { 0, XDF_ReadID, D88_ReadID, DIM_ReadID }; +static int (*WriteID[4])(int, int, unsigned char*, int) = { 0, XDF_WriteID, D88_WriteID, DIM_WriteID }; +static int (*Read[4])(int, FDCID*, unsigned char*) = { 0, XDF_Read, D88_Read, DIM_Read }; +static int (*ReadDiag[4])(int, FDCID*, FDCID*, unsigned char*) = { 0, XDF_ReadDiag, D88_ReadDiag, DIM_ReadDiag }; +static int (*Write[4])(int, FDCID*, unsigned char*, int) = { 0, XDF_Write, D88_Write, DIM_Write }; +static int (*GetCurrentID[4])(int, FDCID*) = { 0, XDF_GetCurrentID, D88_GetCurrentID, DIM_GetCurrentID }; + +// ----------------------------------------------------------------------- +// イメージタイプ判別 +// ----------------------------------------------------------------------- +static void ConvertCapital(unsigned char* buf) +{ + for ( ; *buf; buf++) { + if ( ((*buf>=0x80)&&(*buf<=0x9f))||(*buf>=0xe0) ) { + buf++; + } else if ( (*buf>='a')&&(*buf<='z') ) *buf -= 0x20; + } +} + +static int GetDiskType(char* file) +{ + char tmp[8], *p; + int ret = FD_XDF; + p = strrchr(file, '.'); + if ( p ) { + memset(tmp, 0, 8); + strncpy(tmp, p+1, 3); + ConvertCapital(tmp); + if ( (!strncmp(tmp, "D88", 3))||(!strncmp(tmp, "88D", 3)) ) + ret = FD_D88; + else if ( !strncmp(tmp, "DIM", 3) ) + ret = FD_DIM; + } + return ret; +} + + + +// ----------------------------------------------------------------------- +// 挿抜割り込み +// ----------------------------------------------------------------------- +DWORD FASTCALL FDD_Int(BYTE irq) +{ + IRQH_IRQCallBack(irq); + if ( irq==1 ) + return ((DWORD)IOC_IntVect+1); + else + return -1; +} + + +// ----------------------------------------------------------------------- +// FDせっと +// すぐには割り込み上げないです +// ----------------------------------------------------------------------- +void FDD_SetFD(int drive, char* filename, int readonly) +{ + int type = GetDiskType(filename); + if ( (drive<0)||(drive>3) ) return; + FDD_EjectFD(drive); + if ( SetFD[type] ) { + if ( SetFD[type](drive, filename) ) { + fdd.Types[drive] = type; + fdd.ROnly[drive] |= readonly; + fdd.SetDelay[drive] = 3; + fdd.EMask[drive] = 0; + fdd.Blink[drive] = 0; + StatBar_SetFDD(drive, filename); + StatBar_ParamFDD(drive, (fdd.Types[drive]!=FD_Non)?((fdd.Access==drive)?2:1):0, ((fdd.Types[drive]!=FD_Non)&&(!fdd.EMask[drive]))?1:0, (fdd.Blink[drive])?1:0); + } + } +} + + +// ----------------------------------------------------------------------- +// いじぇくと +// ----------------------------------------------------------------------- +void FDD_EjectFD(int drive) +{ + int type; + if ( (drive<0)||(drive>3) ) return; + type = fdd.Types[drive]; + if ( Eject[type] ) { + Eject[type](drive); + if ( IOC_IntStat&2 ) IRQH_Int(1, &FDD_Int); + } + fdd.Types[drive] = FD_Non; + fdd.ROnly[drive] = 0; + fdd.EMask[drive] = 0; + fdd.Blink[drive] = 0; + StatBar_SetFDD(drive, ""); + StatBar_ParamFDD(drive, (fdd.Types[drive]!=FD_Non)?((fdd.Access==drive)?2:1):0, ((fdd.Types[drive]!=FD_Non)&&(!fdd.EMask[drive]))?1:0, (fdd.Blink[drive])?1:0); +} + + +// ----------------------------------------------------------------------- +// Eject Mask / Blink / AccessDrive +// ----------------------------------------------------------------------- +void FDD_SetEMask(int drive, int emask) +{ + if ( (drive<0)||(drive>3) ) return; + if ( fdd.EMask[drive]==emask ) return; + fdd.EMask[drive] = emask; + StatBar_ParamFDD(drive, (fdd.Types[drive]!=FD_Non)?((fdd.Access==drive)?2:1):0, ((fdd.Types[drive]!=FD_Non)&&(!fdd.EMask[drive]))?1:0, (fdd.Blink[drive])?1:0); +} + +void FDD_SetAccess(int drive) +{ + if ( fdd.Access==drive ) return; + fdd.Access = drive; + StatBar_ParamFDD(0, (fdd.Types[0]!=FD_Non)?((fdd.Access==0)?2:1):0, ((fdd.Types[0]!=FD_Non)&&(!fdd.EMask[0]))?1:0, (fdd.Blink[0])?1:0); + StatBar_ParamFDD(1, (fdd.Types[1]!=FD_Non)?((fdd.Access==1)?2:1):0, ((fdd.Types[1]!=FD_Non)&&(!fdd.EMask[1]))?1:0, (fdd.Blink[1])?1:0); +} + +void FDD_SetBlink(int drive, int blink) +{ + if ( (drive<0)||(drive>3) ) return; + if ( fdd.Blink[drive]==blink ) return; + fdd.Blink[drive] = blink; + StatBar_ParamFDD(drive, (fdd.Types[drive]!=FD_Non)?((fdd.Access==drive)?2:1):0, ((fdd.Types[drive]!=FD_Non)&&(!fdd.EMask[drive]))?1:0, (fdd.Blink[drive])?1:0); +} + + +// ----------------------------------------------------------------------- +// 初期化 +// ----------------------------------------------------------------------- +void FDD_Init(void) +{ + memset(&fdd,0 , sizeof(FDDINFO)); + fdd.Access = -1; + D88_Init(); + XDF_Init(); + DIM_Init(); +} + + +// ----------------------------------------------------------------------- +// 終了 +// ----------------------------------------------------------------------- +void FDD_Cleanup(void) +{ + D88_Cleanup(); + XDF_Cleanup(); + DIM_Cleanup(); +} + + +// ----------------------------------------------------------------------- +// りせっと +// ----------------------------------------------------------------------- +void FDD_Reset(void) +{ + int i; + FDD_SetAccess(-1); + for (i=0; i<4; i++) { + FDD_SetEMask(i, 0); + FDD_SetBlink(i, 0); + } +} + + +// ----------------------------------------------------------------------- +// FD入れ替えが起こっていたら割り込み発生 +// ----------------------------------------------------------------------- +void FDD_SetFDInt(void) +{ + int i; + for (i=0; i<4; i++) { + if ( fdd.SetDelay[i] ) { + fdd.SetDelay[i]--; + if ( fdd.SetDelay[i]<=0 ) { + if ( IOC_IntStat&2 ) IRQH_Int(1, &FDD_Int); + fdd.SetDelay[i] = 0; + } + } + } +} + + +int FDD_Seek(int drv, int trk, FDCID* id) +{ + int type; + if ( (drv<0)||(drv>3) ) return FALSE; + type = fdd.Types[drv]; + if ( Seek[type] ) + return Seek[type](drv, trk, id); + else + return FALSE; +} + +int FDD_ReadID(int drv, FDCID* id) +{ + int type; + if ( (drv<0)||(drv>3) ) return FALSE; + type = fdd.Types[drv]; + if ( ReadID[type] ) + return ReadID[type](drv, id); + else + return FALSE; +} + +int FDD_WriteID(int drv, int trk, unsigned char* buf, int num) +{ + int type; + if ( (drv<0)||(drv>3) ) return FALSE; + type = fdd.Types[drv]; + if ( WriteID[type] ) + return WriteID[type](drv, trk, buf, num); + else + return FALSE; +} + + +int FDD_Read(int drv, FDCID* id, unsigned char* buf) +{ + int type; + if ( (drv<0)||(drv>3) ) return FALSE; + type = fdd.Types[drv]; + if ( Read[type] ) + return Read[type](drv, id, buf); + else + return FALSE; +} + + +int FDD_ReadDiag(int drv, FDCID* id, FDCID* retid, unsigned char* buf) +{ + int type; + if ( (drv<0)||(drv>3) ) return FALSE; + type = fdd.Types[drv]; + if ( ReadDiag[type] ) + return ReadDiag[type](drv, id, retid, buf); + else + return FALSE; +} + + +int FDD_Write(int drv, FDCID* id, unsigned char* buf, int del) +{ + int type; + if ( (drv<0)||(drv>3) ) return FALSE; + type = fdd.Types[drv]; + if ( Write[type] ) + return Write[type](drv, id, buf, del); + else + return FALSE; +} + + +int FDD_GetCurrentID(int drv, FDCID* id) +{ + int type; + if ( (drv<0)||(drv>3) ) return FALSE; + type = fdd.Types[drv]; + if ( GetCurrentID[type] ) + return GetCurrentID[type](drv, id); + else + return FALSE; +} + + +int FDD_IsReady(int drv) +{ + if ( (drv<0)||(drv>3) ) return FALSE; + if ( (fdd.Types[drv]!=FD_Non)&&(!fdd.SetDelay[drv]) ) + return TRUE; + else + return FALSE; +} + + +int FDD_IsReadOnly(int drv) +{ + if ( (drv<0)||(drv>3) ) return FALSE; + return fdd.ROnly[drv]; +} + + +void FDD_SetReadOnly(int drv) +{ + fdd.ROnly[drv] |= 1; +} diff --git a/x68k/fdd.h b/x68k/fdd.h new file mode 100644 index 0000000..91fa24a --- /dev/null +++ b/x68k/fdd.h @@ -0,0 +1,43 @@ +#ifndef _winx68k_fdd +#define _winx68k_fdd + +#include "common.h" + +typedef struct { + BYTE c; + BYTE h; + BYTE r; + BYTE n; +} FDCID; + +enum { + FD_Non = 0, + FD_XDF, + FD_D88, + FD_DIM, +}; + +DWORD FASTCALL FDD_Int(BYTE irq); +void FDD_SetFD(int drive, char* filename, int readonly); +void FDD_EjectFD(int drive); +void FDD_Init(void); +void FDD_Cleanup(void); +void FDD_Reset(void); +void FDD_SetFDInt(void); +int FDD_Seek(int drv, int trk, FDCID* id); +int FDD_ReadID(int drv, FDCID* id); +int FDD_WriteID(int drv, int trk, unsigned char* buf, int num); +int FDD_Read(int drv, FDCID* id, unsigned char* buf); +int FDD_ReadDiag(int drv, FDCID* id, FDCID* retid, unsigned char* buf); +int FDD_Write(int drv, FDCID* id, unsigned char* buf, int del); +int FDD_IsReady(int drv); +int FDD_IsReadOnly(int drv); +int FDD_GetCurrentID(int drv, FDCID* id); +void FDD_SetReadOnly(int drv); +void FDD_SetEMask(int drive, int emask); +void FDD_SetAccess(int drive); +void FDD_SetBlink(int drive, int blink); + +#endif + + diff --git a/x68k/gvram.c b/x68k/gvram.c new file mode 100644 index 0000000..3868caa --- /dev/null +++ b/x68k/gvram.c @@ -0,0 +1,3069 @@ +// --------------------------------------------------------------------------------------- +// GVRAM.C - Graphic VRAM +// --------------------------------------------------------------------------------------- + +#include "common.h" +#include "windraw.h" +#include "winx68k.h" +#include "crtc.h" +#include "palette.h" +#include "tvram.h" +#include "gvram.h" +#include "m68000.h" +#include "memory.h" + + BYTE GVRAM[0x80000]; + WORD Grp_LineBuf[1024]; + WORD Grp_LineBufSP[1024]; // 特殊プライオリティ/半透明用バッファ + WORD Grp_LineBufSP2[1024]; // 半透明ベースプレーン用バッファ(非半透明ビット格納) + + WORD Pal16Adr[256]; // 16bit color パレットアドレス計算用 + + +// ----------------------------------------------------------------------- +// 初期化〜 +// ----------------------------------------------------------------------- +void GVRAM_Init(void) +{ + int i; + + ZeroMemory(GVRAM, 0x80000); + for (i=0; i<128; i++) // 16bit color パレットアドレス計算用 + { + Pal16Adr[i*2] = i*4; + Pal16Adr[i*2+1] = i*4+1; + } +} + + +// ----------------------------------------------------------------------------------- +// 高速クリア用ルーチン +// ----------------------------------------------------------------------------------- + +void FASTCALL GVRAM_FastClear(void) +{ + DWORD v, h; + v = ((CRTC_Regs[0x29]&4)?512:256); + h = ((CRTC_Regs[0x29]&3)?512:256); + // やっぱちゃんと範囲指定しないと変になるものもある(ダイナマイトデュークとか) +#ifdef USE_ASM + _asm + { + push ebx + push ecx + push edx + push esi + mov ax, CRTC_FastClrMask + mov ecx, v + mov esi, GrphScrollY[0] + and esi, 511 + shl esi, 10 + fclp2: + mov edx, GrphScrollX[0] + and edx, 511 + mov ebx, h + fclp: + and word ptr GVRAM[esi+edx*2], ax + inc edx + and edx, 511 + dec ebx + jne fclp + add esi, 1024 + and esi, 07fc00h + dec ecx + jne fclp2 + pop esi + pop edx + pop ecx + pop ebx + } +#elif defined(USE_GAS) && defined(__i386__) + __asm__ __volatile__ ( + "pushl %%ebx;" + "pushl %%ecx;" + "pushl %%edx;" + "pushl %%esi;" + "movw %0, %%ax;" + "movl %3, %%ecx;" + "movl %1, %%esi;" + "andl $511, %%esi;" + "shll $10, %%esi;" + ".fclp2:" + "movl %2, %%edx;" + "andl $511, %%edx;" + "movl %4, %%ebx;" + ".fclp:" + "andw %%ax, GVRAM(%%esi, %%edx, 2);" + "incl %%edx;" + "andl $511, %%edx;" + "decl %%ebx;" + "jne .fclp;" + "addl $1024, %%esi;" + "andl $0x7fc00, %%esi;" + "decl %%ecx;" + "jne .fclp2;" + "popl %%esi;" + "popl %%edx;" + "popl %%ecx;" + "popl %%ebx;" + : /* output: nothing */ + : "m" (CRTC_FastClrMask), "m" (GrphScrollY[0]), "m" (GrphScrollX[0]), + "m" (v), "m" (h) + : "eax"); +#else /* !USE_ASM && !(USE_GAS && __i386__) */ +{ + WORD *p; + DWORD x, y; + DWORD offx, offy; + + offy = (GrphScrollY[0] & 0x1ff) << 10; + for (y = 0; y < v; ++y) { + offx = GrphScrollX[0] & 0x1ff; + p = (WORD *)(GVRAM + offy + offx * 2); + + for (x = 0; x < h; ++x) { + *p++ = CRTC_FastClrMask; + offx = (offx + 1) & 0x1ff; + } + + offy = (offy + 0x400) & 0x7fc00; + } +} +#endif /* USE_ASM */ +} + + +// ----------------------------------------------------------------------- +// VRAM Read +// ----------------------------------------------------------------------- +BYTE FASTCALL GVRAM_Read(DWORD adr) +{ + BYTE ret=0; + BYTE page; + WORD *ram = (WORD*)(&GVRAM[adr&0x7fffe]); + adr ^= 1; + adr -= 0xc00000; + + if (CRTC_Regs[0x28]&8) { // 読み込み側も65536モードのVRAM配置(苦胃頭捕物帳) + if (adr<0x80000) ret = GVRAM[adr]; + } else { + switch(CRTC_Regs[0x28]&3) + { + case 0: // 16 colors + if (!(adr&1)) + { + if (CRTC_Regs[0x28]&4) // 1024dot + { + ram = (WORD*)(&GVRAM[((adr&0xff800)>>1)+(adr&0x3fe)]); + page = (BYTE)((adr>>17)&0x08); + page += (BYTE)((adr>>8)&4); + ret = (((*ram)>>page)&15); + } + else + { + page = (BYTE)((adr>>17)&0x0c); + ret = (((*ram)>>page)&15); + } + } + break; + case 1: // 256 + case 2: // Unknown + if ( adr<0x100000 ) + { + if (!(adr&1)) + { + page = (BYTE)((adr>>16)&0x08); + ret = (BYTE)((*ram)>>page); + } + } +// else +// BusErrFlag = 1; + break; + case 3: // 65536 + if (adr<0x80000) + ret = GVRAM[adr]; +// else +// BusErrFlag = 1; + break; + } + } + return ret; +} + + +// ----------------------------------------------------------------------- +// VRAM Write +// ----------------------------------------------------------------------- +void FASTCALL GVRAM_Write(DWORD adr, BYTE data) +{ + BYTE page; + int line = 1023, scr = 0; + WORD *ram = (WORD*)(&GVRAM[adr&0x7fffe]); + WORD temp; + + adr ^= 1; + adr -= 0xc00000; + + + if (CRTC_Regs[0x28]&8) // 65536モードのVRAM配置?(Nemesis) + { + if ( adr<0x80000 ) + { + GVRAM[adr] = data; + line = (((adr&0x7ffff)/1024)-GrphScrollY[0])&511; + } + } + else + { + switch(CRTC_Regs[0x28]&3) + { + case 0: // 16 colors + if (adr&1) break; + if (CRTC_Regs[0x28]&4) // 1024dot + { + ram = (WORD*)(&GVRAM[((adr&0xff800)>>1)+(adr&0x3fe)]); + page = (BYTE)((adr>>17)&0x08); + page += (BYTE)((adr>>8)&4); + temp = ((WORD)data&15)<>17)&0x0c); + temp = ((WORD)data&15)<>18)&2]; + line = (((adr&0x7ffff)>>10)-scr)&511; + TextDirtyLine[line] = 1; // 32色4面みたいな使用方法時 + scr = GrphScrollY[((adr>>18)&2)+1]; // + line = (((adr&0x7ffff)>>10)-scr)&511; // + if (adr&0x80000) adr+=1; + adr &= 0x7ffff; + GVRAM[adr] = data; + } + } +// else +// { +// BusErrFlag = 1; +// return; +// } + break; + case 3: // 65536 colors + if ( adr<0x80000 ) + { + GVRAM[adr] = data; + line = (((adr&0x7ffff)>>10)-GrphScrollY[0])&511; + } +// else +// { +// BusErrFlag = 1; +// return; +// } + break; + } + TextDirtyLine[line] = 1; + } +} + + +// ----------------------------------------------------------------------- +// こっから後はライン単位での画面展開部 +// ----------------------------------------------------------------------- +LABEL void Grp_DrawLine16(void) +{ +#ifdef USE_ASM + __asm { + pushf + cld + push es + mov ax, ds + mov es, ax + push ebx + push esi + push edi + mov esi, GrphScrollY[0] + add esi, VLINE + mov al, CRTC_Regs[0x29] + and al, 1ch + cmp al, 1ch + jne gp16linenotspecial + add esi, VLINE + gp16linenotspecial: + and esi, 511 + shl esi, 10 + mov ebx, GrphScrollX[0] + and ebx, 511 + lea esi, GVRAM[esi+ebx*2] + xor ebx, 511 + inc bx + mov ecx, TextDotX + mov edi, offset Grp_LineBuf + xor eax, eax + xor edx, edx + cmp ecx, ebx + jbe gp16linelp_b + sub ecx, ebx + gp16linelp_a: + lodsw + or ax, ax + je gp16linelp_a_skip + mov dl, ah + mov ah, 0 + mov dh, 0 + mov ax, word ptr Pal16Adr[eax*2] + mov dx, word ptr Pal16Adr[edx*2] + mov al, byte ptr Pal_Regs[eax] + mov ah, byte ptr Pal_Regs[edx+2] + mov ax, word ptr Pal16[eax*2] +;or ax, Ibit ; 20010120 + gp16linelp_a_skip: + stosw + dec bx + jnz gp16linelp_a + sub esi, 400h + gp16linelp_b: + lodsw + or ax, ax + je gp16linelp_b_skip + mov dl, ah + mov ah, 0 + mov dh, 0 + mov ax, word ptr Pal16Adr[eax*2] + mov dx, word ptr Pal16Adr[edx*2] + mov al, byte ptr Pal_Regs[eax] + mov ah, byte ptr Pal_Regs[edx+2] + mov ax, word ptr Pal16[eax*2] +;or ax, Ibit ; 20010120 + gp16linelp_b_skip: + stosw + loop gp16linelp_b + pop edi + pop esi + pop ebx + pop es + popf + ret + } +#elif defined(USE_GAS) && defined(__i386__) + __asm__ __volatile__ ( + "pushf;" + "cld;" + +#if 0 /* まあ、同じセグメント差してる筈だし… */ + "pushl %%es;" + + "movw %%ds, %%ax;" + "movw %%ax, %%es;" +#endif + "pushl %%ebx;" + "pushl %%esi;" + "pushl %%edi;" + "movl %0, %%esi;" + "addl %1, %%esi;" + "movb %2, %%al;" + "andb $0x1c, %%al;" + "cmpb $0x1c, %%al;" + "jne .gp16linenotspecial;" + "addl %1, %%esi;" + ".gp16linenotspecial:" + "andl $511, %%esi;" + "shll $10, %%esi;" + "movl %3, %%ebx;" + "andl $511, %%ebx;" + "leal GVRAM(%%esi, %%ebx, 2), %%esi;" + "xorl $511, %%ebx;" + "incw %%bx;" + "movl %4, %%ecx;" + "movl %5, %%edi;" + "xorl %%eax, %%eax;" + "xorl %%edx, %%edx;" + "cmpl %%ebx, %%ecx;" + "jbe .gp16linelp_b;" + "subl %%ebx, %%ecx;" + ".gp16linelp_a:" + "lodsw;" + "orw %%ax, %%ax;" + "je .gp16linelp_a_skip;" + "movb %%ah, %%dl;" + "movb $0, %%ah;" + "movb $0, %%dh;" + "movw Pal16Adr(, %%eax, 2), %%ax;" + "movw Pal16Adr(, %%edx, 2), %%dx;" + "movb Pal_Regs(%%eax), %%al;" + "movb Pal_Regs + 2(%%edx), %%ah;" + "movw Pal16(, %%eax, 2), %%ax;" + ".gp16linelp_a_skip:" + "stosw;" + "decw %%bx;" + "jnz .gp16linelp_a;" + "subl $0x400, %%esi;" + ".gp16linelp_b:" + "lodsw;" + "orw %%ax, %%ax;" + "je .gp16linelp_b_skip;" + "movb %%ah, %%dl;" + "movb $0, %%ah;" + "movb $0, %%dh;" + "movw Pal16Adr(, %%eax, 2), %%ax;" + "movw Pal16Adr(, %%edx, 2), %%dx;" + "movb Pal_Regs(%%eax), %%al;" + "movb Pal_Regs + 2(%%edx), %%ah;" + "movw Pal16(, %%eax, 2), %%ax;" + ".gp16linelp_b_skip:" + "stosw;" + "loop .gp16linelp_b;" + +#if 0 /* まあ、同じセグメント差してる筈だし… */ + "popl %%es;" +#endif + "popl %%edi;" + "popl %%esi;" + "popl %%ebx;" + "popf;" + : /* output: nothing */ + : "m" (GrphScrollY[0]), "m" (VLINE), "m" (CRTC_Regs[0x29]), + "m" (GrphScrollX[0]), "m" (TextDotX), "g" (Grp_LineBuf) + : "ax", "cx", "dx"); +#else /* !USE_ASM && !(USE_GAS && __i386__) */ + WORD *srcp, *destp; + DWORD x, y; + DWORD i; + WORD v, v0; + + y = GrphScrollY[0] + VLINE; + if ((CRTC_Regs[0x29] & 0x1c) == 0x1c) + y += VLINE; + y = (y & 0x1ff) << 10; + + x = GrphScrollX[0] & 0x1ff; + srcp = (WORD *)(GVRAM + y + x * 2); + destp = (WORD *)Grp_LineBuf; + + x = (x ^ 0x1ff) + 1; + + v = v0 = 0; + i = 0; + if (x < TextDotX) { + for (; i < x; ++i) { + v = *srcp++; + if (v != 0) { + v0 = (v >> 8) & 0xff; + v &= 0x00ff; + + v = Pal_Regs[Pal16Adr[v]]; + v |= Pal_Regs[Pal16Adr[v0] + 2] << 8; + v = Pal16[v]; + } + *destp++ = v; + } + srcp -= 0x200; + } + + for (; i < TextDotX; ++i) { + v = *srcp++; + if (v != 0) { + v0 = (v >> 8) & 0xff; + v &= 0x00ff; + + v = Pal_Regs[Pal16Adr[v]]; + v |= Pal_Regs[Pal16Adr[v0] + 2] << 8; + v = Pal16[v]; + } + *destp++ = v; + } +#endif /* USE_ASM */ +} + + +LABEL void FASTCALL Grp_DrawLine8(int page, int opaq) +{ +#ifdef USE_ASM + __asm { + pushf + cld + push ebx + push ecx + push esi + push edi + + and ecx, 1 // ecx = page + mov esi, GrphScrollY[ecx*8] + mov edi, GrphScrollY[ecx*8+4] + add esi, VLINE + add edi, VLINE + mov al, CRTC_Regs[0x29] + and al, 1ch + cmp al, 1ch + jne gp8linenotspecial + add esi, VLINE + add edi, VLINE + gp8linenotspecial: + and esi, 511 + shl esi, 10 + add esi, ecx + and edi, 511 + shl edi, 10 + add edi, ecx + mov ebx, GrphScrollX[ecx*8+4] + and ebx, 511 + add edi, ebx + add edi, ebx + mov ebx, GrphScrollX[ecx*8] + and ebx, 511 + lea esi, GVRAM[esi+ebx*2] + xor ebx, 511 + inc bx + + xor eax, eax + mov ecx, TextDotX + + or edx, edx // edx = opaq + mov edx, offset Grp_LineBuf + je gp8linelp + + cmp ecx, ebx + jbe gp8olinelp_b + sub ecx, ebx + + gp8olinelp_a: + lodsw + mov ah, byte ptr GVRAM[edi] + and ah, 0f0h + and al, 0fh + or al, ah + mov ah, 0 +;or al,al + mov ax, word ptr GrphPal[eax*2] +;jz gp8noti_a +;or ax, Ibit ; 20010120 +;gp8noti_a: + mov [edx], ax + add edx, 2 + add edi, 2 + test di, 03feh + jnz gp8onotxend1 + sub edi, 0400h + gp8onotxend1: + dec bx + jnz gp8olinelp_a + sub esi, 400h + gp8olinelp_b: + lodsw + mov ah, byte ptr GVRAM[edi] + and ah, 0f0h + and al, 0fh + or al, ah + mov ah, 0 +;or al,al + mov ax, word ptr GrphPal[eax*2] +;jz gp8noti_b +;or ax, Ibit ; 20010120 +;gp8noti_b: + mov [edx], ax + add edx, 2 + add edi, 2 + test di, 03feh + jnz gp8onotxend2 + sub edi, 0400h + gp8onotxend2: + loop gp8olinelp_b + + pop edi + pop esi + pop ecx + pop ebx + popf + ret + + gp8linelp: + cmp ecx, ebx + jbe gp8linelp_b + sub ecx, ebx + gp8linelp_a: + lodsw + mov ah, byte ptr GVRAM[edi] + and ah, 0f0h + and al, 0fh + or al, ah + and ax, 00ffh + jz gp8lineskip_a + mov ax, word ptr GrphPal[eax*2] +;or ax, Ibit ; 20010120 + mov [edx], ax + gp8lineskip_a: + add edx, 2 + add edi, 2 + test di, 03feh + jnz gp8notxend1 + sub edi, 0400h + gp8notxend1: + dec bx + jnz gp8linelp_a + sub esi, 400h + gp8linelp_b: + lodsw + mov ah, byte ptr GVRAM[edi] + and ah, 0f0h + and al, 0fh + or al, ah + and ax, 00ffh + jz gp8lineskip_b + mov ax, word ptr GrphPal[eax*2] +;or ax, Ibit ; 20010120 + mov [edx], ax + gp8lineskip_b: + add edx, 2 + add edi, 2 + test di, 03feh + jnz gp8notxend2 + sub edi, 0400h + gp8notxend2: + loop gp8linelp_b + + pop edi + pop esi + pop ecx + pop ebx + popf + ret + } +#elif defined(USE_GAS) && defined(__i386__) + __asm__ __volatile__ ( + "pushf;" + "cld;" + "pushl %%ebx;" + "pushl %%ecx;" + "pushl %%esi;" + "pushl %%edi;" + + "movl %0, %%ecx;" // page + "movl %1, %%edx;" // opaq + + "andl $1, %%ecx;" // ecx = page + "movl GrphScrollY(, %%ecx, 8), %%esi;" + "movl GrphScrollY + 4(, %%ecx, 8), %%edi;" + "addl %2, %%esi;" + "addl %2, %%edi;" + "movb %3, %%al;" + "andb $0x1c, %%al;" + "cmpb $0x1c, %%al;" + "jne .gp8linenotspecial;" + "addl %2, %%esi;" + "addl %2, %%edi;" + ".gp8linenotspecial:" + "andl $511, %%esi;" + "shll $10, %%esi;" + "addl %%ecx, %%esi;" + "andl $511, %%edi;" + "shll $10, %%edi;" + "addl %%ecx, %%edi;" + "movl GrphScrollX + 4(, %%ecx, 8), %%ebx;" + "andl $511, %%ebx;" + "addl %%ebx, %%edi;" + "addl %%ebx, %%edi;" + "movl GrphScrollX(, %%ecx, 8), %%ebx;" + "andl $511, %%ebx;" + "leal GVRAM(%%esi, %%ebx, 2), %%esi;" + "xorl $511, %%ebx;" + "incw %%bx;" + + "xorl %%eax, %%eax;" + "movl %4, %%ecx;" + + "orl %%edx, %%edx;" // edx = opaq + "movl %5, %%edx;" + "je .gp8linelp;" + + "cmpl %%ebx, %%ecx;" + "jbe .gp8olinelp_b;" + "subl %%ebx, %%ecx;" + + ".gp8olinelp_a:" + "lodsw;" + "movb GVRAM(%%edi), %%ah;" + "andb $0xf0, %%ah;" + "andb $0x0f, %%al;" + "orb %%ah, %%al;" + "movb $0, %%ah;" + "movw GrphPal(, %%eax, 2), %%ax;" + "movw %%ax, (%%edx);" + "addl $2, %%edx;" + "addl $2, %%edi;" + "testw $0x3fe, %%di;" + "jnz .gp8onotxend1;" + "subl $0x400, %%edi;" + ".gp8onotxend1:" + "decw %%bx;" + "jnz .gp8olinelp_a;" + "subl 0x400, %%esi;" + ".gp8olinelp_b:" + "lodsw;" + "movb GVRAM(%%edi), %%ah;" + "andb $0xf0, %%ah;" + "andb $0x0f, %%al;" + "orb %%ah, %%al;" + "movb $0, %%ah;" + "movw GrphPal(, %%eax, 2), %%ax;" + "movw %%ax, (%%edx);" + "addl $2, %%edx;" + "addl $2, %%edi;" + "testw $0x3fe, %%di;" + "jnz .gp8onotxend2;" + "subl $0x400, %%edi;" + ".gp8onotxend2:" + "loop .gp8olinelp_b;" + "jmp .gp8end;" + + ".gp8linelp:" + "cmpl %%ebx, %%ecx;" + "jbe .gp8linelp_b;" + "subl %%ebx, %%ecx;" + ".gp8linelp_a:" + "lodsw;" + "movb GVRAM(%%edi), %%ah;" + "andb $0xf0, %%ah;" + "andb $0x0f, %%al;" + "orb %%ah, %%al;" + "andw $0xff, %%ax;" + "jz .gp8lineskip_a;" + "movw GrphPal(, %%eax, 2), %%ax;" + "movw %%ax, (%%edx);" + ".gp8lineskip_a:" + "addl $2, %%edx;" + "addl $2, %%edi;" + "testw $0x3fe, %%di;" + "jnz .gp8notxend1;" + "subl $0x400, %%edi;" + ".gp8notxend1:" + "decw %%bx;" + "jnz .gp8linelp_a;" + "subl $0x400, %%esi;" + ".gp8linelp_b:" + "lodsw;" + "movb GVRAM(%%edi), %%ah;" + "andb $0xf0, %%ah;" + "andb $0x0f, %%al;" + "orb %%ah, %%al;" + "andw $0xff, %%ax;" + "jz .gp8lineskip_b;" + "movw GrphPal(, %%eax, 2), %%ax;" + "movw %%ax, (%%edx);" + ".gp8lineskip_b:" + "addl $2, %%edx;" + "addl $2, %%edi;" + "testw $0x3fe, %%di;" + "jnz .gp8notxend2;" + "subl $0x400, %%edi;" + ".gp8notxend2:" + "loop .gp8linelp_b;" + + ".gp8end:" + "popl %%edi;" + "popl %%esi;" + "popl %%ecx;" + "popl %%ebx;" + "popf;" + : /* output: nothing */ + : "m" (page), "m" (opaq), "m" (VLINE), "m" (CRTC_Regs[0x29]), + "m" (TextDotX), "g" (Grp_LineBuf) + : "ax", "dx"); +#else /* !USE_ASM && !(USE_GAS && __i386__) */ + WORD *srcp, *destp; + DWORD x, x0; + DWORD y, y0; + DWORD off; + DWORD i; + WORD v; + + page &= 1; + + y = GrphScrollY[page * 2] + VLINE; + y0 = GrphScrollY[page * 2 + 1] + VLINE; + if ((CRTC_Regs[0x29] & 0x1c) == 0x1c) { + y += VLINE; + y0 += VLINE; + } + y = ((y & 0x1ff) << 10) + page; + y0 = ((y0 & 0x1ff) << 10) + page; + + x = GrphScrollX[page * 2] & 0x1ff; + x0 = GrphScrollX[page * 2 + 1] & 0x1ff; + + off = y0 + x0 * 2; + srcp = (WORD *)(GVRAM + y + x * 2); + destp = (WORD *)Grp_LineBuf; + + x = (x ^ 0x1ff) + 1; + + v = 0; + i = 0; + + if (opaq) { + if (x < TextDotX) { + for (; i < x; ++i) { + v = *srcp++; + v = GrphPal[(GVRAM[off] & 0xf0) | (v & 0x0f)]; + *destp++ = v; + + off += 2; + if ((off & 0x3fe) == 0x000) + off -= 0x400; + } + srcp -= 0x200; + } + + for (; i < TextDotX; ++i) { + v = *srcp++; + v = GrphPal[(GVRAM[off] & 0xf0) | (v & 0x0f)]; + *destp++ = v; + + off += 2; + if ((off & 0x3fe) == 0x000) + off -= 0x400; + } + } else { + if (x < TextDotX) { + for (; i < x; ++i) { + v = *srcp++; + v = (GVRAM[off] & 0xf0) | (v & 0x0f); + if (v != 0x00) + *destp = GrphPal[v]; + destp++; + + off += 2; + if ((off & 0x3fe) == 0x000) + off -= 0x400; + } + srcp -= 0x200; + } + + for (; i < TextDotX; ++i) { + v = *srcp++; + v = (GVRAM[off] & 0xf0) | (v & 0x0f); + if (v != 0x00) + *destp = GrphPal[v]; + destp++; + + off += 2; + if ((off & 0x3fe) == 0x000) + off -= 0x400; + } + } +#endif /* USE_ASM */ +} + + // Manhattan Requiem Opening 7.0→7.5MHz +LABEL void FASTCALL Grp_DrawLine4(DWORD page, int opaq) +{ +#ifdef USE_ASM + __asm { + pushf + cld + push ebx + push ecx + push esi + and ecx, 3 + mov esi, GrphScrollY[ecx*4] + add esi, VLINE + mov al, CRTC_Regs[0x29] + and al, 1ch + cmp al, 1ch + jne gp4linenotspecial + add esi, VLINE + gp4linenotspecial: + and esi, 511 + shl esi, 10 + mov ebx, GrphScrollX[ecx*4] + and ebx, 511 + lea esi, [esi+ebx*2] + xor ebx, 511 + inc bx + xor eax, eax + + shr cl, 1 + lea esi, GVRAM[esi+ecx] // ecx = page/2 + jnc gp4olinepage0 // (shr cl,1) page0or2 + + mov ecx, TextDotX + or edx, edx + mov edx, offset Grp_LineBuf + jz gp4linelp2 // opaq == 0 + + cmp ecx, ebx + jbe gp4olinelp2_b + sub ecx, ebx + gp4olinelp2_a: + lodsw + mov ah, 0 + shr al, 4 + mov ax, word ptr GrphPal[eax*2] + mov [edx], ax + add edx, 2 + dec bx + jnz gp4olinelp2_a + sub esi, 400h + gp4olinelp2_b: + lodsw + mov ah, 0 + shr al, 4 + mov ax, word ptr GrphPal[eax*2] + mov [edx], ax + add edx, 2 + loop gp4olinelp2_b + pop esi + pop ecx + pop ebx + popf + ret + + gp4linelp2: + cmp ecx, ebx + jbe gp4linelp2_b + sub ecx, ebx + gp4linelp2_a: + lodsw + mov ah, 0 + shr al, 4 // shrのZFは確認済 + jz gp4lineskip2_a + mov ax, word ptr GrphPal[eax*2] + mov [edx], ax + gp4lineskip2_a: + add edx, 2 + dec bx + jnz gp4linelp2_a + sub esi, 400h + gp4linelp2_b: + lodsw + mov ah, 0 + shr al, 4 // shrのZFは確認済 + jz gp4lineskip2_b + mov ax, word ptr GrphPal[eax*2] + mov [edx], ax + gp4lineskip2_b: + add edx, 2 + loop gp4linelp2_b + pop esi + pop ecx + pop ebx + popf + ret + + gp4olinepage0: + mov ecx, TextDotX + or edx, edx + mov edx, offset Grp_LineBuf + jz gp4linelp // opaq == 0 + + cmp ecx, ebx + jbe gp4olinelp_b + sub ecx, ebx + gp4olinelp_a: + lodsw + and ax, 15 + mov ax, word ptr GrphPal[eax*2] + mov [edx], ax + add edx, 2 + dec bx + jnz gp4olinelp_a + sub esi, 400h + gp4olinelp_b: + lodsw + and ax, 15 + mov ax, word ptr GrphPal[eax*2] + mov [edx], ax + add edx, 2 + loop gp4olinelp_b + pop esi + pop ecx + pop ebx + popf + ret + + gp4linelp: + cmp ecx, ebx + jbe gp4linelp_b + sub ecx, ebx + gp4linelp_a: + lodsw + and ax, 15 + jz gp4lineskip_a + mov ax, word ptr GrphPal[eax*2] + mov [edx], ax + gp4lineskip_a: + add edx, 2 + dec bx + jnz gp4linelp_a + sub esi, 400h + gp4linelp_b: + lodsw + and ax, 15 + jz gp4lineskip_b + mov ax, word ptr GrphPal[eax*2] + mov [edx], ax + gp4lineskip_b: + add edx, 2 + loop gp4linelp_b + pop esi + pop ecx + pop ebx + popf + ret + } +#elif defined(USE_GAS) && defined(__i386__) + __asm__ __volatile__ ( + "pushf;" + "cld;" + "pushl %%ebx;" + "pushl %%ecx;" + "pushl %%esi;" + "pushl %%edi;" + + "movl %0, %%ecx;" // page + "movl %1, %%edx;" // opaq + + "andl $3, %%ecx;" // ecx = page + "movl GrphScrollY(, %%ecx, 4), %%esi;" + "addl %2, %%esi;" + "movb %3, %%al;" + "andb $0x1c, %%al;" + "cmpb $0x1c, %%al;" + "jne .gp4linenotspecial;" + "addl %2, %%esi;" + ".gp4linenotspecial:" + "andl $511, %%esi;" + "shll $10, %%esi;" + "movl GrphScrollX(, %%ecx, 4), %%ebx;" + "andl $511, %%ebx;" + "leal (%%esi, %%ebx, 2), %%esi;" + "xorl $511, %%ebx;" + "incw %%bx;" + "xorl %%eax, %%eax;" + + "shrb $1, %%cl;" + "leal GVRAM(%%esi, %%ecx), %%esi;" // ecx = page/2 + "jnc .gp4olinepage0;" // (shr cl,1) page0or2 + + "movl %4, %%ecx;" + "orl %%edx, %%edx;" + "movl %5, %%edx;" + "jz .gp4linelp2;" // opaq == 0 + + "cmpl %%ebx, %%ecx;" + "jbe .gp4olinelp2_b;" + "subl %%ebx, %%ecx;" + ".gp4olinelp2_a:" + "lodsw;" + "movb $0, %%ah;" + "shrb $4, %%al;" + "movw GrphPal(, %%eax, 2), %%ax;" + "movw %%ax, (%%edx);" + "addl $2, %%edx;" + "decw %%bx;" + "jnz .gp4olinelp2_a;" + "subl $0x400, %%esi;" + ".gp4olinelp2_b:" + "lodsw;" + "movb $0, %%ah;" + "shrb $4, %%al;" + "movw GrphPal(, %%eax, 2), %%ax;" + "movw %%ax, (%%edx);" + "addl $2, %%edx;" + "loop .gp4olinelp2_b;" + "jmp .gp4end;" + + ".gp4linelp2:" + "cmpl %%ebx, %%ecx;" + "jbe .gp4linelp2_b;" + "subl %%ebx, %%ecx;" + ".gp4linelp2_a:" + "lodsw;" + "movb $0, %%ah;" + "shrb $4, %%al;" // shrのZFは確認済 + "jz .gp4lineskip2_a;" + "movw GrphPal(, %%eax, 2), %%ax;" + "movw %%ax, (%%edx);" + ".gp4lineskip2_a:" + "addl $2, %%edx;" + "decw %%bx;" + "jnz .gp4linelp2_a;" + "subl $0x400, %%esi;" + ".gp4linelp2_b:" + "lodsw;" + "movb $0,%%ah;" + "shrb $4, %%al;" // shrのZFは確認済 + "jz .gp4lineskip2_b;" + "movw GrphPal(, %%eax, 2), %%ax;" + "movw %%ax, (%%edx);" + ".gp4lineskip2_b:" + "addl $2, %%edx;" + "loop .gp4linelp2_b;" + "jmp .gp4end;" + + ".gp4olinepage0:" + "movl (%4), %%ecx;" + "orl %%edx, %%edx;" + "movl %5, %%edx;" + "jz .gp4linelp;" // opaq == 0 + + "cmpl %%ebx, %%ecx;" + "jbe .gp4olinelp_b;" + "subl %%ebx, %%ecx;" + ".gp4olinelp_a:" + "lodsw;" + "andw $15, %%ax;" + "movw GrphPal(, %%eax, 2), %%ax;" + "movw %%ax, (%%edx);" + "addl $2, %%edx;" + "decw %%bx;" + "jnz .gp4olinelp_a;" + "subl $0x400, %%esi;" + ".gp4olinelp_b:" + "lodsw;" + "andw $15, %%ax;" + "movw GrphPal(, %%eax, 2), %%ax;" + "movw %%ax, (%%edx);" + "addl $2, %%edx;" + "loop .gp4olinelp_b;" + "jmp .gp4end;" + + ".gp4linelp:" + "cmpl %%ebx, %%ecx;" + "jbe .gp4linelp_b;" + "subl %%ebx, %%ecx;" + ".gp4linelp_a:" + "lodsw;" + "andw $15, %%ax;" + "jz .gp4lineskip_a;" + "movw GrphPal(, %%eax, 2), %%ax;" + "movw %%ax, (%%edx);" + ".gp4lineskip_a:" + "addl $2, %%edx;" + "decw %%bx;" + "jnz .gp4linelp_a;" + "subl $0x400, %%esi;" + ".gp4linelp_b:" + "lodsw;" + "andw $15, %%ax;" + "jz .gp4lineskip_b;" + "movw GrphPal(, %%eax, 2), %%ax;" + "movw %%ax, (%%edx);" + ".gp4lineskip_b:" + "addl $2, %%edx;" + "loop .gp4linelp_b;" + + ".gp4end:" + "popl %%edi;" + "popl %%esi;" + "popl %%ecx;" + "popl %%ebx;" + "popf;" + : /* output: nothing */ + : "m" (page), "m" (opaq), "m" (VLINE), "m" (CRTC_Regs[0x29]), + "m" (TextDotX), "g" (Grp_LineBuf) + : "ax", "dx"); +#else /* !USE_ASM && !(USE_GAS && __i386__) */ + WORD *srcp, *destp; // XXX: ALIGN + DWORD x, y; + DWORD off; + DWORD i; + WORD v; + + page &= 3; + + y = GrphScrollY[page] + VLINE; + if ((CRTC_Regs[0x29] & 0x1c) == 0x1c) + y += VLINE; + y = (y & 0x1ff) << 10; + + x = GrphScrollX[page] & 0x1ff; + off = y + x * 2; + + x ^= 0x1ff; + + srcp = (WORD *)(GVRAM + off + (page >> 1)); + destp = (WORD *)Grp_LineBuf; + + v = 0; + i = 0; + + if (page & 1) { + if (opaq) { + if (x < TextDotX) { + for (; i < x; ++i) { + v = *srcp++; + v = GrphPal[(v >> 4) & 0xf]; + *destp++ = v; + } + srcp -= 0x200; + } + for (; i < TextDotX; ++i) { + v = *srcp++; + v = GrphPal[(v >> 4) & 0xf]; + *destp++ = v; + } + } else { + if (x < TextDotX) { + for (; i < x; ++i) { + v = *srcp++; + v = (v >> 4) & 0x0f; + if (v != 0x00) + *destp = GrphPal[v]; + destp++; + } + srcp -= 0x200; + } + for (; i < TextDotX; ++i) { + v = *srcp++; + v = (v >> 4) & 0x0f; + if (v != 0x00) + *destp = GrphPal[v]; + destp++; + } + } + } else { + if (opaq) { + if (x < TextDotX) { + for (; i < x; ++i) { + v = *srcp++; + v = GrphPal[v & 0x0f]; + *destp++ = v; + } + srcp -= 0x200; + } + for (; i < TextDotX; ++i) { + v = *srcp++; + v = GrphPal[v & 0x0f]; + *destp++ = v; + } + } else { + if (x < TextDotX) { + for (; i < x; ++i) { + v = *srcp++; + v &= 0x0f; + if (v != 0x00) + *destp = GrphPal[v]; + destp++; + } + srcp -= 0x200; + } + for (; i < TextDotX; ++i) { + v = *srcp++; + v &= 0x0f; + if (v != 0x00) + *destp = GrphPal[v]; + destp++; + } + } + } +#endif /* USE_ASM */ +} + + // この画面モードは勘弁して下さい… +void FASTCALL Grp_DrawLine4h(void) +{ +#ifdef USE_ASM + __asm + { + push esi + push edi + mov esi, GrphScrollY[0] + add esi, VLINE + mov al, CRTC_Regs[0x29] + and al, 1ch + cmp al, 1ch + jne gp4hlinenotspecial + add esi, VLINE + gp4hlinenotspecial: + and esi, 1023 + test esi, 512 + jnz gp4h_plane23 + shl esi, 10 + mov edx, GrphScrollX[0] + mov edi, edx + and edx, 511 + add esi, edx + add esi, edx + mov cl, 00h + test edi, 512 + jz gp4h_main + add cl, 4 + jmp gp4h_main + gp4h_plane23: + and esi, 511 + shl esi, 10 + mov edx, GrphScrollX[0] + mov edi, edx + and edx, 511 + add esi, edx + add esi, edx + mov cl, 08h + test edi, 512 + jz gp4h_main + add cl, 4 + gp4h_main: + and edi, 511 + xor di, 511 + inc di + //and di, 512 + mov ebx, TextDotX + xor edx, edx + gp4hlinelp: + mov ax, word ptr GVRAM[esi] + shr ax, cl + and eax, 15 + mov ax, word ptr GrphPal[eax*2] + mov Grp_LineBuf[edx], ax + add esi, 2 + add edx, 2 + dec di + jnz gp4hline_cnt + sub esi, 0400h + xor cl, 4 + mov di, 512 + gp4hline_cnt: + dec bx + jnz gp4hlinelp +// loop gp4hlinelp + pop edi + pop esi + } +#elif defined(USE_GAS) && defined(__i386__) + __asm__ __volatile__ ( + "pushl %%esi;" + "pushl %%edi;" + "movl %0, %%esi;" + "addl %1, %%esi;" + "movb %2, %%al;" + "andb $0x1c, %%al;" + "cmpb $0x1c, %%al;" + "jne .gp4hlinenotspecial;" + "addl %1, %%esi;" + ".gp4hlinenotspecial:" + "andl $1023, %%esi;" + "testl $512, %%esi;" + "jnz .gp4h_plane23;" + "shll $10, %%esi;" + "movl %3, %%edx;" + "movl %%edx, %%edi;" + "andl $511, %%edx;" + "addl %%edx, %%esi;" + "addl %%edx, %%esi;" + "movb $0, %%cl;" + "testl $512, %%edi;" + "jz .gp4h_main;" + "addb $4, %%cl;" + "jmp .gp4h_main;" + ".gp4h_plane23:" + "andl $511, %%esi;" + "shll $10, %%esi;" + "movl %3, %%edx;" + "movl %%edx, %%edi;" + "andl $511, %%edx;" + "addl %%edx, %%esi;" + "addl %%edx, %%esi;" + "movb $0x08, %%cl;" + "testl $512, %%edi;" + "jz .gp4h_main;" + "addb $4, %%cl;" + ".gp4h_main:" + "andl $511, %%edi;" + "xorw $511, %%di;" + "incw %%di;" + "movl %4, %%ebx;" + "xorl %%edx, %%edx;" + ".gp4hlinelp:" + "movw GVRAM(%%esi), %%ax;" + "shrw %%cl, %%ax;" + "andl $15, %%eax;" + "movw GrphPal(, %%eax, 2), %%ax;" + "movw %%ax, Grp_LineBuf(%%edx);" + "addl $2, %%esi;" + "addl $2, %%edx;" + "decw %%di;" + "jnz .gp4hline_cnt;" + "subl $0x400, %%esi;" + "xorb $4, %%cl;" + "movw $512, %%di;" + ".gp4hline_cnt:" + "decw %%bx;" + "jnz .gp4hlinelp;" + "popl %%edi;" + "popl %%esi;" + : /* output: nothing */ + : "m" (GrphScrollY[0]), "m" (VLINE), "m" (CRTC_Regs[0x29]), + "m" (GrphScrollX[0]), "m" (TextDotX) + : "ax", "bx", "cx", "dx"); +#else /* !USE_ASM && !(USE_GAS && __i386__) */ + WORD *srcp, *destp; + DWORD x, y; + DWORD i; + WORD v; + int bits; + + y = GrphScrollY[0] + VLINE; + if ((CRTC_Regs[0x29] & 0x1c) == 0x1c) + y += VLINE; + y &= 0x3ff; + + if ((y & 0x200) == 0x000) { + y <<= 10; + bits = (GrphScrollX[0] & 0x200) ? 4 : 0; + } else { + y = (y & 0x1ff) << 10; + bits = (GrphScrollX[0] & 0x200) ? 12 : 8; + } + + x = GrphScrollX[0] & 0x1ff; + x = ((x & 0x1ff) ^ 0x1ff) + 1; + + srcp = (WORD *)(GVRAM + y + x * 2); + destp = (WORD *)Grp_LineBuf; + + for (i = 0; i < TextDotX; ++i) { + v = *srcp++; + *destp++ = GrphPal[(v >> bits) & 0x0f]; + + if (--x == 0) { + bits ^= 4; + x = 512; + } + } +#endif /* !USE_ASM */ +} + + +// ------------------------------------------------- +// --- 半透明/特殊Priのベースとなるページの描画 --- +// ------------------------------------------------- +void FASTCALL Grp_DrawLine16SP(void) +{ +#ifdef USE_ASM + __asm + { + push edi + push esi + mov edi, 0 + mov esi, GrphScrollY[0] + add esi, VLINE + mov al, CRTC_Regs[0x29] + and al, 1ch + cmp al, 1ch + jne gp16splinenotspecial + add esi, VLINE + gp16splinenotspecial: + and esi, 511 + shl esi, 10 + mov ebx, GrphScrollX[0] + and ebx, 511 + add esi, ebx + add esi, ebx + xor ebx, 511 + inc ebx + mov ecx, TextDotX + xor edx, edx + gp16splinelp: + movzx eax, byte ptr GVRAM[esi+1] + mov dh, byte ptr Pal_Regs[eax*2] + movzx eax, byte ptr GVRAM[esi] + mov dl, byte ptr Pal_Regs[eax*2+1] + test al, 1 + jnz gp16splinesp + and dx, 0fffeh + mov ax, word ptr Pal16[edx*2] + mov word ptr Grp_LineBufSP[edi], 0 + mov Grp_LineBufSP2[edi], ax + jmp gp16splineskip + gp16splinesp: + and dx, 0fffeh + mov ax, word ptr Pal16[edx*2] + mov word ptr Grp_LineBufSP2[edi], 0 + mov word ptr Grp_LineBufSP[edi], ax + gp16splineskip: + add esi, 2 + add edi, 2 + dec ebx + jnz gp16spline_cnt + sub esi, 0400h + gp16spline_cnt: +// dec cx +// jnz gp16splinelp + loop gp16splinelp + pop esi + pop edi + } +#elif defined(USE_GAS) && defined(__i386__) + __asm__ __volatile__ ( + "pushl %%edi;" + "pushl %%esi;" + "movl $0, %%edi;" + "movl %0, %%esi;" + "addl %1, %%esi;" + "movb %2, %%al;" + "andb $0x1c, %%al;" + "cmpb $0x1c, %%al;" + "jne .gp16splinenotspecial;" + "addl %1, %%esi;" + ".gp16splinenotspecial:" + "andl $511, %%esi;" + "shll $10, %%esi;" + "movl %3, %%ebx;" + "andl $511, %%ebx;" + "addl %%ebx, %%esi;" + "addl %%ebx, %%esi;" + "xorl $511, %%ebx;" + "incl %%ebx;" + "movl %4, %%ecx;" + "xorl %%edx, %%edx;" + ".gp16splinelp:" + "movzbl GVRAM + 1(%%esi), %%eax;" + "movb Pal_Regs(, %%eax, 2), %%dh;" + "movzbl GVRAM(%%esi), %%eax;" + "movb Pal_Regs + 1(, %%eax, 2), %%dl;" + "testb $1, %%al;" + "jnz .gp16splinesp;" + "andw $0xfffe, %%dx;" + "movw Pal16(, %%edx, 2), %%ax;" + "movw $0, Grp_LineBufSP(%%edi);" + "movw %%ax, Grp_LineBufSP2(%%edi);" + "jmp .gp16splineskip;" + ".gp16splinesp:" + "andw $0xfffe, %%dx;" + "movw Pal16(, %%edx, 2), %%ax;" + "movw $0, Grp_LineBufSP2(%%edi);" + "movw %%ax, Grp_LineBufSP(%%edi);" + ".gp16splineskip:" + "addl $2, %%esi;" + "addl $2, %%edi;" + "decl %%ebx;" + "jnz .gp16spline_cnt;" + "subl $0x0400, %%esi;" + ".gp16spline_cnt:" + "loop .gp16splinelp;" + "popl %%esi;" + "popl %%edi;" + : /* output: nothing */ + : "m" (GrphScrollY[0]), "m" (VLINE), "m" (CRTC_Regs[0x29]), + "m" (GrphScrollX[0]), "m" (TextDotX) + : "ax", "bx", "cx", "dx"); +#else /* !USE_ASM && !(USE_GAS && __i386__) */ + DWORD x, y; + DWORD off; + DWORD i; + WORD v; + + y = GrphScrollY[0] + VLINE; + if ((CRTC_Regs[0x29] & 0x1c) == 0x1c) + y += VLINE; + y = (y & 0x1ff) << 10; + + x = GrphScrollX[0] & 0x1ff; + off = y + x * 2; + x = (x ^ 0x1ff) + 1; + + for (i = 0; i < TextDotX; ++i) { + v = (Pal_Regs[GVRAM[off+1]*2] << 8) | Pal_Regs[GVRAM[off]*2+1]; + if ((GVRAM[off] & 1) == 0) { + Grp_LineBufSP[i] = 0; + Grp_LineBufSP2[i] = Pal16[v & 0xfffe]; + } else { + Grp_LineBufSP[i] = Pal16[v & 0xfffe]; + Grp_LineBufSP2[i] = 0; + } + + off += 2; + if (--x == 0) + off -= 0x400; + } +#endif /* USE_ASM */ +} + + +void FASTCALL Grp_DrawLine8SP(int page) +{ +#ifdef USE_ASM + __asm + { + push esi +push edi +and ecx, 1 +mov esi, GrphScrollY[ecx*8] +mov edi, GrphScrollY[ecx*8+4] + add esi, VLINE +add edi, VLINE + mov al, CRTC_Regs[0x29] + and al, 1ch + cmp al, 1ch + jne gp8splinenotspecial + add esi, VLINE +add edi, VLINE + gp8splinenotspecial: + and esi, 511 + shl esi, 10 +and edi, 511 +shl edi, 10 +mov eax, GrphScrollX[ecx*8+4] +and eax, 511 +add edi, eax +add edi, eax + mov ebx, GrphScrollX[ecx*8] + and ebx, 511 + add esi, ebx + add esi, ebx +add esi, ecx +add edi, ecx + + xor bx, 511 + inc bx + mov ecx, TextDotX + xor edx, edx + xor eax, eax + gp8osplinelp: + mov al, byte ptr GVRAM[esi] +mov ah, byte ptr GVRAM[edi] +and ah, 0f0h +and al, 0fh +or al, ah + //xor ah, ah + test al, 1 + jnz gp8osplinesp + and eax, 0feh + jz gp8onotzero2 + mov ax, word ptr GrphPal[eax*2] + gp8onotzero2: + mov word ptr Grp_LineBufSP[edx], 0 + mov word ptr Grp_LineBufSP2[edx], ax + jmp gp8osplineskip + gp8osplinesp: + and eax, 0feh + jz gp8onotzero // ついんびー。Palette0以外の$0000は特殊Priでは透明じゃなく黒扱いらしい + mov ax, word ptr GrphPal[eax*2] + or ax, Ibit // Palette0以外はIbit立ててごまかそー + gp8onotzero: // 半透明が変になる時は、半透明と特殊Priを別ルーチンにしなきゃ… + mov word ptr Grp_LineBufSP[edx], ax + mov word ptr Grp_LineBufSP2[edx], 0 + gp8osplineskip: + add esi, 2 +add edi, 2 +test di, 03feh +jnz gp8spnotxend +sub edi, 0400h +gp8spnotxend: + add edx, 2 + dec bx + jnz gp8ospline_cnt + sub esi, 0400h + gp8ospline_cnt: + loop gp8osplinelp +pop edi + pop esi + } +#elif defined(USE_GAS) && defined(__i386__) + __asm__ __volatile__ ( + "pushl %%esi;" + "pushl %%edi;" + + "movl %0, %%ecx;" // page + + "andl $1, %%ecx;" + "movl GrphScrollY(, %%ecx, 8), %%esi;" + "movl GrphScrollY + 4(, %%ecx, 8), %%edi;" + "addl %1, %%esi;" + "addl %1, %%edi;" + "movb %2, %%al;" + "andb $0x1c, %%al;" + "cmpb $0x1c, %%al;" + "jne .gp8splinenotspecial;" + "addl %1, %%esi;" + "addl %1, %%edi;" + ".gp8splinenotspecial:" + "andl $511, %%esi;" + "shll $10, %%esi;" + "andl $511, %%edi;" + "shll $10, %%edi;" + "movl GrphScrollX + 4(, %%ecx, 8), %%eax;" + "andl $511, %%eax;" + "addl %%eax, %%edi;" + "addl %%eax, %%edi;" + "movl GrphScrollX(, %%ecx, 8), %%ebx;" + "andl $511, %%ebx;" + "addl %%ebx, %%esi;" + "addl %%ebx, %%esi;" + "addl %%ecx, %%esi;" + "addl %%ecx, %%edi;" + + "xorw $511, %%bx;" + "incw %%bx;" + "movl %2, %%ecx;" + "xorl %%edx, %%edx;" + "xorl %%eax, %%eax;" + ".gp8osplinelp:" + "movb GVRAM(%%esi), %%al;" + "movb GVRAM(%%edi), %%ah;" + "andb $0x0f0, %%ah;" + "andb $0x0f, %%al;" + "orb %%ah, %%al;" + "testb $1, %%al;" + "jnz .gp8osplinesp;" + "andl $0x0fe, %%eax;" + "jz .gp8onotzero2;" + "movw GrphPal(, %%eax, 2), %%ax;" + ".gp8onotzero2:" + "movw $0, Grp_LineBufSP(%%edx);" + "movw %%ax, Grp_LineBufSP2(%%edx);" + "jmp .gp8osplineskip;" + ".gp8osplinesp:" + "andl $0x0fe, %%eax;" + "jz .gp8onotzero;" + "movw GrphPal(, %%eax, 2), %%ax;" + "or %4, %%ax;" + ".gp8onotzero:" + "movw %%ax, Grp_LineBufSP(%%edx);" + "movw $0, Grp_LineBufSP2(%%edx);" + ".gp8osplineskip:" + "addl $2, %%esi;" + "addl $2, %%edi;" + "testw $0x03fe, %%di;" + "jnz .gp8spnotxend;" + "subl $0x0400, %%edi;" + ".gp8spnotxend:" + "addl $2, %%edx;" + "decw %%bx;" + "jnz .gp8ospline_cnt;" + "subl $0x0400, %%esi;" + ".gp8ospline_cnt:" + "loop .gp8osplinelp;" + + "popl %%edi;" + "popl %%esi;" + : /* output: nothing */ + : "m" (page), "m" (VLINE), "m" (CRTC_Regs[0x29]), "m" (TextDotX), + "m" (Ibit) + : "ax", "bx", "cx", "dx"); +#else /* !USE_ASM && !(USE_GAS && __i386__) */ + DWORD x, x0; + DWORD y, y0; + DWORD off, off0; + DWORD i; + WORD v; + + page &= 1; + + y = GrphScrollY[page * 2] + VLINE; + y0 = GrphScrollY[page * 2 + 1] + VLINE; + if ((CRTC_Regs[0x29] & 0x1c) == 0x1c) { + y += VLINE; + y0 += VLINE; + } + y = (y & 0x1ff) << 10; + y0 = (y0 & 0x1ff) << 10; + + x = GrphScrollX[page * 2] & 0x1ff; + x0 = GrphScrollX[page * 2 + 1] & 0x1ff; + + off = y + x * 2 + page; + off0 = y0 + x0 * 2 + page; + + x = (x ^ 0x1ff) + 1; + + for (i = 0; i < TextDotX; ++i) { + v = (GVRAM[off] & 0x0f) | (GVRAM[off0] & 0xf0); + if ((v & 1) == 0) { + v &= 0xfe; + if (v != 0x00) + v = GrphPal[v]; + Grp_LineBufSP[i] = 0; + Grp_LineBufSP2[i] = v; + } else { + v &= 0xfe; + if (v != 0x00) + v = GrphPal[v] & Ibit; + Grp_LineBufSP[i] = v; + Grp_LineBufSP2[i] = 0; + } + + off += 2; + off0 += 2; + if ((off0 & 0x3fe) == 0) + off0 -= 0x400; + if (--x == 0) + off -= 0x400; + } +#endif /* USE_ASM */ +} + + +void FASTCALL Grp_DrawLine4SP(DWORD page/*, int opaq*/) +{ + DWORD scrx, scry; + page &= 3; + switch(page) // 美しくなさすぎる(笑) + { + case 0: scrx = GrphScrollX[0]; scry = GrphScrollY[0]; break; + case 1: scrx = GrphScrollX[1]; scry = GrphScrollY[1]; break; + case 2: scrx = GrphScrollX[2]; scry = GrphScrollY[2]; break; + case 3: scrx = GrphScrollX[3]; scry = GrphScrollY[3]; break; + } + +#ifdef USE_ASM + if (page&1) + { +// if (opaq) +// { + __asm + { + push esi + mov esi, scry + add esi, VLINE + mov al, CRTC_Regs[0x29] + and al, 1ch + cmp al, 1ch + jne gp4splinenotspecial + add esi, VLINE + gp4splinenotspecial: + and esi, 511 + shl esi, 10 + mov ebx, scrx + and ebx, 511 + add esi, ebx + add esi, ebx +// add esi, vram + test page, 2 + jz gp4ospline2page0 + inc esi + gp4ospline2page0: + xor bx, 511 + inc bx + mov ecx, TextDotX + xor edx, edx + gp4osplinelp2: + mov al, byte ptr GVRAM[esi] + shr al, 4 + test al, 1 + jnz gp4o2splinesp + and eax, 14 + mov ax, word ptr GrphPal[eax*2] + mov word ptr Grp_LineBufSP[edx], 0 + mov Grp_LineBufSP2[edx], ax + jmp gp4o2splineskip + gp4o2splinesp: + and eax, 14 + mov ax, word ptr GrphPal[eax*2] + mov word ptr Grp_LineBufSP[edx], ax + mov word ptr Grp_LineBufSP2[edx], 0 + gp4o2splineskip: + add esi, 2 + add edx, 2 + dec bx + jnz gp4ospline_cnt2 + sub esi, 0400h + gp4ospline_cnt2: +// dec cx +// jnz gp4osplinelp2 + loop gp4osplinelp2 + pop esi + } +/* } + else + { + __asm + { + push esi + mov esi, scry + add esi, VLINE + and esi, 511 + shl esi, 10 + mov ebx, scrx + and ebx, 511 + add esi, ebx + add esi, ebx +// add esi, vram + test page, 2 + jz gp4spline2page0 + inc esi + gp4spline2page0: + xor bx, 511 + inc bx + mov ecx, TextDotX + xor edx, edx + gp4splinelp2: + mov al, byte ptr GVRAM[esi] + shr al, 4 + test al, 1 + jnz gp4splinesp2 + and eax, 14 + jz gp4splineskip2_2 + mov ax, word ptr GrphPal[eax*2] + mov Grp_LineBuf[edx], ax + gp4splineskip2_2: + mov word ptr Grp_LineBufSP[edx], 0 + jmp gp4splineskip2 + gp4splinesp2: + and eax, 14 + jz gp4splineskip2_2 + mov ax, word ptr GrphPal[eax*2] +// mov Grp_LineBuf[edx], ax + mov word ptr Grp_LineBufSP[edx], ax + gp4splineskip2: + add esi, 2 + add edx, 2 + dec bx + jnz gp4spline_cnt2 + sub esi, 0400h + gp4spline_cnt2: +// dec cx +// jnz gp4splinelp2 + loop gp4splinelp2 + pop esi + } + } +*/ + } + else + { +// if (opaq) +// { + __asm + { + push esi + mov esi, scry + add esi, VLINE + mov al, CRTC_Regs[0x29] + and al, 1ch + cmp al, 1ch + jne gp4osplinenotspecial + add esi, VLINE + gp4osplinenotspecial: + and esi, 511 + shl esi, 10 + mov ebx, scrx + and ebx, 511 + add esi, ebx + add esi, ebx +// add esi, vram + test page, 2 + jz gp4osplinepage0 + inc esi + gp4osplinepage0: + xor bx, 511 + inc bx + mov ecx, TextDotX + xor edx, edx + gp4osplinelp: + mov al, byte ptr GVRAM[esi] + test al, 1 + jnz gp4osplinesp + and eax, 14 + mov ax, word ptr GrphPal[eax*2] + mov word ptr Grp_LineBufSP[edx], 0 + mov Grp_LineBufSP2[edx], ax + jmp gp4osplineskip + gp4osplinesp: + and eax, 14 + mov ax, word ptr GrphPal[eax*2] + mov word ptr Grp_LineBufSP[edx], ax + mov word ptr Grp_LineBufSP2[edx], 0 + gp4osplineskip: + add esi, 2 + add edx, 2 + dec bx + jnz gp4ospline_cnt + sub esi, 0400h + gp4ospline_cnt: +// dec cx +// jnz gp4osplinelp + loop gp4osplinelp + pop esi + } +/* } + else + { + __asm + { + push esi + mov esi, scry + add esi, VLINE + and esi, 511 + shl esi, 10 + mov ebx, scrx + and ebx, 511 + add esi, ebx + add esi, ebx +// add esi, vram + test page, 2 + jz gp4splinepage0 + inc esi + gp4splinepage0: + xor bx, 511 + inc bx + mov ecx, TextDotX + xor edx, edx + gp4splinelp: + mov al, byte ptr GVRAM[esi] + test al, 1 + jnz gp4splinesp + and eax, 14 + jz gp4splineskip_2 + mov ax, word ptr GrphPal[eax*2] + mov Grp_LineBuf[edx], ax + gp4splineskip_2: + mov word ptr Grp_LineBufSP[edx], 0 + jmp gp4splineskip + gp4splinesp: + and eax, 14 + jz gp4splineskip_2 + mov ax, word ptr GrphPal[eax*2] +// mov Grp_LineBuf[edx], ax + mov word ptr Grp_LineBufSP[edx], ax + gp4splineskip: + add esi, 2 + add edx, 2 + dec bx + jnz gp4spline_cnt + sub esi, 0400h + gp4spline_cnt: +// dec cx +// jnz gp4splinelp + loop gp4splinelp + pop esi + } + } +*/ } +#elif defined(USE_GAS) && defined(__i386__) + if (page & 1) { + __asm__ __volatile__ ( + "pushl %%esi;" + "movl %1, %%esi;" + "addl %2, %%esi;" + "movb %3, %%al;" + "andb $0x1c, %%al;" + "cmpb $0x1c, %%al;" + "jne .gp4splinenotspecial;" + "addl %2, %%esi;" + ".gp4splinenotspecial:" + "andl $511, %%esi;" + "shll $10, %%esi;" + "movl %4, %%ebx;" + "andl $511, %%ebx;" + "addl %%ebx, %%esi;" + "addl %%ebx, %%esi;" + "testl $2, %0;" + "jz .gp4ospline2page0;" + "incl %%esi;" + ".gp4ospline2page0:" + "xorw $511, %%bx;" + "incw %%bx;" + "movl %5, %%ecx;" + "xorl %%edx, %%edx;" + ".gp4osplinelp2:" + "movb GVRAM(%%esi), %%al;" + "shrb $4, %%al;" + "testb $1, %%al;" + "jnz .gp4o2splinesp;" + "andl $14, %%eax;" + "movw GrphPal(, %%eax, 2), %%ax;" + "movw $0, Grp_LineBufSP(%%edx);" + "movw %%ax, Grp_LineBufSP2(%%edx);" + "jmp .gp4o2splineskip;" + ".gp4o2splinesp:" + "andl $14, %%eax;" + "movw GrphPal(, %%eax, 2), %%ax;" + "movw %%ax, Grp_LineBufSP(%%edx);" + "movw $0, Grp_LineBufSP2(%%edx);" + ".gp4o2splineskip:" + "addl $2, %%esi;" + "addl $2, %%edx;" + "decw %%bx;" + "jnz .gp4ospline_cnt2;" + "subl $0x0400, %%esi;" + ".gp4ospline_cnt2:" + "loop .gp4osplinelp2;" + "popl %%esi;" + : /* output: nothing */ + : "m" (page), "m" (scry), "m" (VLINE), "m" (CRTC_Regs[0x29]), + "m" (scrx), "m" (TextDotX) + : "ax", "bx", "cx", "dx"); + } else { + __asm__ __volatile__ ( + "pushl %%esi;" + "movl %1, %%esi;" + "addl %2, %%esi;" + "movb %3, %%al;" + "andb $0x1c, %%al;" + "cmpb $0x1c, %%al;" + "jne .gp4osplinenotspecial;" + "addl %2, %%esi;" + ".gp4osplinenotspecial:" + "andl $511, %%esi;" + "shll $10, %%esi;" + "movl %4, %%ebx;" + "andl $511, %%ebx;" + "addl %%ebx, %%esi;" + "addl %%ebx, %%esi;" + "testl $2, %0;" + "jz .gp4osplinepage0;" + "incl %%esi;" + ".gp4osplinepage0:" + "xorw $511, %%bx;" + "incw %%bx;" + "movl %5, %%ecx;" + "xorl %%edx, %%edx;" + ".gp4osplinelp:" + "movb GVRAM(%%esi), %%al;" + "testb $1, %%al;" + "jnz .gp4osplinesp;" + "andl $14, %%eax;" + "movw GrphPal(, %%eax, 2), %%ax;" + "movw $0, Grp_LineBufSP(%%edx);" + "movw %%ax, Grp_LineBufSP2(%%edx);" + "jmp .gp4osplineskip;" + ".gp4osplinesp:" + "andl $14, %%eax;" + "movw GrphPal(, %%eax, 2), %%ax;" + "movw %%ax, Grp_LineBufSP(%%edx);" + "movw $0, Grp_LineBufSP2(%%edx);" + ".gp4osplineskip:" + "addl $2, %%esi;" + "addl $2, %%edx;" + "decw %%bx;" + "jnz .gp4ospline_cnt;" + "subl $0x0400, %%esi;" + ".gp4ospline_cnt:" + "loop .gp4osplinelp;" + "popl %%esi;" + : /* output: nothing */ + : "m" (page), "m" (scry), "m" (VLINE), "m" (CRTC_Regs[0x29]), + "m" (scrx), "m" (TextDotX) + : "ax", "bx", "cx", "dx"); + } +#else /* !USE_ASM && !(USE_GAS && __i386__) */ +{ + DWORD x, y; + DWORD off; + DWORD i; + WORD v; + + if (page & 1) { + y = scry + VLINE; + if ((CRTC_Regs[0x29] & 0x1c) == 0x1c) + y += VLINE; + y = (y & 0x1ff) << 10; + + x = scrx & 0x1ff; + off = y + x * 2; + if (page & 2) + off++; + x = (x ^ 0x1ff) + 1; + + for (i = 0; i < TextDotX; ++i) { + v = GVRAM[off] >> 4; + if ((v & 1) == 0) { + v &= 0x0e; + Grp_LineBufSP[i] = 0; + Grp_LineBufSP2[i] = GrphPal[v]; + } else { + v &= 0x0e; + Grp_LineBufSP[i] = GrphPal[v]; + Grp_LineBufSP2[i] = 0; + } + + off += 2; + if (--x == 0) + off -= 0x400; + } + } else { + y = scry + VLINE; + if ((CRTC_Regs[0x29] & 0x1c) == 0x1c) + y += VLINE; + y = (y & 0x1ff) << 10; + + x = scrx & 0x1ff; + off = y + x * 2; + if (page & 2) + off++; + x = (x ^ 0x1ff) + 1; + + for (i = 0; i < TextDotX; ++i) { + v = GVRAM[off]; + if ((v & 1) == 0) { + v &= 0x0e; + Grp_LineBufSP[i] = 0; + Grp_LineBufSP2[i] = GrphPal[v]; + } else { + v &= 0x0e; + Grp_LineBufSP[i] = GrphPal[v]; + Grp_LineBufSP2[i] = 0; + } + + off += 2; + if (--x == 0) + off -= 0x400; + } + } +} +#endif /* USE_ASM */ +} + + +void FASTCALL Grp_DrawLine4hSP(void) +{ +#ifdef USE_ASM + __asm + { + push esi + push edi + mov esi, GrphScrollY[0] + add esi, VLINE + mov al, CRTC_Regs[0x29] + and al, 1ch + cmp al, 1ch + jne gp4hsplinenotspecial + add esi, VLINE + gp4hsplinenotspecial: + and esi, 1023 + test esi, 512 + jnz gp4hsp_plane23 + shl esi, 10 + mov edx, GrphScrollX[0] + mov edi, edx + and edx, 511 + add esi, edx + add esi, edx + mov cl, 00h + test edi, 512 + jz gp4hsp_main + add cl, 4 + jmp gp4hsp_main + gp4hsp_plane23: + and esi, 511 + shl esi, 10 + mov edx, GrphScrollX[0] + mov edi, edx + and edx, 511 + add esi, edx + add esi, edx + mov cl, 08h + test edi, 512 + jz gp4hsp_main + add cl, 4 + gp4hsp_main: + and edi, 511 + xor di, 511 + inc di + mov ebx, TextDotX + xor edx, edx + gp4hsplinelp: + mov ax, word ptr GVRAM[esi] + shr ax, cl + test ax, 1 + jnz gp4hsplinesp + and eax, 14 + mov ax, word ptr GrphPal[eax*2] + mov word ptr Grp_LineBufSP[edx], 0 + mov Grp_LineBufSP2[edx], ax + jmp gp4hsplineskip + gp4hsplinesp: + and eax, 14 + mov ax, word ptr GrphPal[eax*2] + mov word ptr Grp_LineBufSP[edx], ax + mov word ptr Grp_LineBufSP2[edx], 0 + gp4hsplineskip: + add esi, 2 + add edx, 2 + dec di + jnz gp4hspline_cnt + sub esi, 0800h + gp4hspline_cnt: + dec bx + jnz gp4hsplinelp +// loop gp4hsplinelp + pop edi + pop esi + } +#elif defined(USE_GAS) && defined(__i386__) + __asm__ __volatile__ ( + "pushl %%esi;" + "pushl %%edi;" + "movl %0, %%esi;" + "addl %1, %%esi;" + "movb %2, %%al;" + "andb $0x1c, %%al;" + "cmpb $0x1c, %%al;" + "jne .gp4hsplinenotspecial;" + "addl %1, %%esi;" + ".gp4hsplinenotspecial:" + "andl $1023, %%esi;" + "testl $512, %%esi;" + "jnz .gp4hsp_plane23;" + "shll $10, %%esi;" + "movl %3, %%edx;" + "movl %%edx, %%edi;" + "andl $511, %%edx;" + "addl %%edx, %%esi;" + "addl %%edx, %%esi;" + "movb $0x00, %%cl;" + "testl $512, %%edi;" + "jz .gp4hsp_main;" + "addb $4, %%cl;" + "jmp .gp4hsp_main;" + ".gp4hsp_plane23:" + "andl $511, %%esi;" + "shll $10, %%esi;" + "movl %3, %%edx;" + "movl %%edx, %%edi;" + "andl $511, %%edx;" + "addl %%edx, %%esi;" + "addl %%edx, %%esi;" + "movb $0x08, %%cl;" + "testl $512, %%edi;" + "jz .gp4hsp_main;" + "addb $4, %%cl;" + ".gp4hsp_main:" + "andl $511, %%edi;" + "xorw $511, %%di;" + "incw %%di;" + "movl %4, %%ebx;" + "xorl %%edx, %%edx;" + ".gp4hsplinelp:" + "movw GVRAM(%%esi), %%ax;" + "shrw %%cl, %%ax;" + "testw $1, %%ax;" + "jnz .gp4hsplinesp;" + "andl $14, %%eax;" + "movw GrphPal(, %%eax, 2), %%ax;" + "movw $0, Grp_LineBufSP(%%edx);" + "movw %%ax, Grp_LineBufSP2(%%edx);" + "jmp .gp4hsplineskip;" + ".gp4hsplinesp:" + "andl $14, %%eax;" + "movw GrphPal(, %%eax, 2), %%ax;" + "movw %%ax, Grp_LineBufSP(%%edx);" + "movw $0, Grp_LineBufSP2(%%edx);" + ".gp4hsplineskip:" + "addl $2, %%esi;" + "addl $2, %%edx;" + "decw %%di;" + "jnz .gp4hspline_cnt;" + "subl $0x0800, %%esi;" + ".gp4hspline_cnt:" + "decw %%bx;" + "jnz .gp4hsplinelp;" + "popl %%edi;" + "popl %%esi;" + : /* output: nothing */ + : "m" (GrphScrollY[0]), "m" (VLINE), "m" (CRTC_Regs[0x29]), + "m" (GrphScrollX[0]), "m" (TextDotX) + : "ax", "bx", "cx", "dx"); +#else /* !USE_ASM && !(USE_GAS && __i386__) */ + WORD *srcp; + DWORD x, y; + DWORD i; + int bits; + WORD v; + + y = GrphScrollY[0] + VLINE; + if ((CRTC_Regs[0x29] & 0x1c) == 0x1c) + y += VLINE; + y &= 0x3ff; + + if ((y & 0x200) == 0x000) { + y <<= 10; + bits = (GrphScrollX[0] & 0x200) ? 4 : 0; + } else { + y = (y & 0x1ff) << 10; + bits = (GrphScrollX[0] & 0x200) ? 12 : 8; + } + + x = GrphScrollX[0] & 0x1ff; + srcp = (WORD *)(GVRAM + y + x * 2); + x = ((x & 0x1ff) ^ 0x1ff) + 1; + + for (i = 0; i < TextDotX; ++i) { + v = *srcp++ >> bits; + if ((v & 1) == 0) { + Grp_LineBufSP[i] = 0; + Grp_LineBufSP2[i] = GrphPal[v & 0x0e]; + } else { + Grp_LineBufSP[i] = GrphPal[v & 0x0e]; + Grp_LineBufSP2[i] = 0; + } + + if (--x == 0) + srcp -= 0x400; + } +#endif /* USE_ASM */ +} + + + +// ------------------------------------------------- +// --- 半透明の対象となるページの描画 -------------- +// 2ページ以上あるグラフィックモードのみなので、 +// 256色2面 or 16色4面のモードのみ。 +// 256色時は、Opaqueでない方のモードはいらないかも… +// (必ずOpaqueモードの筈) +// ------------------------------------------------- +// ここはまだ32色x4面モードの実装をしてないれす… +// (れじすた足りないよぅ…) +// ------------------------------------------------- + // やけにすっきり +LABEL void FASTCALL +Grp_DrawLine8TR(int page, int opaq) +{ +#ifdef USE_ASM + __asm { + or edx, edx + jz opaq_zero + push ebx + push ecx + push esi + push edi + and ecx, 1 + mov esi, GrphScrollY[ecx*8] + add esi, VLINE + mov al, CRTC_Regs[0x29] + and al, 1ch + cmp al, 1ch + jne gp8trlinenotspecial + add esi, VLINE + gp8trlinenotspecial: + and esi, 511 + shl esi, 10 + mov ebx, GrphScrollX[ecx*8] + and ebx, 511 + add esi, ecx + mov edx, TextDotX + xor edi, edi + gp8otrlinelp: + movzx eax, word ptr Grp_LineBufSP[edi] + movzx ecx, byte ptr GVRAM[esi+ebx*2] + or ax, ax + jnz gp8otrlinetr + mov cx, word ptr GrphPal[ecx*2] + jmp gp8otrlinenorm + gp8otrlinetr: + jcxz gp8otrlinenorm // けろぴー… + mov cx, word ptr GrphPal[ecx*2] + jcxz gp8otrlinenorm // けろぴー… + and ax, Pal_HalfMask + test cx, Ibit + jz gp8otrlinetrI + or ax, Pal_Ix2 + gp8otrlinetrI: + and cx, Pal_HalfMask + add cx, ax // 17bit計算中 + rcr cx, 1 // 17bit計算中 + gp8otrlinenorm: + mov Grp_LineBuf[edi], cx + inc bx + and bh, 1 // and bx, 511 + add edi, 2 + dec dx + jnz gp8otrlinelp + pop edi + pop esi + pop ecx + pop ebx + opaq_zero: + ret + } +#elif defined(USE_GAS) && defined(__i386__) + __asm__ __volatile__ ( + "movl %0, %%ecx;" // ecx = page + "movl %1, %%edx;" // edx = opaq + + "orl %%edx, %%edx;" + "jz .opaq_zero;" + + "andl $1, %%ecx;" + "movl GrphScrollY(, %%ecx, 8), %%esi;" + "addl %2, %%esi;" + "movb %3, %%al;" + "andb $0x1c, %%al;" + "cmpb $0x1c, %%al;" + "jne .gp8trlinenotspecial;" + "addl %2, %%esi;" + ".gp8trlinenotspecial:" + "andl $511, %%esi;" + "shll $10, %%esi;" + "movl GrphScrollX(, %%ecx, 8), %%ebx;" + "andl $511, %%ebx;" + "addl %%ecx, %%esi;" + "movl %4, %%edx;" + "xorl %%edi, %%edi;" + ".gp8otrlinelp:" + "movzwl Grp_LineBufSP(%%edi), %%eax;" + "movzbl GVRAM(%%esi, %%ebx, 2), %%ecx;" + "orw %%ax, %%ax;" + "jnz .gp8otrlinetr;" + "movw GrphPal(, %%ecx, 2), %%cx;" + "jmp .gp8otrlinenorm;" + ".gp8otrlinetr:" + "jcxz .gp8otrlinenorm;" // けろぴー… + "movw GrphPal(, %%ecx, 2), %%cx;" + "jcxz .gp8otrlinenorm;" // けろぴー… + "andw %5, %%ax;" + "testw %6, %%cx;" + "jz .gp8otrlinetrI;" + "orw %7, %%ax;" + ".gp8otrlinetrI:" + "andw %5, %%cx;" + "addw %%ax, %%cx;" // 17bit計算中 + "rcrw $1, %%cx;" // 17bit計算中 + ".gp8otrlinenorm:" + "movw %%cx, Grp_LineBuf(%%edi);" + "incw %%bx;" + "andb $1, %%bh;" // and bx, 511 + "addl $2, %%edi;" + "decw %%dx;" + "jnz .gp8otrlinelp;" + + ".opaq_zero:" + : /* output: nothing */ + : "m" (page), "m" (opaq), "m" (VLINE), "m" (CRTC_Regs[0x29]), + "m" (TextDotX), "m" (Pal_HalfMask), "m" (Ibit), "m" (Pal_Ix2) + : "ax", "bx", "cx", "dx", "si", "di"); +#else /* !USE_ASM && !(USE_GAS && __i386__) */ + if (opaq) { + DWORD x, y; + DWORD v, v0; + DWORD i; + + page &= 1; + + y = GrphScrollY[page * 2] + VLINE; + if ((CRTC_Regs[0x29] & 0x1c) == 0x1c) + y += VLINE; + y = ((y & 0x1ff) << 10) + page; + x = GrphScrollX[page * 2] & 0x1ff; + + for (i = 0; i < TextDotX; ++i, x = (x + 1) & 0x1ff) { + v0 = Grp_LineBufSP[i]; + v = GVRAM[y + x * 2]; + + if (v0 != 0) { + if (v != 0) { + v = GrphPal[v]; + if (v != 0) { + v0 &= Pal_HalfMask; + if (v & Ibit) + v0 |= Pal_Ix2; + v &= Pal_HalfMask; + v += v0; + v >>= 1; + } + } + } else + v = GrphPal[v]; + Grp_LineBuf[i] = (WORD)v; + } + } +#endif /* USE_ASM */ +} + +LABEL void FASTCALL +Grp_DrawLine4TR(DWORD page, int opaq) +{ +#ifdef USE_ASM + __asm { + push ebx + push ecx + push esi + push edi + + and ecx, 3 + mov esi, GrphScrollY[ecx*4] + add esi, VLINE + mov al, CRTC_Regs[0x29] + and al, 1ch + cmp al, 1ch + jne gp4trlinenotspecial + add esi, VLINE + gp4trlinenotspecial: + and esi, 511 + shl esi, 10 + mov ebx, GrphScrollX[ecx*4] + and ebx, 511 + xor edi, edi + + shr cl, 1 + jnc pagebit0eq0 // jmp (page 0 or 2) + + add esi, ecx // ecx = page/2 + or edx, edx + je gp4trline2page0 + + mov edx, TextDotX + gp4otrlinelp2: + movzx eax, word ptr Grp_LineBufSP[edi] + movzx ecx, byte ptr GVRAM[esi+ebx*2] + shr cl, 4 + or ax, ax + jnz gp4otrlinetr2 + mov cx, word ptr GrphPal[ecx*2] + jmp gp4otrlinenorm2 + gp4otrlinetr2: + jcxz gp4otrlinenorm2 // けろぴー + mov cx, word ptr GrphPal[ecx*2] + jcxz gp4otrlinenorm2 // けろぴー + and ax, Pal_HalfMask + test cx, Ibit + jz gp4otrlinetr2I + or ax, Pal_Ix2 + gp4otrlinetr2I: + and cx, Pal_HalfMask + add cx, ax // 17bit計算中 + rcr cx, 1 // 17bit計算中 + gp4otrlinenorm2: + mov Grp_LineBuf[edi], cx + inc bx + and bh, 1 // and bx, 511 + add edi, 2 + dec dx + jnz gp4otrlinelp2 + pop edi + pop esi + pop ecx + pop ebx + ret + + gp4trline2page0: + mov edx, TextDotX + gp4trlinelp2: + movzx eax, word ptr Grp_LineBufSP[edi] + or ax, ax + jnz gp4trlinetr2 + movzx ecx, byte ptr GVRAM[esi+ebx*2] + shr cl, 4 + jcxz gp4trlineskip2 + mov cx, word ptr GrphPal[ecx*2] + jmp gp4trlinenorm2 + gp4trlinetr2: + movzx ecx, byte ptr GVRAM[esi+ebx*2] + shr cl, 4 + jcxz gp4trlinenorm2 // けろぴー + mov cx, word ptr GrphPal[ecx*2] + jcxz gp4trlineskip2 // けろぴー + and ax, Pal_HalfMask + test cx, Ibit + jz gp4trlinetr2I + or ax, Pal_Ix2 + gp4trlinetr2I: + and cx, Pal_HalfMask + add cx, ax // 17bit計算中 + rcr cx, 1 // 17bit計算中 + gp4trlinenorm2: + mov Grp_LineBuf[edi], cx + gp4trlineskip2: + inc bx + and bh, 1 // and bx, 511 + add edi, 2 + dec dx + jnz gp4trlinelp2 + pop edi + pop esi + pop ecx + pop ebx + ret + + pagebit0eq0: + add esi, ecx // ecx = page/2 + or edx, edx + je gp4trlinepage0 + + mov edx, TextDotX + gp4otrlinelp: + mov cl, byte ptr GVRAM[esi+ebx*2] + and ecx, 15 + movzx eax, word ptr Grp_LineBufSP[edi] + or ax, ax + jnz gp4otrlinetr + mov cx, word ptr GrphPal[ecx*2] + jmp gp4otrlinenorm + gp4otrlinetr: + jcxz gp4otrlinenorm // けろぴー + mov cx, word ptr GrphPal[ecx*2] + jcxz gp4otrlinenorm // けろぴー + and ax, Pal_HalfMask + test cx, Ibit + jz gp4otrlinetrI + or ax, Pal_Ix2 + gp4otrlinetrI: + and cx, Pal_HalfMask + add cx, ax // 17bit計算中 + rcr cx, 1 // 17bit計算中 + gp4otrlinenorm: + mov Grp_LineBuf[edi], cx + inc bx + and bh, 1 // and bx, 511 + add edi, 2 + dec dx + jnz gp4otrlinelp + pop edi + pop esi + pop ecx + pop ebx + ret + + gp4trlinepage0: + mov edx, TextDotX + gp4trlinelp: + mov cl, byte ptr GVRAM[esi+ebx*2] + and ecx, 15 + movzx eax, word ptr Grp_LineBufSP[edi] + or ax, ax + jnz gp4trlinetr + + jcxz gp4trlineskip + mov cx, word ptr GrphPal[ecx*2] + jmp gp4trlinenorm + + gp4trlinetr: + jcxz gp4trlinenorm // けろぴー + mov cx, word ptr GrphPal[ecx*2] + jcxz gp4trlineskip // けろぴー + and ax, Pal_HalfMask + test cx, Ibit + jz gp4trlinetrI + or ax, Pal_Ix2 + gp4trlinetrI: + and cx, Pal_HalfMask + add cx, ax // 17bit計算中 + rcr cx, 1 // 17bit計算中 + gp4trlinenorm: + mov Grp_LineBuf[edi], cx + gp4trlineskip: + inc bx + and bh, 1 // and bx, 511 + add edi, 2 + dec dx + jnz gp4trlinelp + pop edi + pop esi + pop ecx + pop ebx + ret + } +#elif defined(USE_GAS) && defined(__i386__) + __asm__ __volatile__ ( + "pushl %%ebx;" + "pushl %%ecx;" + "pushl %%esi;" + "pushl %%edi;" + + "movl %0, %%ecx;" // ecx = page + "movl %1, %%edx;" // edx = opaq + + "andl $3, %%ecx;" + "movl GrphScrollY(, %%ecx, 4), %%esi;" + "addl %2, %%esi;" + "movb %3, %%al;" + "andb $0x1c, %%al;" + "cmpb $0x1c, %%al;" + "jne .gp4trlinenotspecial;" + "addl %2, %%esi;" + ".gp4trlinenotspecial:" + "andl $511, %%esi;" + "shll $10, %%esi;" + "movl GrphScrollX(, %%ecx, 4), %%ebx;" + "andl $511, %%ebx;" + "xorl %%edi, %%edi;" + + "shrb $1, %%cl;" + "jnc .pagebit0eq0;" + + "addl %%ecx, %%esi;" + "orl %%edx, %%edx;" + "je .gp4trline2page0;" + + "movl %4, %%edx;" + ".gp4otrlinelp2:" + "movzwl Grp_LineBufSP(%%edi), %%eax;" + "movzbl GVRAM(%%esi, %%ebx, 2), %%ecx;" + "shrb $4, %%cl;" + "orw %%ax, %%ax;" + "jnz .gp4otrlinetr2;" + "movw GrphPal(, %%ecx, 2), %%cx;" + "jmp .gp4otrlinenorm2;" + ".gp4otrlinetr2:" + "jcxz .gp4otrlinenorm2;" + "movw GrphPal(, %%ecx, 2), %%cx;" + "jcxz .gp4otrlinenorm2;" + "andw %5, %%ax;" + "testw %6, %%cx;" + "jz .gp4otrlinetr2I;" + "orw %7, %%ax;" + ".gp4otrlinetr2I:" + "andw %5, %%cx;" + "addw %%ax, %%cx;" + "rcrw $1, %%cx;" + ".gp4otrlinenorm2:" + "movw %%cx, Grp_LineBuf(%%edi);" + "incw %%bx;" + "andb $1, %%bh;" + "addl $2, %%edi;" + "decw %%dx;" + "jnz .gp4otrlinelp2;" + "jmp .gp4tr_end;" + + ".gp4trline2page0:" + "movl %4, %%edx;" + ".gp4trlinelp2:" + "movzwl Grp_LineBufSP(%%edi), %%eax;" + "orw %%ax, %%ax;" + "jnz .gp4trlinetr2;" + "movzbl GVRAM(%%esi, %%ebx, 2), %%ecx;" + "shrb $4, %%cl;" + "jcxz .gp4trlineskip2;" + "movw GrphPal(, %%ecx, 2), %%cx;" + "jmp .gp4trlinenorm2;" + ".gp4trlinetr2:" + "movzbl GVRAM(%%esi, %%ebx, 2), %%ecx;" + "shrb $4, %%cl;" + "jcxz .gp4trlinenorm2;" + "movw GrphPal(, %%ecx, 2), %%cx;" + "jcxz .gp4trlineskip2;" + "andw %5, %%ax;" + "testw %6, %%cx;" + "jz .gp4trlinetr2I;" + "orw %7, %%ax;" + ".gp4trlinetr2I:" + "andw %5, %%cx;" + "addw %%ax, %%cx;" + "rcrw $1, %%cx;" + ".gp4trlinenorm2:" + "movw %%cx, Grp_LineBuf(%%edi);" + ".gp4trlineskip2:" + "incw %%bx;" + "andb $1, %%bh;" + "addl $2, %%edi;" + "decw %%dx;" + "jnz .gp4trlinelp2;" + "jmp .gp4tr_end;" + + ".pagebit0eq0:" + "addl %%ecx, %%esi;" + "orl %%edx, %%edx;" + "je .gp4trlinepage0;" + + "movl %4, %%edx;" + ".gp4otrlinelp:" + "movb GVRAM(%%esi, %%ebx, 2), %%cl;" + "andl $15, %%ecx;" + "movzx Grp_LineBufSP(%%edi), %%eax;" + "orw %%ax, %%ax;" + "jnz .gp4otrlinetr;" + "movw GrphPal(, %%ecx, 2), %%cx;" + "jmp .gp4otrlinenorm;" + ".gp4otrlinetr:" + "jcxz .gp4otrlinenorm;" + "movw GrphPal(, %%ecx, 2), %%cx;" + "jcxz .gp4otrlinenorm;" + "andw %5, %%ax;" + "testw %6, %%cx;" + "jz .gp4otrlinetrI;" + "orw %7, %%ax;" + ".gp4otrlinetrI:" + "andw %5, %%cx;" + "addw %%ax, %%cx;" + "rcrw $1, %%cx;" + ".gp4otrlinenorm:" + "movw %%cx, Grp_LineBuf(%%edi);" + "incw %%bx;" + "andb $1, %%bh;" + "addl $2, %%edi;" + "decw %%dx;" + "jnz .gp4otrlinelp;" + "jmp .gp4tr_end;" + + ".gp4trlinepage0:" + "movl %4, %%edx;" + ".gp4trlinelp:" + "movb GVRAM(%%esi, %%ebx, 2), %%cl;" + "andl $15, %%ecx;" + "movzx Grp_LineBufSP(%%edi), %%eax;" + "orw %%ax, %%ax;" + "jnz .gp4trlinetr;" + + "jcxz .gp4trlineskip;" + "movw GrphPal(, %%ecx, 2), %%cx;" + "jmp .gp4trlinenorm;" + + ".gp4trlinetr:" + "jcxz .gp4trlinenorm;" + "movw GrphPal(, %%ecx, 2), %%cx;" + "jcxz .gp4trlineskip;" + "andw %5, %%ax;" + "testw %6, %%cx;" + "jz .gp4trlinetrI;" + "orw %7, %%ax;" + ".gp4trlinetrI:" + "andw %5, %%cx;" + "addw %%ax, %%cx;" + "rcrw $1, %%cx;" + ".gp4trlinenorm:" + "mov %%cx, Grp_LineBuf(%%edi);" + ".gp4trlineskip:" + "incw %%bx;" + "andb $1, %%bh;" + "addl $2, %%edi;" + "decw %%dx;" + "jnz .gp4trlinelp;" + + ".gp4tr_end:" + "popl %%edi;" + "popl %%esi;" + "popl %%ecx;" + "popl %%ebx;" + : /* output: nothing */ + : "m" (page), "m" (opaq), "m" (VLINE), "m" (CRTC_Regs[0x29]), + "m" (TextDotX), "m" (Pal_HalfMask), "m" (Ibit), "m" (Pal_Ix2) + : "ax", "bx", "cx", "dx"); +#else /* !USE_ASM && !(USE_GAS && __i386__) */ + DWORD x, y; + DWORD v, v0; + DWORD i; + + page &= 3; + + y = GrphScrollY[page] + VLINE; + if ((CRTC_Regs[0x29] & 0x1c) == 0x1c) + y += VLINE; + y = (y & 0x1ff) << 10; + x = GrphScrollX[page] & 0x1ff; + + if (page & 1) { + page >>= 1; + y += page; + + if (opaq) { + for (i = 0; i < TextDotX; ++i, x = (x + 1) & 0x1ff) { + v0 = Grp_LineBufSP[i]; + v = GVRAM[y + x * 2] >> 4; + + if (v0 != 0) { + if (v != 0) { + v = GrphPal[v]; + if (v != 0) { + v0 &= Pal_HalfMask; + if (v & Ibit) + v0 |= Pal_Ix2; + v &= Pal_HalfMask; + v += v0; + v >>= 1; + } + } + } else + v = GrphPal[v]; + Grp_LineBuf[i] = (WORD)v; + } + } else { + for (i = 0; i < TextDotX; ++i, x = (x + 1) & 0x1ff) { + v0 = Grp_LineBufSP[i]; + + if (v0 == 0) { + v = GVRAM[y + x * 2] >> 4; + if (v != 0) + Grp_LineBuf[i] = GrphPal[v]; + } else { + v = GVRAM[y + x * 2] >> 4; + if (v != 0) { + v = GrphPal[v]; + if (v != 0) { + v0 &= Pal_HalfMask; + if (v & Ibit) + v0 |= Pal_Ix2; + v &= Pal_HalfMask; + v += v0; + v = GrphPal[v >> 1]; + Grp_LineBuf[i]=(WORD)v; + } + } else + Grp_LineBuf[i] = (WORD)v; + } + } + } + } else { + page >>= 1; + y += page; + + if (opaq) { + for (i = 0; i < TextDotX; ++i, x = (x + 1) & 0x1ff) { + v = GVRAM[y + x * 2] & 0x0f; + v0 = Grp_LineBufSP[i]; + + if (v0 != 0) { + if (v != 0) { + v = GrphPal[v]; + if (v != 0) { + v0 &= Pal_HalfMask; + if (v & Ibit) + v0 |= Pal_Ix2; + v &= Pal_HalfMask; + v += v0; + v >>= 1; + } + } + } else + v = GrphPal[v]; + Grp_LineBuf[i] = (WORD)v; + } + } else { + for (i = 0; i < TextDotX; ++i, x = (x + 1) & 0x1ff) { + v = GVRAM[y + x * 2] & 0x0f; + v0 = Grp_LineBufSP[i]; + + if (v0 != 0) { + if (v != 0) { + v = GrphPal[v]; + if (v != 0) { + v0 &= Pal_HalfMask; + if (v & Ibit) + v0 |= Pal_Ix2; + v &= Pal_HalfMask; + v += v0; + v >>= 1; + Grp_LineBuf[i]=(WORD)v; + } + } else + Grp_LineBuf[i] = (WORD)v; + } else if (v != 0) + Grp_LineBuf[i] = GrphPal[v]; + } + } + } +#endif /* USE_ASM */ +} + +/* +MS-C のを gas のインラインアセンブリにてけとーに変換 + +s/\<.*:/.&/ +s/[^ \t]/"&/ +s/[^ \t:]$/&;"/ +s/[^ \t]:$/&"/ +s/\/%%&/g +s/\/%%&/g +s/\<[0-9]*[^h]\>/$&/g +s/\([^%]\)\(\<0*[0-9a-fA-F]*\)h/\1$0x\2/g +s/"\([^ \t]*\)[ \t][ \t]*\(.*\), \(.*\);/"\1 \3, \2;/ + + ここはタブ +s/\[/(/g +s/]/)/g +*/ diff --git a/x68k/gvram.h b/x68k/gvram.h new file mode 100644 index 0000000..8a2c469 --- /dev/null +++ b/x68k/gvram.h @@ -0,0 +1,29 @@ +#ifndef _winx68k_gvram +#define _winx68k_gvram + +#include "common.h" + +extern BYTE GVRAM[0x80000]; +extern WORD Grp_LineBuf[1024]; +extern WORD Grp_LineBufSP[1024]; +extern WORD Grp_LineBufSP2[1024]; + +void GVRAM_Init(void); + +void FASTCALL GVRAM_FastClear(void); + +BYTE FASTCALL GVRAM_Read(DWORD adr); +void FASTCALL GVRAM_Write(DWORD adr, BYTE data); + +void Grp_DrawLine16(void); +void FASTCALL Grp_DrawLine8(int page, int opaq); +void FASTCALL Grp_DrawLine4(DWORD page, int opaq); +void FASTCALL Grp_DrawLine4h(void); +void FASTCALL Grp_DrawLine16SP(void); +void FASTCALL Grp_DrawLine8SP(int page/*, int opaq*/); +void FASTCALL Grp_DrawLine4SP(DWORD page/*, int opaq*/); +void FASTCALL Grp_DrawLine4hSP(void); +void FASTCALL Grp_DrawLine8TR(int page, int opaq); +void FASTCALL Grp_DrawLine4TR(DWORD page, int opaq); +#endif + diff --git a/x68k/ioc.c b/x68k/ioc.c new file mode 100644 index 0000000..bbc6ac2 --- /dev/null +++ b/x68k/ioc.c @@ -0,0 +1,46 @@ +// --------------------------------------------------------------------------------------- +// IOC.C - I/O Controller +// --------------------------------------------------------------------------------------- + +#include "common.h" +#include "ioc.h" + + BYTE IOC_IntStat = 0; + BYTE IOC_IntVect = 0; + + +// ----------------------------------------------------------------------- +// 初期化〜 +// ----------------------------------------------------------------------- +void IOC_Init(void) +{ + IOC_IntStat = 0; + IOC_IntVect = 0; +} + + +// ----------------------------------------------------------------------- +// りーど +// ----------------------------------------------------------------------- +BYTE FASTCALL IOC_Read(DWORD adr) +{ + if (adr==0xe9c001) + return IOC_IntStat; + else + return 0xff; +} + + +// ----------------------------------------------------------------------- +// らいと +// ----------------------------------------------------------------------- +void FASTCALL IOC_Write(DWORD adr, BYTE data) +{ + if (adr==0xe9c001) + { + IOC_IntStat &= 0xf0; + IOC_IntStat |= data&0x0f; + } + if (adr==0xe9c003) + IOC_IntVect = (data&0xfc); +} diff --git a/x68k/ioc.h b/x68k/ioc.h new file mode 100644 index 0000000..98dbd73 --- /dev/null +++ b/x68k/ioc.h @@ -0,0 +1,13 @@ +#ifndef _winx68k_ioc +#define _winx68k_ioc + +#include "common.h" + +extern BYTE IOC_IntStat; +extern BYTE IOC_IntVect; + +void IOC_Init(void); +BYTE FASTCALL IOC_Read(DWORD adr); +void FASTCALL IOC_Write(DWORD adr, BYTE data); + +#endif diff --git a/x68k/irqh.c b/x68k/irqh.c new file mode 100644 index 0000000..dc313bc --- /dev/null +++ b/x68k/irqh.c @@ -0,0 +1,80 @@ +// --------------------------------------------------------------------------------------- +// IRQH.C - IRQ Handler (架空のデバイスにょ) +// --------------------------------------------------------------------------------------- + +#include "common.h" +#include "m68000.h" +#include "irqh.h" + + BYTE IRQH_IRQ[8]; + void *IRQH_CallBack[8]; + +// ----------------------------------------------------------------------- +// 初期化 +// ----------------------------------------------------------------------- +void IRQH_Init(void) +{ + ZeroMemory(IRQH_IRQ, 8); +} + + +// ----------------------------------------------------------------------- +// デフォルトのベクタを返す(これが起こったら変だお) +// ----------------------------------------------------------------------- +DWORD FASTCALL IRQH_DefaultVector(BYTE irq) +{ + IRQH_IRQCallBack(irq); + return -1; +} + + +// ----------------------------------------------------------------------- +// 他の割り込みのチェック +// 各デバイスのベクタを返すルーチンから呼ばれます +// ----------------------------------------------------------------------- +void IRQH_IRQCallBack(BYTE irq) +{ + int i; + IRQH_IRQ[irq] = 0; + regs.IRQ_level = 0; + for (i=7; i>0; i--) + { + if (IRQH_IRQ[i]) + { + regs.irq_callback = IRQH_CallBack[i]; + regs.IRQ_level = i; + if ( m68000_ICount ) { // 多重割り込み時(CARAT) + m68000_ICountBk += m68000_ICount; // 強制的に割り込みチェックをさせる + m68000_ICount = 0; // 苦肉の策 ^^; + } + break; + } + } +} + + +// ----------------------------------------------------------------------- +// 割り込み発生 +// ----------------------------------------------------------------------- +void IRQH_Int(BYTE irq, void* handler) +{ + int i; + IRQH_IRQ[irq] = 1; + if (handler==NULL) + IRQH_CallBack[irq] = &IRQH_DefaultVector; + else + IRQH_CallBack[irq] = handler; + for (i=7; i>0; i--) + { + if (IRQH_IRQ[i]) + { + regs.irq_callback = IRQH_CallBack[i]; + regs.IRQ_level = i; + if ( m68000_ICount ) { // 多重割り込み時(CARAT) + m68000_ICountBk += m68000_ICount; // 強制的に割り込みチェックをさせる + m68000_ICount = 0; // 苦肉の策 ^^; + } + return; + } + } +} diff --git a/x68k/irqh.h b/x68k/irqh.h new file mode 100644 index 0000000..3bd4fc5 --- /dev/null +++ b/x68k/irqh.h @@ -0,0 +1,11 @@ +#ifndef _winx68k_irqh +#define _winx68k_irqh + +#include "common.h" + +void IRQH_Init(void); +DWORD FASTCALL IRQH_DefaultVector(BYTE irq); +void IRQH_IRQCallBack(BYTE irq); +void IRQH_Int(BYTE irq, void* handler); + +#endif diff --git a/x68k/m68000.h b/x68k/m68000.h new file mode 100644 index 0000000..0adc20a --- /dev/null +++ b/x68k/m68000.h @@ -0,0 +1,49 @@ +#ifndef _winx68k_m68000 +#define _winx68k_m68000 + +#include "common.h" + +extern void Exception(int nr, DWORD oldpc); +extern int m68000_ICount; +extern int m68000_ICountBk; +extern int ICount; +extern void M68KRUN(void); +extern void M68KRESET(void); + +typedef struct +{ + DWORD d[8]; + DWORD a[8]; + + DWORD isp; + + DWORD sr_high; + DWORD ccr; + DWORD x_carry; + + DWORD pc; + DWORD IRQ_level; + + DWORD sr; + + void *irq_callback; + + DWORD ppc; + DWORD (*reset_callback)(void); + + DWORD sfc; + DWORD dfc; + DWORD usp; + DWORD vbr; + + DWORD bank; + + DWORD memmin; + DWORD memmax; + + DWORD cputype; +} m68k_regs; + +extern m68k_regs regs; + +#endif //_winx68k_m68000__ diff --git a/x68k/mem_wrap.c b/x68k/mem_wrap.c new file mode 100644 index 0000000..7f92da7 --- /dev/null +++ b/x68k/mem_wrap.c @@ -0,0 +1,577 @@ +/* $Id: mem_wrap.c,v 1.2 2003/12/05 18:07:19 nonaka Exp $ */ + +#include "common.h" +#include "memory.h" +#include "m68000.h" +#include "winx68k.h" + +#include "adpcm.h" +#include "bg.h" +#include "crtc.h" +#include "dmac.h" +#include "fdc.h" +#include "gvram.h" +#include "mercury.h" +#include "mfp.h" +#include "midi.h" +#include "ioc.h" +#include "palette.h" +#include "pia.h" +#include "rtc.h" +#include "sasi.h" +#include "scc.h" +#include "scsi.h" +#include "sram.h" +#include "sysport.h" +#include "tvram.h" + +#include "fmg_wrap.h" + +void AdrError(DWORD, DWORD); +void BusError(DWORD, DWORD); + +static void wm_main(DWORD addr, BYTE val); +static void wm_cnt(DWORD addr, BYTE val); +static void FASTCALL wm_buserr(DWORD addr, BYTE val); +static void FASTCALL wm_opm(DWORD addr, BYTE val); +static void FASTCALL wm_e82(DWORD addr, BYTE val); +static void FASTCALL wm_nop(DWORD addr, BYTE val); + +static BYTE FASTCALL rm_main(DWORD addr); +static BYTE FASTCALL rm_font(DWORD addr); +static BYTE FASTCALL rm_ipl(DWORD addr); +static BYTE FASTCALL rm_nop(DWORD addr); +static BYTE FASTCALL rm_opm(DWORD addr); +static BYTE FASTCALL rm_e82(DWORD addr); +static BYTE FASTCALL rm_buserr(DWORD addr); + +BYTE (FASTCALL *MemReadTable[])(DWORD) = { + TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, + TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, + TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, + TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, + TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, + TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, + TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, + TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, TVRAM_Read, + CRTC_Read, rm_e82, DMA_Read, rm_nop, MFP_Read, RTC_Read, rm_nop, SysPort_Read, + rm_opm, ADPCM_Read, FDC_Read, SASI_Read, SCC_Read, PIA_Read, IOC_Read, rm_nop, + SCSI_Read, rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr, MIDI_Read, + BG_Read, BG_Read, BG_Read, BG_Read, BG_Read, BG_Read, BG_Read, BG_Read, +#ifndef NO_MERCURY + rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr, Mcry_Read, rm_buserr, +#else + rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr, +#endif + SRAM_Read, SRAM_Read, SRAM_Read, SRAM_Read, SRAM_Read, SRAM_Read, SRAM_Read, SRAM_Read, + rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr, + rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr, + rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, + rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, + rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, + rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, + rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, + rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, + rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, + rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, + rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, + rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, + rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, + rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, +/* SCSI の場合は rm_buserr になる? */ + rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl, + rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl, + rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl, + rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl, +}; + +void (FASTCALL *MemWriteTable[])(DWORD, BYTE) = { + TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, + TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, + TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, + TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, + TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, + TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, + TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, + TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, TVRAM_Write, + CRTC_Write, wm_e82, DMA_Write, wm_nop, MFP_Write, RTC_Write, wm_nop, SysPort_Write, + wm_opm, ADPCM_Write, FDC_Write, SASI_Write, SCC_Write, PIA_Write, IOC_Write, wm_nop, + SCSI_Write, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, MIDI_Write, + BG_Write, BG_Write, BG_Write, BG_Write, BG_Write, BG_Write, BG_Write, BG_Write, +#ifndef NO_MERCURY + wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, Mcry_Write, wm_buserr, +#else + wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, +#endif + SRAM_Write, SRAM_Write, SRAM_Write, SRAM_Write, SRAM_Write, SRAM_Write, SRAM_Write, SRAM_Write, + wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, + wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, +/* ROMエリアへの書きこみは全てバスエラー */ + wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, + wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, + wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, + wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, + wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, + wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, + wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, + wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, + wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, + wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, + wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, + wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, + wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, + wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, + wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, + wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, +}; + +/* + * write function + */ +void FASTCALL +dma_writemem24(DWORD addr, BYTE val) +{ + + MemByteAccess = 0; + + wm_main(addr, val); +} + +void FASTCALL +dma_writemem24_word(DWORD addr, WORD val) +{ + + MemByteAccess = 0; + + if (addr & 1) { + BusErrFlag |= 4; + return; + } + + wm_main(addr, (val >> 8) & 0xff); + wm_main(addr + 1, val & 0xff); +} + +void FASTCALL +dma_writemem24_dword(DWORD addr, DWORD val) +{ + + MemByteAccess = 0; + + if (addr & 1) { + BusErrFlag |= 4; + return; + } + + wm_main(addr, (val >> 24) & 0xff); + wm_main(addr + 1, (val >> 16) & 0xff); + wm_main(addr + 2, (val >> 8) & 0xff); + wm_main(addr + 3, val & 0xff); +} + +void FASTCALL +cpu_writemem24(DWORD addr, BYTE val) +{ + + MemByteAccess = 0; + BusErrFlag = 0; + + wm_cnt(addr, val); + if (BusErrFlag & 2) { + Memory_ErrTrace(); + BusError(addr, val); + } +} + +void FASTCALL +cpu_writemem24_word(DWORD addr, WORD val) +{ + + MemByteAccess = 0; + + if (addr & 1) { + AdrError(addr, val); + return; + } + + BusErrFlag = 0; + + wm_cnt(addr, (val >> 8) & 0xff); + wm_main(addr + 1, val & 0xff); + + if (BusErrFlag & 2) { + Memory_ErrTrace(); + BusError(addr, val); + } +} + +void FASTCALL +cpu_writemem24_dword(DWORD addr, DWORD val) +{ + + MemByteAccess = 0; + + if (addr & 1) { + AdrError(addr, val); + return; + } + + BusErrFlag = 0; + + wm_cnt(addr, (val >> 24) & 0xff); + wm_main(addr + 1, (val >> 16) & 0xff); + wm_main(addr + 2, (val >> 8) & 0xff); + wm_main(addr + 3, val & 0xff); + + if (BusErrFlag & 2) { + Memory_ErrTrace(); + BusError(addr, val); + } +} + +static void FASTCALL +wm_main(DWORD addr, BYTE val) +{ + + if ((BusErrFlag & 7) == 0) + wm_cnt(addr, val); +} + +static void FASTCALL +wm_cnt(DWORD addr, BYTE val) +{ + + addr &= 0x00ffffff; + if (addr < 0x00a00000) { // RAM 10MB + MEM[addr ^ 1] = val; + } else if (addr < 0x00c00000) { + wm_buserr(addr, val); + } else if (addr < 0x00e00000) { + GVRAM_Write(addr, val); + } else { + MemWriteTable[(addr >> 13) & 0xff](addr, val); + } +} + +static void FASTCALL +wm_buserr(DWORD addr, BYTE val) +{ + + BusErrFlag = 2; + BusErrAdr = addr; + (void)val; +} + +static void FASTCALL +wm_opm(DWORD addr, BYTE val) +{ + BYTE t; + + t = addr & 3; + if (t == 1) { + OPM_Write(0, val); + } else if (t == 3) { + OPM_Write(1, val); + } +} + +static void FASTCALL +wm_e82(DWORD addr, BYTE val) +{ + + if (addr < 0x00e82400) { + Pal_Write(addr, val); + } else if (addr < 0x00e82700) { + VCtrl_Write(addr, val); + } +} + +static void FASTCALL +wm_nop(DWORD addr, BYTE val) +{ + + /* Nothing to do */ + (void)addr; + (void)val; +} + +/* + * read function + */ +BYTE FASTCALL +dma_readmem24(DWORD addr) +{ + + return rm_main(addr); +} + +WORD FASTCALL +dma_readmem24_word(DWORD addr) +{ + WORD v; + + if (addr & 1) { + BusErrFlag = 3; + return 0; + } + + v = rm_main(addr++) << 8; + v |= rm_main(addr); + return v; +} + +DWORD FASTCALL +dma_readmem24_dword(DWORD addr) +{ + DWORD v; + + if (addr & 1) { + BusErrFlag = 3; + return 0; + } + + v = rm_main(addr++) << 24; + v |= rm_main(addr++) << 16; + v |= rm_main(addr++) << 8; + v |= rm_main(addr); + return v; +} + +BYTE FASTCALL +cpu_readmem24(DWORD addr) +{ + BYTE v; + + v = rm_main(addr); + if (BusErrFlag & 1) { + Memory_ErrTrace(); + BusError(addr, 0); + } + return v; +} + +WORD FASTCALL +cpu_readmem24_word(DWORD addr) +{ + WORD v; + + if (addr & 1) { + AdrError(addr, 0); + return 0; + } + + BusErrFlag = 0; + + v = rm_main(addr++) << 8; + v |= rm_main(addr); + if (BusErrFlag & 1) { + Memory_ErrTrace(); + BusError(addr, 0); + } + return v; +} + +DWORD FASTCALL +cpu_readmem24_dword(DWORD addr) +{ + DWORD v; + + MemByteAccess = 0; + + if (addr & 1) { + BusErrFlag = 3; + return 0; + } + + BusErrFlag = 0; + + v = rm_main(addr++) << 24; + v |= rm_main(addr++) << 16; + v |= rm_main(addr++) << 8; + v |= rm_main(addr); + return v; +} + +static BYTE FASTCALL +rm_main(DWORD addr) +{ + BYTE v; + + addr &= 0x00ffffff; + if (addr < 0x00a00000) { // RAM 10MB + v = MEM[addr ^ 1]; + } else if (addr < 0x00c00000) { + rm_buserr(addr); + v = 0; + } else if (addr < 0x00e00000) { + v = GVRAM_Read(addr); + } else { + v = MemReadTable[(addr >> 13) & 0xff](addr); + } + + return v; +} + +static BYTE FASTCALL +rm_font(DWORD addr) +{ + + return FONT[addr & 0xfffff]; +} + +static BYTE FASTCALL +rm_ipl(DWORD addr) +{ + + return IPL[(addr & 0x3ffff) ^ 1]; +} + +static BYTE FASTCALL +rm_nop(DWORD addr) +{ + + (void)addr; + return 0; +} + +static BYTE FASTCALL +rm_opm(DWORD addr) +{ + + if ((addr & 3) == 3) { + return OPM_Read(0); + } + return 0; +} + +static BYTE FASTCALL +rm_e82(DWORD addr) +{ + + if (addr < 0x00e82400) { + return Pal_Read(addr); + } else if (addr < 0x00e83000) { + return VCtrl_Read(addr); + } + return 0; +} + +static BYTE FASTCALL +rm_buserr(DWORD addr) +{ + + BusErrFlag = 1; + BusErrAdr = addr; + + return 0; +} + +/* + * Memory misc + */ +void Memory_Init(void) +{ + + cpu_setOPbase24((DWORD)regs.pc); +} + +void FASTCALL +cpu_setOPbase24(DWORD addr) +{ + + switch ((addr >> 20) & 0xf) { + case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: + case 8: case 9: case 0xa: case 0xb: + OP_ROM = MEM; + break; + + case 0xc: case 0xd: + OP_ROM = GVRAM - 0x00c00000; + break; + + case 0xe: + if (addr < 0x00e80000) + OP_ROM = TVRAM - 0x00e00000; + else if ((addr >= 0x00ea0000) && (addr < 0x00ea2000)) + OP_ROM = SCSIIPL - 0x00ea0000; + else if ((addr >= 0x00ed0000) && (addr < 0x00ed4000)) + OP_ROM = SRAM - 0x00ed0000; + else { + BusErrFlag = 3; + BusErrAdr = addr; + Memory_ErrTrace(); + BusError(addr, 0); + } + break; + + case 0xf: + if (addr >= 0x00fe0000) + OP_ROM = IPL - 0x00fe0000; + else { + BusErrFlag = 3; + BusErrAdr = addr; + Memory_ErrTrace(); + BusError(addr, 0); + } + break; + } +} + +void FASTCALL +Memory_SetSCSIMode(void) +{ + int i; + + for (i = 0xe0; i < 0xf0; i++) { + MemReadTable[i] = rm_buserr; + } +} + +void FASTCALL +Memory_ErrTrace(void) +{ +#ifdef WIN68DEBUG + FILE *fp; + fp=fopen("_buserr.txt", "a"); + if (BusErrFlag==3) + fprintf(fp, "BusErr - SetOP to $%08X @ $%08X\n", BusErrAdr, regs.pc); + else if (BusErrFlag==2) + fprintf(fp, "BusErr - Write to $%08X @ $%08X\n", BusErrAdr, regs.pc); + else + fprintf(fp, "BusErr - Read from $%08X @ $%08X\n", BusErrAdr, regs.pc); + fclose(fp); +// traceflag ++; +// m68000_ICount = 0; +#endif +} + +void FASTCALL +Memory_IntErr(int i) +{ +#ifdef WIN68DEBUG + FILE *fp; + fp=fopen("_interr.txt", "a"); + fprintf(fp, "IntErr - Int.No%d @ $%08X\n", i, regs.pc); + fclose(fp); +#else + (void)i; +#endif +} + +void +AdrError(DWORD adr, DWORD unknown) +{ + + (void)adr; + (void)unknown; + assert(0); +} + +void +BusError(DWORD adr, DWORD unknown) +{ + + (void)adr; + (void)unknown; + assert(0); +} diff --git a/x68k/memory.asm b/x68k/memory.asm new file mode 100644 index 0000000..023014e --- /dev/null +++ b/x68k/memory.asm @@ -0,0 +1,626 @@ +;----------------------------------------------------------------------------- +; Memory & I/O Access Routine for WinX68k +;----------------------------------------------------------------------------- + + BITS 32 + + SECTION .data + +%define _MEM MEM +%define _IPL IPL +%define _OP_ROM OP_ROM +%define _BusErrFlag BusErrFlag +%define _BusErrAdr BusErrAdr +%define _AdrErrAdr AdrErrAdr +%define _MemByteAccess MemByteAccess +%define AdrError @AdrError@8 +%define BusError @BusError@8 + +%define _FONT FONT +%define _GVRAM GVRAM +%define _TVRAM TVRAM +%define _SRAM SRAM +%define _SCSIIPL SCSIIPL + + global _MEM + global _IPL + global _OP_ROM + global _FONT + global _BusErrFlag + global _BusErrAdr + global _AdrErrAdr + global _MemByteAccess + + extern _GVRAM + extern _TVRAM + extern _SRAM + extern _SCSIIPL + + SECTION .text + +;----------------------------------------------------------------------------- + + extern BusError + extern AdrError + + extern @VCtrl_Read@4 + extern @CRTC_Read@4 + extern @GVRAM_Read@4 + extern @TVRAM_Read@4 + extern @BG_Read@4 + extern @Pal_Read@4 + extern @DMA_Read@4 + extern @MFP_Read@4 + extern @RTC_Read@4 + extern @OPM_Read@4 + extern @ADPCM_Read@4 + extern @MIDI_Read@4 + extern @FDC_Read@4 + extern @SASI_Read@4 + extern @SCC_Read@4 + extern @PIA_Read@4 + extern @IOC_Read@4 + extern @SRAM_Read@4 + extern @SysPort_Read@4 + extern @WinDrv_Read@4 + extern @Mcry_Read@4 + extern @SCSI_Read@4 + + extern @VCtrl_Write@8 + extern @CRTC_Write@8 + extern @GVRAM_Write@8 + extern @TVRAM_Write@8 + extern @BG_Write@8 + extern @Pal_Write@8 + extern @DMA_Write@8 + extern @MFP_Write@8 + extern @RTC_Write@8 + extern @OPM_Write@8 + extern @ADPCM_Write@8 + extern @MIDI_Write@8 + extern @FDC_Write@8 + extern @SASI_Write@8 + extern @SCC_Write@8 + extern @PIA_Write@8 + extern @IOC_Write@8 + extern @SRAM_Write@8 + extern @SysPort_Write@8 + extern @WinDrv_Write@8 + extern @Mcry_Write@8 + extern @SCSI_Write@8 + + extern @Memory_ErrTrace@0 + +; 公開I/F + global @cpu_readmem24@4 + global @cpu_readmem24_word@4 + global @cpu_readmem24_dword@4 + global @cpu_writemem24@8 + global @cpu_writemem24_word@8 + global @cpu_writemem24_dword@8 + + global @dma_readmem24@4 + global @dma_readmem24_word@4 + global @dma_readmem24_dword@4 + global @dma_writemem24@8 + global @dma_writemem24_word@8 + global @dma_writemem24_dword@8 + + global @cpu_setOPbase24@4 + + global @Memory_SetSCSIMode@0 + +;----------------------------------------------------------------------------- +; Memory Write +; 後々のために、BusErrとAdrErrはReadMemとは別ルーチンを用意しておこう… + + ALIGN 4 + +@dma_writemem24@8: +; mov byte [_MemByteAccess], 1 ; 神戸恋愛物語 + call wm_main + mov byte [_MemByteAccess], 0 + ret +@dma_writemem24_word@8: + mov byte [_MemByteAccess], 0 + test cl, 1 ; 奇数バウンダリはアドレスエラー + jnz dmaw_jmpae + mov byte [WriteValue], dl ; 下位バイト退避 + shr dx, 8 ; 上位バイト書きこみ + push ecx + call wm_main + pop ecx + inc ecx + mov dl, byte [WriteValue] ; 下位バイト書きこみ + call wm_main + ret +@dma_writemem24_dword@8: + mov byte [_MemByteAccess], 0 + test cl, 1 ; 奇数バウンダリはアドレスエラー + jnz dmaw_jmpae + mov dword [WriteValue], edx ; 書きこみデータ退避 + shr edx, 24 + push ecx + call wm_main + pop ecx + inc ecx + mov dl, byte [WriteValue+2] + push ecx + call wm_main + pop ecx + inc ecx + mov dl, byte [WriteValue+1] + push ecx + call wm_main + pop ecx + inc ecx + mov dl, byte [WriteValue] + call wm_main + ret +dmaw_jmpae: + mov byte [_BusErrFlag], 4 + ret + + +@cpu_writemem24@8: + mov byte [_BusErrFlag], 0 +; mov byte [_MemByteAccess], 1 ; ZOUNDS + mov byte [_MemByteAccess], 0 + call wm_cnt ; バスエラーチェックはいらない +; mov byte [_MemByteAccess], 0 + test byte [_BusErrFlag], 2 + jnz near wm_jmpbe + ret +@cpu_writemem24_word@8: + mov byte [_MemByteAccess], 0 + test cl, 1 ; 奇数バウンダリはアドレスエラー + jnz near wm_jmpae + mov byte [_BusErrFlag], 0 + mov byte [WriteValue], dl ; 下位バイト退避 + shr dx, 8 ; 上位バイト書きこみ + push ecx + call wm_cnt ; バスエラーチェックはいらない + pop ecx + inc ecx + mov dl, byte [WriteValue] ; 下位バイト書きこみ + call wm_main + test byte [_BusErrFlag], 2 + jnz wm_jmpbe + ret +@cpu_writemem24_dword@8: + mov byte [_MemByteAccess], 0 + test cl, 1 ; 奇数バウンダリはアドレスエラー + jnz wm_jmpae + mov byte [_BusErrFlag], 0 + mov dword [WriteValue], edx ; 書きこみデータ退避 + shr edx, 24 + push ecx + call wm_cnt ; バスエラーチェックはいらない + pop ecx + inc ecx + mov dl, byte [WriteValue+2] + push ecx + call wm_main + pop ecx + inc ecx + mov dl, byte [WriteValue+1] + push ecx + call wm_main + pop ecx + inc ecx + mov dl, byte [WriteValue] + call wm_main + test byte [_BusErrFlag], 2 + jnz wm_jmpbe + ret + +wm_jmpae: + jmp AdrError +wm_jmpbe: + call @Memory_ErrTrace@0 + jmp BusError + +wm_main: + test byte [_BusErrFlag], 7 + jz wm_cnt + ret ; 既にバスエラーが起こってたら何もしない(いちおー、ね…) +wm_cnt: + and edx, 0ffh + and ecx, 0ffffffh + cmp ecx, 0a00000h ; Main Memory 10Mb +; cmp ecx, 0c00000h ; Main Memory 12Mb + jc wm_ram + cmp ecx, 0c00000h ; + jc wm_buserr + cmp ecx, 0e00000h ; Graphic VRAM + jc wm_gvram + mov eax, ecx + shr eax, 11 + and eax, 03fch + jmp [MemWriteTable+eax] + +wm_gvram: + jmp @GVRAM_Write@8 + +wm_ram: + xor cl, 1 + mov eax, dword [_MEM] + mov byte [ecx+eax], dl + ret + +wm_opm: + and cl, 3 + cmp cl, 1 + jz wm_opmreg + cmp cl, 3 + jnz wm_nop + mov ecx, 1 + jmp @OPM_Write@8 +wm_opmreg: + xor ecx, ecx + jmp @OPM_Write@8 + +wm_e82_pal: + jmp @Pal_Write@8 +wm_e82_vctrl: + jmp @VCtrl_Write@8 +wm_e82: + cmp ecx, 0e82400h + jc wm_e82_pal + cmp ecx, 0e82700h + jc wm_e82_vctrl + ret ; バスエラーにしない方がいい?(イメージファイトでこの辺のどっか読み込んでる) + +wm_buserr: + mov byte [_BusErrFlag], 2 + mov dword [_BusErrAdr], ecx + ret + +wm_nop: + ret + +;----------------------------------------------------------------------------- +; Memory Read +; + ALIGN 4 + +@dma_readmem24@4: + call rm_main + ret +@dma_readmem24_word@4: + test cl, 1 + jnz dmar_jmpae + push ecx + call rm_main + pop ecx + inc ecx + push ax + call rm_main + pop cx + mov ah, cl + ret +@dma_readmem24_dword@4: + test cl, 1 + jnz dmar_jmpae + push ecx + call rm_main + pop ecx + inc ecx + mov byte [RetValue+3], al + push ecx + call rm_main + pop ecx + inc ecx + mov byte [RetValue+2], al + push ecx + call rm_main + pop ecx + inc ecx + mov byte [RetValue+1], al + call rm_main + mov byte [RetValue], al + mov eax, dword [RetValue] + ret +dmar_jmpae: + mov byte [_BusErrFlag], 3 + ret + + +@cpu_readmem24@4: + call rm_main + test byte [_BusErrFlag], 1 + jnz near rm_jmpbe + ret +@cpu_readmem24_word@4: + test cl, 1 + jnz rm_jmpae + mov byte [_BusErrFlag], 0 + push ecx + call rm_main + pop ecx + inc ecx + push ax + call rm_main + pop cx + test byte [_BusErrFlag], 1 + jnz rm_jmpbe + mov ah, cl + ret +@cpu_readmem24_dword@4: + mov byte [_MemByteAccess], 0 + test cl, 1 + jnz rm_jmpae + mov byte [_BusErrFlag], 0 + push ecx + call rm_main + pop ecx + inc ecx + mov byte [RetValue+3], al + push ecx + call rm_main + pop ecx + inc ecx + mov byte [RetValue+2], al + push ecx + call rm_main + pop ecx + inc ecx + mov byte [RetValue+1], al + call rm_main + test byte [_BusErrFlag], 1 + jnz rm_jmpbe + mov byte [RetValue], al + mov eax, dword [RetValue] + ret + +rm_jmpae: + jmp AdrError +rm_jmpbe: + call @Memory_ErrTrace@0 + jmp BusError + +rm_main: + and ecx, 0ffffffh + cmp ecx, 0a00000h ; Main Memory 10Mb +; cmp ecx, 0c00000h ; Main Memory 12Mb + jc rm_ram + cmp ecx, 0c00000h ; + jc rm_buserr + cmp ecx, 0e00000h ; Graphic VRAM + jc rm_gvram + mov eax, ecx + shr eax, 11 + and eax, 03fch + jmp [MemReadTable+eax] + +rm_gvram: + jmp @GVRAM_Read@4 + +rm_ram: + xor cl, 1 + mov eax, dword [_MEM] + mov al, byte [ecx+eax] + ret +rm_font: + and ecx, 0fffffh + mov eax, dword [_FONT] + mov al, byte [ecx+eax] + ret +rm_ipl: + and ecx, 03ffffh + xor cl, 1 + mov eax, dword [_IPL] + mov al, byte [ecx+eax] + ret + +rm_nop: + xor al, al +; mov al, 0ffh ; Genocide2 → SysPortで対処 + ret + +rm_opm: + and cl, 3 + cmp cl, 3 + jne rm_nop + xor ecx, ecx + jmp @OPM_Read@4 + +rm_e82_pal: + jmp @Pal_Read@4 +rm_e82_vctrl: + jmp @VCtrl_Read@4 +rm_e82: + cmp ecx, 0e82400h + jc rm_e82_pal + cmp ecx, 0e82700h +; cmp ecx, 0e83000h + jc rm_e82_vctrl + + xor al, al ; いめーじふぁいと。バスエラーにしたら死ぬみたい + ret + +rm_buserr: + mov byte [_BusErrFlag], 1 + mov dword [_BusErrAdr], ecx + ret + + +;----------------------------------------------------------------------------- +; Memory Operation Base Set +; マクロにして68KEMに組み込む方が正解かなぁ… + +@cpu_setOPbase24@4: + and ecx, 0ffffffh + mov eax, ecx + shr eax, 20 + and eax, 0fh + jmp [OPBaseTable+eax*4] +setop_mem: + mov eax, dword [_MEM] + mov dword [_OP_ROM], eax + ret +setop_gvr: + mov eax, _GVRAM + sub eax, 0c00000h + mov dword [_OP_ROM], eax + ret +setop_tvr: + cmp ecx, 0e80000h + jc setop_tvram + cmp ecx, 0ea0000h + jc setop_jmpbe + cmp ecx, 0ea2000h + jc setop_scsi + cmp ecx, 0ed0000h + jc setop_jmpbe + cmp ecx, 0ed4000h + jnc setop_jmpbe + mov eax, _SRAM + sub eax, 0ed0000h + mov dword [_OP_ROM], eax + ret +setop_tvram: + mov eax, _TVRAM + sub eax, 0e00000h + mov dword [_OP_ROM], eax + ret + +setop_scsi: + mov eax, _SCSIIPL + cmp ecx, 0ea2000h + jnc setop_jmpbe + sub eax, 0ea0000h + mov dword [_OP_ROM], eax + ret + +setop_rom: + cmp ecx, 0fc0000h + jc near rm_jmpbe + mov eax, dword [_IPL] + sub eax, 0fc0000h + mov dword [_OP_ROM], eax + ret +setop_jmpbe: + mov byte [_BusErrFlag], 3 + mov dword [_BusErrAdr], ecx + call @Memory_ErrTrace@0 + jmp BusError + + +@Memory_SetSCSIMode@0: + mov eax, rm_buserr + mov ebx, 380h + mov ecx, 16 +mem030loop: + mov dword [MemReadTable+ebx], eax + add ebx, 4 + dec ecx + jne mem030loop + ret + + +;----------------------------------------------------------------------------- +; てーぶる類 +; + SECTION .data + + ALIGN 4 + +MemReadTable: + dd @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4 + dd @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4 + dd @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4 + dd @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4 + dd @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4 + dd @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4 + dd @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4 + dd @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4, @TVRAM_Read@4 + dd @CRTC_Read@4, rm_e82, @DMA_Read@4, rm_nop, @MFP_Read@4, @RTC_Read@4, rm_nop, @SysPort_Read@4 + dd rm_opm, @ADPCM_Read@4, @FDC_Read@4, @SASI_Read@4, @SCC_Read@4, @PIA_Read@4, @IOC_Read@4, @WinDrv_Read@4;rm_nop + dd @SCSI_Read@4, rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr, @MIDI_Read@4 + dd @BG_Read@4, @BG_Read@4, @BG_Read@4, @BG_Read@4, @BG_Read@4, @BG_Read@4, @BG_Read@4, @BG_Read@4 +%ifndef NO_MERCURY + dd rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr, @Mcry_Read@4, rm_buserr +%else + dd rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr +%endif + dd @SRAM_Read@4, @SRAM_Read@4, @SRAM_Read@4, @SRAM_Read@4, @SRAM_Read@4, @SRAM_Read@4, @SRAM_Read@4, @SRAM_Read@4 + dd rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr + dd rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr, rm_buserr + + dd rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font + dd rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font + dd rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font + dd rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font + dd rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font + dd rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font + dd rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font + dd rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font + dd rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font + dd rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font + dd rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font + dd rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font, rm_font + dd rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl + dd rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl + dd rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl + dd rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl, rm_ipl + + +MemWriteTable: + dd @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8 + dd @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8 + dd @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8 + dd @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8 + dd @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8 + dd @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8 + dd @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8 + dd @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8, @TVRAM_Write@8 + dd @CRTC_Write@8, wm_e82, @DMA_Write@8, wm_nop, @MFP_Write@8, @RTC_Write@8, wm_nop, @SysPort_Write@8 + dd wm_opm, @ADPCM_Write@8, @FDC_Write@8, @SASI_Write@8, @SCC_Write@8, @PIA_Write@8, @IOC_Write@8, @WinDrv_Write@8;wm_nop + dd @SCSI_Write@8, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, @MIDI_Write@8 + dd @BG_Write@8, @BG_Write@8, @BG_Write@8, @BG_Write@8, @BG_Write@8, @BG_Write@8, @BG_Write@8, @BG_Write@8 +%ifndef NO_MERCURY + dd wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, @Mcry_Write@8, wm_buserr +%else + dd wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr +%endif + dd @SRAM_Write@8, @SRAM_Write@8, @SRAM_Write@8, @SRAM_Write@8, @SRAM_Write@8, @SRAM_Write@8, @SRAM_Write@8, @SRAM_Write@8 + dd wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr + dd wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr +; ROMエリアへの書きこみは全てバスエラー + dd wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr + dd wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr + dd wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr + dd wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr + dd wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr + dd wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr + dd wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr + dd wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr + dd wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr + dd wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr + dd wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr + dd wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr + dd wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr + dd wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr + dd wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr + dd wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr, wm_buserr + + +OPBaseTable: + dd setop_mem, setop_mem, setop_mem, setop_mem, setop_mem, setop_mem, setop_mem, setop_mem + dd setop_mem, setop_mem, setop_mem, setop_mem, setop_gvr, setop_gvr, setop_tvr, setop_rom + + +;----------------------------------------------------------------------------- +; その他のでーた +; +_MEM: dd 0 +_IPL: dd 0 +_OP_ROM: dd 0 +_FONT: dd 0 +_BusErrFlag: dd 0 +_BusErrAdr: dd 0 +_AdrErrAdr: dd 0 +_MemByteAccess: dd 0 +RetValue: dd 0 +WriteValue: dd 0 diff --git a/x68k/memory.h b/x68k/memory.h new file mode 100644 index 0000000..e6372db --- /dev/null +++ b/x68k/memory.h @@ -0,0 +1,47 @@ +#ifndef _winx68k_memory +#define _winx68k_memory + +#include "common.h" + +#define Memory_ReadB cpu_readmem24 +#define Memory_ReadW cpu_readmem24_word +#define Memory_ReadD cpu_readmem24_dword + +#define Memory_WriteB cpu_writemem24 +#define Memory_WriteW cpu_writemem24_word +#define Memory_WriteD cpu_writemem24_dword + +extern BYTE* IPL; +extern BYTE* MEM; +extern BYTE* OP_ROM; +extern BYTE* FONT; + +extern DWORD BusErrFlag; +extern DWORD BusErrAdr; +extern DWORD MemByteAccess; + +void FASTCALL Memory_ErrTrace(void); +void FASTCALL Memory_IntErr(int i); + +void Memory_Init(void); +BYTE FASTCALL Memory_ReadB(DWORD adr); +WORD FASTCALL Memory_ReadW(DWORD adr); +DWORD FASTCALL Memory_ReadD(DWORD adr); + +BYTE FASTCALL dma_readmem24(DWORD adr); +WORD FASTCALL dma_readmem24_word(DWORD adr); +DWORD FASTCALL dma_readmem24_dword(DWORD adr); + +void FASTCALL Memory_WriteB(DWORD adr, BYTE data); +void FASTCALL Memory_WriteW(DWORD adr, WORD data); +void FASTCALL Memory_WriteD(DWORD adr, DWORD data); + +void FASTCALL dma_writemem24(DWORD adr, BYTE data); +void FASTCALL dma_writemem24_word(DWORD adr, WORD data); +void FASTCALL dma_writemem24_dword(DWORD adr, DWORD data); + +void FASTCALL cpu_setOPbase24(DWORD adr); + +void FASTCALL Memory_SetSCSIMode(void); + +#endif diff --git a/x68k/memory_glue.asm b/x68k/memory_glue.asm new file mode 100644 index 0000000..91459ad --- /dev/null +++ b/x68k/memory_glue.asm @@ -0,0 +1,595 @@ + BITS 32 + + SECTION .data + +%define _MEM MEM +%define _IPL IPL +%define _OP_ROM OP_ROM +%define _BusErrFlag BusErrFlag +%define _BusErrAdr BusErrAdr +%define _AdrErrAdr AdrErrAdr +%define _MemByteAccess MemByteAccess + + + extern VCtrl_Read + extern CRTC_Read + extern GVRAM_Read + extern TVRAM_Read + extern BG_Read + extern Pal_Read + extern DMA_Read + extern MFP_Read + extern RTC_Read + extern OPM_Read + extern ADPCM_Read + extern MIDI_Read + extern FDC_Read + extern SASI_Read + extern SCC_Read + extern PIA_Read + extern IOC_Read + extern SRAM_Read + extern SysPort_Read + extern WinDrv_Read + extern Mcry_Read + extern SCSI_Read + + extern VCtrl_Write + extern CRTC_Write + extern GVRAM_Write + extern TVRAM_Write + extern BG_Write + extern Pal_Write + extern DMA_Write + extern MFP_Write + extern RTC_Write + extern OPM_Write + extern ADPCM_Write + extern MIDI_Write + extern FDC_Write + extern SASI_Write + extern SCC_Write + extern PIA_Write + extern IOC_Write + extern SRAM_Write + extern SysPort_Write + extern WinDrv_Write + extern Mcry_Write + extern SCSI_Write + + extern Memory_ErrTrace + + SECTION .text + + global @VCtrl_Read@4 + global @CRTC_Read@4 + global @GVRAM_Read@4 + global @TVRAM_Read@4 + global @BG_Read@4 + global @Pal_Read@4 + global @DMA_Read@4 + global @MFP_Read@4 + global @RTC_Read@4 + global @OPM_Read@4 + global @ADPCM_Read@4 + global @MIDI_Read@4 + global @FDC_Read@4 + global @SASI_Read@4 + global @SCC_Read@4 + global @PIA_Read@4 + global @IOC_Read@4 + global @SRAM_Read@4 + global @SysPort_Read@4 + global @WinDrv_Read@4 + global @Mcry_Read@4 + global @SCSI_Read@4 + + global @VCtrl_Write@8 + global @CRTC_Write@8 + global @GVRAM_Write@8 + global @TVRAM_Write@8 + global @BG_Write@8 + global @Pal_Write@8 + global @DMA_Write@8 + global @MFP_Write@8 + global @RTC_Write@8 + global @OPM_Write@8 + global @ADPCM_Write@8 + global @MIDI_Write@8 + global @FDC_Write@8 + global @SASI_Write@8 + global @SCC_Write@8 + global @PIA_Write@8 + global @IOC_Write@8 + global @SRAM_Write@8 + global @SysPort_Write@8 + global @WinDrv_Write@8 + global @Mcry_Write@8 + global @SCSI_Write@8 + + global @Memory_ErrTrace@0 + +; +; read +; + ALIGN 4 +@VCtrl_Read@4: + pushad + push ecx + call VCtrl_Read + pop ecx + mov [esp + 28], al + popad + ret + + ALIGN 4 +@CRTC_Read@4: + pushad + push ecx + call CRTC_Read + pop ecx + mov [esp + 28], al + popad + ret + + ALIGN 4 +@GVRAM_Read@4: + pushad + push ecx + call GVRAM_Read + pop ecx + mov [esp + 28], al + popad + ret + + ALIGN 4 +@TVRAM_Read@4: + pushad + push ecx + call TVRAM_Read + pop ecx + mov [esp + 28], al + popad + ret + + ALIGN 4 +@BG_Read@4: + pushad + push ecx + call BG_Read + pop ecx + mov [esp + 28], al + popad + ret + + ALIGN 4 +@Pal_Read@4: + pushad + push ecx + call Pal_Read + pop ecx + mov [esp + 28], al + popad + ret + + ALIGN 4 +@DMA_Read@4: + pushad + push ecx + call DMA_Read + pop ecx + mov [esp + 28], al + popad + ret + + ALIGN 4 +@MFP_Read@4: + pushad + push ecx + call MFP_Read + pop ecx + mov [esp + 28], al + popad + ret + + ALIGN 4 +@RTC_Read@4: + pushad + push ecx + call RTC_Read + pop ecx + mov [esp + 28], al + popad + ret + + ALIGN 4 +@OPM_Read@4: + pushad + push ecx + call OPM_Read + pop ecx + mov [esp + 28], al + popad + ret + + ALIGN 4 +@ADPCM_Read@4: + pushad + push ecx + call ADPCM_Read + pop ecx + mov [esp + 28], al + popad + ret + + ALIGN 4 +@MIDI_Read@4: + pushad + push ecx + call MIDI_Read + pop ecx + mov [esp + 28], al + popad + ret + + ALIGN 4 +@FDC_Read@4: + pushad + push ecx + call FDC_Read + pop ecx + mov [esp + 28], al + popad + ret + + ALIGN 4 +@SASI_Read@4: + pushad + push ecx + call SASI_Read + pop ecx + mov [esp + 28], al + popad + ret + + ALIGN 4 +@SCC_Read@4: + pushad + push ecx + call SCC_Read + pop ecx + mov [esp + 28], al + popad + ret + + ALIGN 4 +@PIA_Read@4: + pushad + push ecx + call PIA_Read + pop ecx + mov [esp + 28], al + popad + ret + + ALIGN 4 +@IOC_Read@4: + pushad + push ecx + call IOC_Read + pop ecx + mov [esp + 28], al + popad + ret + + ALIGN 4 +@SRAM_Read@4: + pushad + push ecx + call SRAM_Read + pop ecx + mov [esp + 28], al + popad + ret + + ALIGN 4 +@SysPort_Read@4: + pushad + push ecx + call SysPort_Read + pop ecx + mov [esp + 28], al + popad + ret + + ALIGN 4 +@WinDrv_Read@4: +%if 1 + mov al, 0ffh +%else + pushad + push ecx + call WinDrv_Read + pop ecx + mov [esp + 28], al + popad +%endif + ret + + ALIGN 4 +@Mcry_Read@4: + pushad + push ecx + call Mcry_Read + pop ecx + mov [esp + 28], al + popad + ret + + ALIGN 4 +@SCSI_Read@4: + pushad + push ecx + call SCSI_Read + pop ecx + mov [esp + 28], al + popad + ret + + +; +; write +; + ALIGN 4 +@VCtrl_Write@8: + pushad + push edx + push ecx + call VCtrl_Write + pop ecx + pop edx + popad + ret + + ALIGN 4 +@CRTC_Write@8: + pushad + push edx + push ecx + call CRTC_Write + pop ecx + pop edx + popad + ret + + ALIGN 4 +@GVRAM_Write@8: + pushad + push edx + push ecx + call GVRAM_Write + pop ecx + pop edx + popad + ret + + ALIGN 4 +@TVRAM_Write@8: + pushad + push edx + push ecx + call TVRAM_Write + pop ecx + pop edx + popad + ret + + ALIGN 4 +@BG_Write@8: + pushad + push edx + push ecx + call BG_Write + pop ecx + pop edx + popad + ret + + ALIGN 4 +@Pal_Write@8: + pushad + push edx + push ecx + call Pal_Write + pop ecx + pop edx + popad + ret + + ALIGN 4 +@DMA_Write@8: + pushad + push edx + push ecx + call DMA_Write + pop ecx + pop edx + popad + ret + + ALIGN 4 +@MFP_Write@8: + pushad + push edx + push ecx + call MFP_Write + pop ecx + pop edx + popad + ret + + ALIGN 4 +@RTC_Write@8: + pushad + push edx + push ecx + call RTC_Write + pop ecx + pop edx + popad + ret + + ALIGN 4 +@OPM_Write@8: + pushad + push edx + push ecx + call OPM_Write + pop ecx + pop edx + popad + ret + + ALIGN 4 +@ADPCM_Write@8: + pushad + push edx + push ecx + call ADPCM_Write + pop ecx + pop edx + popad + ret + + ALIGN 4 +@MIDI_Write@8: + pushad + push edx + push ecx + call MIDI_Write + pop ecx + pop edx + popad + ret + + ALIGN 4 +@FDC_Write@8: + pushad + push edx + push ecx + call FDC_Write + pop ecx + pop edx + popad + ret + + ALIGN 4 +@SASI_Write@8: + pushad + push edx + push ecx + call SASI_Write + pop ecx + pop edx + popad + ret + + ALIGN 4 +@SCC_Write@8: + pushad + push edx + push ecx + call SCC_Write + pop ecx + pop edx + popad + ret + + ALIGN 4 +@PIA_Write@8: + pushad + push edx + push ecx + call PIA_Write + pop ecx + pop edx + popad + ret + + ALIGN 4 +@IOC_Write@8: + pushad + push edx + push ecx + call IOC_Write + pop ecx + pop edx + popad + ret + + ALIGN 4 +@SRAM_Write@8: + pushad + push edx + push ecx + call SRAM_Write + pop ecx + pop edx + popad + ret + + ALIGN 4 +@SysPort_Write@8: + pushad + push edx + push ecx + call SysPort_Write + pop ecx + pop edx + popad + ret + + ALIGN 4 +@WinDrv_Write@8: +%if 0 + pushad + push edx + push ecx + call WinDrv_Write + pop ecx + pop edx + popad +%endif + ret + + ALIGN 4 +@Mcry_Write@8: + pushad + push edx + push ecx + call Mcry_Write + pop ecx + pop edx + popad + ret + + ALIGN 4 +@SCSI_Write@8: + pushad + push edx + push ecx + call SCSI_Write + pop ecx + pop edx + popad + ret + + +; +; memory trace +; +@Memory_ErrTrace@0: +%if 0 + ; XXX +%endif + ret diff --git a/x68k/mercury.c b/x68k/mercury.c new file mode 100644 index 0000000..9be537b --- /dev/null +++ b/x68k/mercury.c @@ -0,0 +1,320 @@ +// --------------------------------------------------------------------------------------- +// MERCURY.C - ま〜きゅり〜ゆにっと +// --------------------------------------------------------------------------------------- + +#include "common.h" +#include "dswin.h" +#include "fmg_wrap.h" +#include "dmac.h" +#include "m68000.h" +#include "irqh.h" +#include "mercury.h" +#include + +#define MCRY_IRQ 4 +#define Mcry_BufSize 48000*2 + +long Mcry_WrPtr = 0; +long Mcry_RdPtr = 0; +long Mcry_SampleRate = 44100; +long Mcry_ClockRate = 44100; +long Mcry_Count = 0; +BYTE Mcry_Status = 0; +BYTE Mcry_LRTiming = 0; +short Mcry_OutDataL = 0; +short Mcry_OutDataR = 0; +short Mcry_BufL[Mcry_BufSize]; +short Mcry_BufR[Mcry_BufSize]; +long Mcry_PreCounter = 0; + +short Mcry_OldR, Mcry_OldL; +int Mcry_DMABytes = 0; +static double Mcry_VolumeShift = 65536; +static int Mcry_SampleCnt = 0; +static BYTE Mcry_Vector = 255; + +extern BYTE BusErrFlag; +extern m68k_regs regs; + + +DWORD FASTCALL Mcry_IntCB(BYTE irq) +{ + DWORD ret = 0xffffffff; + IRQH_IRQCallBack(irq); + if ( irq==MCRY_IRQ ) { + ret = (DWORD)Mcry_Vector; + } + return ret; +} + +void FASTCALL Mcry_Int(void) +{ + IRQH_Int(MCRY_IRQ, &Mcry_IntCB); +} + + +static long Mcry_Clocks[8] = { + 22050, 16000, 22050, 24000 +}; + + +int Mcry_IsReady(void) +{ + return (Mcry_SampleCnt>0); +} + + +// ----------------------------------------------------------------------- +// MPU経過クロック時間分だけデータをバッファに溜める +// ----------------------------------------------------------------------- +void FASTCALL Mcry_PreUpdate(DWORD clock) +{ + Mcry_PreCounter += (Mcry_ClockRate*clock); + while(Mcry_PreCounter>=10000000L) + { + Mcry_SampleCnt++; + Mcry_PreCounter -= 10000000L; + } + M288_Timer(clock); +} + + +// ----------------------------------------------------------------------- +// DSoundからの要求分だけバッファを埋める +// ----------------------------------------------------------------------- +void FASTCALL Mcry_Update(signed short *buffer, DWORD length) +{ + int data; + + if (!length) return; + + M288_Update(buffer, length); + while (length) + { + if ( Mcry_WrPtr==Mcry_RdPtr ) { + Mcry_SampleCnt = 1; + DMA_Exec(2); DMA_Exec(2); + } + + if (Mcry_WrPtr!=Mcry_RdPtr) + { + Mcry_OldL = Mcry_BufL[Mcry_RdPtr]; + Mcry_OldR = Mcry_BufR[Mcry_RdPtr]; + Mcry_RdPtr++; + if (Mcry_RdPtr>=Mcry_BufSize) Mcry_RdPtr=0; + } + + data = *buffer; + data += Mcry_OldL; + if (data>32767) data = 32767; + else if (data<(-32768)) data = -32768; + *(buffer++) = (short)data; + + data = *buffer; + data += Mcry_OldR; + if (data>32767) data = 32767; + else if (data<(-32768)) data = -32768; + *(buffer++) = (short)data; + + length--; + } +} + + +// ----------------------------------------------------------------------- +// 1回分(1Word x 2ch)のデータをバッファに書き出し +// ----------------------------------------------------------------------- +INLINE void Mcry_WriteOne(void) +{ + while (Mcry_Count=Mcry_BufSize) Mcry_WrPtr=0; + } + Mcry_Count -= Mcry_SampleRate; + Mcry_SampleCnt--; +} + + +// ----------------------------------------------------------------------- +// I/O Write +// ----------------------------------------------------------------------- +void FASTCALL Mcry_Write(DWORD adr, BYTE data) +{ + if ((adr == 0xecc080)||(adr == 0xecc081)||(adr == 0xecc000)||(adr == 0xecc001)) // Data Port + { + if ( Mcry_SampleCnt<=0 ) return; + if ( Mcry_Status&2 ) { // Stereo + if (Mcry_LRTiming) // 右 + { + if (!(Mcry_Status&8)) data=0; // R Mute + if (adr&1) // Low Byte + { + Mcry_OutDataR = (Mcry_OutDataR&0xff00)|data; + Mcry_LRTiming ^= 1; + Mcry_WriteOne(); + } + else // High Byte + { + Mcry_OutDataR = (Mcry_OutDataR&0x00ff)|((WORD)data<<8); + } + } + else // 左 + { + if (!(Mcry_Status&4)) data=0; // L Mute + if (adr&1) // Low Byte + { + Mcry_OutDataL = (Mcry_OutDataL&0xff00)|data; + Mcry_LRTiming ^= 1; + } + else // High Byte + { + Mcry_OutDataL = (Mcry_OutDataL&0x00ff)|((WORD)data<<8); + } + } + } else { // Mono + if (adr&1) // Low Byte + { + Mcry_OutDataR = ((Mcry_Status&8)?((Mcry_OutDataR&0xff00)|data):0); + Mcry_OutDataL = ((Mcry_Status&4)?((Mcry_OutDataL&0xff00)|data):0); + Mcry_LRTiming ^= 1; + Mcry_WriteOne(); + } + else // High Byte + { + Mcry_OutDataR = ((Mcry_Status&8)?((Mcry_OutDataR&0x00ff)|((WORD)data<<8)):0); + Mcry_OutDataL = ((Mcry_Status&4)?((Mcry_OutDataL&0x00ff)|((WORD)data<<8)):0); + } + } + } + else if ((adr == 0xecc091)||(adr == 0xecc011)) + { +/*{ +FILE* fp = fopen("_mercury.txt", "a"); +fprintf(fp, "StW $%08X $%02X\n", adr, data); +fclose(fp); +}*/ + if (Mcry_Status != data) + { + Mcry_Status = data; + Mcry_SetClock(); + } + } + else if ( adr== 0xecc0b1 ) // Int Vector + { + Mcry_Vector = data; + } + else if ( (adr>=0xecc0c0)&&(adr<=0xecc0c7)&&(adr&1) ) // 満開版まーきゅりー OPN + { +/*{ +FILE* fp = fopen("_mercury.txt", "a"); +fprintf(fp, "W $%08X $%02X\n", adr, data); +fclose(fp); +}*/ + M288_Write((BYTE)((adr>>1)&3), data); + } +} + + +// ----------------------------------------------------------------------- +// I/O Read +// ----------------------------------------------------------------------- +BYTE FASTCALL Mcry_Read(DWORD adr) +{ + BYTE ret = 0; + if ((adr == 0xecc080)||(adr == 0xecc081)||(adr == 0xecc000)||(adr == 0xecc001)) + { + } + else if ((adr == 0xecc0a1)||(adr == 0xecc021)) // Status Port + { + ret = ((Mcry_Status&0xf0)|0x0f); + } + else if ((adr == 0xecc091)||(adr == 0xecc011)) // + { + } + else if ((adr == 0xecc090)||(adr == 0xecc010)) // + { + ret = (Mcry_LRTiming<<3); + Mcry_LRTiming ^= 1; + } + else if ( adr== 0xecc0b1 ) // Int Vector + { + ret = Mcry_Vector; + } + else if ( (adr>=0xecc0c0)&&(adr<=0xecc0c7)&&(adr&1) ) // 満開版まーきゅりー OPN + { + ret = M288_Read((BYTE)((adr>>1)&3)); +/*{ +FILE* fp = fopen("_mercury.txt", "a"); +fprintf(fp, "R $%08X $%02X\n", adr, ret); +fclose(fp); +}*/ + } + else if ( adr>=0xecc100 ) + { // Bus Error? + BusErrFlag = 1; + } + return ret; +} + + +// ----------------------------------------------------------------------- +// 再生クロック設定 +// ----------------------------------------------------------------------- +void Mcry_SetClock(void) +{ + Mcry_ClockRate = Mcry_Clocks[(Mcry_Status>>4)&3]; + if (Mcry_Status&0x80) Mcry_ClockRate *= 2; + Mcry_Count = 0; + Mcry_PreCounter = 0; +// Mcry_RdPtr = 0; +// Mcry_WrPtr = 0; +} + + +// ----------------------------------------------------------------------- +// ぼりゅーむ設定 +// ----------------------------------------------------------------------- +void Mcry_SetVolume(BYTE vol) +{ + if (vol>16) vol=16; +// if (vol<0) vol=0; + + if (vol) + Mcry_VolumeShift = pow(1.189207115, (16-vol)); + else + Mcry_VolumeShift = 65536; // Mute + M288_SetVolume(vol); +} + + +// ----------------------------------------------------------------------- +// 初期化〜 +// ----------------------------------------------------------------------- +void Mcry_Init(DWORD samplerate, const char* path) +{ + ZeroMemory(Mcry_BufL, Mcry_BufSize*2); + ZeroMemory(Mcry_BufR, Mcry_BufSize*2); + + Mcry_WrPtr = 0; + Mcry_RdPtr = 0; + Mcry_OutDataL = 0; + Mcry_OutDataR = 0; + Mcry_Status = 0; + Mcry_SampleRate = (long)samplerate; + Mcry_LRTiming = 0; + Mcry_PreCounter = 0; + + Mcry_SetClock(); + + M288_Init(8000000, samplerate, path); +} + + +void Mcry_Cleanup(void) +{ + M288_Cleanup(); +} diff --git a/x68k/mercury.h b/x68k/mercury.h new file mode 100644 index 0000000..baaf1ef --- /dev/null +++ b/x68k/mercury.h @@ -0,0 +1,22 @@ +#ifndef _winx68k_mercury_h +#define _winx68k_mercury_h + +extern BYTE Mcry_LRTiming; + +void FASTCALL Mcry_Update(signed short *buffer, DWORD length); +void FASTCALL Mcry_PreUpdate(DWORD clock); + +void FASTCALL Mcry_Write(DWORD adr, BYTE data); +BYTE FASTCALL Mcry_Read(DWORD adr); + +void Mcry_SetClock(void); +void Mcry_SetVolume(BYTE vol); + +void Mcry_Init(DWORD samplerate, const char* path); +void Mcry_Cleanup(void); +int Mcry_IsReady(void); + +void FASTCALL Mcry_Int(void); + +#endif + diff --git a/x68k/mfp.c b/x68k/mfp.c new file mode 100644 index 0000000..0f581f9 --- /dev/null +++ b/x68k/mfp.c @@ -0,0 +1,350 @@ +// --------------------------------------------------------------------------------------- +// MFP.C - MFP (Multi-Function Periferal) +// --------------------------------------------------------------------------------------- + +#include "mfp.h" +#include "irqh.h" +#include "crtc.h" +#include "m68000.h" +#include "winx68k.h" +#include "keyboard.h" + +extern BYTE traceflag; +BYTE testflag=0; +BYTE LastKey = 0; + +BYTE MFP[24]; +BYTE Timer_TBO = 0; +static BYTE Timer_Reload[4] = {0, 0, 0, 0}; +static int Timer_Tick[4] = {0, 0, 0, 0}; +static const int Timer_Prescaler[8] = {1, 10, 25, 40, 125, 160, 250, 500}; + +// ----------------------------------------------------------------------- +// 優先割り込みのチェックをし、該当ベクタを返す +// ----------------------------------------------------------------------- +DWORD FASTCALL MFP_IntCallback(BYTE irq) +{ + BYTE flag; + DWORD vect; + int offset = 0; + IRQH_IRQCallBack(irq); + if (irq!=6) return (DWORD)-1; + for (flag=0x80, vect=15; flag; flag>>=1, vect--) + { + if ((MFP[MFP_IPRA]&flag)&&(MFP[MFP_IMRA]&flag)&&(!(MFP[MFP_ISRA]&flag))) + break; + } + if (!flag) + { + offset = 1; + for (flag=0x80, vect=7; flag; flag>>=1, vect--) + { + if ((MFP[MFP_IPRB]&flag)&&(MFP[MFP_IMRB]&flag)&&(!(MFP[MFP_ISRB]&flag))) + break; + } + } + if (!flag) + { + Error("MFP Int w/o Request. Default Vector(-1) has been returned."); + return (DWORD)-1; + } + + MFP[MFP_IPRA+offset] &= (~flag); + if (MFP[MFP_VR]&8) + MFP[MFP_ISRA+offset] |= flag; + vect |= (MFP[MFP_VR]&0xf0); + for (flag=0x80; flag; flag>>=1) + { + if ((MFP[MFP_IPRA]&flag)&&(MFP[MFP_IMRA]&flag)&&(!(MFP[MFP_ISRA]&flag))) + { + IRQH_Int(6, &MFP_IntCallback); + break; + } + if ((MFP[MFP_IPRB]&flag)&&(MFP[MFP_IMRB]&flag)&&(!(MFP[MFP_ISRB]&flag))) + { + IRQH_Int(6, &MFP_IntCallback); + break; + } + } + return vect; +} + + +// ----------------------------------------------------------------------- +// 割り込みが取り消しになってないか調べます +// ----------------------------------------------------------------------- +void MFP_RecheckInt(void) +{ + BYTE flag; + IRQH_IRQCallBack(6); + for (flag=0x80; flag; flag>>=1) + { + if ((MFP[MFP_IPRA]&flag)&&(MFP[MFP_IMRA]&flag)&&(!(MFP[MFP_ISRA]&flag))) + { + IRQH_Int(6, &MFP_IntCallback); + break; + } + if ((MFP[MFP_IPRB]&flag)&&(MFP[MFP_IMRB]&flag)&&(!(MFP[MFP_ISRB]&flag))) + { + IRQH_Int(6, &MFP_IntCallback); + break; + } + } +} + + +// ----------------------------------------------------------------------- +// 割り込み発生 +// ----------------------------------------------------------------------- +void MFP_Int(int irq) // 'irq' は 0が最優先(HSYNC/GPIP7)、15が最下位(ALARM) +{ // ベクタとは番号の振り方が逆になるので注意〜 + BYTE flag = 0x80; + if (irq<8) + { + flag >>= irq; + if (MFP[MFP_IERA]&flag) + { + MFP[MFP_IPRA] |= flag; + if ((MFP[MFP_IMRA]&flag)&&(!(MFP[MFP_ISRA]&flag))) + { + IRQH_Int(6, &MFP_IntCallback); + } + } + } + else + { + irq -= 8; + flag >>= irq; + if (MFP[MFP_IERB]&flag) + { + MFP[MFP_IPRB] |= flag; + if ((MFP[MFP_IMRB]&flag)&&(!(MFP[MFP_ISRB]&flag))) + { + IRQH_Int(6, &MFP_IntCallback); + } + } + } +} + + +// ----------------------------------------------------------------------- +// 初期化 +// ----------------------------------------------------------------------- +void MFP_Init(void) +{ + int i; + static const BYTE initregs[24] = { + 0x7b, 0x06, 0x00, 0x18, 0x3e, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x3e, 0x40, 0x08, 0x01, 0x77, 0x01, + 0x0d, 0xc8, 0x14, 0x00, 0x88, 0x01, 0x81, 0x00 + }; + memcpy(MFP, initregs, 24); + for (i=0; i<4; i++) Timer_Tick[i] = 0; +} + + +// ----------------------------------------------------------------------- +// I/O Read +// ----------------------------------------------------------------------- +BYTE FASTCALL MFP_Read(DWORD adr) +{ + BYTE reg; + BYTE ret = 0; + int hpos; + + if (adr>0xe8802f) return ret; // ばすえらー? + + if (adr&1) + { + reg=(BYTE)((adr&0x3f)>>1); + switch(reg) + { + case MFP_GPIP: + if ( (vline>=CRTC_VSTART)&&(vline=((int)CRTC_Regs[5]*HSYNC_CLK/CRTC_Regs[1]))&&(hpos<((int)CRTC_Regs[7]*HSYNC_CLK/CRTC_Regs[1])) ) + ret &= 0x7f; + else + ret |= 0x80; + if (vline!=CRTC_IntLine) + ret |= 0x40; + break; + case MFP_UDR: + ret = LastKey; + KeyIntFlag = 0; + break; + case MFP_RSR: + if (KeyBufRP!=KeyBufWP) + ret = MFP[reg] & 0x7f; + else + ret = MFP[reg] | 0x80; + break; + default: + ret = MFP[reg]; + } + return ret; + } + else + return 0xff; +} + + +// ----------------------------------------------------------------------- +// I/O Write +// ----------------------------------------------------------------------- +void FASTCALL MFP_Write(DWORD adr, BYTE data) +{ + BYTE reg; + if (adr>0xe8802f) return; +/*if(adr==0xe88009){ +FILE* fp = fopen("_mfp.txt", "a"); +fprintf(fp, "Write Adr=$%08X Data=$%02X PC=$%08X\n", adr, data, regs.pc); +fclose(fp); +}*/ + if (adr&1) + { + reg=(BYTE)((adr&0x3f)>>1); + + switch(reg) + { + case MFP_IERA: + case MFP_IERB: + MFP[reg] = data; + MFP[reg+2] &= data; // 禁止されたものはIPRA/Bを落とす + MFP_RecheckInt(); + break; + case MFP_IPRA: + case MFP_IPRB: + case MFP_ISRA: + case MFP_ISRB: + MFP[reg] &= data; + MFP_RecheckInt(); + break; + case MFP_IMRA: + case MFP_IMRB: + MFP[reg] = data; + MFP_RecheckInt(); + break; + case MFP_TSR: + MFP[reg] = data|0x80; // Txは常にEnableに + break; + case MFP_TADR: + Timer_Reload[0] = MFP[reg] = data; + break; + case MFP_TACR: + MFP[reg] = data; + break; + case MFP_TBDR: + Timer_Reload[1] = MFP[reg] = data; + break; + case MFP_TBCR: + MFP[reg] = data; + if ( MFP[reg]&0x10 ) Timer_TBO = 0; + break; + case MFP_TCDR: + Timer_Reload[2] = MFP[reg] = data; + break; + case MFP_TDDR: + Timer_Reload[3] = MFP[reg] = data; + break; + case MFP_TCDCR: + MFP[reg] = data; + break; + case MFP_UDR: + break; + default: + MFP[reg] = data; + } + } +/*{ +FILE* fp = fopen("_mfp.txt", "a"); +fprintf(fp, "MFP Timer - A:$%08X TACR:$%02X TADR:$%02X\n", Timer_Count[0], MFP[MFP_TACR], MFP[MFP_TADR]); +fprintf(fp, "MFP Timer - B:$%08X TBCR:$%02X TBDR:$%02X\n", Timer_Count[1], MFP[MFP_TBCR], MFP[MFP_TBDR]); +fprintf(fp, "MFP Timer - C/D:$%08X $%08X TCDCR:$%02X TCDR:$%02X TDDR:$%02X\n", Timer_Count[2], Timer_Count[3], MFP[MFP_TCDCR], MFP[MFP_TCDR], MFP[MFP_TDDR]); +fclose(fp); +}*/ +} + + +short timertrace = 0; +//static int TimerACounted = 0; +// ----------------------------------------------------------------------- +// たいまの時間を進める(も少し奇麗に書き直そう……) +// ----------------------------------------------------------------------- +void FASTCALL MFP_Timer(long clock) +{ + if ( (!(MFP[MFP_TACR]&8))&&(MFP[MFP_TACR]&7) ) { + int t = Timer_Prescaler[MFP[MFP_TACR]&7]; + Timer_Tick[0] += clock; + while ( Timer_Tick[0]>=t ) { + Timer_Tick[0] -= t; + MFP[MFP_TADR]--; + if ( !MFP[MFP_TADR] ) { + MFP[MFP_TADR] = Timer_Reload[0]; + MFP_Int(2); + } + } + } + + if ( MFP[MFP_TBCR]&7 ) { + int t = Timer_Prescaler[MFP[MFP_TBCR]&7]; + Timer_Tick[1] += clock; + while ( Timer_Tick[1]>=t ) { + Timer_Tick[1] -= t; + MFP[MFP_TBDR]--; + if ( !MFP[MFP_TBDR] ) { + MFP[MFP_TBDR] = Timer_Reload[1]; + MFP_Int(7); + } + } + } + + if ( MFP[MFP_TCDCR]&0x70 ) { + int t = Timer_Prescaler[(MFP[MFP_TCDCR]&0x70)>>4]; + Timer_Tick[2] += clock; + while ( Timer_Tick[2]>=t ) { + Timer_Tick[2] -= t; + MFP[MFP_TCDR]--; + if ( !MFP[MFP_TCDR] ) { + MFP[MFP_TCDR] = Timer_Reload[2]; + MFP_Int(10); + } + } + } + + if ( MFP[MFP_TCDCR]&7 ) { + int t = Timer_Prescaler[MFP[MFP_TCDCR]&7]; + Timer_Tick[3] += clock; + while ( Timer_Tick[3]>=t ) { + Timer_Tick[3] -= t; + MFP[MFP_TDDR]--; + if ( !MFP[MFP_TDDR] ) { + MFP[MFP_TDDR] = Timer_Reload[3]; + MFP_Int(11); + } + } + } +} + + +void FASTCALL MFP_TimerA(void) +{ + if ( (MFP[MFP_TACR]&15)==8 ) { // いべんとかうんともーど(VDispでカウント) + if ( MFP[MFP_AER]&0x10 ) { // VDisp割り込みとタイミングが違ってるのが気になるといえば気になる(ぉぃ + if (vline==CRTC_VSTART) MFP[MFP_TADR]--; // 本来は同じだと思うんだけどなぁ……それじゃ動かんし(汗 + } else { + if ( CRTC_VEND>=VLINE_TOTAL ) { + if ( (long)vline==(VLINE_TOTAL-1) ) MFP[MFP_TADR]--; // 表示期間の終わりでカウントらしひ…(ろーどす) + } else { + if ( vline==CRTC_VEND ) MFP[MFP_TADR]--; + } + } + if ( !MFP[MFP_TADR] ) { + MFP[MFP_TADR] = Timer_Reload[0]; + MFP_Int(2); + } + } +} diff --git a/x68k/mfp.h b/x68k/mfp.h new file mode 100644 index 0000000..5efe8b9 --- /dev/null +++ b/x68k/mfp.h @@ -0,0 +1,45 @@ +#ifndef _winx68k_mfp +#define _winx68k_mfp + +#include "common.h" + +extern BYTE MFP[24]; + +#define MFP_GPIP 0 +#define MFP_AER 1 +#define MFP_DDR 2 +#define MFP_IERA 3 +#define MFP_IERB 4 +#define MFP_IPRA 5 +#define MFP_IPRB 6 +#define MFP_ISRA 7 +#define MFP_ISRB 8 +#define MFP_IMRA 9 +#define MFP_IMRB 10 +#define MFP_VR 11 +#define MFP_TACR 12 +#define MFP_TBCR 13 +#define MFP_TCDCR 14 +#define MFP_TADR 15 +#define MFP_TBDR 16 +#define MFP_TCDR 17 +#define MFP_TDDR 18 +#define MFP_SCR 19 +#define MFP_UCR 20 +#define MFP_RSR 21 +#define MFP_TSR 22 +#define MFP_UDR 23 + +//extern long Timer_Prescaler[8]; +extern long Timer_Count[4]; +extern BYTE LastKey; +//extern BYTE KeyReadFlag; + +void MFP_Init(void); +BYTE FASTCALL MFP_Read(DWORD adr); +void FASTCALL MFP_Write(DWORD adr, BYTE data); +void FASTCALL MFP_Timer(long clock); +void FASTCALL MFP_TimerA(void); +void MFP_Int(int irq); + +#endif //_winx68k_mfp diff --git a/x68k/midi.c b/x68k/midi.c new file mode 100644 index 0000000..b3dadda --- /dev/null +++ b/x68k/midi.c @@ -0,0 +1,1011 @@ +// --------------------------------------------------------------------------------------- +// MIDI.C - MIDI Board (CZ-6BM1) emulator +// Powered by ぷにゅさん〜 +// --------------------------------------------------------------------------------------- + +// 4/18 未明: エクスクルーシヴがうまく通らないのを修正 +// 4/18 朝 : レナムで鳴らなかったのを修正 +// 4/18 昼 : エクスクルーシヴ送信完了を完全に待つ事でドラキュラおっけー + +// ToDo: ・エクスクルーシヴ送信中(例えばドラキュラの音色設定中)に +// 流石に1MHzまで落ち込むのは… +// MIDIの状態を返すポートを教えてもらうこと〜 +// ・MT-32でのランニングステータスの仕様をチェック +// ・終了時の音源のリセット +// ・IPLリセット時は実機でもリセットされない筈だが、 +// ここら辺は好みなので configで設定できてもいいかも + + +#include "common.h" +#include "prop.h" +#include "winx68k.h" +#include "fileio.h" +#include +#include "memory.h" +#include "irqh.h" +#include "midi.h" +#include "m68000.h" + +#define MIDIBUFFERS 1024 // 1024は流石に越えないでしょう^_^; +#define MIDIBUFTIMER 3200 // 10MHz / (31.25K / 10bit) = 3200 が正解になります... +#define MIDIFIFOSIZE 256 +#define MIDIDELAYBUF 4096 // 31250/10 = 3125 byts (1s分) あればおっけ? + +enum { // 各機種リセット用に一応。 + MIDI_NOTUSED, + MIDI_DEFAULT, + MIDI_MT32, + MIDI_CM32L, + MIDI_CM64, + MIDI_CM300, + MIDI_CM500, + MIDI_SC55, + MIDI_SC88, + MIDI_LA, // 意味もなく追加してみたり + MIDI_GM, + MIDI_GS, + MIDI_XG, +}; + +HMIDIOUT hOut = 0; +MIDIHDR hHdr; +int MIDI_CTRL; +int MIDI_POS; +int MIDI_SYSCOUNT; +BYTE MIDI_LAST; +BYTE MIDI_BUF[MIDIBUFFERS]; +BYTE MIDI_EXCVBUF[MIDIBUFFERS]; +BYTE MIDI_EXCVWAIT; + +BYTE MIDI_RegHigh = 0; // X68K用 +BYTE MIDI_Playing = 0; // マスタスイッチ +BYTE MIDI_Vector = 0; +BYTE MIDI_IntEnable = 0; +BYTE MIDI_IntVect = 0; +BYTE MIDI_IntFlag = 0; +DWORD MIDI_Buffered = 0; +long MIDI_BufTimer = 3333; +BYTE MIDI_R05 = 0; +DWORD MIDI_GTimerMax = 0; +DWORD MIDI_MTimerMax = 0; +long MIDI_GTimerVal = 0; +long MIDI_MTimerVal = 0; +BYTE MIDI_TxFull = 0; +BYTE MIDI_MODULE = MIDI_NOTUSED; + +static BYTE MIDI_ResetType[5] = { // Config.MIDI_Type に合わせて… + MIDI_LA, MIDI_GM, MIDI_GS, MIDI_XG +}; + +typedef struct { + DWORD time; + BYTE msg; +} DELAYBUFITEM; + +static DELAYBUFITEM DelayBuf[MIDIDELAYBUF]; +static int DBufPtrW = 0; +static int DBufPtrR = 0; + +// ------------------------------------------------------------------ +// ねこみぢ6、MIMPIトーンマップ対応関係 +// ------------------------------------------------------------------ + +enum { + MIMPI_LA = 0, + MIMPI_PCM, + MIMPI_GS, + MIMPI_RHYTHM, +}; + +static BYTE LOADED_TONEMAP = 0; +static BYTE ENABLE_TONEMAP = 0; +static BYTE TONE_CH[16]; +static BYTE TONEBANK[3][128]; +static BYTE TONEMAP[3][128]; + +// ------------------------------------------------------------------ + + +static BYTE EXCV_MTRESET[] = { 0xfe, 0xfe, 0xfe}; +static BYTE EXCV_GMRESET[] = { 0xf0, 0x7e, 0x7f, 0x09, 0x01, 0xf7}; +static BYTE EXCV_GSRESET[] = { 0xf0, 0x41, 0x10, 0x42, 0x12, 0x40, 0x00, 0x7f, 0x00, 0x41, 0xf7}; +static BYTE EXCV_XGRESET[] = { 0xf0, 0x43, 0x10, 0x4C, 0x00, 0x00, 0x7E, 0x00, 0xf7}; + +#define MIDICTRL_READY 0 +#define MIDICTRL_2BYTES 1 +#define MIDICTRL_3BYTES 2 +#define MIDICTRL_EXCLUSIVE 3 +#define MIDICTRL_TIMECODE 4 +#define MIDICTRL_SYSTEM 5 + +#define MIDI_EXCLUSIVE 0xf0 +#define MIDI_TIMECODE 0xf1 +#define MIDI_SONGPOS 0xf2 +#define MIDI_SONGSELECT 0xf3 +#define MIDI_TUNEREQUEST 0xf6 +#define MIDI_EOX 0xf7 +#define MIDI_TIMING 0xf8 +#define MIDI_START 0xfa +#define MIDI_CONTINUE 0xfb +#define MIDI_STOP 0xfc +#define MIDI_ACTIVESENSE 0xfe +#define MIDI_SYSTEMRESET 0xff + +#define MIDIOUTS(a,b,c) (((DWORD)c << 16) | ((DWORD)b << 8) | (DWORD)a) + +// ----------------------------------------------------------------------- +// 割り込み +// ----------------------------------------------------------------------- +DWORD FASTCALL MIDI_Int(BYTE irq) +{ + DWORD ret; + IRQH_IRQCallBack(irq); + if ( irq==4 ) + { + ret = (DWORD)(MIDI_Vector|MIDI_IntVect); + } + else + { + ret = (DWORD)(-1); + } + + return ret; +} + + +// ----------------------------------------------------------------------- +// たいまを進める +// ----------------------------------------------------------------------- +void FASTCALL MIDI_Timer(DWORD clk) +{ + if ( !Config.MIDI_SW ) return; // MIDI OFF時は帰る + + MIDI_BufTimer -= clk; + if (MIDI_BufTimer<0) + { + MIDI_BufTimer += MIDIBUFTIMER; + if (MIDI_Buffered) + { + MIDI_Buffered--; + if ( (MIDI_Buffered= 2) { + if (ENABLE_TONEMAP) { + if (((MIDI_BUF[0] & 0xf0) == 0xc0) && + (TONE_CH[MIDI_BUF[0] & 0x0f] < MIMPI_RHYTHM)) { + MIDI_BUF[1] = TONEMAP[ TONE_CH[MIDI_BUF[0] & 0x0f] ][ MIDI_BUF[1] & 0x7f ]; + } + } + MIDI_Waitlastexclusiveout(); + midiOutShortMsg(hOut, MIDIOUTS(MIDI_BUF[0], MIDI_BUF[1], 0)); + MIDI_CTRL = MIDICTRL_READY; + } + break; + case MIDICTRL_3BYTES: + if (MIDI_POS >= 3) { + MIDI_Waitlastexclusiveout(); + midiOutShortMsg(hOut, + MIDIOUTS(MIDI_BUF[0], MIDI_BUF[1], MIDI_BUF[2])); + MIDI_CTRL = MIDICTRL_READY; + } + break; + case MIDICTRL_EXCLUSIVE: + if (mes == MIDI_EOX) { + MIDI_Waitlastexclusiveout(); + MIDI_Sendexclusive(MIDI_BUF, MIDI_POS); + MIDI_CTRL = MIDICTRL_READY; + } + else if (MIDI_POS >= MIDIBUFFERS) { // おーばーふろー + MIDI_CTRL = MIDICTRL_READY; + } + break; + case MIDICTRL_TIMECODE: + if (MIDI_POS >= 2) { + if ((mes == 0x7e) || (mes == 0x7f)) { + // exclusiveと同じでいい筈… + MIDI_CTRL = MIDICTRL_EXCLUSIVE; + } + else { + MIDI_CTRL = MIDICTRL_READY; + } + } + break; + case MIDICTRL_SYSTEM: + if (MIDI_POS >= MIDI_SYSCOUNT) { + MIDI_CTRL = MIDICTRL_READY; + } + break; + } +} + + +// ----------------------------------------------------------------------- +// I/O Read +// ----------------------------------------------------------------------- +BYTE FASTCALL MIDI_Read(DWORD adr) +{ + BYTE ret = 0; + + if ( (adr<0xeafa01)||(adr>=0xeafa10)||(!Config.MIDI_SW) ) // 変なアドレスか、 + { // MIDI OFF時にはバスエラーにする + BusErrFlag = 1; + return 0; + } + + switch(adr&15) + { + case 0x01: + ret = (MIDI_Vector | MIDI_IntVect); + MIDI_IntVect=0x10; + break; + case 0x03: + break; + case 0x05: + break; + case 0x07: + break; + case 0x09: // R04, 14, ... 94 + switch(MIDI_RegHigh) + { + case 0: + break; + case 1: + break; + case 2: + break; + case 3: + break; + case 4: + break; + case 5: + if (MIDI_Buffered>=MIDIFIFOSIZE) + { + ret = 0x01; // Tx full/not ready + } + else + { + ret = 0xc0; // Tx empty/ready + } + break; + case 6: + break; + case 7: + break; + case 8: + break; + case 9: + break; + } + break; + case 0x0b: // R05, 15, ... 95 + switch(MIDI_RegHigh) + { + case 0: + break; + case 1: + break; + case 2: + break; + case 3: + break; + case 4: + break; + case 5: + break; + case 6: + break; + case 7: + break; + case 8: + break; + case 9: + break; + } + break; + case 0x0d: // R06, 16, ... 96 + switch(MIDI_RegHigh) + { + case 0: + break; + case 1: + break; + case 2: + break; + case 3: + break; + case 4: + break; + case 5: + break; + case 6: + break; + case 7: + break; + case 8: + break; + case 9: + break; + } + break; + case 0x0f: // R07, 17, ... 97 + switch(MIDI_RegHigh) + { + case 0: + break; + case 1: + break; + case 2: + break; + case 3: + break; + case 4: + break; + case 5: + break; + case 6: + break; + case 7: + break; + case 8: + break; + case 9: + break; + } + break; + } + return ret; +} + + +static void AddDelayBuf(BYTE msg) +{ + int newptr = (DBufPtrW+1)%MIDIDELAYBUF; + if ( newptr!=DBufPtrR ) { + DelayBuf[DBufPtrW].time = timeGetTime(); + DelayBuf[DBufPtrW].msg = msg; + DBufPtrW = newptr; + } +} + + +void MIDI_DelayOut(unsigned int delay) +{ + unsigned int t = timeGetTime(); + while ( DBufPtrW!=DBufPtrR ) { + if ( (t-DelayBuf[DBufPtrR].time)>=delay ) { + MIDI_Message(DelayBuf[DBufPtrR].msg); + DBufPtrR = (DBufPtrR+1)%MIDIDELAYBUF; + } else + break; + } +} + + +// ----------------------------------------------------------------------- +// I/O Write +// ----------------------------------------------------------------------- +void FASTCALL MIDI_Write(DWORD adr, BYTE data) +{ + if ( (adr<0xeafa01)||(adr>=0xeafa10)||(!Config.MIDI_SW) ) // 変なアドレスか、 + { // MIDI OFF時にはバスエラーにする + BusErrFlag = 1; + return; + } + + switch(adr&15) + { + case 0x01: + break; + case 0x03: + MIDI_RegHigh = data&0x0f; + if (data&0x80) MIDI_Init(); + break; + case 0x05: + break; + case 0x07: + break; + case 0x09: // R04, 14, ... 94 + switch(MIDI_RegHigh) + { + case 0: + MIDI_Vector = (data&0xe0); + break; + case 1: + break; + case 2: + break; + case 3: + break; + case 4: + break; + case 5: + break; + case 6: + break; + case 7: + break; + case 8: + MIDI_GTimerMax = (MIDI_GTimerMax&0xff00)|(DWORD)data; + break; + case 9: + break; + } + break; + case 0x0b: // R05, 15, ... 95 + switch(MIDI_RegHigh) + { + case 0: + MIDI_R05 = data; + break; + case 1: + break; + case 2: + break; + case 3: + break; + case 4: + break; + case 5: + break; + case 6: + break; + case 7: + break; + case 8: + MIDI_GTimerMax = (MIDI_GTimerMax&0xff)|(((DWORD)(data&0x3f))*256); + if (data&0x80) + MIDI_GTimerVal = MIDI_GTimerMax*80; + break; + case 9: + break; + } + break; + case 0x0d: // R06, 16, ... 96 + switch(MIDI_RegHigh) + { + case 0: + MIDI_IntEnable = data; + break; + case 1: + break; + case 2: + break; + case 3: + break; + case 4: + break; + case 5: // Out Data Byte + if (!MIDI_Buffered) + MIDI_BufTimer = MIDIBUFTIMER; + MIDI_Buffered ++; + AddDelayBuf(data); + break; + case 6: + break; + case 7: + break; + case 8: + MIDI_MTimerMax = (MIDI_MTimerMax&0xff00)|(DWORD)data; + break; + case 9: + break; + } + break; + case 0x0f: // R07, 17, ... 97 + switch(MIDI_RegHigh) + { + case 0: + break; + case 1: + break; + case 2: + break; + case 3: + break; + case 4: + break; + case 5: + break; + case 6: + break; + case 7: + break; + case 8: + MIDI_MTimerMax = (MIDI_MTimerMax&0xff)|(((DWORD)(data&0x3f))*256); + if (data&0x80) + MIDI_MTimerVal = MIDI_MTimerMax*80; + break; + case 9: + break; + } + break; + } +} + + +// ----------------------------------------------------------------------- +// MIMPIトーンファイル読み込み(ねこみぢ6) +// ----------------------------------------------------------------------- + +static int exstrcmp(char *str, char *cmp) { + + BYTE c; + + while(*cmp) { + c = *str++; + if ((c >= 'a') && (c <= 'z')) { + c -= 0x20; + } + if (c != *cmp++) { + return(TRUE); + } + } + return(FALSE); +} + +static void cutdelimita(char **buf) { + + BYTE c; + + for(;;) { + c = **buf; + if (!c) { + break; + } + if (c > ' ') { + break; + } + (*buf)++; + } +} + +static int getvalue(char **buf, int cutspace) { + + int ret = 0; + int valhit = 0; + BYTE c; + + if (cutspace) { + cutdelimita(buf); + } + for (;; valhit=1) { + c = **buf; + if (!c) { + if (!valhit) { + return(-1); + } + else { + break; + } + } + if ((c < '0') || (c > '9')) { + break; + } + ret = ret * 10 + (c - '0'); + (*buf)++; + } + return(ret); +} + +static int file_readline(FILEH fh, char *buf, int len) { + + DWORD pos; + DWORD readsize; + DWORD i; + + if (len < 2) { + return(-1); + } + pos = File_Seek(fh, 0, FSEEK_CUR); + if (pos == (DWORD)-1) { + return(-1); + } + readsize = File_Read(fh, buf, len-1); + if (readsize == (DWORD)-1) { + return(-1); + } + if (!readsize) { + return(-1); + } + for (i=0; i 16)) { + return; + } + ch--; + cutdelimita(&buf); + if (!exstrcmp(buf, "LA")) { + TONE_CH[ch] = MIMPI_LA; + } + else if (!exstrcmp(buf, "PCM")) { + TONE_CH[ch] = MIMPI_PCM; + } + else if (!exstrcmp(buf, "GS")) { + TONE_CH[ch] = MIMPI_GS; + } + else if (!exstrcmp(buf, "RHYTHM")) { + TONE_CH[ch] = MIMPI_RHYTHM; + } + } + else { + int mod, num, bank, tone; + mod = getvalue(&buf, FALSE); + if ((mod < 0) || (mod >= MIMPI_RHYTHM)) { + return; + } + num = getvalue(&buf, TRUE); + if ((num < 1) || (num > 128)) { + return; + } + num--; + tone = getvalue(&buf, TRUE); + if ((tone < 1) || (tone > 128)) { + return; + } + if (*buf == ':') { + buf++; + bank = tone - 1; + tone = getvalue(&buf, TRUE); + if ((tone < 1) || (tone > 128)) { + return; + } + TONEBANK[mod][num] = bank; + } + TONEMAP[mod][num] = tone-1; + } +} + +int MIDI_SetMimpiMap(char *filename) { + + BYTE b; + FILEH fh; + char buf[128]; + + LOADED_TONEMAP = 0; + ZeroMemory(TONE_CH, sizeof(TONE_CH)); + ZeroMemory(TONEBANK[0], sizeof(TONEBANK)); + for (b=0; b<128; b++) { + TONEMAP[0][b] = b; + TONEMAP[1][b] = b; + TONEMAP[2][b] = b; + } + TONE_CH[9] = MIMPI_RHYTHM; + + if ((filename == NULL) || (!filename[0])) { + ENABLE_TONEMAP = 0; + return(FALSE); + } + fh = File_Open(filename); + if (fh == (FILEH)-1) { + ENABLE_TONEMAP = 0; + return(FALSE); + } + while(file_readline(fh, buf, sizeof(buf)) >= 0) { + mimpidefline_analaize(buf); + } + File_Close(fh); + + LOADED_TONEMAP = 1; + return(TRUE); +} + +int MIDI_EnableMimpiDef(int enable) { + + ENABLE_TONEMAP = 0; + if ((enable) && (LOADED_TONEMAP)) { + ENABLE_TONEMAP = 1; + return(TRUE); + } + return(FALSE); +} + +// ----------------------------------------------------------------------- diff --git a/x68k/midi.h b/x68k/midi.h new file mode 100644 index 0000000..903e8d4 --- /dev/null +++ b/x68k/midi.h @@ -0,0 +1,17 @@ +#ifndef _winx68k_midi +#define _winx68k_midi + +#include "common.h" + +void MIDI_Init(void); +void MIDI_Cleanup(void); +void MIDI_Reset(void); +BYTE FASTCALL MIDI_Read(DWORD adr); +void FASTCALL MIDI_Write(DWORD adr, BYTE data); +void MIDI_SetModule(void); +void FASTCALL MIDI_Timer(DWORD clk); +int MIDI_SetMimpiMap(char *filename); +int MIDI_EnableMimpiDef(int enable); +void MIDI_DelayOut(unsigned int delay); + +#endif diff --git a/x68k/palette.c b/x68k/palette.c new file mode 100644 index 0000000..acd05ce --- /dev/null +++ b/x68k/palette.c @@ -0,0 +1,229 @@ +// --------------------------------------------------------------------------------------- +// PALETTE.C - Text/BG/Graphic Palette +// --------------------------------------------------------------------------------------- + +#include "common.h" +#include "windraw.h" +#include "tvram.h" +#include "bg.h" +#include "crtc.h" +#include "memory.h" +#include "m68000.h" +#include "palette.h" + + BYTE Pal_Regs[1024]; + WORD TextPal[256]; + WORD GrphPal[256]; + WORD Pal16[65536]; + WORD Ibit; // 半透明処理とかで使うかも〜 + + WORD Pal_HalfMask, Pal_Ix2; + WORD Pal_R, Pal_G, Pal_B; // 画面輝度変更時用 + +// ----- DDrawの16ビットモードの色マスクからX68k→Win用の変換テーブルを作る ----- +// X68kは「GGGGGRRRRRBBBBBI」の構造。Winは「RRRRRGGGGGGBBBBB」の形が多いみたい。が、 +// 違う場合もあるみたいなので計算してみやう。 +void Pal_SetColor(void) +{ + WORD TempMask, bit; + WORD R[5] = {0, 0, 0, 0, 0}; + WORD G[5] = {0, 0, 0, 0, 0}; + WORD B[5] = {0, 0, 0, 0, 0}; + int r, g, b, i; + + r = g = b = 5; + Pal_R = Pal_G = Pal_B = 0; + TempMask = 0; // 使われているビットをチェック(Iビット用) + for (bit=0x8000; bit; bit>>=1) + { // 各色毎に左(上位)から5ビットずつ拾う + if ( (WinDraw_Pal16R&bit)&&(r) ) + { + R[--r] = bit; + TempMask |= bit; + Pal_R |= bit; + } + if ( (WinDraw_Pal16G&bit)&&(g) ) + { + G[--g] = bit; + TempMask |= bit; + Pal_G |= bit; + } + if ( (WinDraw_Pal16B&bit)&&(b) ) + { + B[--b] = bit; + TempMask |= bit; + Pal_B |= bit; + } + } + + Ibit = 1; + for (bit=1; bit; bit<<=1) + { // 使われていないビット(通常は6ビット以上ある色の + if (!(TempMask&bit)) // 最下位ビット)をIビットとして扱う + { // 0のビットが複数だったときを考えて、Ibit=~TempMask; にはしてないです + Ibit = bit; + break; + } + } + + // ねこーねこー + // Pal_Ix2 = 0 になったらどうしよう… その時は32bit拡張… + + // → Riva128なんかでは見事になるみたい(笑) でもそれでも特に問題無いかも… + + Pal_HalfMask = ~(B[0] | R[0] | G[0] | Ibit); + Pal_Ix2 = Ibit << 1; + +/* + // どーしても変そうなら、これを入れるか…32bit拡張めんどくさいし(汗 + if (Ibit==0x8000) // Ibitが最上位ビットだったら、青の最下位と入れ替え + { + Ibit = B[0]; + B[0] = 0; // 青は4bitになっちゃうけど我慢して ^^; + Pal_HalfMask = ~(B[1] | R[0] | G[0] | Ibit | 0x8000); + Pal_Ix2 = Ibit << 1; + } +*/ + // X68kのビット配置に合わせてテーブル作成 + // すっげ〜手際が悪いね(汗 + for (i=0; i<65536; i++) + { + bit = 0; + if (i&0x8000) bit |= G[4]; + if (i&0x4000) bit |= G[3]; + if (i&0x2000) bit |= G[2]; + if (i&0x1000) bit |= G[1]; + if (i&0x0800) bit |= G[0]; + if (i&0x0400) bit |= R[4]; + if (i&0x0200) bit |= R[3]; + if (i&0x0100) bit |= R[2]; + if (i&0x0080) bit |= R[1]; + if (i&0x0040) bit |= R[0]; + if (i&0x0020) bit |= B[4]; + if (i&0x0010) bit |= B[3]; + if (i&0x0008) bit |= B[2]; + if (i&0x0004) bit |= B[1]; + if (i&0x0002) bit |= B[0]; + if (i&0x0001) bit |= Ibit; + Pal16[i] = bit; + } +} + + +// ----------------------------------------------------------------------- +// 初期化 +// ----------------------------------------------------------------------- +void Pal_Init(void) +{ + ZeroMemory(Pal_Regs, 1024); + ZeroMemory(TextPal, 512); + ZeroMemory(GrphPal, 512); + Pal_SetColor(); +} + + +// ----------------------------------------------------------------------- +// I/O Read +// ----------------------------------------------------------------------- +BYTE FASTCALL Pal_Read(DWORD adr) +{ + if (adr<0xe82400) + return Pal_Regs[adr-0xe82000]; + else return 0xff; +} + + +// ----------------------------------------------------------------------- +// I/O Write +// ----------------------------------------------------------------------- +void FASTCALL Pal_Write(DWORD adr, BYTE data) +{ + WORD pal; + + if (adr>=0xe82400) return; + + adr -= 0xe82000; + if (Pal_Regs[adr] == data) return; + + if (adr<0x200) + { + Pal_Regs[adr] = data; + TVRAM_SetAllDirty(); + pal = Pal_Regs[adr&0xfffe]; + pal = (pal<<8)+Pal_Regs[adr|1]; + GrphPal[adr/2] = Pal16[pal]; + } + else if (adr<0x400) + { + if (MemByteAccess) return; // TextPalはバイトアクセスは出来ないらしい(神戸恋愛物語) + Pal_Regs[adr] = data; + TVRAM_SetAllDirty(); + pal = Pal_Regs[adr&0xfffe]; + pal = (pal<<8)+Pal_Regs[adr|1]; + TextPal[(adr-0x200)/2] = Pal16[pal]; + } +} + + +// ----------------------------------------------------------------------- +// こんとらすと変更(パレットに対するWin側の表示色で実現してます ^^;) +// ----------------------------------------------------------------------- +void Pal_ChangeContrast(int num) +{ + WORD bit; + WORD R[5] = {0, 0, 0, 0, 0}; + WORD G[5] = {0, 0, 0, 0, 0}; + WORD B[5] = {0, 0, 0, 0, 0}; + int r, g, b, i; + int palr, palg, palb; + WORD pal; + + TVRAM_SetAllDirty(); + + r = g = b = 5; + + for (bit=0x8000; bit; bit>>=1) + { // 各色毎に左(上位)から5ビットずつ拾う + if ( (WinDraw_Pal16R&bit)&&(r) ) R[--r] = bit; + if ( (WinDraw_Pal16G&bit)&&(g) ) G[--g] = bit; + if ( (WinDraw_Pal16B&bit)&&(b) ) B[--b] = bit; + } + + for (i=0; i<65536; i++) + { + palr = palg = palb = 0; + if (i&0x8000) palg |= G[4]; + if (i&0x4000) palg |= G[3]; + if (i&0x2000) palg |= G[2]; + if (i&0x1000) palg |= G[1]; + if (i&0x0800) palg |= G[0]; + if (i&0x0400) palr |= R[4]; + if (i&0x0200) palr |= R[3]; + if (i&0x0100) palr |= R[2]; + if (i&0x0080) palr |= R[1]; + if (i&0x0040) palr |= R[0]; + if (i&0x0020) palb |= B[4]; + if (i&0x0010) palb |= B[3]; + if (i&0x0008) palb |= B[2]; + if (i&0x0004) palb |= B[1]; + if (i&0x0002) palb |= B[0]; + pal = palr | palb | palg; + palg = (WORD)((palg*num)/15)&Pal_G; + palr = (WORD)((palr*num)/15)&Pal_R; + palb = (WORD)((palb*num)/15)&Pal_B; + Pal16[i] = palr | palb | palg; + if ((pal)&&(!Pal16[i])) Pal16[i] = B[0]; + if (i&0x0001) Pal16[i] |= Ibit; + } + + for (i=0; i<256; i++) + { + pal = Pal_Regs[i*2]; + pal = (pal<<8)+Pal_Regs[i*2+1]; + GrphPal[i] = Pal16[pal]; + + pal = Pal_Regs[i*2+512]; + pal = (pal<<8)+Pal_Regs[i*2+513]; + TextPal[i] = Pal16[pal]; + } +} diff --git a/x68k/palette.h b/x68k/palette.h new file mode 100644 index 0000000..9017cd0 --- /dev/null +++ b/x68k/palette.h @@ -0,0 +1,21 @@ +#ifndef _winx68k_pal +#define _winx68k_pal + +#include "common.h" + +extern BYTE Pal_Regs[1024]; +extern WORD TextPal[256]; +extern WORD GrphPal[256]; +extern WORD Pal16[65536]; + +void Pal_SetColor(void); +void Pal_Init(void); + +BYTE FASTCALL Pal_Read(DWORD adr); +void FASTCALL Pal_Write(DWORD adr, BYTE data); +void Pal_ChangeContrast(int num); + +extern WORD Ibit, Pal_HalfMask, Pal_Ix2; + +#endif + diff --git a/x68k/pia.c b/x68k/pia.c new file mode 100644 index 0000000..0224adf --- /dev/null +++ b/x68k/pia.c @@ -0,0 +1,78 @@ +// --------------------------------------------------------------------------------------- +// PIA.C - uPD8255(必要最低限のみ) +// --------------------------------------------------------------------------------------- + +#include "common.h" +#include "joystick.h" +#include "pia.h" +#include "adpcm.h" +#include "m68000.h" + +typedef struct { + BYTE PortA; + BYTE PortB; + BYTE PortC; + BYTE Ctrl; +} PIA; + +static PIA pia; + +// ----------------------------------------------------------------------- +// 初期化 +// ----------------------------------------------------------------------- +void PIA_Init(void) +{ + pia.PortA = 0xff; + pia.PortB = 0xff; + pia.PortC = 0x0b; + pia.Ctrl = 0; +} + + +// ----------------------------------------------------------------------- +// I/O Write +// ----------------------------------------------------------------------- +void FASTCALL PIA_Write(DWORD adr, BYTE data) +{ + BYTE mask, bit, portc = pia.PortC; + if ( adr==0xe9a005 ) { + portc = pia.PortC; + pia.PortC = data; + if ( (portc&0x0f)!=(pia.PortC&0x0f) ) ADPCM_SetPan(pia.PortC&0x0f); + if ( (portc&0x10)!=(pia.PortC&0x10) ) Joystick_Write(0, (BYTE)((data&0x10)?0xff:0x00)); + if ( (portc&0x20)!=(pia.PortC&0x20) ) Joystick_Write(1, (BYTE)((data&0x20)?0xff:0x00)); + } else if ( adr==0xe9a007 ) { + if ( !(data&0x80) ) { + portc = pia.PortC; + bit = (data>>1)&7; + mask = 1< + +BYTE RTC_Regs[2][16]; +BYTE RTC_Bank = 0; +static int RTC_Timer1 = 0; +static int RTC_Timer16 = 0; + + +// ----------------------------------------------------------------------- +// 初期化 +// ----------------------------------------------------------------------- +void RTC_Init(void) +{ + ZeroMemory(&RTC_Regs[1][0], 16); + RTC_Regs[0][13] = 0; + RTC_Regs[0][14] = 0; + RTC_Regs[0][15] = 0x0c; +} + + +// ----------------------------------------------------------------------- +// とけいのりーど +// ----------------------------------------------------------------------- +BYTE FASTCALL RTC_Read(DWORD adr) +{ + BYTE ret = 0; + struct tm *tm; + time_t t; + t = time(NULL); + tm = localtime(&t); + + adr &= 0x1f; + if (!(adr&1)) return 0; + if (RTC_Bank == 0) + { + switch(adr) + { + case 0x01: ret=(tm->tm_sec)%10; break; + case 0x03: ret=(tm->tm_sec)/10; break; + case 0x05: ret=(tm->tm_min)%10; break; + case 0x07: ret=(tm->tm_min)/10; break; + case 0x09: ret=(tm->tm_hour)%10; break; + case 0x0b: ret=(tm->tm_hour)/10; break; + case 0x0d: ret=(BYTE)(tm->tm_wday); break; + case 0x0f: ret=(tm->tm_mday)%10; break; + case 0x11: ret=(tm->tm_mday)/10; break; + case 0x13: ret=(tm->tm_mon)%10; break; + case 0x15: ret=(tm->tm_mon)/10; break; + case 0x17: ret=((tm->tm_year)-80)%10; break; + case 0x19: ret=(((tm->tm_year)-80)/10)&0xf; break; + case 0x1b: ret=RTC_Regs[0][13]; break; + case 0x1d: ret=RTC_Regs[0][14]; break; + case 0x1f: ret=RTC_Regs[0][15]; break; + } + } + else + { + if (adr == 0x1b) + ret = (RTC_Regs[1][13]|1); + else if (adr == 0x17) + ret = ((tm->tm_year)-80)%4; + else + ret = RTC_Regs[1][adr>>1]; + } + return ret; +} + + +// ----------------------------------------------------------------------- +// らいと +// ----------------------------------------------------------------------- +void FASTCALL RTC_Write(DWORD adr, BYTE data) +{ + if ( adr==0xe8a001 ) { +// RTC_Timer1 = 0; +// RTC_Timer16 = 0; + } else if ( adr==0xe8a01b ) { + RTC_Regs[0][13] = RTC_Regs[1][13] = data&0x0c; // Alarm/Timer Enable制御 + } else if ( adr==0xe8a01f ) { + RTC_Regs[0][15] = RTC_Regs[1][15] = data&0x0c; // Alarm端子出力制御 + } +} + + +void RTC_Timer(int clock) +{ + RTC_Timer1 += clock; + RTC_Timer16 += clock; + if ( RTC_Timer1>=10000000 ) { + if ( !(RTC_Regs[0][15]&8) ) MFP_Int(15); + RTC_Timer1 -= 10000000; + } + if ( RTC_Timer16>=625000 ) { + if ( !(RTC_Regs[0][15]&4) ) MFP_Int(15); + RTC_Timer16 -= 625000; + } +} diff --git a/x68k/rtc.h b/x68k/rtc.h new file mode 100644 index 0000000..5a3da6d --- /dev/null +++ b/x68k/rtc.h @@ -0,0 +1,9 @@ +#ifndef _x68k_rtc +#define _x68k_rtc + +void RTC_Init(void); +BYTE FASTCALL RTC_Read(DWORD adr); +void FASTCALL RTC_Write(DWORD adr, BYTE data); +void RTC_Timer(int clock); + +#endif diff --git a/x68k/sasi.c b/x68k/sasi.c new file mode 100644 index 0000000..4e6d262 --- /dev/null +++ b/x68k/sasi.c @@ -0,0 +1,453 @@ +// --------------------------------------------------------------------------------------- +// SASI.C - Shugart Associates System Interface (SASI HDD) +// --------------------------------------------------------------------------------------- + +#include "common.h" +#include "fileio.h" +#include "prop.h" +#include "status.h" +#include "m68000.h" +#include "ioc.h" +#include "sasi.h" +#include "irqh.h" + +BYTE SASI_Buf[256]; +BYTE SASI_Phase = 0; +DWORD SASI_Sector = 0; +DWORD SASI_Blocks = 0; +BYTE SASI_Cmd[6]; +BYTE SASI_CmdPtr = 0; +WORD SASI_Device = 0; +BYTE SASI_Unit = 0; +short SASI_BufPtr = 0; +BYTE SASI_RW = 0; +BYTE SASI_Stat = 0; +BYTE SASI_Mes = 0; +BYTE SASI_Error = 0; +BYTE SASI_SenseStatBuf[4]; +BYTE SASI_SenseStatPtr = 0; + +extern int hddtrace; + + +int SASI_IsReady(void) +{ + if ( (SASI_Phase==2)||(SASI_Phase==3)||(SASI_Phase==9) ) + return 1; + else + return 0; +} + + +// ----------------------------------------------------------------------- +// わりこみ〜 +// ----------------------------------------------------------------------- +DWORD FASTCALL SASI_Int(BYTE irq) +{ + IRQH_IRQCallBack(irq); +if (hddtrace) { +FILE *fp; +fp=fopen("_trace68.txt", "a"); +fprintf(fp, "Int (IRQ:%d)\n", irq); +fclose(fp); +} + if (irq==1) + return ((DWORD)IOC_IntVect+2); + else + return -1; +} + + +// ----------------------------------------------------------------------- +// 初期化 +// ----------------------------------------------------------------------- +void SASI_Init(void) +{ + SASI_Phase = 0; + SASI_Sector = 0; + SASI_Blocks = 0; + SASI_CmdPtr = 0; + SASI_Device = 0; + SASI_Unit = 0; + SASI_BufPtr = 0; + SASI_RW = 0; + SASI_Stat = 0; + SASI_Error = 0; + SASI_SenseStatPtr = 0; +} + + +// ----------------------------------------------------------------------- +// し−く(リード時) +// ----------------------------------------------------------------------- +short SASI_Seek(void) +{ + FILEH fp; + +if (hddtrace) { +FILE *fp; +fp=fopen("_trace68.txt", "a"); +fprintf(fp, "Seek - Sector:%d (Time:%08X)\n", SASI_Sector, timeGetTime()); +fclose(fp); +} + ZeroMemory(SASI_Buf, 256); + fp = File_Open(Config.HDImage[SASI_Device*2+SASI_Unit]); + if (!fp) + { + ZeroMemory(SASI_Buf, 256); + return -1; + } + if (File_Seek(fp, SASI_Sector<<8, FSEEK_SET)!=(SASI_Sector<<8)) + { + File_Close(fp); + return 0; + } + if (File_Read(fp, SASI_Buf, 256)!=256) + { + File_Close(fp); + return 0; + } + File_Close(fp); + + return 1; +} + + +// ----------------------------------------------------------------------- +// しーく(ライト時) +// ----------------------------------------------------------------------- +short SASI_Flush(void) +{ FILEH fp; + + fp = File_Open(Config.HDImage[SASI_Device*2+SASI_Unit]); + if (!fp) return -1; + if (File_Seek(fp, SASI_Sector<<8, FSEEK_SET)!=(SASI_Sector<<8)) + { + File_Close(fp); + return 0; + } + if (File_Write(fp, SASI_Buf, 256)!=256) + { + File_Close(fp); + return 0; + } + File_Close(fp); + +if (hddtrace) { +FILE *fp; +fp=fopen("_trace68.txt", "a"); +fprintf(fp, "Sec Write - Sector:%d (Time:%08X)\n", SASI_Sector, timeGetTime()); +fclose(fp); +} + return 1; +} + + +// ----------------------------------------------------------------------- +// I/O Read +// ----------------------------------------------------------------------- +BYTE FASTCALL SASI_Read(DWORD adr) +{ + BYTE ret = 0; + short result; + + if (adr==0xe96003) + { + if (SASI_Phase) + ret |= 2; // Busy + if (SASI_Phase>1) + ret |= 1; // Req + if (SASI_Phase==2) + ret |= 8; // C/D + if ((SASI_Phase==3)&&(SASI_RW)) // SASI_RW=1:Read + ret |= 4; // I/O + if (SASI_Phase==9) // Phase=9:SenseStatus中 + ret |= 4; // I/O + if ((SASI_Phase==4)||(SASI_Phase==5)) + ret |= 0x0c; // I/O & C/D + if (SASI_Phase==5) + ret |= 0x10; // MSG + } + else if (adr ==0xe96001) + { + if ((SASI_Phase==3)&&(SASI_RW)) // データリード中〜 + { + ret = SASI_Buf[SASI_BufPtr++]; + if (SASI_BufPtr==256) + { + SASI_Blocks--; + if (SASI_Blocks) // まだ読むブロックがある? + { + SASI_Sector++; + SASI_BufPtr = 0; + result = SASI_Seek(); // 次のセクタをバッファに読む + if (!result) // result=0:イメージの最後(=無効なセクタ)なら + { + SASI_Error = 0x0f; + SASI_Phase++; + } + } + else + SASI_Phase++; // 指定ブロックのリード完了 + } + } + else if (SASI_Phase==4) // Status Phase + { + if (SASI_Error) + ret = 0x02; + else + ret = SASI_Stat; + SASI_Phase++; + } + else if (SASI_Phase==5) // MessagePhase + { + SASI_Phase = 0; // 0を返すだけ〜。BusFreeに帰ります + } + else if (SASI_Phase==9) // DataPhase(SenseStat専用) + { + ret = SASI_SenseStatBuf[SASI_SenseStatPtr++]; + if (SASI_SenseStatPtr==4) + { + SASI_Error = 0; + SASI_Phase = 4; // StatusPhaseへ + } + } + if (SASI_Phase==4) + { + IOC_IntStat|=0x10; + if (IOC_IntStat&8) IRQH_Int(1, &SASI_Int); + } + } + +if (hddtrace&&((SASI_Phase!=3)||(adr!=0xe96001))) { +FILE *fp; +fp=fopen("_trace68.txt", "a"); +fprintf(fp, "Read - Adr:%08X Ret:%02X Phase:%d BufPtr:%d (Time:%08X) @ $%08X\n", adr, ret, SASI_Phase, SASI_BufPtr, timeGetTime(), regs.pc); +fclose(fp); +} + + StatBar_HDD((SASI_Phase)?2:0); + + return ret; +} + + +// コマンドのチェック。正直、InsideX68k内の記述ではちと足りない ^^;。 +// 未記述のものとして、 +// - C2h(初期化系?)。Unit以外のパラメータは無し。DataPhaseで10個のデータを書きこむ。 +// - 06h(フォーマット?)。論理ブロック指定あり(21hおきに指定している)。ブロック数のとこは6が指定されている。 +void SASI_CheckCmd(void) +{ + short result; + SASI_Unit = (SASI_Cmd[1]>>5)&1; // X68kでは、ユニット番号は0か1しか取れない + + switch(SASI_Cmd[0]) + { + case 0x00: // Test Drive Ready + if (Config.HDImage[SASI_Device*2+SASI_Unit][0]) + SASI_Stat = 0; + else + { + SASI_Stat = 0x02; + SASI_Error = 0x7f; + } + SASI_Phase += 2; + break; + case 0x01: // Recalibrate + if (Config.HDImage[SASI_Device*2+SASI_Unit][0]) + { + SASI_Sector = 0; + SASI_Stat = 0; + } + else + { + SASI_Stat = 0x02; + SASI_Error = 0x7f; + } + SASI_Phase += 2; + break; + case 0x03: // Request Sense Status + SASI_SenseStatBuf[0] = SASI_Error; + SASI_SenseStatBuf[1] = (BYTE)((SASI_Unit<<5)|((SASI_Sector>>16)&0x1f)); + SASI_SenseStatBuf[2] = (BYTE)(SASI_Sector>>8); + SASI_SenseStatBuf[3] = (BYTE)SASI_Sector; + SASI_Error = 0; + SASI_Phase=9; + SASI_Stat = 0; + SASI_SenseStatPtr = 0; + break; + case 0x04: // Format Drive + SASI_Phase += 2; + SASI_Stat = 0; + break; + case 0x08: // Read Data + SASI_Sector = (((DWORD)SASI_Cmd[1]&0x1f)<<16)|(((DWORD)SASI_Cmd[2])<<8)|((DWORD)SASI_Cmd[3]); + SASI_Blocks = (DWORD)SASI_Cmd[4]; + SASI_Phase++; + SASI_RW = 1; + SASI_BufPtr = 0; + SASI_Stat = 0; + result = SASI_Seek(); + if ( (result==0)||(result==-1) ) + { +// SASI_Phase++; + SASI_Error = 0x0f; + } + break; + case 0x0a: // Write Data + SASI_Sector = (((DWORD)SASI_Cmd[1]&0x1f)<<16)|(((DWORD)SASI_Cmd[2])<<8)|((DWORD)SASI_Cmd[3]); + SASI_Blocks = (DWORD)SASI_Cmd[4]; + SASI_Phase++; + SASI_RW = 0; + SASI_BufPtr = 0; + SASI_Stat = 0; + ZeroMemory(SASI_Buf, 256); + result = SASI_Seek(); + if ( (result==0)||(result==-1) ) + { +// SASI_Phase++; + SASI_Error = 0x0f; + } + break; + case 0x0b: // Seek + if (Config.HDImage[SASI_Device*2+SASI_Unit][0]) + { + SASI_Stat = 0; + } + else + { + SASI_Stat = 0x02; + SASI_Error = 0x7f; + } + SASI_Phase += 2; +// SASI_Phase = 9; + break; + case 0xc2: + SASI_Phase = 10; + SASI_SenseStatPtr = 0; + if (Config.HDImage[SASI_Device*2+SASI_Unit][0]) + SASI_Stat = 0; + else + { + SASI_Stat = 0x02; + SASI_Error = 0x7f; + } + break; + default: + SASI_Phase += 2; + } +if (hddtrace) { +FILE *fp; +fp=fopen("_trace68.txt", "a"); +fprintf(fp, "Com. - %02X Dev:%d Unit:%d\n", SASI_Cmd[0], SASI_Device, SASI_Unit); +fclose(fp); +} +} + + +// ----------------------------------------------------------------------- +// I/O Write +// ----------------------------------------------------------------------- +void FASTCALL SASI_Write(DWORD adr, BYTE data) +{ + short result; + int i; + BYTE bit; + +if (hddtrace&&((SASI_Phase!=3)||(adr!=0xe96001))) { +FILE *fp; +fp=fopen("_trace68.txt", "a"); +fprintf(fp, "Write - Adr:%08X Data:%02X Phase:%d (Time:%08X) @ $%08X\n", adr, data, SASI_Phase, timeGetTime(), regs.pc); +fclose(fp); +} + if ( (adr==0xe96007)&&(SASI_Phase==0) ) + { + SASI_Device = 0x7f; + if (data) + { + for (i=0, bit=1; bit; i++, bit<<=1) + { + if (data&bit) + { + SASI_Device = i; + break; + } + } + } + if ( (Config.HDImage[SASI_Device*2][0])||(Config.HDImage[SASI_Device*2+1][0]) ) + { + SASI_Phase++; + SASI_CmdPtr = 0; + } + else + { + SASI_Phase = 0; + } + } + else if ( (adr==0xe96003)&&(SASI_Phase==1) ) + { + SASI_Phase++; + } + else if (adr==0xe96005) // SASI Reset + { + SASI_Phase = 0; + SASI_Sector = 0; + SASI_Blocks = 0; + SASI_CmdPtr = 0; + SASI_Device = 0; + SASI_Unit = 0; + SASI_BufPtr = 0; + SASI_RW = 0; + SASI_Stat = 0; + SASI_Error = 0; + SASI_SenseStatPtr = 0; + } + else if (adr==0xe96001) + { + if (SASI_Phase==2) + { + SASI_Cmd[SASI_CmdPtr++] = data; + if (SASI_CmdPtr==6) // コマンド発行終了 + { +// SASI_Phase++; + SASI_CheckCmd(); + } + } + else if ((SASI_Phase==3)&&(!SASI_RW)) // データライト中〜 + { + SASI_Buf[SASI_BufPtr++] = data; + if (SASI_BufPtr==256) + { + result = SASI_Flush(); // 現在のバッファを書き出す + SASI_Blocks--; + if (SASI_Blocks) // まだ書くブロックがある? + { + SASI_Sector++; + SASI_BufPtr = 0; + result = SASI_Seek(); // 次のセクタをバッファに読む + if (!result) // result=0:イメージの最後(=無効なセクタ)なら + { + SASI_Error = 0x0f; + SASI_Phase++; + } + } + else + SASI_Phase++; // 指定ブロックのライト完了 + } + } + else if (SASI_Phase==10) + { + SASI_SenseStatPtr++; + if (SASI_SenseStatPtr==10) // コマンド発行終了 + { + SASI_Phase = 4; + } + } + if (SASI_Phase==4) + { + IOC_IntStat|=0x10; + if (IOC_IntStat&8) IRQH_Int(1, &SASI_Int); + } + } + StatBar_HDD((SASI_Phase)?2:0); +} diff --git a/x68k/sasi.h b/x68k/sasi.h new file mode 100644 index 0000000..e02a9a2 --- /dev/null +++ b/x68k/sasi.h @@ -0,0 +1,13 @@ +#ifndef _winx68k_sasi +#define _winx68k_sasi + +#include "common.h" + +void SASI_Init(void); +BYTE FASTCALL SASI_Read(DWORD adr); +void FASTCALL SASI_Write(DWORD adr, BYTE data); +int SASI_IsReady(void); + +extern char SASI_Name[16][MAX_PATH]; + +#endif //_winx68k_sasi diff --git a/x68k/scc.c b/x68k/scc.c new file mode 100644 index 0000000..fdf6a20 --- /dev/null +++ b/x68k/scc.c @@ -0,0 +1,210 @@ +// --------------------------------------------------------------------------------------- +// SCC.C - Z8530 SCC(マウスのみ) +// --------------------------------------------------------------------------------------- + +#include "common.h" +#include "scc.h" +#include "m68000.h" +#include "irqh.h" +#include "mouse.h" + +signed char MouseX = 0; +signed char MouseY = 0; +BYTE MouseSt = 0; + +BYTE SCC_RegsA[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; +BYTE SCC_RegNumA = 0; +BYTE SCC_RegSetA = 0; +BYTE SCC_RegsB[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; +BYTE SCC_RegNumB = 0; +BYTE SCC_RegSetB = 0; +BYTE SCC_Vector = 0; +BYTE SCC_Dat[3] = {0, 0, 0}; +BYTE SCC_DatNum = 0; + + +// ----------------------------------------------------------------------- +// わりこみ +// ----------------------------------------------------------------------- +DWORD FASTCALL SCC_Int(BYTE irq) +{ + DWORD ret = (DWORD)(-1); + IRQH_IRQCallBack(irq); + if ( (irq==5)&&(!(SCC_RegsB[9]&2)) ) + { + if (SCC_RegsB[9]&1) + { + if (SCC_RegsB[9]&0x10) + ret = ((DWORD)(SCC_Vector&0x8f)+0x20); + else + ret = ((DWORD)(SCC_Vector&0xf1)+4); + } + else + ret = ((DWORD)SCC_Vector); + } + + return ret; +} + + +// ----------------------------------------------------------------------- +// 割り込みのチェック +// ----------------------------------------------------------------------- +void SCC_IntCheck(void) +{ + if ( (SCC_DatNum) && ((SCC_RegsB[1]&0x18)==0x10) && (SCC_RegsB[9]&0x08) ) + { + IRQH_Int(5, &SCC_Int); + } + else if ( (SCC_DatNum==3) && ((SCC_RegsB[1]&0x18)==0x08) && (SCC_RegsB[9]&0x08) ) + { + IRQH_Int(5, &SCC_Int); + } +} + + +// ----------------------------------------------------------------------- +// 初期化 +// ----------------------------------------------------------------------- +void SCC_Init(void) +{ + MouseX = 0; + MouseY = 0; + MouseSt = 0; + SCC_RegNumA = 0; + SCC_RegSetA = 0; + SCC_RegNumB = 0; + SCC_RegSetB = 0; + SCC_Vector = 0; + SCC_DatNum = 0; +} + + +// ----------------------------------------------------------------------- +// I/O Write +// ----------------------------------------------------------------------- +void FASTCALL SCC_Write(DWORD adr, BYTE data) +{ + if (adr>=0xe98008) return; + + if ((adr&7) == 1) + { + if (SCC_RegSetB) + { + if (SCC_RegNumB == 5) + { + if ( (!(SCC_RegsB[5]&2))&&(data&2)&&(SCC_RegsB[3]&1)&&(!SCC_DatNum) ) // データが無い時だけにしやう(闇の血族) + { // マウスデータ生成 + Mouse_SetData(); + SCC_DatNum = 3; + SCC_Dat[2] = MouseSt; + SCC_Dat[1] = MouseX; + SCC_Dat[0] = MouseY; + } + } + else if (SCC_RegNumB == 2) SCC_Vector = data; + SCC_RegSetB = 0; + SCC_RegsB[SCC_RegNumB] = data; +/*{ +FILE *fp; +fp=fopen("_scc.txt", "a"); +fprintf(fp, "SCC Reg[%d] = $%02X @ $%08X\n", SCC_RegNumB, data, regs.pc); +fclose(fp); +}*/ + SCC_RegNumB = 0; + } + else + { + if (!(data&0xf0)) + { + data &= 15; + SCC_RegSetB = 1; + SCC_RegNumB = data; + } + else + { + SCC_RegSetB = 0; + SCC_RegNumB = 0; + } + } + } + else if ((adr&7) == 5) + { + if (SCC_RegSetA) + { + SCC_RegSetA = 0; + switch (SCC_RegNumA) + { + case 2: + SCC_RegsB[2] = data; + SCC_Vector = data; + break; + case 9: + SCC_RegsB[9] = data; + break; + } + } + else + { + data &= 15; + if (data) + { + SCC_RegSetA = 1; + SCC_RegNumA = data; + } + else + { + SCC_RegSetA = 0; + SCC_RegNumA = 0; + } + } + } + else if ((adr&7) == 3) + { + } + else if ((adr&7) == 7) + { + } +} + + +// ----------------------------------------------------------------------- +// I/O Read +// ----------------------------------------------------------------------- +BYTE FASTCALL SCC_Read(DWORD adr) +{ + BYTE ret=0; + + if (adr>=0xe98008) return ret; + + if ((adr&7) == 1) + { + if (!SCC_RegNumB) + ret = ((SCC_DatNum)?1:0); + SCC_RegNumB = 0; + SCC_RegSetB = 0; + } + else if ((adr&7) == 3) + { + if (SCC_DatNum) + { + SCC_DatNum--; + ret = SCC_Dat[SCC_DatNum]; + } + } + else if ((adr&7) == 5) + { + switch(SCC_RegNumA) + { + case 0: + ret = 4; // 送信バッファ空(Xna) + break; + case 3: + ret = ((SCC_DatNum)?4:0); + break; + } + SCC_RegNumA = 0; + SCC_RegSetA = 0; + } + return ret; +} diff --git a/x68k/scc.h b/x68k/scc.h new file mode 100644 index 0000000..b429a60 --- /dev/null +++ b/x68k/scc.h @@ -0,0 +1,15 @@ +#ifndef _winx68k_scc +#define _winx68k_scc + +#include "common.h" + +void SCC_IntCheck(void); +void SCC_Init(void); +BYTE FASTCALL SCC_Read(DWORD adr); +void FASTCALL SCC_Write(DWORD adr, BYTE data); + +extern signed char MouseX; +extern signed char MouseY; +extern BYTE MouseSt; + +#endif diff --git a/x68k/scsi.c b/x68k/scsi.c new file mode 100644 index 0000000..d1846d7 --- /dev/null +++ b/x68k/scsi.c @@ -0,0 +1,81 @@ +// --------------------------------------------------------------------------------------- +// SCSI.C - 外付けSCSIボード (CZ-6BS1) +// SCSI IOCSを乗っ取る形で対応(SPCはエミュレートしない) +// 内蔵SCSI(のダミー)IPLは winx68k.c 内で定義してます +// --------------------------------------------------------------------------------------- + +#include "common.h" +#include "fileio.h" +#include "winx68k.h" +#include "m68000.h" +#include "scsi.h" + + BYTE SCSIIPL[0x2000]; + +// オリジナルのSCSI ROM +// 動作:SCSI IOCSが呼ばれると、SCSI IOCS番号を $e9f800 に出力します。 +// SCSIデバイスからの起動は不可、初期化ルーチンはSCSI IOCS($F5)のベクタ設定のみを行います。 +static BYTE SCSIIMG[] = { + 0x00, 0xea, 0x00, 0x34, // $ea0020 SCSI起動用のエントリアドレス + 0x00, 0xea, 0x00, 0x36, // $ea0024 IOCSベクタ設定のエントリアドレス(必ず"Human"の8バイト前) + 0x00, 0xea, 0x00, 0x4a, // $ea0028 SCSI IOCSエントリアドレス + 0x48, 0x75, 0x6d, 0x61, // $ea002c ↓ + 0x6e, 0x36, 0x38, 0x6b, // $ea0030 ID "Human68k" (必ず起動エントリポイントの直前) + 0x4e, 0x75, // $ea0034 "rts" (起動エントリポイント、何もしないよ) + 0x23, 0xfc, 0x00, 0xea, 0x00, 0x4a, // $ea0036 ↓ (IOCSベクタ設定エントリポイント) + 0x00, 0x00, 0x07, 0xd4, // $ea003c "move.l #$ea004a, $7d4.l" (IOCS $F5のベクタ設定) + 0x74, 0xff, // $ea0040 "moveq #-1, d2" + 0x4e, 0x75, // $ea0042 "rts" + 0x53, 0x43, 0x53, 0x49, 0x45, 0x58, // $ea0044 ID "SCSIEX" (SCSIカードのID) + 0x13, 0xc1, 0x00, 0xe9, 0xf8, 0x00, // $ea004a "move.b d1, $e9f800" (SCSI IOCSコールエントリポイント) + 0x4e, 0x75, // $ea0050 "rts" + }; + + +// ----------------------------------------------------------------------- +// 初期化 +// ----------------------------------------------------------------------- +void SCSI_Init(void) +{ + int i; + BYTE tmp; + ZeroMemory(SCSIIPL, 0x2000); + memcpy(&SCSIIPL[0x20], SCSIIMG, sizeof(SCSIIMG)); + for (i=0; i<0x2000; i+=2) + { + tmp = SCSIIPL[i]; + SCSIIPL[i] = SCSIIPL[i+1]; + SCSIIPL[i+1] = tmp; + } +} + + +// ----------------------------------------------------------------------- +// 撤収〜 +// ----------------------------------------------------------------------- +void SCSI_Cleanup(void) +{ +} + + +// ----------------------------------------------------------------------- +// りーど +// ----------------------------------------------------------------------- +BYTE FASTCALL SCSI_Read(DWORD adr) +{ + BYTE ret = 0xff; + ret = SCSIIPL[(adr^1)&0x1fff]; + return ret; +} + + +// ----------------------------------------------------------------------- +// らいと +// ----------------------------------------------------------------------- +void FASTCALL SCSI_Write(DWORD adr, BYTE data) +{ + + (void)adr; + (void)data; +} + diff --git a/x68k/scsi.h b/x68k/scsi.h new file mode 100644 index 0000000..44382b4 --- /dev/null +++ b/x68k/scsi.h @@ -0,0 +1,15 @@ +#ifndef _winx68k_scsi +#define _winx68k_scsi + +#include "common.h" + +extern BYTE SCSIIPL[0x2000]; + +void SCSI_Init(void); +void SCSI_Cleanup(void); + +BYTE FASTCALL SCSI_Read(DWORD adr); +void FASTCALL SCSI_Write(DWORD adr, BYTE data); + +#endif + diff --git a/x68k/sram.c b/x68k/sram.c new file mode 100644 index 0000000..bc40817 --- /dev/null +++ b/x68k/sram.c @@ -0,0 +1,146 @@ +// --------------------------------------------------------------------------------------- +// SRAM.C - SRAM (16kb) 領域 +// --------------------------------------------------------------------------------------- + +#include "common.h" +#include "fileio.h" +#include "prop.h" +#include "winx68k.h" +#include "sysport.h" +#include "memory.h" +#include "sram.h" + + BYTE SRAM[0x4000]; + BYTE SRAMFILE[] = "sram.dat"; + + +// ----------------------------------------------------------------------- +// 役に立たないうぃるすチェック +// ----------------------------------------------------------------------- +void SRAM_VirusCheck(void) +{ + //int i, ret; + + if (!Config.SRAMWarning) return; // Warning発生モードでなければ帰る + + if ( (cpu_readmem24_dword(0xed3f60)==0x60000002) + &&(cpu_readmem24_dword(0xed0010)==0x00ed3f60) ) // 特定うぃるすにしか効かないよ〜 + { +#if 0 /* XXX */ + ret = MessageBox(hWndMain, + "このSRAMデータはウィルスに感染している可能性があります。\n該当個所のクリーンアップを行いますか?", + "けろぴーからの警告", MB_ICONWARNING | MB_YESNO); + if (ret == IDYES) + { + for (i=0x3c00; i<0x4000; i++) + SRAM[i] = 0; + SRAM[0x11] = 0x00; + SRAM[0x10] = 0xed; + SRAM[0x13] = 0x01; + SRAM[0x12] = 0x00; + SRAM[0x19] = 0x00; + } +#endif /* XXX */ + SRAM_Cleanup(); + SRAM_Init(); // Virusクリーンアップ後のデータを書き込んでおく + } +} + + +// ----------------------------------------------------------------------- +// 初期化 +// ----------------------------------------------------------------------- +void SRAM_Init(void) +{ + int i; + BYTE tmp; + FILEH fp; + + for (i=0; i<0x4000; i++) + SRAM[i] = 0; + + fp = File_OpenCurDir(SRAMFILE); + if (fp) + { + File_Read(fp, SRAM, 0x4000); + File_Close(fp); + for (i=0; i<0x4000; i+=2) + { + tmp = SRAM[i]; + SRAM[i] = SRAM[i+1]; + SRAM[i+1] = tmp; + } + } +} + + +// ----------------------------------------------------------------------- +// 撤収〜 +// ----------------------------------------------------------------------- +void SRAM_Cleanup(void) +{ + int i; + BYTE tmp; + FILEH fp; + + for (i=0; i<0x4000; i+=2) + { + tmp = SRAM[i]; + SRAM[i] = SRAM[i+1]; + SRAM[i+1] = tmp; + } + + fp = File_OpenCurDir(SRAMFILE); + if (!fp) + fp = File_CreateCurDir(SRAMFILE, FTYPE_SRAM); + if (fp) + { + File_Write(fp, SRAM, 0x4000); + File_Close(fp); + } +} + + +// ----------------------------------------------------------------------- +// りーど +// ----------------------------------------------------------------------- +BYTE FASTCALL SRAM_Read(DWORD adr) +{ + adr &= 0xffff; + adr ^= 1; + if (adr<0x4000) + return SRAM[adr]; + else + return 0xff; +} + + +// ----------------------------------------------------------------------- +// らいと +// ----------------------------------------------------------------------- +void FASTCALL SRAM_Write(DWORD adr, BYTE data) +{ + //int ret; + + if ( (SysPort[5]==0x31)&&(adr<0xed4000) ) + { + if ((adr==0xed0018)&&(data==0xb0)) // SRAM起動への切り替え(簡単なウィルス対策) + { + if (Config.SRAMWarning) // Warning発生モード(デフォルト) + { +#if 0 /* XXX */ + ret = MessageBox(hWndMain, + "SRAMブートに切り替えようとしています。\nウィルスの危険がない事を確認してください。\nSRAMブートに切り替え、継続しますか?", + "けろぴーからの警告", MB_ICONWARNING | MB_YESNO); + if (ret != IDYES) + { + data = 0; // STDブートにする + } +#endif /* XXX */ + } + } + adr &= 0xffff; + adr ^= 1; + SRAM[adr] = data; + } +} diff --git a/x68k/sram.h b/x68k/sram.h new file mode 100644 index 0000000..6a4a41b --- /dev/null +++ b/x68k/sram.h @@ -0,0 +1,16 @@ +#ifndef _winx68k_sram +#define _winx68k_sram + +#include "common.h" + +extern BYTE SRAM[0x4000]; + +void SRAM_Init(void); +void SRAM_Cleanup(void); +void SRAM_VirusCheck(void); + +BYTE FASTCALL SRAM_Read(DWORD adr); +void FASTCALL SRAM_Write(DWORD adr, BYTE data); + +#endif + diff --git a/x68k/sysport.c b/x68k/sysport.c new file mode 100644 index 0000000..7d1f94c --- /dev/null +++ b/x68k/sysport.c @@ -0,0 +1,100 @@ +// --------------------------------------------------------------------------------------- +// SYSPORT.C - X68k System Port +// --------------------------------------------------------------------------------------- + +#include "common.h" +#include "prop.h" +#include "sysport.h" +#include "palette.h" + +BYTE SysPort[7]; + +// ----------------------------------------------------------------------- +// 初期化 +// ----------------------------------------------------------------------- +void SysPort_Init(void) +{ + int i; + for (i=0; i<7; i++) SysPort[i]=0; +} + + +// ----------------------------------------------------------------------- +// らいと +// ----------------------------------------------------------------------- +void FASTCALL SysPort_Write(DWORD adr, BYTE data) +{ + switch(adr) + { + case 0xe8e001: + if (SysPort[1]!=(data&15)) + { + SysPort[1] = data & 15; + Pal_ChangeContrast(SysPort[1]); + } + break; + case 0xe8e003: + SysPort[2] = data & 0x0b; + break; + case 0xe8e005: + SysPort[3] = data & 0x1f; + break; + case 0xe8e007: + SysPort[4] = data & 0x0e; + break; + case 0xe8e00d: + SysPort[5] = data; + break; + case 0xe8e00f: + SysPort[6] = data & 15; + break; + } +} + + +// ----------------------------------------------------------------------- +// りーど +// ----------------------------------------------------------------------- +BYTE FASTCALL SysPort_Read(DWORD adr) +{ + BYTE ret=0xff; + + switch(adr) + { + case 0xe8e001: + ret = SysPort[1]; + break; + case 0xe8e003: + ret = SysPort[2]; + break; + case 0xe8e005: + ret = SysPort[3]; + break; + case 0xe8e007: + ret = SysPort[4]; + break; + case 0xe8e00b: // 10MHz:0xff、16MHz:0xfe、030(25MHz):0xdcをそれぞれ返すらしい + switch(Config.XVIMode) + { + case 1: // XVI or RedZone + case 2: + ret = 0xfe; + break; + case 3: // 030 + ret = 0xdc; + break; + default: // 10MHz + ret = 0xff; + break; + } + break; + case 0xe8e00d: + ret = SysPort[5]; + break; + case 0xe8e00f: + ret = SysPort[6]; + break; + } + + return ret; +} diff --git a/x68k/sysport.h b/x68k/sysport.h new file mode 100644 index 0000000..d0be567 --- /dev/null +++ b/x68k/sysport.h @@ -0,0 +1,12 @@ +#ifndef _winx68k_sysport +#define _winx68k_sysport + +#include "common.h" + +extern BYTE SysPort[7]; + +void SysPort_Init(void); +BYTE FASTCALL SysPort_Read(DWORD adr); +void FASTCALL SysPort_Write(DWORD adr, BYTE data); + +#endif diff --git a/x68k/tvram.c b/x68k/tvram.c new file mode 100644 index 0000000..c029eec --- /dev/null +++ b/x68k/tvram.c @@ -0,0 +1,564 @@ +// --------------------------------------------------------------------------------------- +// TVRAM.C - Text VRAM +// ToDo : 透明色処理とか色々 +// --------------------------------------------------------------------------------------- + +#include "common.h" +#include "winx68k.h" +#include "windraw.h" +#include "bg.h" +#include "crtc.h" +#include "palette.h" +#include "m68000.h" +#include "tvram.h" + + BYTE TVRAM[0x80000]; + BYTE TextDrawWork[1024*1024]; + BYTE TextDirtyLine[1024]; + + BYTE TextDrawPattern[2048*4]; + +// WORD Text_LineBuf[1024]; // →BGのを使うように変更 + BYTE Text_TrFlag[1024]; + +INLINE void TVRAM_WriteByteMask(DWORD adr, BYTE data); + +// ----------------------------------------------------------------------- +// 全部書き換え〜 +// ----------------------------------------------------------------------- +void TVRAM_SetAllDirty(void) +{ + memset(TextDirtyLine, 1, 1024); +} + + +// ----------------------------------------------------------------------- +// 初期化 +// ----------------------------------------------------------------------- +void TVRAM_Init(void) +{ + int i, j, bit; + ZeroMemory(TVRAM, 0x80000); + ZeroMemory(TextDrawWork, 1024*1024); + TVRAM_SetAllDirty(); + + ZeroMemory(TextDrawPattern, 2048*4); // パターンテーブル初期化 + for (i=0; i<256; i++) + { + for (j=0, bit=0x80; j<8; j++, bit>>=1) + { + if (i&bit) { + TextDrawPattern[i*8+j ] = 1; + TextDrawPattern[i*8+j+2048] = 2; + TextDrawPattern[i*8+j+4096] = 4; + TextDrawPattern[i*8+j+6144] = 8; + } + } + } +} + + +// ----------------------------------------------------------------------- +// 撤収 +// ----------------------------------------------------------------------- +void TVRAM_Cleanup(void) +{ +} + + +// ----------------------------------------------------------------------- +// 読むなり +// ----------------------------------------------------------------------- +BYTE FASTCALL TVRAM_Read(DWORD adr) +{ + adr &= 0x7ffff; + adr ^= 1; + return TVRAM[adr]; +} + + +// ----------------------------------------------------------------------- +// 1ばいと書くなり +// ----------------------------------------------------------------------- +INLINE void TVRAM_WriteByte(DWORD adr, BYTE data) +{ + if (TVRAM[adr]!=data) + { + TextDirtyLine[(((adr&0x1ffff)/128)-TextScrollY)&1023] = 1; + TVRAM[adr] = data; + } +} + + +// ----------------------------------------------------------------------- +// ますく付きで書くなり +// ----------------------------------------------------------------------- +INLINE void TVRAM_WriteByteMask(DWORD adr, BYTE data) +{ + data = (TVRAM[adr] & CRTC_Regs[0x2e + ((adr^1) & 1)]) | (data & (~CRTC_Regs[0x2e + ((adr ^ 1) & 1)])); + if (TVRAM[adr] != data) + { + TextDirtyLine[(((adr&0x1ffff)/128)-TextScrollY)&1023] = 1; + TVRAM[adr] = data; + } +} + + +// ----------------------------------------------------------------------- +// 書くなり +// ----------------------------------------------------------------------- +void FASTCALL TVRAM_Write(DWORD adr, BYTE data) +{ + adr &= 0x7ffff; + adr ^= 1; + if (CRTC_Regs[0x2a]&1) // 同時アクセス + { + adr &= 0x1ffff; + if (CRTC_Regs[0x2a]&2) // Text Mask + { + if (CRTC_Regs[0x2b]&0x10) TVRAM_WriteByteMask(adr , data); + if (CRTC_Regs[0x2b]&0x20) TVRAM_WriteByteMask(adr+0x20000, data); + if (CRTC_Regs[0x2b]&0x40) TVRAM_WriteByteMask(adr+0x40000, data); + if (CRTC_Regs[0x2b]&0x80) TVRAM_WriteByteMask(adr+0x60000, data); + } + else + { + if (CRTC_Regs[0x2b]&0x10) TVRAM_WriteByte(adr , data); + if (CRTC_Regs[0x2b]&0x20) TVRAM_WriteByte(adr+0x20000, data); + if (CRTC_Regs[0x2b]&0x40) TVRAM_WriteByte(adr+0x40000, data); + if (CRTC_Regs[0x2b]&0x80) TVRAM_WriteByte(adr+0x60000, data); + } + } + else // シングルアクセス + { + if (CRTC_Regs[0x2a]&2) // Text Mask + { + TVRAM_WriteByteMask(adr, data); + } + else + { + TVRAM_WriteByte(adr, data); + } + } +#ifdef USE_ASM + _asm { + push edi + push esi + + mov eax, adr + mov esi, eax + and esi, 01ffffh ; TVRAM Adr + mov edi, eax + and edi, 01ff80h ; 下位7bitマスク + shl edi, 3 + and eax, 07fh + xor al, 1 + shl eax, 3 + add edi, eax ; edi = workadr + + xor eax, eax + + mov al, byte ptr TVRAM[esi+60000h] + mov ecx, dword ptr (TextDrawPattern+6144)[eax*8] + mov edx, dword ptr (TextDrawPattern+6144)[eax*8+4] + mov al, byte ptr TVRAM[esi+40000h] + or ecx, dword ptr (TextDrawPattern+4096)[eax*8] + or edx, dword ptr (TextDrawPattern+4096)[eax*8+4] + mov al, byte ptr TVRAM[esi+20000h] + or ecx, dword ptr (TextDrawPattern+2048)[eax*8] + or edx, dword ptr (TextDrawPattern+2048)[eax*8+4] + mov al, byte ptr TVRAM[esi] + or ecx, dword ptr TextDrawPattern[eax*8] + or edx, dword ptr TextDrawPattern[eax*8+4] + mov dword ptr TextDrawWork[edi], ecx + mov dword ptr (TextDrawWork+4)[edi], edx + + pop esi + pop edi + } +#elif defined(USE_GAS) && defined(__i386__) + asm ( + "mov %0, %%eax;" + "mov %%eax, %%esi;" + "and $0x1ffff, %%esi;" /* TVRAM Adr */ + "mov %%eax, %%edi;" + "and $0x1ff80, %%edi;" /* 下位7bitマスク */ + "shl $3, %%edi;" + "and $0x7f, %%eax;" + "xor $1, %%al;" + "shl $3, %%eax;" + "add %%eax, %%edi;" /* edi = workadr */ + + "xor %%eax, %%eax;" + + "mov TVRAM + 0x60000(%%esi), %%al;" + "mov TextDrawPattern + 6144(, %%eax, 8), %%ecx;" + "mov TextDrawPattern + 6144 + 4(, %%eax, 8), %%edx;" + "mov TVRAM + 0x40000(%%esi), %%al;" + "or TextDrawPattern + 4096(, %%eax, 8), %%ecx;" + "or TextDrawPattern + 4096 + 4(, %%eax, 8), %%edx;" + "mov TVRAM + 0x20000(%%esi), %%al;" + "or TextDrawPattern + 2048(, %%eax, 8), %%ecx;" + "or TextDrawPattern + 2048 + 4(, %%eax, 8), %%edx;" + "mov TVRAM(%%esi), %%al;" + "or TextDrawPattern(, %%eax, 8), %%ecx;" + "or TextDrawPattern + 4(, %%eax, 8), %%edx;" + "mov %%ecx, TextDrawWork(%%edi);" + "mov %%edx, TextDrawWork + 4(%%edi);" + : /* output: nothing */ + : "m" (adr) + : "ax", "cx", "dx", "si", "di", "memory"); +#else /* !USE_ASM && !(USE_GAS && __i386__) */ + { + DWORD *ptr = (DWORD *)TextDrawPattern; + DWORD tvram_addr = adr & 0x1ffff; + DWORD workadr = ((adr & 0x1ff80) + ((adr ^ 1) & 0x7f)) << 3; + DWORD t0, t1; + BYTE pat; + + pat = TVRAM[tvram_addr + 0x60000]; + t0 = ptr[(pat * 2) + 1536]; + t1 = ptr[(pat * 2 + 1) + 1536]; + + pat = TVRAM[tvram_addr + 0x40000]; + t0 |= ptr[(pat * 2) + 1024]; + t1 |= ptr[(pat * 2 + 1) + 1024]; + + pat = TVRAM[tvram_addr + 0x20000]; + t0 |= ptr[(pat * 2) + 512]; + t1 |= ptr[(pat * 2 + 1) + 512]; + + pat = TVRAM[tvram_addr]; + t0 |= ptr[(pat * 2)]; + t1 |= ptr[(pat * 2 + 1)]; + + *((DWORD *)&TextDrawWork[workadr]) = t0; + *(((DWORD *)(&TextDrawWork[workadr])) + 1) = t1; + } +#endif /* USE_ASM */ +} + + +// ----------------------------------------------------------------------- +// らすたこぴー時のあっぷでーと +// ----------------------------------------------------------------------- +void FASTCALL TVRAM_RCUpdate(void) +{ + DWORD adr = ((DWORD)CRTC_Regs[0x2d]<<9); + +#ifdef USE_ASM + _asm + { + push edi + push esi + mov esi, adr + mov edi, esi + shl edi, 3 + mov esi, adr + mov cx, 512 + xor eax, eax + rcu_mainloop: + xor esi, 1 + mov al, byte ptr TVRAM[esi+60000h] + mov ebx, dword ptr (TextDrawPattern+6144)[eax*8] + mov edx, dword ptr (TextDrawPattern+6144)[eax*8+4] + mov al, byte ptr TVRAM[esi+40000h] + or ebx, dword ptr (TextDrawPattern+4096)[eax*8] + or edx, dword ptr (TextDrawPattern+4096)[eax*8+4] + mov al, byte ptr TVRAM[esi+20000h] + or ebx, dword ptr (TextDrawPattern+2048)[eax*8] + or edx, dword ptr (TextDrawPattern+2048)[eax*8+4] + mov al, byte ptr TVRAM[esi] + or ebx, dword ptr TextDrawPattern[eax*8] + or edx, dword ptr TextDrawPattern[eax*8+4] + mov dword ptr TextDrawWork[edi], ebx + add edi, 4 + mov dword ptr TextDrawWork[edi], edx + add edi, 4 + xor esi, 1 + inc esi + dec cx + jnz rcu_mainloop +// loop rcu_mainloop + pop esi + pop edi + } +#elif defined(USE_GAS) && defined(__i386__) + asm ( + "mov %0, %%esi;" + "mov %%esi, %%edi;" + "shl $3, %%edi;" + "mov %0, %%esi;" + "mov $512, %%cx;" + "xor %%eax, %%eax;" + ".rcu_mainloop:" + "xor $1, %%esi;" + "mov TVRAM + 0x60000(%%esi), %%al;" + "mov TextDrawPattern + 6144(, %%eax, 8), %%ebx;" + "mov TextDrawPattern + 6144 + 4(, %%eax, 8), %%edx;" + "mov TVRAM + 0x40000(%%esi), %%al;" + "or TextDrawPattern + 4096(, %%eax, 8), %%ebx;" + "or TextDrawPattern + 4096 + 4(, %%eax, 8), %%edx;" + "mov TVRAM + 0x20000(%%esi), %%al;" + "or TextDrawPattern + 2048(, %%eax, 8), %%ebx;" + "or TextDrawPattern + 2048 + 4(, %%eax, 8), %%edx;" + "mov TVRAM(%%esi), %%al;" + "or TextDrawPattern(, %%eax, 8), %%ebx;" + "or TextDrawPattern + 4(, %%eax, 8), %%edx;" + "mov %%ebx, TextDrawWork(%%edi);" + "add $4, %%edi;" + "mov %%edx, TextDrawWork(%%edi);" + "add $4, %%edi;" + "xor $1, %%esi;" + "inc %%esi;" + "loop .rcu_mainloop;" + : /* output: nothing */ + : "m" (adr) + : "ax", "bx", "cx", "dx", "si", "di", "memory"); +#else /* !USE_ASM && !(USE_GAS && __i386__) */ + /* XXX: BUG */ + DWORD *ptr = (DWORD *)TextDrawPattern; + DWORD *wptr = (DWORD *)(TextDrawWork + (adr << 3)); + DWORD t0, t1; + DWORD tadr; + BYTE pat; + int i; + + for (i = 0; i < 512; i++, adr++) { + tadr = adr ^ 1; + + pat = TVRAM[tadr + 0x60000]; + t0 = ptr[(pat * 2) + 1536]; + t1 = ptr[(pat * 2 + 1) + 1536]; + + pat = TVRAM[tadr + 0x40000]; + t0 |= ptr[(pat * 2) + 1024]; + t1 |= ptr[(pat * 2 + 1) + 1024]; + + pat = TVRAM[tadr + 0x20000]; + t0 |= ptr[(pat * 2) + 512]; + t1 |= ptr[(pat * 2 + 1) + 512]; + + pat = TVRAM[tadr]; + t0 |= ptr[(pat * 2)]; + t1 |= ptr[(pat * 2 + 1)]; + + *wptr++ = t0; + *wptr++ = t1; + } +#endif /* USE_ASM */ +} + +// ----------------------------------------------------------------------- +// 1ライン描画 +// ----------------------------------------------------------------------- +void FASTCALL Text_DrawLine(int opaq) +{ +#ifdef USE_ASM + __asm { + push edi + or ecx, ecx //ecx = opaq + jz tdlnotopaq + mov edi, 0 + mov edx, VLINE + mov al, CRTC_Regs[0x29] + and al, 1ch + cmp al, 1ch + jne textlinenotspecial + shl edx, 1 + textlinenotspecial: + add edx, TextScrollY + and edx, 1023 + shl edx, 10 + mov ebx, TextScrollX + and ebx, 1023 + add edx, ebx + xor bx, 1023 + inc bx + mov ecx, TextDotX + looptextline: + movzx eax, byte ptr TextDrawWork[edx] + mov byte ptr (Text_TrFlag+16)[edi], 0 + and al, 15 + jz textline_skip + mov byte ptr (Text_TrFlag+16)[edi], 1 + textline_skip: + mov ax, word ptr TextPal[eax*2] + mov word ptr (BG_LineBuf+32)[edi*2], ax + inc edi + inc edx + dec bx + jz endtextline + loop looptextline + jmp finishtextline + endtextline: + dec cx + jz finishtextline + mov ax, word ptr TextPal[0] + endtextlineloop: + mov word ptr (BG_LineBuf+32)[edi*2], ax + mov byte ptr (Text_TrFlag+16)[edi], 0 + inc edi + loop endtextlineloop + jmp finishtextline + + + tdlnotopaq: + mov edi, 0 + mov edx, VLINE + mov al, CRTC_Regs[0x29] + and al, 1ch + cmp al, 1ch + jne notextlinenotspecial + shl edx, 1 + notextlinenotspecial: + add edx, TextScrollY + and edx, 1023 + shl edx, 10 + mov ebx, TextScrollX + and ebx, 1023 + add edx, ebx + xor bx, 1023 + inc bx + mov ecx, TextDotX + nolooptextline: + movzx eax, byte ptr TextDrawWork[edx] + and al, 15 + jz notextline_skip + or byte ptr (Text_TrFlag+16)[edi], 1 + mov ax, word ptr TextPal[eax*2] + mov word ptr (BG_LineBuf+32)[edi*2], ax + notextline_skip: + inc edi + inc edx + dec bx + jz finishtextline + loop nolooptextline + + finishtextline: + pop edi + } +#elif defined(USE_GAS) && defined(__i386__) + asm ( + "mov %0, %%ecx;" + "or %%ecx, %%ecx;" + "jz .tdlnotopaq;" + "mov $0, %%edi;" + "mov (%1), %%edx;" + "mov (%2), %%al;" + "and $0x1c, %%al;" + "cmp $0x1c, %%al;" + "jne .textlinenotspecial;" + "shl $1, %%edx;" + ".textlinenotspecial:" + "add (%3), %%edx;" + "and $1023, %%edx;" + "shl $10, %%edx;" + "mov (%4), %%ebx;" + "and $1023, %%ebx;" + "add %%ebx, %%edx;" + "xor $1023, %%bx;" + "inc %%bx;" + "mov (%6), %%ecx;" + ".looptextline:" + "movzbl TextDrawWork(%%edx), %%eax;" + "movb $0, Text_TrFlag + 16(%%edi);" + "and $15, %%al;" + "jz .textline_skip;" + "movb $1, Text_TrFlag + 16(%%edi);" + ".textline_skip:" + "mov TextPal(, %%eax, 2), %%ax;" + "mov %%ax, BG_LineBuf + 32(, %%edi, 2);" + "inc %%edi;" + "inc %%edx;" + "dec %%bx;" + "jz .endtextline;" + "loop .looptextline;" + "jmp .finishtextline;" + ".endtextline:" + "dec %%cx;" + "jz .finishtextline;" + "mov (%5), %%ax;" + ".endtextlineloop:" + "mov %%ax, BG_LineBuf + 32(, %%edi, 2);" + "movb $0, Text_TrFlag + 16(%%edi);" + "inc %%edi;" + "loop .endtextlineloop;" + "jmp .finishtextline;" + + ".tdlnotopaq:" + "mov $0, %%edi;" + "mov (%1), %%edx;" + "mov (%2), %%al;" + "and $0x1c, %%al;" + "cmp $0x1c, %%al;" + "jne .notextlinenotspecial;" + "shl $1, %%edx;" + ".notextlinenotspecial:" + "add (%3), %%edx;" + "and $1023, %%edx;" + "shl $10, %%edx;" + "mov (%4), %%ebx;" + "and $1023, %%ebx;" + "add %%ebx, %%edx;" + "xor $1023, %%bx;" + "inc %%bx;" + "mov (%6), %%ecx;" + ".nolooptextline:" + "movzbl TextDrawWork(%%edx), %%eax;" + "and $15, %%al;" + "jz .notextline_skip;" + "orb $1, Text_TrFlag + 16(%%edi);" + "mov TextPal(, %%eax, 2), %%ax;" + "mov %%ax, BG_LineBuf + 32(, %%edi, 2);" + ".notextline_skip:" + "inc %%edi;" + "inc %%edx;" + "dec %%bx;" + "jz .finishtextline;" + "loop .nolooptextline;" + + ".finishtextline:" + : /* output: nothing */ + : "m" (opaq), "g" (VLINE), "g" (CRTC_Regs[0x29]), + "g" (TextScrollY), "g" (TextScrollX), "g" (TextPal[0]), "g" (TextDotX) + : "ax", "bx", "cx", "dx", "si", "di", "memory"); +#else /* !USE_ASM && !(USE_GAS && __i386__) */ + DWORD addr; + DWORD x, y; + DWORD off = 16; + DWORD i; + BYTE t; + + y = TextScrollY + VLINE; + if ((CRTC_Regs[0x29] & 0x1c) == 0x1c) + y += VLINE; + y = (y & 0x3ff) << 10; + + x = TextScrollX & 0x3ff; + addr = x + y; + x = (x ^ 0x3ff) + 1; + + if (opaq) { + for (i = 0; (i < TextDotX) && (x > 0); i++, x--, off++) { + t = TextDrawWork[addr++] & 0xf; + Text_TrFlag[off] = t ? 1 : 0; + BG_LineBuf[off] = TextPal[t]; + } + if (i++ != TextDotX) { + for (; i < TextDotX; i++, off++) { + BG_LineBuf[off] = TextPal[0]; + Text_TrFlag[off] = 0; + } + } + } else { + for (i = 0; (i < TextDotX) && (x > 0); i++, x--, off++) { + t = TextDrawWork[addr++] & 0xf; + if (t) { + Text_TrFlag[off] |= 1; + BG_LineBuf[off] = TextPal[t]; + } + } + } +#endif /* USE_ASM */ +} diff --git a/x68k/tvram.h b/x68k/tvram.h new file mode 100644 index 0000000..a099e3c --- /dev/null +++ b/x68k/tvram.h @@ -0,0 +1,22 @@ +#ifndef _winx68k_tvram +#define _winx68k_tvram + +#include "common.h" + +extern BYTE TVRAM[0x80000]; +extern BYTE TextDrawWork[1024*1024]; +extern BYTE TextDirtyLine[1024]; +//extern WORD Text_LineBuf[1024]; +extern BYTE Text_TrFlag[1024]; + +void TVRAM_SetAllDirty(void); + +void TVRAM_Init(void); +void TVRAM_Cleanup(void); + +BYTE FASTCALL TVRAM_Read(DWORD adr); +void FASTCALL TVRAM_Write(DWORD adr, BYTE data); +void FASTCALL TVRAM_RCUpdate(void); +void FASTCALL Text_DrawLine(int opaq); + +#endif diff --git a/xkeropi.man b/xkeropi.man new file mode 100644 index 0000000..e69de29