-- mul-check.lua -- M4 multiply/divide and -O2 loop markers. -- -- M4_LOADER_LUA path to vendor/vt1200/dwt/loader/loader.lua -- LOADER_END loader inspection/exit frame -- -- Markers (0x20 bits apart): -- 018A8000 mul(6,7) == 42 -- 018A8020 umul16(0xffff,0xffff) == 0xfffe0001 -- 018A8040 sdiv(100,7) == 14 -- 018A8060 udiv(0xfffffffe,7) == 613566756 -- 018A8080 srem(100,7) == 2 -- 018A80A0 urem(100,7) == 2 -- 018A80C0 sdiv(-100,7) == -14 -- 018A80E0 srem(-100,7) == -2 -- 018A8100 sumto(10) == 55 -- 018A8120 squares(5) == 30 -- 018A8140 mul(0x12345678,0x9abcdef0) == 0x242d2080 -- 018A8160 urem(0xfffffffe,7) == 2 dofile(os.getenv("M4_LOADER_LUA")) local ENDF = tonumber(os.getenv("LOADER_END") or "2700") local frames = 0 local checked = false emu.register_frame_done(function() frames = frames + 1 if frames == ENDF - 1 and not checked then checked = true local prog = manager.machine.devices[':maincpu'].spaces['program'] local m = {} for i = 0, 11 do m[i] = prog:read_u32(0x018A8000 + i * 0x20) end print(string.format( "M4: mul=%d umul16=%d sdiv=%d udiv=%d srem=%d urem=%d sdivneg=%d sremneg=%d sumto=%d squares=%d widemul=%d widerem=%d", m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8], m[9], m[10], m[11])) local want = {42, 0xfffe0001, 14, 613566756, 2, 2, 0xfffffff2, 0xfffffffe, 55, 30, 0x242d2080, 2} local ok = true for i = 0, 11 do if m[i] ~= want[i + 1] then ok = false end end if ok then print("M4 MAME: PASS") else print("M4 MAME: FAIL (want mul=42 umul16=4294836225 sdiv=14 udiv=613566756 srem=2 urem=2 sdivneg=-14 sremneg=-2 sumto=55 squares=30 widemul=606937216 widerem=2)") end end end, "mul-check")