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