ULX3S / Hazard3-Doom

Device Tool

Not connected

Device uploading

FPGA, console firmware, Doom application, and IWAD loading tools.

FPGA / Firmware / Doom
FPGA web flasher ULX3S US1 / JTAG

Program Hazard3-Doom from the browser

Uses WebUSB to drive the ULX3S FT231X JTAG interface directly. This first version programs FPGA SRAM from a Hazard3-Doom .bit file or an SVF file, so the image is temporary and is lost when the board powers off.

USB/JTAG Not connected FPGA Not probed Docs
Before programming Use the ULX3S US1 USB connector. Close fujprog, OpenOCD, and other programs using US1. The browser derives or verifies the ECP5 target ID before programming.
Idle
Flasher log


                        

Persistent SPI flash is intentionally not written by this first implementation. Verify browser/JTAG programming on both ULX3S 12F and 85F before enabling a permanent-flash workflow.

Console firmware uploader Local GDB / OpenOCD

Load the Hazard3 console firmware

Select hazard3-boot-monitor.elf. The local web server passes the ELF to the existing GDB loader, which halts Hazard3 through OpenOCD, writes and verifies the ELF sections, sets _start, and resumes the core.

Local loader Checking... (source) OpenOCD Must already listen on port 3333. See tips
Load flow 1. Program the matching FPGA bitstream. 2. Disconnect the browser FPGA flasher from US1. 3. Start OpenOCD with the matching board configuration. 4. Select the RISC-V ELF and load it.
Checking local loader...


                        

The firmware does not need a self-replacement listener for this path. OpenOCD and GDB load it through the Hazard3 debug module. This control is available only when the page is served by web/web-server.py, not from GitHub Pages or a generic static HTTP server.

Doom H3D uploader UART / H3L

Load a Doom image over UART

Select a packaged .h3d image and send it directly to the resident monitor. The browser validates the H3D header and payload CRC32 before transfer. This loads SDRAM only; it does not modify the SD card.

Protocol H3L over Web Serial Monitor Use from the > prompt
Upload flow 1. Connect the UART terminal. 2. Stop Doom first if it is currently running. 3. Select a valid packaged H3D image. 4. Upload; the browser performs the H3L READY/DATA/OK handshake.
Idle

The H3L loader must own the UART. If Doom is running, use Stop Doom first and wait for the resident monitor > prompt before uploading.

Doom IWAD uploader UART / H3W

Load a Doom IWAD over UART

Select a legally obtained .wad file and send it to the resident monitor's reserved SDRAM IWAD region. The browser validates the IWAD header, directory, lump bounds, filename, and CRC32 before transfer.

Protocol H3W over Web Serial Monitor Use from the > prompt
Doom IWAD (.wad) No IWAD selected
Upload flow 1. Connect the UART terminal. 2. Stop Doom first if it is currently running. 3. Select an IWAD and the memory profile matching the monitor build. 4. Upload; the browser performs the H3W READY/DATA/OK handshake.
Idle

IWAD files are not included with Hazard3-Doom. Use a legally obtained IWAD. The selected memory profile must match the resident monitor build because the H3W header contains the SDRAM load address.

Serial connection

Direct browser connection using the Web Serial API.

Web Serial

UART terminal

No serial port selected.



            

Hazard3-Doom controls

Convenience controls for the resident monitor. Line commands use the selected line ending; raw monitor keys are sent as one byte.

Monitor
SAO / I2C
I2CDriver GUI keys

Single-byte controls for the interactive i2c gui screen; no CR/LF is appended.

The custom command is saved only in this browser.