js-dos 7.5.0 → 8.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/build.yml +51 -0
- package/.gitmodules +4 -0
- package/README.deployment.md +11 -0
- package/README.md +29 -89
- package/index.html +106 -0
- package/package.json +46 -71
- package/postcss.config.cjs +8 -0
- package/src/app.css +14 -0
- package/src/base.css +10 -0
- package/src/components/checkbox.tsx +41 -0
- package/src/components/close-button.tsx +17 -0
- package/src/components/components.css +28 -0
- package/src/components/dos-option-checkbox.tsx +94 -0
- package/src/components/dos-option-select.tsx +108 -0
- package/src/components/dos-option-slider.tsx +35 -0
- package/src/components/error.tsx +16 -0
- package/src/components/loading.tsx +26 -0
- package/src/components/lock.tsx +10 -0
- package/src/components/select.tsx +33 -0
- package/src/components/slider.tsx +69 -0
- package/src/download-file.ts +18 -0
- package/src/frame/account-frame.tsx +156 -0
- package/src/frame/editor/defaults.ts +419 -0
- package/src/frame/editor/editor-conf-frame.tsx +226 -0
- package/src/frame/editor/editor-frame.css +55 -0
- package/src/frame/editor/editor-fs-frame.tsx +314 -0
- package/src/frame/fat-drives-frame.tsx +135 -0
- package/src/frame/frame.css +119 -0
- package/src/frame/frame.tsx +34 -0
- package/src/frame/image-rendering-frame.tsx +8 -0
- package/src/frame/network-frame.tsx +157 -0
- package/src/frame/quick-save-frame.tsx +96 -0
- package/src/frame/settings-frame.tsx +14 -0
- package/src/frame/stats-frame.tsx +87 -0
- package/src/host/bundle-storage.ts +91 -0
- package/src/host/fullscreen.ts +35 -0
- package/src/host/lcache.ts +203 -0
- package/src/host/lstorage.ts +156 -0
- package/src/i18n.ts +183 -0
- package/src/index.css +7 -0
- package/src/load.ts +132 -0
- package/src/login/login.css +9 -0
- package/src/login/login.tsx +77 -0
- package/src/main.tsx +197 -0
- package/src/public/types.ts +41 -0
- package/src/sidebar/account-button.tsx +33 -0
- package/src/sidebar/cloud-save-button.tsx +89 -0
- package/src/sidebar/diskette-icon.tsx +14 -0
- package/src/sidebar/fullscreen-button.tsx +44 -0
- package/src/sidebar/network-button.tsx +39 -0
- package/src/sidebar/sidebar-button.tsx +244 -0
- package/src/sidebar/sidebar.css +47 -0
- package/src/sidebar/sidebar.tsx +30 -0
- package/src/sockdrive/LICENSE +674 -0
- package/src/sockdrive/README.md +45 -0
- package/src/sockdrive/include/sockdrive.h +23 -0
- package/src/sockdrive/js/.eslintrc.json +43 -0
- package/src/sockdrive/js/package.json +29 -0
- package/src/sockdrive/js/src/fatfs/chains.js +318 -0
- package/src/sockdrive/js/src/fatfs/dir.js +385 -0
- package/src/sockdrive/js/src/fatfs/helpers.js +210 -0
- package/src/sockdrive/js/src/fatfs/index.js +606 -0
- package/src/sockdrive/js/src/fatfs/structs.js +255 -0
- package/src/sockdrive/js/src/fatfs/vol.js +166 -0
- package/src/sockdrive/js/src/sockdrive/cache.ts +56 -0
- package/src/sockdrive/js/src/sockdrive/drive.ts +467 -0
- package/src/sockdrive/js/src/sockdrive/lru.ts +221 -0
- package/src/sockdrive/js/src/sockdrive/types.ts +14 -0
- package/src/sockdrive/js/src/sockdrive-fat.d.ts +64 -0
- package/src/sockdrive/js/src/sockdrive-fat.ts +226 -0
- package/src/sockdrive/js/src/sockdrive-native.ts +100 -0
- package/src/sockdrive/js/src/test/test.ts +289 -0
- package/src/sockdrive/js/tsconfig.json +11 -0
- package/src/sockdrive/js/webpack.config.js +68 -0
- package/src/sockdrive/js/yarn.lock +1808 -0
- package/src/store/auth.ts +115 -0
- package/src/store/dos.ts +305 -0
- package/src/store/editor.ts +61 -0
- package/src/store/init.ts +48 -0
- package/src/store/storage.ts +32 -0
- package/src/store/ui.ts +191 -0
- package/src/store.tsx +108 -0
- package/src/ui.tsx +140 -0
- package/src/v8/changes.ts +56 -0
- package/src/v8/config.ts +20 -0
- package/src/v8/subscriptions.ts +62 -0
- package/src/vite-env.d.ts +2 -0
- package/src/window/dos/controls/keyboard.ts +32 -0
- package/src/window/dos/controls/keys.ts +331 -0
- package/src/window/dos/controls/mouse/mount.ts +99 -0
- package/src/window/dos/controls/mouse/mouse-locked.ts +51 -0
- package/src/window/dos/controls/mouse/mouse-not-locked.ts +84 -0
- package/src/window/dos/controls/mouse/mouse-swipe.ts +57 -0
- package/src/window/dos/controls/mouse/pointer.ts +85 -0
- package/src/window/dos/controls/mouse.ts +21 -0
- package/src/window/dos/dos-dhry2.tsx +191 -0
- package/src/window/dos/dos-runtime.tsx +214 -0
- package/src/window/dos/dos-window.tsx +91 -0
- package/src/window/dos/render/canvas.ts +65 -0
- package/src/window/dos/render/resize.ts +31 -0
- package/src/window/dos/render/webgl.ts +173 -0
- package/src/window/dos/sound/audio-node.ts +148 -0
- package/src/window/error-window.tsx +9 -0
- package/src/window/loading-window.tsx +54 -0
- package/src/window/prerun-window.tsx +123 -0
- package/src/window/select-window.tsx +118 -0
- package/src/window/window.css +78 -0
- package/src/window/window.tsx +49 -0
- package/src/ws/ws-sockdrive.ts +123 -0
- package/src/ws/ws-transport-layer.ts +468 -0
- package/tailwind.config.cjs +48 -0
- package/tsconfig.json +32 -0
- package/tsconfig.node.json +9 -0
- package/vite.config.ts +22 -0
- package/LICENSE +0 -339
- package/dist/emulators-ui-loader.png +0 -0
- package/dist/js-dos.css +0 -1690
- package/dist/js-dos.js +0 -17
- package/dist/js-dos.js.map +0 -1
- package/dist/types/src/backend/v7/latency.d.ts +0 -8
- package/dist/types/src/backend/v7/personal.d.ts +0 -2
- package/dist/types/src/backend/v7/v7-config.d.ts +0 -16
- package/dist/types/src/components/action-bar.d.ts +0 -2
- package/dist/types/src/components/action-hide.d.ts +0 -4
- package/dist/types/src/components/action-save-or-exit.d.ts +0 -4
- package/dist/types/src/components/client.d.ts +0 -6
- package/dist/types/src/components/controls.d.ts +0 -8
- package/dist/types/src/components/cpu-control.d.ts +0 -2
- package/dist/types/src/components/horizontal-slider.d.ts +0 -13
- package/dist/types/src/components/region.d.ts +0 -6
- package/dist/types/src/components/scale-control.d.ts +0 -3
- package/dist/types/src/components/sensitivity-control.d.ts +0 -3
- package/dist/types/src/components/sidebar/latency-info.d.ts +0 -7
- package/dist/types/src/components/sidebar/main.d.ts +0 -2
- package/dist/types/src/components/sidebar/networking.d.ts +0 -2
- package/dist/types/src/components/sidebar/token/token-add-time.d.ts +0 -2
- package/dist/types/src/components/sidebar/token/token-select.d.ts +0 -2
- package/dist/types/src/components/sidebar/token/token.d.ts +0 -17
- package/dist/types/src/components/sidebar.d.ts +0 -2
- package/dist/types/src/components/sync-control.d.ts +0 -2
- package/dist/types/src/components/tip.d.ts +0 -2
- package/dist/types/src/components/vertical-slider.d.ts +0 -12
- package/dist/types/src/components/volume-control.d.ts +0 -3
- package/dist/types/src/dom.d.ts +0 -8
- package/dist/types/src/hardware-transport-layer.d.ts +0 -18
- package/dist/types/src/icons.d.ts +0 -95
- package/dist/types/src/player-app.d.ts +0 -50
- package/dist/types/src/player.d.ts +0 -29
- package/dist/types/src/request.d.ts +0 -1
- package/dist/types/src/xhr.d.ts +0 -6
- package/dist/types/v7-services/src/personal.d.ts +0 -3
- package/dist/wdosbox.js +0 -55
- package/dist/wdosbox.js.symbols +0 -3174
- package/dist/wdosbox.wasm +0 -0
- package/examples/digger/index.html +0 -71
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
.jsdos-rso {
|
|
2
|
+
.window {
|
|
3
|
+
@apply overflow-hidden;
|
|
4
|
+
|
|
5
|
+
.background-image {
|
|
6
|
+
@apply absolute left-12 right-0 h-full pointer-events-none;
|
|
7
|
+
background-position: center;
|
|
8
|
+
background-size: cover;
|
|
9
|
+
background-repeat: no-repeat;
|
|
10
|
+
&::after {
|
|
11
|
+
position: relative;
|
|
12
|
+
content: "";
|
|
13
|
+
display: block;
|
|
14
|
+
width: 100%;
|
|
15
|
+
height: 100%;
|
|
16
|
+
background-color: hsl(var(--b1)/var(--tw-bg-opacity));
|
|
17
|
+
opacity: 0.75;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.play-button {
|
|
22
|
+
&:hover {
|
|
23
|
+
color: hsl(var(--af));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.dhry2-window {
|
|
28
|
+
@apply absolute left-0 top-0 w-full h-full flex flex-col items-center justify-center;
|
|
29
|
+
@apply bg-black bg-opacity-80 text-2xl px-8 py-4 text-white;
|
|
30
|
+
|
|
31
|
+
.title {
|
|
32
|
+
@apply mb-4 text-center text-4xl;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.backend {
|
|
36
|
+
@apply mb-8 text-center;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.results {
|
|
40
|
+
@apply grid grid-cols-2 gap-4;
|
|
41
|
+
|
|
42
|
+
div:nth-child(even) {
|
|
43
|
+
@apply text-green-300;
|
|
44
|
+
|
|
45
|
+
span {
|
|
46
|
+
@apply text-white;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
div:nth-child(2),
|
|
51
|
+
div:last-child {
|
|
52
|
+
@apply text-yellow-300;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.pre-run-window {
|
|
59
|
+
@apply overflow-x-hidden overflow-y-auto flex-grow flex flex-col items-center justify-center px-8 m-auto;
|
|
60
|
+
|
|
61
|
+
.slider {
|
|
62
|
+
@apply justify-center w-80 max-w-none;
|
|
63
|
+
|
|
64
|
+
.label {
|
|
65
|
+
@apply flex-grow;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.touch {
|
|
69
|
+
@apply w-40 flex-grow-0;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.select-window {
|
|
75
|
+
@apply m-auto;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { useSelector } from "react-redux";
|
|
2
|
+
import { State } from "../store";
|
|
3
|
+
import { DosWindow } from "./dos/dos-window";
|
|
4
|
+
import { ErrorWindow } from "./error-window";
|
|
5
|
+
import { LoadingWindow } from "./loading-window";
|
|
6
|
+
import { PreRunWindow } from "./prerun-window";
|
|
7
|
+
import { SelectWindow } from "./select-window";
|
|
8
|
+
|
|
9
|
+
export function Window(props: {}) {
|
|
10
|
+
const frameOpened = useSelector((state: State) => state.ui.frame) !== "none";
|
|
11
|
+
const frameXs = useSelector((state: State) => state.ui.frameXs);
|
|
12
|
+
const window = useSelector((state: State) => state.ui.window);
|
|
13
|
+
const background = useSelector((state: State) => state.ui.background);
|
|
14
|
+
|
|
15
|
+
let windowComponent = <Loading />;
|
|
16
|
+
switch (window) {
|
|
17
|
+
case "error": {
|
|
18
|
+
windowComponent = <ErrorWindow />;
|
|
19
|
+
} break;
|
|
20
|
+
case "loading": {
|
|
21
|
+
windowComponent = <LoadingWindow />;
|
|
22
|
+
} break;
|
|
23
|
+
case "prerun": {
|
|
24
|
+
windowComponent = <PreRunWindow />;
|
|
25
|
+
} break;
|
|
26
|
+
case "run": {
|
|
27
|
+
windowComponent = <DosWindow />;
|
|
28
|
+
} break;
|
|
29
|
+
case "select": {
|
|
30
|
+
windowComponent = <SelectWindow />;
|
|
31
|
+
} break;
|
|
32
|
+
default: ;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
return <div class="window absolute w-full h-full bg-base-100">
|
|
36
|
+
<div class="background-image"
|
|
37
|
+
style={{ backgroundImage: (background ? "url(" + background + ")" : undefined ) }} />
|
|
38
|
+
<div class="relative flex flex-row h-full w-full items-start justify-start overflow-auto">
|
|
39
|
+
<div class={(frameOpened ? (frameXs ? "w-24" : "w-96") : "w-12") + " flex-shrink-0"}></div>
|
|
40
|
+
{windowComponent}
|
|
41
|
+
</div>
|
|
42
|
+
</div>;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function Loading() {
|
|
46
|
+
return <div class="w-full h-full flex justify-center items-center">
|
|
47
|
+
<div class="radial-progress animate-spin" style="--value:70;"></div>
|
|
48
|
+
</div>;
|
|
49
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { Handle, Stats } from "../sockdrive/js/src/sockdrive/types";
|
|
2
|
+
import { Drive } from "../sockdrive/js/src/sockdrive/drive";
|
|
3
|
+
|
|
4
|
+
interface Template {
|
|
5
|
+
name: string,
|
|
6
|
+
size: number,
|
|
7
|
+
heads: number,
|
|
8
|
+
cylinders: number,
|
|
9
|
+
sectors: number,
|
|
10
|
+
sectorSize: number,
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface ReadResponse {
|
|
14
|
+
buffer?: Uint8Array,
|
|
15
|
+
code: number,
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function createSockdrive(
|
|
19
|
+
onOpen: (drive: string, read: boolean, write: boolean, imageSize: number, preloadQueue: number[]) => void,
|
|
20
|
+
onError: (e: Error) => void,
|
|
21
|
+
onPreloadProgress: (drive: string, restBytes: number) => void,
|
|
22
|
+
) {
|
|
23
|
+
let seq = 0;
|
|
24
|
+
const mapping: { [handle: Handle]: Drive } = {};
|
|
25
|
+
const templates: { [handle: number]: Template } = {};
|
|
26
|
+
const memory: { [handle: number]: Uint8Array } = {};
|
|
27
|
+
const stats: Stats = {
|
|
28
|
+
read: 0,
|
|
29
|
+
write: 0,
|
|
30
|
+
readTotalTime: 0,
|
|
31
|
+
cacheHit: 0,
|
|
32
|
+
cacheMiss: 0,
|
|
33
|
+
cacheUsed: 0,
|
|
34
|
+
};
|
|
35
|
+
const sockdrive = {
|
|
36
|
+
stats,
|
|
37
|
+
open: async (url: string, owner: string, name: string, token: string): Promise<{
|
|
38
|
+
handle: Handle,
|
|
39
|
+
aheadRange: number,
|
|
40
|
+
}> => {
|
|
41
|
+
const response = await fetch(url.replace("wss://", "https://")
|
|
42
|
+
.replace("ws://", "http://") + "/template/" + owner + "/" + name);
|
|
43
|
+
const template = await response.json();
|
|
44
|
+
if (template.error) {
|
|
45
|
+
throw new Error(template.error);
|
|
46
|
+
}
|
|
47
|
+
seq++;
|
|
48
|
+
templates[seq] = {
|
|
49
|
+
name: template.name,
|
|
50
|
+
size: template.size ?? 0,
|
|
51
|
+
heads: template.heads ?? 1,
|
|
52
|
+
cylinders: template.cylinders ?? 520,
|
|
53
|
+
sectors: template.sectors ?? 63,
|
|
54
|
+
sectorSize: template.sector_size ?? 512,
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const sectorSize = templates[seq].sectorSize;
|
|
58
|
+
const module = { HEAPU8: new Uint8Array(0) };
|
|
59
|
+
mapping[seq] = new Drive(url, owner, name, token, stats, module, true, true);
|
|
60
|
+
return new Promise<{ handle: Handle, aheadRange: number }>((resolve, reject) => {
|
|
61
|
+
const drive = owner + "/" + name;
|
|
62
|
+
mapping[seq].onOpen((read, write, imageSize, preloadQueue, aheadRange) => {
|
|
63
|
+
memory[seq] = new Uint8Array(sectorSize /* write */ + sectorSize * aheadRange);
|
|
64
|
+
module.HEAPU8 = memory[seq];
|
|
65
|
+
onOpen(drive, read, write, imageSize, preloadQueue);
|
|
66
|
+
resolve({
|
|
67
|
+
handle: seq,
|
|
68
|
+
aheadRange,
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
mapping[seq].onPreloadProgress((restBytes) => {
|
|
72
|
+
onPreloadProgress(drive, restBytes);
|
|
73
|
+
});
|
|
74
|
+
mapping[seq].onError((e) => {
|
|
75
|
+
onError(e);
|
|
76
|
+
reject(e);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
},
|
|
80
|
+
read: async (handle: Handle, sector: number): Promise<ReadResponse> => {
|
|
81
|
+
if (mapping[handle]) {
|
|
82
|
+
const ptr = templates[seq].sectorSize;
|
|
83
|
+
let code = mapping[handle].read(sector, ptr, true) as number;
|
|
84
|
+
if (code = 255) {
|
|
85
|
+
code = await mapping[handle].read(sector, ptr, false);
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
code,
|
|
89
|
+
buffer: memory[handle].slice(ptr),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
console.error("ERROR! sockdrive handle", handle, "not found");
|
|
94
|
+
return Promise.resolve({ code: 1 });
|
|
95
|
+
},
|
|
96
|
+
write: (handle: Handle, sector: number, buffer: Uint8Array): number => {
|
|
97
|
+
if (buffer.byteLength != templates[handle].sectorSize) {
|
|
98
|
+
onError(new Error("sockdrive write buffer size " + buffer.byteLength +
|
|
99
|
+
" != sector size " + templates[handle].sectorSize));
|
|
100
|
+
return 1;
|
|
101
|
+
}
|
|
102
|
+
if (mapping[handle]) {
|
|
103
|
+
memory[handle].set(buffer, 0);
|
|
104
|
+
return mapping[handle].write(sector, 0);
|
|
105
|
+
}
|
|
106
|
+
console.error("ERROR! sockdrive handle", handle, "not found");
|
|
107
|
+
return 1;
|
|
108
|
+
},
|
|
109
|
+
close: (handle: Handle) => {
|
|
110
|
+
if (mapping[handle]) {
|
|
111
|
+
mapping[handle].close();
|
|
112
|
+
delete memory[handle];
|
|
113
|
+
delete templates[handle];
|
|
114
|
+
delete mapping[handle];
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
template: (handle: Handle) => {
|
|
118
|
+
return templates[handle];
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
return sockdrive;
|
|
123
|
+
}
|