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

disk-cmd.mjs (2407B)


      1 // Exeldisk : démarre sur une image .fd puis tape une commande EXELDOS (DIR par défaut) à l'invite.
      2 // Captures avant/après. Frappe CDP : 80 ms enfoncé / 400 ms d'écart (les lettres passent ainsi).
      3 //   node test/disk-cmd.mjs [commande] [image MEMFS] [base-url] [préfixe]
      4 import { open, sleep } from './cdp.mjs';
      5 import { writeFileSync } from 'node:fs';
      6 
      7 const cmd = process.argv[2] ?? 'DIR';
      8 const img = process.argv[3] ?? '/roms/disks/exeldos-1.4.fd';
      9 const base = process.argv[4] ?? 'http://127.0.0.1:8194';
     10 const prefix = process.argv[5] ?? '/tmp/diskcmd';
     11 const url = base + '/?game=exl100&rom=/roms/exl100.zip' + (process.env.EXELMEM ? '&exelmem=1' : '') + '&args=' + encodeURIComponent('--tape ' + img);
     12 const page = await open(url, { width: 900, height: 1100 });
     13 await page.evaluate('location.reload()');   // sans ce rechargement, les touches CDP n'atteignent pas le canevas
     14 const ev = (type, k, code, vk, mods = 0) =>
     15   page.send('Input.dispatchKeyEvent', { type, key: k, code, windowsVirtualKeyCode: vk, modifiers: mods });
     16 const key = async (k, code, vk, hold = 80, gap = 400) => { await ev('keyDown', k, code, vk); await sleep(hold); await ev('keyUp', k, code, vk); await sleep(gap); };
     17 const shifted = async (k, code, vk) => {
     18   await ev('keyDown', 'Shift', 'ShiftLeft', 16); await sleep(80);
     19   await ev('keyDown', k, code, vk, 8); await sleep(80); await ev('keyUp', k, code, vk, 8); await sleep(80);
     20   await ev('keyUp', 'Shift', 'ShiftLeft', 16); await sleep(400);
     21 };
     22 const type = async (s) => {
     23   for (const ch of s) {
     24     if (ch === ':') await shifted(':', 'Period', 190);
     25     else if (ch === '.') await key('.', 'Period', 190);
     26     else if (ch === ' ') await key(' ', 'Space', 32);
     27     else if (/[0-9]/.test(ch)) await key(ch, 'Digit' + ch, ch.charCodeAt(0));
     28     else await key(ch.toLowerCase(), 'Key' + ch.toUpperCase(), ch.toUpperCase().charCodeAt(0));
     29   }
     30 };
     31 await sleep(Number(process.env.BOOT_MS ?? 8000));
     32 await page.screenshot(prefix + '-0-boot.png');
     33 await page.evaluate("document.getElementById('canvas').focus(); document.activeElement && document.activeElement.id").then((r) => console.log('focus :', r));
     34 await type(cmd);
     35 await key('Enter', 'Enter', 13);
     36 await sleep(5000);
     37 await page.screenshot(prefix + '-1-cmd.png');
     38 writeFileSync(prefix + '.log', page.logs.join('\n') + '\n');
     39 console.log('Captures :', prefix + '-0-boot.png', prefix + '-1-cmd.png');
     40 page.close();