diff --git a/README.md b/README.md index 8a5846cccf70b2f96558bbddd8474b2b66ac4825..fb0e7965bcb562226953fd79b9123c9d676445a0 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ python3 -m http.server And... yes this is the real inspiration behind the emulator's name: -<img src="resources/chips-ahoy.jpeg" alt="Chips Ahoy" width="200" /> +<img src="res/chips-ahoy.jpeg" alt="Chips Ahoy" width="200" /> ## Inspiration diff --git a/examples/benchmark/resources/pong.ch8 b/examples/benchmark/res/pong.ch8 similarity index 100% rename from examples/benchmark/resources/pong.ch8 rename to examples/benchmark/res/pong.ch8 diff --git a/examples/benchmark/src/main.rs b/examples/benchmark/src/main.rs index 5dfefe1a37c319b7fbdfe27610f630b3d0ab5283..cb5c7d1274d6cb45b505f807905d72981e697853 100644 --- a/examples/benchmark/src/main.rs +++ b/examples/benchmark/src/main.rs @@ -8,7 +8,7 @@ const CYCLE_COUNT: u64 = 5_000_000_000; fn main() { let chips: [Box<dyn Chip8>; 2] = [Box::new(Chip8Classic::new()), Box::new(Chip8Neo::new())]; - let rom_path = "./resources/pong.ch8"; + let rom_path = "./res/pong.ch8"; let rom = read_file(rom_path); for mut chip8 in chips { diff --git a/examples/sdl/resources/OpenSans-Bold.ttf b/examples/sdl/res/OpenSans-Bold.ttf similarity index 100% rename from examples/sdl/resources/OpenSans-Bold.ttf rename to examples/sdl/res/OpenSans-Bold.ttf diff --git a/examples/sdl/resources/Roboto-Bold.ttf b/examples/sdl/res/Roboto-Bold.ttf similarity index 100% rename from examples/sdl/resources/Roboto-Bold.ttf rename to examples/sdl/res/Roboto-Bold.ttf diff --git a/examples/sdl/resources/RobotoMono-Bold.ttf b/examples/sdl/res/RobotoMono-Bold.ttf similarity index 100% rename from examples/sdl/resources/RobotoMono-Bold.ttf rename to examples/sdl/res/RobotoMono-Bold.ttf diff --git a/examples/sdl/resources/VT323-Regular.ttf b/examples/sdl/res/VT323-Regular.ttf similarity index 100% rename from examples/sdl/resources/VT323-Regular.ttf rename to examples/sdl/res/VT323-Regular.ttf diff --git a/examples/sdl/resources/icon.png b/examples/sdl/res/icon.png similarity index 100% rename from examples/sdl/resources/icon.png rename to examples/sdl/res/icon.png diff --git a/examples/sdl/src/main.rs b/examples/sdl/src/main.rs index fee2d737401c60acce335b379f0c85347576e504..88257adf63a6be9cdd869b49bbfc6df3a1e2820f 100644 --- a/examples/sdl/src/main.rs +++ b/examples/sdl/src/main.rs @@ -160,7 +160,7 @@ fn main() { // loads the font that is going to be used in the drawing // process cycle if necessary let mut font = ttf_context - .load_font(format!("./resources/{}", FONT_NAME), FONT_SIZE) + .load_font(format!("./res/{}", FONT_NAME), FONT_SIZE) .unwrap(); font.set_style(sdl2::ttf::FontStyle::BOLD); font.set_hinting(Hinting::Light); @@ -181,7 +181,7 @@ fn main() { // updates the icon of the window to reflect the image // and style of the emulator - let surface = Surface::from_file("./resources/icon.png").unwrap(); + let surface = Surface::from_file("./res/icon.png").unwrap(); window.set_icon(&surface); let mut canvas = window.into_canvas().accelerated().build().unwrap(); diff --git a/examples/web/chip_ahoyto.d.ts b/examples/web/chip_ahoyto.d.ts index f8874e8f2084f3913c19ce763be8d86303dcf0b4..f7ec932319bfaa08932b3ae56c837cdccee942d8 100644 --- a/examples/web/chip_ahoyto.d.ts +++ b/examples/web/chip_ahoyto.d.ts @@ -32,14 +32,18 @@ export class Chip8Neo { /** */ clock_ws(): void; +/** +*/ + clock_dt_ws(): void; +/** +*/ + clock_st_ws(): void; } export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; export interface InitOutput { readonly memory: WebAssembly.Memory; - readonly __wbg_chip8classic_free: (a: number) => void; - readonly chip8classic_new: () => number; readonly __wbg_chip8neo_free: (a: number) => void; readonly chip8neo_new: () => number; readonly chip8neo_load_rom_ws: (a: number, b: number, c: number) => void; @@ -47,6 +51,10 @@ export interface InitOutput { readonly chip8neo_reset_hard_ws: (a: number) => void; readonly chip8neo_vram_ws: (a: number, b: number) => void; readonly chip8neo_clock_ws: (a: number) => void; + readonly chip8neo_clock_dt_ws: (a: number) => void; + readonly chip8neo_clock_st_ws: (a: number) => void; + readonly __wbg_chip8classic_free: (a: number) => void; + readonly chip8classic_new: () => number; readonly __wbindgen_malloc: (a: number) => number; readonly __wbindgen_add_to_stack_pointer: (a: number) => number; readonly __wbindgen_free: (a: number, b: number) => void; diff --git a/examples/web/chip_ahoyto.js b/examples/web/chip_ahoyto.js index a1dfc0901badade7479d9329847a6eed07de7d37..f66794cc02fdde22d7e4adba7c682f0f046c8971 100644 --- a/examples/web/chip_ahoyto.js +++ b/examples/web/chip_ahoyto.js @@ -7,25 +7,8 @@ heap.push(undefined, null, true, false); function getObject(idx) { return heap[idx]; } -function _assertBoolean(n) { - if (typeof(n) !== 'boolean') { - throw new Error('expected a boolean argument'); - } -} - let heap_next = heap.length; -function addHeapObject(obj) { - if (heap_next === heap.length) heap.push(heap.length + 1); - const idx = heap_next; - heap_next = heap[idx]; - - if (typeof(heap_next) !== 'number') throw new Error('corrupt heap'); - - heap[idx] = obj; - return idx; -} - function dropObject(idx) { if (idx < 36) return; heap[idx] = heap_next; @@ -38,6 +21,15 @@ function takeObject(idx) { return ret; } +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + const cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); cachedTextDecoder.decode(); @@ -54,10 +46,6 @@ function getStringFromWasm0(ptr, len) { return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); } -function _assertNum(n) { - if (typeof(n) !== 'number') throw new Error('expected a number argument'); -} - let WASM_VECTOR_LEN = 0; function passArray8ToWasm0(arg, malloc) { @@ -79,22 +67,6 @@ function getArrayU8FromWasm0(ptr, len) { return getUint8Memory0().subarray(ptr / 1, ptr / 1 + len); } -function logError(f, args) { - try { - return f.apply(this, args); - } catch (e) { - let error = (function () { - try { - return e instanceof Error ? `${e.message}\n\nStack:\n${e.stack}` : e.toString(); - } catch(_) { - return "<failed to stringify thrown value>"; - } - }()); - console.error("wasm-bindgen: imported JS function that was not marked as `catch` threw an error:", error); - throw e; - } -} - function handleError(f, args) { try { return f.apply(this, args); @@ -163,8 +135,6 @@ export class Chip8Neo { * @param {Uint8Array} rom */ load_rom_ws(rom) { - if (this.ptr == 0) throw new Error('Attempt to use a moved value'); - _assertNum(this.ptr); const ptr0 = passArray8ToWasm0(rom, wasm.__wbindgen_malloc); const len0 = WASM_VECTOR_LEN; wasm.chip8neo_load_rom_ws(this.ptr, ptr0, len0); @@ -172,15 +142,11 @@ export class Chip8Neo { /** */ reset_ws() { - if (this.ptr == 0) throw new Error('Attempt to use a moved value'); - _assertNum(this.ptr); wasm.chip8neo_reset_ws(this.ptr); } /** */ reset_hard_ws() { - if (this.ptr == 0) throw new Error('Attempt to use a moved value'); - _assertNum(this.ptr); wasm.chip8neo_reset_hard_ws(this.ptr); } /** @@ -188,9 +154,7 @@ export class Chip8Neo { */ vram_ws() { try { - if (this.ptr == 0) throw new Error('Attempt to use a moved value'); const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - _assertNum(this.ptr); wasm.chip8neo_vram_ws(retptr, this.ptr); var r0 = getInt32Memory0()[retptr / 4 + 0]; var r1 = getInt32Memory0()[retptr / 4 + 1]; @@ -204,10 +168,18 @@ export class Chip8Neo { /** */ clock_ws() { - if (this.ptr == 0) throw new Error('Attempt to use a moved value'); - _assertNum(this.ptr); wasm.chip8neo_clock_ws(this.ptr); } + /** + */ + clock_dt_ws() { + wasm.chip8neo_clock_dt_ws(this.ptr); + } + /** + */ + clock_st_ws() { + wasm.chip8neo_clock_st_ws(this.ptr); + } } async function load(module, imports) { @@ -244,63 +216,64 @@ async function load(module, imports) { function getImports() { const imports = {}; imports.wbg = {}; - imports.wbg.__wbg_msCrypto_5a86d77a66230f81 = function() { return logError(function (arg0) { - const ret = getObject(arg0).msCrypto; - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_crypto_b95d7173266618a9 = function() { return logError(function (arg0) { - const ret = getObject(arg0).crypto; - return addHeapObject(ret); + imports.wbg.__wbg_randomFillSync_91e2b39becca6147 = function() { return handleError(function (arg0, arg1, arg2) { + getObject(arg0).randomFillSync(getArrayU8FromWasm0(arg1, arg2)); }, arguments) }; + imports.wbg.__wbindgen_object_drop_ref = function(arg0) { + takeObject(arg0); + }; imports.wbg.__wbg_getRandomValues_b14734aa289bc356 = function() { return handleError(function (arg0, arg1) { getObject(arg0).getRandomValues(getObject(arg1)); }, arguments) }; - imports.wbg.__wbg_static_accessor_NODE_MODULE_26b231378c1be7dd = function() { return logError(function () { - const ret = module; - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_require_0db1598d9ccecb30 = function() { return handleError(function (arg0, arg1, arg2) { - const ret = getObject(arg0).require(getStringFromWasm0(arg1, arg2)); - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_randomFillSync_91e2b39becca6147 = function() { return handleError(function (arg0, arg1, arg2) { - getObject(arg0).randomFillSync(getArrayU8FromWasm0(arg1, arg2)); - }, arguments) }; - imports.wbg.__wbg_process_e56fd54cf6319b6c = function() { return logError(function (arg0) { + imports.wbg.__wbg_process_e56fd54cf6319b6c = function(arg0) { const ret = getObject(arg0).process; return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_versions_77e21455908dad33 = function() { return logError(function (arg0) { - const ret = getObject(arg0).versions; - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_node_0dd25d832e4785d5 = function() { return logError(function (arg0) { - const ret = getObject(arg0).node; - return addHeapObject(ret); - }, arguments) }; + }; imports.wbg.__wbindgen_is_object = function(arg0) { const val = getObject(arg0); const ret = typeof(val) === 'object' && val !== null; - _assertBoolean(ret); return ret; }; + imports.wbg.__wbg_versions_77e21455908dad33 = function(arg0) { + const ret = getObject(arg0).versions; + return addHeapObject(ret); + }; + imports.wbg.__wbg_node_0dd25d832e4785d5 = function(arg0) { + const ret = getObject(arg0).node; + return addHeapObject(ret); + }; imports.wbg.__wbindgen_is_string = function(arg0) { const ret = typeof(getObject(arg0)) === 'string'; - _assertBoolean(ret); return ret; }; - imports.wbg.__wbg_newnoargs_fc5356289219b93b = function() { return logError(function (arg0, arg1) { - const ret = new Function(getStringFromWasm0(arg0, arg1)); + imports.wbg.__wbg_static_accessor_NODE_MODULE_26b231378c1be7dd = function() { + const ret = module; + return addHeapObject(ret); + }; + imports.wbg.__wbg_require_0db1598d9ccecb30 = function() { return handleError(function (arg0, arg1, arg2) { + const ret = getObject(arg0).require(getStringFromWasm0(arg1, arg2)); return addHeapObject(ret); }, arguments) }; + imports.wbg.__wbg_crypto_b95d7173266618a9 = function(arg0) { + const ret = getObject(arg0).crypto; + return addHeapObject(ret); + }; + imports.wbg.__wbg_msCrypto_5a86d77a66230f81 = function(arg0) { + const ret = getObject(arg0).msCrypto; + return addHeapObject(ret); + }; + imports.wbg.__wbg_newnoargs_fc5356289219b93b = function(arg0, arg1) { + const ret = new Function(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }; imports.wbg.__wbg_call_4573f605ca4b5f10 = function() { return handleError(function (arg0, arg1) { const ret = getObject(arg0).call(getObject(arg1)); return addHeapObject(ret); }, arguments) }; - imports.wbg.__wbg_globalThis_56d9c9f814daeeee = function() { return handleError(function () { - const ret = globalThis.globalThis; + imports.wbg.__wbindgen_object_clone_ref = function(arg0) { + const ret = getObject(arg0); return addHeapObject(ret); - }, arguments) }; + }; imports.wbg.__wbg_self_ba1ddafe9ea7a3a2 = function() { return handleError(function () { const ret = self.self; return addHeapObject(ret); @@ -309,46 +282,41 @@ function getImports() { const ret = window.window; return addHeapObject(ret); }, arguments) }; - imports.wbg.__wbg_global_8c35aeee4ac77f2b = function() { return handleError(function () { - const ret = global.global; - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_new_97cf52648830a70d = function() { return logError(function (arg0) { - const ret = new Uint8Array(getObject(arg0)); - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_newwithlength_e833b89f9db02732 = function() { return logError(function (arg0) { - const ret = new Uint8Array(arg0 >>> 0); + imports.wbg.__wbg_globalThis_56d9c9f814daeeee = function() { return handleError(function () { + const ret = globalThis.globalThis; return addHeapObject(ret); }, arguments) }; - imports.wbg.__wbg_subarray_9482ae5cd5cd99d3 = function() { return logError(function (arg0, arg1, arg2) { - const ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0); + imports.wbg.__wbg_global_8c35aeee4ac77f2b = function() { return handleError(function () { + const ret = global.global; return addHeapObject(ret); }, arguments) }; - imports.wbg.__wbg_length_e09c0b925ab8de5d = function() { return logError(function (arg0) { - const ret = getObject(arg0).length; - _assertNum(ret); - return ret; - }, arguments) }; - imports.wbg.__wbg_set_a0172b213e2469e9 = function() { return logError(function (arg0, arg1, arg2) { - getObject(arg0).set(getObject(arg1), arg2 >>> 0); - }, arguments) }; imports.wbg.__wbindgen_is_undefined = function(arg0) { const ret = getObject(arg0) === undefined; - _assertBoolean(ret); return ret; }; - imports.wbg.__wbindgen_object_clone_ref = function(arg0) { - const ret = getObject(arg0); + imports.wbg.__wbg_buffer_de1150f91b23aa89 = function(arg0) { + const ret = getObject(arg0).buffer; return addHeapObject(ret); }; - imports.wbg.__wbindgen_object_drop_ref = function(arg0) { - takeObject(arg0); + imports.wbg.__wbg_new_97cf52648830a70d = function(arg0) { + const ret = new Uint8Array(getObject(arg0)); + return addHeapObject(ret); }; - imports.wbg.__wbg_buffer_de1150f91b23aa89 = function() { return logError(function (arg0) { - const ret = getObject(arg0).buffer; + imports.wbg.__wbg_set_a0172b213e2469e9 = function(arg0, arg1, arg2) { + getObject(arg0).set(getObject(arg1), arg2 >>> 0); + }; + imports.wbg.__wbg_length_e09c0b925ab8de5d = function(arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbg_newwithlength_e833b89f9db02732 = function(arg0) { + const ret = new Uint8Array(arg0 >>> 0); return addHeapObject(ret); - }, arguments) }; + }; + imports.wbg.__wbg_subarray_9482ae5cd5cd99d3 = function(arg0, arg1, arg2) { + const ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0); + return addHeapObject(ret); + }; imports.wbg.__wbindgen_throw = function(arg0, arg1) { throw new Error(getStringFromWasm0(arg0, arg1)); }; diff --git a/examples/web/chip_ahoyto_bg.wasm b/examples/web/chip_ahoyto_bg.wasm index 21dabefd9e3d00745f8db9023d32a4039529a271..863046d35e007e90f80b2f3235a5beb152ce8643 100644 Binary files a/examples/web/chip_ahoyto_bg.wasm and b/examples/web/chip_ahoyto_bg.wasm differ diff --git a/examples/web/chip_ahoyto_bg.wasm.d.ts b/examples/web/chip_ahoyto_bg.wasm.d.ts index 9677a6dc6a64da20c3020c8f5e8ee5249c0899d7..20b66726d8b15bbaf361078b41cdbca4932d4a0a 100644 --- a/examples/web/chip_ahoyto_bg.wasm.d.ts +++ b/examples/web/chip_ahoyto_bg.wasm.d.ts @@ -1,8 +1,6 @@ /* tslint:disable */ /* eslint-disable */ export const memory: WebAssembly.Memory; -export function __wbg_chip8classic_free(a: number): void; -export function chip8classic_new(): number; export function __wbg_chip8neo_free(a: number): void; export function chip8neo_new(): number; export function chip8neo_load_rom_ws(a: number, b: number, c: number): void; @@ -10,6 +8,10 @@ export function chip8neo_reset_ws(a: number): void; export function chip8neo_reset_hard_ws(a: number): void; export function chip8neo_vram_ws(a: number, b: number): void; export function chip8neo_clock_ws(a: number): void; +export function chip8neo_clock_dt_ws(a: number): void; +export function chip8neo_clock_st_ws(a: number): void; +export function __wbg_chip8classic_free(a: number): void; +export function chip8classic_new(): number; export function __wbindgen_malloc(a: number): number; export function __wbindgen_add_to_stack_pointer(a: number): number; export function __wbindgen_free(a: number, b: number): void; diff --git a/examples/web/index.html b/examples/web/index.html index ca1964d732444776f6b1d2aba1e0a0323a6a2c52..d2545a4af8b7ce32d95d13c958d7e8613c1b1844 100644 --- a/examples/web/index.html +++ b/examples/web/index.html @@ -2,6 +2,7 @@ <html> <head> <title>CHIP-Ahoyto</title> + <link rel="icon" href="res/icon.png" /> </head> <body> <canvas id="chip-canvas" width="960" height="480"></canvas> diff --git a/examples/web/index.js b/examples/web/index.js index a164b80a09e9032a60b4dd6dcde20eb56bf3f30e..81e3919d2f085a7ac3acc5cf3916279c75a15565 100644 --- a/examples/web/index.js +++ b/examples/web/index.js @@ -6,7 +6,14 @@ import { const PIXEL_SET_COLOR = 0x50cb93ff; const PIXEL_UNSET_COLOR = 0x1b1a17ff; +const LOGIC_HZ = 480; +const TIMER_HZ = 60; +const VISUAL_HZ = 60; + +const ROM = "res/roms/pong.ch8"; + const state = { + chip8: null, canvas: null, canvasScaled: null, canvasCtx: null, @@ -20,9 +27,9 @@ const state = { // so that the global symbols become available await wasm(); - const ROM = "roms/ibm_logo.ch8"; - - console.info("System Loaded!"); + // initializes the canvas sub-sytem + initCanvas(); + registerDrop(); // loads the ROM data and converts it into the // target u8 array bufffer @@ -32,25 +39,58 @@ const state = { const data = new Uint8Array(arrayBuffer); // creates the CHIP-8 instance and resets it - const chip8 = new Chip8Neo(); - chip8.reset_hard_ws(); - chip8.load_rom_ws(data); + state.chip8 = new Chip8Neo(); + state.chip8.reset_hard_ws(); + state.chip8.load_rom_ws(data); - console.info(`ROM Loaded ${ROM}`); + // runs the sequence as an infinite loop, running + // the associated CPU cycles accordingly + while (true) { + const ratioLogic = LOGIC_HZ / VISUAL_HZ; + for(let i = 0; i < ratioLogic; i++) { + state.chip8.clock_ws(); + } - initCanvas(); + const ratioTimer = TIMER_HZ / VISUAL_HZ; + for(let i = 0; i < ratioTimer; i++) { + state.chip8.clock_dt_ws(); + state.chip8.clock_st_ws(); + } - while (true) { - chip8.clock_ws(); - updateCanvas(chip8.vram_ws()); + // updates the canvas object with the new + // visual information comming in + updateCanvas(state.chip8.vram_ws()); - // hack + // @todo hack await new Promise((resolve, reject) => { - setTimeout(resolve, 100); + setTimeout(resolve, 1000 / VISUAL_HZ); }) } })(); +const registerDrop = () => { + document.addEventListener("drop", async (e) => { + e.preventDefault(); + e.stopPropagation(); + + if (!e.dataTransfer.files) return; + + const file = e.dataTransfer.files[0]; + + const arrayBuffer = await file.arrayBuffer(); + const data = new Uint8Array(arrayBuffer); + + state.chip8.reset_hard_ws(); + state.chip8.load_rom_ws(data); + }); + document.addEventListener("dragover", async (e) => { + e.preventDefault(); + e.stopPropagation(); + + console.info("draging over"); + }); +} + const initCanvas = () => { // initializes the off-screen canvas that is going to be // used in the drawing proces diff --git a/resources/chips-ahoy.jpeg b/res/chips-ahoy.jpeg similarity index 100% rename from resources/chips-ahoy.jpeg rename to res/chips-ahoy.jpeg diff --git a/resources/roms/bc_test.ch8 b/res/roms/bc_test.ch8 similarity index 100% rename from resources/roms/bc_test.ch8 rename to res/roms/bc_test.ch8 diff --git a/resources/roms/bmp.ch8 b/res/roms/bmp.ch8 similarity index 100% rename from resources/roms/bmp.ch8 rename to res/roms/bmp.ch8 diff --git a/resources/roms/breakout.ch8 b/res/roms/breakout.ch8 similarity index 100% rename from resources/roms/breakout.ch8 rename to res/roms/breakout.ch8 diff --git a/resources/roms/chip8_picture.ch8 b/res/roms/chip8_picture.ch8 similarity index 100% rename from resources/roms/chip8_picture.ch8 rename to res/roms/chip8_picture.ch8 diff --git a/resources/roms/chipwar.ch8 b/res/roms/chipwar.ch8 similarity index 100% rename from resources/roms/chipwar.ch8 rename to res/roms/chipwar.ch8 diff --git a/resources/roms/ibm_logo.ch8 b/res/roms/ibm_logo.ch8 similarity index 100% rename from resources/roms/ibm_logo.ch8 rename to res/roms/ibm_logo.ch8 diff --git a/resources/roms/keypad.ch8 b/res/roms/keypad.ch8 similarity index 100% rename from resources/roms/keypad.ch8 rename to res/roms/keypad.ch8 diff --git a/resources/roms/maze.ch8 b/res/roms/maze.ch8 similarity index 100% rename from resources/roms/maze.ch8 rename to res/roms/maze.ch8 diff --git a/resources/roms/octojam_6_title.ch8 b/res/roms/octojam_6_title.ch8 similarity index 100% rename from resources/roms/octojam_6_title.ch8 rename to res/roms/octojam_6_title.ch8 diff --git a/resources/roms/pong.ch8 b/res/roms/pong.ch8 similarity index 100% rename from resources/roms/pong.ch8 rename to res/roms/pong.ch8 diff --git a/resources/roms/pong_paul.ch8 b/res/roms/pong_paul.ch8 similarity index 100% rename from resources/roms/pong_paul.ch8 rename to res/roms/pong_paul.ch8 diff --git a/resources/roms/sirpinski.ch8 b/res/roms/sirpinski.ch8 similarity index 100% rename from resources/roms/sirpinski.ch8 rename to res/roms/sirpinski.ch8 diff --git a/resources/roms/snake.ch8 b/res/roms/snake.ch8 similarity index 100% rename from resources/roms/snake.ch8 rename to res/roms/snake.ch8 diff --git a/resources/roms/soccer.ch8 b/res/roms/soccer.ch8 similarity index 100% rename from resources/roms/soccer.ch8 rename to res/roms/soccer.ch8 diff --git a/resources/roms/space_invaders.ch8 b/res/roms/space_invaders.ch8 similarity index 100% rename from resources/roms/space_invaders.ch8 rename to res/roms/space_invaders.ch8 diff --git a/resources/roms/spacejam.ch8 b/res/roms/spacejam.ch8 similarity index 100% rename from resources/roms/spacejam.ch8 rename to res/roms/spacejam.ch8 diff --git a/resources/roms/test_opcode.ch8 b/res/roms/test_opcode.ch8 similarity index 100% rename from resources/roms/test_opcode.ch8 rename to res/roms/test_opcode.ch8 diff --git a/resources/roms/tetris.ch8 b/res/roms/tetris.ch8 similarity index 100% rename from resources/roms/tetris.ch8 rename to res/roms/tetris.ch8 diff --git a/resources/roms/tic_tac_toe.ch8 b/res/roms/tic_tac_toe.ch8 similarity index 100% rename from resources/roms/tic_tac_toe.ch8 rename to res/roms/tic_tac_toe.ch8 diff --git a/src/chip8_neo.rs b/src/chip8_neo.rs index 0b01cfafe72de6cf60095fd69c6832b25e87be80..17a7c82e5203733a34ef24bef740cd92eb53a84a 100644 --- a/src/chip8_neo.rs +++ b/src/chip8_neo.rs @@ -385,6 +385,14 @@ impl Chip8Neo { pub fn clock_ws(&mut self) { self.clock() } + + pub fn clock_dt_ws(&mut self) { + self.clock_dt() + } + + pub fn clock_st_ws(&mut self) { + self.clock_st() + } } impl Default for Chip8Neo {