From 08d3cbe218424ad3ded3263722afb6ed7b739862 Mon Sep 17 00:00:00 2001 From: Daniel Hammer Date: Thu, 9 Jul 2026 11:43:21 +0200 Subject: [PATCH] feat: add warning in DOOM for missing wad --- kernel/src/Api/BuildNo.hpp | 2 +- programs/src/doom/Makefile | 54 ++++++++++++++++++++----- programs/src/doom/doom_wad_check.cpp | 22 ++++++++++ programs/src/doom/doomgeneric_montauk.c | 16 +++++++- 4 files changed, 83 insertions(+), 11 deletions(-) create mode 100644 programs/src/doom/doom_wad_check.cpp diff --git a/kernel/src/Api/BuildNo.hpp b/kernel/src/Api/BuildNo.hpp index 43b7931..4adff58 100644 --- a/kernel/src/Api/BuildNo.hpp +++ b/kernel/src/Api/BuildNo.hpp @@ -12,4 +12,4 @@ #pragma once -#define MONTAUK_BUILD_NUMBER 6 +#define MONTAUK_BUILD_NUMBER 7 diff --git a/programs/src/doom/Makefile b/programs/src/doom/Makefile index 73cf968..a8b2e3d 100644 --- a/programs/src/doom/Makefile +++ b/programs/src/doom/Makefile @@ -8,11 +8,13 @@ MAKEFLAGS += -rR TOOLCHAIN_PREFIX := $(shell cd ../../.. && pwd)/toolchain/local/bin/x86_64-elf- ifneq ($(wildcard $(TOOLCHAIN_PREFIX)gcc),) - CC := $(TOOLCHAIN_PREFIX)gcc - LD := $(TOOLCHAIN_PREFIX)gcc + CC := $(TOOLCHAIN_PREFIX)gcc + CXX := $(TOOLCHAIN_PREFIX)g++ + LD := $(TOOLCHAIN_PREFIX)gcc else - CC := gcc - LD := gcc + CC := gcc + CXX := g++ + LD := gcc endif # ---- Paths ---- @@ -21,6 +23,7 @@ DOOM_SRC := ../../../doomgeneric/doomgeneric LIBC_INC := ../../include/libc PROG_INC := ../../include LIBDIR := ../../lib +LOADER_LIB := ../../lib/libloader LINK_LD := ../../link.ld BINDIR := ../../bin OBJDIR := obj @@ -58,6 +61,32 @@ CFLAGS := \ -I $(DOOM_SRC) \ -isystem $(shell $(CC) -print-file-name=include) +CXXFLAGS := \ + -std=gnu++20 \ + -g -O2 -pipe \ + -Wall \ + -Wno-unused-parameter \ + -nostdinc \ + -ffreestanding \ + -fno-stack-protector \ + -fno-stack-check \ + -fno-PIC \ + -fno-rtti \ + -fno-exceptions \ + -ffunction-sections \ + -fdata-sections \ + -m64 \ + -march=x86-64 \ + -msse \ + -msse2 \ + -mno-red-zone \ + -mcmodel=small \ + -isystem $(LIBC_INC) \ + -I . \ + -I $(PROG_INC) \ + -isystem ../../../kernel/freestnd-c-hdrs/x86_64/include \ + -isystem ../../../kernel/freestnd-cxx-hdrs/x86_64/include + # ---- Linker flags ---- LDFLAGS := \ @@ -156,13 +185,15 @@ DOOM_SRCS := \ z_zone.c # Local source files -LOCAL_SRCS := doomgeneric_montauk.c i_sound_montauk.c +LOCAL_SRCS := doomgeneric_montauk.c i_sound_montauk.c +LOCAL_CXX_SRCS := doom_wad_check.cpp # ---- Object files ---- -DOOM_OBJS := $(addprefix $(OBJDIR)/,$(DOOM_SRCS:.c=.o)) -LOCAL_OBJS := $(addprefix $(OBJDIR)/,$(LOCAL_SRCS:.c=.o)) -ALL_OBJS := $(DOOM_OBJS) $(LOCAL_OBJS) +DOOM_OBJS := $(addprefix $(OBJDIR)/,$(DOOM_SRCS:.c=.o)) +LOCAL_OBJS := $(addprefix $(OBJDIR)/,$(LOCAL_SRCS:.c=.o)) +LOCAL_CXX_OBJS := $(addprefix $(OBJDIR)/,$(LOCAL_CXX_SRCS:.cpp=.o)) +ALL_OBJS := $(DOOM_OBJS) $(LOCAL_OBJS) $(LOCAL_CXX_OBJS) # ---- Target ---- @@ -174,7 +205,7 @@ all: $(TARGET) $(TARGET): $(ALL_OBJS) $(LINK_LD) Makefile mkdir -p $(BINDIR)/apps/doom - $(LD) $(CFLAGS) $(LDFLAGS) $(ALL_OBJS) $(LIBDIR)/libc/liblibc.a -o $@ + $(LD) $(CFLAGS) $(LDFLAGS) $(ALL_OBJS) $(LOADER_LIB)/liblibloader.a $(LIBDIR)/libc/liblibc.a -o $@ # DOOM source files (from doomgeneric directory) $(OBJDIR)/%.o: $(DOOM_SRC)/%.c Makefile @@ -186,6 +217,11 @@ $(OBJDIR)/%.o: %.c Makefile mkdir -p $(OBJDIR) $(CC) $(CFLAGS) -MMD -MP -c $< -o $@ +# Local C++ source files +$(OBJDIR)/%.o: %.cpp Makefile + mkdir -p $(OBJDIR) + $(CXX) $(CXXFLAGS) -MMD -MP -c $< -o $@ + clean: rm -rf $(OBJDIR) $(TARGET) diff --git a/programs/src/doom/doom_wad_check.cpp b/programs/src/doom/doom_wad_check.cpp new file mode 100644 index 0000000..911419f --- /dev/null +++ b/programs/src/doom/doom_wad_check.cpp @@ -0,0 +1,22 @@ +/* + * doom_wad_check.cpp + * Warns the user and exits cleanly if no DOOM WAD is present + * Copyright (c) 2026 Daniel Hammer +*/ + +#include +#include +#include + +extern "C" [[noreturn]] void doom_warn_missing_wad(const char* path) { + char message[400]; + snprintf(message, sizeof(message), + "No DOOM WAD file was found at %s.\n\n" + "MontaukOS cannot ship proprietary DOOM WADs (doom1.wad, doom.wad, " + "freedoom1.wad, etc.) on its ISO images due to copyright restrictions.\n\n" + "Copy a legally obtained WAD file to that path and relaunch DOOM.", + path); + + gui::dialogs::message_box("DOOM", message, gui::dialogs::MESSAGE_BOX_OK); + montauk::exit(1); +} diff --git a/programs/src/doom/doomgeneric_montauk.c b/programs/src/doom/doomgeneric_montauk.c index d0ff299..a0522f2 100644 --- a/programs/src/doom/doomgeneric_montauk.c +++ b/programs/src/doom/doomgeneric_montauk.c @@ -246,8 +246,22 @@ void DG_SetWindowTitle(const char* title) { /* ---- Entry point ---- */ +/* Shows a warning dialog explaining that MontaukOS cannot ship proprietary + * DOOM WADs and does not return (implemented in doom_wad_check.cpp, which + * links against the shared dialog library). */ +extern void doom_warn_missing_wad(const char* path); + void _start(void) { - char *argv[] = { "doom", "-iwad", "0:/apps/doom/doom1.wad", 0 }; + static const char* wadPath = "0:/apps/doom/doom1.wad"; + + FILE* wad = fopen(wadPath, "rb"); + if (!wad) { + doom_warn_missing_wad(wadPath); + /* unreachable: doom_warn_missing_wad() exits the process */ + } + fclose(wad); + + char *argv[] = { "doom", "-iwad", (char*)wadPath, 0 }; doomgeneric_Create(3, argv); for (;;) { doomgeneric_Tick();