Skip to content
Snippets Groups Projects
debug.tsx 5.1 KiB
Newer Older
  • Learn to ignore specific revisions
  • import React, { FC, useEffect, useState } from "react";
    import { ButtonSwitch, Info, Pair } from "emukit";
    
    import { AudioGB } from "../audio-gb/audio-gb";
    import { RegistersGB } from "../registers-gb/registers-gb";
    import { TilesGB } from "../tiles-gb/tiles-gb";
    import { GameboyEmulator } from "../../../ts";
    
    import "./debug.css";
    
    type EmulatorProps = {
        emulator: GameboyEmulator;
    };
    
    export const DebugVideo: FC<EmulatorProps> = ({ emulator }) => {
        return (
            <>
                {emulator.getTile && (
                    <div
                        style={{
                            display: "inline-block",
                            verticalAlign: "top",
                            marginRight: 32,
                            width: 256
                        }}
                    >
                        <h3>VRAM Tiles</h3>
                        <TilesGB
                            getTile={(index) =>
                                emulator.getTile
                                    ? emulator.getTile(index)
                                    : new Uint8Array()
                            }
                            tileCount={384}
                            width={"100%"}
                            contentBox={false}
                        />
                    </div>
                )}
                <div
                    style={{
                        display: "inline-block",
                        verticalAlign: "top"
                    }}
                >
                    <h3>Registers</h3>
                    <RegistersGB getRegisters={() => emulator.registers} />
                </div>
            </>
        );
    };
    
    export const DebugAudio: FC<EmulatorProps> = ({ emulator }) => {
        return (
            <>
                <div
                    style={{
                        display: "inline-block",
                        verticalAlign: "top"
                    }}
                >
                    <h3>Audio Waveform</h3>
    
                    <AudioGB getAudioOutput={() => emulator.audioOutput} />
    
    
    export const DebugSettings: FC<EmulatorProps> = ({ emulator }) => {
        return (
            <>
                <DebugSettingsContent emulator={emulator}></DebugSettingsContent>
            </>
        );
    };
    
    const DebugSettingsContent: FC<EmulatorProps> = ({ emulator }) => {
        const [updated, setUpdated] = useState(Date.now());
    
        useEffect(() => {
            const onAudioState = () => {
                setUpdated(Date.now());
            };
            emulator.bind("audio-state", onAudioState);
            return () => {
                emulator.unbind("audio-state", onAudioState);
            };
        }, []);
    
        const onPpuChange = (option: string) => {
            emulator.instance?.set_ppu_enabled(option === "on");
        };
    
        const onApuChange = (option: string) => {
            emulator.instance?.set_apu_enabled(option === "on");
        };
    
        const onTimerChange = (option: string) => {
            emulator.instance?.set_timer_enabled(option === "on");
        };
    
        const onSerialChange = (option: string) => {
            emulator.instance?.set_serial_enabled(option === "on");
        };
    
        return (
            <Info key={updated}>
                <Pair
                    name={"PPU"}
                    valueNode={
                        <ButtonSwitch
                            options={["on", "off"]}
                            value={emulator.instance?.ppu_enabled() ? "on" : "off"}
                            uppercase={true}
                            size={"large"}
                            style={["simple"]}
                            onChange={onPpuChange}
                        />
                    }
                />
                <Pair
                    name={"APU"}
                    valueNode={
                        <ButtonSwitch
                            options={["on", "off"]}
                            value={emulator.instance?.apu_enabled() ? "on" : "off"}
                            uppercase={true}
                            size={"large"}
                            style={["simple"]}
                            onChange={onApuChange}
                        />
                    }
                />
                <Pair
                    name={"Timer"}
                    valueNode={
                        <ButtonSwitch
                            options={["on", "off"]}
                            value={
                                emulator.instance?.timer_enabled() ? "on" : "off"
                            }
                            uppercase={true}
                            size={"large"}
                            style={["simple"]}
                            onChange={onTimerChange}
                        />
                    }
                />
                <Pair
                    name={"Serial"}
                    valueNode={
                        <ButtonSwitch
                            options={["on", "off"]}
                            value={
                                emulator.instance?.serial_enabled() ? "on" : "off"
                            }
                            uppercase={true}
                            size={"large"}
                            style={["simple"]}
                            onChange={onSerialChange}
                        />
                    }
                />
            </Info>
        );
    };