exl100

Émulateur Exelvision EXL 100 (1984) dans le navigateur : dsp-cpp en WebAssembly, cartouches et cassettes BASIC
git clone https://git.schurger.org/exl100.git
Log | Files | Refs | README

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();