From: Toni Wilen Date: Fri, 20 Jul 2012 15:17:26 +0000 (+0300) Subject: 2420b7 X-Git-Tag: 2500~24 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=1c40d7abf672e3d446f38a1a1a6c29fd6266b5cf;p=francis%2Fwinuae.git 2420b7 --- diff --git a/ar.cpp b/ar.cpp index 15469ac0..4c2e032d 100644 --- a/ar.cpp +++ b/ar.cpp @@ -250,7 +250,6 @@ static int triggered_once; static void hrtmon_unmap_banks (void); void check_prefs_changed_carts (int in_memory_reset); -int action_replay_unload (int in_memory_reset); static int stored_picasso_on = -1; @@ -1477,6 +1476,9 @@ int action_replay_unload (int in_memory_reset) _T("ACTION_REPLAY_HIDE"), }; + if (!armemory_rom && !hrtmemory) + return 0; + write_log_debug (_T("Action Replay State:(%s)\nHrtmon State:(%s)\n"), state[action_replay_flag + 3], state[hrtmon_flag + 3]); diff --git a/autoconf.cpp b/autoconf.cpp index 5285526e..e9371ef3 100644 --- a/autoconf.cpp +++ b/autoconf.cpp @@ -284,7 +284,7 @@ void rtarea_init (void) uaegfx_install_code (rtarea_base + RTAREA_RTG); #endif - org (RTAREA_TRAPS); + org (RTAREA_TRAPS | rtarea_base); init_extended_traps (); } diff --git a/blitter.cpp b/blitter.cpp index fe7219f8..2e8d35c0 100644 --- a/blitter.cpp +++ b/blitter.cpp @@ -618,11 +618,11 @@ STATIC_INLINE void blitter_line_incy (void) static void blitter_line (void) { uae_u16 blitahold = (blinea & blt_info.bltafwm) >> blinea_shift; - uae_u16 blitbhold = blineb & 1 ? 0xFFFF : 0; uae_u16 blitchold = blt_info.bltcdat; + blt_info.bltbhold = (blineb & 1) ? 0xFFFF : 0; blitlinepixel = !blitsing || (blitsing && !blitonedot); - blt_info.bltddat = blit_func (blitahold, blitbhold, blitchold, bltcon0 & 0xFF); + blt_info.bltddat = blit_func (blitahold, blt_info.bltbhold, blitchold, bltcon0 & 0xFF); blitonedot++; } diff --git a/build68k.cpp b/build68k.cpp index 78a5437d..339a63f6 100644 --- a/build68k.cpp +++ b/build68k.cpp @@ -76,7 +76,7 @@ int main(int argc, char **argv) #endif getnextch(); while (nextch != EOF) { - int cpulevel, plevel, sduse; + int cpulevel, uncpulevel, plevel, sduse; int i; char patbits[16]; @@ -130,7 +130,7 @@ int main(int argc, char **argv) getnextch(); } - while (isspace(nextch) || nextch == ':') /* Get CPU and privilege level */ + while (isspace(nextch) || nextch == ':') /* Get CPU level, unimplemented level, and privilege level */ getnextch(); switch (nextch) { @@ -146,6 +146,19 @@ int main(int argc, char **argv) } getnextch(); + switch (nextch) { + case '0': uncpulevel = 0; break; + case '1': uncpulevel = 1; break; + case '2': uncpulevel = 2; break; + case '3': uncpulevel = 3; break; + case '4': uncpulevel = 4; break; + case '5': uncpulevel = 5; break; + case '6': uncpulevel = 6; break; + case '7': uncpulevel = 7; break; + default: abort(); + } + getnextch(); + switch (nextch) { case '0': plevel = 0; break; case '1': plevel = 1; break; @@ -247,7 +260,7 @@ int main(int argc, char **argv) if (j < 15) printf(","); } - printf ("},0x%04X,%d,%d,{", bitmask, cpulevel, plevel); + printf ("},0x%04X,%d,%d,%d,{", bitmask, cpulevel, uncpulevel, plevel); for(i = 0; i < 5; i++) { printf("{%d,%d}%s", flaguse[i], flagset[i], i == 4 ? "" : ","); } diff --git a/debug.cpp b/debug.cpp index c045008a..e1e42d7d 100644 --- a/debug.cpp +++ b/debug.cpp @@ -70,7 +70,6 @@ void deactivate_debugger (void) processptr = 0; xfree (processname); processname = NULL; - setsystime (); } void activate_debugger (void) diff --git a/expansion.cpp b/expansion.cpp index 4e20b895..468aafba 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -295,13 +295,13 @@ static void REGPARAM2 expamem_wput (uaecptr addr, uae_u32 value) value &= 0xffff; if (ecard >= cardno) return; - if (expamem_type() != zorroIII) + if (expamem_type () != zorroIII) write_log (_T("warning: WRITE.W to address $%lx : value $%x\n"), addr, value); else { switch (addr & 0xff) { case 0x44: - if (expamem_type() == zorroIII) { - uae_u32 p1, p2; + if (expamem_type () == zorroIII) { + uae_u32 p1, p2 = 0; // +Bernd Roesch & Toni Wilen p1 = get_word (regs.regs[11] + 0x20); if (expamem[0] & add_memory) { @@ -1213,6 +1213,35 @@ void free_fastmemory (void) fastmemory = 0; } +static bool mapped_malloc_dynamic (uae_u32 *currpsize, uae_u32 *changedpsize, uae_u8 **memory, uae_u32 *allocated, uae_u32 *mask, int max, const TCHAR *name) +{ + int alloc = *currpsize; + + *allocated = 0; + *memory = NULL; + *mask = 0; + + if (!alloc) + return false; + + while (alloc >= max * 1024 * 1024) { + uae_u8 *mem = mapped_malloc (alloc, name); + if (mem) { + *memory = mem; + *currpsize = alloc; + *changedpsize = alloc; + *mask = alloc - 1; + *allocated = alloc; + return true; + } + write_log (_T("Out of memory for %s, %d bytes.\n"), name, alloc); + alloc /= 2; + } + + return false; +} + + static void allocate_expamem (void) { currprefs.fastmem_size = changed_prefs.fastmem_size; @@ -1220,6 +1249,7 @@ static void allocate_expamem (void) currprefs.z3fastmem_size = changed_prefs.z3fastmem_size; currprefs.z3fastmem2_size = changed_prefs.z3fastmem2_size; currprefs.rtgmem_size = changed_prefs.rtgmem_size; + currprefs.rtgmem_type = changed_prefs.rtgmem_type; currprefs.z3chipmem_size = changed_prefs.z3chipmem_size; z3chipmem_start = currprefs.z3fastmem_start; @@ -1240,24 +1270,13 @@ static void allocate_expamem (void) allocated_fastmem = 0; } } - memory_hardreset (); + memory_hardreset (1); } if (allocated_z3fastmem != currprefs.z3fastmem_size) { if (z3fastmem) mapped_free (z3fastmem); - z3fastmem = 0; - - allocated_z3fastmem = currprefs.z3fastmem_size; - z3fastmem_mask = allocated_z3fastmem - 1; - - if (allocated_z3fastmem) { - z3fastmem = mapped_malloc (allocated_z3fastmem, _T("z3")); - if (z3fastmem == 0) { - write_log (_T("Out of memory for 32 bit fast memory.\n")); - allocated_z3fastmem = 0; - } - } - memory_hardreset (); + mapped_malloc_dynamic (&currprefs.z3fastmem_size, &changed_prefs.z3fastmem_size, &z3fastmem, &allocated_z3fastmem, &z3fastmem_mask, 1, _T("z3")); + memory_hardreset (1); } if (allocated_z3fastmem2 != currprefs.z3fastmem2_size) { if (z3fastmem2) @@ -1274,43 +1293,21 @@ static void allocate_expamem (void) allocated_z3fastmem2 = 0; } } - memory_hardreset (); + memory_hardreset (1); } if (allocated_z3chipmem != currprefs.z3chipmem_size) { if (z3chipmem) mapped_free (z3chipmem); - z3chipmem = 0; - - allocated_z3chipmem = currprefs.z3chipmem_size; - z3chipmem_mask = allocated_z3chipmem - 1; - - if (allocated_z3chipmem) { - z3chipmem = mapped_malloc (allocated_z3chipmem, _T("z3_chip")); - if (z3chipmem == 0) { - write_log (_T("Out of memory for 32 bit chip memory.\n")); - allocated_z3chipmem = 0; - } - } - memory_hardreset (); + mapped_malloc_dynamic (&currprefs.z3chipmem_size, &changed_prefs.z3chipmem_size, &z3chipmem, &allocated_z3chipmem, &z3chipmem_mask, 16, _T("z3_chip")); + memory_hardreset (1); } #ifdef PICASSO96 if (allocated_gfxmem != currprefs.rtgmem_size) { if (gfxmemory) mapped_free (gfxmemory); - gfxmemory = 0; - - allocated_gfxmem = currprefs.rtgmem_size; - gfxmem_mask = allocated_gfxmem - 1; - - if (allocated_gfxmem) { - gfxmemory = mapped_malloc (allocated_gfxmem, currprefs.rtgmem_type ? _T("z3_gfx") : _T("z2_gfx")); - if (gfxmemory == 0) { - write_log (_T("Out of memory for graphics card memory\n")); - allocated_gfxmem = 0; - } - } - memory_hardreset (); + mapped_malloc_dynamic (&currprefs.rtgmem_size, &changed_prefs.rtgmem_size, &gfxmemory, &allocated_gfxmem, &gfxmem_mask, 1, currprefs.rtgmem_type ? _T("z3_gfx") : _T("z2_gfx")); + memory_hardreset (1); } #endif diff --git a/filesys.asm b/filesys.asm index 58a96e7d..cabe5c79 100644 --- a/filesys.asm +++ b/filesys.asm @@ -56,7 +56,7 @@ start: dc.l exter_server-start ;4 28 dc.l bootcode-start ;5 32 dc.l setup_exter-start ;6 36 - dc.l mh_e-start ;7 40 + dc.l 0 ;7 40 dc.l clipboard_init-start ;8 44 ;52 @@ -440,8 +440,13 @@ setup_exter: move.w #$0214,8(a1) moveq.l #3,d0 jsr -168(a6) ; AddIntServer - move.w mh_e(pc),d0 - beq.s .nomh + + move.w #$FF38,d0 + moveq #4,d1 + bsr.w getrtbase + jsr (a0) + tst.l d0 + beq.s .nomh bsr.w mousehack_init .nomh movem.l (sp)+,d0-d1/a0-a1 @@ -1246,6 +1251,21 @@ addfsonthefly ; d1 = fs index movem.l (sp)+,d2-d7/a2-a6 rts +clockreset: + move.w #$ff58,d0 ; fsmisc_helper + bsr.w getrtbase + moveq #3,d0 ; get time + jsr (a0) + move.l 168(a3),a1 + move.l d0,32(a1) + beq.s .cr + moveq #0,d0 + move.l d0,36(a1) + move.w #11,28(a1) ;TR_SETSYSTIME + move.b #1,30(a1) ;IOF_QUICK + jsr -$01c8(a6) ;DoIO +.cr rts + filesys_mainloop: move.l 4.w,a6 sub.l a1,a1 @@ -1271,6 +1291,7 @@ filesys_mainloop: ; 164: input.device ioreq (disk inserted/removed input message) ; 168: timer.device ioreq ; 172: disk change from host + ; 173: clock reset ; 176: my task ; 180: device node move.l #12+20+(80+44+1)+(1+3)+4+4+4+(1+3)+4+4,d0 @@ -1347,7 +1368,14 @@ FSML_loop: bset #13,d0 ; SIGBREAK_CTRL_D jsr -$013e(a6) ;Wait .msg - ; SIGBREAK_CTRL_D = disk change notification from native code + ; SIGBREAK_CTRL_D checks + ; clock reset + tst.b 173(a3) + beq.s .noclk + bsr.w clockreset + clr.b 173(a3) +.noclk + ; disk change notification from native code tst.b 172(a3) beq.s .nodc ; call filesys_media_change_reply (pre) @@ -1688,32 +1716,30 @@ mhdoio: jsr -$01c8(a6) ;DoIO rts -; these shouldn't be here but it is easier this way.. - -mh_e: dc.w 0 -mh_cnt: dc.w -1 -mh_maxx: dc.w 0 -mh_maxy: dc.w 0 -mh_maxz: dc.w 0 -mh_x: dc.w 0 -mh_y: dc.w 0 -mh_z: dc.w 0 -mh_resx: dc.w 0 -mh_resy: dc.w 0 -mh_maxax: dc.w 0 -mh_maxay: dc.w 0 -mh_maxaz: dc.w 0 -mh_ax: dc.w 0 -mh_ay: dc.w 0 -mh_az: dc.w 0 -mh_pressure: dc.w 0 -mh_buttonbits: dc.l 0 -mh_inproximity: dc.w 0 -mh_absx: dc.w 0 -mh_absy: dc.w 0 +MH_E = 0 +MH_CNT = 2 +MH_MAXX = 4 +MH_MAXY = 6 +MH_MAXZ = 8 +MH_X = 10 +MH_Y = 12 +MH_Z = 14 +MH_RESX = 16 +MH_RESY = 18 +MH_MAXAX = 20 +MH_MAXAY = 22 +MH_MAXAZ = 24 +MH_AX = 26 +MH_AY = 28 +MH_AZ = 30 +MH_PRESSURE = 32 +MH_BUTTONBITS = 34 +MH_INPROXIMITY = 38 +MH_ABSX = 40 +MH_ABSY = 42 +MH_DATA_SIZE = 44 MH_INT = 0 - MH_FOO = (MH_INT+22) MH_FOO_CNT = 0 MH_FOO_BUTTONS = 4 @@ -1742,7 +1768,8 @@ MH_IEPT = (MH_IEH+22) ;IEPointerTable/IENewTablet MH_IENTTAGS = (MH_IEPT+32) ;space for ient_TagList MH_IO = (MH_IENTTAGS+16*4*2) MH_TM = (MH_IO+4) -MH_END = (MH_TM+4) +MH_DATA = (MH_TM+4) +MH_END = (MH_DATA+MH_DATA_SIZE) MH_MOUSEHACK = 0 MH_TABLET = 1 @@ -1858,7 +1885,7 @@ getgfxlimits: mousehack_task: move.l 4.w,a6 - move.w 20(a6),d7 + move.w 20(a6),d7 ; KS version moveq #-1,d0 jsr -$014a(a6) ;AllocSignal @@ -1886,6 +1913,14 @@ mousehack_task: moveq #-1,d0 move.w d0,MH_FOO_CNT(a3) + ; send data structure address + move.w #$FF38,d0 + moveq #5,d1 + bsr.w getrtbase + move.l a5,d0 + add.l #MH_DATA,d0 + jsr (a0) + lea MH_INT(a5),a1 move.b #2,8(a1) ;NT_INTERRUPT move.b #5,9(a1) ;priority @@ -1992,7 +2027,7 @@ mhloop move.l #22,36(a1) ;sizeof(struct InputEvent) move.l a2,40(a1) - move.b mh_e(pc),d0 + move.b MH_E+MH_DATA(a5),d0 cmp.w #39,d7 bcs.w .notablet btst #MH_TABLET,d0 @@ -2012,7 +2047,7 @@ mhloop clr.w 12(a0) ;IEQUALIFIER_MIDBUTTON=0x1000/IEQUALIFIER_RBUTTON=0x2000/IEQUALIFIER_LEFTBUTTON=0x4000 - move.l mh_buttonbits(pc),d1 + move.l MH_BUTTONBITS+MH_DATA(a5),d1 and.w #7,d1 moveq #7,d0 sub.w d1,d0 @@ -2020,72 +2055,72 @@ mhloop lsl.w #4,d0 move.w d0,8(a2) ;ie_Qualifier - move.w mh_x(pc),12+2(a0) ;ient_TabletX + move.w MH_X+MH_DATA(a5),12+2(a0) ;ient_TabletX clr.w 16(a0) - move.w mh_y(pc),16+2(a0) ;ient_TabletY + move.w MH_Y++MH_DATA(a5),16+2(a0) ;ient_TabletY clr.w 20(a0) - move.w mh_maxx(pc),20+2(a0) ;ient_RangeX + move.w MH_MAXX+MH_DATA(a5),20+2(a0) ;ient_RangeX clr.w 24(a0) - move.w mh_maxy(pc),24+2(a0) ;ient_RangeY + move.w MH_MAXY+MH_DATA(a5),24+2(a0) ;ient_RangeY lea MH_IENTTAGS(a5),a1 move.l a1,28(a0) ;ient_TagList move.l #TABLETA_Pressure,(a1)+ - move.w mh_pressure(pc),d0 + move.w MH_PRESSURE+MH_DATA(a5),d0 ext.l d0 asl.l #8,d0 move.l d0,(a1)+ move.l #TABLETA_ButtonBits,(a1)+ - move.l mh_buttonbits(pc),(a1)+ + move.l MH_BUTTONBITS+MH_DATA(a5),(a1)+ moveq #0,d0 - move.w mh_resx(pc),d0 + move.w MH_RESX+MH_DATA(a5),d0 bmi.s .noresx move.l #TABLETA_ResolutionX,(a1)+ move.l d0,(a1)+ .noresx - move.w mh_resy(pc),d0 + move.w MH_RESY+MH_DATA(a5),d0 bmi.s .noresy move.l #TABLETA_ResolutionY,(a1)+ move.l d0,(a1)+ .noresy - move.w mh_maxz(pc),d0 + move.w MH_MAXZ+MH_DATA(a5),d0 bmi.s .noz move.l #TABLETA_RangeZ,(a1)+ move.l d0,(a1)+ - move.w mh_z(pc),d0 + move.w MH_Z+MH_DATA(a5),d0 move.l #TABLETA_TabletZ,(a1)+ move.l d0,(a1)+ .noz - move.w mh_maxax(pc),d0 + move.w MH_MAXAX+MH_DATA(a5),d0 bmi.s .noax move.l #TABLETA_AngleX,(a1)+ - move.w mh_ax(pc),d0 + move.w MH_AX+MH_DATA(a5),d0 ext.l d0 asl.l #8,d0 move.l d0,(a1)+ .noax - move.w mh_maxay(pc),d0 + move.w MH_MAXAY++MH_DATA(a5),d0 bmi.s .noay move.l #TABLETA_AngleY,(a1)+ - move.w mh_ay(pc),d0 + move.w MH_AY++MH_DATA(pc),d0 ext.l d0 asl.l #8,d0 move.l d0,(a1)+ .noay - move.w mh_maxaz(pc),d0 + move.w MH_MAXAZ++MH_DATA(a5),d0 bmi.s .noaz move.l #TABLETA_AngleZ,(a1)+ - move.w mh_az(pc),d0 + move.w MH_AZ+MH_DATA(a5),d0 ext.l d0 asl.l #8,d0 move.l d0,(a1)+ .noaz moveq #0,d0 - move.w mh_inproximity(pc),d0 + move.w MH_INPROXIMITY+MH_DATA(a5),d0 bmi.s .noproxi move.l #TABLETA_InProximity,(a1)+ move.l d0,(a1)+ @@ -2097,7 +2132,7 @@ mhloop ;create mouse button events if button state changed move.w #$68,d3 ;IECODE_LBUTTON->IECODE_RBUTTON->IECODE_MBUTTON moveq #1,d2 - move.l mh_buttonbits(pc),d4 + move.l MH_BUTTONBITS+MH_DATA(a5),d4 .nextbut move.l d4,d0 and.l d2,d0 @@ -2128,7 +2163,7 @@ mhloop .notablet - move.b mh_e(pc),d0 + move.b MH_E+MH_DATA(a5),d0 btst #MH_MOUSEHACK,d0 beq.w mhloop @@ -2139,7 +2174,7 @@ mhloop move.l MH_FOO_INTBASE(a3),a0 - move.w mh_absx(pc),d0 + move.w MH_ABSX+MH_DATA(a5),d0 move.w 34+14(a0),d1 add.w d1,d1 sub.w d1,d0 @@ -2148,7 +2183,7 @@ mhloop .xn move.w d0,10(a2) - move.w mh_absy(pc),d0 + move.w MH_ABSY+MH_DATA(a5),d0 move.w 34+12(a0),d1 add.w d1,d1 sub.w d1,d0 @@ -2169,7 +2204,7 @@ mousehackint: beq.s .l1 tst.l MH_TM(a1) beq.s .l1 - move.w mh_cnt(pc),d0 + move.w MH_CNT+MH_DATA(a1),d0 cmp.w MH_FOO+MH_FOO_CNT(a1),d0 beq.s .l2 move.w d0,MH_FOO+MH_FOO_CNT(a1) diff --git a/filesys.cpp b/filesys.cpp index 0f1ffa56..39362f55 100644 --- a/filesys.cpp +++ b/filesys.cpp @@ -1307,7 +1307,7 @@ void setsystime (void) return; Unit *u; for (u = units; u; u = u->next) { - if (is_virtual (u->unit)) { + if (is_virtual (u->unit) && filesys_isvolume (u)) { put_byte (u->volume + 173 - 32, 1); uae_Signal (get_long (u->volume + 176 - 32), 1 << 13); break; @@ -5172,7 +5172,7 @@ static void action_change_file_position64 (Unit *unit, dpacket packet) TRACE((_T("ACTION_CHANGE_FILE_POSITION64(%s,%lld,%d)\n"), k->aino->nname, pos, mode)); gui_flicker_led (LED_HD, unit->unit, 1); - cur = fs_lseek64 (k->fd, 0, SEEK_CUR); + cur = k->file_pos; { uae_s64 temppos; uae_s64 filesize = fs_fsize64 (k->fd); @@ -5198,8 +5198,9 @@ static void action_change_file_position64 (Unit *unit, dpacket packet) } else { PUT_PCK64_RES1 (packet, TRUE); PUT_PCK64_RES2 (packet, 0); - k->file_pos = cur; + k->file_pos = fs_lseek64 (k->fd, 0, SEEK_CUR); } + TRACE((_T("= oldpos %lld newpos %lld\n"), cur, k->file_pos)); } @@ -5214,7 +5215,7 @@ static void action_get_file_position64 (Unit *unit, dpacket packet) PUT_PCK64_RES2 (packet, ERROR_INVALID_LOCK); return; } - TRACE((_T("ACTION_GET_FILE_POSITION64(%s)\n"), k->aino->nname)); + TRACE((_T("ACTION_GET_FILE_POSITION64(%s)=%lld\n"), k->aino->nname, k->file_pos)); PUT_PCK64_RES1 (packet, k->file_pos); PUT_PCK64_RES2 (packet, 0); } @@ -5284,8 +5285,8 @@ static void action_get_file_size64 (Unit *unit, dpacket packet) PUT_PCK64_RES2 (packet, ERROR_INVALID_LOCK); return; } - TRACE((_T("ACTION_GET_FILE_SIZE64(%s)\n"), k->aino->nname)); filesize = fs_fsize64 (k->fd); + TRACE((_T("ACTION_GET_FILE_SIZE64(%s)=%lld\n"), k->aino->nname, filesize)); if (filesize >= 0) { PUT_PCK64_RES1 (packet, filesize); PUT_PCK64_RES2 (packet, 0); diff --git a/include/ar.h b/include/ar.h index c063ed48..91360b5d 100644 --- a/include/ar.h +++ b/include/ar.h @@ -38,6 +38,7 @@ extern void action_replay_ciaread (void); extern void action_replay_hide (void); extern void action_replay_reset (void); extern int action_replay_load (void); +extern int action_replay_unload (int in_memory_reset); extern void action_replay_memory_reset (void); extern void action_replay_init (int); diff --git a/include/memory.h b/include/memory.h index 82d4ebef..4b07be7b 100644 --- a/include/memory.h +++ b/include/memory.h @@ -18,8 +18,8 @@ extern uae_u8 *cache_alloc (int); extern void cache_free (uae_u8*); #endif -int init_shm (void); -void preinit_shm (void); +bool init_shm (void); +bool preinit_shm (void); extern bool canbang; extern int candirect; @@ -173,7 +173,8 @@ extern void memory_init (void); extern void memory_cleanup (void); extern void map_banks (addrbank *bank, int first, int count, int realsize); extern void map_overlay (int chip); -extern void memory_hardreset (void); +extern void memory_hardreset (int); +extern void memory_clear (void); extern void free_fastmemory (void); #define longget(addr) (call_mem_get_func(get_mem_bank(addr).lget, addr)) diff --git a/include/readcpu.h b/include/readcpu.h index 570f34e8..f242766b 100644 --- a/include/readcpu.h +++ b/include/readcpu.h @@ -65,6 +65,7 @@ struct instr_def { uae_u8 bitpos[16]; unsigned int mask; int cpulevel; + int unimpcpulevel; int plevel; struct { unsigned int flaguse:3; diff --git a/include/uae.h b/include/uae.h index a6d3e58b..30164184 100644 --- a/include/uae.h +++ b/include/uae.h @@ -11,6 +11,7 @@ extern void do_leave_program (void); extern void start_program (void); extern void leave_program (void); extern void real_main (int, TCHAR **); +extern void virtualdevice_init (void); extern void usage (void); extern void sleep_millis (int ms); extern void sleep_millis_main (int ms); diff --git a/main.cpp b/main.cpp index cd320c36..c7a8897f 100644 --- a/main.cpp +++ b/main.cpp @@ -734,6 +734,7 @@ void reset_all_systems (void) filesys_prepare_reset (); filesys_reset (); #endif + init_shm (); memory_reset (); #if defined (BSDSOCKET) bsdlib_reset (); @@ -858,6 +859,35 @@ void leave_program (void) do_leave_program (); } + +void virtualdevice_init (void) +{ +#ifdef AUTOCONFIG + rtarea_setup (); +#endif +#ifdef FILESYS + rtarea_init (); + uaeres_install (); + hardfile_install (); +#endif +#ifdef SCSIEMU + scsi_reset (); + scsidev_install (); +#endif +#ifdef SANA2 + netdev_install (); +#endif +#ifdef UAESERIAL + uaeserialdev_install (); +#endif +#ifdef AUTOCONFIG + expansion_init (); +#endif +#ifdef FILESYS + filesys_install (); +#endif +} + static int real_main2 (int argc, TCHAR **argv) { @@ -875,7 +905,7 @@ static int real_main2 (int argc, TCHAR **argv) } #ifdef NATMEM_OFFSET - preinit_shm (); + //preinit_shm (); #endif if (restart_config[0]) @@ -939,34 +969,9 @@ static int real_main2 (int argc, TCHAR **argv) /* force sound settings change */ currprefs.produce_sound = 0; -#ifdef AUTOCONFIG - rtarea_setup (); -#endif -#ifdef FILESYS - rtarea_init (); - uaeres_install (); - hardfile_install (); -#endif savestate_init (); -#ifdef SCSIEMU - scsi_reset (); - scsidev_install (); -#endif -#ifdef SANA2 - netdev_install (); -#endif -#ifdef UAESERIAL - uaeserialdev_install (); -#endif keybuf_init (); /* Must come after init_joystick */ -#ifdef AUTOCONFIG - expansion_init (); -#endif -#ifdef FILESYS - filesys_install (); -#endif - memory_init (); memory_reset (); #ifdef AUTOCONFIG diff --git a/memory.cpp b/memory.cpp index a9b728ac..f083c67d 100644 --- a/memory.cpp +++ b/memory.cpp @@ -39,6 +39,7 @@ int candirect = -1; /* Set by each memory handler that does not simply access real memory. */ int special_mem; #endif +static int mem_hardreset = 3; static bool isdirectjit (void) { @@ -78,12 +79,6 @@ uae_u32 allocated_cardmem; uae_u8 ce_banktype[65536]; uae_u8 ce_cachable[65536]; -#if defined(CPU_64_BIT) -uae_u32 max_z3fastmem = 2048UL * 1024 * 1024; -#else -uae_u32 max_z3fastmem = 512 * 1024 * 1024; -#endif - static size_t bootrom_filepos, chip_filepos, bogo_filepos, rom_filepos, a3000lmem_filepos, a3000hmem_filepos; /* Set if we notice during initialization that settings changed, @@ -1954,8 +1949,10 @@ static shmpiece *find_shmpiece (uae_u8 *base) static void delete_shmmaps (uae_u32 start, uae_u32 size) { +#if 0 if (!needmman ()) return; +#endif while (size) { uae_u8 *base = mem_banks[bankindex (start)]->baseaddr; @@ -2001,8 +1998,10 @@ static void add_shmmaps (uae_u32 start, addrbank *what) shmpiece *y; uae_u8 *base = what->baseaddr; +#if 0 if (!needmman ()) return; +#endif if (!base) return; @@ -2033,10 +2032,12 @@ uae_u8 *mapped_malloc (size_t s, const TCHAR *file) shmpiece *x; static int recurse; +#if 0 if (!needmman ()) { nocanbang (); return xcalloc (uae_u8, s + 4); } +#endif id = shmget (IPC_PRIVATE, s, 0x1ff, file); if (id == -1) { @@ -2391,12 +2392,30 @@ ULONG getz2endaddr (void) return start + 2 * 1024 * 1024; } +void memory_clear (void) +{ + mem_hardreset = 0; + if (savestate_state == STATE_RESTORE) + return; + if (chipmemory) + memset (chipmemory, 0, allocated_chipmem); + if (bogomemory) + memset (bogomemory, 0, allocated_bogomem); + if (a3000lmemory) + memset (a3000lmemory, 0, allocated_a3000lmem); + if (a3000hmemory) + memset (a3000hmemory, 0, allocated_a3000hmem); + expansion_clear (); +} void memory_reset (void) { int bnk, bnk_end; bool gayleorfatgary; + if (mem_hardreset > 2) + memory_init (); + be_cnt = 0; currprefs.chipmem_size = changed_prefs.chipmem_size; currprefs.bogomem_size = changed_prefs.bogomem_size; @@ -2425,9 +2444,11 @@ void memory_reset (void) allocate_memory (); chipmem_setindirect (); - if (_tcscmp (currprefs.romfile, changed_prefs.romfile) != 0 + if (mem_hardreset > 1 + || _tcscmp (currprefs.romfile, changed_prefs.romfile) != 0 || _tcscmp (currprefs.romextfile, changed_prefs.romextfile) != 0) { + protect_roms (false); write_log (_T("ROM loader.. (%s)\n"), currprefs.romfile); kickstart_rom = 1; a1000_handle_kickstart (0); @@ -2486,6 +2507,7 @@ void memory_reset (void) } patch_kick (); write_log (_T("ROM loader end\n")); + protect_roms (true); } if (cloanto_rom && currprefs.maprom < 0x01000000) @@ -2660,11 +2682,17 @@ void memory_reset (void) } #endif #endif + if (mem_hardreset) + memory_clear (); + write_log (_T("memory init end\n")); } + void memory_init (void) { + virtualdevice_init (); + allocated_chipmem = 0; allocated_bogomem = 0; kickmemory = 0; @@ -2690,6 +2718,7 @@ void memory_init (void) currprefs.romextfile[0] = 0; #ifdef ACTION_REPLAY + action_replay_unload (0); action_replay_load (); action_replay_init (1); #ifdef ACTION_REPLAY_HRTMON @@ -2741,19 +2770,10 @@ void memory_cleanup (void) #endif } -void memory_hardreset (void) +void memory_hardreset (int mode) { - if (savestate_state == STATE_RESTORE) - return; - if (chipmemory) - memset (chipmemory, 0, allocated_chipmem); - if (bogomemory) - memset (bogomemory, 0, allocated_bogomem); - if (a3000lmemory) - memset (a3000lmemory, 0, allocated_a3000lmem); - if (a3000hmemory) - memset (a3000hmemory, 0, allocated_a3000hmem); - expansion_clear (); + if (mode + 1 > mem_hardreset) + mem_hardreset = mode + 1; } void map_banks (addrbank *bank, int start, int size, int realsize) diff --git a/newcpu.cpp b/newcpu.cpp index c3022614..b3082176 100644 --- a/newcpu.cpp +++ b/newcpu.cpp @@ -4284,7 +4284,7 @@ void m68k_go (int may_quit) custom_reset (hardreset); m68k_reset (hardreset); if (hardreset) { - memory_hardreset (); + memory_clear (); write_log (_T("hardreset, memory cleared\n")); } #ifdef SAVESTATE diff --git a/od-win32/dinput.cpp b/od-win32/dinput.cpp index 70dac721..6ba4abca 100644 --- a/od-win32/dinput.cpp +++ b/od-win32/dinput.cpp @@ -146,7 +146,7 @@ static bool rawhid_found; static uae_s16 axisold[MAX_INPUT_DEVICES][256]; int no_rawinput = 0; -int no_directinput = 1; +int no_directinput = 0; static int dinput_enum_all; int dinput_winmouse (void) @@ -2570,7 +2570,7 @@ static int di_do_init (void) if (!rawhid_found) rawinput_enabled_hid = 0; - if (!no_directinput) { + if (!no_directinput || !rawinput_enabled_keyboard || !rawinput_enabled_mouse) { hr = DirectInput8Create (hInst, DIRECTINPUT_VERSION, IID_IDirectInput8, (LPVOID *)&g_lpdi, NULL); if (FAILED (hr)) { write_log (_T("DirectInput8Create failed, %s\n"), DXError (hr)); @@ -2587,8 +2587,10 @@ static int di_do_init (void) write_log (_T("DirectInput enumeration.. Pointing devices..\n")); g_lpdi->EnumDevices (DI8DEVCLASS_POINTER, di_enumcallback, 0, DIEDFL_ATTACHEDONLY); } - write_log (_T("DirectInput enumeration.. Game controllers..\n")); - g_lpdi->EnumDevices (DI8DEVCLASS_GAMECTRL, di_enumcallbackj, 0, DIEDFL_ATTACHEDONLY); + if (!no_directinput) { + write_log (_T("DirectInput enumeration.. Game controllers..\n")); + g_lpdi->EnumDevices (DI8DEVCLASS_GAMECTRL, di_enumcallbackj, 0, DIEDFL_ATTACHEDONLY); + } } } } diff --git a/od-win32/direct3d.cpp b/od-win32/direct3d.cpp index afb144c3..1dbaf76f 100644 --- a/od-win32/direct3d.cpp +++ b/od-win32/direct3d.cpp @@ -30,7 +30,9 @@ #include "hq2x_d3d.h" #include "zfile.h" #include "uae.h" + extern int D3DEX, d3ddebug; +int forcedframelatency = -1; #include #include @@ -2315,9 +2317,23 @@ const TCHAR *D3D_init (HWND ahwnd, int w_w, int w_h, int depth, int mmult) write_log (_T("%s: CreateQuery(D3DQUERYTYPE_EVENT) failed: %s\n"), D3DHEAD, D3D_ErrorString (hr)); } if (d3ddevex) { - hr = d3ddevex->SetMaximumFrameLatency (vsync ? 1 : 0); + UINT v = 12345; + hr = d3ddevex->GetMaximumFrameLatency (&v); + //write_log (L"GetMaximumFrameLatency=%d\n", v); + if (FAILED (hr)) { + write_log (_T("%s: GetMaximumFrameLatency() failed: %s\n"), D3DHEAD, D3D_ErrorString (hr)); + v = 1; + } + hr = S_OK; + if (forcedframelatency >= 0) + hr = d3ddevex->SetMaximumFrameLatency (forcedframelatency); + else if (v > 1 || !vsync) + hr = d3ddevex->SetMaximumFrameLatency (vsync ? 1 : 0); if (FAILED (hr)) write_log (_T("%s: SetMaximumFrameLatency() failed: %s\n"), D3DHEAD, D3D_ErrorString (hr)); + //v = 12345; + //hr = d3ddevex->GetMaximumFrameLatency (&v); + //write_log (L"GetMaximumFrameLatency=%d\n", v); } return 0; diff --git a/od-win32/midi.cpp b/od-win32/midi.cpp index b690fdc7..0b7cd4b6 100644 --- a/od-win32/midi.cpp +++ b/od-win32/midi.cpp @@ -48,7 +48,7 @@ //on my system it work ok with 10 but who //know when windows rest for a while //with sysex size of 40 win can 8 sec sleep -#define INBUFFLEN 18000 //if this is not enough a warning come +#define INBUFFLEN 120000 //if this is not enough a warning come int midi_inbuflen = INBUFFLEN; static int overflow,only_one_time; @@ -159,7 +159,7 @@ static void MidiOut_Free(void) for(i = 0; i < out_allocated; i++) { if(outbuffer[i]) { - free(outbuffer[i]); + xfree(outbuffer[i]); outbufferlength[i] = 0; outbuffer[i] = NULL; } diff --git a/od-win32/mman.cpp b/od-win32/mman.cpp index 982962b5..dc58e518 100644 --- a/od-win32/mman.cpp +++ b/od-win32/mman.cpp @@ -14,6 +14,10 @@ #if defined(NATMEM_OFFSET) +#define VAMODE 1 + +uae_u32 max_z3fastmem; + /* JIT can access few bytes outside of memory block of it executes code at the very end of memory block */ #define BARRIER 32 @@ -26,6 +30,7 @@ static uae_u8 *p96mem_offset; static int p96mem_size; static SYSTEM_INFO si; int maxmem; +uae_u32 natmem_size; static uae_u8 *virtualallocwithlock (LPVOID addr, SIZE_T size, DWORD allocationtype, DWORD protect) { @@ -104,9 +109,17 @@ void mman_ResetWatch (PVOID lpBaseAddress, SIZE_T dwRegionSize) static uae_u64 size64; typedef BOOL (CALLBACK* GLOBALMEMORYSTATUSEX)(LPMEMORYSTATUSEX); -void preinit_shm (void) +static void clear_shm (void) +{ + shm_start = NULL; + for (int i = 0; i < MAX_SHMID; i++) { + memset (&shmids[i], 0, sizeof (struct shmid_ds)); + shmids[i].key = -1; + } +} + +bool preinit_shm (void) { - int i; uae_u64 total64; uae_u64 totalphys64; MEMORYSTATUS memstats; @@ -122,7 +135,7 @@ void preinit_shm (void) p96mem_offset = NULL; GetSystemInfo (&si); - max_allowed_mman = 1536; + max_allowed_mman = 512; if (os_64bit) max_allowed_mman = 2048; @@ -154,21 +167,33 @@ void preinit_shm (void) size64 = 8 * 1024 * 1024; if (max_allowed_mman * 1024 * 1024 > size64) max_allowed_mman = size64 / (1024 * 1024); - max_z3fastmem = max_allowed_mman * 1024 * 1024; - if (max_z3fastmem < 512 * 1024 * 1024) - max_z3fastmem = 512 * 1024 * 1024; - shm_start = 0; - for (i = 0; i < MAX_SHMID; i++) { - shmids[i].attached = 0; - shmids[i].key = -1; - shmids[i].size = 0; - shmids[i].addr = NULL; - shmids[i].name[0] = 0; + natmem_size = max_allowed_mman * 1024 * 1024; + if (natmem_size < 256 * 1024 * 1024) + natmem_size = 256 * 1024 * 1024; + + write_log (_T("Total physical RAM %uM\n"), totalphys64 >> 20); + for (;;) { + natmem_offset = (uae_u8*)VirtualAlloc (NULL, natmem_size, MEM_RESERVE | (VAMODE == 1 ? MEM_WRITE_WATCH : 0), PAGE_READWRITE); + if (natmem_offset) + break; + natmem_size -= 128 * 1024 * 1024; + if (!natmem_size) { + write_log (_T("Can't allocate 256M of virtual address space!?\n")); + return false; + } } + max_z3fastmem = natmem_size; + write_log (_T("NATMEM: Our special area: 0x%p-0x%p (%08x %dM)\n"), + natmem_offset, (uae_u8*)natmem_offset + natmem_size, + natmem_size, natmem_size >> 20); + + clear_shm (); + +// write_log (_T("Max Z3FastRAM %dM. Total physical RAM %uM\n"), max_z3fastmem >> 20, totalphys64 >> 20); - write_log (_T("Max Z3FastRAM %dM. Total physical RAM %uM\n"), max_z3fastmem >> 20, totalphys64 >> 20); canbang = 1; + return true; } static void resetmem (void) @@ -187,24 +212,29 @@ static void resetmem (void) continue; if (!s->natmembase) continue; + if (s->fake) + continue; + if (((uae_u8*)s->attached - (uae_u8*)s->natmembase) >= 0x10000000) + continue; shmaddr = natmem_offset + ((uae_u8*)s->attached - (uae_u8*)s->natmembase); result = virtualallocwithlock (shmaddr, size, MEM_COMMIT, PAGE_READWRITE); if (result != shmaddr) - write_log (_T("NATMEM: realloc(%p,%d,%d) failed, err=%x\n"), shmaddr, size, s->mode, GetLastError ()); + write_log (_T("NATMEM: realloc(%p-%p,%d,%d,%s) failed, err=%d\n"), shmaddr, shmaddr + size, size, s->mode, s->name, GetLastError ()); else - write_log (_T("NATMEM: rellocated(%p,%d,%s)\n"), shmaddr, size, s->name); + write_log (_T("NATMEM: rellocated(%p-%p,%d,%s)\n"), shmaddr, shmaddr + size, size, s->name); } } static ULONG getz2rtgaddr (void) { ULONG start; - start = currprefs.fastmem_size; - while (start & (currprefs.rtgmem_size - 1) && start < 4 * 1024 * 1024) + start = changed_prefs.fastmem_size; + while (start & (changed_prefs.rtgmem_size - 1) && start < 4 * 1024 * 1024) start += 1024 * 1024; return start + 2 * 1024 * 1024; } +#if 0 int init_shm (void) { uae_u32 size, totalsize, z3size, natmemsize; @@ -262,11 +292,13 @@ restart: rtgbarrier = 0; rtgextra = 0; } - blah = (uae_u8*)VirtualAlloc (NULL, natmemsize + rtgbarrier + z3chipbarrier + z3rtgmem_size + rtgextra + 16 * si.dwPageSize, MEM_RESERVE, PAGE_READWRITE); + natmem_size = natmemsize + rtgbarrier + z3chipbarrier + z3rtgmem_size + rtgextra + 16 * si.dwPageSize; + blah = (uae_u8*)VirtualAlloc (NULL, natmem_size, MEM_RESERVE, PAGE_READWRITE); if (blah) { natmem_offset = blah; break; } + natmem_size = 0; write_log (_T("NATMEM: %dM area failed to allocate, err=%d (Z3=%dM,RTG=%dM)\n"), natmemsize >> 20, GetLastError (), (currprefs.z3fastmem_size + currprefs.z3fastmem2_size + currprefs.z3chipmem_size) >> 20, z3rtgmem_size >> 20); if (!lowmem ()) { @@ -341,7 +373,209 @@ restart: return canbang; } +#endif + +static uae_u8 *va (uae_u32 offset, uae_u32 len, DWORD alloc, DWORD protect) +{ + uae_u8 *addr; + + addr = (uae_u8*)VirtualAlloc (natmem_offset + offset, len, alloc, protect); + if (addr) { + write_log (_T("VA(%p - %p, %4uM, %s)\n"), + natmem_offset + offset, natmem_offset + offset + len, len >> 20, (alloc & MEM_WRITE_WATCH) ? _T("WATCH") : _T("RESERVED")); + return addr; + } + write_log (_T("VA(%p - %p, %4uM, %s) failed %d\n"), + natmem_offset + offset, natmem_offset + offset + len, len >> 20, (alloc & MEM_WRITE_WATCH) ? _T("WATCH") : _T("RESERVED"), GetLastError ()); + return NULL; +} + +static int doinit_shm (void) +{ + uae_u32 size, totalsize, z3size, natmemsize; + uae_u32 rtgbarrier, z3chipbarrier, rtgextra; + int rounds = 0; + ULONG z3rtgmem_size = changed_prefs.rtgmem_type ? changed_prefs.rtgmem_size : 0; + for (;;) { + int lowround = 0; + uae_u8 *blah = NULL; + if (rounds > 0) + write_log (_T("NATMEM: retrying %d..\n"), rounds); + rounds++; + + z3size = 0; + size = 0x1000000; + rtgextra = 0; + z3chipbarrier = 0; + rtgbarrier = si.dwPageSize; + if (changed_prefs.cpu_model >= 68020) + size = 0x10000000; + if (changed_prefs.z3fastmem_size || changed_prefs.z3fastmem2_size || changed_prefs.z3chipmem_size) { + z3size = changed_prefs.z3fastmem_size + changed_prefs.z3fastmem2_size + changed_prefs.z3chipmem_size + (changed_prefs.z3fastmem_start - 0x10000000); + if (z3rtgmem_size) { + rtgbarrier = 16 * 1024 * 1024 - ((changed_prefs.z3fastmem_size + changed_prefs.z3fastmem2_size) & 0x00ffffff); + } + if (changed_prefs.z3chipmem_size && (changed_prefs.z3fastmem_size || changed_prefs.z3fastmem2_size)) + z3chipbarrier = 16 * 1024 * 1024; + } else { + rtgbarrier = 0; + } + totalsize = size + z3size + z3rtgmem_size; + while (totalsize > size64) { + int change = lowmem (); + if (!change) + return 0; + write_log (_T("NATMEM: %d, %dM > %dM = %dM\n"), ++lowround, totalsize >> 20, size64 >> 20, (totalsize - change) >> 20); + totalsize -= change; + } + if ((rounds > 1 && totalsize < 0x10000000) || rounds > 20) { + write_log (_T("NATMEM: No special area could be allocated (3)!\n")); + return 0; + } + natmemsize = size + z3size; + + if (z3rtgmem_size) { + rtgextra = si.dwPageSize; + } else { + rtgbarrier = 0; + rtgextra = 0; + } + if (natmemsize + rtgbarrier + z3chipbarrier + z3rtgmem_size + rtgextra + 16 * si.dwPageSize <= natmem_size) + break; + write_log (_T("NATMEM: %dM area failed to allocate, err=%d (Z3=%dM,RTG=%dM)\n"), + natmemsize >> 20, GetLastError (), (changed_prefs.z3fastmem_size + changed_prefs.z3fastmem2_size + changed_prefs.z3chipmem_size) >> 20, z3rtgmem_size >> 20); + if (!lowmem ()) { + write_log (_T("NATMEM: No special area could be allocated (2)!\n")); + return 0; + } + } + +#if VAMODE == 1 + + p96mem_offset = NULL; + p96mem_size = z3rtgmem_size; + if (changed_prefs.rtgmem_size && changed_prefs.rtgmem_type) { + p96mem_offset = natmem_offset + natmemsize + rtgbarrier + z3chipbarrier; + } else if (changed_prefs.rtgmem_size && !changed_prefs.rtgmem_type) { + p96mem_offset = natmem_offset + getz2rtgaddr (); + } + +#else + + if (p96mem_offset) + VirtualFree (p96mem_offset, 0, MEM_RELEASE); + p96mem_offset = NULL; + p96mem_size = z3rtgmem_size; + if (changed_prefs.rtgmem_size && changed_prefs.rtgmem_type) { + uae_u32 s, l; + VirtualFree (natmem_offset, 0, MEM_RELEASE); + + s = 0; + l = natmemsize + rtgbarrier + z3chipbarrier; + if (!va (s, l, MEM_RESERVE, PAGE_READWRITE)) + return 0; + + s = natmemsize + rtgbarrier + z3chipbarrier; + l = p96mem_size + rtgextra; + p96mem_offset = va (s, l, MEM_RESERVE | MEM_WRITE_WATCH, PAGE_READWRITE); + if (!p96mem_offset) { + currprefs.rtgmem_size = changed_prefs.rtgmem_size = 0; + z3rtgmem_size = 0; + write_log (_T("NATMEM: failed to allocate special Picasso96 GFX RAM, err=%d\n"), GetLastError ()); + } + +#if 0 + s = natmemsize + rtgbarrier + z3chipbarrier + p96mem_size + rtgextra + 4096; + l = natmem_size - s - 4096; + if (natmem_size > l) { + if (!va (s, l, MEM_RESERVE, PAGE_READWRITE)) + return 0; + } +#endif + + } else if (changed_prefs.rtgmem_size && !changed_prefs.rtgmem_type) { + + uae_u32 s, l; + VirtualFree (natmem_offset, 0, MEM_RELEASE); + // Chip + Z2Fast + s = 0; + l = 2 * 1024 * 1024 + changed_prefs.fastmem_size; + if (!va (s, l, MEM_RESERVE, PAGE_READWRITE)) { + currprefs.rtgmem_size = changed_prefs.rtgmem_size = 0; + } + // After RTG + s = 2 * 1024 * 1024 + 8 * 1024 * 1024; + l = natmem_size - (2 * 1024 * 1024 + 8 * 1024 * 1024) + si.dwPageSize; + if (!va (s, l, MEM_RESERVE, PAGE_READWRITE)) { + currprefs.rtgmem_size = changed_prefs.rtgmem_size = 0; + } + // RTG + s = getz2rtgaddr (); + l = 10 * 1024 * 1024 - getz2rtgaddr (); + p96mem_offset = va (s, l, MEM_RESERVE | MEM_WRITE_WATCH, PAGE_READWRITE); + if (!p96mem_offset) { + currprefs.rtgmem_size = changed_prefs.rtgmem_size = 0; + } + + } else { + + VirtualFree (natmem_offset, 0, MEM_RELEASE); + if (!VirtualAlloc (natmem_offset, natmem_size, MEM_RESERVE, PAGE_READWRITE)) { + write_log (_T("NATMEM: No special area could be reallocated! (1) err=%d\n"), GetLastError ()); + return 0; + } + } +#endif + if (!natmem_offset) { + write_log (_T("NATMEM: No special area could be allocated! err=%d\n"), GetLastError ()); + } else { + write_log (_T("NATMEM: Our special area: 0x%p-0x%p (%08x %dM)\n"), + natmem_offset, (uae_u8*)natmem_offset + natmemsize, + natmemsize, natmemsize >> 20); + if (changed_prefs.rtgmem_size) + write_log (_T("NATMEM: P96 special area: 0x%p-0x%p (%08x %dM)\n"), + p96mem_offset, (uae_u8*)p96mem_offset + changed_prefs.rtgmem_size, + changed_prefs.rtgmem_size, changed_prefs.rtgmem_size >> 20); + canbang = 1; + if (p96mem_size) + natmem_offset_end = p96mem_offset + p96mem_size; + else + natmem_offset_end = natmem_offset + natmemsize; + } + + return canbang; +} + +bool init_shm (void) +{ + static uae_u32 oz3fastmem_size, oz3fastmem2_size; + static uae_u32 oz3chipmem_size; + static uae_u32 ortgmem_size; + static int ortgmem_type; + + if ( + oz3fastmem_size == changed_prefs.z3fastmem_size && + oz3fastmem2_size == changed_prefs.z3fastmem2_size && + oz3chipmem_size == changed_prefs.z3chipmem_size && + ortgmem_size == changed_prefs.rtgmem_size && + ortgmem_type == changed_prefs.rtgmem_type) + return false; + + oz3fastmem_size = changed_prefs.z3fastmem_size; + oz3fastmem2_size = changed_prefs.z3fastmem2_size; + oz3chipmem_size = changed_prefs.z3chipmem_size;; + ortgmem_size = changed_prefs.rtgmem_size; + ortgmem_type = changed_prefs.rtgmem_type; + + doinit_shm (); + + resetmem (); + clear_shm (); + + memory_hardreset (2); + return true; +} void mapped_free (uae_u8 *mem) { @@ -513,6 +747,7 @@ void *shmat (int shmid, void *shmaddr, int shmflg) filesysptr = xcalloc (uae_u8, size); result = filesysptr; shmids[shmid].attached = result; + shmids[shmid].fake = true; return result; } if(!_tcscmp (shmids[shmid].name, _T("custmem1"))) { @@ -589,12 +824,12 @@ void *shmat (int shmid, void *shmaddr, int shmflg) result = virtualallocwithlock (shmaddr, size, MEM_COMMIT, PAGE_READWRITE); if (result == NULL) { result = (void*)-1; - write_log (_T("VirtualAlloc %08X - %08X %x (%dk) failed %d\n"), + write_log (_T("VA %08X - %08X %x (%dk) failed %d\n"), (uae_u8*)shmaddr - natmem_offset, (uae_u8*)shmaddr - natmem_offset + size, size, size >> 10, GetLastError ()); } else { shmids[shmid].attached = result; - write_log (_T("VirtualAlloc %08X - %08X %x (%dk) ok (%08X)%s\n"), + write_log (_T("VA %08X - %08X %x (%dk) ok (%08X)%s\n"), (uae_u8*)shmaddr - natmem_offset, (uae_u8*)shmaddr - natmem_offset + size, size, size >> 10, shmaddr, p96special ? _T(" P96") : _T("")); } @@ -614,7 +849,7 @@ void protect_roms (bool protect) if (shm->mode != PAGE_READONLY) continue; if (!VirtualProtect (shm->attached, shm->rosize, protect ? PAGE_READONLY : PAGE_READWRITE, &old)) { - write_log (_T("VirtualProtect %08X - %08X %x (%dk) failed %d\n"), + write_log (_T("VP %08X - %08X %x (%dk) failed %d\n"), (uae_u8*)shm->attached - natmem_offset, (uae_u8*)shm->attached - natmem_offset + shm->size, shm->size, shm->size >> 10, GetLastError ()); } diff --git a/od-win32/resources/resource b/od-win32/resources/resource index 8f081569..4314520e 100644 --- a/od-win32/resources/resource +++ b/od-win32/resources/resource @@ -425,6 +425,8 @@ #define IDC_MBRAM2 1051 #define IDC_Z3CHIPMEM 1052 #define IDC_Z3CHIPRAM 1053 +#define IDC_Z3CHIPRAM2 1054 +#define IDC_MAX32RAM 1054 #define IDC_UAEHOME 1070 #define IDC_PICASSOHOME 1071 #define IDC_AMIGAHOME 1072 @@ -1060,7 +1062,6 @@ #define IDC_DF1WPTEXTQ 1794 #define IDC_RTG_Z2Z3 1794 #define IDC_RTG_BUFFERCNT 1795 -#define IDC_RTG_SCALE_ALLOW2 1796 #define IDC_RTG_VBINTERRUPT 1796 #define IDC_INPUTMAPLIST 1797 #define IDC_PORT1_REMAP 1798 diff --git a/od-win32/resources/winuae.rc b/od-win32/resources/winuae.rc index 15ffe6df..69657767 100644 --- a/od-win32/resources/winuae.rc +++ b/od-win32/resources/winuae.rc @@ -157,12 +157,12 @@ BEGIN CONTROL "",IDC_RATE2ENABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,194,193,8,10 END -IDD_MEMORY DIALOGEX 0, 0, 300, 182 +IDD_MEMORY DIALOGEX 0, 0, 300, 205 STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD EXSTYLE WS_EX_CONTEXTHELP FONT 8, "MS Sans Serif", 0, 0, 0x1 BEGIN - GROUPBOX "Memory Settings",IDC_STATIC,14,7,274,97 + GROUPBOX "Memory Settings",IDC_STATIC,14,7,274,117 CONTROL "Slider1",IDC_CHIPMEM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,54,22,50,20 EDITTEXT IDC_CHIPRAM,105,25,34,12,ES_CENTER | ES_READONLY CONTROL "Slider1",IDC_SLOWMEM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,179,22,60,20 @@ -171,13 +171,13 @@ BEGIN EDITTEXT IDC_FASTRAM,105,53,34,12,ES_CENTER | ES_READONLY CONTROL "Slider1",IDC_Z3FASTMEM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,179,47,60,20 EDITTEXT IDC_Z3FASTRAM,243,50,34,12,ES_CENTER | ES_READONLY - GROUPBOX "A3000/A4000 Advanced Memory Settings",IDC_STATIC,14,110,274,65 - RTEXT "Motherboard Fast:",IDC_STATIC,48,126,129,10,SS_CENTERIMAGE - CONTROL "",IDC_MBMEM1,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,181,122,59,20 - EDITTEXT IDC_MBRAM1,244,125,34,12,ES_CENTER | ES_READONLY - RTEXT "Processor Slot Fast:",IDC_STATIC,48,149,129,10,SS_CENTERIMAGE - CONTROL "",IDC_MBMEM2,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,181,145,59,20 - EDITTEXT IDC_MBRAM2,244,148,34,12,ES_CENTER | ES_READONLY + GROUPBOX "A3000/A4000 Advanced Memory Settings",IDC_STATIC,14,131,274,65 + RTEXT "Motherboard Fast:",IDC_STATIC,48,147,129,10,SS_CENTERIMAGE + CONTROL "",IDC_MBMEM1,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,181,143,59,20 + EDITTEXT IDC_MBRAM1,244,146,34,12,ES_CENTER | ES_READONLY + RTEXT "Processor Slot Fast:",IDC_STATIC,48,170,129,10,SS_CENTERIMAGE + CONTROL "",IDC_MBMEM2,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,181,166,59,20 + EDITTEXT IDC_MBRAM2,244,169,34,12,ES_CENTER | ES_READONLY RTEXT "Fast:",IDC_STATIC,19,49,32,15,SS_CENTERIMAGE RTEXT "Chip:",IDC_STATIC,19,25,32,15,SS_CENTERIMAGE RTEXT "Slow:",IDC_STATIC,144,25,32,15,SS_CENTERIMAGE @@ -186,6 +186,7 @@ BEGIN CONTROL "",IDC_Z3CHIPMEM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,179,71,60,20 EDITTEXT IDC_Z3CHIPRAM,243,76,34,12,ES_CENTER | ES_READONLY CONTROL "Autoconfig Fast RAM",IDC_FASTMEMAUTOCONFIG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,29,76,101,10 + EDITTEXT IDC_MAX32RAM,29,98,249,12,ES_CENTER | ES_READONLY END IDD_CPU DIALOGEX 0, 0, 300, 241 diff --git a/od-win32/sounddep/sound.cpp b/od-win32/sounddep/sound.cpp index ea2157ab..d8aa9a40 100644 --- a/od-win32/sounddep/sound.cpp +++ b/od-win32/sounddep/sound.cpp @@ -510,7 +510,7 @@ void set_volume_sound_device (struct sound_data *sd, int volume, int mute) hr = IDirectSoundBuffer_SetVolume (s->lpDSBsecondary, vol); if (FAILED (hr)) write_log (_T("DS: SetVolume(%d) failed: %s\n"), vol, DXError (hr)); - } else if (sd->devicetype == SOUND_DEVICE_WASAPI || sd->devicetype == SOUND_DEVICE_WASAPI_EXCLUSIVE) { + } else if (sd->devicetype == SOUND_DEVICE_WASAPI) { if (s->pAudioVolume) { float vol = 0.0; if (volume < 100 && !mute) @@ -526,7 +526,20 @@ void set_volume_sound_device (struct sound_data *sd, int volume, int mute) s->pavolume = volume; } else if (sd->devicetype == SOUND_DEVICE_XAUDIO2) { s->xmaster->SetVolume (mute ? 0.0 : (float)(100 - volume) / 100.0); + } else if (sd->devicetype == SOUND_DEVICE_WASAPI_EXCLUSIVE) { + sd->softvolume = -1; + hr = s->pAudioVolume->SetMasterVolume (1.0, NULL); + if (FAILED (hr)) + write_log (_T("AudioVolume->SetMasterVolume(1.0) failed: %08Xs\n"), hr); + if (volume < 100 && !mute) { + sd->softvolume = (100 - volume) * 32768 / 100.0; + if (sd->softvolume >= 32768) + sd->softvolume = -1; + } + if (mute || volume >= 100) + sd->softvolume = 0; } + } void set_volume (int volume, int mute) @@ -1087,9 +1100,9 @@ static int open_audio_wasapi (struct sound_data *sd, int index, int exclusive) LPWSTR name = NULL; int rn[4], rncnt; AUDCLNT_SHAREMODE sharemode; - int size, v; + int v; - sd->devicetype = SOUND_DEVICE_WASAPI; + sd->devicetype = exclusive ? SOUND_DEVICE_WASAPI_EXCLUSIVE : SOUND_DEVICE_WASAPI; s->wasapiexclusive = exclusive; if (s->wasapiexclusive) @@ -1213,10 +1226,7 @@ static int open_audio_wasapi (struct sound_data *sd, int index, int exclusive) } sd->samplesize = sd->channels * 16 / 8; - size = sd->sndbufsize * sd->samplesize; - s->snd_configsize = size; - sd->sndbufsize = size / 32; - size /= sd->samplesize; + s->snd_configsize = sd->sndbufsize * sd->samplesize; s->bufferFrameCount = (UINT32)( // frames = 1.0 * s->hnsRequestedDuration * // hns * @@ -1225,8 +1235,8 @@ static int open_audio_wasapi (struct sound_data *sd, int index, int exclusive) 10000 // (hns / s) / + 0.5); // rounding - if (s->bufferFrameCount < size) { - s->bufferFrameCount = size; + if (s->bufferFrameCount < sd->sndbufsize) { + s->bufferFrameCount = sd->sndbufsize; s->hnsRequestedDuration = // hns = (REFERENCE_TIME)( 10000.0 * // (hns / ms) * @@ -1304,6 +1314,7 @@ static int open_audio_wasapi (struct sound_data *sd, int index, int exclusive) } } #endif + sd->sndbufsize = (s->bufferFrameCount / 8) * sd->samplesize; v = s->bufferFrameCount * sd->samplesize; v /= 2; if (sd->sndbufsize > v) @@ -1565,6 +1576,7 @@ static int open_sound (void) if (size < 64) size = 64; + sdp->softvolume = -1; num = enumerate_sound_devices (); if (currprefs.win32_soundcard >= num) currprefs.win32_soundcard = changed_prefs.win32_soundcard = 0; @@ -2201,6 +2213,12 @@ void send_sound (struct sound_data *sd, uae_u16 *sndbuffer) return; if (sd->paused) return; + if (sd->softvolume >= 0) { + uae_s16 *p = (uae_s16*)sndbuffer; + for (int i = 0; i < sd->sndbufsize / 2; i++) { + p[i] = p[i] * sd->softvolume / 32768; + } + } if (type == SOUND_DEVICE_AL) finish_sound_buffer_al (sd, sndbuffer); else if (type == SOUND_DEVICE_DS) diff --git a/od-win32/sounddep/sound.h b/od-win32/sounddep/sound.h index a0209014..908e0975 100644 --- a/od-win32/sounddep/sound.h +++ b/od-win32/sounddep/sound.h @@ -42,6 +42,7 @@ struct sound_data int samplesize; int sndbufsize; int sndbufframes; + int softvolume; struct sound_dp *data; }; diff --git a/od-win32/sys/mman.h b/od-win32/sys/mman.h index 1e5d49b5..4e3fbabd 100644 --- a/od-win32/sys/mman.h +++ b/od-win32/sys/mman.h @@ -12,21 +12,22 @@ #define MAX_SHMID 256 -extern uae_u8 *natmem_offset, *natmem_offset_end; +extern uae_u8 *natmem_offset; typedef int key_t; typedef USHORT ushort; /* One shmid data structure for each shared memory segment in the system. */ struct shmid_ds { - key_t key; + key_t key; size_t size; size_t rosize; - void *addr; - TCHAR name[MAX_PATH]; - void *attached; - int mode; - void *natmembase; + void *addr; + TCHAR name[MAX_PATH]; + void *attached; + int mode; + void *natmembase; + bool fake; }; int mprotect (void *addr, size_t len, int prot); @@ -34,7 +35,7 @@ void *shmat (int shmid, LPVOID shmaddr, int shmflg); int shmdt (const void *shmaddr); int shmget (key_t key, size_t size, int shmflg, const TCHAR*); int shmctl (int shmid, int cmd, struct shmid_ds *buf); -int init_shm (void); +bool init_shm (void); #define PROT_READ 0x01 #define PROT_WRITE 0x02 diff --git a/od-win32/win32.cpp b/od-win32/win32.cpp index 476b146b..0658712e 100644 --- a/od-win32/win32.cpp +++ b/od-win32/win32.cpp @@ -4573,7 +4573,7 @@ extern int debug_rtg_blitter; extern int log_bsd; extern int inputdevice_logging; extern int vsync_modechangetimeout; - +extern int forcedframelatency; extern DWORD_PTR cpu_affinity, cpu_paffinity; static DWORD_PTR original_affinity = -1; @@ -4949,6 +4949,10 @@ static int parseargs (const TCHAR *argx, const TCHAR *np, const TCHAR *np2) extraframewait = getval (np); return 2; } + if (!_tcscmp (arg, _T("framelatency"))) { + forcedframelatency = getval (np); + return 2; + } #ifdef RETROPLATFORM if (!_tcscmp (arg, _T("rphost"))) { rp_param = my_strdup (np); @@ -5151,7 +5155,7 @@ static int PASCAL WinMain2 (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR for (i = 0; argv2[i]; i++) write_log (_T("%d: '%s'\n"), i + 1, argv2[i]); } - if (WIN32_RegisterClasses () && WIN32_InitLibraries ()) { + if (preinit_shm () && WIN32_RegisterClasses () && WIN32_InitLibraries ()) { DWORD i; #ifdef RETROPLATFORM diff --git a/od-win32/win32.h b/od-win32/win32.h index 1502845c..72219b3d 100644 --- a/od-win32/win32.h +++ b/od-win32/win32.h @@ -19,8 +19,8 @@ #define LANG_DLL 1 //#define WINUAEBETA _T("") -#define WINUAEBETA _T("6") -#define WINUAEDATE MAKEBD(2012, 7, 10) +#define WINUAEBETA _T("7") +#define WINUAEDATE MAKEBD(2012, 7, 20) #define WINUAEEXTRA _T("") //#define WINUAEEXTRA _T("AmiKit Preview") #define WINUAEREV _T("") diff --git a/od-win32/win32gfx.cpp b/od-win32/win32gfx.cpp index bcf4cc9b..6f9df93b 100644 --- a/od-win32/win32gfx.cpp +++ b/od-win32/win32gfx.cpp @@ -1270,6 +1270,7 @@ static void closeblankwindows (void) if (h) { ShowWindow (h, SW_HIDE); DestroyWindow (h); + blankwindows[i] = NULL; } } } diff --git a/od-win32/win32gui.cpp b/od-win32/win32gui.cpp index 2e8dcf1a..27c62abb 100644 --- a/od-win32/win32gui.cpp +++ b/od-win32/win32gui.cpp @@ -6649,7 +6649,7 @@ static void enable_for_memorydlg (HWND hDlg) ew (hDlg, IDC_MBRAM2, z3); ew (hDlg, IDC_MBMEM2, z3); - ew (hDlg, IDC_RTG_Z2Z3, full_property_sheet); + ew (hDlg, IDC_RTG_Z2Z3, z3); ew (hDlg, IDC_RTG_8BIT, rtg); ew (hDlg, IDC_RTG_16BIT, rtg); ew (hDlg, IDC_RTG_24BIT, rtg); @@ -6663,6 +6663,25 @@ static void enable_for_memorydlg (HWND hDlg) ew (hDlg, IDC_RTG_DISPLAYSELECT, rtg2); } +extern uae_u32 natmem_size; +static void setmax32bitram (HWND hDlg) +{ + TCHAR tmp[100]; + uae_u32 size; + + size = workprefs.z3fastmem_size + workprefs.z3fastmem2_size + + workprefs.z3chipmem_size + workprefs.rtgmem_size; + if (workprefs.z3chipmem_size && workprefs.z3fastmem_size) + size += 16 * 1024 * 1024; + if ((workprefs.z3fastmem_size || workprefs.z3chipmem_size) && workprefs.rtgmem_size) + size += 16 * 1024 * 1024; + + _stprintf (tmp, L"Total configured 32-bit RAM: %dM, reserved: %dM", + size / (1024 * 1024), (natmem_size - 256 * 1024 * 1024) / (1024 * 1024)); + SetDlgItemText (hDlg, IDC_MAX32RAM, tmp); +} + + static int manybits (int v, int mask) { int i, cnt; @@ -6893,6 +6912,9 @@ static void values_to_memorydlg (HWND hDlg) } SendDlgItemMessage (hDlg, IDC_MBMEM2, TBM_SETPOS, TRUE, mem_size); SetDlgItemText (hDlg, IDC_MBRAM2, memsize_names[msi_gfx[mem_size]]); + + setmax32bitram (hDlg); + } static void fix_values_memorydlg (void) @@ -9022,6 +9044,8 @@ static void inithardfile (HWND hDlg) SendDlgItemMessage (hDlg, IDC_HF_TYPE, CB_RESETCONTENT, 0, 0); WIN32GUI_LoadUIString (IDS_HF_FS_CUSTOM, tmp, sizeof (tmp) / sizeof (TCHAR)); SendDlgItemMessage (hDlg, IDC_HF_TYPE, CB_ADDSTRING, 0, (LPARAM)_T("OFS/FFS/RDB")); + SendDlgItemMessage (hDlg, IDC_HF_TYPE, CB_ADDSTRING, 0, (LPARAM)_T("PFS3")); + SendDlgItemMessage (hDlg, IDC_HF_TYPE, CB_ADDSTRING, 0, (LPARAM)_T("PDS3")); SendDlgItemMessage (hDlg, IDC_HF_TYPE, CB_ADDSTRING, 0, (LPARAM)_T("SFS")); SendDlgItemMessage (hDlg, IDC_HF_TYPE, CB_ADDSTRING, 0, (LPARAM)tmp); SendDlgItemMessage (hDlg, IDC_HF_TYPE, CB_SETCURSEL, 0, 0); @@ -9029,10 +9053,21 @@ static void inithardfile (HWND hDlg) static void sethfdostype (HWND hDlg, int idx) { - if (idx == 1) + switch (idx) + { + case 1: + SetDlgItemText (hDlg, IDC_HF_DOSTYPE, _T("0x50465300")); + break; + case 2: + SetDlgItemText (hDlg, IDC_HF_DOSTYPE, _T("0x50445300")); + break; + case 3: SetDlgItemText (hDlg, IDC_HF_DOSTYPE, _T("0x53465300")); - else + break; + default: SetDlgItemText (hDlg, IDC_HF_DOSTYPE, _T("")); + break; + } } static void hardfile_testrdb (HWND hDlg, struct hfdlg_vals *hdf) @@ -14664,6 +14699,17 @@ static int init_page (int tmpl, int icon, int title, } static RECT dialog_rect; +static bool dodialogmousemove (void) +{ + if (full_property_sheet || isfullscreen () <= 0) + return false; + for (int i = 0; Displays[i].monitorid; i++) { + struct MultiDisplay *md = &Displays[i]; + if (md->rect.right - md->rect.left >= 640 && md->rect.bottom - md->rect.top >= 480) + return false; + } + return true; +} static void dialogmousemove (HWND hDlg) { @@ -14676,7 +14722,7 @@ static void dialogmousemove (HWND hDlg) int xstart, ystart; MONITORINFOEX pmi; - if (full_property_sheet || isfullscreen () <= 0) + if (!dodialogmousemove ()) return; pmi.cbSize = sizeof (pmi); GetMonitorInfo (MonitorFromWindow (hAmigaWnd, MONITOR_DEFAULTTOPRIMARY), (LPMONITORINFO)&pmi); diff --git a/od-win32/winuaechangelog.txt b/od-win32/winuaechangelog.txt index 93d606c9..6547e21a 100644 --- a/od-win32/winuaechangelog.txt +++ b/od-win32/winuaechangelog.txt @@ -1,6 +1,23 @@ - restore only single input target to default. +Beta 7: + +- Directory filesystem 64-bit seek (ACTION_CHANGE_FILE_POSITION64) broke in 240b27 +- -nodirectinput mode was always enabled. (b6) +- -nodirectinput does not anymore disable mouse/keyboard directinput enumeration if rawinput fails to initialize. +- Syncronize clock enabled and loading new config crashed in some situations (b6) +- Blitter emulation didn't leave correct data in blitter's B data register after linedraw finished, fixes + No Way demo by Academy that seems to use wrong minterm that requires correct static value in B data register. +- WASAPI exclusive software volume control support. It seems normal WASAPI volume control does nothing in exclusive mode. +- Added support for unimplemented integer instructions to 68k emulation code generators. Not yet in use. + (This is easy part, unimplemented floating point support is very difficult because it requires special FPU stack frame) + +- Experimental memory space rewrite. Now WinUAE reserves address space as much as possible (~1.6G if 64-bit OS, 512M if 32-bit, note + that this is only reserved space, actual memory is not yet allocated). Allows more stable on the fly memory size changes. + It is not guaranteed that this is safe to use and won't cause side-effects or other bad behavior or loss of performance, + please test and report. + Beta 6: - PC raw MFM decoding improved (uaeunp, Amiga/ST/PC multiformat PC images didn't decode properly) diff --git a/table68k b/table68k index 59988bdf..8d0a165a 100644 --- a/table68k +++ b/table68k @@ -36,8 +36,13 @@ % 2: 68020 % 3: 68030 % 4: 68040 -% 5: 68060 (not used to produce a cputbl) +% 5: 68060 % [Everything from 68020 possibly allows for FPU emulation] +% Unimplemented after: +% 0: Normal +% 3: Not implemented in 68030 and later +% 4: Not implemented in 68040 and later +% 5: Not implemented in 68060 % privilege level 0: not privileged % 1: unprivileged only on 68000 (check regs.s) % 2: privileged (check regs.s) @@ -61,219 +66,219 @@ % instruction % -0000 0000 0011 1100:00:XNZVC:XNZVC:10: ORSR.B #1 -0000 0000 0111 1100:02:?????:?????:10: ORSR.W #1 -0000 0zz0 11ss sSSS:20:?????:?????:11: CHK2.z #1,s[!Dreg,Areg,Aipi,Apdi,Immd] -0000 0000 zzdd dDDD:00:-NZ00:-----:13: OR.z #z,d[!Areg] -0000 0010 0011 1100:00:XNZVC:XNZVC:10: ANDSR.B #1 -0000 0010 0111 1100:02:?????:?????:10: ANDSR.W #1 -0000 0010 zzdd dDDD:00:-NZ00:-----:13: AND.z #z,d[!Areg] -0000 0100 zzdd dDDD:00:XNZVC:-----:13: SUB.z #z,d[!Areg] -0000 0110 zzdd dDDD:00:XNZVC:-----:13: ADD.z #z,d[!Areg] -0000 0110 11ss sSSS:20:?????:?????:10: CALLM s[!Dreg,Areg,Aipi,Apdi,Immd] -0000 0110 11ss sSSS:20:?????:?????:10: RTM s[Dreg,Areg] -0000 1000 00ss sSSS:00:--Z--:-----:11: BTST #1,s[!Areg] -0000 1000 01ss sSSS:00:--Z--:-----:13: BCHG #1,s[!Areg,Immd] -0000 1000 10ss sSSS:00:--Z--:-----:13: BCLR #1,s[!Areg,Immd] -0000 1000 11ss sSSS:00:--Z--:-----:13: BSET #1,s[!Areg,Immd] -0000 1010 0011 1100:00:XNZVC:XNZVC:10: EORSR.B #1 -0000 1010 0111 1100:02:?????:?????:10: EORSR.W #1 -0000 1010 zzdd dDDD:00:-NZ00:-----:13: EOR.z #z,d[!Areg] -0000 1100 zzss sSSS:00:-NZVC:-----:11: CMP.z #z,s[!Areg,Immd] +0000 0000 0011 1100:000:XNZVC:XNZVC:10: ORSR.B #1 +0000 0000 0111 1100:002:?????:?????:10: ORSR.W #1 +0000 0zz0 11ss sSSS:250:?????:?????:11: CHK2.z #1,s[!Dreg,Areg,Aipi,Apdi,Immd] +0000 0000 zzdd dDDD:000:-NZ00:-----:13: OR.z #z,d[!Areg] +0000 0010 0011 1100:000:XNZVC:XNZVC:10: ANDSR.B #1 +0000 0010 0111 1100:002:?????:?????:10: ANDSR.W #1 +0000 0010 zzdd dDDD:000:-NZ00:-----:13: AND.z #z,d[!Areg] +0000 0100 zzdd dDDD:000:XNZVC:-----:13: SUB.z #z,d[!Areg] +0000 0110 zzdd dDDD:000:XNZVC:-----:13: ADD.z #z,d[!Areg] +0000 0110 11ss sSSS:230:?????:?????:10: CALLM s[!Dreg,Areg,Aipi,Apdi,Immd] +0000 0110 11ss sSSS:230:?????:?????:10: RTM s[Dreg,Areg] +0000 1000 00ss sSSS:000:--Z--:-----:11: BTST #1,s[!Areg] +0000 1000 01ss sSSS:000:--Z--:-----:13: BCHG #1,s[!Areg,Immd] +0000 1000 10ss sSSS:000:--Z--:-----:13: BCLR #1,s[!Areg,Immd] +0000 1000 11ss sSSS:000:--Z--:-----:13: BSET #1,s[!Areg,Immd] +0000 1010 0011 1100:000:XNZVC:XNZVC:10: EORSR.B #1 +0000 1010 0111 1100:002:?????:?????:10: EORSR.W #1 +0000 1010 zzdd dDDD:000:-NZ00:-----:13: EOR.z #z,d[!Areg] +0000 1100 zzss sSSS:000:-NZVC:-----:11: CMP.z #z,s[!Areg,Immd] -0000 1010 11ss sSSS:20:?????:?????:13: CAS.B #1,s[!Dreg,Areg,Immd,PC8r,PC16] -0000 1100 11ss sSSS:20:?????:?????:13: CAS.W #1,s[!Dreg,Areg,Immd,PC8r,PC16] -0000 1100 1111 1100:20:?????:?????:10: CAS2.W #2 -0000 1110 zzss sSSS:22:?????:?????:13: MOVES.z #1,s[!Dreg,Areg,Immd,PC8r,PC16] -0000 1110 11ss sSSS:20:?????:?????:13: CAS.L #1,s[!Dreg,Areg,Immd,PC8r,PC16] -0000 1110 1111 1100:20:?????:?????:10: CAS2.L #2 +0000 1010 11ss sSSS:200:?????:?????:13: CAS.B #1,s[!Dreg,Areg,Immd,PC8r,PC16] +0000 1100 11ss sSSS:200:?????:?????:13: CAS.W #1,s[!Dreg,Areg,Immd,PC8r,PC16] +0000 1100 1111 1100:250:?????:?????:10: CAS2.W #2 +0000 1110 zzss sSSS:202:?????:?????:13: MOVES.z #1,s[!Dreg,Areg,Immd,PC8r,PC16] +0000 1110 11ss sSSS:250:?????:?????:13: CAS.L #1,s[!Dreg,Areg,Immd,PC8r,PC16] +0000 1110 1111 1100:250:?????:?????:10: CAS2.L #2 -0000 rrr1 00dd dDDD:00:-----:-----:12: MVPMR.W d[Areg-Ad16],Dr -0000 rrr1 01dd dDDD:00:-----:-----:12: MVPMR.L d[Areg-Ad16],Dr -0000 rrr1 10dd dDDD:00:-----:-----:12: MVPRM.W Dr,d[Areg-Ad16] -0000 rrr1 11dd dDDD:00:-----:-----:12: MVPRM.L Dr,d[Areg-Ad16] -0000 rrr1 00ss sSSS:00:--Z--:-----:11: BTST Dr,s[!Areg] -0000 rrr1 01ss sSSS:00:--Z--:-----:13: BCHG Dr,s[!Areg,Immd] -0000 rrr1 10ss sSSS:00:--Z--:-----:13: BCLR Dr,s[!Areg,Immd] -0000 rrr1 11ss sSSS:00:--Z--:-----:13: BSET Dr,s[!Areg,Immd] +0000 rrr1 00dd dDDD:000:-----:-----:12: MVPMR.W d[Areg-Ad16],Dr +0000 rrr1 01dd dDDD:000:-----:-----:12: MVPMR.L d[Areg-Ad16],Dr +0000 rrr1 10dd dDDD:000:-----:-----:12: MVPRM.W Dr,d[Areg-Ad16] +0000 rrr1 11dd dDDD:000:-----:-----:12: MVPRM.L Dr,d[Areg-Ad16] +0000 rrr1 00ss sSSS:000:--Z--:-----:11: BTST Dr,s[!Areg] +0000 rrr1 01ss sSSS:000:--Z--:-----:13: BCHG Dr,s[!Areg,Immd] +0000 rrr1 10ss sSSS:000:--Z--:-----:13: BCLR Dr,s[!Areg,Immd] +0000 rrr1 11ss sSSS:000:--Z--:-----:13: BSET Dr,s[!Areg,Immd] -0001 DDDd ddss sSSS:00:-NZ00:-----:12: MOVE.B s,d[!Areg] -0010 DDDd ddss sSSS:00:-----:-----:12: MOVEA.L s,d[Areg] -0010 DDDd ddss sSSS:00:-NZ00:-----:12: MOVE.L s,d[!Areg] -0011 DDDd ddss sSSS:00:-----:-----:12: MOVEA.W s,d[Areg] -0011 DDDd ddss sSSS:00:-NZ00:-----:12: MOVE.W s,d[!Areg] +0001 DDDd ddss sSSS:000:-NZ00:-----:12: MOVE.B s,d[!Areg] +0010 DDDd ddss sSSS:000:-----:-----:12: MOVEA.L s,d[Areg] +0010 DDDd ddss sSSS:000:-NZ00:-----:12: MOVE.L s,d[!Areg] +0011 DDDd ddss sSSS:000:-----:-----:12: MOVEA.W s,d[Areg] +0011 DDDd ddss sSSS:000:-NZ00:-----:12: MOVE.W s,d[!Areg] -0100 0000 zzdd dDDD:00:XxZxC:X-Z--:30: NEGX.z d[!Areg] -0100 0000 11dd dDDD:01:?????:?????:10: MVSR2.W d[!Areg] -0100 0010 zzdd dDDD:00:-0100:-----:20: CLR.z d[!Areg] -0100 0010 11dd dDDD:10:?????:?????:10: MVSR2.B d[!Areg] -0100 0100 zzdd dDDD:00:XNZVC:-----:30: NEG.z d[!Areg] -0100 0100 11ss sSSS:00:XNZVC:-----:10: MV2SR.B s[!Areg] -0100 0110 zzdd dDDD:00:-NZ00:-----:30: NOT.z d[!Areg] -0100 0110 11ss sSSS:02:?????:?????:10: MV2SR.W s[!Areg] -0100 1000 0000 1rrr:20:-----:-----:31: LINK.L Ar,#2 -0100 1000 00dd dDDD:00:X?Z?C:X-Z--:30: NBCD.B d[!Areg] -0100 1000 0100 1kkk:20:?????:?????:10: BKPT #k -0100 1000 01ss sSSS:00:-NZ00:-----:30: SWAP.W s[Dreg] -0100 1000 01ss sSSS:00:-----:-----:00: PEA.L s[!Dreg,Areg,Aipi,Apdi,Immd] -0100 1000 10dd dDDD:00:-NZ00:-----:30: EXT.W d[Dreg] -0100 1000 10dd dDDD:00:-----:-----:02: MVMLE.W #1,d[!Dreg,Areg,Aipi] -0100 1000 11dd dDDD:00:-NZ00:-----:30: EXT.L d[Dreg] -0100 1000 11dd dDDD:00:-----:-----:02: MVMLE.L #1,d[!Dreg,Areg,Aipi] -0100 1001 11dd dDDD:20:-NZ00:-----:30: EXT.B d[Dreg] -0100 1010 zzss sSSS:00:-NZ00:-----:10: TST.z s -0100 1010 11dd dDDD:00:?????:?????:30: TAS.B d[!Areg] -0100 1010 1111 1100:00:?????:?????:00: ILLEGAL -0100 1100 00ss sSSS:20:-NZVC:-----:13: MULL.L #1,s[!Areg] -0100 1100 01ss sSSS:20:?????:?????:13: DIVL.L #1,s[!Areg] -0100 1100 10ss sSSS:00:-----:-----:01: MVMEL.W #1,s[!Dreg,Areg,Apdi,Immd] -0100 1100 11ss sSSS:00:-----:-----:01: MVMEL.L #1,s[!Dreg,Areg,Apdi,Immd] -0100 1110 0100 JJJJ:00:-----:XNZVC:10: TRAP #J -0100 1110 0101 0rrr:00:-----:-----:31: LINK.W Ar,#1 -0100 1110 0101 1rrr:00:-----:-----:30: UNLK.L Ar -0100 1110 0110 0rrr:02:-----:-----:10: MVR2USP.L Ar -0100 1110 0110 1rrr:02:-----:-----:20: MVUSP2R.L Ar -0100 1110 0111 0000:02:-----:-----:00: RESET -0100 1110 0111 0001:00:-----:-----:00: NOP -0100 1110 0111 0010:02:XNZVC:-----:10: STOP #1 -0100 1110 0111 0011:02:XNZVC:-----:00: RTE -0100 1110 0111 0100:00:?????:?????:10: RTD #1 -0100 1110 0111 0101:00:-----:-----:00: RTS -0100 1110 0111 0110:00:-----:XNZVC:00: TRAPV -0100 1110 0111 0111:00:XNZVC:-----:00: RTR -0100 1110 0111 1010:12:?????:?????:10: MOVEC2 #1 -0100 1110 0111 1011:12:?????:?????:10: MOVE2C #1 -0100 1110 10ss sSSS:00://///://///:80: JSR.L s[!Dreg,Areg,Aipi,Apdi,Immd] -0100 rrr1 00ss sSSS:20:?????:?????:11: CHK.L s[!Areg],Dr -0100 rrr1 10ss sSSS:00:?????:?????:11: CHK.W s[!Areg],Dr -0100 1110 11ss sSSS:00://///://///:80: JMP.L s[!Dreg,Areg,Aipi,Apdi,Immd] -0100 rrr1 11ss sSSS:00:-----:-----:02: LEA.L s[!Dreg,Areg,Aipi,Apdi,Immd],Ar +0100 0000 zzdd dDDD:000:XxZxC:X-Z--:30: NEGX.z d[!Areg] +0100 0000 11dd dDDD:001:?????:?????:10: MVSR2.W d[!Areg] +0100 0010 zzdd dDDD:000:-0100:-----:20: CLR.z d[!Areg] +0100 0010 11dd dDDD:100:?????:?????:10: MVSR2.B d[!Areg] +0100 0100 zzdd dDDD:000:XNZVC:-----:30: NEG.z d[!Areg] +0100 0100 11ss sSSS:000:XNZVC:-----:10: MV2SR.B s[!Areg] +0100 0110 zzdd dDDD:000:-NZ00:-----:30: NOT.z d[!Areg] +0100 0110 11ss sSSS:002:?????:?????:10: MV2SR.W s[!Areg] +0100 1000 0000 1rrr:200:-----:-----:31: LINK.L Ar,#2 +0100 1000 00dd dDDD:000:X?Z?C:X-Z--:30: NBCD.B d[!Areg] +0100 1000 0100 1kkk:200:?????:?????:10: BKPT #k +0100 1000 01ss sSSS:000:-NZ00:-----:30: SWAP.W s[Dreg] +0100 1000 01ss sSSS:000:-----:-----:00: PEA.L s[!Dreg,Areg,Aipi,Apdi,Immd] +0100 1000 10dd dDDD:000:-NZ00:-----:30: EXT.W d[Dreg] +0100 1000 10dd dDDD:000:-----:-----:02: MVMLE.W #1,d[!Dreg,Areg,Aipi] +0100 1000 11dd dDDD:000:-NZ00:-----:30: EXT.L d[Dreg] +0100 1000 11dd dDDD:000:-----:-----:02: MVMLE.L #1,d[!Dreg,Areg,Aipi] +0100 1001 11dd dDDD:200:-NZ00:-----:30: EXT.B d[Dreg] +0100 1010 zzss sSSS:000:-NZ00:-----:10: TST.z s +0100 1010 11dd dDDD:000:?????:?????:30: TAS.B d[!Areg] +0100 1010 1111 1100:000:?????:?????:00: ILLEGAL +0100 1100 00ss sSSS:250:-NZVC:-----:13: MULL.L #1,s[!Areg] +0100 1100 01ss sSSS:250:?????:?????:13: DIVL.L #1,s[!Areg] +0100 1100 10ss sSSS:000:-----:-----:01: MVMEL.W #1,s[!Dreg,Areg,Apdi,Immd] +0100 1100 11ss sSSS:000:-----:-----:01: MVMEL.L #1,s[!Dreg,Areg,Apdi,Immd] +0100 1110 0100 JJJJ:000:-----:XNZVC:10: TRAP #J +0100 1110 0101 0rrr:000:-----:-----:31: LINK.W Ar,#1 +0100 1110 0101 1rrr:000:-----:-----:30: UNLK.L Ar +0100 1110 0110 0rrr:002:-----:-----:10: MVR2USP.L Ar +0100 1110 0110 1rrr:002:-----:-----:20: MVUSP2R.L Ar +0100 1110 0111 0000:002:-----:-----:00: RESET +0100 1110 0111 0001:000:-----:-----:00: NOP +0100 1110 0111 0010:002:XNZVC:-----:10: STOP #1 +0100 1110 0111 0011:002:XNZVC:-----:00: RTE +0100 1110 0111 0100:000:?????:?????:10: RTD #1 +0100 1110 0111 0101:000:-----:-----:00: RTS +0100 1110 0111 0110:000:-----:XNZVC:00: TRAPV +0100 1110 0111 0111:000:XNZVC:-----:00: RTR +0100 1110 0111 1010:102:?????:?????:10: MOVEC2 #1 +0100 1110 0111 1011:102:?????:?????:10: MOVE2C #1 +0100 1110 10ss sSSS:000://///://///:80: JSR.L s[!Dreg,Areg,Aipi,Apdi,Immd] +0100 rrr1 00ss sSSS:200:?????:?????:11: CHK.L s[!Areg],Dr +0100 rrr1 10ss sSSS:000:?????:?????:11: CHK.W s[!Areg],Dr +0100 1110 11ss sSSS:000://///://///:80: JMP.L s[!Dreg,Areg,Aipi,Apdi,Immd] +0100 rrr1 11ss sSSS:000:-----:-----:02: LEA.L s[!Dreg,Areg,Aipi,Apdi,Immd],Ar -0101 jjj0 01dd dDDD:00:-----:-----:13: ADDA.W #j,d[Areg] -0101 jjj0 10dd dDDD:00:-----:-----:13: ADDA.L #j,d[Areg] -0101 jjj0 zzdd dDDD:00:XNZVC:-----:13: ADD.z #j,d[!Areg] -0101 jjj1 01dd dDDD:00:-----:-----:13: SUBA.W #j,d[Areg] -0101 jjj1 10dd dDDD:00:-----:-----:13: SUBA.L #j,d[Areg] -0101 jjj1 zzdd dDDD:00:XNZVC:-----:13: SUB.z #j,d[!Areg] -0101 cccc 1100 1rrr:00:-----:-++++:31: DBcc.W Dr,#1 -0101 cccc 11dd dDDD:00:-----:-++++:20: Scc.B d[!Areg] -0101 cccc 1111 1010:20:?????:?????:10: TRAPcc #1 -0101 cccc 1111 1011:20:?????:?????:10: TRAPcc #2 -0101 cccc 1111 1100:20:?????:?????:00: TRAPcc +0101 jjj0 01dd dDDD:000:-----:-----:13: ADDA.W #j,d[Areg] +0101 jjj0 10dd dDDD:000:-----:-----:13: ADDA.L #j,d[Areg] +0101 jjj0 zzdd dDDD:000:XNZVC:-----:13: ADD.z #j,d[!Areg] +0101 jjj1 01dd dDDD:000:-----:-----:13: SUBA.W #j,d[Areg] +0101 jjj1 10dd dDDD:000:-----:-----:13: SUBA.L #j,d[Areg] +0101 jjj1 zzdd dDDD:000:XNZVC:-----:13: SUB.z #j,d[!Areg] +0101 cccc 1100 1rrr:000:-----:-++++:31: DBcc.W Dr,#1 +0101 cccc 11dd dDDD:000:-----:-++++:20: Scc.B d[!Areg] +0101 cccc 1111 1010:200:?????:?????:10: TRAPcc #1 +0101 cccc 1111 1011:200:?????:?????:10: TRAPcc #2 +0101 cccc 1111 1100:200:?????:?????:00: TRAPcc % Bxx.L is 68020 only, but setting the CPU level to 2 would give illegal % instruction exceptions when compiling a 68000 only emulation, which isn't % what we want either. -0110 0001 0000 0000:00://///://///:40: BSR.W #1 -0110 0001 IIII IIII:00://///://///:40: BSR.B #i -0110 0001 1111 1111:00://///://///:40: BSR.L #2 -0110 CCCC 0000 0000:00:-----:-++++:40: Bcc.W #1 -0110 CCCC IIII IIII:00:-----:-++++:40: Bcc.B #i -0110 CCCC 1111 1111:00:-----:-++++:40: Bcc.L #2 +0110 0001 0000 0000:000://///://///:40: BSR.W #1 +0110 0001 IIII IIII:000://///://///:40: BSR.B #i +0110 0001 1111 1111:000://///://///:40: BSR.L #2 +0110 CCCC 0000 0000:000:-----:-++++:40: Bcc.W #1 +0110 CCCC IIII IIII:000:-----:-++++:40: Bcc.B #i +0110 CCCC 1111 1111:000:-----:-++++:40: Bcc.L #2 -0111 rrr0 iiii iiii:00:-NZ00:-----:12: MOVE.L #i,Dr +0111 rrr0 iiii iiii:000:-NZ00:-----:12: MOVE.L #i,Dr -1000 rrr0 zzss sSSS:00:-NZ00:-----:13: OR.z s[!Areg],Dr -1000 rrr0 11ss sSSS:00:?????:?????:13: DIVU.W s[!Areg],Dr -1000 rrr1 00dd dDDD:00:XxZxC:X-Z--:13: SBCD.B d[Dreg],Dr -1000 rrr1 00dd dDDD:00:XxZxC:X-Z--:13: SBCD.B d[Areg-Apdi],Arp -1000 rrr1 zzdd dDDD:00:-NZ00:-----:13: OR.z Dr,d[!Areg,Dreg] -1000 rrr1 01dd dDDD:20:?????:?????:12: PACK d[Dreg],Dr -1000 rrr1 01dd dDDD:20:?????:?????:12: PACK d[Areg-Apdi],Arp -1000 rrr1 10dd dDDD:20:?????:?????:12: UNPK d[Dreg],Dr -1000 rrr1 10dd dDDD:20:?????:?????:12: UNPK d[Areg-Apdi],Arp -1000 rrr1 11ss sSSS:00:?????:?????:13: DIVS.W s[!Areg],Dr +1000 rrr0 zzss sSSS:000:-NZ00:-----:13: OR.z s[!Areg],Dr +1000 rrr0 11ss sSSS:000:?????:?????:13: DIVU.W s[!Areg],Dr +1000 rrr1 00dd dDDD:000:XxZxC:X-Z--:13: SBCD.B d[Dreg],Dr +1000 rrr1 00dd dDDD:000:XxZxC:X-Z--:13: SBCD.B d[Areg-Apdi],Arp +1000 rrr1 zzdd dDDD:000:-NZ00:-----:13: OR.z Dr,d[!Areg,Dreg] +1000 rrr1 01dd dDDD:200:?????:?????:12: PACK d[Dreg],Dr +1000 rrr1 01dd dDDD:200:?????:?????:12: PACK d[Areg-Apdi],Arp +1000 rrr1 10dd dDDD:200:?????:?????:12: UNPK d[Dreg],Dr +1000 rrr1 10dd dDDD:200:?????:?????:12: UNPK d[Areg-Apdi],Arp +1000 rrr1 11ss sSSS:000:?????:?????:13: DIVS.W s[!Areg],Dr -1001 rrr0 zzss sSSS:00:XNZVC:-----:13: SUB.z s,Dr -1001 rrr0 11ss sSSS:00:-----:-----:13: SUBA.W s,Ar -1001 rrr1 zzdd dDDD:00:XNZVC:X-Z--:13: SUBX.z d[Dreg],Dr -1001 rrr1 zzdd dDDD:00:XNZVC:X-Z--:13: SUBX.z d[Areg-Apdi],Arp -1001 rrr1 zzdd dDDD:00:XNZVC:-----:13: SUB.z Dr,d[!Areg,Dreg] -1001 rrr1 11ss sSSS:00:-----:-----:13: SUBA.L s,Ar +1001 rrr0 zzss sSSS:000:XNZVC:-----:13: SUB.z s,Dr +1001 rrr0 11ss sSSS:000:-----:-----:13: SUBA.W s,Ar +1001 rrr1 zzdd dDDD:000:XNZVC:X-Z--:13: SUBX.z d[Dreg],Dr +1001 rrr1 zzdd dDDD:000:XNZVC:X-Z--:13: SUBX.z d[Areg-Apdi],Arp +1001 rrr1 zzdd dDDD:000:XNZVC:-----:13: SUB.z Dr,d[!Areg,Dreg] +1001 rrr1 11ss sSSS:000:-----:-----:13: SUBA.L s,Ar -1011 rrr0 zzss sSSS:00:-NZVC:-----:11: CMP.z s,Dr -1011 rrr0 11ss sSSS:00:-NZVC:-----:11: CMPA.W s,Ar -1011 rrr1 11ss sSSS:00:-NZVC:-----:11: CMPA.L s,Ar -1011 rrr1 zzdd dDDD:00:-NZVC:-----:11: CMPM.z d[Areg-Aipi],ArP -1011 rrr1 zzdd dDDD:00:-NZ00:-----:13: EOR.z Dr,d[!Areg] +1011 rrr0 zzss sSSS:000:-NZVC:-----:11: CMP.z s,Dr +1011 rrr0 11ss sSSS:000:-NZVC:-----:11: CMPA.W s,Ar +1011 rrr1 11ss sSSS:000:-NZVC:-----:11: CMPA.L s,Ar +1011 rrr1 zzdd dDDD:000:-NZVC:-----:11: CMPM.z d[Areg-Aipi],ArP +1011 rrr1 zzdd dDDD:000:-NZ00:-----:13: EOR.z Dr,d[!Areg] -1100 rrr0 zzss sSSS:00:-NZ00:-----:13: AND.z s[!Areg],Dr -1100 rrr0 11ss sSSS:00:-NZ00:-----:13: MULU.W s[!Areg],Dr -1100 rrr1 00dd dDDD:00:XxZxC:X-Z--:13: ABCD.B d[Dreg],Dr -1100 rrr1 00dd dDDD:00:XxZxC:X-Z--:13: ABCD.B d[Areg-Apdi],Arp -1100 rrr1 zzdd dDDD:00:-NZ00:-----:13: AND.z Dr,d[!Areg,Dreg] -1100 rrr1 01dd dDDD:00:-----:-----:33: EXG.L Dr,d[Dreg] -1100 rrr1 01dd dDDD:00:-----:-----:33: EXG.L Ar,d[Areg] -1100 rrr1 10dd dDDD:00:-----:-----:33: EXG.L Dr,d[Areg] -1100 rrr1 11ss sSSS:00:-NZ00:-----:13: MULS.W s[!Areg],Dr +1100 rrr0 zzss sSSS:000:-NZ00:-----:13: AND.z s[!Areg],Dr +1100 rrr0 11ss sSSS:000:-NZ00:-----:13: MULU.W s[!Areg],Dr +1100 rrr1 00dd dDDD:000:XxZxC:X-Z--:13: ABCD.B d[Dreg],Dr +1100 rrr1 00dd dDDD:000:XxZxC:X-Z--:13: ABCD.B d[Areg-Apdi],Arp +1100 rrr1 zzdd dDDD:000:-NZ00:-----:13: AND.z Dr,d[!Areg,Dreg] +1100 rrr1 01dd dDDD:000:-----:-----:33: EXG.L Dr,d[Dreg] +1100 rrr1 01dd dDDD:000:-----:-----:33: EXG.L Ar,d[Areg] +1100 rrr1 10dd dDDD:000:-----:-----:33: EXG.L Dr,d[Areg] +1100 rrr1 11ss sSSS:000:-NZ00:-----:13: MULS.W s[!Areg],Dr -1101 rrr0 zzss sSSS:00:XNZVC:-----:13: ADD.z s,Dr -1101 rrr0 11ss sSSS:00:-----:-----:13: ADDA.W s,Ar -1101 rrr1 zzdd dDDD:00:XNZVC:X-Z--:13: ADDX.z d[Dreg],Dr -1101 rrr1 zzdd dDDD:00:XNZVC:X-Z--:13: ADDX.z d[Areg-Apdi],Arp -1101 rrr1 zzdd dDDD:00:XNZVC:-----:13: ADD.z Dr,d[!Areg,Dreg] -1101 rrr1 11ss sSSS:00:-----:-----:13: ADDA.L s,Ar +1101 rrr0 zzss sSSS:000:XNZVC:-----:13: ADD.z s,Dr +1101 rrr0 11ss sSSS:000:-----:-----:13: ADDA.W s,Ar +1101 rrr1 zzdd dDDD:000:XNZVC:X-Z--:13: ADDX.z d[Dreg],Dr +1101 rrr1 zzdd dDDD:000:XNZVC:X-Z--:13: ADDX.z d[Areg-Apdi],Arp +1101 rrr1 zzdd dDDD:000:XNZVC:-----:13: ADD.z Dr,d[!Areg,Dreg] +1101 rrr1 11ss sSSS:000:-----:-----:13: ADDA.L s,Ar -1110 jjjf zz00 0RRR:00:XNZVC:-----:13: ASf.z #j,DR -1110 jjjf zz00 1RRR:00:XNZ0C:-----:13: LSf.z #j,DR -1110 jjjf zz01 0RRR:00:XNZ0C:X----:13: ROXf.z #j,DR -1110 jjjf zz01 1RRR:00:-NZ0C:-----:13: ROf.z #j,DR -1110 rrrf zz10 0RRR:00:XNZVC:X----:13: ASf.z Dr,DR -1110 rrrf zz10 1RRR:00:XNZ0C:X----:13: LSf.z Dr,DR -1110 rrrf zz11 0RRR:00:XNZ0C:X----:13: ROXf.z Dr,DR -1110 rrrf zz11 1RRR:00:-NZ0C:-----:13: ROf.z Dr,DR -1110 000f 11dd dDDD:00:XNZVC:-----:13: ASfW.W d[!Dreg,Areg] -1110 001f 11dd dDDD:00:XNZ0C:-----:13: LSfW.W d[!Dreg,Areg] -1110 010f 11dd dDDD:00:XNZ0C:X----:13: ROXfW.W d[!Dreg,Areg] -1110 011f 11dd dDDD:00:-NZ0C:-----:13: ROfW.W d[!Dreg,Areg] +1110 jjjf zz00 0RRR:000:XNZVC:-----:13: ASf.z #j,DR +1110 jjjf zz00 1RRR:000:XNZ0C:-----:13: LSf.z #j,DR +1110 jjjf zz01 0RRR:000:XNZ0C:X----:13: ROXf.z #j,DR +1110 jjjf zz01 1RRR:000:-NZ0C:-----:13: ROf.z #j,DR +1110 rrrf zz10 0RRR:000:XNZVC:X----:13: ASf.z Dr,DR +1110 rrrf zz10 1RRR:000:XNZ0C:X----:13: LSf.z Dr,DR +1110 rrrf zz11 0RRR:000:XNZ0C:X----:13: ROXf.z Dr,DR +1110 rrrf zz11 1RRR:000:-NZ0C:-----:13: ROf.z Dr,DR +1110 000f 11dd dDDD:000:XNZVC:-----:13: ASfW.W d[!Dreg,Areg] +1110 001f 11dd dDDD:000:XNZ0C:-----:13: LSfW.W d[!Dreg,Areg] +1110 010f 11dd dDDD:000:XNZ0C:X----:13: ROXfW.W d[!Dreg,Areg] +1110 011f 11dd dDDD:000:-NZ0C:-----:13: ROfW.W d[!Dreg,Areg] -1110 1000 11ss sSSS:20:?????:?????:11: BFTST #1,s[!Areg,Apdi,Aipi,Immd] -1110 1001 11ss sSSS:20:?????:?????:11: BFEXTU #1,s[!Areg,Apdi,Aipi,Immd] -1110 1010 11ss sSSS:20:?????:?????:13: BFCHG #1,s[!Areg,Apdi,Aipi,Immd,PC8r,PC16] -1110 1011 11ss sSSS:20:?????:?????:11: BFEXTS #1,s[!Areg,Apdi,Aipi,Immd] -1110 1100 11ss sSSS:20:?????:?????:13: BFCLR #1,s[!Areg,Apdi,Aipi,Immd,PC8r,PC16] -1110 1101 11ss sSSS:20:?????:?????:11: BFFFO #1,s[!Areg,Apdi,Aipi,Immd] -1110 1110 11ss sSSS:20:?????:?????:13: BFSET #1,s[!Areg,Apdi,Aipi,Immd,PC8r,PC16] -1110 1111 11ss sSSS:20:?????:?????:13: BFINS #1,s[!Areg,Apdi,Aipi,Immd,PC8r,PC16] +1110 1000 11ss sSSS:200:?????:?????:11: BFTST #1,s[!Areg,Apdi,Aipi,Immd] +1110 1001 11ss sSSS:200:?????:?????:11: BFEXTU #1,s[!Areg,Apdi,Aipi,Immd] +1110 1010 11ss sSSS:200:?????:?????:13: BFCHG #1,s[!Areg,Apdi,Aipi,Immd,PC8r,PC16] +1110 1011 11ss sSSS:200:?????:?????:11: BFEXTS #1,s[!Areg,Apdi,Aipi,Immd] +1110 1100 11ss sSSS:200:?????:?????:13: BFCLR #1,s[!Areg,Apdi,Aipi,Immd,PC8r,PC16] +1110 1101 11ss sSSS:200:?????:?????:11: BFFFO #1,s[!Areg,Apdi,Aipi,Immd] +1110 1110 11ss sSSS:200:?????:?????:13: BFSET #1,s[!Areg,Apdi,Aipi,Immd,PC8r,PC16] +1110 1111 11ss sSSS:200:?????:?????:13: BFINS #1,s[!Areg,Apdi,Aipi,Immd,PC8r,PC16] % floating point co processor -1111 0010 00ss sSSS:20:?????:?????:11: FPP #1,s -1111 0010 01ss sSSS:20:?????:?????:11: FDBcc #1,s[Areg-Dreg] -1111 0010 01ss sSSS:20:?????:?????:11: FScc #1,s[!Areg,Immd,PC8r,PC16] -1111 0010 0111 1010:20:?????:?????:10: FTRAPcc #1 -1111 0010 0111 1011:20:?????:?????:10: FTRAPcc #2 -1111 0010 0111 1100:20:?????:?????:00: FTRAPcc -1111 0010 10KK KKKK:20:?????:?????:11: FBcc #K,#1 -1111 0010 11KK KKKK:20:?????:?????:11: FBcc #K,#2 -1111 0011 00ss sSSS:22:?????:?????:20: FSAVE s[!Dreg,Areg,Aipi,Immd,PC8r,PC16] -1111 0011 01ss sSSS:22:?????:?????:10: FRESTORE s[!Dreg,Areg,Apdi,Immd] +1111 0010 00ss sSSS:200:?????:?????:11: FPP #1,s +1111 0010 01ss sSSS:200:?????:?????:11: FDBcc #1,s[Areg-Dreg] +1111 0010 01ss sSSS:200:?????:?????:11: FScc #1,s[!Areg,Immd,PC8r,PC16] +1111 0010 0111 1010:200:?????:?????:10: FTRAPcc #1 +1111 0010 0111 1011:200:?????:?????:10: FTRAPcc #2 +1111 0010 0111 1100:200:?????:?????:00: FTRAPcc +1111 0010 10KK KKKK:200:?????:?????:11: FBcc #K,#1 +1111 0010 11KK KKKK:200:?????:?????:11: FBcc #K,#2 +1111 0011 00ss sSSS:202:?????:?????:20: FSAVE s[!Dreg,Areg,Aipi,Immd,PC8r,PC16] +1111 0011 01ss sSSS:202:?????:?????:10: FRESTORE s[!Dreg,Areg,Apdi,Immd] % 68030 MMU (allowed addressing modes not checked!) -1111 0000 00ss sSSS:32:?????:?????:11: MMUOP030 s[Aind,Ad16,Ad8r,absl,absw],#1 +1111 0000 00ss sSSS:342:?????:?????:11: MMUOP030 s[Aind,Ad16,Ad8r,absl,absw],#1 % 68040/68060 instructions -1111 0100 pp00 1rrr:42:-----:-----:02: CINVL #p,Ar -1111 0100 pp01 0rrr:42:-----:-----:02: CINVP #p,Ar -1111 0100 pp01 1rrr:42:-----:-----:00: CINVA #p -1111 0100 pp10 1rrr:42:-----:-----:02: CPUSHL #p,Ar -1111 0100 pp11 0rrr:42:-----:-----:02: CPUSHP #p,Ar -1111 0100 pp11 1rrr:42:-----:-----:00: CPUSHA #p -1111 0101 0000 0rrr:42:-----:-----:00: PFLUSHN Ara -1111 0101 0000 1rrr:42:-----:-----:00: PFLUSH Ara -1111 0101 0001 0rrr:42:-----:-----:00: PFLUSHAN Ara -1111 0101 0001 1rrr:42:-----:-----:00: PFLUSHA Ara -1111 0101 0100 1rrr:42:-----:-----:00: PTESTR Ara -1111 0101 0110 1rrr:42:-----:-----:00: PTESTW Ara +1111 0100 pp00 1rrr:402:-----:-----:02: CINVL #p,Ar +1111 0100 pp01 0rrr:402:-----:-----:02: CINVP #p,Ar +1111 0100 pp01 1rrr:402:-----:-----:00: CINVA #p +1111 0100 pp10 1rrr:402:-----:-----:02: CPUSHL #p,Ar +1111 0100 pp11 0rrr:402:-----:-----:02: CPUSHP #p,Ar +1111 0100 pp11 1rrr:402:-----:-----:00: CPUSHA #p +1111 0101 0000 0rrr:402:-----:-----:00: PFLUSHN Ara +1111 0101 0000 1rrr:402:-----:-----:00: PFLUSH Ara +1111 0101 0001 0rrr:402:-----:-----:00: PFLUSHAN Ara +1111 0101 0001 1rrr:402:-----:-----:00: PFLUSHA Ara +1111 0101 0100 1rrr:452:-----:-----:00: PTESTR Ara +1111 0101 0110 1rrr:452:-----:-----:00: PTESTW Ara % destination register number is encoded in the following word -1111 0110 0010 0rrr:40:-----:-----:12: MOVE16 ArP,AxP -1111 0110 00ss sSSS:40:-----:-----:12: MOVE16 s[Dreg-Aipi],L -1111 0110 00dd dDDD:40:-----:-----:12: MOVE16 L,d[Areg-Aipi] -1111 0110 00ss sSSS:40:-----:-----:12: MOVE16 s[Aind],L -1111 0110 00dd dDDD:40:-----:-----:12: MOVE16 L,d[Aipi-Aind] +1111 0110 0010 0rrr:400:-----:-----:12: MOVE16 ArP,AxP +1111 0110 00ss sSSS:400:-----:-----:12: MOVE16 s[Dreg-Aipi],L +1111 0110 00dd dDDD:400:-----:-----:12: MOVE16 L,d[Areg-Aipi] +1111 0110 00ss sSSS:400:-----:-----:12: MOVE16 s[Aind],L +1111 0110 00dd dDDD:400:-----:-----:12: MOVE16 L,d[Aipi-Aind] % 68060 -1111 1000 0000 0000:52:?????:?????:10: LPSTOP #1 -1111 0101 1000 1rrr:52:-----:-----:00: PLPAR Ara -1111 0101 1100 1rrr:52:-----:-----:00: PLPAW Ara +1111 1000 0000 0000:502:?????:?????:10: LPSTOP #1 +1111 0101 1000 1rrr:502:-----:-----:00: PLPAR Ara +1111 0101 1100 1rrr:502:-----:-----:00: PLPAW Ara