m68kdasm.c 105 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742
  1. /* ======================================================================== */
  2. /* ========================= LICENSING & COPYRIGHT ======================== */
  3. /* ======================================================================== */
  4. /*
  5. * MUSASHI
  6. * Version 3.31
  7. *
  8. * A portable Motorola M680x0 processor emulation engine.
  9. * Copyright 1998-2007 Karl Stenerud. All rights reserved.
  10. *
  11. * This code may be freely used for non-commercial purposes as long as this
  12. * copyright notice remains unaltered in the source code and any binary files
  13. * containing this code in compiled form.
  14. *
  15. * All other lisencing terms must be negotiated with the author
  16. * (Karl Stenerud).
  17. *
  18. * The latest version of this code can be obtained at:
  19. * http://kstenerud.cjb.net
  20. */
  21. /* ======================================================================== */
  22. /* ================================ INCLUDES ============================== */
  23. /* ======================================================================== */
  24. #include <stdlib.h>
  25. #include <stdio.h>
  26. #include <string.h>
  27. #include "m68k.h"
  28. #ifndef DECL_SPEC
  29. #define DECL_SPEC
  30. #endif
  31. /* ======================================================================== */
  32. /* ============================ GENERAL DEFINES =========================== */
  33. /* ======================================================================== */
  34. /* unsigned int and int must be at least 32 bits wide */
  35. #undef uint
  36. #define uint unsigned int
  37. /* Bit Isolation Functions */
  38. #define BIT_0(A) ((A) & 0x00000001)
  39. #define BIT_1(A) ((A) & 0x00000002)
  40. #define BIT_2(A) ((A) & 0x00000004)
  41. #define BIT_3(A) ((A) & 0x00000008)
  42. #define BIT_4(A) ((A) & 0x00000010)
  43. #define BIT_5(A) ((A) & 0x00000020)
  44. #define BIT_6(A) ((A) & 0x00000040)
  45. #define BIT_7(A) ((A) & 0x00000080)
  46. #define BIT_8(A) ((A) & 0x00000100)
  47. #define BIT_9(A) ((A) & 0x00000200)
  48. #define BIT_A(A) ((A) & 0x00000400)
  49. #define BIT_B(A) ((A) & 0x00000800)
  50. #define BIT_C(A) ((A) & 0x00001000)
  51. #define BIT_D(A) ((A) & 0x00002000)
  52. #define BIT_E(A) ((A) & 0x00004000)
  53. #define BIT_F(A) ((A) & 0x00008000)
  54. #define BIT_10(A) ((A) & 0x00010000)
  55. #define BIT_11(A) ((A) & 0x00020000)
  56. #define BIT_12(A) ((A) & 0x00040000)
  57. #define BIT_13(A) ((A) & 0x00080000)
  58. #define BIT_14(A) ((A) & 0x00100000)
  59. #define BIT_15(A) ((A) & 0x00200000)
  60. #define BIT_16(A) ((A) & 0x00400000)
  61. #define BIT_17(A) ((A) & 0x00800000)
  62. #define BIT_18(A) ((A) & 0x01000000)
  63. #define BIT_19(A) ((A) & 0x02000000)
  64. #define BIT_1A(A) ((A) & 0x04000000)
  65. #define BIT_1B(A) ((A) & 0x08000000)
  66. #define BIT_1C(A) ((A) & 0x10000000)
  67. #define BIT_1D(A) ((A) & 0x20000000)
  68. #define BIT_1E(A) ((A) & 0x40000000)
  69. #define BIT_1F(A) ((A) & 0x80000000)
  70. /* These are the CPU types understood by this disassembler */
  71. #define TYPE_68000 1
  72. #define TYPE_68008 2
  73. #define TYPE_68010 4
  74. #define TYPE_68020 8
  75. #define TYPE_68030 16
  76. #define TYPE_68040 32
  77. #define M68000_ONLY (TYPE_68000 | TYPE_68008)
  78. #define M68010_ONLY TYPE_68010
  79. #define M68010_LESS (TYPE_68000 | TYPE_68008 | TYPE_68010)
  80. #define M68010_PLUS (TYPE_68010 | TYPE_68020 | TYPE_68030 | TYPE_68040)
  81. #define M68020_ONLY TYPE_68020
  82. #define M68020_LESS (TYPE_68010 | TYPE_68020)
  83. #define M68020_PLUS (TYPE_68020 | TYPE_68030 | TYPE_68040)
  84. #define M68030_ONLY TYPE_68030
  85. #define M68030_LESS (TYPE_68010 | TYPE_68020 | TYPE_68030)
  86. #define M68030_PLUS (TYPE_68030 | TYPE_68040)
  87. #define M68040_PLUS TYPE_68040
  88. /* Extension word formats */
  89. #define EXT_8BIT_DISPLACEMENT(A) ((A)&0xff)
  90. #define EXT_FULL(A) BIT_8(A)
  91. #define EXT_EFFECTIVE_ZERO(A) (((A)&0xe4) == 0xc4 || ((A)&0xe2) == 0xc0)
  92. #define EXT_BASE_REGISTER_PRESENT(A) (!BIT_7(A))
  93. #define EXT_INDEX_REGISTER_PRESENT(A) (!BIT_6(A))
  94. #define EXT_INDEX_REGISTER(A) (((A)>>12)&7)
  95. #define EXT_INDEX_PRE_POST(A) (EXT_INDEX_PRESENT(A) && (A)&3)
  96. #define EXT_INDEX_PRE(A) (EXT_INDEX_PRESENT(A) && ((A)&7) < 4 && ((A)&7) != 0)
  97. #define EXT_INDEX_POST(A) (EXT_INDEX_PRESENT(A) && ((A)&7) > 4)
  98. #define EXT_INDEX_SCALE(A) (((A)>>9)&3)
  99. #define EXT_INDEX_LONG(A) BIT_B(A)
  100. #define EXT_INDEX_AR(A) BIT_F(A)
  101. #define EXT_BASE_DISPLACEMENT_PRESENT(A) (((A)&0x30) > 0x10)
  102. #define EXT_BASE_DISPLACEMENT_WORD(A) (((A)&0x30) == 0x20)
  103. #define EXT_BASE_DISPLACEMENT_LONG(A) (((A)&0x30) == 0x30)
  104. #define EXT_OUTER_DISPLACEMENT_PRESENT(A) (((A)&3) > 1 && ((A)&0x47) < 0x44)
  105. #define EXT_OUTER_DISPLACEMENT_WORD(A) (((A)&3) == 2 && ((A)&0x47) < 0x44)
  106. #define EXT_OUTER_DISPLACEMENT_LONG(A) (((A)&3) == 3 && ((A)&0x47) < 0x44)
  107. /* Opcode flags */
  108. #if M68K_COMPILE_FOR_MAME == OPT_ON
  109. #define SET_OPCODE_FLAGS(x) g_opcode_type = x;
  110. #define COMBINE_OPCODE_FLAGS(x) ((x) | g_opcode_type | DASMFLAG_SUPPORTED)
  111. #else
  112. #define SET_OPCODE_FLAGS(x)
  113. #define COMBINE_OPCODE_FLAGS(x) (x)
  114. #endif
  115. /* ======================================================================== */
  116. /* =============================== PROTOTYPES ============================= */
  117. /* ======================================================================== */
  118. /* Read data at the PC and increment PC */
  119. uint read_imm_8(void);
  120. uint read_imm_16(void);
  121. uint read_imm_32(void);
  122. /* Read data at the PC but don't imcrement the PC */
  123. uint peek_imm_8(void);
  124. uint peek_imm_16(void);
  125. uint peek_imm_32(void);
  126. /* make signed integers 100% portably */
  127. static int make_int_8(int value);
  128. static int make_int_16(int value);
  129. /* make a string of a hex value */
  130. static char* make_signed_hex_str_8(uint val);
  131. static char* make_signed_hex_str_16(uint val);
  132. static char* make_signed_hex_str_32(uint val);
  133. /* make string of ea mode */
  134. static char* get_ea_mode_str(uint instruction, uint size);
  135. char* get_ea_mode_str_8(uint instruction);
  136. char* get_ea_mode_str_16(uint instruction);
  137. char* get_ea_mode_str_32(uint instruction);
  138. /* make string of immediate value */
  139. static char* get_imm_str_s(uint size);
  140. static char* get_imm_str_u(uint size);
  141. char* get_imm_str_s8(void);
  142. char* get_imm_str_s16(void);
  143. char* get_imm_str_s32(void);
  144. /* Stuff to build the opcode handler jump table */
  145. static void build_opcode_table(void);
  146. static int valid_ea(uint opcode, uint mask);
  147. static int DECL_SPEC compare_nof_true_bits(const void *aptr, const void *bptr);
  148. /* used to build opcode handler jump table */
  149. typedef struct
  150. {
  151. void (*opcode_handler)(void); /* handler function */
  152. uint mask; /* mask on opcode */
  153. uint match; /* what to match after masking */
  154. uint ea_mask; /* what ea modes are allowed */
  155. } opcode_struct;
  156. /* ======================================================================== */
  157. /* ================================= DATA ================================= */
  158. /* ======================================================================== */
  159. /* Opcode handler jump table */
  160. static void (*g_instruction_table[0x10000])(void);
  161. /* Flag if disassembler initialized */
  162. static int g_initialized = 0;
  163. /* Address mask to simulate address lines */
  164. static unsigned int g_address_mask = 0xffffffff;
  165. static char g_dasm_str[100]; /* string to hold disassembly */
  166. static char g_helper_str[100]; /* string to hold helpful info */
  167. static uint g_cpu_pc; /* program counter */
  168. static uint g_cpu_ir; /* instruction register */
  169. static uint g_cpu_type;
  170. static uint g_opcode_type;
  171. static const unsigned char* g_rawop;
  172. static uint g_rawbasepc;
  173. /* used by ops like asr, ror, addq, etc */
  174. static uint g_3bit_qdata_table[8] = {8, 1, 2, 3, 4, 5, 6, 7};
  175. static uint g_5bit_data_table[32] =
  176. {
  177. 32, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
  178. 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
  179. };
  180. static const char* g_cc[16] =
  181. {"t", "f", "hi", "ls", "cc", "cs", "ne", "eq", "vc", "vs", "pl", "mi", "ge", "lt", "gt", "le"};
  182. static const char* g_cpcc[64] =
  183. {/* 000 001 010 011 100 101 110 111 */
  184. "f", "eq", "ogt", "oge", "olt", "ole", "ogl", "or", /* 000 */
  185. "un", "ueq", "ugt", "uge", "ult", "ule", "ne", "t", /* 001 */
  186. "sf", "seq", "gt", "ge", "lt", "le", "gl" "gle", /* 010 */
  187. "ngle", "ngl", "nle", "nlt", "nge", "ngt", "sne", "st", /* 011 */
  188. "?", "?", "?", "?", "?", "?", "?", "?", /* 100 */
  189. "?", "?", "?", "?", "?", "?", "?", "?", /* 101 */
  190. "?", "?", "?", "?", "?", "?", "?", "?", /* 110 */
  191. "?", "?", "?", "?", "?", "?", "?", "?" /* 111 */
  192. };
  193. /* ======================================================================== */
  194. /* =========================== UTILITY FUNCTIONS ========================== */
  195. /* ======================================================================== */
  196. #define LIMIT_CPU_TYPES(ALLOWED_CPU_TYPES) \
  197. if(!(g_cpu_type & ALLOWED_CPU_TYPES)) \
  198. { \
  199. if((g_cpu_ir & 0xf000) == 0xf000) \
  200. d68000_1111(); \
  201. else d68000_illegal(); \
  202. return; \
  203. }
  204. static uint dasm_read_imm_8(uint advance)
  205. {
  206. uint result;
  207. if (g_rawop)
  208. result = g_rawop[g_cpu_pc + 1 - g_rawbasepc];
  209. else
  210. result = m68k_read_disassembler_16(g_cpu_pc & g_address_mask) & 0xffff; // 0xff ???
  211. g_cpu_pc += advance;
  212. return result;
  213. }
  214. static uint dasm_read_imm_16(uint advance)
  215. {
  216. uint result;
  217. if (g_rawop)
  218. result = (g_rawop[g_cpu_pc + 0 - g_rawbasepc] << 8) |
  219. g_rawop[g_cpu_pc + 1 - g_rawbasepc];
  220. else
  221. result = m68k_read_disassembler_16(g_cpu_pc & g_address_mask) & 0xffff; // 0xff ???
  222. g_cpu_pc += advance;
  223. return result;
  224. }
  225. static uint dasm_read_imm_32(uint advance)
  226. {
  227. uint result;
  228. if (g_rawop)
  229. result = (g_rawop[g_cpu_pc + 0 - g_rawbasepc] << 24) |
  230. (g_rawop[g_cpu_pc + 1 - g_rawbasepc] << 16) |
  231. (g_rawop[g_cpu_pc + 2 - g_rawbasepc] << 8) |
  232. g_rawop[g_cpu_pc + 3 - g_rawbasepc];
  233. else
  234. result = m68k_read_disassembler_32(g_cpu_pc & g_address_mask) & 0xffff; // 0xff ???
  235. g_cpu_pc += advance;
  236. return result;
  237. }
  238. #define read_imm_8() dasm_read_imm_8(2)
  239. #define read_imm_16() dasm_read_imm_16(2)
  240. #define read_imm_32() dasm_read_imm_32(4)
  241. #define peek_imm_8() dasm_read_imm_8(0)
  242. #define peek_imm_16() dasm_read_imm_16(0)
  243. #define peek_imm_32() dasm_read_imm_32(0)
  244. /* Fake a split interface */
  245. #define get_ea_mode_str_8(instruction) get_ea_mode_str(instruction, 0)
  246. #define get_ea_mode_str_16(instruction) get_ea_mode_str(instruction, 1)
  247. #define get_ea_mode_str_32(instruction) get_ea_mode_str(instruction, 2)
  248. #define get_imm_str_s8() get_imm_str_s(0)
  249. #define get_imm_str_s16() get_imm_str_s(1)
  250. #define get_imm_str_s32() get_imm_str_s(2)
  251. #define get_imm_str_u8() get_imm_str_u(0)
  252. #define get_imm_str_u16() get_imm_str_u(1)
  253. #define get_imm_str_u32() get_imm_str_u(2)
  254. /* 100% portable signed int generators */
  255. static int make_int_8(int value)
  256. {
  257. return (value & 0x80) ? value | ~0xff : value & 0xff;
  258. }
  259. static int make_int_16(int value)
  260. {
  261. return (value & 0x8000) ? value | ~0xffff : value & 0xffff;
  262. }
  263. /* Get string representation of hex values */
  264. static char* make_signed_hex_str_8(uint val)
  265. {
  266. static char str[20];
  267. val &= 0xff;
  268. if(val == 0x80)
  269. sprintf(str, "-$80");
  270. else if(val & 0x80)
  271. sprintf(str, "-$%x", (0-val) & 0x7f);
  272. else
  273. sprintf(str, "$%x", val & 0x7f);
  274. return str;
  275. }
  276. static char* make_signed_hex_str_16(uint val)
  277. {
  278. static char str[20];
  279. val &= 0xffff;
  280. if(val == 0x8000)
  281. sprintf(str, "-$8000");
  282. else if(val & 0x8000)
  283. sprintf(str, "-$%x", (0-val) & 0x7fff);
  284. else
  285. sprintf(str, "$%x", val & 0x7fff);
  286. return str;
  287. }
  288. static char* make_signed_hex_str_32(uint val)
  289. {
  290. static char str[20];
  291. val &= 0xffffffff;
  292. if(val == 0x80000000)
  293. sprintf(str, "-$80000000");
  294. else if(val & 0x80000000)
  295. sprintf(str, "-$%x", (0-val) & 0x7fffffff);
  296. else
  297. sprintf(str, "$%x", val & 0x7fffffff);
  298. return str;
  299. }
  300. /* make string of immediate value */
  301. static char* get_imm_str_s(uint size)
  302. {
  303. static char str[15];
  304. if(size == 0)
  305. sprintf(str, "#%s", make_signed_hex_str_8(read_imm_8()));
  306. else if(size == 1)
  307. sprintf(str, "#%s", make_signed_hex_str_16(read_imm_16()));
  308. else
  309. sprintf(str, "#%s", make_signed_hex_str_32(read_imm_32()));
  310. return str;
  311. }
  312. static char* get_imm_str_u(uint size)
  313. {
  314. static char str[15];
  315. if(size == 0)
  316. sprintf(str, "#$%x", read_imm_8() & 0xff);
  317. else if(size == 1)
  318. sprintf(str, "#$%x", read_imm_16() & 0xffff);
  319. else
  320. sprintf(str, "#$%x", read_imm_32() & 0xffffffff);
  321. return str;
  322. }
  323. /* Make string of effective address mode */
  324. static char* get_ea_mode_str(uint instruction, uint size)
  325. {
  326. static char b1[64];
  327. static char b2[64];
  328. static char* mode = b2;
  329. uint extension;
  330. uint base;
  331. uint outer;
  332. char base_reg[4];
  333. char index_reg[8];
  334. uint preindex;
  335. uint postindex;
  336. uint comma = 0;
  337. uint temp_value;
  338. char invalid_mode = 0;
  339. /* Switch buffers so we don't clobber on a double-call to this function */
  340. mode = mode == b1 ? b2 : b1;
  341. switch(instruction & 0x3f)
  342. {
  343. case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07:
  344. /* data register direct */
  345. sprintf(mode, "D%d", instruction&7);
  346. break;
  347. case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f:
  348. /* address register direct */
  349. sprintf(mode, "A%d", instruction&7);
  350. break;
  351. case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17:
  352. /* address register indirect */
  353. sprintf(mode, "(A%d)", instruction&7);
  354. break;
  355. case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f:
  356. /* address register indirect with postincrement */
  357. sprintf(mode, "(A%d)+", instruction&7);
  358. break;
  359. case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27:
  360. /* address register indirect with predecrement */
  361. sprintf(mode, "-(A%d)", instruction&7);
  362. break;
  363. case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f:
  364. /* address register indirect with displacement*/
  365. sprintf(mode, "(%s,A%d)", make_signed_hex_str_16(read_imm_16()), instruction&7);
  366. break;
  367. case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37:
  368. /* address register indirect with index */
  369. extension = read_imm_16();
  370. if((g_cpu_type & M68010_LESS) && EXT_INDEX_SCALE(extension))
  371. {
  372. invalid_mode = 1;
  373. break;
  374. }
  375. if(EXT_FULL(extension))
  376. {
  377. if(g_cpu_type & M68010_LESS)
  378. {
  379. invalid_mode = 1;
  380. break;
  381. }
  382. if(EXT_EFFECTIVE_ZERO(extension))
  383. {
  384. strcpy(mode, "0");
  385. break;
  386. }
  387. base = EXT_BASE_DISPLACEMENT_PRESENT(extension) ? (EXT_BASE_DISPLACEMENT_LONG(extension) ? read_imm_32() : read_imm_16()) : 0;
  388. outer = EXT_OUTER_DISPLACEMENT_PRESENT(extension) ? (EXT_OUTER_DISPLACEMENT_LONG(extension) ? read_imm_32() : read_imm_16()) : 0;
  389. if(EXT_BASE_REGISTER_PRESENT(extension))
  390. sprintf(base_reg, "A%d", instruction&7);
  391. else
  392. *base_reg = 0;
  393. if(EXT_INDEX_REGISTER_PRESENT(extension))
  394. {
  395. sprintf(index_reg, "%c%d.%c", EXT_INDEX_AR(extension) ? 'A' : 'D', EXT_INDEX_REGISTER(extension), EXT_INDEX_LONG(extension) ? 'l' : 'w');
  396. if(EXT_INDEX_SCALE(extension))
  397. sprintf(index_reg+strlen(index_reg), "*%d", 1 << EXT_INDEX_SCALE(extension));
  398. }
  399. else
  400. *index_reg = 0;
  401. preindex = (extension&7) > 0 && (extension&7) < 4;
  402. postindex = (extension&7) > 4;
  403. strcpy(mode, "(");
  404. if(preindex || postindex)
  405. strcat(mode, "[");
  406. if(base)
  407. {
  408. strcat(mode, make_signed_hex_str_16(base));
  409. comma = 1;
  410. }
  411. if(*base_reg)
  412. {
  413. if(comma)
  414. strcat(mode, ",");
  415. strcat(mode, base_reg);
  416. comma = 1;
  417. }
  418. if(postindex)
  419. {
  420. strcat(mode, "]");
  421. comma = 1;
  422. }
  423. if(*index_reg)
  424. {
  425. if(comma)
  426. strcat(mode, ",");
  427. strcat(mode, index_reg);
  428. comma = 1;
  429. }
  430. if(preindex)
  431. {
  432. strcat(mode, "]");
  433. comma = 1;
  434. }
  435. if(outer)
  436. {
  437. if(comma)
  438. strcat(mode, ",");
  439. strcat(mode, make_signed_hex_str_16(outer));
  440. }
  441. strcat(mode, ")");
  442. break;
  443. }
  444. if(EXT_8BIT_DISPLACEMENT(extension) == 0)
  445. 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');
  446. else
  447. 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');
  448. if(EXT_INDEX_SCALE(extension))
  449. sprintf(mode+strlen(mode), "*%d", 1 << EXT_INDEX_SCALE(extension));
  450. strcat(mode, ")");
  451. break;
  452. case 0x38:
  453. /* absolute short address */
  454. sprintf(mode, "$%x.w", read_imm_16());
  455. break;
  456. case 0x39:
  457. /* absolute long address */
  458. sprintf(mode, "$%x.l", read_imm_32());
  459. break;
  460. case 0x3a:
  461. /* program counter with displacement */
  462. temp_value = read_imm_16();
  463. sprintf(mode, "(%s,PC)", make_signed_hex_str_16(temp_value));
  464. sprintf(g_helper_str, "; ($%x)", (make_int_16(temp_value) + g_cpu_pc-2) & 0xffffffff);
  465. break;
  466. case 0x3b:
  467. /* program counter with index */
  468. extension = read_imm_16();
  469. if((g_cpu_type & M68010_LESS) && EXT_INDEX_SCALE(extension))
  470. {
  471. invalid_mode = 1;
  472. break;
  473. }
  474. if(EXT_FULL(extension))
  475. {
  476. if(g_cpu_type & M68010_LESS)
  477. {
  478. invalid_mode = 1;
  479. break;
  480. }
  481. if(EXT_EFFECTIVE_ZERO(extension))
  482. {
  483. strcpy(mode, "0");
  484. break;
  485. }
  486. base = EXT_BASE_DISPLACEMENT_PRESENT(extension) ? (EXT_BASE_DISPLACEMENT_LONG(extension) ? read_imm_32() : read_imm_16()) : 0;
  487. outer = EXT_OUTER_DISPLACEMENT_PRESENT(extension) ? (EXT_OUTER_DISPLACEMENT_LONG(extension) ? read_imm_32() : read_imm_16()) : 0;
  488. if(EXT_BASE_REGISTER_PRESENT(extension))
  489. strcpy(base_reg, "PC");
  490. else
  491. *base_reg = 0;
  492. if(EXT_INDEX_REGISTER_PRESENT(extension))
  493. {
  494. sprintf(index_reg, "%c%d.%c", EXT_INDEX_AR(extension) ? 'A' : 'D', EXT_INDEX_REGISTER(extension), EXT_INDEX_LONG(extension) ? 'l' : 'w');
  495. if(EXT_INDEX_SCALE(extension))
  496. sprintf(index_reg+strlen(index_reg), "*%d", 1 << EXT_INDEX_SCALE(extension));
  497. }
  498. else
  499. *index_reg = 0;
  500. preindex = (extension&7) > 0 && (extension&7) < 4;
  501. postindex = (extension&7) > 4;
  502. strcpy(mode, "(");
  503. if(preindex || postindex)
  504. strcat(mode, "[");
  505. if(base)
  506. {
  507. strcat(mode, make_signed_hex_str_16(base));
  508. comma = 1;
  509. }
  510. if(*base_reg)
  511. {
  512. if(comma)
  513. strcat(mode, ",");
  514. strcat(mode, base_reg);
  515. comma = 1;
  516. }
  517. if(postindex)
  518. {
  519. strcat(mode, "]");
  520. comma = 1;
  521. }
  522. if(*index_reg)
  523. {
  524. if(comma)
  525. strcat(mode, ",");
  526. strcat(mode, index_reg);
  527. comma = 1;
  528. }
  529. if(preindex)
  530. {
  531. strcat(mode, "]");
  532. comma = 1;
  533. }
  534. if(outer)
  535. {
  536. if(comma)
  537. strcat(mode, ",");
  538. strcat(mode, make_signed_hex_str_16(outer));
  539. }
  540. strcat(mode, ")");
  541. break;
  542. }
  543. if(EXT_8BIT_DISPLACEMENT(extension) == 0)
  544. sprintf(mode, "(PC,%c%d.%c", EXT_INDEX_AR(extension) ? 'A' : 'D', EXT_INDEX_REGISTER(extension), EXT_INDEX_LONG(extension) ? 'l' : 'w');
  545. else
  546. 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');
  547. if(EXT_INDEX_SCALE(extension))
  548. sprintf(mode+strlen(mode), "*%d", 1 << EXT_INDEX_SCALE(extension));
  549. strcat(mode, ")");
  550. break;
  551. case 0x3c:
  552. /* Immediate */
  553. sprintf(mode, "%s", get_imm_str_u(size));
  554. break;
  555. default:
  556. invalid_mode = 1;
  557. }
  558. if(invalid_mode)
  559. sprintf(mode, "INVALID %x", instruction & 0x3f);
  560. return mode;
  561. }
  562. /* ======================================================================== */
  563. /* ========================= INSTRUCTION HANDLERS ========================= */
  564. /* ======================================================================== */
  565. /* Instruction handler function names follow this convention:
  566. *
  567. * d68000_NAME_EXTENSIONS(void)
  568. * where NAME is the name of the opcode it handles and EXTENSIONS are any
  569. * extensions for special instances of that opcode.
  570. *
  571. * Examples:
  572. * d68000_add_er_8(): add opcode, from effective address to register,
  573. * size = byte
  574. *
  575. * d68000_asr_s_8(): arithmetic shift right, static count, size = byte
  576. *
  577. *
  578. * Common extensions:
  579. * 8 : size = byte
  580. * 16 : size = word
  581. * 32 : size = long
  582. * rr : register to register
  583. * mm : memory to memory
  584. * r : register
  585. * s : static
  586. * er : effective address -> register
  587. * re : register -> effective address
  588. * ea : using effective address mode of operation
  589. * d : data register direct
  590. * a : address register direct
  591. * ai : address register indirect
  592. * pi : address register indirect with postincrement
  593. * pd : address register indirect with predecrement
  594. * di : address register indirect with displacement
  595. * ix : address register indirect with index
  596. * aw : absolute word
  597. * al : absolute long
  598. */
  599. static void d68000_illegal(void)
  600. {
  601. sprintf(g_dasm_str, "dc.w $%04x; ILLEGAL", g_cpu_ir);
  602. }
  603. static void d68000_1010(void)
  604. {
  605. sprintf(g_dasm_str, "dc.w $%04x; opcode 1010", g_cpu_ir);
  606. }
  607. static void d68000_1111(void)
  608. {
  609. sprintf(g_dasm_str, "dc.w $%04x; opcode 1111", g_cpu_ir);
  610. }
  611. static void d68000_abcd_rr(void)
  612. {
  613. sprintf(g_dasm_str, "abcd D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7);
  614. }
  615. static void d68000_abcd_mm(void)
  616. {
  617. sprintf(g_dasm_str, "abcd -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7);
  618. }
  619. static void d68000_add_er_8(void)
  620. {
  621. sprintf(g_dasm_str, "add.b %s, D%d", get_ea_mode_str_8(g_cpu_ir), (g_cpu_ir>>9)&7);
  622. }
  623. static void d68000_add_er_16(void)
  624. {
  625. sprintf(g_dasm_str, "add.w %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);
  626. }
  627. static void d68000_add_er_32(void)
  628. {
  629. sprintf(g_dasm_str, "add.l %s, D%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);
  630. }
  631. static void d68000_add_re_8(void)
  632. {
  633. sprintf(g_dasm_str, "add.b D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));
  634. }
  635. static void d68000_add_re_16(void)
  636. {
  637. sprintf(g_dasm_str, "add.w D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_16(g_cpu_ir));
  638. }
  639. static void d68000_add_re_32(void)
  640. {
  641. sprintf(g_dasm_str, "add.l D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_32(g_cpu_ir));
  642. }
  643. static void d68000_adda_16(void)
  644. {
  645. sprintf(g_dasm_str, "adda.w %s, A%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);
  646. }
  647. static void d68000_adda_32(void)
  648. {
  649. sprintf(g_dasm_str, "adda.l %s, A%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);
  650. }
  651. static void d68000_addi_8(void)
  652. {
  653. char* str = get_imm_str_s8();
  654. sprintf(g_dasm_str, "addi.b %s, %s", str, get_ea_mode_str_8(g_cpu_ir));
  655. }
  656. static void d68000_addi_16(void)
  657. {
  658. char* str = get_imm_str_s16();
  659. sprintf(g_dasm_str, "addi.w %s, %s", str, get_ea_mode_str_16(g_cpu_ir));
  660. }
  661. static void d68000_addi_32(void)
  662. {
  663. char* str = get_imm_str_s32();
  664. sprintf(g_dasm_str, "addi.l %s, %s", str, get_ea_mode_str_32(g_cpu_ir));
  665. }
  666. static void d68000_addq_8(void)
  667. {
  668. 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));
  669. }
  670. static void d68000_addq_16(void)
  671. {
  672. 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));
  673. }
  674. static void d68000_addq_32(void)
  675. {
  676. 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));
  677. }
  678. static void d68000_addx_rr_8(void)
  679. {
  680. sprintf(g_dasm_str, "addx.b D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7);
  681. }
  682. static void d68000_addx_rr_16(void)
  683. {
  684. sprintf(g_dasm_str, "addx.w D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7);
  685. }
  686. static void d68000_addx_rr_32(void)
  687. {
  688. sprintf(g_dasm_str, "addx.l D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7);
  689. }
  690. static void d68000_addx_mm_8(void)
  691. {
  692. sprintf(g_dasm_str, "addx.b -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7);
  693. }
  694. static void d68000_addx_mm_16(void)
  695. {
  696. sprintf(g_dasm_str, "addx.w -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7);
  697. }
  698. static void d68000_addx_mm_32(void)
  699. {
  700. sprintf(g_dasm_str, "addx.l -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7);
  701. }
  702. static void d68000_and_er_8(void)
  703. {
  704. sprintf(g_dasm_str, "and.b %s, D%d", get_ea_mode_str_8(g_cpu_ir), (g_cpu_ir>>9)&7);
  705. }
  706. static void d68000_and_er_16(void)
  707. {
  708. sprintf(g_dasm_str, "and.w %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);
  709. }
  710. static void d68000_and_er_32(void)
  711. {
  712. sprintf(g_dasm_str, "and.l %s, D%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);
  713. }
  714. static void d68000_and_re_8(void)
  715. {
  716. sprintf(g_dasm_str, "and.b D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));
  717. }
  718. static void d68000_and_re_16(void)
  719. {
  720. sprintf(g_dasm_str, "and.w D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_16(g_cpu_ir));
  721. }
  722. static void d68000_and_re_32(void)
  723. {
  724. sprintf(g_dasm_str, "and.l D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_32(g_cpu_ir));
  725. }
  726. static void d68000_andi_8(void)
  727. {
  728. char* str = get_imm_str_u8();
  729. sprintf(g_dasm_str, "andi.b %s, %s", str, get_ea_mode_str_8(g_cpu_ir));
  730. }
  731. static void d68000_andi_16(void)
  732. {
  733. char* str = get_imm_str_u16();
  734. sprintf(g_dasm_str, "andi.w %s, %s", str, get_ea_mode_str_16(g_cpu_ir));
  735. }
  736. static void d68000_andi_32(void)
  737. {
  738. char* str = get_imm_str_u32();
  739. sprintf(g_dasm_str, "andi.l %s, %s", str, get_ea_mode_str_32(g_cpu_ir));
  740. }
  741. static void d68000_andi_to_ccr(void)
  742. {
  743. sprintf(g_dasm_str, "andi %s, CCR", get_imm_str_u8());
  744. }
  745. static void d68000_andi_to_sr(void)
  746. {
  747. sprintf(g_dasm_str, "andi %s, SR", get_imm_str_u16());
  748. }
  749. static void d68000_asr_s_8(void)
  750. {
  751. sprintf(g_dasm_str, "asr.b #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  752. }
  753. static void d68000_asr_s_16(void)
  754. {
  755. sprintf(g_dasm_str, "asr.w #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  756. }
  757. static void d68000_asr_s_32(void)
  758. {
  759. sprintf(g_dasm_str, "asr.l #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  760. }
  761. static void d68000_asr_r_8(void)
  762. {
  763. sprintf(g_dasm_str, "asr.b D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  764. }
  765. static void d68000_asr_r_16(void)
  766. {
  767. sprintf(g_dasm_str, "asr.w D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  768. }
  769. static void d68000_asr_r_32(void)
  770. {
  771. sprintf(g_dasm_str, "asr.l D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  772. }
  773. static void d68000_asr_ea(void)
  774. {
  775. sprintf(g_dasm_str, "asr.w %s", get_ea_mode_str_16(g_cpu_ir));
  776. }
  777. static void d68000_asl_s_8(void)
  778. {
  779. sprintf(g_dasm_str, "asl.b #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  780. }
  781. static void d68000_asl_s_16(void)
  782. {
  783. sprintf(g_dasm_str, "asl.w #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  784. }
  785. static void d68000_asl_s_32(void)
  786. {
  787. sprintf(g_dasm_str, "asl.l #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  788. }
  789. static void d68000_asl_r_8(void)
  790. {
  791. sprintf(g_dasm_str, "asl.b D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  792. }
  793. static void d68000_asl_r_16(void)
  794. {
  795. sprintf(g_dasm_str, "asl.w D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  796. }
  797. static void d68000_asl_r_32(void)
  798. {
  799. sprintf(g_dasm_str, "asl.l D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  800. }
  801. static void d68000_asl_ea(void)
  802. {
  803. sprintf(g_dasm_str, "asl.w %s", get_ea_mode_str_16(g_cpu_ir));
  804. }
  805. static void d68000_bcc_8(void)
  806. {
  807. uint temp_pc = g_cpu_pc;
  808. sprintf(g_dasm_str, "b%-2s $%x", g_cc[(g_cpu_ir>>8)&0xf], temp_pc + make_int_8(g_cpu_ir));
  809. }
  810. static void d68000_bcc_16(void)
  811. {
  812. uint temp_pc = g_cpu_pc;
  813. sprintf(g_dasm_str, "b%-2s $%x", g_cc[(g_cpu_ir>>8)&0xf], temp_pc + make_int_16(read_imm_16()));
  814. }
  815. static void d68020_bcc_32(void)
  816. {
  817. uint temp_pc = g_cpu_pc;
  818. LIMIT_CPU_TYPES(M68020_PLUS);
  819. sprintf(g_dasm_str, "b%-2s $%x; (2+)", g_cc[(g_cpu_ir>>8)&0xf], temp_pc + read_imm_32());
  820. }
  821. static void d68000_bchg_r(void)
  822. {
  823. sprintf(g_dasm_str, "bchg D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));
  824. }
  825. static void d68000_bchg_s(void)
  826. {
  827. char* str = get_imm_str_u8();
  828. sprintf(g_dasm_str, "bchg %s, %s", str, get_ea_mode_str_8(g_cpu_ir));
  829. }
  830. static void d68000_bclr_r(void)
  831. {
  832. sprintf(g_dasm_str, "bclr D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));
  833. }
  834. static void d68000_bclr_s(void)
  835. {
  836. char* str = get_imm_str_u8();
  837. sprintf(g_dasm_str, "bclr %s, %s", str, get_ea_mode_str_8(g_cpu_ir));
  838. }
  839. static void d68010_bkpt(void)
  840. {
  841. LIMIT_CPU_TYPES(M68010_PLUS);
  842. sprintf(g_dasm_str, "bkpt #%d; (1+)", g_cpu_ir&7);
  843. }
  844. static void d68020_bfchg(void)
  845. {
  846. uint extension;
  847. char offset[3];
  848. char width[3];
  849. LIMIT_CPU_TYPES(M68020_PLUS);
  850. extension = read_imm_16();
  851. if(BIT_B(extension))
  852. sprintf(offset, "D%d", (extension>>6)&7);
  853. else
  854. sprintf(offset, "%d", (extension>>6)&31);
  855. if(BIT_5(extension))
  856. sprintf(width, "D%d", extension&7);
  857. else
  858. sprintf(width, "%d", g_5bit_data_table[extension&31]);
  859. sprintf(g_dasm_str, "bfchg %s {%s:%s}; (2+)", get_ea_mode_str_8(g_cpu_ir), offset, width);
  860. }
  861. static void d68020_bfclr(void)
  862. {
  863. uint extension;
  864. char offset[3];
  865. char width[3];
  866. LIMIT_CPU_TYPES(M68020_PLUS);
  867. extension = read_imm_16();
  868. if(BIT_B(extension))
  869. sprintf(offset, "D%d", (extension>>6)&7);
  870. else
  871. sprintf(offset, "%d", (extension>>6)&31);
  872. if(BIT_5(extension))
  873. sprintf(width, "D%d", extension&7);
  874. else
  875. sprintf(width, "%d", g_5bit_data_table[extension&31]);
  876. sprintf(g_dasm_str, "bfclr %s {%s:%s}; (2+)", get_ea_mode_str_8(g_cpu_ir), offset, width);
  877. }
  878. static void d68020_bfexts(void)
  879. {
  880. uint extension;
  881. char offset[3];
  882. char width[3];
  883. LIMIT_CPU_TYPES(M68020_PLUS);
  884. extension = read_imm_16();
  885. if(BIT_B(extension))
  886. sprintf(offset, "D%d", (extension>>6)&7);
  887. else
  888. sprintf(offset, "%d", (extension>>6)&31);
  889. if(BIT_5(extension))
  890. sprintf(width, "D%d", extension&7);
  891. else
  892. sprintf(width, "%d", g_5bit_data_table[extension&31]);
  893. sprintf(g_dasm_str, "bfexts D%d, %s {%s:%s}; (2+)", (extension>>12)&7, get_ea_mode_str_8(g_cpu_ir), offset, width);
  894. }
  895. static void d68020_bfextu(void)
  896. {
  897. uint extension;
  898. char offset[3];
  899. char width[3];
  900. LIMIT_CPU_TYPES(M68020_PLUS);
  901. extension = read_imm_16();
  902. if(BIT_B(extension))
  903. sprintf(offset, "D%d", (extension>>6)&7);
  904. else
  905. sprintf(offset, "%d", (extension>>6)&31);
  906. if(BIT_5(extension))
  907. sprintf(width, "D%d", extension&7);
  908. else
  909. sprintf(width, "%d", g_5bit_data_table[extension&31]);
  910. sprintf(g_dasm_str, "bfextu D%d, %s {%s:%s}; (2+)", (extension>>12)&7, get_ea_mode_str_8(g_cpu_ir), offset, width);
  911. }
  912. static void d68020_bfffo(void)
  913. {
  914. uint extension;
  915. char offset[3];
  916. char width[3];
  917. LIMIT_CPU_TYPES(M68020_PLUS);
  918. extension = read_imm_16();
  919. if(BIT_B(extension))
  920. sprintf(offset, "D%d", (extension>>6)&7);
  921. else
  922. sprintf(offset, "%d", (extension>>6)&31);
  923. if(BIT_5(extension))
  924. sprintf(width, "D%d", extension&7);
  925. else
  926. sprintf(width, "%d", g_5bit_data_table[extension&31]);
  927. sprintf(g_dasm_str, "bfffo D%d, %s {%s:%s}; (2+)", (extension>>12)&7, get_ea_mode_str_8(g_cpu_ir), offset, width);
  928. }
  929. static void d68020_bfins(void)
  930. {
  931. uint extension;
  932. char offset[3];
  933. char width[3];
  934. LIMIT_CPU_TYPES(M68020_PLUS);
  935. extension = read_imm_16();
  936. if(BIT_B(extension))
  937. sprintf(offset, "D%d", (extension>>6)&7);
  938. else
  939. sprintf(offset, "%d", (extension>>6)&31);
  940. if(BIT_5(extension))
  941. sprintf(width, "D%d", extension&7);
  942. else
  943. sprintf(width, "%d", g_5bit_data_table[extension&31]);
  944. sprintf(g_dasm_str, "bfins D%d, %s {%s:%s}; (2+)", (extension>>12)&7, get_ea_mode_str_8(g_cpu_ir), offset, width);
  945. }
  946. static void d68020_bfset(void)
  947. {
  948. uint extension;
  949. char offset[3];
  950. char width[3];
  951. LIMIT_CPU_TYPES(M68020_PLUS);
  952. extension = read_imm_16();
  953. if(BIT_B(extension))
  954. sprintf(offset, "D%d", (extension>>6)&7);
  955. else
  956. sprintf(offset, "%d", (extension>>6)&31);
  957. if(BIT_5(extension))
  958. sprintf(width, "D%d", extension&7);
  959. else
  960. sprintf(width, "%d", g_5bit_data_table[extension&31]);
  961. sprintf(g_dasm_str, "bfset %s {%s:%s}; (2+)", get_ea_mode_str_8(g_cpu_ir), offset, width);
  962. }
  963. static void d68020_bftst(void)
  964. {
  965. uint extension;
  966. char offset[3];
  967. char width[3];
  968. LIMIT_CPU_TYPES(M68020_PLUS);
  969. extension = read_imm_16();
  970. if(BIT_B(extension))
  971. sprintf(offset, "D%d", (extension>>6)&7);
  972. else
  973. sprintf(offset, "%d", (extension>>6)&31);
  974. if(BIT_5(extension))
  975. sprintf(width, "D%d", extension&7);
  976. else
  977. sprintf(width, "%d", g_5bit_data_table[extension&31]);
  978. sprintf(g_dasm_str, "bftst %s {%s:%s}; (2+)", get_ea_mode_str_8(g_cpu_ir), offset, width);
  979. }
  980. static void d68000_bra_8(void)
  981. {
  982. uint temp_pc = g_cpu_pc;
  983. sprintf(g_dasm_str, "bra $%x", temp_pc + make_int_8(g_cpu_ir));
  984. }
  985. static void d68000_bra_16(void)
  986. {
  987. uint temp_pc = g_cpu_pc;
  988. sprintf(g_dasm_str, "bra $%x", temp_pc + make_int_16(read_imm_16()));
  989. }
  990. static void d68020_bra_32(void)
  991. {
  992. uint temp_pc = g_cpu_pc;
  993. LIMIT_CPU_TYPES(M68020_PLUS);
  994. sprintf(g_dasm_str, "bra $%x; (2+)", temp_pc + read_imm_32());
  995. }
  996. static void d68000_bset_r(void)
  997. {
  998. sprintf(g_dasm_str, "bset D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));
  999. }
  1000. static void d68000_bset_s(void)
  1001. {
  1002. char* str = get_imm_str_u8();
  1003. sprintf(g_dasm_str, "bset %s, %s", str, get_ea_mode_str_8(g_cpu_ir));
  1004. }
  1005. static void d68000_bsr_8(void)
  1006. {
  1007. uint temp_pc = g_cpu_pc;
  1008. sprintf(g_dasm_str, "bsr $%x", temp_pc + make_int_8(g_cpu_ir));
  1009. SET_OPCODE_FLAGS(DASMFLAG_STEP_OVER);
  1010. }
  1011. static void d68000_bsr_16(void)
  1012. {
  1013. uint temp_pc = g_cpu_pc;
  1014. sprintf(g_dasm_str, "bsr $%x", temp_pc + make_int_16(read_imm_16()));
  1015. SET_OPCODE_FLAGS(DASMFLAG_STEP_OVER);
  1016. }
  1017. static void d68020_bsr_32(void)
  1018. {
  1019. uint temp_pc = g_cpu_pc;
  1020. LIMIT_CPU_TYPES(M68020_PLUS);
  1021. sprintf(g_dasm_str, "bsr $%x; (2+)", temp_pc + read_imm_32());
  1022. SET_OPCODE_FLAGS(DASMFLAG_STEP_OVER);
  1023. }
  1024. static void d68000_btst_r(void)
  1025. {
  1026. sprintf(g_dasm_str, "btst D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));
  1027. }
  1028. static void d68000_btst_s(void)
  1029. {
  1030. char* str = get_imm_str_u8();
  1031. sprintf(g_dasm_str, "btst %s, %s", str, get_ea_mode_str_8(g_cpu_ir));
  1032. }
  1033. static void d68020_callm(void)
  1034. {
  1035. char* str;
  1036. LIMIT_CPU_TYPES(M68020_ONLY);
  1037. str = get_imm_str_u8();
  1038. sprintf(g_dasm_str, "callm %s, %s; (2)", str, get_ea_mode_str_8(g_cpu_ir));
  1039. }
  1040. static void d68020_cas_8(void)
  1041. {
  1042. uint extension;
  1043. LIMIT_CPU_TYPES(M68020_PLUS);
  1044. extension = read_imm_16();
  1045. 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));
  1046. }
  1047. static void d68020_cas_16(void)
  1048. {
  1049. uint extension;
  1050. LIMIT_CPU_TYPES(M68020_PLUS);
  1051. extension = read_imm_16();
  1052. 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));
  1053. }
  1054. static void d68020_cas_32(void)
  1055. {
  1056. uint extension;
  1057. LIMIT_CPU_TYPES(M68020_PLUS);
  1058. extension = read_imm_16();
  1059. 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));
  1060. }
  1061. static void d68020_cas2_16(void)
  1062. {
  1063. /* CAS2 Dc1:Dc2,Du1:Dc2:(Rn1):(Rn2)
  1064. f e d c b a 9 8 7 6 5 4 3 2 1 0
  1065. DARn1 0 0 0 Du1 0 0 0 Dc1
  1066. DARn2 0 0 0 Du2 0 0 0 Dc2
  1067. */
  1068. uint extension;
  1069. LIMIT_CPU_TYPES(M68020_PLUS);
  1070. extension = read_imm_32();
  1071. sprintf(g_dasm_str, "cas2.w D%d:D%d:D%d:D%d, (%c%d):(%c%d); (2+)",
  1072. (extension>>16)&7, extension&7, (extension>>22)&7, (extension>>6)&7,
  1073. BIT_1F(extension) ? 'A' : 'D', (extension>>28)&7,
  1074. BIT_F(extension) ? 'A' : 'D', (extension>>12)&7);
  1075. }
  1076. static void d68020_cas2_32(void)
  1077. {
  1078. uint extension;
  1079. LIMIT_CPU_TYPES(M68020_PLUS);
  1080. extension = read_imm_32();
  1081. sprintf(g_dasm_str, "cas2.l D%d:D%d:D%d:D%d, (%c%d):(%c%d); (2+)",
  1082. (extension>>16)&7, extension&7, (extension>>22)&7, (extension>>6)&7,
  1083. BIT_1F(extension) ? 'A' : 'D', (extension>>28)&7,
  1084. BIT_F(extension) ? 'A' : 'D', (extension>>12)&7);
  1085. }
  1086. static void d68000_chk_16(void)
  1087. {
  1088. sprintf(g_dasm_str, "chk.w %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);
  1089. SET_OPCODE_FLAGS(DASMFLAG_STEP_OVER);
  1090. }
  1091. static void d68020_chk_32(void)
  1092. {
  1093. LIMIT_CPU_TYPES(M68020_PLUS);
  1094. sprintf(g_dasm_str, "chk.l %s, D%d; (2+)", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);
  1095. SET_OPCODE_FLAGS(DASMFLAG_STEP_OVER);
  1096. }
  1097. static void d68020_chk2_cmp2_8(void)
  1098. {
  1099. uint extension;
  1100. LIMIT_CPU_TYPES(M68020_PLUS);
  1101. extension = read_imm_16();
  1102. 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);
  1103. }
  1104. static void d68020_chk2_cmp2_16(void)
  1105. {
  1106. uint extension;
  1107. LIMIT_CPU_TYPES(M68020_PLUS);
  1108. extension = read_imm_16();
  1109. 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);
  1110. }
  1111. static void d68020_chk2_cmp2_32(void)
  1112. {
  1113. uint extension;
  1114. LIMIT_CPU_TYPES(M68020_PLUS);
  1115. extension = read_imm_16();
  1116. 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);
  1117. }
  1118. static void d68040_cinv(void)
  1119. {
  1120. LIMIT_CPU_TYPES(M68040_PLUS);
  1121. switch((g_cpu_ir>>3)&3)
  1122. {
  1123. case 0:
  1124. sprintf(g_dasm_str, "cinv (illegal scope); (4)");
  1125. break;
  1126. case 1:
  1127. sprintf(g_dasm_str, "cinvl %d, (A%d); (4)", (g_cpu_ir>>6)&3, g_cpu_ir&7);
  1128. break;
  1129. case 2:
  1130. sprintf(g_dasm_str, "cinvp %d, (A%d); (4)", (g_cpu_ir>>6)&3, g_cpu_ir&7);
  1131. break;
  1132. case 3:
  1133. sprintf(g_dasm_str, "cinva %d; (4)", (g_cpu_ir>>6)&3);
  1134. break;
  1135. }
  1136. }
  1137. static void d68000_clr_8(void)
  1138. {
  1139. sprintf(g_dasm_str, "clr.b %s", get_ea_mode_str_8(g_cpu_ir));
  1140. }
  1141. static void d68000_clr_16(void)
  1142. {
  1143. sprintf(g_dasm_str, "clr.w %s", get_ea_mode_str_16(g_cpu_ir));
  1144. }
  1145. static void d68000_clr_32(void)
  1146. {
  1147. sprintf(g_dasm_str, "clr.l %s", get_ea_mode_str_32(g_cpu_ir));
  1148. }
  1149. static void d68000_cmp_8(void)
  1150. {
  1151. sprintf(g_dasm_str, "cmp.b %s, D%d", get_ea_mode_str_8(g_cpu_ir), (g_cpu_ir>>9)&7);
  1152. }
  1153. static void d68000_cmp_16(void)
  1154. {
  1155. sprintf(g_dasm_str, "cmp.w %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);
  1156. }
  1157. static void d68000_cmp_32(void)
  1158. {
  1159. sprintf(g_dasm_str, "cmp.l %s, D%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);
  1160. }
  1161. static void d68000_cmpa_16(void)
  1162. {
  1163. sprintf(g_dasm_str, "cmpa.w %s, A%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);
  1164. }
  1165. static void d68000_cmpa_32(void)
  1166. {
  1167. sprintf(g_dasm_str, "cmpa.l %s, A%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);
  1168. }
  1169. static void d68000_cmpi_8(void)
  1170. {
  1171. char* str = get_imm_str_s8();
  1172. sprintf(g_dasm_str, "cmpi.b %s, %s", str, get_ea_mode_str_8(g_cpu_ir));
  1173. }
  1174. static void d68020_cmpi_pcdi_8(void)
  1175. {
  1176. char* str;
  1177. LIMIT_CPU_TYPES(M68010_PLUS);
  1178. str = get_imm_str_s8();
  1179. sprintf(g_dasm_str, "cmpi.b %s, %s; (2+)", str, get_ea_mode_str_8(g_cpu_ir));
  1180. }
  1181. static void d68020_cmpi_pcix_8(void)
  1182. {
  1183. char* str;
  1184. LIMIT_CPU_TYPES(M68010_PLUS);
  1185. str = get_imm_str_s8();
  1186. sprintf(g_dasm_str, "cmpi.b %s, %s; (2+)", str, get_ea_mode_str_8(g_cpu_ir));
  1187. }
  1188. static void d68000_cmpi_16(void)
  1189. {
  1190. char* str;
  1191. str = get_imm_str_s16();
  1192. sprintf(g_dasm_str, "cmpi.w %s, %s", str, get_ea_mode_str_16(g_cpu_ir));
  1193. }
  1194. static void d68020_cmpi_pcdi_16(void)
  1195. {
  1196. char* str;
  1197. LIMIT_CPU_TYPES(M68010_PLUS);
  1198. str = get_imm_str_s16();
  1199. sprintf(g_dasm_str, "cmpi.w %s, %s; (2+)", str, get_ea_mode_str_16(g_cpu_ir));
  1200. }
  1201. static void d68020_cmpi_pcix_16(void)
  1202. {
  1203. char* str;
  1204. LIMIT_CPU_TYPES(M68010_PLUS);
  1205. str = get_imm_str_s16();
  1206. sprintf(g_dasm_str, "cmpi.w %s, %s; (2+)", str, get_ea_mode_str_16(g_cpu_ir));
  1207. }
  1208. static void d68000_cmpi_32(void)
  1209. {
  1210. char* str;
  1211. str = get_imm_str_s32();
  1212. sprintf(g_dasm_str, "cmpi.l %s, %s", str, get_ea_mode_str_32(g_cpu_ir));
  1213. }
  1214. static void d68020_cmpi_pcdi_32(void)
  1215. {
  1216. char* str;
  1217. LIMIT_CPU_TYPES(M68010_PLUS);
  1218. str = get_imm_str_s32();
  1219. sprintf(g_dasm_str, "cmpi.l %s, %s; (2+)", str, get_ea_mode_str_32(g_cpu_ir));
  1220. }
  1221. static void d68020_cmpi_pcix_32(void)
  1222. {
  1223. char* str;
  1224. LIMIT_CPU_TYPES(M68010_PLUS);
  1225. str = get_imm_str_s32();
  1226. sprintf(g_dasm_str, "cmpi.l %s, %s; (2+)", str, get_ea_mode_str_32(g_cpu_ir));
  1227. }
  1228. static void d68000_cmpm_8(void)
  1229. {
  1230. sprintf(g_dasm_str, "cmpm.b (A%d)+, (A%d)+", g_cpu_ir&7, (g_cpu_ir>>9)&7);
  1231. }
  1232. static void d68000_cmpm_16(void)
  1233. {
  1234. sprintf(g_dasm_str, "cmpm.w (A%d)+, (A%d)+", g_cpu_ir&7, (g_cpu_ir>>9)&7);
  1235. }
  1236. static void d68000_cmpm_32(void)
  1237. {
  1238. sprintf(g_dasm_str, "cmpm.l (A%d)+, (A%d)+", g_cpu_ir&7, (g_cpu_ir>>9)&7);
  1239. }
  1240. static void d68020_cpbcc_16(void)
  1241. {
  1242. uint extension;
  1243. uint new_pc = g_cpu_pc;
  1244. LIMIT_CPU_TYPES(M68020_PLUS);
  1245. extension = read_imm_16();
  1246. new_pc += make_int_16(read_imm_16());
  1247. 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);
  1248. }
  1249. static void d68020_cpbcc_32(void)
  1250. {
  1251. uint extension;
  1252. uint new_pc = g_cpu_pc;
  1253. LIMIT_CPU_TYPES(M68020_PLUS);
  1254. extension = read_imm_16();
  1255. new_pc += read_imm_32();
  1256. 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);
  1257. }
  1258. static void d68020_cpdbcc(void)
  1259. {
  1260. uint extension1;
  1261. uint extension2;
  1262. uint new_pc = g_cpu_pc;
  1263. LIMIT_CPU_TYPES(M68020_PLUS);
  1264. extension1 = read_imm_16();
  1265. extension2 = read_imm_16();
  1266. new_pc += make_int_16(read_imm_16());
  1267. 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);
  1268. }
  1269. static void d68020_cpgen(void)
  1270. {
  1271. LIMIT_CPU_TYPES(M68020_PLUS);
  1272. sprintf(g_dasm_str, "%dgen %s; (2-3)", (g_cpu_ir>>9)&7, get_imm_str_u32());
  1273. }
  1274. static void d68020_cprestore(void)
  1275. {
  1276. LIMIT_CPU_TYPES(M68020_PLUS);
  1277. sprintf(g_dasm_str, "%drestore %s; (2-3)", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));
  1278. }
  1279. static void d68020_cpsave(void)
  1280. {
  1281. LIMIT_CPU_TYPES(M68020_PLUS);
  1282. sprintf(g_dasm_str, "%dsave %s; (2-3)", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));
  1283. }
  1284. static void d68020_cpscc(void)
  1285. {
  1286. uint extension1;
  1287. uint extension2;
  1288. LIMIT_CPU_TYPES(M68020_PLUS);
  1289. extension1 = read_imm_16();
  1290. extension2 = read_imm_16();
  1291. 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);
  1292. }
  1293. static void d68020_cptrapcc_0(void)
  1294. {
  1295. uint extension1;
  1296. uint extension2;
  1297. LIMIT_CPU_TYPES(M68020_PLUS);
  1298. extension1 = read_imm_16();
  1299. extension2 = read_imm_16();
  1300. sprintf(g_dasm_str, "%dtrap%-4s; (extension = %x) (2-3)", (g_cpu_ir>>9)&7, g_cpcc[extension1&0x3f], extension2);
  1301. }
  1302. static void d68020_cptrapcc_16(void)
  1303. {
  1304. uint extension1;
  1305. uint extension2;
  1306. LIMIT_CPU_TYPES(M68020_PLUS);
  1307. extension1 = read_imm_16();
  1308. extension2 = read_imm_16();
  1309. 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);
  1310. }
  1311. static void d68020_cptrapcc_32(void)
  1312. {
  1313. uint extension1;
  1314. uint extension2;
  1315. LIMIT_CPU_TYPES(M68020_PLUS);
  1316. extension1 = read_imm_16();
  1317. extension2 = read_imm_16();
  1318. 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);
  1319. }
  1320. static void d68040_cpush(void)
  1321. {
  1322. LIMIT_CPU_TYPES(M68040_PLUS);
  1323. switch((g_cpu_ir>>3)&3)
  1324. {
  1325. case 0:
  1326. sprintf(g_dasm_str, "cpush (illegal scope); (4)");
  1327. break;
  1328. case 1:
  1329. sprintf(g_dasm_str, "cpushl %d, (A%d); (4)", (g_cpu_ir>>6)&3, g_cpu_ir&7);
  1330. break;
  1331. case 2:
  1332. sprintf(g_dasm_str, "cpushp %d, (A%d); (4)", (g_cpu_ir>>6)&3, g_cpu_ir&7);
  1333. break;
  1334. case 3:
  1335. sprintf(g_dasm_str, "cpusha %d; (4)", (g_cpu_ir>>6)&3);
  1336. break;
  1337. }
  1338. }
  1339. static void d68000_dbra(void)
  1340. {
  1341. uint temp_pc = g_cpu_pc;
  1342. sprintf(g_dasm_str, "dbra D%d, $%x", g_cpu_ir & 7, temp_pc + make_int_16(read_imm_16()));
  1343. SET_OPCODE_FLAGS(DASMFLAG_STEP_OVER);
  1344. }
  1345. static void d68000_dbcc(void)
  1346. {
  1347. uint temp_pc = g_cpu_pc;
  1348. 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()));
  1349. SET_OPCODE_FLAGS(DASMFLAG_STEP_OVER);
  1350. }
  1351. static void d68000_divs(void)
  1352. {
  1353. sprintf(g_dasm_str, "divs.w %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);
  1354. }
  1355. static void d68000_divu(void)
  1356. {
  1357. sprintf(g_dasm_str, "divu.w %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);
  1358. }
  1359. static void d68020_divl(void)
  1360. {
  1361. uint extension;
  1362. LIMIT_CPU_TYPES(M68020_PLUS);
  1363. extension = read_imm_16();
  1364. if(BIT_A(extension))
  1365. 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);
  1366. else if((extension&7) == ((extension>>12)&7))
  1367. 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);
  1368. else
  1369. 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);
  1370. }
  1371. static void d68000_eor_8(void)
  1372. {
  1373. sprintf(g_dasm_str, "eor.b D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));
  1374. }
  1375. static void d68000_eor_16(void)
  1376. {
  1377. sprintf(g_dasm_str, "eor.w D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_16(g_cpu_ir));
  1378. }
  1379. static void d68000_eor_32(void)
  1380. {
  1381. sprintf(g_dasm_str, "eor.l D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_32(g_cpu_ir));
  1382. }
  1383. static void d68000_eori_8(void)
  1384. {
  1385. char* str = get_imm_str_u8();
  1386. sprintf(g_dasm_str, "eori.b %s, %s", str, get_ea_mode_str_8(g_cpu_ir));
  1387. }
  1388. static void d68000_eori_16(void)
  1389. {
  1390. char* str = get_imm_str_u16();
  1391. sprintf(g_dasm_str, "eori.w %s, %s", str, get_ea_mode_str_16(g_cpu_ir));
  1392. }
  1393. static void d68000_eori_32(void)
  1394. {
  1395. char* str = get_imm_str_u32();
  1396. sprintf(g_dasm_str, "eori.l %s, %s", str, get_ea_mode_str_32(g_cpu_ir));
  1397. }
  1398. static void d68000_eori_to_ccr(void)
  1399. {
  1400. sprintf(g_dasm_str, "eori %s, CCR", get_imm_str_u8());
  1401. }
  1402. static void d68000_eori_to_sr(void)
  1403. {
  1404. sprintf(g_dasm_str, "eori %s, SR", get_imm_str_u16());
  1405. }
  1406. static void d68000_exg_dd(void)
  1407. {
  1408. sprintf(g_dasm_str, "exg D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  1409. }
  1410. static void d68000_exg_aa(void)
  1411. {
  1412. sprintf(g_dasm_str, "exg A%d, A%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  1413. }
  1414. static void d68000_exg_da(void)
  1415. {
  1416. sprintf(g_dasm_str, "exg D%d, A%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  1417. }
  1418. static void d68000_ext_16(void)
  1419. {
  1420. sprintf(g_dasm_str, "ext.w D%d", g_cpu_ir&7);
  1421. }
  1422. static void d68000_ext_32(void)
  1423. {
  1424. sprintf(g_dasm_str, "ext.l D%d", g_cpu_ir&7);
  1425. }
  1426. static void d68020_extb_32(void)
  1427. {
  1428. LIMIT_CPU_TYPES(M68020_PLUS);
  1429. sprintf(g_dasm_str, "extb.l D%d; (2+)", g_cpu_ir&7);
  1430. }
  1431. static void d68040_fpu(void)
  1432. {
  1433. char float_data_format[8][3] =
  1434. {
  1435. ".l", ".s", ".x", ".p", ".w", ".d", ".b", ".?"
  1436. };
  1437. char mnemonic[40];
  1438. uint w2, src, dst_reg;
  1439. LIMIT_CPU_TYPES(M68040_PLUS);
  1440. w2 = read_imm_16();
  1441. src = (w2 >> 10) & 0x7;
  1442. dst_reg = (w2 >> 7) & 0x7;
  1443. switch ((w2 >> 13) & 0x7)
  1444. {
  1445. case 0x0:
  1446. case 0x2:
  1447. {
  1448. switch(w2 & 0x7f)
  1449. {
  1450. case 0x00: sprintf(mnemonic, "fmove"); break;
  1451. case 0x01: sprintf(mnemonic, "fint"); break;
  1452. case 0x02: sprintf(mnemonic, "fsinh"); break;
  1453. case 0x03: sprintf(mnemonic, "fintrz"); break;
  1454. case 0x04: sprintf(mnemonic, "fsqrt"); break;
  1455. case 0x06: sprintf(mnemonic, "flognp1"); break;
  1456. case 0x08: sprintf(mnemonic, "fetoxm1"); break;
  1457. case 0x09: sprintf(mnemonic, "ftanh1"); break;
  1458. case 0x0a: sprintf(mnemonic, "fatan"); break;
  1459. case 0x0c: sprintf(mnemonic, "fasin"); break;
  1460. case 0x0d: sprintf(mnemonic, "fatanh"); break;
  1461. case 0x0e: sprintf(mnemonic, "fsin"); break;
  1462. case 0x0f: sprintf(mnemonic, "ftan"); break;
  1463. case 0x10: sprintf(mnemonic, "fetox"); break;
  1464. case 0x11: sprintf(mnemonic, "ftwotox"); break;
  1465. case 0x12: sprintf(mnemonic, "ftentox"); break;
  1466. case 0x14: sprintf(mnemonic, "flogn"); break;
  1467. case 0x15: sprintf(mnemonic, "flog10"); break;
  1468. case 0x16: sprintf(mnemonic, "flog2"); break;
  1469. case 0x18: sprintf(mnemonic, "fabs"); break;
  1470. case 0x19: sprintf(mnemonic, "fcosh"); break;
  1471. case 0x1a: sprintf(mnemonic, "fneg"); break;
  1472. case 0x1c: sprintf(mnemonic, "facos"); break;
  1473. case 0x1d: sprintf(mnemonic, "fcos"); break;
  1474. case 0x1e: sprintf(mnemonic, "fgetexp"); break;
  1475. case 0x1f: sprintf(mnemonic, "fgetman"); break;
  1476. case 0x20: sprintf(mnemonic, "fdiv"); break;
  1477. case 0x21: sprintf(mnemonic, "fmod"); break;
  1478. case 0x22: sprintf(mnemonic, "fadd"); break;
  1479. case 0x23: sprintf(mnemonic, "fmul"); break;
  1480. case 0x24: sprintf(mnemonic, "fsgldiv"); break;
  1481. case 0x25: sprintf(mnemonic, "frem"); break;
  1482. case 0x26: sprintf(mnemonic, "fscale"); break;
  1483. case 0x27: sprintf(mnemonic, "fsglmul"); break;
  1484. case 0x28: sprintf(mnemonic, "fsub"); break;
  1485. case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37:
  1486. sprintf(mnemonic, "fsincos"); break;
  1487. case 0x38: sprintf(mnemonic, "fcmp"); break;
  1488. case 0x3a: sprintf(mnemonic, "ftst"); break;
  1489. case 0x41: sprintf(mnemonic, "fssqrt"); break;
  1490. case 0x45: sprintf(mnemonic, "fdsqrt"); break;
  1491. case 0x58: sprintf(mnemonic, "fsabs"); break;
  1492. case 0x5a: sprintf(mnemonic, "fsneg"); break;
  1493. case 0x5c: sprintf(mnemonic, "fdabs"); break;
  1494. case 0x5e: sprintf(mnemonic, "fdneg"); break;
  1495. case 0x60: sprintf(mnemonic, "fsdiv"); break;
  1496. case 0x62: sprintf(mnemonic, "fsadd"); break;
  1497. case 0x63: sprintf(mnemonic, "fsmul"); break;
  1498. case 0x64: sprintf(mnemonic, "fddiv"); break;
  1499. case 0x66: sprintf(mnemonic, "fdadd"); break;
  1500. case 0x67: sprintf(mnemonic, "fdmul"); break;
  1501. case 0x68: sprintf(mnemonic, "fssub"); break;
  1502. case 0x6c: sprintf(mnemonic, "fdsub"); break;
  1503. default: sprintf(mnemonic, "FPU (?)"); break;
  1504. }
  1505. if (w2 & 0x4000)
  1506. {
  1507. sprintf(g_dasm_str, "%s%s %s, FP%d", mnemonic, float_data_format[src], get_ea_mode_str_32(g_cpu_ir), dst_reg);
  1508. }
  1509. else
  1510. {
  1511. sprintf(g_dasm_str, "%s.x FP%d, FP%d", mnemonic, src, dst_reg);
  1512. }
  1513. break;
  1514. }
  1515. case 0x3:
  1516. {
  1517. sprintf(g_dasm_str, "fmove /todo");
  1518. break;
  1519. }
  1520. case 0x4:
  1521. case 0x5:
  1522. {
  1523. sprintf(g_dasm_str, "fmove /todo");
  1524. break;
  1525. }
  1526. case 0x6:
  1527. case 0x7:
  1528. {
  1529. sprintf(g_dasm_str, "fmovem /todo");
  1530. break;
  1531. }
  1532. default:
  1533. {
  1534. sprintf(g_dasm_str, "FPU (?) ");
  1535. break;
  1536. }
  1537. }
  1538. }
  1539. static void d68000_jmp(void)
  1540. {
  1541. sprintf(g_dasm_str, "jmp %s", get_ea_mode_str_32(g_cpu_ir));
  1542. }
  1543. static void d68000_jsr(void)
  1544. {
  1545. sprintf(g_dasm_str, "jsr %s", get_ea_mode_str_32(g_cpu_ir));
  1546. SET_OPCODE_FLAGS(DASMFLAG_STEP_OVER);
  1547. }
  1548. static void d68000_lea(void)
  1549. {
  1550. sprintf(g_dasm_str, "lea %s, A%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);
  1551. }
  1552. static void d68000_link_16(void)
  1553. {
  1554. sprintf(g_dasm_str, "link A%d, %s", g_cpu_ir&7, get_imm_str_s16());
  1555. }
  1556. static void d68020_link_32(void)
  1557. {
  1558. LIMIT_CPU_TYPES(M68020_PLUS);
  1559. sprintf(g_dasm_str, "link A%d, %s; (2+)", g_cpu_ir&7, get_imm_str_s32());
  1560. }
  1561. static void d68000_lsr_s_8(void)
  1562. {
  1563. sprintf(g_dasm_str, "lsr.b #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  1564. }
  1565. static void d68000_lsr_s_16(void)
  1566. {
  1567. sprintf(g_dasm_str, "lsr.w #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  1568. }
  1569. static void d68000_lsr_s_32(void)
  1570. {
  1571. sprintf(g_dasm_str, "lsr.l #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  1572. }
  1573. static void d68000_lsr_r_8(void)
  1574. {
  1575. sprintf(g_dasm_str, "lsr.b D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  1576. }
  1577. static void d68000_lsr_r_16(void)
  1578. {
  1579. sprintf(g_dasm_str, "lsr.w D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  1580. }
  1581. static void d68000_lsr_r_32(void)
  1582. {
  1583. sprintf(g_dasm_str, "lsr.l D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  1584. }
  1585. static void d68000_lsr_ea(void)
  1586. {
  1587. sprintf(g_dasm_str, "lsr.w %s", get_ea_mode_str_32(g_cpu_ir));
  1588. }
  1589. static void d68000_lsl_s_8(void)
  1590. {
  1591. sprintf(g_dasm_str, "lsl.b #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  1592. }
  1593. static void d68000_lsl_s_16(void)
  1594. {
  1595. sprintf(g_dasm_str, "lsl.w #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  1596. }
  1597. static void d68000_lsl_s_32(void)
  1598. {
  1599. sprintf(g_dasm_str, "lsl.l #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  1600. }
  1601. static void d68000_lsl_r_8(void)
  1602. {
  1603. sprintf(g_dasm_str, "lsl.b D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  1604. }
  1605. static void d68000_lsl_r_16(void)
  1606. {
  1607. sprintf(g_dasm_str, "lsl.w D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  1608. }
  1609. static void d68000_lsl_r_32(void)
  1610. {
  1611. sprintf(g_dasm_str, "lsl.l D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  1612. }
  1613. static void d68000_lsl_ea(void)
  1614. {
  1615. sprintf(g_dasm_str, "lsl.w %s", get_ea_mode_str_32(g_cpu_ir));
  1616. }
  1617. static void d68000_move_8(void)
  1618. {
  1619. char* str = get_ea_mode_str_8(g_cpu_ir);
  1620. sprintf(g_dasm_str, "move.b %s, %s", str, get_ea_mode_str_8(((g_cpu_ir>>9) & 7) | ((g_cpu_ir>>3) & 0x38)));
  1621. }
  1622. static void d68000_move_16(void)
  1623. {
  1624. char* str = get_ea_mode_str_16(g_cpu_ir);
  1625. sprintf(g_dasm_str, "move.w %s, %s", str, get_ea_mode_str_16(((g_cpu_ir>>9) & 7) | ((g_cpu_ir>>3) & 0x38)));
  1626. }
  1627. static void d68000_move_32(void)
  1628. {
  1629. char* str = get_ea_mode_str_32(g_cpu_ir);
  1630. sprintf(g_dasm_str, "move.l %s, %s", str, get_ea_mode_str_32(((g_cpu_ir>>9) & 7) | ((g_cpu_ir>>3) & 0x38)));
  1631. }
  1632. static void d68000_movea_16(void)
  1633. {
  1634. sprintf(g_dasm_str, "movea.w %s, A%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);
  1635. }
  1636. static void d68000_movea_32(void)
  1637. {
  1638. sprintf(g_dasm_str, "movea.l %s, A%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);
  1639. }
  1640. static void d68000_move_to_ccr(void)
  1641. {
  1642. sprintf(g_dasm_str, "move %s, CCR", get_ea_mode_str_8(g_cpu_ir));
  1643. }
  1644. static void d68010_move_fr_ccr(void)
  1645. {
  1646. LIMIT_CPU_TYPES(M68010_PLUS);
  1647. sprintf(g_dasm_str, "move CCR, %s; (1+)", get_ea_mode_str_8(g_cpu_ir));
  1648. }
  1649. static void d68000_move_fr_sr(void)
  1650. {
  1651. sprintf(g_dasm_str, "move SR, %s", get_ea_mode_str_16(g_cpu_ir));
  1652. }
  1653. static void d68000_move_to_sr(void)
  1654. {
  1655. sprintf(g_dasm_str, "move %s, SR", get_ea_mode_str_16(g_cpu_ir));
  1656. }
  1657. static void d68000_move_fr_usp(void)
  1658. {
  1659. sprintf(g_dasm_str, "move USP, A%d", g_cpu_ir&7);
  1660. }
  1661. static void d68000_move_to_usp(void)
  1662. {
  1663. sprintf(g_dasm_str, "move A%d, USP", g_cpu_ir&7);
  1664. }
  1665. static void d68010_movec(void)
  1666. {
  1667. uint extension;
  1668. const char* reg_name;
  1669. const char* processor;
  1670. LIMIT_CPU_TYPES(M68010_PLUS);
  1671. extension = read_imm_16();
  1672. switch(extension & 0xfff)
  1673. {
  1674. case 0x000:
  1675. reg_name = "SFC";
  1676. processor = "1+";
  1677. break;
  1678. case 0x001:
  1679. reg_name = "DFC";
  1680. processor = "1+";
  1681. break;
  1682. case 0x800:
  1683. reg_name = "USP";
  1684. processor = "1+";
  1685. break;
  1686. case 0x801:
  1687. reg_name = "VBR";
  1688. processor = "1+";
  1689. break;
  1690. case 0x002:
  1691. reg_name = "CACR";
  1692. processor = "2+";
  1693. break;
  1694. case 0x802:
  1695. reg_name = "CAAR";
  1696. processor = "2,3";
  1697. break;
  1698. case 0x803:
  1699. reg_name = "MSP";
  1700. processor = "2+";
  1701. break;
  1702. case 0x804:
  1703. reg_name = "ISP";
  1704. processor = "2+";
  1705. break;
  1706. case 0x003:
  1707. reg_name = "TC";
  1708. processor = "4+";
  1709. break;
  1710. case 0x004:
  1711. reg_name = "ITT0";
  1712. processor = "4+";
  1713. break;
  1714. case 0x005:
  1715. reg_name = "ITT1";
  1716. processor = "4+";
  1717. break;
  1718. case 0x006:
  1719. reg_name = "DTT0";
  1720. processor = "4+";
  1721. break;
  1722. case 0x007:
  1723. reg_name = "DTT1";
  1724. processor = "4+";
  1725. break;
  1726. case 0x805:
  1727. reg_name = "MMUSR";
  1728. processor = "4+";
  1729. break;
  1730. case 0x806:
  1731. reg_name = "URP";
  1732. processor = "4+";
  1733. break;
  1734. case 0x807:
  1735. reg_name = "SRP";
  1736. processor = "4+";
  1737. break;
  1738. default:
  1739. reg_name = make_signed_hex_str_16(extension & 0xfff);
  1740. processor = "?";
  1741. }
  1742. if(BIT_0(g_cpu_ir))
  1743. sprintf(g_dasm_str, "movec %c%d, %s; (%s)", BIT_F(extension) ? 'A' : 'D', (extension>>12)&7, reg_name, processor);
  1744. else
  1745. sprintf(g_dasm_str, "movec %s, %c%d; (%s)", reg_name, BIT_F(extension) ? 'A' : 'D', (extension>>12)&7, processor);
  1746. }
  1747. static void d68000_movem_pd_16(void)
  1748. {
  1749. uint data = read_imm_16();
  1750. char buffer[40];
  1751. uint first;
  1752. uint run_length;
  1753. uint i;
  1754. buffer[0] = 0;
  1755. for(i=0;i<8;i++)
  1756. {
  1757. if(data&(1<<(15-i)))
  1758. {
  1759. first = i;
  1760. run_length = 0;
  1761. while(i<7 && (data&(1<<(15-(i+1)))))
  1762. {
  1763. i++;
  1764. run_length++;
  1765. }
  1766. if(buffer[0] != 0)
  1767. strcat(buffer, "/");
  1768. sprintf(buffer+strlen(buffer), "D%d", first);
  1769. if(run_length > 0)
  1770. sprintf(buffer+strlen(buffer), "-D%d", first + run_length);
  1771. }
  1772. }
  1773. for(i=0;i<8;i++)
  1774. {
  1775. if(data&(1<<(7-i)))
  1776. {
  1777. first = i;
  1778. run_length = 0;
  1779. while(i<7 && (data&(1<<(7-(i+1)))))
  1780. {
  1781. i++;
  1782. run_length++;
  1783. }
  1784. if(buffer[0] != 0)
  1785. strcat(buffer, "/");
  1786. sprintf(buffer+strlen(buffer), "A%d", first);
  1787. if(run_length > 0)
  1788. sprintf(buffer+strlen(buffer), "-A%d", first + run_length);
  1789. }
  1790. }
  1791. sprintf(g_dasm_str, "movem.w %s, %s", buffer, get_ea_mode_str_16(g_cpu_ir));
  1792. }
  1793. static void d68000_movem_pd_32(void)
  1794. {
  1795. uint data = read_imm_16();
  1796. char buffer[40];
  1797. uint first;
  1798. uint run_length;
  1799. uint i;
  1800. buffer[0] = 0;
  1801. for(i=0;i<8;i++)
  1802. {
  1803. if(data&(1<<(15-i)))
  1804. {
  1805. first = i;
  1806. run_length = 0;
  1807. while(i<7 && (data&(1<<(15-(i+1)))))
  1808. {
  1809. i++;
  1810. run_length++;
  1811. }
  1812. if(buffer[0] != 0)
  1813. strcat(buffer, "/");
  1814. sprintf(buffer+strlen(buffer), "D%d", first);
  1815. if(run_length > 0)
  1816. sprintf(buffer+strlen(buffer), "-D%d", first + run_length);
  1817. }
  1818. }
  1819. for(i=0;i<8;i++)
  1820. {
  1821. if(data&(1<<(7-i)))
  1822. {
  1823. first = i;
  1824. run_length = 0;
  1825. while(i<7 && (data&(1<<(7-(i+1)))))
  1826. {
  1827. i++;
  1828. run_length++;
  1829. }
  1830. if(buffer[0] != 0)
  1831. strcat(buffer, "/");
  1832. sprintf(buffer+strlen(buffer), "A%d", first);
  1833. if(run_length > 0)
  1834. sprintf(buffer+strlen(buffer), "-A%d", first + run_length);
  1835. }
  1836. }
  1837. sprintf(g_dasm_str, "movem.l %s, %s", buffer, get_ea_mode_str_32(g_cpu_ir));
  1838. }
  1839. static void d68000_movem_er_16(void)
  1840. {
  1841. uint data = read_imm_16();
  1842. char buffer[40];
  1843. uint first;
  1844. uint run_length;
  1845. uint i;
  1846. buffer[0] = 0;
  1847. for(i=0;i<8;i++)
  1848. {
  1849. if(data&(1<<i))
  1850. {
  1851. first = i;
  1852. run_length = 0;
  1853. while(i<7 && (data&(1<<(i+1))))
  1854. {
  1855. i++;
  1856. run_length++;
  1857. }
  1858. if(buffer[0] != 0)
  1859. strcat(buffer, "/");
  1860. sprintf(buffer+strlen(buffer), "D%d", first);
  1861. if(run_length > 0)
  1862. sprintf(buffer+strlen(buffer), "-D%d", first + run_length);
  1863. }
  1864. }
  1865. for(i=0;i<8;i++)
  1866. {
  1867. if(data&(1<<(i+8)))
  1868. {
  1869. first = i;
  1870. run_length = 0;
  1871. while(i<7 && (data&(1<<(i+8+1))))
  1872. {
  1873. i++;
  1874. run_length++;
  1875. }
  1876. if(buffer[0] != 0)
  1877. strcat(buffer, "/");
  1878. sprintf(buffer+strlen(buffer), "A%d", first);
  1879. if(run_length > 0)
  1880. sprintf(buffer+strlen(buffer), "-A%d", first + run_length);
  1881. }
  1882. }
  1883. sprintf(g_dasm_str, "movem.w %s, %s", get_ea_mode_str_16(g_cpu_ir), buffer);
  1884. }
  1885. static void d68000_movem_er_32(void)
  1886. {
  1887. uint data = read_imm_16();
  1888. char buffer[40];
  1889. uint first;
  1890. uint run_length;
  1891. uint i;
  1892. buffer[0] = 0;
  1893. for(i=0;i<8;i++)
  1894. {
  1895. if(data&(1<<i))
  1896. {
  1897. first = i;
  1898. run_length = 0;
  1899. while(i<7 && (data&(1<<(i+1))))
  1900. {
  1901. i++;
  1902. run_length++;
  1903. }
  1904. if(buffer[0] != 0)
  1905. strcat(buffer, "/");
  1906. sprintf(buffer+strlen(buffer), "D%d", first);
  1907. if(run_length > 0)
  1908. sprintf(buffer+strlen(buffer), "-D%d", first + run_length);
  1909. }
  1910. }
  1911. for(i=0;i<8;i++)
  1912. {
  1913. if(data&(1<<(i+8)))
  1914. {
  1915. first = i;
  1916. run_length = 0;
  1917. while(i<7 && (data&(1<<(i+8+1))))
  1918. {
  1919. i++;
  1920. run_length++;
  1921. }
  1922. if(buffer[0] != 0)
  1923. strcat(buffer, "/");
  1924. sprintf(buffer+strlen(buffer), "A%d", first);
  1925. if(run_length > 0)
  1926. sprintf(buffer+strlen(buffer), "-A%d", first + run_length);
  1927. }
  1928. }
  1929. sprintf(g_dasm_str, "movem.l %s, %s", get_ea_mode_str_32(g_cpu_ir), buffer);
  1930. }
  1931. static void d68000_movem_re_16(void)
  1932. {
  1933. uint data = read_imm_16();
  1934. char buffer[40];
  1935. uint first;
  1936. uint run_length;
  1937. uint i;
  1938. buffer[0] = 0;
  1939. for(i=0;i<8;i++)
  1940. {
  1941. if(data&(1<<i))
  1942. {
  1943. first = i;
  1944. run_length = 0;
  1945. while(i<7 && (data&(1<<(i+1))))
  1946. {
  1947. i++;
  1948. run_length++;
  1949. }
  1950. if(buffer[0] != 0)
  1951. strcat(buffer, "/");
  1952. sprintf(buffer+strlen(buffer), "D%d", first);
  1953. if(run_length > 0)
  1954. sprintf(buffer+strlen(buffer), "-D%d", first + run_length);
  1955. }
  1956. }
  1957. for(i=0;i<8;i++)
  1958. {
  1959. if(data&(1<<(i+8)))
  1960. {
  1961. first = i;
  1962. run_length = 0;
  1963. while(i<7 && (data&(1<<(i+8+1))))
  1964. {
  1965. i++;
  1966. run_length++;
  1967. }
  1968. if(buffer[0] != 0)
  1969. strcat(buffer, "/");
  1970. sprintf(buffer+strlen(buffer), "A%d", first);
  1971. if(run_length > 0)
  1972. sprintf(buffer+strlen(buffer), "-A%d", first + run_length);
  1973. }
  1974. }
  1975. sprintf(g_dasm_str, "movem.w %s, %s", buffer, get_ea_mode_str_16(g_cpu_ir));
  1976. }
  1977. static void d68000_movem_re_32(void)
  1978. {
  1979. uint data = read_imm_16();
  1980. char buffer[40];
  1981. uint first;
  1982. uint run_length;
  1983. uint i;
  1984. buffer[0] = 0;
  1985. for(i=0;i<8;i++)
  1986. {
  1987. if(data&(1<<i))
  1988. {
  1989. first = i;
  1990. run_length = 0;
  1991. while(i<7 && (data&(1<<(i+1))))
  1992. {
  1993. i++;
  1994. run_length++;
  1995. }
  1996. if(buffer[0] != 0)
  1997. strcat(buffer, "/");
  1998. sprintf(buffer+strlen(buffer), "D%d", first);
  1999. if(run_length > 0)
  2000. sprintf(buffer+strlen(buffer), "-D%d", first + run_length);
  2001. }
  2002. }
  2003. for(i=0;i<8;i++)
  2004. {
  2005. if(data&(1<<(i+8)))
  2006. {
  2007. first = i;
  2008. run_length = 0;
  2009. while(i<7 && (data&(1<<(i+8+1))))
  2010. {
  2011. i++;
  2012. run_length++;
  2013. }
  2014. if(buffer[0] != 0)
  2015. strcat(buffer, "/");
  2016. sprintf(buffer+strlen(buffer), "A%d", first);
  2017. if(run_length > 0)
  2018. sprintf(buffer+strlen(buffer), "-A%d", first + run_length);
  2019. }
  2020. }
  2021. sprintf(g_dasm_str, "movem.l %s, %s", buffer, get_ea_mode_str_32(g_cpu_ir));
  2022. }
  2023. static void d68000_movep_re_16(void)
  2024. {
  2025. sprintf(g_dasm_str, "movep.w D%d, ($%x,A%d)", (g_cpu_ir>>9)&7, read_imm_16(), g_cpu_ir&7);
  2026. }
  2027. static void d68000_movep_re_32(void)
  2028. {
  2029. sprintf(g_dasm_str, "movep.l D%d, ($%x,A%d)", (g_cpu_ir>>9)&7, read_imm_16(), g_cpu_ir&7);
  2030. }
  2031. static void d68000_movep_er_16(void)
  2032. {
  2033. sprintf(g_dasm_str, "movep.w ($%x,A%d), D%d", read_imm_16(), g_cpu_ir&7, (g_cpu_ir>>9)&7);
  2034. }
  2035. static void d68000_movep_er_32(void)
  2036. {
  2037. sprintf(g_dasm_str, "movep.l ($%x,A%d), D%d", read_imm_16(), g_cpu_ir&7, (g_cpu_ir>>9)&7);
  2038. }
  2039. static void d68010_moves_8(void)
  2040. {
  2041. uint extension;
  2042. LIMIT_CPU_TYPES(M68010_PLUS);
  2043. extension = read_imm_16();
  2044. if(BIT_B(extension))
  2045. 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));
  2046. else
  2047. 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);
  2048. }
  2049. static void d68010_moves_16(void)
  2050. {
  2051. uint extension;
  2052. LIMIT_CPU_TYPES(M68010_PLUS);
  2053. extension = read_imm_16();
  2054. if(BIT_B(extension))
  2055. sprintf(g_dasm_str, "moves.w %c%d, %s; (1+)", BIT_F(extension) ? 'A' : 'D', (extension>>12)&7, get_ea_mode_str_16(g_cpu_ir));
  2056. else
  2057. sprintf(g_dasm_str, "moves.w %s, %c%d; (1+)", get_ea_mode_str_16(g_cpu_ir), BIT_F(extension) ? 'A' : 'D', (extension>>12)&7);
  2058. }
  2059. static void d68010_moves_32(void)
  2060. {
  2061. uint extension;
  2062. LIMIT_CPU_TYPES(M68010_PLUS);
  2063. extension = read_imm_16();
  2064. if(BIT_B(extension))
  2065. sprintf(g_dasm_str, "moves.l %c%d, %s; (1+)", BIT_F(extension) ? 'A' : 'D', (extension>>12)&7, get_ea_mode_str_32(g_cpu_ir));
  2066. else
  2067. sprintf(g_dasm_str, "moves.l %s, %c%d; (1+)", get_ea_mode_str_32(g_cpu_ir), BIT_F(extension) ? 'A' : 'D', (extension>>12)&7);
  2068. }
  2069. static void d68000_moveq(void)
  2070. {
  2071. sprintf(g_dasm_str, "moveq #%s, D%d", make_signed_hex_str_8(g_cpu_ir), (g_cpu_ir>>9)&7);
  2072. }
  2073. static void d68040_move16_pi_pi(void)
  2074. {
  2075. LIMIT_CPU_TYPES(M68040_PLUS);
  2076. sprintf(g_dasm_str, "move16 (A%d)+, (A%d)+; (4)", g_cpu_ir&7, (read_imm_16()>>12)&7);
  2077. }
  2078. static void d68040_move16_pi_al(void)
  2079. {
  2080. LIMIT_CPU_TYPES(M68040_PLUS);
  2081. sprintf(g_dasm_str, "move16 (A%d)+, %s; (4)", g_cpu_ir&7, get_imm_str_u32());
  2082. }
  2083. static void d68040_move16_al_pi(void)
  2084. {
  2085. LIMIT_CPU_TYPES(M68040_PLUS);
  2086. sprintf(g_dasm_str, "move16 %s, (A%d)+; (4)", get_imm_str_u32(), g_cpu_ir&7);
  2087. }
  2088. static void d68040_move16_ai_al(void)
  2089. {
  2090. LIMIT_CPU_TYPES(M68040_PLUS);
  2091. sprintf(g_dasm_str, "move16 (A%d), %s; (4)", g_cpu_ir&7, get_imm_str_u32());
  2092. }
  2093. static void d68040_move16_al_ai(void)
  2094. {
  2095. LIMIT_CPU_TYPES(M68040_PLUS);
  2096. sprintf(g_dasm_str, "move16 %s, (A%d); (4)", get_imm_str_u32(), g_cpu_ir&7);
  2097. }
  2098. static void d68000_muls(void)
  2099. {
  2100. sprintf(g_dasm_str, "muls.w %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);
  2101. }
  2102. static void d68000_mulu(void)
  2103. {
  2104. sprintf(g_dasm_str, "mulu.w %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);
  2105. }
  2106. static void d68020_mull(void)
  2107. {
  2108. uint extension;
  2109. LIMIT_CPU_TYPES(M68020_PLUS);
  2110. extension = read_imm_16();
  2111. if(BIT_A(extension))
  2112. 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);
  2113. else
  2114. 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);
  2115. }
  2116. static void d68000_nbcd(void)
  2117. {
  2118. sprintf(g_dasm_str, "nbcd %s", get_ea_mode_str_8(g_cpu_ir));
  2119. }
  2120. static void d68000_neg_8(void)
  2121. {
  2122. sprintf(g_dasm_str, "neg.b %s", get_ea_mode_str_8(g_cpu_ir));
  2123. }
  2124. static void d68000_neg_16(void)
  2125. {
  2126. sprintf(g_dasm_str, "neg.w %s", get_ea_mode_str_16(g_cpu_ir));
  2127. }
  2128. static void d68000_neg_32(void)
  2129. {
  2130. sprintf(g_dasm_str, "neg.l %s", get_ea_mode_str_32(g_cpu_ir));
  2131. }
  2132. static void d68000_negx_8(void)
  2133. {
  2134. sprintf(g_dasm_str, "negx.b %s", get_ea_mode_str_8(g_cpu_ir));
  2135. }
  2136. static void d68000_negx_16(void)
  2137. {
  2138. sprintf(g_dasm_str, "negx.w %s", get_ea_mode_str_16(g_cpu_ir));
  2139. }
  2140. static void d68000_negx_32(void)
  2141. {
  2142. sprintf(g_dasm_str, "negx.l %s", get_ea_mode_str_32(g_cpu_ir));
  2143. }
  2144. static void d68000_nop(void)
  2145. {
  2146. sprintf(g_dasm_str, "nop");
  2147. }
  2148. static void d68000_not_8(void)
  2149. {
  2150. sprintf(g_dasm_str, "not.b %s", get_ea_mode_str_8(g_cpu_ir));
  2151. }
  2152. static void d68000_not_16(void)
  2153. {
  2154. sprintf(g_dasm_str, "not.w %s", get_ea_mode_str_16(g_cpu_ir));
  2155. }
  2156. static void d68000_not_32(void)
  2157. {
  2158. sprintf(g_dasm_str, "not.l %s", get_ea_mode_str_32(g_cpu_ir));
  2159. }
  2160. static void d68000_or_er_8(void)
  2161. {
  2162. sprintf(g_dasm_str, "or.b %s, D%d", get_ea_mode_str_8(g_cpu_ir), (g_cpu_ir>>9)&7);
  2163. }
  2164. static void d68000_or_er_16(void)
  2165. {
  2166. sprintf(g_dasm_str, "or.w %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);
  2167. }
  2168. static void d68000_or_er_32(void)
  2169. {
  2170. sprintf(g_dasm_str, "or.l %s, D%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);
  2171. }
  2172. static void d68000_or_re_8(void)
  2173. {
  2174. sprintf(g_dasm_str, "or.b D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));
  2175. }
  2176. static void d68000_or_re_16(void)
  2177. {
  2178. sprintf(g_dasm_str, "or.w D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_16(g_cpu_ir));
  2179. }
  2180. static void d68000_or_re_32(void)
  2181. {
  2182. sprintf(g_dasm_str, "or.l D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_32(g_cpu_ir));
  2183. }
  2184. static void d68000_ori_8(void)
  2185. {
  2186. char* str = get_imm_str_u8();
  2187. sprintf(g_dasm_str, "ori.b %s, %s", str, get_ea_mode_str_8(g_cpu_ir));
  2188. }
  2189. static void d68000_ori_16(void)
  2190. {
  2191. char* str = get_imm_str_u16();
  2192. sprintf(g_dasm_str, "ori.w %s, %s", str, get_ea_mode_str_16(g_cpu_ir));
  2193. }
  2194. static void d68000_ori_32(void)
  2195. {
  2196. char* str = get_imm_str_u32();
  2197. sprintf(g_dasm_str, "ori.l %s, %s", str, get_ea_mode_str_32(g_cpu_ir));
  2198. }
  2199. static void d68000_ori_to_ccr(void)
  2200. {
  2201. sprintf(g_dasm_str, "ori %s, CCR", get_imm_str_u8());
  2202. }
  2203. static void d68000_ori_to_sr(void)
  2204. {
  2205. sprintf(g_dasm_str, "ori %s, SR", get_imm_str_u16());
  2206. }
  2207. static void d68020_pack_rr(void)
  2208. {
  2209. LIMIT_CPU_TYPES(M68020_PLUS);
  2210. sprintf(g_dasm_str, "pack D%d, D%d, %s; (2+)", g_cpu_ir&7, (g_cpu_ir>>9)&7, get_imm_str_u16());
  2211. }
  2212. static void d68020_pack_mm(void)
  2213. {
  2214. LIMIT_CPU_TYPES(M68020_PLUS);
  2215. sprintf(g_dasm_str, "pack -(A%d), -(A%d), %s; (2+)", g_cpu_ir&7, (g_cpu_ir>>9)&7, get_imm_str_u16());
  2216. }
  2217. static void d68000_pea(void)
  2218. {
  2219. sprintf(g_dasm_str, "pea %s", get_ea_mode_str_32(g_cpu_ir));
  2220. }
  2221. static void d68040_pflush(void)
  2222. {
  2223. LIMIT_CPU_TYPES(M68040_PLUS);
  2224. if (g_cpu_ir & 0x10)
  2225. {
  2226. sprintf(g_dasm_str, "pflusha%s", (g_cpu_ir & 8) ? "" : "n");
  2227. }
  2228. else
  2229. {
  2230. sprintf(g_dasm_str, "pflush%s(A%d)", (g_cpu_ir & 8) ? "" : "n", g_cpu_ir & 7);
  2231. }
  2232. }
  2233. static void d68000_reset(void)
  2234. {
  2235. sprintf(g_dasm_str, "reset");
  2236. }
  2237. static void d68000_ror_s_8(void)
  2238. {
  2239. sprintf(g_dasm_str, "ror.b #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  2240. }
  2241. static void d68000_ror_s_16(void)
  2242. {
  2243. sprintf(g_dasm_str, "ror.w #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7],g_cpu_ir&7);
  2244. }
  2245. static void d68000_ror_s_32(void)
  2246. {
  2247. sprintf(g_dasm_str, "ror.l #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  2248. }
  2249. static void d68000_ror_r_8(void)
  2250. {
  2251. sprintf(g_dasm_str, "ror.b D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  2252. }
  2253. static void d68000_ror_r_16(void)
  2254. {
  2255. sprintf(g_dasm_str, "ror.w D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  2256. }
  2257. static void d68000_ror_r_32(void)
  2258. {
  2259. sprintf(g_dasm_str, "ror.l D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  2260. }
  2261. static void d68000_ror_ea(void)
  2262. {
  2263. sprintf(g_dasm_str, "ror.w %s", get_ea_mode_str_32(g_cpu_ir));
  2264. }
  2265. static void d68000_rol_s_8(void)
  2266. {
  2267. sprintf(g_dasm_str, "rol.b #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  2268. }
  2269. static void d68000_rol_s_16(void)
  2270. {
  2271. sprintf(g_dasm_str, "rol.w #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  2272. }
  2273. static void d68000_rol_s_32(void)
  2274. {
  2275. sprintf(g_dasm_str, "rol.l #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  2276. }
  2277. static void d68000_rol_r_8(void)
  2278. {
  2279. sprintf(g_dasm_str, "rol.b D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  2280. }
  2281. static void d68000_rol_r_16(void)
  2282. {
  2283. sprintf(g_dasm_str, "rol.w D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  2284. }
  2285. static void d68000_rol_r_32(void)
  2286. {
  2287. sprintf(g_dasm_str, "rol.l D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  2288. }
  2289. static void d68000_rol_ea(void)
  2290. {
  2291. sprintf(g_dasm_str, "rol.w %s", get_ea_mode_str_32(g_cpu_ir));
  2292. }
  2293. static void d68000_roxr_s_8(void)
  2294. {
  2295. sprintf(g_dasm_str, "roxr.b #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  2296. }
  2297. static void d68000_roxr_s_16(void)
  2298. {
  2299. sprintf(g_dasm_str, "roxr.w #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  2300. }
  2301. static void d68000_roxr_s_32(void)
  2302. {
  2303. sprintf(g_dasm_str, "roxr.l #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  2304. }
  2305. static void d68000_roxr_r_8(void)
  2306. {
  2307. sprintf(g_dasm_str, "roxr.b D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  2308. }
  2309. static void d68000_roxr_r_16(void)
  2310. {
  2311. sprintf(g_dasm_str, "roxr.w D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  2312. }
  2313. static void d68000_roxr_r_32(void)
  2314. {
  2315. sprintf(g_dasm_str, "roxr.l D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  2316. }
  2317. static void d68000_roxr_ea(void)
  2318. {
  2319. sprintf(g_dasm_str, "roxr.w %s", get_ea_mode_str_32(g_cpu_ir));
  2320. }
  2321. static void d68000_roxl_s_8(void)
  2322. {
  2323. sprintf(g_dasm_str, "roxl.b #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  2324. }
  2325. static void d68000_roxl_s_16(void)
  2326. {
  2327. sprintf(g_dasm_str, "roxl.w #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  2328. }
  2329. static void d68000_roxl_s_32(void)
  2330. {
  2331. sprintf(g_dasm_str, "roxl.l #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  2332. }
  2333. static void d68000_roxl_r_8(void)
  2334. {
  2335. sprintf(g_dasm_str, "roxl.b D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  2336. }
  2337. static void d68000_roxl_r_16(void)
  2338. {
  2339. sprintf(g_dasm_str, "roxl.w D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  2340. }
  2341. static void d68000_roxl_r_32(void)
  2342. {
  2343. sprintf(g_dasm_str, "roxl.l D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  2344. }
  2345. static void d68000_roxl_ea(void)
  2346. {
  2347. sprintf(g_dasm_str, "roxl.w %s", get_ea_mode_str_32(g_cpu_ir));
  2348. }
  2349. static void d68010_rtd(void)
  2350. {
  2351. LIMIT_CPU_TYPES(M68010_PLUS);
  2352. sprintf(g_dasm_str, "rtd %s; (1+)", get_imm_str_s16());
  2353. SET_OPCODE_FLAGS(DASMFLAG_STEP_OUT);
  2354. }
  2355. static void d68000_rte(void)
  2356. {
  2357. sprintf(g_dasm_str, "rte");
  2358. SET_OPCODE_FLAGS(DASMFLAG_STEP_OUT);
  2359. }
  2360. static void d68020_rtm(void)
  2361. {
  2362. LIMIT_CPU_TYPES(M68020_ONLY);
  2363. sprintf(g_dasm_str, "rtm %c%d; (2+)", BIT_3(g_cpu_ir) ? 'A' : 'D', g_cpu_ir&7);
  2364. SET_OPCODE_FLAGS(DASMFLAG_STEP_OUT);
  2365. }
  2366. static void d68000_rtr(void)
  2367. {
  2368. sprintf(g_dasm_str, "rtr");
  2369. SET_OPCODE_FLAGS(DASMFLAG_STEP_OUT);
  2370. }
  2371. static void d68000_rts(void)
  2372. {
  2373. sprintf(g_dasm_str, "rts");
  2374. SET_OPCODE_FLAGS(DASMFLAG_STEP_OUT);
  2375. }
  2376. static void d68000_sbcd_rr(void)
  2377. {
  2378. sprintf(g_dasm_str, "sbcd D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7);
  2379. }
  2380. static void d68000_sbcd_mm(void)
  2381. {
  2382. sprintf(g_dasm_str, "sbcd -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7);
  2383. }
  2384. static void d68000_scc(void)
  2385. {
  2386. sprintf(g_dasm_str, "s%-2s %s", g_cc[(g_cpu_ir>>8)&0xf], get_ea_mode_str_8(g_cpu_ir));
  2387. }
  2388. static void d68000_stop(void)
  2389. {
  2390. sprintf(g_dasm_str, "stop %s", get_imm_str_s16());
  2391. }
  2392. static void d68000_sub_er_8(void)
  2393. {
  2394. sprintf(g_dasm_str, "sub.b %s, D%d", get_ea_mode_str_8(g_cpu_ir), (g_cpu_ir>>9)&7);
  2395. }
  2396. static void d68000_sub_er_16(void)
  2397. {
  2398. sprintf(g_dasm_str, "sub.w %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);
  2399. }
  2400. static void d68000_sub_er_32(void)
  2401. {
  2402. sprintf(g_dasm_str, "sub.l %s, D%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);
  2403. }
  2404. static void d68000_sub_re_8(void)
  2405. {
  2406. sprintf(g_dasm_str, "sub.b D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));
  2407. }
  2408. static void d68000_sub_re_16(void)
  2409. {
  2410. sprintf(g_dasm_str, "sub.w D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_16(g_cpu_ir));
  2411. }
  2412. static void d68000_sub_re_32(void)
  2413. {
  2414. sprintf(g_dasm_str, "sub.l D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_32(g_cpu_ir));
  2415. }
  2416. static void d68000_suba_16(void)
  2417. {
  2418. sprintf(g_dasm_str, "suba.w %s, A%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);
  2419. }
  2420. static void d68000_suba_32(void)
  2421. {
  2422. sprintf(g_dasm_str, "suba.l %s, A%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);
  2423. }
  2424. static void d68000_subi_8(void)
  2425. {
  2426. char* str = get_imm_str_s8();
  2427. sprintf(g_dasm_str, "subi.b %s, %s", str, get_ea_mode_str_8(g_cpu_ir));
  2428. }
  2429. static void d68000_subi_16(void)
  2430. {
  2431. char* str = get_imm_str_s16();
  2432. sprintf(g_dasm_str, "subi.w %s, %s", str, get_ea_mode_str_16(g_cpu_ir));
  2433. }
  2434. static void d68000_subi_32(void)
  2435. {
  2436. char* str = get_imm_str_s32();
  2437. sprintf(g_dasm_str, "subi.l %s, %s", str, get_ea_mode_str_32(g_cpu_ir));
  2438. }
  2439. static void d68000_subq_8(void)
  2440. {
  2441. 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));
  2442. }
  2443. static void d68000_subq_16(void)
  2444. {
  2445. 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));
  2446. }
  2447. static void d68000_subq_32(void)
  2448. {
  2449. 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));
  2450. }
  2451. static void d68000_subx_rr_8(void)
  2452. {
  2453. sprintf(g_dasm_str, "subx.b D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7);
  2454. }
  2455. static void d68000_subx_rr_16(void)
  2456. {
  2457. sprintf(g_dasm_str, "subx.w D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7);
  2458. }
  2459. static void d68000_subx_rr_32(void)
  2460. {
  2461. sprintf(g_dasm_str, "subx.l D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7);
  2462. }
  2463. static void d68000_subx_mm_8(void)
  2464. {
  2465. sprintf(g_dasm_str, "subx.b -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7);
  2466. }
  2467. static void d68000_subx_mm_16(void)
  2468. {
  2469. sprintf(g_dasm_str, "subx.w -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7);
  2470. }
  2471. static void d68000_subx_mm_32(void)
  2472. {
  2473. sprintf(g_dasm_str, "subx.l -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7);
  2474. }
  2475. static void d68000_swap(void)
  2476. {
  2477. sprintf(g_dasm_str, "swap D%d", g_cpu_ir&7);
  2478. }
  2479. static void d68000_tas(void)
  2480. {
  2481. sprintf(g_dasm_str, "tas %s", get_ea_mode_str_8(g_cpu_ir));
  2482. }
  2483. static void d68000_trap(void)
  2484. {
  2485. sprintf(g_dasm_str, "trap #$%x", g_cpu_ir&0xf);
  2486. }
  2487. static void d68020_trapcc_0(void)
  2488. {
  2489. LIMIT_CPU_TYPES(M68020_PLUS);
  2490. sprintf(g_dasm_str, "trap%-2s; (2+)", g_cc[(g_cpu_ir>>8)&0xf]);
  2491. SET_OPCODE_FLAGS(DASMFLAG_STEP_OVER);
  2492. }
  2493. static void d68020_trapcc_16(void)
  2494. {
  2495. LIMIT_CPU_TYPES(M68020_PLUS);
  2496. sprintf(g_dasm_str, "trap%-2s %s; (2+)", g_cc[(g_cpu_ir>>8)&0xf], get_imm_str_u16());
  2497. SET_OPCODE_FLAGS(DASMFLAG_STEP_OVER);
  2498. }
  2499. static void d68020_trapcc_32(void)
  2500. {
  2501. LIMIT_CPU_TYPES(M68020_PLUS);
  2502. sprintf(g_dasm_str, "trap%-2s %s; (2+)", g_cc[(g_cpu_ir>>8)&0xf], get_imm_str_u32());
  2503. SET_OPCODE_FLAGS(DASMFLAG_STEP_OVER);
  2504. }
  2505. static void d68000_trapv(void)
  2506. {
  2507. sprintf(g_dasm_str, "trapv");
  2508. SET_OPCODE_FLAGS(DASMFLAG_STEP_OVER);
  2509. }
  2510. static void d68000_tst_8(void)
  2511. {
  2512. sprintf(g_dasm_str, "tst.b %s", get_ea_mode_str_8(g_cpu_ir));
  2513. }
  2514. static void d68020_tst_pcdi_8(void)
  2515. {
  2516. LIMIT_CPU_TYPES(M68020_PLUS);
  2517. sprintf(g_dasm_str, "tst.b %s; (2+)", get_ea_mode_str_8(g_cpu_ir));
  2518. }
  2519. static void d68020_tst_pcix_8(void)
  2520. {
  2521. LIMIT_CPU_TYPES(M68020_PLUS);
  2522. sprintf(g_dasm_str, "tst.b %s; (2+)", get_ea_mode_str_8(g_cpu_ir));
  2523. }
  2524. static void d68020_tst_i_8(void)
  2525. {
  2526. LIMIT_CPU_TYPES(M68020_PLUS);
  2527. sprintf(g_dasm_str, "tst.b %s; (2+)", get_ea_mode_str_8(g_cpu_ir));
  2528. }
  2529. static void d68000_tst_16(void)
  2530. {
  2531. sprintf(g_dasm_str, "tst.w %s", get_ea_mode_str_16(g_cpu_ir));
  2532. }
  2533. static void d68020_tst_a_16(void)
  2534. {
  2535. LIMIT_CPU_TYPES(M68020_PLUS);
  2536. sprintf(g_dasm_str, "tst.w %s; (2+)", get_ea_mode_str_16(g_cpu_ir));
  2537. }
  2538. static void d68020_tst_pcdi_16(void)
  2539. {
  2540. LIMIT_CPU_TYPES(M68020_PLUS);
  2541. sprintf(g_dasm_str, "tst.w %s; (2+)", get_ea_mode_str_16(g_cpu_ir));
  2542. }
  2543. static void d68020_tst_pcix_16(void)
  2544. {
  2545. LIMIT_CPU_TYPES(M68020_PLUS);
  2546. sprintf(g_dasm_str, "tst.w %s; (2+)", get_ea_mode_str_16(g_cpu_ir));
  2547. }
  2548. static void d68020_tst_i_16(void)
  2549. {
  2550. LIMIT_CPU_TYPES(M68020_PLUS);
  2551. sprintf(g_dasm_str, "tst.w %s; (2+)", get_ea_mode_str_16(g_cpu_ir));
  2552. }
  2553. static void d68000_tst_32(void)
  2554. {
  2555. sprintf(g_dasm_str, "tst.l %s", get_ea_mode_str_32(g_cpu_ir));
  2556. }
  2557. static void d68020_tst_a_32(void)
  2558. {
  2559. LIMIT_CPU_TYPES(M68020_PLUS);
  2560. sprintf(g_dasm_str, "tst.l %s; (2+)", get_ea_mode_str_32(g_cpu_ir));
  2561. }
  2562. static void d68020_tst_pcdi_32(void)
  2563. {
  2564. LIMIT_CPU_TYPES(M68020_PLUS);
  2565. sprintf(g_dasm_str, "tst.l %s; (2+)", get_ea_mode_str_32(g_cpu_ir));
  2566. }
  2567. static void d68020_tst_pcix_32(void)
  2568. {
  2569. LIMIT_CPU_TYPES(M68020_PLUS);
  2570. sprintf(g_dasm_str, "tst.l %s; (2+)", get_ea_mode_str_32(g_cpu_ir));
  2571. }
  2572. static void d68020_tst_i_32(void)
  2573. {
  2574. LIMIT_CPU_TYPES(M68020_PLUS);
  2575. sprintf(g_dasm_str, "tst.l %s; (2+)", get_ea_mode_str_32(g_cpu_ir));
  2576. }
  2577. static void d68000_unlk(void)
  2578. {
  2579. sprintf(g_dasm_str, "unlk A%d", g_cpu_ir&7);
  2580. }
  2581. static void d68020_unpk_rr(void)
  2582. {
  2583. LIMIT_CPU_TYPES(M68020_PLUS);
  2584. sprintf(g_dasm_str, "unpk D%d, D%d, %s; (2+)", g_cpu_ir&7, (g_cpu_ir>>9)&7, get_imm_str_u16());
  2585. }
  2586. static void d68020_unpk_mm(void)
  2587. {
  2588. LIMIT_CPU_TYPES(M68020_PLUS);
  2589. sprintf(g_dasm_str, "unpk -(A%d), -(A%d), %s; (2+)", g_cpu_ir&7, (g_cpu_ir>>9)&7, get_imm_str_u16());
  2590. }
  2591. /* ======================================================================== */
  2592. /* ======================= INSTRUCTION TABLE BUILDER ====================== */
  2593. /* ======================================================================== */
  2594. /* EA Masks:
  2595. 800 = data register direct
  2596. 400 = address register direct
  2597. 200 = address register indirect
  2598. 100 = ARI postincrement
  2599. 80 = ARI pre-decrement
  2600. 40 = ARI displacement
  2601. 20 = ARI index
  2602. 10 = absolute short
  2603. 8 = absolute long
  2604. 4 = immediate / sr
  2605. 2 = pc displacement
  2606. 1 = pc idx
  2607. */
  2608. static opcode_struct g_opcode_info[] =
  2609. {
  2610. /* opcode handler mask match ea mask */
  2611. {d68000_1010 , 0xf000, 0xa000, 0x000},
  2612. {d68000_1111 , 0xf000, 0xf000, 0x000},
  2613. {d68000_abcd_rr , 0xf1f8, 0xc100, 0x000},
  2614. {d68000_abcd_mm , 0xf1f8, 0xc108, 0x000},
  2615. {d68000_add_er_8 , 0xf1c0, 0xd000, 0xbff},
  2616. {d68000_add_er_16 , 0xf1c0, 0xd040, 0xfff},
  2617. {d68000_add_er_32 , 0xf1c0, 0xd080, 0xfff},
  2618. {d68000_add_re_8 , 0xf1c0, 0xd100, 0x3f8},
  2619. {d68000_add_re_16 , 0xf1c0, 0xd140, 0x3f8},
  2620. {d68000_add_re_32 , 0xf1c0, 0xd180, 0x3f8},
  2621. {d68000_adda_16 , 0xf1c0, 0xd0c0, 0xfff},
  2622. {d68000_adda_32 , 0xf1c0, 0xd1c0, 0xfff},
  2623. {d68000_addi_8 , 0xffc0, 0x0600, 0xbf8},
  2624. {d68000_addi_16 , 0xffc0, 0x0640, 0xbf8},
  2625. {d68000_addi_32 , 0xffc0, 0x0680, 0xbf8},
  2626. {d68000_addq_8 , 0xf1c0, 0x5000, 0xbf8},
  2627. {d68000_addq_16 , 0xf1c0, 0x5040, 0xff8},
  2628. {d68000_addq_32 , 0xf1c0, 0x5080, 0xff8},
  2629. {d68000_addx_rr_8 , 0xf1f8, 0xd100, 0x000},
  2630. {d68000_addx_rr_16 , 0xf1f8, 0xd140, 0x000},
  2631. {d68000_addx_rr_32 , 0xf1f8, 0xd180, 0x000},
  2632. {d68000_addx_mm_8 , 0xf1f8, 0xd108, 0x000},
  2633. {d68000_addx_mm_16 , 0xf1f8, 0xd148, 0x000},
  2634. {d68000_addx_mm_32 , 0xf1f8, 0xd188, 0x000},
  2635. {d68000_and_er_8 , 0xf1c0, 0xc000, 0xbff},
  2636. {d68000_and_er_16 , 0xf1c0, 0xc040, 0xbff},
  2637. {d68000_and_er_32 , 0xf1c0, 0xc080, 0xbff},
  2638. {d68000_and_re_8 , 0xf1c0, 0xc100, 0x3f8},
  2639. {d68000_and_re_16 , 0xf1c0, 0xc140, 0x3f8},
  2640. {d68000_and_re_32 , 0xf1c0, 0xc180, 0x3f8},
  2641. {d68000_andi_to_ccr , 0xffff, 0x023c, 0x000},
  2642. {d68000_andi_to_sr , 0xffff, 0x027c, 0x000},
  2643. {d68000_andi_8 , 0xffc0, 0x0200, 0xbf8},
  2644. {d68000_andi_16 , 0xffc0, 0x0240, 0xbf8},
  2645. {d68000_andi_32 , 0xffc0, 0x0280, 0xbf8},
  2646. {d68000_asr_s_8 , 0xf1f8, 0xe000, 0x000},
  2647. {d68000_asr_s_16 , 0xf1f8, 0xe040, 0x000},
  2648. {d68000_asr_s_32 , 0xf1f8, 0xe080, 0x000},
  2649. {d68000_asr_r_8 , 0xf1f8, 0xe020, 0x000},
  2650. {d68000_asr_r_16 , 0xf1f8, 0xe060, 0x000},
  2651. {d68000_asr_r_32 , 0xf1f8, 0xe0a0, 0x000},
  2652. {d68000_asr_ea , 0xffc0, 0xe0c0, 0x3f8},
  2653. {d68000_asl_s_8 , 0xf1f8, 0xe100, 0x000},
  2654. {d68000_asl_s_16 , 0xf1f8, 0xe140, 0x000},
  2655. {d68000_asl_s_32 , 0xf1f8, 0xe180, 0x000},
  2656. {d68000_asl_r_8 , 0xf1f8, 0xe120, 0x000},
  2657. {d68000_asl_r_16 , 0xf1f8, 0xe160, 0x000},
  2658. {d68000_asl_r_32 , 0xf1f8, 0xe1a0, 0x000},
  2659. {d68000_asl_ea , 0xffc0, 0xe1c0, 0x3f8},
  2660. {d68000_bcc_8 , 0xf000, 0x6000, 0x000},
  2661. {d68000_bcc_16 , 0xf0ff, 0x6000, 0x000},
  2662. {d68020_bcc_32 , 0xf0ff, 0x60ff, 0x000},
  2663. {d68000_bchg_r , 0xf1c0, 0x0140, 0xbf8},
  2664. {d68000_bchg_s , 0xffc0, 0x0840, 0xbf8},
  2665. {d68000_bclr_r , 0xf1c0, 0x0180, 0xbf8},
  2666. {d68000_bclr_s , 0xffc0, 0x0880, 0xbf8},
  2667. {d68020_bfchg , 0xffc0, 0xeac0, 0xa78},
  2668. {d68020_bfclr , 0xffc0, 0xecc0, 0xa78},
  2669. {d68020_bfexts , 0xffc0, 0xebc0, 0xa7b},
  2670. {d68020_bfextu , 0xffc0, 0xe9c0, 0xa7b},
  2671. {d68020_bfffo , 0xffc0, 0xedc0, 0xa7b},
  2672. {d68020_bfins , 0xffc0, 0xefc0, 0xa78},
  2673. {d68020_bfset , 0xffc0, 0xeec0, 0xa78},
  2674. {d68020_bftst , 0xffc0, 0xe8c0, 0xa7b},
  2675. {d68010_bkpt , 0xfff8, 0x4848, 0x000},
  2676. {d68000_bra_8 , 0xff00, 0x6000, 0x000},
  2677. {d68000_bra_16 , 0xffff, 0x6000, 0x000},
  2678. {d68020_bra_32 , 0xffff, 0x60ff, 0x000},
  2679. {d68000_bset_r , 0xf1c0, 0x01c0, 0xbf8},
  2680. {d68000_bset_s , 0xffc0, 0x08c0, 0xbf8},
  2681. {d68000_bsr_8 , 0xff00, 0x6100, 0x000},
  2682. {d68000_bsr_16 , 0xffff, 0x6100, 0x000},
  2683. {d68020_bsr_32 , 0xffff, 0x61ff, 0x000},
  2684. {d68000_btst_r , 0xf1c0, 0x0100, 0xbff},
  2685. {d68000_btst_s , 0xffc0, 0x0800, 0xbfb},
  2686. {d68020_callm , 0xffc0, 0x06c0, 0x27b},
  2687. {d68020_cas_8 , 0xffc0, 0x0ac0, 0x3f8},
  2688. {d68020_cas_16 , 0xffc0, 0x0cc0, 0x3f8},
  2689. {d68020_cas_32 , 0xffc0, 0x0ec0, 0x3f8},
  2690. {d68020_cas2_16 , 0xffff, 0x0cfc, 0x000},
  2691. {d68020_cas2_32 , 0xffff, 0x0efc, 0x000},
  2692. {d68000_chk_16 , 0xf1c0, 0x4180, 0xbff},
  2693. {d68020_chk_32 , 0xf1c0, 0x4100, 0xbff},
  2694. {d68020_chk2_cmp2_8 , 0xffc0, 0x00c0, 0x27b},
  2695. {d68020_chk2_cmp2_16 , 0xffc0, 0x02c0, 0x27b},
  2696. {d68020_chk2_cmp2_32 , 0xffc0, 0x04c0, 0x27b},
  2697. {d68040_cinv , 0xff20, 0xf400, 0x000},
  2698. {d68000_clr_8 , 0xffc0, 0x4200, 0xbf8},
  2699. {d68000_clr_16 , 0xffc0, 0x4240, 0xbf8},
  2700. {d68000_clr_32 , 0xffc0, 0x4280, 0xbf8},
  2701. {d68000_cmp_8 , 0xf1c0, 0xb000, 0xbff},
  2702. {d68000_cmp_16 , 0xf1c0, 0xb040, 0xfff},
  2703. {d68000_cmp_32 , 0xf1c0, 0xb080, 0xfff},
  2704. {d68000_cmpa_16 , 0xf1c0, 0xb0c0, 0xfff},
  2705. {d68000_cmpa_32 , 0xf1c0, 0xb1c0, 0xfff},
  2706. {d68000_cmpi_8 , 0xffc0, 0x0c00, 0xbf8},
  2707. {d68020_cmpi_pcdi_8 , 0xffff, 0x0c3a, 0x000},
  2708. {d68020_cmpi_pcix_8 , 0xffff, 0x0c3b, 0x000},
  2709. {d68000_cmpi_16 , 0xffc0, 0x0c40, 0xbf8},
  2710. {d68020_cmpi_pcdi_16 , 0xffff, 0x0c7a, 0x000},
  2711. {d68020_cmpi_pcix_16 , 0xffff, 0x0c7b, 0x000},
  2712. {d68000_cmpi_32 , 0xffc0, 0x0c80, 0xbf8},
  2713. {d68020_cmpi_pcdi_32 , 0xffff, 0x0cba, 0x000},
  2714. {d68020_cmpi_pcix_32 , 0xffff, 0x0cbb, 0x000},
  2715. {d68000_cmpm_8 , 0xf1f8, 0xb108, 0x000},
  2716. {d68000_cmpm_16 , 0xf1f8, 0xb148, 0x000},
  2717. {d68000_cmpm_32 , 0xf1f8, 0xb188, 0x000},
  2718. {d68020_cpbcc_16 , 0xf1c0, 0xf080, 0x000},
  2719. {d68020_cpbcc_32 , 0xf1c0, 0xf0c0, 0x000},
  2720. {d68020_cpdbcc , 0xf1f8, 0xf048, 0x000},
  2721. {d68020_cpgen , 0xf1c0, 0xf000, 0x000},
  2722. {d68020_cprestore , 0xf1c0, 0xf140, 0x37f},
  2723. {d68020_cpsave , 0xf1c0, 0xf100, 0x2f8},
  2724. {d68020_cpscc , 0xf1c0, 0xf040, 0xbf8},
  2725. {d68020_cptrapcc_0 , 0xf1ff, 0xf07c, 0x000},
  2726. {d68020_cptrapcc_16 , 0xf1ff, 0xf07a, 0x000},
  2727. {d68020_cptrapcc_32 , 0xf1ff, 0xf07b, 0x000},
  2728. {d68040_cpush , 0xff20, 0xf420, 0x000},
  2729. {d68000_dbcc , 0xf0f8, 0x50c8, 0x000},
  2730. {d68000_dbra , 0xfff8, 0x51c8, 0x000},
  2731. {d68000_divs , 0xf1c0, 0x81c0, 0xbff},
  2732. {d68000_divu , 0xf1c0, 0x80c0, 0xbff},
  2733. {d68020_divl , 0xffc0, 0x4c40, 0xbff},
  2734. {d68000_eor_8 , 0xf1c0, 0xb100, 0xbf8},
  2735. {d68000_eor_16 , 0xf1c0, 0xb140, 0xbf8},
  2736. {d68000_eor_32 , 0xf1c0, 0xb180, 0xbf8},
  2737. {d68000_eori_to_ccr , 0xffff, 0x0a3c, 0x000},
  2738. {d68000_eori_to_sr , 0xffff, 0x0a7c, 0x000},
  2739. {d68000_eori_8 , 0xffc0, 0x0a00, 0xbf8},
  2740. {d68000_eori_16 , 0xffc0, 0x0a40, 0xbf8},
  2741. {d68000_eori_32 , 0xffc0, 0x0a80, 0xbf8},
  2742. {d68000_exg_dd , 0xf1f8, 0xc140, 0x000},
  2743. {d68000_exg_aa , 0xf1f8, 0xc148, 0x000},
  2744. {d68000_exg_da , 0xf1f8, 0xc188, 0x000},
  2745. {d68020_extb_32 , 0xfff8, 0x49c0, 0x000},
  2746. {d68000_ext_16 , 0xfff8, 0x4880, 0x000},
  2747. {d68000_ext_32 , 0xfff8, 0x48c0, 0x000},
  2748. {d68040_fpu , 0xffc0, 0xf200, 0x000},
  2749. {d68000_illegal , 0xffff, 0x4afc, 0x000},
  2750. {d68000_jmp , 0xffc0, 0x4ec0, 0x27b},
  2751. {d68000_jsr , 0xffc0, 0x4e80, 0x27b},
  2752. {d68000_lea , 0xf1c0, 0x41c0, 0x27b},
  2753. {d68000_link_16 , 0xfff8, 0x4e50, 0x000},
  2754. {d68020_link_32 , 0xfff8, 0x4808, 0x000},
  2755. {d68000_lsr_s_8 , 0xf1f8, 0xe008, 0x000},
  2756. {d68000_lsr_s_16 , 0xf1f8, 0xe048, 0x000},
  2757. {d68000_lsr_s_32 , 0xf1f8, 0xe088, 0x000},
  2758. {d68000_lsr_r_8 , 0xf1f8, 0xe028, 0x000},
  2759. {d68000_lsr_r_16 , 0xf1f8, 0xe068, 0x000},
  2760. {d68000_lsr_r_32 , 0xf1f8, 0xe0a8, 0x000},
  2761. {d68000_lsr_ea , 0xffc0, 0xe2c0, 0x3f8},
  2762. {d68000_lsl_s_8 , 0xf1f8, 0xe108, 0x000},
  2763. {d68000_lsl_s_16 , 0xf1f8, 0xe148, 0x000},
  2764. {d68000_lsl_s_32 , 0xf1f8, 0xe188, 0x000},
  2765. {d68000_lsl_r_8 , 0xf1f8, 0xe128, 0x000},
  2766. {d68000_lsl_r_16 , 0xf1f8, 0xe168, 0x000},
  2767. {d68000_lsl_r_32 , 0xf1f8, 0xe1a8, 0x000},
  2768. {d68000_lsl_ea , 0xffc0, 0xe3c0, 0x3f8},
  2769. {d68000_move_8 , 0xf000, 0x1000, 0xbff},
  2770. {d68000_move_16 , 0xf000, 0x3000, 0xfff},
  2771. {d68000_move_32 , 0xf000, 0x2000, 0xfff},
  2772. {d68000_movea_16 , 0xf1c0, 0x3040, 0xfff},
  2773. {d68000_movea_32 , 0xf1c0, 0x2040, 0xfff},
  2774. {d68000_move_to_ccr , 0xffc0, 0x44c0, 0xbff},
  2775. {d68010_move_fr_ccr , 0xffc0, 0x42c0, 0xbf8},
  2776. {d68000_move_to_sr , 0xffc0, 0x46c0, 0xbff},
  2777. {d68000_move_fr_sr , 0xffc0, 0x40c0, 0xbf8},
  2778. {d68000_move_to_usp , 0xfff8, 0x4e60, 0x000},
  2779. {d68000_move_fr_usp , 0xfff8, 0x4e68, 0x000},
  2780. {d68010_movec , 0xfffe, 0x4e7a, 0x000},
  2781. {d68000_movem_pd_16 , 0xfff8, 0x48a0, 0x000},
  2782. {d68000_movem_pd_32 , 0xfff8, 0x48e0, 0x000},
  2783. {d68000_movem_re_16 , 0xffc0, 0x4880, 0x2f8},
  2784. {d68000_movem_re_32 , 0xffc0, 0x48c0, 0x2f8},
  2785. {d68000_movem_er_16 , 0xffc0, 0x4c80, 0x37b},
  2786. {d68000_movem_er_32 , 0xffc0, 0x4cc0, 0x37b},
  2787. {d68000_movep_er_16 , 0xf1f8, 0x0108, 0x000},
  2788. {d68000_movep_er_32 , 0xf1f8, 0x0148, 0x000},
  2789. {d68000_movep_re_16 , 0xf1f8, 0x0188, 0x000},
  2790. {d68000_movep_re_32 , 0xf1f8, 0x01c8, 0x000},
  2791. {d68010_moves_8 , 0xffc0, 0x0e00, 0x3f8},
  2792. {d68010_moves_16 , 0xffc0, 0x0e40, 0x3f8},
  2793. {d68010_moves_32 , 0xffc0, 0x0e80, 0x3f8},
  2794. {d68000_moveq , 0xf100, 0x7000, 0x000},
  2795. {d68040_move16_pi_pi , 0xfff8, 0xf620, 0x000},
  2796. {d68040_move16_pi_al , 0xfff8, 0xf600, 0x000},
  2797. {d68040_move16_al_pi , 0xfff8, 0xf608, 0x000},
  2798. {d68040_move16_ai_al , 0xfff8, 0xf610, 0x000},
  2799. {d68040_move16_al_ai , 0xfff8, 0xf618, 0x000},
  2800. {d68000_muls , 0xf1c0, 0xc1c0, 0xbff},
  2801. {d68000_mulu , 0xf1c0, 0xc0c0, 0xbff},
  2802. {d68020_mull , 0xffc0, 0x4c00, 0xbff},
  2803. {d68000_nbcd , 0xffc0, 0x4800, 0xbf8},
  2804. {d68000_neg_8 , 0xffc0, 0x4400, 0xbf8},
  2805. {d68000_neg_16 , 0xffc0, 0x4440, 0xbf8},
  2806. {d68000_neg_32 , 0xffc0, 0x4480, 0xbf8},
  2807. {d68000_negx_8 , 0xffc0, 0x4000, 0xbf8},
  2808. {d68000_negx_16 , 0xffc0, 0x4040, 0xbf8},
  2809. {d68000_negx_32 , 0xffc0, 0x4080, 0xbf8},
  2810. {d68000_nop , 0xffff, 0x4e71, 0x000},
  2811. {d68000_not_8 , 0xffc0, 0x4600, 0xbf8},
  2812. {d68000_not_16 , 0xffc0, 0x4640, 0xbf8},
  2813. {d68000_not_32 , 0xffc0, 0x4680, 0xbf8},
  2814. {d68000_or_er_8 , 0xf1c0, 0x8000, 0xbff},
  2815. {d68000_or_er_16 , 0xf1c0, 0x8040, 0xbff},
  2816. {d68000_or_er_32 , 0xf1c0, 0x8080, 0xbff},
  2817. {d68000_or_re_8 , 0xf1c0, 0x8100, 0x3f8},
  2818. {d68000_or_re_16 , 0xf1c0, 0x8140, 0x3f8},
  2819. {d68000_or_re_32 , 0xf1c0, 0x8180, 0x3f8},
  2820. {d68000_ori_to_ccr , 0xffff, 0x003c, 0x000},
  2821. {d68000_ori_to_sr , 0xffff, 0x007c, 0x000},
  2822. {d68000_ori_8 , 0xffc0, 0x0000, 0xbf8},
  2823. {d68000_ori_16 , 0xffc0, 0x0040, 0xbf8},
  2824. {d68000_ori_32 , 0xffc0, 0x0080, 0xbf8},
  2825. {d68020_pack_rr , 0xf1f8, 0x8140, 0x000},
  2826. {d68020_pack_mm , 0xf1f8, 0x8148, 0x000},
  2827. {d68000_pea , 0xffc0, 0x4840, 0x27b},
  2828. {d68040_pflush , 0xffe0, 0xf500, 0x000},
  2829. {d68000_reset , 0xffff, 0x4e70, 0x000},
  2830. {d68000_ror_s_8 , 0xf1f8, 0xe018, 0x000},
  2831. {d68000_ror_s_16 , 0xf1f8, 0xe058, 0x000},
  2832. {d68000_ror_s_32 , 0xf1f8, 0xe098, 0x000},
  2833. {d68000_ror_r_8 , 0xf1f8, 0xe038, 0x000},
  2834. {d68000_ror_r_16 , 0xf1f8, 0xe078, 0x000},
  2835. {d68000_ror_r_32 , 0xf1f8, 0xe0b8, 0x000},
  2836. {d68000_ror_ea , 0xffc0, 0xe6c0, 0x3f8},
  2837. {d68000_rol_s_8 , 0xf1f8, 0xe118, 0x000},
  2838. {d68000_rol_s_16 , 0xf1f8, 0xe158, 0x000},
  2839. {d68000_rol_s_32 , 0xf1f8, 0xe198, 0x000},
  2840. {d68000_rol_r_8 , 0xf1f8, 0xe138, 0x000},
  2841. {d68000_rol_r_16 , 0xf1f8, 0xe178, 0x000},
  2842. {d68000_rol_r_32 , 0xf1f8, 0xe1b8, 0x000},
  2843. {d68000_rol_ea , 0xffc0, 0xe7c0, 0x3f8},
  2844. {d68000_roxr_s_8 , 0xf1f8, 0xe010, 0x000},
  2845. {d68000_roxr_s_16 , 0xf1f8, 0xe050, 0x000},
  2846. {d68000_roxr_s_32 , 0xf1f8, 0xe090, 0x000},
  2847. {d68000_roxr_r_8 , 0xf1f8, 0xe030, 0x000},
  2848. {d68000_roxr_r_16 , 0xf1f8, 0xe070, 0x000},
  2849. {d68000_roxr_r_32 , 0xf1f8, 0xe0b0, 0x000},
  2850. {d68000_roxr_ea , 0xffc0, 0xe4c0, 0x3f8},
  2851. {d68000_roxl_s_8 , 0xf1f8, 0xe110, 0x000},
  2852. {d68000_roxl_s_16 , 0xf1f8, 0xe150, 0x000},
  2853. {d68000_roxl_s_32 , 0xf1f8, 0xe190, 0x000},
  2854. {d68000_roxl_r_8 , 0xf1f8, 0xe130, 0x000},
  2855. {d68000_roxl_r_16 , 0xf1f8, 0xe170, 0x000},
  2856. {d68000_roxl_r_32 , 0xf1f8, 0xe1b0, 0x000},
  2857. {d68000_roxl_ea , 0xffc0, 0xe5c0, 0x3f8},
  2858. {d68010_rtd , 0xffff, 0x4e74, 0x000},
  2859. {d68000_rte , 0xffff, 0x4e73, 0x000},
  2860. {d68020_rtm , 0xfff0, 0x06c0, 0x000},
  2861. {d68000_rtr , 0xffff, 0x4e77, 0x000},
  2862. {d68000_rts , 0xffff, 0x4e75, 0x000},
  2863. {d68000_sbcd_rr , 0xf1f8, 0x8100, 0x000},
  2864. {d68000_sbcd_mm , 0xf1f8, 0x8108, 0x000},
  2865. {d68000_scc , 0xf0c0, 0x50c0, 0xbf8},
  2866. {d68000_stop , 0xffff, 0x4e72, 0x000},
  2867. {d68000_sub_er_8 , 0xf1c0, 0x9000, 0xbff},
  2868. {d68000_sub_er_16 , 0xf1c0, 0x9040, 0xfff},
  2869. {d68000_sub_er_32 , 0xf1c0, 0x9080, 0xfff},
  2870. {d68000_sub_re_8 , 0xf1c0, 0x9100, 0x3f8},
  2871. {d68000_sub_re_16 , 0xf1c0, 0x9140, 0x3f8},
  2872. {d68000_sub_re_32 , 0xf1c0, 0x9180, 0x3f8},
  2873. {d68000_suba_16 , 0xf1c0, 0x90c0, 0xfff},
  2874. {d68000_suba_32 , 0xf1c0, 0x91c0, 0xfff},
  2875. {d68000_subi_8 , 0xffc0, 0x0400, 0xbf8},
  2876. {d68000_subi_16 , 0xffc0, 0x0440, 0xbf8},
  2877. {d68000_subi_32 , 0xffc0, 0x0480, 0xbf8},
  2878. {d68000_subq_8 , 0xf1c0, 0x5100, 0xbf8},
  2879. {d68000_subq_16 , 0xf1c0, 0x5140, 0xff8},
  2880. {d68000_subq_32 , 0xf1c0, 0x5180, 0xff8},
  2881. {d68000_subx_rr_8 , 0xf1f8, 0x9100, 0x000},
  2882. {d68000_subx_rr_16 , 0xf1f8, 0x9140, 0x000},
  2883. {d68000_subx_rr_32 , 0xf1f8, 0x9180, 0x000},
  2884. {d68000_subx_mm_8 , 0xf1f8, 0x9108, 0x000},
  2885. {d68000_subx_mm_16 , 0xf1f8, 0x9148, 0x000},
  2886. {d68000_subx_mm_32 , 0xf1f8, 0x9188, 0x000},
  2887. {d68000_swap , 0xfff8, 0x4840, 0x000},
  2888. {d68000_tas , 0xffc0, 0x4ac0, 0xbf8},
  2889. {d68000_trap , 0xfff0, 0x4e40, 0x000},
  2890. {d68020_trapcc_0 , 0xf0ff, 0x50fc, 0x000},
  2891. {d68020_trapcc_16 , 0xf0ff, 0x50fa, 0x000},
  2892. {d68020_trapcc_32 , 0xf0ff, 0x50fb, 0x000},
  2893. {d68000_trapv , 0xffff, 0x4e76, 0x000},
  2894. {d68000_tst_8 , 0xffc0, 0x4a00, 0xbf8},
  2895. {d68020_tst_pcdi_8 , 0xffff, 0x4a3a, 0x000},
  2896. {d68020_tst_pcix_8 , 0xffff, 0x4a3b, 0x000},
  2897. {d68020_tst_i_8 , 0xffff, 0x4a3c, 0x000},
  2898. {d68000_tst_16 , 0xffc0, 0x4a40, 0xbf8},
  2899. {d68020_tst_a_16 , 0xfff8, 0x4a48, 0x000},
  2900. {d68020_tst_pcdi_16 , 0xffff, 0x4a7a, 0x000},
  2901. {d68020_tst_pcix_16 , 0xffff, 0x4a7b, 0x000},
  2902. {d68020_tst_i_16 , 0xffff, 0x4a7c, 0x000},
  2903. {d68000_tst_32 , 0xffc0, 0x4a80, 0xbf8},
  2904. {d68020_tst_a_32 , 0xfff8, 0x4a88, 0x000},
  2905. {d68020_tst_pcdi_32 , 0xffff, 0x4aba, 0x000},
  2906. {d68020_tst_pcix_32 , 0xffff, 0x4abb, 0x000},
  2907. {d68020_tst_i_32 , 0xffff, 0x4abc, 0x000},
  2908. {d68000_unlk , 0xfff8, 0x4e58, 0x000},
  2909. {d68020_unpk_rr , 0xf1f8, 0x8180, 0x000},
  2910. {d68020_unpk_mm , 0xf1f8, 0x8188, 0x000},
  2911. {0, 0, 0, 0}
  2912. };
  2913. /* Check if opcode is using a valid ea mode */
  2914. static int valid_ea(uint opcode, uint mask)
  2915. {
  2916. if(mask == 0)
  2917. return 1;
  2918. switch(opcode & 0x3f)
  2919. {
  2920. case 0x00: case 0x01: case 0x02: case 0x03:
  2921. case 0x04: case 0x05: case 0x06: case 0x07:
  2922. return (mask & 0x800) != 0;
  2923. case 0x08: case 0x09: case 0x0a: case 0x0b:
  2924. case 0x0c: case 0x0d: case 0x0e: case 0x0f:
  2925. return (mask & 0x400) != 0;
  2926. case 0x10: case 0x11: case 0x12: case 0x13:
  2927. case 0x14: case 0x15: case 0x16: case 0x17:
  2928. return (mask & 0x200) != 0;
  2929. case 0x18: case 0x19: case 0x1a: case 0x1b:
  2930. case 0x1c: case 0x1d: case 0x1e: case 0x1f:
  2931. return (mask & 0x100) != 0;
  2932. case 0x20: case 0x21: case 0x22: case 0x23:
  2933. case 0x24: case 0x25: case 0x26: case 0x27:
  2934. return (mask & 0x080) != 0;
  2935. case 0x28: case 0x29: case 0x2a: case 0x2b:
  2936. case 0x2c: case 0x2d: case 0x2e: case 0x2f:
  2937. return (mask & 0x040) != 0;
  2938. case 0x30: case 0x31: case 0x32: case 0x33:
  2939. case 0x34: case 0x35: case 0x36: case 0x37:
  2940. return (mask & 0x020) != 0;
  2941. case 0x38:
  2942. return (mask & 0x010) != 0;
  2943. case 0x39:
  2944. return (mask & 0x008) != 0;
  2945. case 0x3a:
  2946. return (mask & 0x002) != 0;
  2947. case 0x3b:
  2948. return (mask & 0x001) != 0;
  2949. case 0x3c:
  2950. return (mask & 0x004) != 0;
  2951. }
  2952. return 0;
  2953. }
  2954. /* Used by qsort */
  2955. static int DECL_SPEC compare_nof_true_bits(const void *aptr, const void *bptr)
  2956. {
  2957. uint a = ((const opcode_struct*)aptr)->mask;
  2958. uint b = ((const opcode_struct*)bptr)->mask;
  2959. a = ((a & 0xAAAA) >> 1) + (a & 0x5555);
  2960. a = ((a & 0xCCCC) >> 2) + (a & 0x3333);
  2961. a = ((a & 0xF0F0) >> 4) + (a & 0x0F0F);
  2962. a = ((a & 0xFF00) >> 8) + (a & 0x00FF);
  2963. b = ((b & 0xAAAA) >> 1) + (b & 0x5555);
  2964. b = ((b & 0xCCCC) >> 2) + (b & 0x3333);
  2965. b = ((b & 0xF0F0) >> 4) + (b & 0x0F0F);
  2966. b = ((b & 0xFF00) >> 8) + (b & 0x00FF);
  2967. return b - a; /* reversed to get greatest to least sorting */
  2968. }
  2969. /* build the opcode handler jump table */
  2970. static void build_opcode_table(void)
  2971. {
  2972. uint i;
  2973. uint opcode;
  2974. opcode_struct* ostruct;
  2975. uint opcode_info_length = 0;
  2976. for(ostruct = g_opcode_info;ostruct->opcode_handler != 0;ostruct++)
  2977. opcode_info_length++;
  2978. qsort((void *)g_opcode_info, opcode_info_length, sizeof(g_opcode_info[0]), compare_nof_true_bits);
  2979. for(i=0;i<0x10000;i++)
  2980. {
  2981. g_instruction_table[i] = d68000_illegal; /* default to illegal */
  2982. opcode = i;
  2983. /* search through opcode info for a match */
  2984. for(ostruct = g_opcode_info;ostruct->opcode_handler != 0;ostruct++)
  2985. {
  2986. /* match opcode mask and allowed ea modes */
  2987. if((opcode & ostruct->mask) == ostruct->match)
  2988. {
  2989. /* Handle destination ea for move instructions */
  2990. if((ostruct->opcode_handler == d68000_move_8 ||
  2991. ostruct->opcode_handler == d68000_move_16 ||
  2992. ostruct->opcode_handler == d68000_move_32) &&
  2993. !valid_ea(((opcode>>9)&7) | ((opcode>>3)&0x38), 0xbf8))
  2994. continue;
  2995. if(valid_ea(opcode, ostruct->ea_mask))
  2996. {
  2997. g_instruction_table[i] = ostruct->opcode_handler;
  2998. break;
  2999. }
  3000. }
  3001. }
  3002. }
  3003. }
  3004. /* ======================================================================== */
  3005. /* ================================= API ================================== */
  3006. /* ======================================================================== */
  3007. /* Disasemble one instruction at pc and store in str_buff */
  3008. unsigned int m68k_disassemble(char* str_buff, unsigned int pc, unsigned int cpu_type)
  3009. {
  3010. if(!g_initialized)
  3011. {
  3012. build_opcode_table();
  3013. g_initialized = 1;
  3014. }
  3015. switch(cpu_type)
  3016. {
  3017. case M68K_CPU_TYPE_68000:
  3018. g_cpu_type = TYPE_68000;
  3019. g_address_mask = 0x00ffffff;
  3020. break;
  3021. case M68K_CPU_TYPE_68008:
  3022. g_cpu_type = TYPE_68008;
  3023. g_address_mask = 0x003fffff;
  3024. break;
  3025. case M68K_CPU_TYPE_68010:
  3026. g_cpu_type = TYPE_68010;
  3027. g_address_mask = 0x00ffffff;
  3028. break;
  3029. case M68K_CPU_TYPE_68EC020:
  3030. g_cpu_type = TYPE_68020;
  3031. g_address_mask = 0x00ffffff;
  3032. break;
  3033. case M68K_CPU_TYPE_68020:
  3034. g_cpu_type = TYPE_68020;
  3035. g_address_mask = 0xffffffff;
  3036. break;
  3037. case M68K_CPU_TYPE_68030:
  3038. g_cpu_type = TYPE_68030;
  3039. g_address_mask = 0xffffffff;
  3040. break;
  3041. case M68K_CPU_TYPE_68040:
  3042. g_cpu_type = TYPE_68040;
  3043. g_address_mask = 0xffffffff;
  3044. break;
  3045. default:
  3046. return 0;
  3047. }
  3048. g_cpu_pc = pc;
  3049. g_helper_str[0] = 0;
  3050. g_cpu_ir = read_imm_16();
  3051. g_opcode_type = 0;
  3052. g_instruction_table[g_cpu_ir]();
  3053. sprintf(str_buff, "%s%s", g_dasm_str, g_helper_str);
  3054. return COMBINE_OPCODE_FLAGS(g_cpu_pc - pc);
  3055. }
  3056. char* m68ki_disassemble_quick(unsigned int pc, unsigned int cpu_type)
  3057. {
  3058. static char buff[100];
  3059. buff[0] = 0;
  3060. m68k_disassemble(buff, pc, cpu_type);
  3061. return buff;
  3062. }
  3063. unsigned int m68k_disassemble_raw(char* str_buff, unsigned int pc, const unsigned char* opdata, const unsigned char* argdata, unsigned int cpu_type)
  3064. {
  3065. unsigned int result;
  3066. g_rawop = opdata;
  3067. g_rawbasepc = pc;
  3068. result = m68k_disassemble(str_buff, pc, cpu_type);
  3069. g_rawop = NULL;
  3070. return result;
  3071. }
  3072. /* Check if the instruction is a valid one */
  3073. unsigned int m68k_is_valid_instruction(unsigned int instruction, unsigned int cpu_type)
  3074. {
  3075. if(!g_initialized)
  3076. {
  3077. build_opcode_table();
  3078. g_initialized = 1;
  3079. }
  3080. instruction &= 0xffff;
  3081. if(g_instruction_table[instruction] == d68000_illegal)
  3082. return 0;
  3083. switch(cpu_type)
  3084. {
  3085. case M68K_CPU_TYPE_68000:
  3086. case M68K_CPU_TYPE_68008:
  3087. if(g_instruction_table[instruction] == d68010_bkpt)
  3088. return 0;
  3089. if(g_instruction_table[instruction] == d68010_move_fr_ccr)
  3090. return 0;
  3091. if(g_instruction_table[instruction] == d68010_movec)
  3092. return 0;
  3093. if(g_instruction_table[instruction] == d68010_moves_8)
  3094. return 0;
  3095. if(g_instruction_table[instruction] == d68010_moves_16)
  3096. return 0;
  3097. if(g_instruction_table[instruction] == d68010_moves_32)
  3098. return 0;
  3099. if(g_instruction_table[instruction] == d68010_rtd)
  3100. return 0;
  3101. case M68K_CPU_TYPE_68010:
  3102. if(g_instruction_table[instruction] == d68020_bcc_32)
  3103. return 0;
  3104. if(g_instruction_table[instruction] == d68020_bfchg)
  3105. return 0;
  3106. if(g_instruction_table[instruction] == d68020_bfclr)
  3107. return 0;
  3108. if(g_instruction_table[instruction] == d68020_bfexts)
  3109. return 0;
  3110. if(g_instruction_table[instruction] == d68020_bfextu)
  3111. return 0;
  3112. if(g_instruction_table[instruction] == d68020_bfffo)
  3113. return 0;
  3114. if(g_instruction_table[instruction] == d68020_bfins)
  3115. return 0;
  3116. if(g_instruction_table[instruction] == d68020_bfset)
  3117. return 0;
  3118. if(g_instruction_table[instruction] == d68020_bftst)
  3119. return 0;
  3120. if(g_instruction_table[instruction] == d68020_bra_32)
  3121. return 0;
  3122. if(g_instruction_table[instruction] == d68020_bsr_32)
  3123. return 0;
  3124. if(g_instruction_table[instruction] == d68020_callm)
  3125. return 0;
  3126. if(g_instruction_table[instruction] == d68020_cas_8)
  3127. return 0;
  3128. if(g_instruction_table[instruction] == d68020_cas_16)
  3129. return 0;
  3130. if(g_instruction_table[instruction] == d68020_cas_32)
  3131. return 0;
  3132. if(g_instruction_table[instruction] == d68020_cas2_16)
  3133. return 0;
  3134. if(g_instruction_table[instruction] == d68020_cas2_32)
  3135. return 0;
  3136. if(g_instruction_table[instruction] == d68020_chk_32)
  3137. return 0;
  3138. if(g_instruction_table[instruction] == d68020_chk2_cmp2_8)
  3139. return 0;
  3140. if(g_instruction_table[instruction] == d68020_chk2_cmp2_16)
  3141. return 0;
  3142. if(g_instruction_table[instruction] == d68020_chk2_cmp2_32)
  3143. return 0;
  3144. if(g_instruction_table[instruction] == d68020_cmpi_pcdi_8)
  3145. return 0;
  3146. if(g_instruction_table[instruction] == d68020_cmpi_pcix_8)
  3147. return 0;
  3148. if(g_instruction_table[instruction] == d68020_cmpi_pcdi_16)
  3149. return 0;
  3150. if(g_instruction_table[instruction] == d68020_cmpi_pcix_16)
  3151. return 0;
  3152. if(g_instruction_table[instruction] == d68020_cmpi_pcdi_32)
  3153. return 0;
  3154. if(g_instruction_table[instruction] == d68020_cmpi_pcix_32)
  3155. return 0;
  3156. if(g_instruction_table[instruction] == d68020_cpbcc_16)
  3157. return 0;
  3158. if(g_instruction_table[instruction] == d68020_cpbcc_32)
  3159. return 0;
  3160. if(g_instruction_table[instruction] == d68020_cpdbcc)
  3161. return 0;
  3162. if(g_instruction_table[instruction] == d68020_cpgen)
  3163. return 0;
  3164. if(g_instruction_table[instruction] == d68020_cprestore)
  3165. return 0;
  3166. if(g_instruction_table[instruction] == d68020_cpsave)
  3167. return 0;
  3168. if(g_instruction_table[instruction] == d68020_cpscc)
  3169. return 0;
  3170. if(g_instruction_table[instruction] == d68020_cptrapcc_0)
  3171. return 0;
  3172. if(g_instruction_table[instruction] == d68020_cptrapcc_16)
  3173. return 0;
  3174. if(g_instruction_table[instruction] == d68020_cptrapcc_32)
  3175. return 0;
  3176. if(g_instruction_table[instruction] == d68020_divl)
  3177. return 0;
  3178. if(g_instruction_table[instruction] == d68020_extb_32)
  3179. return 0;
  3180. if(g_instruction_table[instruction] == d68020_link_32)
  3181. return 0;
  3182. if(g_instruction_table[instruction] == d68020_mull)
  3183. return 0;
  3184. if(g_instruction_table[instruction] == d68020_pack_rr)
  3185. return 0;
  3186. if(g_instruction_table[instruction] == d68020_pack_mm)
  3187. return 0;
  3188. if(g_instruction_table[instruction] == d68020_rtm)
  3189. return 0;
  3190. if(g_instruction_table[instruction] == d68020_trapcc_0)
  3191. return 0;
  3192. if(g_instruction_table[instruction] == d68020_trapcc_16)
  3193. return 0;
  3194. if(g_instruction_table[instruction] == d68020_trapcc_32)
  3195. return 0;
  3196. if(g_instruction_table[instruction] == d68020_tst_pcdi_8)
  3197. return 0;
  3198. if(g_instruction_table[instruction] == d68020_tst_pcix_8)
  3199. return 0;
  3200. if(g_instruction_table[instruction] == d68020_tst_i_8)
  3201. return 0;
  3202. if(g_instruction_table[instruction] == d68020_tst_a_16)
  3203. return 0;
  3204. if(g_instruction_table[instruction] == d68020_tst_pcdi_16)
  3205. return 0;
  3206. if(g_instruction_table[instruction] == d68020_tst_pcix_16)
  3207. return 0;
  3208. if(g_instruction_table[instruction] == d68020_tst_i_16)
  3209. return 0;
  3210. if(g_instruction_table[instruction] == d68020_tst_a_32)
  3211. return 0;
  3212. if(g_instruction_table[instruction] == d68020_tst_pcdi_32)
  3213. return 0;
  3214. if(g_instruction_table[instruction] == d68020_tst_pcix_32)
  3215. return 0;
  3216. if(g_instruction_table[instruction] == d68020_tst_i_32)
  3217. return 0;
  3218. if(g_instruction_table[instruction] == d68020_unpk_rr)
  3219. return 0;
  3220. if(g_instruction_table[instruction] == d68020_unpk_mm)
  3221. return 0;
  3222. case M68K_CPU_TYPE_68EC020:
  3223. case M68K_CPU_TYPE_68020:
  3224. case M68K_CPU_TYPE_68030:
  3225. if(g_instruction_table[instruction] == d68040_cinv)
  3226. return 0;
  3227. if(g_instruction_table[instruction] == d68040_cpush)
  3228. return 0;
  3229. if(g_instruction_table[instruction] == d68040_move16_pi_pi)
  3230. return 0;
  3231. if(g_instruction_table[instruction] == d68040_move16_pi_al)
  3232. return 0;
  3233. if(g_instruction_table[instruction] == d68040_move16_al_pi)
  3234. return 0;
  3235. if(g_instruction_table[instruction] == d68040_move16_ai_al)
  3236. return 0;
  3237. if(g_instruction_table[instruction] == d68040_move16_al_ai)
  3238. return 0;
  3239. if(g_instruction_table[instruction] == d68040_pflush)
  3240. return 0;
  3241. case M68K_CPU_TYPE_68040:
  3242. if(g_instruction_table[instruction] == d68020_cpbcc_16)
  3243. return 0;
  3244. if(g_instruction_table[instruction] == d68020_cpbcc_32)
  3245. return 0;
  3246. if(g_instruction_table[instruction] == d68020_cpdbcc)
  3247. return 0;
  3248. if(g_instruction_table[instruction] == d68020_cpgen)
  3249. return 0;
  3250. if(g_instruction_table[instruction] == d68020_cprestore)
  3251. return 0;
  3252. if(g_instruction_table[instruction] == d68020_cpsave)
  3253. return 0;
  3254. if(g_instruction_table[instruction] == d68020_cpscc)
  3255. return 0;
  3256. if(g_instruction_table[instruction] == d68020_cptrapcc_0)
  3257. return 0;
  3258. if(g_instruction_table[instruction] == d68020_cptrapcc_16)
  3259. return 0;
  3260. if(g_instruction_table[instruction] == d68020_cptrapcc_32)
  3261. return 0;
  3262. }
  3263. if(cpu_type != M68K_CPU_TYPE_68020 && cpu_type != M68K_CPU_TYPE_68EC020 &&
  3264. (g_instruction_table[instruction] == d68020_callm ||
  3265. g_instruction_table[instruction] == d68020_rtm))
  3266. return 0;
  3267. return 1;
  3268. }
  3269. /* ======================================================================== */
  3270. /* ============================== END OF FILE ============================= */
  3271. /* ======================================================================== */