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 (
+
+ );
+ }
+
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 0000000..d359272
Binary files /dev/null and b/static/cdrom.png differ
diff --git a/static/select-cdrom.png b/static/select-cdrom.png
new file mode 100644
index 0000000..9da13dc
Binary files /dev/null and b/static/select-cdrom.png differ