From 3dd50db27255ea4f9ecaaf781f2d846fb2aaa919 Mon Sep 17 00:00:00 2001 From: Felix Rieseberg Date: Wed, 4 May 2022 14:51:49 -0700 Subject: [PATCH] Cleanup --- docs/qemu.md | 8 +++++ src/main/ipc.ts | 2 +- src/renderer/card-settings.tsx | 62 +++++++++++++++++++++++++++++++++ src/renderer/emulator.tsx | 15 ++++++-- src/utils/disk-image-size.ts | 4 +-- static/cdrom.png | Bin 0 -> 672 bytes static/select-cdrom.png | Bin 0 -> 519 bytes 7 files changed, 85 insertions(+), 6 deletions(-) create mode 100644 static/cdrom.png create mode 100644 static/select-cdrom.png diff --git a/docs/qemu.md b/docs/qemu.md index cd35842..2ce2055 100644 --- a/docs/qemu.md +++ b/docs/qemu.md @@ -15,6 +15,14 @@ qemu-system-i386 -netdev user,id=mynet0 -device ne2k_isa,netdev=mynet0 -hda win9 ``` Running + +With `ne2k_isa` ```sh qemu-system-i386 -netdev user,id=mynet0 -device ne2k_isa,netdev=mynet0 -drive file=win95.img,format=raw,index=0,media=disk -soundhw sb16 -m 128 -cpu pentium -device cirrus-vga,vgamem_mb=16 -soundhw pcspk -cdrom Win95_OSR25.iso ``` + +With `ne2k_pci` +```sh +qemu-system-i386 -net nic,model=ne2k_pci -net user -drive file=win95_ne2k_pci.img,format=raw,index=0,media=disk -soundhw sb16 -m 128 -cpu pentium -device cirrus-vga,vgamem_mb=16 -soundhw pcspk -cdrom Win95_OSR25.iso --enable-kvm +``` + diff --git a/src/main/ipc.ts b/src/main/ipc.ts index cd947c1..84d3501 100644 --- a/src/main/ipc.ts +++ b/src/main/ipc.ts @@ -5,7 +5,7 @@ import { IPC_COMMANDS } from "../constants"; export function setupIpcListeners() { ipcMain.handle(IPC_COMMANDS.GET_STATE_PATH, () => { - return path.join(app.getPath("userData"), "state-v2.bin"); + return path.join(app.getPath("userData"), "state-v3.bin"); }); ipcMain.handle(IPC_COMMANDS.APP_QUIT, () => { diff --git a/src/renderer/card-settings.tsx b/src/renderer/card-settings.tsx index 3a14db0..51982cd 100644 --- a/src/renderer/card-settings.tsx +++ b/src/renderer/card-settings.tsx @@ -6,7 +6,9 @@ import { getStatePath } from "./utils/get-state-path"; interface CardSettingsProps { bootFromScratch: () => void; setFloppy: (file: File) => void; + setCdrom: (cdrom: File) => void; floppy?: File; + cdrom?: File; } interface CardSettingsState { @@ -21,6 +23,7 @@ export class CardSettings extends React.Component< super(props); this.onChangeFloppy = this.onChangeFloppy.bind(this); + this.onChangeCdrom = this.onChangeCdrom.bind(this); this.onResetState = this.onResetState.bind(this); this.state = { @@ -39,6 +42,8 @@ export class CardSettings extends React.Component<
+ {this.renderCdrom()} +
{this.renderFloppy()}
{this.renderState()} @@ -48,6 +53,45 @@ export class CardSettings extends React.Component< ); } + public renderCdrom() { + // CD is currently not working, so.. let's return nothing. + return null; + + const { cdrom } = this.props; + + return ( +
+ + + CD-ROM + + +

+ windows95 comes with a virtual CD drive. It can mount images in the "iso" format. +

+

+ {cdrom + ? `Inserted CD: ${cdrom.path}` + : `No CD mounted`} +

+ +
+ ); + } + public renderFloppy() { const { floppy } = this.props; @@ -148,6 +192,24 @@ export class CardSettings extends React.Component< } } + /** + * Handle a change in the cdrom input + * + * @param event + */ + private onChangeCdrom(event: React.ChangeEvent) { + const CdromFile = + event.target.files && event.target.files.length > 0 + ? event.target.files[0] + : null; + + if (CdromFile) { + this.props.setCdrom(CdromFile); + } else { + console.log(`Cdrom: Input changed but no file selected`); + } + } + /** * Handle the state reset */ diff --git a/src/renderer/emulator.tsx b/src/renderer/emulator.tsx index 0d39a90..32a7aec 100644 --- a/src/renderer/emulator.tsx +++ b/src/renderer/emulator.tsx @@ -17,6 +17,7 @@ export interface EmulatorState { emulator?: any; scale: number; floppyFile?: File; + cdromFile?: File; isBootingFresh: boolean; isCursorCaptured: boolean; isInfoDisplayed: boolean; @@ -179,7 +180,7 @@ export class Emulator extends React.Component<{}, EmulatorState> { * 🤡 */ public renderUI() { - const { isRunning, currentUiCard, floppyFile } = this.state; + const { isRunning, currentUiCard, floppyFile, cdromFile } = this.state; if (isRunning) { return null; @@ -191,8 +192,10 @@ export class Emulator extends React.Component<{}, EmulatorState> { card = ( this.setState({ floppyFile })} + setCdrom={(cdromFile) => this.setState({ cdromFile })} bootFromScratch={this.bootFromScratch} floppy={floppyFile} + cdrom={cdromFile} /> ); } else if (currentUiCard === "drive") { @@ -272,7 +275,12 @@ export class Emulator extends React.Component<{}, EmulatorState> { private async startEmulator() { document.body.classList.remove("paused"); - console.log(__dirname) + const cdrom: any = {}; + if (this.state.cdromFile?.path) { + cdrom.url = this.state.cdromFile.path; + cdrom.async = true; + cdrom.size = await getDiskImageSize(this.state.cdromFile.path); + } const options = { wasm_path: path.join(__dirname, "build/v86.wasm"), @@ -288,11 +296,12 @@ export class Emulator extends React.Component<{}, EmulatorState> { hda: { url: CONSTANTS.IMAGE_PATH, async: true, - size: await getDiskImageSize(), + size: await getDiskImageSize(CONSTANTS.IMAGE_PATH), }, fda: { buffer: this.state.floppyFile, }, + cdrom: cdrom, boot_order: 0x132, // network_relay_url: "ws://localhost:8080/" }; diff --git a/src/utils/disk-image-size.ts b/src/utils/disk-image-size.ts index fece5ff..847da4f 100644 --- a/src/utils/disk-image-size.ts +++ b/src/utils/disk-image-size.ts @@ -7,9 +7,9 @@ import { CONSTANTS } from "../constants"; * * @returns {number} */ -export async function getDiskImageSize() { +export async function getDiskImageSize(path: string) { try { - const stats = await fs.stat(CONSTANTS.IMAGE_PATH); + const stats = await fs.stat(path); if (stats) { return stats.size; diff --git a/static/cdrom.png b/static/cdrom.png new file mode 100644 index 0000000000000000000000000000000000000000..d359272f3fd44f31f5e31e3f46bba1c1b9e21db8 GIT binary patch literal 672 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDB3?!H8JlO)ISkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq8r{zDi(Vu$sZZAYL$MSD+10LOQ@F#1*8Vq2d33h64u< z0ND&c77zl-28NawUrqu=7)yfuf*Bm1-ADs*lDyqr*u@e%UIRJoC7!;n?2lN48I`1} z(`J7KN|$=NIEGl9E}i0=*K8o*=6H(H%1Gt4(8}uaNf%Nl>~Qd|ZRmPbdqj!-#j@k; zo*zGW^yGFXd)xCBJsMpq0-r)sG#6%mt9Y^b>n%Zt-AYfdaYhJ#5L{rpyy<%|ON45I z_XB6gMN`z@|K&Z?%`~H7TkMo7j#En#=IIMgIj0zYfAfV|S&U0KIGSuV4EjXbR3t9! z<=JE;sBrL>v_sIcbORj;dqS_Ix|FM*sESgT-e5PqQgwh zSm{B!=^7RGMTeD}m)}iHdlQu>e%YHv>>0OgfP)Mtw{FymcGe5uk00t;fA&S*+{=n< zI64@4Hk#$Gax(aHF*Db4E0;&Ygt=wmTpI*>rW?la$Z>cW3Qjoa@HxDpjm79t+_^ID z4Q{+l^EWWC7)sgi`tHY&aYNxkbHl3V7pC0cc+Irr;p?wVDK+04CR|%!xk2KCRLesz zO;&aLNB=b{e*fLc|H+1}NSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgArasc;tEpG&;TU=|7SRG z-~fmM!vFsrSNSgoiZYf2`2{mLJiCzw;v{*yyReHTcDx31*h@TpUD+S82s0{4KFUAk z4-~rZ>EaloaenT_gL%ycJPnD<{SDkpcBh3cwR6yV*O2&p>q+L2CL4#4&g=7iJ*OAf zI{y69ti$x-nZhEwjtpz5FXG4g#U*-}?pPNT1pJ6Gdr-$dIcQI8)h+e~GtDAC@0xdg z4rAY(X}b&zeNJy)P`r$%O?mmQj2VYZ+*jY9aFR2@sS56)=5x#;Ha?U z@ATJf`{q90dZ$rP^43kO6-Tyzsb{m8B3+gLk3s#f^YdMLzb%1YRV{IiC`m~yNwrEY zN(E93Mh1o!x&|h?hL#})hE~QVRz{{ku9bm7iP@)nC>nC}Q!>*kacf}B_DTY3VDNPH Kb6Mw<&;$U=xw)AD literal 0 HcmV?d00001