cram-format-trace.mjs (2690B)
1 // Reproduit la nav EXELTEL -> Exelmémoire (CROS64) puis Format, en capturant la 2 // trace PC par frame (CRAM_PC) et les écritures CRAM (CRAM_DBG) pour localiser le crash. 3 // node test/cram-format-trace.mjs <url> 4 import { open, sleep } from './cdp.mjs'; 5 import { writeFileSync } from 'node:fs'; 6 7 const url = process.argv[2] ?? 'http://127.0.0.1:8194/?game=exeltel&rom=/roms/exeltel.zip'; 8 const page = await open(url, { width: 900, height: 1100 }); 9 10 const key = async (k, code, vk) => { 11 await page.send('Input.dispatchKeyEvent', { type: 'keyDown', key: k, code, windowsVirtualKeyCode: vk }); 12 await sleep(60); 13 await page.send('Input.dispatchKeyEvent', { type: 'keyUp', key: k, code, windowsVirtualKeyCode: vk }); 14 await sleep(320); 15 }; 16 const down = () => key('ArrowDown', 'ArrowDown', 40); 17 const enter = () => key('Enter', 'Enter', 13); 18 19 const mark = (s) => page.logs.push(`=== ${s} @${new Date().toISOString()} ===`); 20 21 await sleep(8000); // boot EXELTEL 22 await page.screenshot('/tmp/cf-0-menu.png'); 23 mark('AVANT NAV PERIPH'); 24 await down(); await down(); await down(); // -> Périphériques (4e) 25 await page.screenshot('/tmp/cf-1-periph-hl.png'); 26 await enter(); // ouvre sous-menu Périphériques 27 await sleep(1200); 28 await page.screenshot('/tmp/cf-2-submenu.png'); 29 mark('AVANT LANCEMENT CROS64'); 30 await enter(); // Exelmémoire (1er) -> CROS64 31 await sleep(3500); 32 await page.screenshot('/tmp/cf-3-cros64.png'); 33 mark('CROS64 LANCE, AVANT NAV FORMAT'); 34 for (let i = 0; i < 7; i++) await down(); // Select A/B -> ... -> Format (8e) 35 await page.screenshot('/tmp/cf-4-format-hl.png'); 36 mark('AVANT ENTREE FORMAT'); 37 await enter(); // Format 38 await sleep(1200); 39 await page.screenshot('/tmp/cf-5-format-prompt.png'); 40 mark('AVANT SAISIE NOM'); 41 await page.type('TEST'); // nom de volume 42 await sleep(400); 43 await page.screenshot('/tmp/cf-6-name.png'); 44 mark('AVANT VALIDATION FORMAT'); 45 await enter(); // valide -> écriture + (crash ?) 46 await sleep(2500); 47 await page.screenshot('/tmp/cf-7-after.png'); 48 mark('APRES FORMAT'); 49 50 // Dump : marqueurs + écritures (MW) + fin de la trace PC (FR) 51 const logs = page.logs.map((l) => l.replace(/^\[\w+\]\s*/, '')); 52 writeFileSync('/tmp/cf-raw.txt', logs.join('\n')); // logs bruts, non filtrés 53 const important = logs.filter((l) => /^===|MW |PW |OS |ARMED|TRAP0/.test(l)); 54 const frames = logs.filter((l) => /^FR/.test(l)); 55 console.log('--- MARQUEURS + ECRITURES CRAM + PORTS ---'); 56 console.log(important.join('\n')); 57 console.log('\n--- 80 DERNIERES FRAMES (PC) ---'); 58 console.log(frames.slice(-80).join('\n')); 59 page.close();