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-persist.mjs (2786B)


      1 // Persistance de l'Exelmémoire : formate le volume CROS64, laisse la page le sauver en
      2 // localStorage, RECHARGE la page, relance CROS64 et affiche Directory : le volume doit être là.
      3 //   node test/cram-persist.mjs [url]
      4 import { open, sleep } from './cdp.mjs';
      5 
      6 const url = process.argv[2] ?? 'http://127.0.0.1:8195/?game=exeltel&rom=/roms/exeltel.zip';
      7 const KEY = 'exl100.cram.exeltel';
      8 
      9 const key = async (page, k, code, vk) => {
     10   await page.send('Input.dispatchKeyEvent', { type: 'keyDown', key: k, code, windowsVirtualKeyCode: vk });
     11   await sleep(60);
     12   await page.send('Input.dispatchKeyEvent', { type: 'keyUp', key: k, code, windowsVirtualKeyCode: vk });
     13   await sleep(320);
     14 };
     15 const down = (p) => key(p, 'ArrowDown', 'ArrowDown', 40);
     16 const enter = (p) => key(p, 'Enter', 'Enter', 13);
     17 const toCros64 = async (p) => {
     18   await sleep(8000);                                   // boot EXELTEL
     19   await down(p); await down(p); await down(p);         // Périphériques
     20   await enter(p); await sleep(1200);
     21   await enter(p); await sleep(3500);                   // Exelmémoire -> CROS64
     22 };
     23 const lsLen = (p) => p.evaluate(`(localStorage.getItem(${JSON.stringify(KEY)}) || '').length`);
     24 
     25 // Phase 1 : vider la clé, lancer CROS64, formater, attendre la sauvegarde automatique.
     26 let page = await open(url, { width: 900, height: 1100 });
     27 await page.evaluate(`localStorage.removeItem(${JSON.stringify(KEY)})`);
     28 await toCros64(page);
     29 await page.screenshot('/tmp/cp-1-cros64.png');
     30 for (let i = 0; i < 7; i++) await down(page);        // Format
     31 await enter(page); await sleep(1200);
     32 await enter(page);                                    // valide (nom vide)
     33 await sleep(5000);                                    // >= 2 ticks d'autosave (2 s)
     34 const len1 = await lsLen(page);
     35 await page.screenshot('/tmp/cp-2-after-format.png');
     36 console.log('Phase 1 : localStorage après Format =', len1, 'car. (attendu ~21848 pour 16 Ko)');
     37 page.close();
     38 await sleep(800);
     39 
     40 // Phase 2 : nouvelle page (même origine), CROS64 doit retrouver le volume : Directory.
     41 page = await open(url, { width: 900, height: 1100 });
     42 const len2 = await lsLen(page);
     43 await toCros64(page);
     44 await page.screenshot('/tmp/cp-3-cros64-reload.png');
     45 await down(page); await enter(page);                  // Directory
     46 await sleep(900);
     47 await enter(page);                                    // sortie : Screen
     48 await sleep(1800);
     49 await page.screenshot('/tmp/cp-4-directory.png');
     50 const restored = page.logs.filter((l) => /Exelmémoire restaurée/.test(l));
     51 console.log('Phase 2 : clé présente au rechargement =', len2, 'car. ; log restauration :', restored.join(' | ') || '(aucun)');
     52 console.log('Captures : /tmp/cp-1-cros64.png /tmp/cp-2-after-format.png /tmp/cp-3-cros64-reload.png /tmp/cp-4-directory.png');
     53 page.close();