-- m3-check.lua -- load the M3 COFF with dwt/loader/loader.lua, read the -- compiled branch/Xlib marker words, and prove a window was mapped by reading -- the white background pixel in VRAM. -- -- M3_LOADER_LUA path to vendor/vt1200/dwt/loader/loader.lua -- LOADER_END loader inspection/exit frame -- -- The marker read runs one frame before loader.lua's inspection/exit frame. -- XSync is diagnostic only; the pass requires the visible white pixel. -- -- The DWT root window is a fine monochrome weave, so one set bit at (150,150) -- cannot distinguish the mapped client window from the root. Require the -- whole 32-bit VRAM word containing (150,150) to be 0xFFFFFFFF, and check a -- second interior word at (250,200) so the client area is proven solid, not -- just a lucky white stripe. dofile(os.getenv("M3_LOADER_LUA")) local ENDF = tonumber(os.getenv("LOADER_END") or "3400") -- Window: XCreateSimpleWindow(display, root, 100, 100, 400, 200, 2, 0, 1). -- The client area starts at (102,102); sample well inside it. local VRAM_BASE = 0x04000000 local VRAM_PITCH = 2048 -- VR319: 2048 bits per row local WHITE_WORD = 0xFFFFFFFF local PX, PY = 150, 150 local PX2, PY2 = 250, 200 local frames = 0 local checked = false local function vram_word(prog, x, y) local bit = VRAM_BASE + y * VRAM_PITCH + x local word = bit - (bit % 32) return prog:read_u32(word), word, bit end 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 display = prog:read_u32(0x018A8000) local root = prog:read_u32(0x018A8020) local window = prog:read_u32(0x018A8040) local sync = prog:read_u32(0x018A8060) local sum = prog:read_u32(0x018A8080) local maxv = prog:read_u32(0x018A80A0) local ltv = prog:read_u32(0x018A80C0) local screens = prog:read_u32(0x018A80E0) local rootoff = prog:read_u32(0x018A8100) -- The full words containing each sample pixel. local pix, word, bit = vram_word(prog, PX, PY) local pix2, word2, bit2 = vram_word(prog, PX2, PY2) local solid = pix == WHITE_WORD local solid2 = pix2 == WHITE_WORD print(string.format( "M3: display=%u root=%u window=%u sync=%d sum=%d max=%d lt=%d screens=0x%x root_off=0x%x", display, root, window, sync, sum, maxv, ltv, screens, rootoff)) print(string.format( "M3: pixel(%d,%d) bit=0x%08X word=0x%08X value=0x%08X %s", PX, PY, bit, word, pix, solid and "SOLID-WHITE" or "not-solid-white")) print(string.format( "M3: pixel(%d,%d) bit=0x%08X word=0x%08X value=0x%08X %s", PX2, PY2, bit2, word2, pix2, solid2 and "SOLID-WHITE" or "not-solid-white")) local ok = display ~= 0 and root ~= 0 and window ~= 0 and sum == 55 and maxv == 22 and ltv == 1 and screens == 0x480 and rootoff == 0x40 and solid and solid2 if ok then print("M3 MAME: PASS") else print("M3 MAME: FAIL") end end end, "m3-check")