shithub: rgbds

Download patch

ref: fa13611bbf6a1db1a439d9ba4ec9e6e8bb4f9f7c
parent: dca24a6d500565997156f25544572cd1d4c4dbe3
author: Rangi <remy.oukaour+rangi42@gmail.com>
date: Mon Aug 29 14:01:34 EDT 2022

Make comments more consistent

- Changes most `/* comments */` to `// comments`
- Changes `/**` block comments consistently to `/*`
- Adds consistent license comments to all files

Also renames `T_POP_SET` to `T_Z80_SET`

--- a/include/asm/charmap.h
+++ b/include/asm/charmap.h
@@ -20,4 +20,4 @@
 size_t charmap_Convert(char const *input, uint8_t *output);
 size_t charmap_ConvertNext(char const **input, uint8_t **output);
 
-#endif /* RGBDS_ASM_CHARMAP_H */
+#endif // RGBDS_ASM_CHARMAP_H
--- a/include/asm/fixpoint.h
+++ b/include/asm/fixpoint.h
@@ -28,4 +28,4 @@
 int32_t fix_Ceil(int32_t i);
 int32_t fix_Floor(int32_t i);
 
-#endif /* RGBDS_ASM_FIXPOINT_H */
+#endif // RGBDS_ASM_FIXPOINT_H
--- a/include/asm/format.h
+++ b/include/asm/format.h
@@ -60,4 +60,4 @@
 void fmt_PrintString(char *buf, size_t bufLen, struct FormatSpec const *fmt, char const *value);
 void fmt_PrintNumber(char *buf, size_t bufLen, struct FormatSpec const *fmt, uint32_t value);
 
-#endif /* RGBDS_FORMAT_SPEC_H */
+#endif // RGBDS_FORMAT_SPEC_H
--- a/include/asm/fstack.h
+++ b/include/asm/fstack.h
@@ -6,9 +6,7 @@
  * SPDX-License-Identifier: MIT
  */
 
-/*
- * Contains some assembler-wide defines and externs
- */
+// Contains some assembler-wide defines and externs
 
 #ifndef RGBDS_ASM_FSTACK_H
 #define RGBDS_ASM_FSTACK_H
@@ -21,13 +19,13 @@
 
 
 struct FileStackNode {
-	struct FileStackNode *parent; /* Pointer to parent node, for error reporting */
-	/* Line at which the parent context was exited; meaningless for the root level */
+	struct FileStackNode *parent; // Pointer to parent node, for error reporting
+	// Line at which the parent context was exited; meaningless for the root level
 	uint32_t lineNo;
 
-	struct FileStackNode *next; /* Next node in the output linked list */
-	bool referenced; /* If referenced, don't free! */
-	uint32_t ID; /* Set only if referenced: ID within the object file, -1 if not output yet */
+	struct FileStackNode *next; // Next node in the output linked list
+	bool referenced; // If referenced, don't free!
+	uint32_t ID; // Set only if referenced: ID within the object file, -1 if not output yet
 
 	enum {
 		NODE_REPT,
@@ -36,16 +34,16 @@
 	} type;
 };
 
-struct FileStackReptNode { /* NODE_REPT */
+struct FileStackReptNode { // NODE_REPT
 	struct FileStackNode node;
 	uint32_t reptDepth;
-	/* WARNING: if changing this type, change overflow check in `fstk_Init` */
-	uint32_t iters[]; /* REPT iteration counts since last named node, in reverse depth order */
+	// WARNING: if changing this type, change overflow check in `fstk_Init`
+	uint32_t iters[]; // REPT iteration counts since last named node, in reverse depth order
 };
 
-struct FileStackNamedNode { /* NODE_FILE, NODE_MACRO */
+struct FileStackNamedNode { // NODE_FILE, NODE_MACRO
 	struct FileStackNode node;
-	char name[]; /* File name for files, file::macro name for macros */
+	char name[]; // File name for files, file::macro name for macros
 };
 
 #define DEFAULT_MAX_DEPTH 64
@@ -56,11 +54,11 @@
 void fstk_Dump(struct FileStackNode const *node, uint32_t lineNo);
 void fstk_DumpCurrent(void);
 struct FileStackNode *fstk_GetFileStack(void);
-/* The lifetime of the returned chars is until reaching the end of that file */
+// The lifetime of the returned chars is until reaching the end of that file
 char const *fstk_GetFileName(void);
 
 void fstk_AddIncludePath(char const *s);
-/**
+/*
  * @param path The user-provided file name
  * @param fullPath The address of a pointer, which will be made to point at the full path
  *                 The pointer's value must be a valid argument to `realloc`, including NULL
@@ -81,4 +79,4 @@
 void fstk_NewRecursionDepth(size_t newDepth);
 void fstk_Init(char const *mainPath, size_t maxDepth);
 
-#endif /* RGBDS_ASM_FSTACK_H */
+#endif // RGBDS_ASM_FSTACK_H
--- a/include/asm/lexer.h
+++ b/include/asm/lexer.h
@@ -11,7 +11,7 @@
 
 #include <stdbool.h>
 
-#define MAXSTRLEN	255
+#define MAXSTRLEN 255
 
 struct LexerState;
 extern struct LexerState *lexerState;
@@ -49,9 +49,7 @@
 	gfxDigits[3] = digits[3];
 }
 
-/*
- * `path` is referenced, but not held onto..!
- */
+// `path` is referenced, but not held onto..!
 struct LexerState *lexer_OpenFile(char const *path);
 struct LexerState *lexer_OpenFileView(char const *path, char *buf, size_t size, uint32_t lineNo);
 void lexer_RestartRept(uint32_t lineNo);
@@ -99,4 +97,4 @@
 	struct Expression *args;
 };
 
-#endif /* RGBDS_ASM_LEXER_H */
+#endif // RGBDS_ASM_LEXER_H
--- a/include/asm/macro.h
+++ b/include/asm/macro.h
@@ -34,4 +34,4 @@
 void macro_ShiftCurrentArgs(int32_t count);
 uint32_t macro_NbArgs(void);
 
-#endif
+#endif // RGBDS_MACRO_H
--- a/include/asm/main.h
+++ b/include/asm/main.h
@@ -20,7 +20,7 @@
 extern bool optimizeLoads;
 extern bool warnOnLdOpt;
 extern bool verbose;
-extern bool warnings; /* True to enable warnings, false to disable them. */
+extern bool warnings; // True to enable warnings, false to disable them.
 
 extern FILE *dependfile;
 extern char *targetFileName;
@@ -28,4 +28,4 @@
 extern bool failedOnMissingInclude;
 extern bool generatePhonyDeps;
 
-#endif /* RGBDS_MAIN_H */
+#endif // RGBDS_MAIN_H
--- a/include/asm/opt.h
+++ b/include/asm/opt.h
@@ -22,4 +22,4 @@
 void opt_Push(void);
 void opt_Pop(void);
 
-#endif
+#endif // RGBDS_OPT_H
--- a/include/asm/output.h
+++ b/include/asm/output.h
@@ -27,4 +27,4 @@
 		      char const *message, uint32_t ofs);
 void out_WriteObject(void);
 
-#endif /* RGBDS_ASM_OUTPUT_H */
+#endif // RGBDS_ASM_OUTPUT_H
--- a/include/asm/rpn.h
+++ b/include/asm/rpn.h
@@ -27,17 +27,13 @@
 	uint32_t rpnPatchSize; // Size the expression will take in the object file
 };
 
-/*
- * Determines if an expression is known at assembly time
- */
+// Determines if an expression is known at assembly time
 static inline bool rpn_isKnown(struct Expression const *expr)
 {
 	return expr->isKnown;
 }
 
-/*
- * Determines if an expression is a symbol suitable for const diffing
- */
+// Determines if an expression is a symbol suitable for const diffing
 static inline bool rpn_isSymbol(const struct Expression *expr)
 {
 	return expr->isSymbol;
@@ -67,4 +63,4 @@
 void rpn_CheckNBit(struct Expression const *expr, uint8_t n);
 int32_t rpn_GetConstVal(struct Expression const *expr);
 
-#endif /* RGBDS_ASM_RPN_H */
+#endif // RGBDS_ASM_RPN_H
--- a/include/asm/section.h
+++ b/include/asm/section.h
@@ -23,8 +23,8 @@
 	char *name;
 	enum SectionType type;
 	enum SectionModifier modifier;
-	struct FileStackNode *src; /* Where the section was defined */
-	uint32_t fileLine; /* Line where the section was defined */
+	struct FileStackNode *src; // Where the section was defined
+	uint32_t fileLine; // Line where the section was defined
 	uint32_t size;
 	uint32_t org;
 	uint32_t bank;
@@ -79,4 +79,4 @@
 
 bool sect_IsSizeKnown(struct Section const NONNULL(name));
 
-#endif
+#endif // RGBDS_SECTION_H
--- a/include/asm/symbol.h
+++ b/include/asm/symbol.h
@@ -32,28 +32,28 @@
 struct Symbol {
 	char name[MAXSYMLEN + 1];
 	enum SymbolType type;
-	bool isExported; /* Whether the symbol is to be exported */
-	bool isBuiltin;  /* Whether the symbol is a built-in */
+	bool isExported; // Whether the symbol is to be exported
+	bool isBuiltin;  // Whether the symbol is a built-in
 	struct Section *section;
-	struct FileStackNode *src; /* Where the symbol was defined */
-	uint32_t fileLine; /* Line where the symbol was defined */
+	struct FileStackNode *src; // Where the symbol was defined
+	uint32_t fileLine; // Line where the symbol was defined
 
 	bool hasCallback;
 	union {
-		/* If sym_IsNumeric */
+		// If sym_IsNumeric
 		int32_t value;
 		int32_t (*numCallback)(void);
-		/* For SYM_MACRO and SYM_EQUS; TODO: have separate fields */
+		// For SYM_MACRO and SYM_EQUS; TODO: have separate fields
 		struct {
 			size_t macroSize;
 			char *macro;
 		};
-		/* For SYM_EQUS */
+		// For SYM_EQUS
 		char const *(*strCallback)(void);
 	};
 
-	uint32_t ID; /* ID of the symbol in the object file (-1 if none) */
-	struct Symbol *next; /* Next object to output in the object file */
+	uint32_t ID; // ID of the symbol in the object file (-1 if none)
+	struct Symbol *next; // Next object to output in the object file
 };
 
 bool sym_IsPC(struct Symbol const *sym);
@@ -98,9 +98,7 @@
 	return sym->isExported;
 }
 
-/*
- * Get a string equate's value
- */
+// Get a string equate's value
 static inline char const *sym_GetStringValue(struct Symbol const *sym)
 {
 	if (sym->hasCallback)
@@ -123,17 +121,11 @@
 uint32_t sym_GetPCValue(void);
 uint32_t sym_GetConstantSymValue(struct Symbol const *sym);
 uint32_t sym_GetConstantValue(char const *symName);
-/*
- * Find a symbol by exact name, bypassing expansion checks
- */
+// Find a symbol by exact name, bypassing expansion checks
 struct Symbol *sym_FindExactSymbol(char const *symName);
-/*
- * Find a symbol by exact name; may not be scoped, produces an error if it is
- */
+// Find a symbol by exact name; may not be scoped, produces an error if it is
 struct Symbol *sym_FindUnscopedSymbol(char const *symName);
-/*
- * Find a symbol, possibly scoped, by name
- */
+// Find a symbol, possibly scoped, by name
 struct Symbol *sym_FindScopedSymbol(char const *symName);
 struct Symbol const *sym_GetPC(void);
 struct Symbol *sym_AddMacro(char const *symName, int32_t defLineNo, char *body, size_t size);
@@ -143,8 +135,8 @@
 void sym_Purge(char const *symName);
 void sym_Init(time_t now);
 
-/* Functions to save and restore the current symbol scope. */
+// Functions to save and restore the current symbol scope.
 char const *sym_GetCurrentSymbolScope(void);
 void sym_SetCurrentSymbolScope(char const *newScope);
 
-#endif /* RGBDS_SYMBOL_H */
+#endif // RGBDS_SYMBOL_H
--- a/include/asm/util.h
+++ b/include/asm/util.h
@@ -18,4 +18,4 @@
  */
 size_t readUTF8Char(uint8_t *dest, char const *src);
 
-#endif /* RGBDS_UTIL_H */
+#endif // RGBDS_UTIL_H
--- a/include/asm/warning.h
+++ b/include/asm/warning.h
@@ -91,4 +91,4 @@
  */
 void error(char const *fmt, ...) format_(printf, 1, 2);
 
-#endif
+#endif // WARNING_H
--- a/include/defaultinitalloc.hpp
+++ b/include/defaultinitalloc.hpp
@@ -1,4 +1,4 @@
-/**
+/*
  * Allocator adaptor that interposes construct() calls to convert value-initialization
  * (which is what you get with e.g. `vector::resize`) into default-initialization (which does not
  * zero out non-class types).
@@ -36,4 +36,4 @@
 template<typename T>
 using DefaultInitVec = std::vector<T, default_init_allocator<T>>;
 
-#endif
+#endif // DEFAULT_INIT_ALLOC_H
--- a/include/error.h
+++ b/include/error.h
@@ -26,4 +26,4 @@
 }
 #endif
 
-#endif /* RGBDS_ERROR_H */
+#endif // RGBDS_ERROR_H
--- a/include/extern/utf8decoder.h
+++ b/include/extern/utf8decoder.h
@@ -11,4 +11,4 @@
 
 uint32_t decode(uint32_t *state, uint32_t *codep, uint8_t byte);
 
-#endif /* EXTERN_UTF8DECODER_H */
+#endif // EXTERN_UTF8DECODER_H
--- a/include/gfx/main.hpp
+++ b/include/gfx/main.hpp
@@ -71,19 +71,19 @@
 
 extern Options options;
 
-/**
+/*
  * Prints the error count, and exits with failure
  */
 [[noreturn]] void giveUp();
-/**
+/*
  * Prints a warning, and does not change the error count
  */
 void warning(char const *fmt, ...);
-/**
+/*
  * Prints an error, and increments the error count
  */
 void error(char const *fmt, ...);
-/**
+/*
  * Prints a fatal error, increments the error count, and gives up
  */
 [[noreturn]] void fatal(char const *fmt, ...);
@@ -120,4 +120,4 @@
 // Flipping tends to happen fairly often, so take a bite out of dcache to speed it up
 static constexpr auto flipTable = detail::flipTable(std::make_integer_sequence<uint16_t, 256>());
 
-#endif /* RGBDS_GFX_MAIN_HPP */
+#endif // RGBDS_GFX_MAIN_HPP
--- a/include/gfx/pal_packing.hpp
+++ b/include/gfx/pal_packing.hpp
@@ -21,7 +21,7 @@
 
 namespace packing {
 
-/**
+/*
  * Returns which palette each proto-palette maps to, and how many palettes are necessary
  */
 std::tuple<DefaultInitVec<size_t>, size_t>
@@ -29,4 +29,4 @@
 
 }
 
-#endif /* RGBDS_GFX_PAL_PACKING_HPP */
+#endif // RGBDS_GFX_PAL_PACKING_HPP
--- a/include/gfx/pal_sorting.hpp
+++ b/include/gfx/pal_sorting.hpp
@@ -29,4 +29,4 @@
 
 }
 
-#endif /* RGBDS_GFX_PAL_SORTING_HPP */
+#endif // RGBDS_GFX_PAL_SORTING_HPP
--- a/include/gfx/pal_spec.hpp
+++ b/include/gfx/pal_spec.hpp
@@ -12,4 +12,4 @@
 void parseInlinePalSpec(char const * const arg);
 void parseExternalPalSpec(char const *arg);
 
-#endif /* RGBDS_GFX_PAL_SPEC_HPP */
+#endif // RGBDS_GFX_PAL_SPEC_HPP
--- a/include/gfx/process.hpp
+++ b/include/gfx/process.hpp
@@ -11,4 +11,4 @@
 
 void process();
 
-#endif /* RGBDS_GFX_CONVERT_HPP */
+#endif // RGBDS_GFX_CONVERT_HPP
--- a/include/gfx/proto_palette.hpp
+++ b/include/gfx/proto_palette.hpp
@@ -21,7 +21,7 @@
 	std::array<uint16_t, 4> _colorIndices{UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX};
 
 public:
-	/**
+	/*
 	 * Adds the specified color to the set
 	 * Returns false if the set is full
 	 */
@@ -41,4 +41,4 @@
 	decltype(_colorIndices)::const_iterator end() const;
 };
 
-#endif /* RGBDS_GFX_PROTO_PALETTE_HPP */
+#endif // RGBDS_GFX_PROTO_PALETTE_HPP
--- a/include/gfx/reverse.hpp
+++ b/include/gfx/reverse.hpp
@@ -11,4 +11,4 @@
 
 void reverse();
 
-#endif /* RGBDS_GFX_REVERSE_HPP */
+#endif // RGBDS_GFX_REVERSE_HPP
--- a/include/gfx/rgba.hpp
+++ b/include/gfx/rgba.hpp
@@ -20,7 +20,7 @@
 
 	constexpr Rgba(uint8_t r, uint8_t g, uint8_t b, uint8_t a)
 	    : red(r), green(g), blue(b), alpha(a) {}
-	/**
+	/*
 	 * Constructs the color from a "packed" RGBA representation (0xRRGGBBAA)
 	 */
 	explicit constexpr Rgba(uint32_t rgba = 0)
@@ -35,7 +35,7 @@
 		        (uint8_t)(cgbColor & 0x8000 ? 0x00 : 0xFF)};
 	}
 
-	/**
+	/*
 	 * Returns this RGBA as a 32-bit number that can be printed in hex (`%08x`) to yield its CSS
 	 * representation
 	 */
@@ -45,7 +45,7 @@
 	}
 	friend bool operator!=(Rgba const &lhs, Rgba const &rhs) { return lhs.toCSS() != rhs.toCSS(); }
 
-	/**
+	/*
 	 * CGB colors are RGB555, so we use bit 15 to signify that the color is transparent instead
 	 * Since the rest of the bits don't matter then, we return 0x8000 exactly.
 	 */
@@ -55,7 +55,7 @@
 	bool isTransparent() const { return alpha < transparency_threshold; }
 	static constexpr uint8_t opacity_threshold = 0xF0;
 	bool isOpaque() const { return alpha >= opacity_threshold; }
-	/**
+	/*
 	 * Computes the equivalent CGB color, respects the color curve depending on options
 	 */
 	uint16_t cgbColor() const;
@@ -64,4 +64,4 @@
 	uint8_t grayIndex() const;
 };
 
-#endif /* RGBDS_GFX_RGBA_HPP */
+#endif // RGBDS_GFX_RGBA_HPP
--- a/include/hashmap.h
+++ b/include/hashmap.h
@@ -6,7 +6,7 @@
  * SPDX-License-Identifier: MIT
  */
 
-/* Generic hashmap implementation (C++ templates are calling...) */
+// Generic hashmap implementation (C++ templates are calling...)
 #ifndef RGBDS_LINK_HASHMAP_H
 #define RGBDS_LINK_HASHMAP_H
 
@@ -18,10 +18,10 @@
 static_assert(HALF_HASH_NB_BITS * 2 == HASH_NB_BITS, "");
 #define HASHMAP_NB_BUCKETS (1 << HALF_HASH_NB_BITS)
 
-/* HashMapEntry is internal, please do not attempt to use it */
+// HashMapEntry is internal, please do not attempt to use it
 typedef struct HashMapEntry *HashMap[HASHMAP_NB_BUCKETS];
 
-/**
+/*
  * Adds an element to a hashmap.
  * @warning Adding a new element with an already-present key will not cause an
  *          error, this must be handled externally.
@@ -33,7 +33,7 @@
  */
 void **hash_AddElement(HashMap map, char const *key, void *element);
 
-/**
+/*
  * Removes an element from a hashmap.
  * @param map The HashMap to remove the element from
  * @param key The key to search the element with
@@ -41,7 +41,7 @@
  */
 bool hash_RemoveElement(HashMap map, char const *key);
 
-/**
+/*
  * Finds an element in a hashmap, and returns a pointer to its value field.
  * @param map The map to consider the elements of
  * @param key The key to search an element for
@@ -49,7 +49,7 @@
  */
 void **hash_GetNode(HashMap const map, char const *key);
 
-/**
+/*
  * Finds an element in a hashmap.
  * @param map The map to consider the elements of
  * @param key The key to search an element for
@@ -58,7 +58,7 @@
  */
 void *hash_GetElement(HashMap const map, char const *key);
 
-/**
+/*
  * Executes a function on each element in a hashmap.
  * @param map The map to consider the elements of
  * @param func The function to run. The first argument will be the element,
@@ -67,7 +67,7 @@
  */
 void hash_ForEach(HashMap const map, void (*func)(void *, void *), void *arg);
 
-/**
+/*
  * Cleanly empties a hashmap from its contents.
  * This does not `free` the data structure itself!
  * @param map The map to empty
@@ -74,4 +74,4 @@
  */
 void hash_EmptyMap(HashMap map);
 
-#endif /* RGBDS_LINK_HASHMAP_H */
+#endif // RGBDS_LINK_HASHMAP_H
--- a/include/helpers.h
+++ b/include/helpers.h
@@ -93,4 +93,4 @@
 // (Having two instances of `arr` is OK because the contents of `sizeof` are not evaluated.)
 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof *(arr))
 
-#endif /* HELPERS_H */
+#endif // HELPERS_H
--- a/include/itertools.hpp
+++ b/include/itertools.hpp
@@ -79,12 +79,10 @@
                                   std::remove_cv_t<std::remove_reference_t<T>>>;
 }
 
-/**
- * Does the same number of iterations as the first container's iterator!
- */
+// Does the same number of iterations as the first container's iterator!
 template<typename... Containers>
 static constexpr auto zip(Containers &&...cs) {
 	return detail::ZipContainer<detail::Holder<Containers>...>(std::forward<Containers>(cs)...);
 }
 
-#endif /* RGBDS_ITERTOOLS_HPP */
+#endif // RGBDS_ITERTOOLS_HPP
--- a/include/link/assign.h
+++ b/include/link/assign.h
@@ -6,7 +6,7 @@
  * SPDX-License-Identifier: MIT
  */
 
-/* Assigning all sections a place */
+// Assigning all sections a place
 #ifndef RGBDS_LINK_ASSIGN_H
 #define RGBDS_LINK_ASSIGN_H
 
@@ -14,14 +14,10 @@
 
 extern uint64_t nbSectionsToAssign;
 
-/**
- * Assigns all sections a slice of the address space
- */
+// Assigns all sections a slice of the address space
 void assign_AssignSections(void);
 
-/**
- * `free`s all assignment memory that was allocated.
- */
+// `free`s all assignment memory that was allocated
 void assign_Cleanup(void);
 
-#endif /* RGBDS_LINK_ASSIGN_H */
+#endif // RGBDS_LINK_ASSIGN_H
--- a/include/link/main.h
+++ b/include/link/main.h
@@ -6,7 +6,7 @@
  * SPDX-License-Identifier: MIT
  */
 
-/* Declarations that all modules use, as well as `main` and related */
+// Declarations that all modules use, as well as `main` and related
 #ifndef RGBDS_LINK_MAIN_H
 #define RGBDS_LINK_MAIN_H
 
@@ -16,7 +16,7 @@
 
 #include "helpers.h"
 
-/* Variables related to CLI options */
+// Variables related to CLI options
 extern bool isDmgMode;
 extern char       *linkerScriptName;
 extern char const *mapFileName;
@@ -35,7 +35,7 @@
 
 struct FileStackNode {
 	struct FileStackNode *parent;
-	/* Line at which the parent context was exited; meaningless for the root level */
+	// Line at which the parent context was exited; meaningless for the root level
 	uint32_t lineNo;
 
 	enum {
@@ -44,8 +44,8 @@
 		NODE_MACRO,
 	} type;
 	union {
-		char *name; /* NODE_FILE, NODE_MACRO */
-		struct { /* NODE_REPT */
+		char *name; // NODE_FILE, NODE_MACRO
+		struct { // NODE_REPT
 			uint32_t reptDepth;
 			uint32_t *iters;
 		};
@@ -52,13 +52,13 @@
 	};
 };
 
-/* Helper macro for printing verbose-mode messages */
+// Helper macro for printing verbose-mode messages
 #define verbosePrint(...)   do { \
 					if (beVerbose) \
 						fprintf(stderr, __VA_ARGS__); \
 				} while (0)
 
-/**
+/*
  * Dump a file stack to stderr
  * @param node The leaf node to dump the context of
  */
@@ -73,7 +73,7 @@
 _Noreturn void fatal(struct FileStackNode const *where, uint32_t lineNo,
 		     char const *fmt, ...) format_(printf, 3, 4);
 
-/**
+/*
  * Opens a file if specified, and aborts on error.
  * @param fileName The name of the file to open; if NULL, no file will be opened
  * @param mode The mode to open the file with
@@ -87,4 +87,4 @@
 					fclose(tmp); \
 			} while (0)
 
-#endif /* RGBDS_LINK_MAIN_H */
+#endif // RGBDS_LINK_MAIN_H
--- a/include/link/object.h
+++ b/include/link/object.h
@@ -6,12 +6,12 @@
  * SPDX-License-Identifier: MIT
  */
 
-/* Declarations related to processing of object (.o) files */
+// Declarations related to processing of object (.o) files
 
 #ifndef RGBDS_LINK_OBJECT_H
 #define RGBDS_LINK_OBJECT_H
 
-/**
+/*
  * Read an object (.o) file, and add its info to the data structures.
  * @param fileName A path to the object file to be read
  * @param i The ID of the file
@@ -18,25 +18,25 @@
  */
 void obj_ReadFile(char const *fileName, unsigned int i);
 
-/**
+/*
  * Perform validation on the object files' contents
  */
 void obj_DoSanityChecks(void);
 
-/**
+/*
  * Evaluate all assertions
  */
 void obj_CheckAssertions(void);
 
-/**
+/*
  * Sets up object file reading
  * @param nbFiles The number of object files that will be read
  */
 void obj_Setup(unsigned int nbFiles);
 
-/**
+/*
  * `free`s all object memory that was allocated.
  */
 void obj_Cleanup(void);
 
-#endif /* RGBDS_LINK_OBJECT_H */
+#endif // RGBDS_LINK_OBJECT_H
--- a/include/link/output.h
+++ b/include/link/output.h
@@ -6,7 +6,7 @@
  * SPDX-License-Identifier: MIT
  */
 
-/* Outputting the result of linking */
+// Outputting the result of linking
 #ifndef RGBDS_LINK_OUTPUT_H
 #define RGBDS_LINK_OUTPUT_H
 
@@ -14,13 +14,13 @@
 
 #include "link/section.h"
 
-/**
+/*
  * Registers a section for output.
  * @param section The section to add
  */
 void out_AddSection(struct Section const *section);
 
-/**
+/*
  * Finds an assigned section overlapping another one.
  * @param section The section that is being overlapped
  * @return A section overlapping it
@@ -27,9 +27,9 @@
  */
 struct Section const *out_OverlappingSection(struct Section const *section);
 
-/**
+/*
  * Writes all output (bin, sym, map) files.
  */
 void out_WriteFiles(void);
 
-#endif /* RGBDS_LINK_OUTPUT_H */
+#endif // RGBDS_LINK_OUTPUT_H
--- a/include/link/patch.h
+++ b/include/link/patch.h
@@ -6,7 +6,7 @@
  * SPDX-License-Identifier: MIT
  */
 
-/* Applying patches to SECTIONs */
+// Applying patches to SECTIONs
 #ifndef RGBDS_LINK_PATCH_H
 #define RGBDS_LINK_PATCH_H
 
@@ -27,15 +27,15 @@
 	struct Assertion *next;
 };
 
-/**
+/*
  * Checks all assertions
  * @return true if assertion failed
  */
 void patch_CheckAssertions(struct Assertion *assertion);
 
-/**
+/*
  * Applies all SECTIONs' patches to them
  */
 void patch_ApplyPatches(void);
 
-#endif /* RGBDS_LINK_PATCH_H */
+#endif // RGBDS_LINK_PATCH_H
--- a/include/link/script.h
+++ b/include/link/script.h
@@ -6,7 +6,7 @@
  * SPDX-License-Identifier: MIT
  */
 
-/* Parsing a linker script */
+// Parsing a linker script
 #ifndef RGBDS_LINK_SCRIPT_H
 #define RGBDS_LINK_SCRIPT_H
 
@@ -24,15 +24,15 @@
 
 extern uint64_t script_lineNo;
 
-/**
+/*
  * Parses the linker script to return the next section constraint
  * @return A pointer to a struct, or NULL on EOF. The pointer shouldn't be freed
  */
 struct SectionPlacement *script_NextSection(void);
 
-/**
+/*
  * `free`s all assignment memory that was allocated.
  */
 void script_Cleanup(void);
 
-#endif /* RGBDS_LINK_SCRIPT_H */
+#endif // RGBDS_LINK_SCRIPT_H
--- a/include/link/sdas_obj.h
+++ b/include/link/sdas_obj.h
@@ -6,7 +6,7 @@
  * SPDX-License-Identifier: MIT
  */
 
-/* Assigning all sections a place */
+// Assigning all sections a place
 #ifndef RGBDS_LINK_SDAS_OBJ_H
 #define RGBDS_LINK_SDAS_OBJ_H
 
@@ -16,4 +16,4 @@
 
 void sdobj_ReadFile(struct FileStackNode const *fileName, FILE *file);
 
-#endif /* RGBDS_LINK_SDAS_OBJ_H */
+#endif // RGBDS_LINK_SDAS_OBJ_H
--- a/include/link/section.h
+++ b/include/link/section.h
@@ -6,11 +6,11 @@
  * SPDX-License-Identifier: MIT
  */
 
-/* Declarations manipulating symbols */
+// Declarations manipulating symbols
 #ifndef RGBDS_LINK_SECTION_H
 #define RGBDS_LINK_SECTION_H
 
-/* GUIDELINE: external code MUST NOT BE AWARE of the data structure used!! */
+// GUIDELINE: external code MUST NOT BE AWARE of the data structure used!!
 
 #include <stdint.h>
 #include <stdbool.h>
@@ -41,7 +41,7 @@
 };
 
 struct Section {
-	/* Info contained in the object files */
+	// Info contained in the object files
 	char *name;
 	uint16_t size;
 	uint16_t offset;
@@ -56,14 +56,14 @@
 	bool isAlignFixed;
 	uint16_t alignMask;
 	uint16_t alignOfs;
-	uint8_t *data; /* Array of size `size`*/
+	uint8_t *data; // Array of size `size`
 	uint32_t nbPatches;
 	struct Patch *patches;
-	/* Extra info computed during linking */
+	// Extra info computed during linking
 	struct Symbol **fileSymbols;
 	uint32_t nbSymbols;
 	struct Symbol **symbols;
-	struct Section *nextu; /* The next "component" of this unionized sect */
+	struct Section *nextu; // The next "component" of this unionized sect
 };
 
 /*
@@ -76,13 +76,13 @@
  */
 void sect_ForEach(void (*callback)(struct Section *, void *), void *arg);
 
-/**
+/*
  * Registers a section to be processed.
  * @param section The section to register.
  */
 void sect_AddSection(struct Section *section);
 
-/**
+/*
  * Finds a section by its name.
  * @param name The name of the section to look for
  * @return A pointer to the section, or NULL if it wasn't found
@@ -89,14 +89,14 @@
  */
 struct Section *sect_GetSection(char const *name);
 
-/**
+/*
  * `free`s all section memory that was allocated.
  */
 void sect_CleanupSections(void);
 
-/**
+/*
  * Checks if all sections meet reasonable criteria, such as max size
  */
 void sect_DoSanityChecks(void);
 
-#endif /* RGBDS_LINK_SECTION_H */
+#endif // RGBDS_LINK_SECTION_H
--- a/include/link/symbol.h
+++ b/include/link/symbol.h
@@ -6,11 +6,11 @@
  * SPDX-License-Identifier: MIT
  */
 
-/* Declarations manipulating symbols */
+// Declarations manipulating symbols
 #ifndef RGBDS_LINK_SYMBOL_H
 #define RGBDS_LINK_SYMBOL_H
 
-/* GUIDELINE: external code MUST NOT BE AWARE of the data structure used!! */
+// GUIDELINE: external code MUST NOT BE AWARE of the data structure used!!
 
 #include <stdint.h>
 
@@ -19,7 +19,7 @@
 struct FileStackNode;
 
 struct Symbol {
-	/* Info contained in the object files */
+	// Info contained in the object files
 	char *name;
 	enum ExportLevel type;
 	char const *objFileName;
@@ -31,7 +31,7 @@
 		int32_t offset;
 		int32_t value;
 	};
-	/* Extra info computed during linking */
+	// Extra info computed during linking
 	struct Section *section;
 };
 
@@ -47,7 +47,7 @@
 
 void sym_AddSymbol(struct Symbol *symbol);
 
-/**
+/*
  * Finds a symbol in all the defined symbols.
  * @param name The name of the symbol to look for
  * @return A pointer to the symbol, or NULL if not found.
@@ -54,9 +54,9 @@
  */
 struct Symbol *sym_GetSymbol(char const *name);
 
-/**
+/*
  * `free`s all symbol memory that was allocated.
  */
 void sym_CleanupSymbols(void);
 
-#endif /* RGBDS_LINK_SYMBOL_H */
+#endif // RGBDS_LINK_SYMBOL_H
--- a/include/linkdefs.h
+++ b/include/linkdefs.h
@@ -88,7 +88,7 @@
 	uint32_t lastBank;
 } sectionTypeInfo[SECTTYPE_INVALID];
 
-/**
+/*
  * Tells whether a section has data in its object file definition,
  * depending on type.
  * @param type The section's type
@@ -100,7 +100,7 @@
 	return type == SECTTYPE_ROM0 || type == SECTTYPE_ROMX;
 }
 
-/**
+/*
  * Computes a memory region's end address (last byte), eg. 0x7FFF
  * @return The address of the last byte in that memory region
  */
@@ -109,7 +109,7 @@
 	return sectionTypeInfo[type].startAddr + sectionTypeInfo[type].size - 1;
 }
 
-/**
+/*
  * Computes a memory region's number of banks
  * @return The number of banks, 1 for regions without banking
  */
@@ -141,4 +141,4 @@
 	PATCHTYPE_INVALID
 };
 
-#endif /* RGBDS_LINKDEFS_H */
+#endif // RGBDS_LINKDEFS_H
--- a/include/opmath.h
+++ b/include/opmath.h
@@ -18,4 +18,4 @@
 int32_t op_shift_right(int32_t value, int32_t amount);
 int32_t op_shift_right_unsigned(int32_t value, int32_t amount);
 
-#endif /* RGBDS_OP_MATH_H */
+#endif // RGBDS_OP_MATH_H
--- a/include/platform.h
+++ b/include/platform.h
@@ -6,7 +6,7 @@
  * SPDX-License-Identifier: MIT
  */
 
-/* platform-specific hacks */
+// platform-specific hacks
 
 #ifndef RGBDS_PLATFORM_H
 #define RGBDS_PLATFORM_H
@@ -20,13 +20,13 @@
 # include <strings.h>
 #endif
 
-/* MSVC has deprecated strdup in favor of _strdup */
+// MSVC has deprecated strdup in favor of _strdup
 #ifdef _MSC_VER
 # define strdup _strdup
 #endif
 
-/* MSVC prefixes the names of S_* macros with underscores,
-   and doesn't define any S_IS* macros. Define them ourselves */
+// MSVC prefixes the names of S_* macros with underscores,
+// and doesn't define any S_IS* macros; define them ourselves
 #ifdef _MSC_VER
 # define S_IFMT _S_IFMT
 # define S_IFDIR _S_IFDIR
@@ -33,7 +33,7 @@
 # define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
 #endif
 
-/* MSVC doesn't use POSIX types or defines for `read` */
+// MSVC doesn't use POSIX types or defines for `read`
 #ifdef _MSC_VER
 # include <io.h>
 # define STDIN_FILENO 0
@@ -46,7 +46,7 @@
 # include <unistd.h>
 #endif
 
-/* MSVC doesn't support `[static N]` for array arguments from C99 or C11 */
+// MSVC doesn't support `[static N]` for array arguments from C99 or C11
 #ifdef _MSC_VER
 # define MIN_NB_ELMS(N)
 # define ARR_QUALS(...)
@@ -75,4 +75,4 @@
 # define setmode(fd, mode) ((void)0)
 #endif
 
-#endif /* RGBDS_PLATFORM_H */
+#endif // RGBDS_PLATFORM_H
--- a/include/version.h
+++ b/include/version.h
@@ -24,4 +24,4 @@
 }
 #endif
 
-#endif /* EXTERN_VERSION_H */
+#endif // EXTERN_VERSION_H
--- a/src/asm/charmap.c
+++ b/src/asm/charmap.c
@@ -21,16 +21,14 @@
 
 #include "hashmap.h"
 
-/*
- * Charmaps are stored using a structure known as "trie".
- * Essentially a tree, where each nodes stores a single character's worth of info:
- * whether there exists a mapping that ends at the current character,
- */
+// Charmaps are stored using a structure known as "trie".
+// Essentially a tree, where each nodes stores a single character's worth of info:
+// whether there exists a mapping that ends at the current character,
 struct Charnode {
-	bool isTerminal; /* Whether there exists a mapping that ends here */
-	uint8_t value; /* If the above is true, its corresponding value */
-	/* This MUST be indexes and not pointers, because pointers get invalidated by `realloc`!! */
-	size_t next[255]; /* Indexes of where to go next, 0 = nowhere */
+	bool isTerminal; // Whether there exists a mapping that ends here
+	uint8_t value; // If the above is true, its corresponding value
+	// This MUST be indexes and not pointers, because pointers get invalidated by `realloc`!!
+	size_t next[255]; // Indexes of where to go next, 0 = nowhere
 };
 
 #define INITIAL_CAPACITY 32
@@ -37,17 +35,15 @@
 
 struct Charmap {
 	char *name;
-	size_t usedNodes; /* How many nodes are being used */
-	size_t capacity; /* How many nodes have been allocated */
-	struct Charnode nodes[]; /* first node is reserved for the root node */
+	size_t usedNodes; // How many nodes are being used
+	size_t capacity; // How many nodes have been allocated
+	struct Charnode nodes[]; // first node is reserved for the root node
 };
 
 static HashMap charmaps;
 
-/*
- * Store pointers to hashmap nodes, so that there is only one pointer to the memory block
- * that gets reallocated.
- */
+// Store pointers to hashmap nodes, so that there is only one pointer to the memory block
+// that gets reallocated.
 static struct Charmap **currentCharmap;
 
 struct CharmapStackEntry {
@@ -96,7 +92,7 @@
 		return charmap;
 	}
 
-	/* Init the new charmap's fields */
+	// Init the new charmap's fields
 	if (base) {
 		resizeCharmap(&charmap, base->capacity);
 		charmap->usedNodes = base->usedNodes;
@@ -105,7 +101,7 @@
 	} else {
 		resizeCharmap(&charmap, INITIAL_CAPACITY);
 		charmap->usedNodes = 1;
-		initNode(&charmap->nodes[0]); /* Init the root node */
+		initNode(&charmap->nodes[0]); // Init the root node
 	}
 	charmap->name = strdup(name);
 
@@ -169,9 +165,9 @@
 		if (node->next[c]) {
 			node = &charmap->nodes[node->next[c]];
 		} else {
-			/* Register next available node */
+			// Register next available node
 			node->next[c] = charmap->usedNodes;
-			/* If no more nodes are available, get new ones */
+			// If no more nodes are available, get new ones
 			if (charmap->usedNodes == charmap->capacity) {
 				charmap->capacity *= 2;
 				resizeCharmap(currentCharmap, charmap->capacity);
@@ -178,7 +174,7 @@
 				charmap = *currentCharmap;
 			}
 
-			/* Switch to and init new node */
+			// Switch to and init new node
 			node = &charmap->nodes[charmap->usedNodes++];
 			initNode(node);
 		}
@@ -203,12 +199,10 @@
 
 size_t charmap_ConvertNext(char const **input, uint8_t **output)
 {
-	/*
-	 * The goal is to match the longest mapping possible.
-	 * For that, advance through the trie with each character read.
-	 * If that would lead to a dead end, rewind characters until the last match, and output.
-	 * If no match, read a UTF-8 codepoint and output that.
-	 */
+	// The goal is to match the longest mapping possible.
+	// For that, advance through the trie with each character read.
+	// If that would lead to a dead end, rewind characters until the last match, and output.
+	// If no match, read a UTF-8 codepoint and output that.
 	struct Charmap const *charmap = *currentCharmap;
 	struct Charnode const *node = &charmap->nodes[0];
 	struct Charnode const *match = NULL;
--- a/src/asm/fixpoint.c
+++ b/src/asm/fixpoint.c
@@ -6,9 +6,7 @@
  * SPDX-License-Identifier: MIT
  */
 
-/*
- * Fixed-point math routines
- */
+// Fixed-point math routines
 
 #include <inttypes.h>
 #include <math.h>
@@ -30,9 +28,6 @@
 #define M_PI 3.14159265358979323846
 #endif
 
-/*
- * Print a fixed point value
- */
 void fix_Print(int32_t i)
 {
 	uint32_t u = i;
@@ -47,121 +42,76 @@
 	       ((uint32_t)(fix2double(u) * 100000 + 0.5)) % 100000);
 }
 
-/*
- * Calculate sine
- */
 int32_t fix_Sin(int32_t i)
 {
 	return double2fix(sin(fdeg2rad(fix2double(i))));
 }
 
-/*
- * Calculate cosine
- */
 int32_t fix_Cos(int32_t i)
 {
 	return double2fix(cos(fdeg2rad(fix2double(i))));
 }
 
-/*
- * Calculate tangent
- */
 int32_t fix_Tan(int32_t i)
 {
 	return double2fix(tan(fdeg2rad(fix2double(i))));
 }
 
-/*
- * Calculate arcsine
- */
 int32_t fix_ASin(int32_t i)
 {
 	return double2fix(rad2fdeg(asin(fix2double(i))));
 }
 
-/*
- * Calculate arccosine
- */
 int32_t fix_ACos(int32_t i)
 {
 	return double2fix(rad2fdeg(acos(fix2double(i))));
 }
 
-/*
- * Calculate arctangent
- */
 int32_t fix_ATan(int32_t i)
 {
 	return double2fix(rad2fdeg(atan(fix2double(i))));
 }
 
-/*
- * Calculate atan2
- */
 int32_t fix_ATan2(int32_t i, int32_t j)
 {
 	return double2fix(rad2fdeg(atan2(fix2double(i), fix2double(j))));
 }
 
-/*
- * Multiplication
- */
 int32_t fix_Mul(int32_t i, int32_t j)
 {
 	return double2fix(fix2double(i) * fix2double(j));
 }
 
-/*
- * Division
- */
 int32_t fix_Div(int32_t i, int32_t j)
 {
 	return double2fix(fix2double(i) / fix2double(j));
 }
 
-/*
- * Modulo
- */
 int32_t fix_Mod(int32_t i, int32_t j)
 {
 	return double2fix(fmod(fix2double(i), fix2double(j)));
 }
 
-/*
- * Power
- */
 int32_t fix_Pow(int32_t i, int32_t j)
 {
 	return double2fix(pow(fix2double(i), fix2double(j)));
 }
 
-/*
- * Logarithm
- */
 int32_t fix_Log(int32_t i, int32_t j)
 {
 	return double2fix(log(fix2double(i)) / log(fix2double(j)));
 }
 
-/*
- * Round
- */
 int32_t fix_Round(int32_t i)
 {
 	return double2fix(round(fix2double(i)));
 }
 
-/*
- * Ceil
- */
 int32_t fix_Ceil(int32_t i)
 {
 	return double2fix(ceil(fix2double(i)));
 }
 
-/*
- * Floor
- */
 int32_t fix_Floor(int32_t i)
 {
 	return double2fix(floor(fix2double(i)));
--- a/src/asm/format.c
+++ b/src/asm/format.c
@@ -46,7 +46,7 @@
 		return;
 
 	switch (c) {
-	/* sign */
+	// sign
 	case ' ':
 	case '+':
 		if (fmt->state > FORMAT_SIGN)
@@ -55,7 +55,7 @@
 		fmt->sign = c;
 		break;
 
-	/* prefix */
+	// prefix
 	case '#':
 		if (fmt->state > FORMAT_PREFIX)
 			goto invalid;
@@ -63,7 +63,7 @@
 		fmt->prefix = true;
 		break;
 
-	/* align */
+	// align
 	case '-':
 		if (fmt->state > FORMAT_ALIGN)
 			goto invalid;
@@ -71,11 +71,11 @@
 		fmt->alignLeft = true;
 		break;
 
-	/* pad and width */
+	// pad and width
 	case '0':
 		if (fmt->state < FORMAT_WIDTH)
 			fmt->padZero = true;
-		/* fallthrough */
+		// fallthrough
 	case '1':
 	case '2':
 	case '3':
@@ -104,7 +104,7 @@
 		fmt->hasFrac = true;
 		break;
 
-	/* type */
+	// type
 	case 'd':
 	case 'u':
 	case 'X':
@@ -149,7 +149,7 @@
 	size_t len = strlen(value);
 	size_t totalLen = fmt->width > len ? fmt->width : len;
 
-	if (totalLen > bufLen - 1) { /* bufLen includes terminator */
+	if (totalLen > bufLen - 1) { // bufLen includes terminator
 		error("Formatted string value too long\n");
 		totalLen = bufLen - 1;
 		if (len > totalLen)
@@ -182,7 +182,7 @@
 	if (fmt->type == 's')
 		error("Formatting number as type 's'\n");
 
-	char sign = fmt->sign; /* 0 or ' ' or '+' */
+	char sign = fmt->sign; // 0 or ' ' or '+'
 
 	if (fmt->type == 'd' || fmt->type == 'f') {
 		int32_t v = value;
@@ -200,10 +200,10 @@
 		: fmt->type == 'o' ? '&'
 		: 0;
 
-	char valueBuf[262]; /* Max 5 digits + decimal + 255 fraction digits + terminator */
+	char valueBuf[262]; // Max 5 digits + decimal + 255 fraction digits + terminator
 
 	if (fmt->type == 'b') {
-		/* Special case for binary */
+		// Special case for binary
 		char *ptr = valueBuf;
 
 		do {
@@ -213,7 +213,7 @@
 
 		*ptr = '\0';
 
-		/* Reverse the digits */
+		// Reverse the digits
 		size_t valueLen = ptr - valueBuf;
 
 		for (size_t i = 0, j = valueLen - 1; i < j; i++, j--) {
@@ -223,9 +223,9 @@
 			valueBuf[j] = c;
 		}
 	} else if (fmt->type == 'f') {
-		/* Special case for fixed-point */
+		// Special case for fixed-point
 
-		/* Default fractional width (C's is 6 for "%f"; here 5 is enough) */
+		// Default fractional width (C's is 6 for "%f"; here 5 is enough)
 		size_t fracWidth = fmt->hasFrac ? fmt->fracWidth : 5;
 
 		if (fracWidth > 255) {
@@ -250,7 +250,7 @@
 	size_t numLen = !!sign + !!prefix + len;
 	size_t totalLen = fmt->width > numLen ? fmt->width : numLen;
 
-	if (totalLen > bufLen - 1) { /* bufLen includes terminator */
+	if (totalLen > bufLen - 1) { // bufLen includes terminator
 		error("Formatted numeric value too long\n");
 		totalLen = bufLen - 1;
 		if (numLen > totalLen) {
@@ -273,7 +273,7 @@
 			buf[i] = ' ';
 	} else {
 		if (fmt->padZero) {
-			/* sign, then prefix, then zero padding */
+			// sign, then prefix, then zero padding
 			if (sign)
 				buf[pos++] = sign;
 			if (prefix)
@@ -281,7 +281,7 @@
 			for (size_t i = 0; i < padLen; i++)
 				buf[pos++] = '0';
 		} else {
-			/* space padding, then sign, then prefix */
+			// space padding, then sign, then prefix
 			for (size_t i = 0; i < padLen; i++)
 				buf[pos++] = ' ';
 			if (sign)
--- a/src/asm/fstack.c
+++ b/src/asm/fstack.c
@@ -19,7 +19,7 @@
 #include "asm/main.h"
 #include "asm/symbol.h"
 #include "asm/warning.h"
-#include "platform.h" /* S_ISDIR (stat macro) */
+#include "platform.h" // S_ISDIR (stat macro)
 
 #define MAXINCPATHS 128
 
@@ -28,7 +28,7 @@
 	struct FileStackNode *fileInfo;
 	struct LexerState *lexerState;
 	uint32_t uniqueID;
-	struct MacroArgs *macroArgs; /* Macro args are *saved* here */
+	struct MacroArgs *macroArgs; // Macro args are *saved* here
 	uint32_t nbReptIters;
 	int32_t forValue;
 	int32_t forStep;
@@ -47,7 +47,7 @@
 	char const *name;
 
 	if (node->type == NODE_REPT) {
-		assert(node->parent); /* REPT nodes should always have a parent */
+		assert(node->parent); // REPT nodes should always have a parent
 		struct FileStackReptNode const *reptInfo = (struct FileStackReptNode const *)node;
 
 		name = dumpNodeAndParents(node->parent);
@@ -88,7 +88,7 @@
 
 	struct FileStackNode *node = contextStack->fileInfo;
 
-	/* Mark node and all of its parents as referenced if not already so they don't get freed */
+	// Mark node and all of its parents as referenced if not already so they don't get freed
 	while (node && !node->referenced) {
 		node->ID = -1;
 		node->referenced = true;
@@ -99,7 +99,7 @@
 
 char const *fstk_GetFileName(void)
 {
-	/* Iterating via the nodes themselves skips nested REPTs */
+	// Iterating via the nodes themselves skips nested REPTs
 	struct FileStackNode const *node = contextStack->fileInfo;
 
 	while (node->type != NODE_FILE)
@@ -120,7 +120,7 @@
 	char *str = malloc(allocSize);
 
 	if (!str) {
-		/* Attempt to continue without that path */
+		// Attempt to continue without that path
 		error("Failed to allocate new include path: %s\n", strerror(errno));
 		return;
 	}
@@ -149,7 +149,7 @@
 	if (stat(path, &statbuf) != 0)
 		return false;
 
-	/* Reject directories */
+	// Reject directories
 	return !S_ISDIR(statbuf.st_mode);
 }
 
@@ -156,7 +156,7 @@
 bool fstk_FindFile(char const *path, char **fullPath, size_t *size)
 {
 	if (!*size) {
-		*size = 64; /* This is arbitrary, really */
+		*size = 64; // This is arbitrary, really
 		*fullPath = realloc(*fullPath, *size);
 		if (!*fullPath)
 			error("realloc error during include path search: %s\n",
@@ -174,8 +174,8 @@
 				break;
 			}
 
-			/* Oh how I wish `asnprintf` was standard... */
-			if ((size_t)len >= *size) { /* `len` doesn't include the terminator, `size` does */
+			// Oh how I wish `asnprintf` was standard...
+			if ((size_t)len >= *size) { // `size` includes the terminator, `len` doesn't
 				*size = len + 1;
 				*fullPath = realloc(*fullPath, *size);
 				if (!*fullPath) {
@@ -212,10 +212,11 @@
 		fatalerror("Ended block with %" PRIu32 " unterminated IF construct%s\n",
 			   ifDepth, ifDepth == 1 ? "" : "s");
 
-	if (contextStack->fileInfo->type == NODE_REPT) { /* The context is a REPT block, which may loop */
+	if (contextStack->fileInfo->type == NODE_REPT) {
+		// The context is a REPT or FOR block, which may loop
 		struct FileStackReptNode *fileInfo = (struct FileStackReptNode *)contextStack->fileInfo;
 
-		/* If the node is referenced, we can't edit it; duplicate it */
+		// If the node is referenced, we can't edit it; duplicate it
 		if (contextStack->fileInfo->referenced) {
 			size_t size = sizeof(*fileInfo) + sizeof(fileInfo->iters[0]) * fileInfo->reptDepth;
 			struct FileStackReptNode *copy = malloc(size);
@@ -222,7 +223,7 @@
 
 			if (!copy)
 				fatalerror("Failed to duplicate REPT file node: %s\n", strerror(errno));
-			/* Copy all info but the referencing */
+			// Copy all info but the referencing
 			memcpy(copy, fileInfo, size);
 			copy->node.next = NULL;
 			copy->node.referenced = false;
@@ -231,19 +232,19 @@
 			contextStack->fileInfo = (struct FileStackNode *)fileInfo;
 		}
 
-		/* If this is a FOR, update the symbol value */
+		// If this is a FOR, update the symbol value
 		if (contextStack->forName && fileInfo->iters[0] <= contextStack->nbReptIters) {
 			contextStack->forValue += contextStack->forStep;
 			struct Symbol *sym = sym_AddVar(contextStack->forName,
 				contextStack->forValue);
 
-			/* This error message will refer to the current iteration */
+			// This error message will refer to the current iteration
 			if (sym->type != SYM_VAR)
 				fatalerror("Failed to update FOR symbol value\n");
 		}
-		/* Advance to the next iteration */
+		// Advance to the next iteration
 		fileInfo->iters[0]++;
-		/* If this wasn't the last iteration, wrap instead of popping */
+		// If this wasn't the last iteration, wrap instead of popping
 		if (fileInfo->iters[0] <= contextStack->nbReptIters) {
 			lexer_RestartRept(contextStack->fileInfo->lineNo);
 			contextStack->uniqueID = macro_UseNewUniqueID();
@@ -260,15 +261,15 @@
 	contextDepth--;
 
 	lexer_DeleteState(context->lexerState);
-	/* Restore args if a macro (not REPT) saved them */
+	// Restore args if a macro (not REPT) saved them
 	if (context->fileInfo->type == NODE_MACRO)
 		macro_UseNewArgs(contextStack->macroArgs);
-	/* Free the file stack node */
+	// Free the file stack node
 	if (!context->fileInfo->referenced)
 		free(context->fileInfo);
-	/* Free the FOR symbol name */
+	// Free the FOR symbol name
 	free(context->forName);
-	/* Free the entry and make its parent the current entry */
+	// Free the entry and make its parent the current entry
 	free(context);
 
 	lexer_SetState(contextStack->lexerState);
@@ -276,11 +277,9 @@
 	return false;
 }
 
-/*
- * Make sure not to switch the lexer state before calling this, so the saved line no is correct
- * BE CAREFUL!! This modifies the file stack directly, you should have set up the file info first
- * Callers should set contextStack->lexerState after this so it is not NULL
- */
+// Make sure not to switch the lexer state before calling this, so the saved line no is correct.
+// BE CAREFUL!! This modifies the file stack directly, you should have set up the file info first.
+// Callers should set contextStack->lexerState after this so it is not NULL.
 static void newContext(struct FileStackNode *fileInfo)
 {
 	++contextDepth;
@@ -291,15 +290,14 @@
 	if (!context)
 		fatalerror("Failed to allocate memory for new context: %s\n", strerror(errno));
 	fileInfo->parent = contextStack->fileInfo;
-	fileInfo->lineNo = 0; /* Init to a default value, see struct definition for info */
+	fileInfo->lineNo = 0; // Init to a default value, see struct definition for info
 	fileInfo->referenced = false;
 	fileInfo->lineNo = lexer_GetLineNo();
 	context->fileInfo = fileInfo;
 	context->forName = NULL;
-	/*
-	 * Link new entry to its parent so it's reachable later
-	 * ERRORS SHOULD NOT OCCUR AFTER THIS!!
-	 */
+
+	// Link new entry to its parent so it's reachable later
+	// ERRORS SHOULD NOT OCCUR AFTER THIS!!
 	context->parent = contextStack;
 	contextStack = context;
 }
@@ -337,7 +335,7 @@
 	if (!contextStack->lexerState)
 		fatalerror("Failed to set up lexer for file include\n");
 	lexer_SetStateAtEOL(contextStack->lexerState);
-	/* We're back at top-level, so most things are reset */
+	// We're back at top-level, so most things are reset
 	contextStack->uniqueID = 0;
 	macro_SetUniqueID(0);
 }
@@ -356,7 +354,7 @@
 	}
 	contextStack->macroArgs = macro_GetCurrentArgs();
 
-	/* Compute total length of this node's name: <base name>::<macro> */
+	// Compute total length of this node's name: <base name>::<macro>
 	size_t reptNameLen = 0;
 	struct FileStackNode const *node = macro->src;
 
@@ -363,9 +361,9 @@
 	if (node->type == NODE_REPT) {
 		struct FileStackReptNode const *reptNode = (struct FileStackReptNode const *)node;
 
-		/* 4294967295 = 2^32 - 1, aka UINT32_MAX */
+		// 4294967295 = 2^32 - 1, aka UINT32_MAX
 		reptNameLen += reptNode->reptDepth * strlen("::REPT~4294967295");
-		/* Look for next named node */
+		// Look for next named node
 		do {
 			node = node->parent;
 		} while (node->type == NODE_REPT);
@@ -381,7 +379,7 @@
 		return;
 	}
 	fileInfo->node.type = NODE_MACRO;
-	/* Print the name... */
+	// Print the name...
 	char *dest = fileInfo->name;
 
 	memcpy(dest, baseNode->name, baseLen);
@@ -428,13 +426,13 @@
 	fileInfo->reptDepth = reptDepth + 1;
 	fileInfo->iters[0] = 1;
 	if (reptDepth)
-		/* Copy all parent iter counts */
+		// Copy all parent iter counts
 		memcpy(&fileInfo->iters[1],
 		       ((struct FileStackReptNode *)contextStack->fileInfo)->iters,
 		       reptDepth * sizeof(fileInfo->iters[0]));
 
 	newContext((struct FileStackNode *)fileInfo);
-	/* Correct our line number, which currently points to the `ENDR` line */
+	// Correct our line number, which currently points to the `ENDR` line
 	contextStack->fileInfo->lineNo = reptLineNo;
 
 	contextStack->lexerState = lexer_OpenFileView("REPT", body, size, reptLineNo);
@@ -492,7 +490,7 @@
 
 void fstk_StopRept(void)
 {
-	/* Prevent more iterations */
+	// Prevent more iterations
 	contextStack->nbReptIters = 0;
 }
 
@@ -532,7 +530,7 @@
 		fatalerror("Failed to allocate memory for main file info: %s\n", strerror(errno));
 
 	context->fileInfo = (struct FileStackNode *)fileInfo;
-	/* lineNo and reptIter are unused on the top-level context */
+	// lineNo and reptIter are unused on the top-level context
 	context->fileInfo->parent = NULL;
 	context->fileInfo->lineNo = 0; // This still gets written to the object file, so init it
 	context->fileInfo->referenced = false;
@@ -548,13 +546,11 @@
 	context->forStep = 0;
 	context->forName = NULL;
 
-	/* Now that it's set up properly, register the context */
+	// Now that it's set up properly, register the context
 	contextStack = context;
 
-	/*
-	 * Check that max recursion depth won't allow overflowing node `malloc`s
-	 * This assumes that the rept node is larger
-	 */
+	// Check that max recursion depth won't allow overflowing node `malloc`s
+	// This assumes that the rept node is larger
 #define DEPTH_LIMIT ((SIZE_MAX - sizeof(struct FileStackReptNode)) / sizeof(uint32_t))
 	if (maxDepth > DEPTH_LIMIT) {
 		error("Recursion depth may not be higher than %zu, defaulting to "
@@ -563,7 +559,7 @@
 	} else {
 		maxRecursionDepth = maxDepth;
 	}
-	/* Make sure that the default of 64 is OK, though */
+	// Make sure that the default of 64 is OK, though
 	assert(DEPTH_LIMIT >= DEFAULT_MAX_DEPTH);
 #undef DEPTH_LIMIT
 }
--- a/src/asm/lexer.c
+++ b/src/asm/lexer.c
@@ -24,7 +24,7 @@
 #include <unistd.h>
 #endif
 
-#include "platform.h" /* For `ssize_t` */
+#include "platform.h" // For `ssize_t`
 
 #include "asm/lexer.h"
 #include "asm/format.h"
@@ -35,10 +35,10 @@
 #include "asm/symbol.h"
 #include "asm/util.h"
 #include "asm/warning.h"
-/* Include this last so it gets all type & constant definitions */
-#include "parser.h" /* For token definitions, generated from parser.y */
+// Include this last so it gets all type & constant definitions
+#include "parser.h" // For token definitions, generated from parser.y
 
-/* Neither MSVC nor MinGW provide `mmap` */
+// Neither MSVC nor MinGW provide `mmap`
 #if defined(_MSC_VER) || defined(__MINGW32__)
 # define WIN32_LEAN_AND_MEAN // include less from windows.h
 # include <windows.h> // target architecture
@@ -63,7 +63,7 @@
 } while (0)
 # define munmap(ptr, size)  UnmapViewOfFile((ptr))
 
-#else /* defined(_MSC_VER) || defined(__MINGW32__) */
+#else // defined(_MSC_VER) || defined(__MINGW32__)
 
 # include <sys/mman.h>
 # define mapFile(ptr, fd, path, size) do { \
@@ -80,23 +80,19 @@
 		(ptr) = mmap(NULL, (size), PROT_READ, MAP_SHARED, (fd), 0); \
 	} \
 } while (0)
-#endif /* !( defined(_MSC_VER) || defined(__MINGW32__) ) */
+#endif // !( defined(_MSC_VER) || defined(__MINGW32__) )
 
-/*
- * Identifiers that are also keywords are listed here. This ONLY applies to ones
- * that would normally be matched as identifiers! Check out `yylex_NORMAL` to
- * see how this is used.
- * Tokens / keywords not handled here are handled in `yylex_NORMAL`'s switch.
- */
+// Identifiers that are also keywords are listed here. This ONLY applies to ones
+// that would normally be matched as identifiers! Check out `yylex_NORMAL` to
+// see how this is used.
+// Tokens / keywords not handled here are handled in `yylex_NORMAL`'s switch.
 static struct KeywordMapping {
 	char const *name;
 	int token;
 } const keywords[] = {
-	/*
-	 * CAUTION when editing this: adding keywords will probably require extra nodes in the
-	 * `keywordDict` array. If you forget to, you will probably trip up an assertion, anyways.
-	 * Also, all entries in this array must be in uppercase for the dict to build correctly.
-	 */
+	// CAUTION when editing this: adding keywords will probably require extra nodes in the
+	// `keywordDict` array. If you forget to, you will probably trip up an assertion, anyways.
+	// Also, all entries in this array must be in uppercase for the dict to build correctly.
 	{"ADC", T_Z80_ADC},
 	{"ADD", T_Z80_ADD},
 	{"AND", T_Z80_AND},
@@ -136,7 +132,7 @@
 	{"RST", T_Z80_RST},
 	{"SBC", T_Z80_SBC},
 	{"SCF", T_Z80_SCF},
-	{"SET", T_POP_SET},
+	{"SET", T_Z80_SET},
 	{"SLA", T_Z80_SLA},
 	{"SRA", T_Z80_SRA},
 	{"SRL", T_Z80_SRL},
@@ -148,8 +144,8 @@
 	{"NZ", T_CC_NZ},
 	{"Z", T_CC_Z},
 	{"NC", T_CC_NC},
-	/* Handled after as T_TOKEN_C */
-	/* { "C", T_CC_C }, */
+	// Handled after as T_TOKEN_C
+	// { "C", T_CC_C },
 
 	{"AF", T_MODE_AF},
 	{"BC", T_MODE_BC},
@@ -269,8 +265,8 @@
 
 	{"RB", T_POP_RB},
 	{"RW", T_POP_RW},
-	/* Handled before as T_Z80_RL */
-	/* {"RL", T_POP_RL}, */
+	// Handled before as T_Z80_RL
+	// {"RL", T_POP_RL},
 
 	{"EQU", T_POP_EQU},
 	{"EQUS", T_POP_EQUS},
@@ -291,10 +287,10 @@
 	return c == ' ' || c == '\t';
 }
 
-#define LEXER_BUF_SIZE 42 /* TODO: determine a sane value for this */
-/* The buffer needs to be large enough for the maximum `peekInternal` lookahead distance */
+#define LEXER_BUF_SIZE 42 // TODO: determine a sane value for this
+// The buffer needs to be large enough for the maximum `peekInternal` lookahead distance
 static_assert(LEXER_BUF_SIZE > 1, "Lexer buffer size is too small");
-/* This caps the size of buffer reads, and according to POSIX, passing more than SSIZE_MAX is UB */
+// This caps the size of buffer reads, and according to POSIX, passing more than SSIZE_MAX is UB
 static_assert(LEXER_BUF_SIZE <= SSIZE_MAX, "Lexer buffer size is too large");
 
 struct Expansion {
@@ -304,38 +300,38 @@
 		char const *unowned;
 		char *owned;
 	} contents;
-	size_t size; /* Length of the contents */
-	size_t offset; /* Cursor into the contents */
-	bool owned; /* Whether or not to free contents when this expansion is freed */
+	size_t size; // Length of the contents
+	size_t offset; // Cursor into the contents
+	bool owned; // Whether or not to free contents when this expansion is freed
 };
 
 struct IfStack {
 	struct IfStack *next;
-	bool ranIfBlock; /* Whether an IF/ELIF/ELSE block ran already */
-	bool reachedElseBlock; /* Whether an ELSE block ran already */
+	bool ranIfBlock; // Whether an IF/ELIF/ELSE block ran already
+	bool reachedElseBlock; // Whether an ELSE block ran already
 };
 
 struct LexerState {
 	char const *path;
 
-	/* mmap()-dependent IO state */
+	// mmap()-dependent IO state
 	bool isMmapped;
 	union {
-		struct { /* If mmap()ed */
-			char *ptr; /* Technically `const` during the lexer's execution */
+		struct { // If mmap()ed
+			char *ptr; // Technically `const` during the lexer's execution
 			size_t size;
 			size_t offset;
-			bool isReferenced; /* If a macro in this file requires not unmapping it */
+			bool isReferenced; // If a macro in this file requires not unmapping it
 		};
-		struct { /* Otherwise */
+		struct { // Otherwise
 			int fd;
-			size_t index; /* Read index into the buffer */
-			char buf[LEXER_BUF_SIZE]; /* Circular buffer */
-			size_t nbChars; /* Number of "fresh" chars in the buffer */
+			size_t index; // Read index into the buffer
+			char buf[LEXER_BUF_SIZE]; // Circular buffer
+			size_t nbChars; // Number of "fresh" chars in the buffer
 		};
 	};
 
-	/* Common state */
+	// Common state
 	bool isFile;
 
 	enum LexerMode mode;
@@ -346,16 +342,16 @@
 
 	struct IfStack *ifStack;
 
-	bool capturing; /* Whether the text being lexed should be captured */
-	size_t captureSize; /* Amount of text captured */
-	char *captureBuf; /* Buffer to send the captured text to if non-NULL */
-	size_t captureCapacity; /* Size of the buffer above */
+	bool capturing; // Whether the text being lexed should be captured
+	size_t captureSize; // Amount of text captured
+	char *captureBuf; // Buffer to send the captured text to if non-NULL
+	size_t captureCapacity; // Size of the buffer above
 
 	bool disableMacroArgs;
 	bool disableInterpolation;
-	size_t macroArgScanDistance; /* Max distance already scanned for macro args */
+	size_t macroArgScanDistance; // Max distance already scanned for macro args
 	bool expandStrings;
-	struct Expansion *expansions; /* Points to the innermost current expansion */
+	struct Expansion *expansions; // Points to the innermost current expansion
 };
 
 struct LexerState *lexerState = NULL;
@@ -364,7 +360,7 @@
 static void initState(struct LexerState *state)
 {
 	state->mode = LEXER_NORMAL;
-	state->atLineStart = true; /* yylex() will init colNo due to this */
+	state->atLineStart = true; // yylex() will init colNo due to this
 	state->lastToken = T_EOF;
 
 	state->ifStack = NULL;
@@ -447,7 +443,7 @@
 	struct LexerState *state = malloc(sizeof(*state));
 	struct stat fileInfo;
 
-	/* Give stdin a nicer file name */
+	// Give stdin a nicer file name
 	if (isStdin)
 		path = "<stdin>";
 	if (!state) {
@@ -467,23 +463,21 @@
 		free(state);
 		return NULL;
 	}
-	state->isMmapped = false; /* By default, assume it won't be mmap()ed */
+	state->isMmapped = false; // By default, assume it won't be mmap()ed
 	if (!isStdin && fileInfo.st_size > 0) {
-		/* Try using `mmap` for better performance */
+		// Try using `mmap` for better performance
 
-		/*
-		 * Important: do NOT assign to `state->ptr` directly, to avoid a cast that may
-		 * alter an eventual `MAP_FAILED` value. It would also invalidate `state->fd`,
-		 * being on the other side of the union.
-		 */
+		// Important: do NOT assign to `state->ptr` directly, to avoid a cast that may
+		// alter an eventual `MAP_FAILED` value. It would also invalidate `state->fd`,
+		// being on the other side of the union.
 		void *mappingAddr;
 
 		mapFile(mappingAddr, state->fd, state->path, fileInfo.st_size);
 		if (mappingAddr == MAP_FAILED) {
-			/* If mmap()ing failed, try again using another method (below) */
+			// If mmap()ing failed, try again using another method (below)
 			state->isMmapped = false;
 		} else {
-			/* IMPORTANT: the `union` mandates this is accessed before other members! */
+			// IMPORTANT: the `union` mandates this is accessed before other members!
 			close(state->fd);
 
 			state->isMmapped = true;
@@ -498,7 +492,7 @@
 		}
 	}
 	if (!state->isMmapped) {
-		/* Sometimes mmap() fails or isn't available, so have a fallback */
+		// Sometimes mmap() fails or isn't available, so have a fallback
 		if (verbose) {
 			if (isStdin)
 				printf("Opening stdin\n");
@@ -513,7 +507,7 @@
 	}
 
 	initState(state);
-	state->lineNo = 0; /* Will be incremented at first line start */
+	state->lineNo = 0; // Will be incremented at first line start
 	return state;
 }
 
@@ -526,15 +520,15 @@
 		return NULL;
 	}
 
-	state->path = path; /* Used to report read errors in `peekInternal` */
+	state->path = path; // Used to report read errors in `peekInternal`
 	state->isFile = false;
-	state->isMmapped = true; /* It's not *really* mmap()ed, but it behaves the same */
+	state->isMmapped = true; // It's not *really* mmap()ed, but it behaves the same
 	state->ptr = buf;
 	state->size = size;
 	state->offset = 0;
 
 	initState(state);
-	state->lineNo = lineNo; /* Will be incremented at first line start */
+	state->lineNo = lineNo; // Will be incremented at first line start
 	return state;
 }
 
@@ -568,22 +562,20 @@
 }
 
 struct KeywordDictNode {
-	/*
-	 * The identifier charset is (currently) 44 characters big. By storing entries for the
-	 * entire printable ASCII charset, minus lower-case due to case-insensitivity,
-	 * we only waste (0x60 - 0x20) - 70 = 20 entries per node, which should be acceptable.
-	 * In turn, this allows greatly simplifying checking an index into this array,
-	 * which should help speed up the lexer.
-	 */
+	// The identifier charset is (currently) 44 characters big. By storing entries for the
+	// entire printable ASCII charset, minus lower-case due to case-insensitivity,
+	// we only waste (0x60 - 0x20) - 70 = 20 entries per node, which should be acceptable.
+	// In turn, this allows greatly simplifying checking an index into this array,
+	// which should help speed up the lexer.
 	uint16_t children[0x60 - ' '];
 	struct KeywordMapping const *keyword;
-/* Since the keyword structure is invariant, the min number of nodes is known at compile time */
-} keywordDict[365] = {0}; /* Make sure to keep this correct when adding keywords! */
+// Since the keyword structure is invariant, the min number of nodes is known at compile time
+} keywordDict[365] = {0}; // Make sure to keep this correct when adding keywords!
 
-/* Convert a char into its index into the dict */
+// Convert a char into its index into the dict
 static uint8_t dictIndex(char c)
 {
-	/* Translate uppercase to lowercase (roughly) */
+	// Translate uppercase to lowercase (roughly)
 	if (c > 0x60)
 		c = c - ('a' - 'A');
 	return c - ' ';
@@ -591,31 +583,27 @@
 
 void lexer_Init(void)
 {
-	/*
-	 * Build the dictionary of keywords. This could be done at compile time instead, however:
-	 *  - Doing so manually is a task nobody wants to undertake
-	 *  - It would be massively hard to read
-	 *  - Doing it within CC or CPP would be quite non-trivial
-	 *  - Doing it externally would require some extra work to use only POSIX tools
-	 *  - The startup overhead isn't much compared to the program's
-	 */
+	// Build the dictionary of keywords. This could be done at compile time instead, however:
+	// - Doing so manually is a task nobody wants to undertake
+	// - It would be massively hard to read
+	// - Doing it within CC or CPP would be quite non-trivial
+	// - Doing it externally would require some extra work to use only POSIX tools
+	// - The startup overhead isn't much compared to the program's
 	uint16_t usedNodes = 1;
 
 	for (size_t i = 0; i < ARRAY_SIZE(keywords); i++) {
 		uint16_t nodeID = 0;
 
-		/* Walk the dictionary, creating intermediate nodes for the keyword */
+		// Walk the dictionary, creating intermediate nodes for the keyword
 		for (char const *ptr = keywords[i].name; *ptr; ptr++) {
-			/* We should be able to assume all entries are well-formed */
+			// We should be able to assume all entries are well-formed
 			if (keywordDict[nodeID].children[*ptr - ' '] == 0) {
-				/*
-				 * If this gets tripped up, set the size of keywordDict to
-				 * something high, compile with `-DPRINT_NODE_COUNT` (see below),
-				 * and set the size to that.
-				 */
+				// If this gets tripped up, set the size of keywordDict to
+				// something high, compile with `-DPRINT_NODE_COUNT` (see below),
+				// and set the size to that.
 				assert(usedNodes < sizeof(keywordDict) / sizeof(*keywordDict));
 
-				/* There is no node at that location, grab one from the pool */
+				// There is no node at that location, grab one from the pool
 				keywordDict[nodeID].children[*ptr - ' '] = usedNodes;
 				usedNodes++;
 			}
@@ -622,11 +610,11 @@
 			nodeID = keywordDict[nodeID].children[*ptr - ' '];
 		}
 
-		/* This assumes that no two keywords have the same name */
+		// This assumes that no two keywords have the same name
 		keywordDict[nodeID].keyword = &keywords[i];
 	}
 
-#ifdef PRINT_NODE_COUNT /* For the maintainer to check how many nodes are needed */
+#ifdef PRINT_NODE_COUNT // For the maintainer to check how many nodes are needed
 	printf("Lexer keyword dictionary: %zu keywords in %u nodes (pool size %zu)\n",
 	       ARRAY_SIZE(keywords), usedNodes, ARRAY_SIZE(keywordDict));
 #endif
@@ -642,7 +630,7 @@
 	lexerState->expandStrings = enable;
 }
 
-/* Functions for the actual lexer to obtain characters */
+// Functions for the actual lexer to obtain characters
 
 static void reallocCaptureBuf(void)
 {
@@ -661,7 +649,7 @@
 {
 	size_t size = strlen(str);
 
-	/* Do not expand empty strings */
+	// Do not expand empty strings
 	if (!size)
 		return;
 
@@ -706,7 +694,7 @@
 	return c == '@' || c == '#' || c == '<' || (c >= '0' && c <= '9');
 }
 
-/* forward declarations for readBracketedMacroArgNum */
+// forward declarations for readBracketedMacroArgNum
 static int peek(void);
 static void shiftChar(void);
 static uint32_t readNumber(int radix, uint32_t baseValue);
@@ -822,14 +810,12 @@
 	return (size_t)nbReadChars;
 }
 
-/* We only need one character of lookahead, for macro arguments */
+// We only need one character of lookahead, for macro arguments
 static int peekInternal(uint8_t distance)
 {
 	for (struct Expansion *exp = lexerState->expansions; exp; exp = exp->parent) {
-		/*
-		 * An expansion that has reached its end will have `exp->offset` == `exp->size`,
-		 * and `peekInternal` will continue with its parent
-		 */
+		// An expansion that has reached its end will have `exp->offset` == `exp->size`,
+		// and `peekInternal` will continue with its parent
 		assert(exp->offset <= exp->size);
 		if (distance < exp->size - exp->offset)
 			return exp->contents.unowned[exp->offset + distance];
@@ -848,13 +834,13 @@
 	}
 
 	if (lexerState->nbChars <= distance) {
-		/* Buffer isn't full enough, read some chars in */
-		size_t target = LEXER_BUF_SIZE - lexerState->nbChars; /* Aim: making the buf full */
+		// Buffer isn't full enough, read some chars in
+		size_t target = LEXER_BUF_SIZE - lexerState->nbChars; // Aim: making the buf full
 
-		/* Compute the index we'll start writing to */
+		// Compute the index we'll start writing to
 		size_t writeIndex = (lexerState->index + lexerState->nbChars) % LEXER_BUF_SIZE;
 
-		/* If the range to fill passes over the buffer wrapping point, we need two reads */
+		// If the range to fill passes over the buffer wrapping point, we need two reads
 		if (writeIndex + target > LEXER_BUF_SIZE) {
 			size_t nbExpectedChars = LEXER_BUF_SIZE - writeIndex;
 			size_t nbReadChars = readInternal(writeIndex, nbExpectedChars);
@@ -873,7 +859,7 @@
 		if (target != 0)
 			lexerState->nbChars += readInternal(writeIndex, target);
 
-		/* If there aren't enough chars even after refilling, give up */
+		// If there aren't enough chars even after refilling, give up
 		if (lexerState->nbChars <= distance)
 			return EOF;
 	}
@@ -881,7 +867,7 @@
 	return (unsigned char)lexerState->buf[(lexerState->index + distance) % LEXER_BUF_SIZE];
 }
 
-/* forward declarations for peek */
+// forward declarations for peek
 static void shiftChar(void);
 static char const *readInterpolation(size_t depth);
 
@@ -892,10 +878,10 @@
 	if (lexerState->macroArgScanDistance > 0)
 		return c;
 
-	lexerState->macroArgScanDistance++; /* Do not consider again */
+	lexerState->macroArgScanDistance++; // Do not consider again
 
 	if (c == '\\' && !lexerState->disableMacroArgs) {
-		/* If character is a backslash, check for a macro arg */
+		// If character is a backslash, check for a macro arg
 		lexerState->macroArgScanDistance++;
 		c = peekInternal(1);
 		if (isMacroChar(c)) {
@@ -903,19 +889,15 @@
 			shiftChar();
 			char const *str = readMacroArg(c);
 
-			/*
-			 * If the macro arg is invalid or an empty string, it cannot be
-			 * expanded, so skip it and keep peeking.
-			 */
+			// If the macro arg is invalid or an empty string, it cannot be
+			// expanded, so skip it and keep peeking.
 			if (!str || !str[0])
 				return peek();
 
 			beginExpansion(str, c == '#', NULL);
 
-			/*
-			 * Assuming macro args can't be recursive (I'll be damned if a way
-			 * is found...), then we mark the entire macro arg as scanned.
-			 */
+			// Assuming macro args can't be recursive (I'll be damned if a way
+			// is found...), then we mark the entire macro arg as scanned.
 			lexerState->macroArgScanDistance += strlen(str);
 
 			c = str[0];
@@ -923,7 +905,7 @@
 			c = '\\';
 		}
 	} else if (c == '{' && !lexerState->disableInterpolation) {
-		/* If character is an open brace, do symbol interpolation */
+		// If character is an open brace, do symbol interpolation
 		shiftChar();
 		char const *str = readInterpolation(0);
 
@@ -941,7 +923,7 @@
 		if (lexerState->captureBuf) {
 			if (lexerState->captureSize + 1 >= lexerState->captureCapacity)
 				reallocCaptureBuf();
-			/* TODO: improve this? */
+			// TODO: improve this?
 			lexerState->captureBuf[lexerState->captureSize] = peek();
 		}
 		lexerState->captureSize++;
@@ -951,14 +933,12 @@
 
 restart:
 	if (lexerState->expansions) {
-		/* Advance within the current expansion */
+		// Advance within the current expansion
 		assert(lexerState->expansions->offset <= lexerState->expansions->size);
 		lexerState->expansions->offset++;
 		if (lexerState->expansions->offset > lexerState->expansions->size) {
-			/*
-			 * When advancing would go past an expansion's end, free it,
-			 * move up to its parent, and try again to advance
-			 */
+			// When advancing would go past an expansion's end, free it,
+			// move up to its parent, and try again to advance
 			struct Expansion *exp = lexerState->expansions;
 
 			lexerState->expansions = lexerState->expansions->parent;
@@ -966,7 +946,7 @@
 			goto restart;
 		}
 	} else {
-		/* Advance within the file contents */
+		// Advance within the file contents
 		lexerState->colNo++;
 		if (lexerState->isMmapped) {
 			lexerState->offset++;
@@ -974,7 +954,7 @@
 			assert(lexerState->index < LEXER_BUF_SIZE);
 			lexerState->index++;
 			if (lexerState->index == LEXER_BUF_SIZE)
-				lexerState->index = 0; /* Wrap around if necessary */
+				lexerState->index = 0; // Wrap around if necessary
 			assert(lexerState->nbChars > 0);
 			lexerState->nbChars--;
 		}
@@ -985,7 +965,7 @@
 {
 	int c = peek();
 
-	/* If not at EOF, advance read position */
+	// If not at EOF, advance read position
 	if (c != EOF)
 		shiftChar();
 	return c;
@@ -997,7 +977,7 @@
 		shiftChar();
 }
 
-/* "Services" provided by the lexer to the rest of the program */
+// "Services" provided by the lexer to the rest of the program
 
 char const *lexer_GetFileName(void)
 {
@@ -1020,13 +1000,13 @@
 		return;
 
 	for (struct Expansion *exp = lexerState->expansions; exp; exp = exp->parent) {
-		/* Only register EQUS expansions, not string args */
+		// Only register EQUS expansions, not string args
 		if (exp->name)
 			fprintf(stderr, "while expanding symbol \"%s\"\n", exp->name);
 	}
 }
 
-/* Discards a block comment */
+// Discards a block comment
 static void discardBlockComment(void)
 {
 	lexerState->disableMacroArgs = true;
@@ -1039,9 +1019,9 @@
 			error("Unterminated block comment\n");
 			goto finish;
 		case '\r':
-			/* Handle CRLF before nextLine() since shiftChar updates colNo */
+			// Handle CRLF before nextLine() since shiftChar updates colNo
 			handleCRLF(c);
-			/* fallthrough */
+			// fallthrough
 		case '\n':
 			if (!lexerState->expansions)
 				nextLine();
@@ -1057,7 +1037,7 @@
 				shiftChar();
 				goto finish;
 			}
-			/* fallthrough */
+			// fallthrough
 		default:
 			continue;
 		}
@@ -1067,7 +1047,7 @@
 	lexerState->disableInterpolation = false;
 }
 
-/* Function to discard all of a line's comments */
+// Function to discard all of a line's comments
 
 static void discardComment(void)
 {
@@ -1083,7 +1063,7 @@
 	lexerState->disableInterpolation = false;
 }
 
-/* Function to read a line continuation */
+// Function to read a line continuation
 
 static void readLineContinuation(void)
 {
@@ -1094,7 +1074,7 @@
 			shiftChar();
 		} else if (c == '\r' || c == '\n') {
 			shiftChar();
-			/* Handle CRLF before nextLine() since shiftChar updates colNo */
+			// Handle CRLF before nextLine() since shiftChar updates colNo
 			handleCRLF(c);
 			if (!lexerState->expansions)
 				nextLine();
@@ -1109,7 +1089,7 @@
 	}
 }
 
-/* Function to read an anonymous label ref */
+// Function to read an anonymous label ref
 
 static void readAnonLabelRef(char c)
 {
@@ -1124,7 +1104,7 @@
 	sym_WriteAnonLabelName(yylval.symName, n, c == '-');
 }
 
-/* Functions to lex numbers of various radixes */
+// Functions to lex numbers of various radixes
 
 static uint32_t readNumber(int radix, uint32_t baseValue)
 {
@@ -1159,7 +1139,7 @@
 		if (divisor > (UINT32_MAX - (c - '0')) / 10) {
 			warning(WARNING_LARGE_CONSTANT,
 				"Precision of fixed-point constant is too large\n");
-			/* Discard any additional digits */
+			// Discard any additional digits
 			shiftChar();
 			while (c = peek(), (c >= '0' && c <= '9') || c == '_')
 				shiftChar();
@@ -1172,9 +1152,9 @@
 	if (integer > INT16_MAX || integer < INT16_MIN)
 		warning(WARNING_LARGE_CONSTANT, "Magnitude of fixed-point constant is too large\n");
 
-	/* Cast to unsigned avoids UB if shifting discards bits */
+	// Cast to unsigned avoids UB if shifting discards bits
 	integer = (uint32_t)integer << 16;
-	/* Cast to unsigned avoids undefined overflow behavior */
+	// Cast to unsigned avoids undefined overflow behavior
 	uint16_t fractional = (uint16_t)round(value * 65536.0 / divisor);
 
 	return (uint32_t)integer | (fractional * (integer >= 0 ? 1 : -1));
@@ -1281,7 +1261,7 @@
 	return bitPlaneUpper << 8 | bitPlaneLower;
 }
 
-/* Functions to read identifiers & keywords */
+// Functions to read identifiers & keywords
 
 static bool startsIdentifier(int c)
 {
@@ -1296,26 +1276,26 @@
 
 static int readIdentifier(char firstChar)
 {
-	/* Lex while checking for a keyword */
+	// Lex while checking for a keyword
 	yylval.symName[0] = firstChar;
 	uint16_t nodeID = keywordDict[0].children[dictIndex(firstChar)];
 	int tokenType = firstChar == '.' ? T_LOCAL_ID : T_ID;
 	size_t i = 1;
 
-	/* Continue reading while the char is in the symbol charset */
+	// Continue reading while the char is in the symbol charset
 	for (int c = peek(); continuesIdentifier(c); i++, c = peek()) {
 		shiftChar();
 
 		if (i < sizeof(yylval.symName) - 1) {
-			/* Write the char to the identifier's name */
+			// Write the char to the identifier's name
 			yylval.symName[i] = c;
 
-			/* If the char was a dot, mark the identifier as local */
+			// If the char was a dot, mark the identifier as local
 			if (c == '.')
 				tokenType = T_LOCAL_ID;
 
-			/* Attempt to traverse the tree to check for a keyword */
-			if (nodeID) /* Do nothing if matching already failed */
+			// Attempt to traverse the tree to check for a keyword
+			if (nodeID) // Do nothing if matching already failed
 				nodeID = keywordDict[nodeID].children[dictIndex(c)];
 		}
 	}
@@ -1324,7 +1304,7 @@
 		warning(WARNING_LONG_STR, "Symbol name too long, got truncated\n");
 		i = sizeof(yylval.symName) - 1;
 	}
-	yylval.symName[i] = '\0'; /* Terminate the string */
+	yylval.symName[i] = '\0'; // Terminate the string
 
 	if (keywordDict[nodeID].keyword)
 		return keywordDict[nodeID].keyword->token;
@@ -1332,7 +1312,7 @@
 	return tokenType;
 }
 
-/* Functions to read strings */
+// Functions to read strings
 
 static char const *readInterpolation(size_t depth)
 {
@@ -1344,23 +1324,21 @@
 	struct FormatSpec fmt = fmt_NewSpec();
 	bool disableInterpolation = lexerState->disableInterpolation;
 
-	/*
-	 * In a context where `lexerState->disableInterpolation` is true, `peek` will expand
-	 * nested interpolations itself, which can lead to stack overflow. This lets
-	 * `readInterpolation` handle its own nested expansions, increasing `depth` each time.
-	 */
+	// In a context where `lexerState->disableInterpolation` is true, `peek` will expand
+	// nested interpolations itself, which can lead to stack overflow. This lets
+	// `readInterpolation` handle its own nested expansions, increasing `depth` each time.
 	lexerState->disableInterpolation = true;
 
 	for (;;) {
 		int c = peek();
 
-		if (c == '{') { /* Nested interpolation */
+		if (c == '{') { // Nested interpolation
 			shiftChar();
 			char const *str = readInterpolation(depth + 1);
 
 			if (str && str[0])
 				beginExpansion(str, false, str);
-			continue; /* Restart, reading from the new buffer */
+			continue; // Restart, reading from the new buffer
 		} else if (c == EOF || c == '\r' || c == '\n' || c == '"') {
 			error("Missing }\n");
 			break;
@@ -1367,7 +1345,7 @@
 		} else if (c == '}') {
 			shiftChar();
 			break;
-		} else if (c == ':' && !fmt_IsFinished(&fmt)) { /* Format spec, only once */
+		} else if (c == ':' && !fmt_IsFinished(&fmt)) { // Format spec, only once
 			shiftChar();
 			for (size_t j = 0; j < i; j++)
 				fmt_UseCharacter(&fmt, symName[j]);
@@ -1375,10 +1353,10 @@
 			symName[i] = '\0';
 			if (!fmt_IsValid(&fmt))
 				error("Invalid format spec '%s'\n", symName);
-			i = 0; /* Now that format has been set, restart at beginning of string */
+			i = 0; // Now that format has been set, restart at beginning of string
 		} else {
 			shiftChar();
-			if (i < sizeof(symName)) /* Allow writing an extra char to flag overflow */
+			if (i < sizeof(symName)) // Allow writing an extra char to flag overflow
 				symName[i++] = c;
 		}
 	}
@@ -1389,7 +1367,7 @@
 	}
 	symName[i] = '\0';
 
-	/* Don't return before `lexerState->disableInterpolation` is reset! */ 
+	// Don't return before `lexerState->disableInterpolation` is reset!
 	lexerState->disableInterpolation = disableInterpolation;
 
 	static char buf[MAXSTRLEN + 1];
@@ -1400,13 +1378,13 @@
 		error("Interpolated symbol \"%s\" does not exist\n", symName);
 	} else if (sym->type == SYM_EQUS) {
 		if (fmt_IsEmpty(&fmt))
-			/* No format was specified */
+			// No format was specified
 			fmt.type = 's';
 		fmt_PrintString(buf, sizeof(buf), &fmt, sym_GetStringValue(sym));
 		return buf;
 	} else if (sym_IsNumeric(sym)) {
 		if (fmt_IsEmpty(&fmt)) {
-			/* No format was specified; default to uppercase $hex */
+			// No format was specified; default to uppercase $hex
 			fmt.type = 'X';
 			fmt.prefix = true;
 		}
@@ -1426,11 +1404,11 @@
 
 static size_t appendEscapedSubstring(char const *str, size_t i)
 {
-	/* Copy one extra to flag overflow */
+	// Copy one extra to flag overflow
 	while (*str) {
 		char c = *str++;
 
-		/* Escape characters that need escaping */
+		// Escape characters that need escaping
 		switch (c) {
 		case '\\':
 		case '"':
@@ -1493,7 +1471,7 @@
 
 		// Handle '\r' or '\n' (in multiline strings only, already handled above otherwise)
 		if (c == '\r' || c == '\n') {
-			/* Handle CRLF before nextLine() since shiftChar updates colNo */
+			// Handle CRLF before nextLine() since shiftChar updates colNo
 			handleCRLF(c);
 			nextLine();
 			c = '\n';
@@ -1645,7 +1623,7 @@
 
 		// Handle '\r' or '\n' (in multiline strings only, already handled above otherwise)
 		if (c == '\r' || c == '\n') {
-			/* Handle CRLF before nextLine() since shiftChar updates colNo */
+			// Handle CRLF before nextLine() since shiftChar updates colNo
 			handleCRLF(c);
 			nextLine();
 			c = '\n';
@@ -1715,7 +1693,7 @@
 				c = '\\';
 				break;
 
-			case ',': /* `\,` inside a macro arg string literal */
+			case ',': // `\,` inside a macro arg string literal
 				warning(WARNING_OBSOLETE,
 					"`\\,` is deprecated inside strings\n");
 				shiftChar();
@@ -1757,7 +1735,7 @@
 	return i;
 }
 
-/* Lexer core */
+// Lexer core
 
 static int yylex_SKIP_TO_ENDC(void); // forward declaration for yylex_NORMAL
 
@@ -1768,16 +1746,16 @@
 		char secondChar;
 
 		switch (c) {
-		/* Ignore whitespace and comments */
+		// Ignore whitespace and comments
 
 		case ';':
 			discardComment();
-			/* fallthrough */
+			// fallthrough
 		case ' ':
 		case '\t':
 			break;
 
-		/* Handle unambiguous single-char tokens */
+		// Handle unambiguous single-char tokens
 
 		case '~':
 			return T_OP_NOT;
@@ -1798,9 +1776,9 @@
 		case ',':
 			return T_COMMA;
 
-		/* Handle ambiguous 1- or 2-char tokens */
+		// Handle ambiguous 1- or 2-char tokens
 
-		case '+': /* Either += or ADD */
+		case '+': // Either += or ADD
 			if (peek() == '=') {
 				shiftChar();
 				return T_POP_ADDEQ;
@@ -1807,7 +1785,7 @@
 			}
 			return T_OP_ADD;
 
-		case '-': /* Either -= or SUB */
+		case '-': // Either -= or SUB
 			if (peek() == '=') {
 				shiftChar();
 				return T_POP_SUBEQ;
@@ -1814,7 +1792,7 @@
 			}
 			return T_OP_SUB;
 
-		case '*': /* Either *=, MUL, or EXP */
+		case '*': // Either *=, MUL, or EXP
 			switch (peek()) {
 			case '=':
 				shiftChar();
@@ -1826,7 +1804,7 @@
 				return T_OP_MUL;
 			}
 
-		case '/': /* Either /=, DIV, or a block comment */
+		case '/': // Either /=, DIV, or a block comment
 			switch (peek()) {
 			case '=':
 				shiftChar();
@@ -1840,7 +1818,7 @@
 			}
 			break;
 
-		case '|': /* Either |=, binary OR, or logical OR */
+		case '|': // Either |=, binary OR, or logical OR
 			switch (peek()) {
 			case '=':
 				shiftChar();
@@ -1852,7 +1830,7 @@
 				return T_OP_OR;
 			}
 
-		case '^': /* Either ^= or XOR */
+		case '^': // Either ^= or XOR
 			if (peek() == '=') {
 				shiftChar();
 				return T_POP_XOREQ;
@@ -1859,7 +1837,7 @@
 			}
 			return T_OP_XOR;
 
-		case '=': /* Either assignment or EQ */
+		case '=': // Either assignment or EQ
 			if (peek() == '=') {
 				shiftChar();
 				return T_OP_LOGICEQU;
@@ -1866,7 +1844,7 @@
 			}
 			return T_POP_EQUAL;
 
-		case '!': /* Either a NEQ or negation */
+		case '!': // Either a NEQ or negation
 			if (peek() == '=') {
 				shiftChar();
 				return T_OP_LOGICNE;
@@ -1873,9 +1851,9 @@
 			}
 			return T_OP_LOGICNOT;
 
-		/* Handle ambiguous 1-, 2-, or 3-char tokens */
+		// Handle ambiguous 1-, 2-, or 3-char tokens
 
-		case '<': /* Either <<=, LT, LTE, or left shift */
+		case '<': // Either <<=, LT, LTE, or left shift
 			switch (peek()) {
 			case '=':
 				shiftChar();
@@ -1891,7 +1869,7 @@
 				return T_OP_LOGICLT;
 			}
 
-		case '>': /* Either >>=, GT, GTE, or either kind of right shift */
+		case '>': // Either >>=, GT, GTE, or either kind of right shift
 			switch (peek()) {
 			case '=':
 				shiftChar();
@@ -1912,7 +1890,7 @@
 				return T_OP_LOGICGT;
 			}
 
-		/* Handle colon, which may begin an anonymous label ref */
+		// Handle colon, which may begin an anonymous label ref
 
 		case ':':
 			c = peek();
@@ -1922,9 +1900,9 @@
 			readAnonLabelRef(c);
 			return T_ANON;
 
-		/* Handle numbers */
+		// Handle numbers
 
-		case '0': /* Decimal or fixed-point number */
+		case '0': // Decimal or fixed-point number
 		case '1':
 		case '2':
 		case '3':
@@ -1941,7 +1919,7 @@
 			}
 			return T_NUMBER;
 
-		case '&': /* Either &=, binary AND, logical AND, or an octal constant */
+		case '&': // Either &=, binary AND, logical AND, or an octal constant
 			secondChar = peek();
 			if (secondChar == '=') {
 				shiftChar();
@@ -1955,7 +1933,7 @@
 			}
 			return T_OP_AND;
 
-		case '%': /* Either %=, MOD, or a binary constant */
+		case '%': // Either %=, MOD, or a binary constant
 			secondChar = peek();
 			if (secondChar == '=') {
 				shiftChar();
@@ -1966,25 +1944,25 @@
 			}
 			return T_OP_MOD;
 
-		case '$': /* Hex constant */
+		case '$': // Hex constant
 			yylval.constValue = readHexNumber();
 			return T_NUMBER;
 
-		case '`': /* Gfx constant */
+		case '`': // Gfx constant
 			yylval.constValue = readGfxConstant();
 			return T_NUMBER;
 
-		/* Handle strings */
+		// Handle strings
 
 		case '"':
 			readString();
 			return T_STRING;
 
-		/* Handle newlines and EOF */
+		// Handle newlines and EOF
 
 		case '\r':
 			handleCRLF(c);
-			/* fallthrough */
+			// fallthrough
 		case '\n':
 			return T_NEWLINE;
 
@@ -1991,7 +1969,7 @@
 		case EOF:
 			return T_EOF;
 
-		/* Handle line continuations */
+		// Handle line continuations
 
 		case '\\':
 			// Macro args were handled by `peek`, and character escapes do not exist
@@ -1999,25 +1977,25 @@
 			readLineContinuation();
 			break;
 
-		/* Handle identifiers... or report garbage characters */
+		// Handle identifiers... or report garbage characters
 
 		default:
 			if (startsIdentifier(c)) {
 				int tokenType = readIdentifier(c);
 
-				/* An ELIF after a taken IF needs to not evaluate its condition */
+				// An ELIF after a taken IF needs to not evaluate its condition
 				if (tokenType == T_POP_ELIF && lexerState->lastToken == T_NEWLINE
 				 && lexer_GetIFDepth() > 0 && lexer_RanIFBlock()
 				 && !lexer_ReachedELSEBlock())
 					return yylex_SKIP_TO_ENDC();
 
-				/* If a keyword, don't try to expand */
+				// If a keyword, don't try to expand
 				if (tokenType != T_ID && tokenType != T_LOCAL_ID)
 					return tokenType;
 
-				/* Local symbols cannot be string expansions */
+				// Local symbols cannot be string expansions
 				if (tokenType == T_ID && lexerState->expandStrings) {
-					/* Attempt string expansion */
+					// Attempt string expansion
 					struct Symbol const *sym = sym_FindExactSymbol(yylval.symName);
 
 					if (sym && sym->type == SYM_EQUS) {
@@ -2026,7 +2004,7 @@
 						assert(s);
 						if (s[0])
 							beginExpansion(s, false, sym->name);
-						continue; /* Restart, reading from the new buffer */
+						continue; // Restart, reading from the new buffer
 					}
 				}
 
@@ -2036,9 +2014,9 @@
 				return tokenType;
 			}
 
-			/* Do not report weird characters when capturing, it'll be done later */
+			// Do not report weird characters when capturing, it'll be done later
 			if (!lexerState->capturing) {
-				/* TODO: try to group reportings */
+				// TODO: try to group reportings
 				error("Unknown character %s\n", printChar(c));
 			}
 		}
@@ -2048,12 +2026,12 @@
 
 static int yylex_RAW(void)
 {
-	/* This is essentially a modified `appendStringLiteral` */
+	// This is essentially a modified `appendStringLiteral`
 	size_t parenDepth = 0;
 	size_t i = 0;
 	int c;
 
-	/* Trim left whitespace (stops at a block comment) */
+	// Trim left whitespace (stops at a block comment)
 	for (;;) {
 		c = peek();
 		if (isWhitespace(c)) {
@@ -2075,21 +2053,21 @@
 		c = peek();
 
 		switch (c) {
-		case '"': /* String literals inside macro args */
+		case '"': // String literals inside macro args
 			shiftChar();
 			i = appendStringLiteral(i);
 			break;
 
-		case ';': /* Comments inside macro args */
+		case ';': // Comments inside macro args
 			discardComment();
 			c = peek();
-			/* fallthrough */
-		case '\r': /* End of line */
+			// fallthrough
+		case '\r': // End of line
 		case '\n':
 		case EOF:
 			goto finish;
 
-		case '/': /* Block comments inside macro args */
+		case '/': // Block comments inside macro args
 			shiftChar();
 			if (peek() == '*') {
 				shiftChar();
@@ -2096,34 +2074,34 @@
 				discardBlockComment();
 				continue;
 			}
-			append_yylval_string(c); /* Append the slash */
+			append_yylval_string(c); // Append the slash
 			break;
 
-		case ',': /* End of macro arg */
+		case ',': // End of macro arg
 			if (parenDepth == 0)
 				goto finish;
 			goto append;
 
-		case '(': /* Open parentheses inside macro args */
+		case '(': // Open parentheses inside macro args
 			if (parenDepth < UINT_MAX)
 				parenDepth++;
 			goto append;
 
-		case ')': /* Close parentheses inside macro args */
+		case ')': // Close parentheses inside macro args
 			if (parenDepth > 0)
 				parenDepth--;
 			goto append;
 
-		case '\\': /* Character escape */
+		case '\\': // Character escape
 			shiftChar();
 			c = peek();
 
 backslash:
 			switch (c) {
-			case ',': /* Escapes only valid inside a macro arg */
+			case ',': // Escapes only valid inside a macro arg
 			case '(':
 			case ')':
-			case '\\': /* Escapes shared with string literals */
+			case '\\': // Escapes shared with string literals
 			case '"':
 			case '{':
 			case '}':
@@ -2145,23 +2123,21 @@
 				readLineContinuation();
 				continue;
 
-			case EOF: /* Can't really print that one */
+			case EOF: // Can't really print that one
 				error("Illegal character escape at end of input\n");
 				c = '\\';
 				break;
 
-			/*
-			 * Macro args were already handled by peek, so '\@',
-			 * '\#', and '\0'-'\9' should not occur here.
-			 */
+			// Macro args were already handled by peek, so '\@',
+			// '\#', and '\0'-'\9' should not occur here.
 
 			default:
 				error("Illegal character escape %s\n", printChar(c));
 				break;
 			}
-			/* fallthrough */
+			// fallthrough
 
-		default: /* Regular characters will just get copied */
+		default: // Regular characters will just get copied
 append:
 			append_yylval_string(c);
 			shiftChar();
@@ -2174,7 +2150,7 @@
 		i--;
 		warning(WARNING_LONG_STR, "Macro argument too long\n");
 	}
-	/* Trim right whitespace */
+	// Trim right whitespace
 	while (i && isWhitespace(yylval.string[i - 1]))
 		i--;
 	yylval.string[i] = '\0';
@@ -2209,13 +2185,11 @@
 
 #undef append_yylval_string
 
-/*
- * This function uses the fact that `if`, etc. constructs are only valid when
- * there's nothing before them on their lines. This enables filtering
- * "meaningful" (= at line start) vs. "meaningless" (everything else) tokens.
- * It's especially important due to macro args not being handled in this
- * state, and lexing them in "normal" mode potentially producing such tokens.
- */
+// This function uses the fact that `if`, etc. constructs are only valid when
+// there's nothing before them on their lines. This enables filtering
+// "meaningful" (= at line start) vs. "meaningless" (everything else) tokens.
+// It's especially important due to macro args not being handled in this
+// state, and lexing them in "normal" mode potentially producing such tokens.
 static int skipIfBlock(bool toEndc)
 {
 	lexer_SetMode(LEXER_NORMAL);
@@ -2223,7 +2197,7 @@
 	int token;
 	bool atLineStart = lexerState->atLineStart;
 
-	/* Prevent expanding macro args and symbol interpolation in this state */
+	// Prevent expanding macro args and symbol interpolation in this state
 	lexerState->disableMacroArgs = true;
 	lexerState->disableInterpolation = true;
 
@@ -2254,11 +2228,11 @@
 					if (lexer_ReachedELSEBlock())
 						fatalerror("Found ELSE after an ELSE block\n");
 					lexer_ReachELSEBlock();
-					/* fallthrough */
+					// fallthrough
 				maybeFinish:
-					if (toEndc) /* Ignore ELIF and ELSE, go to ENDC */
+					if (toEndc) // Ignore ELIF and ELSE, go to ENDC
 						break;
-					/* fallthrough */
+					// fallthrough
 				case T_POP_ENDC:
 					if (lexer_GetIFDepth() == startingDepth)
 						goto finish;
@@ -2269,7 +2243,7 @@
 			atLineStart = false;
 		}
 
-		/* Read chars until EOL */
+		// Read chars until EOL
 		do {
 			int c = nextChar();
 
@@ -2277,7 +2251,7 @@
 				token = T_EOF;
 				goto finish;
 			} else if (c == '\\') {
-				/* Unconditionally skip the next char, including line conts */
+				// Unconditionally skip the next char, including line conts
 				c = nextChar();
 			} else if (c == '\r' || c == '\n') {
 				atLineStart = true;
@@ -2284,9 +2258,9 @@
 			}
 
 			if (c == '\r' || c == '\n') {
-				/* Handle CRLF before nextLine() since shiftChar updates colNo */
+				// Handle CRLF before nextLine() since shiftChar updates colNo
 				handleCRLF(c);
-				/* Do this both on line continuations and plain EOLs */
+				// Do this both on line continuations and plain EOLs
 				nextLine();
 			}
 		} while (!atLineStart);
@@ -2316,7 +2290,7 @@
 	int depth = 1;
 	bool atLineStart = lexerState->atLineStart;
 
-	/* Prevent expanding macro args and symbol interpolation in this state */
+	// Prevent expanding macro args and symbol interpolation in this state
 	lexerState->disableMacroArgs = true;
 	lexerState->disableInterpolation = true;
 
@@ -2356,7 +2330,7 @@
 			atLineStart = false;
 		}
 
-		/* Read chars until EOL */
+		// Read chars until EOL
 		do {
 			int c = nextChar();
 
@@ -2363,7 +2337,7 @@
 			if (c == EOF) {
 				goto finish;
 			} else if (c == '\\') {
-				/* Unconditionally skip the next char, including line conts */
+				// Unconditionally skip the next char, including line conts
 				c = nextChar();
 			} else if (c == '\r' || c == '\n') {
 				atLineStart = true;
@@ -2370,9 +2344,9 @@
 			}
 
 			if (c == '\r' || c == '\n') {
-				/* Handle CRLF before nextLine() since shiftChar updates colNo */
+				// Handle CRLF before nextLine() since shiftChar updates colNo
 				handleCRLF(c);
-				/* Do this both on line continuations and plain EOLs */
+				// Do this both on line continuations and plain EOLs
 				nextLine();
 			}
 		} while (!atLineStart);
@@ -2383,7 +2357,7 @@
 	lexerState->disableInterpolation = false;
 	lexerState->atLineStart = false;
 
-	/* yywrap() will finish the REPT/FOR loop */
+	// yywrap() will finish the REPT/FOR loop
 	return T_EOF;
 }
 
@@ -2393,10 +2367,10 @@
 		lexer_SetState(lexerStateEOL);
 		lexerStateEOL = NULL;
 	}
-	/* `lexer_SetState` updates `lexerState`, so check for EOF after it */
+	// `lexer_SetState` updates `lexerState`, so check for EOF after it
 	if (lexerState->lastToken == T_EOB && yywrap())
 		return T_EOF;
-	/* Newlines read within an expansion should not increase the line count */
+	// Newlines read within an expansion should not increase the line count
 	if (lexerState->atLineStart && !lexerState->expansions)
 		nextLine();
 
@@ -2409,7 +2383,7 @@
 	};
 	int token = lexerModeFuncs[lexerState->mode]();
 
-	/* Captures end at their buffer's boundary no matter what */
+	// Captures end at their buffer's boundary no matter what
 	if (token == T_EOF && !lexerState->capturing)
 		token = T_EOB;
 	lexerState->lastToken = token;
@@ -2431,7 +2405,7 @@
 	if (lexerState->isMmapped && !lexerState->expansions) {
 		capture->body = &lexerState->ptr[lexerState->offset];
 	} else {
-		lexerState->captureCapacity = 128; /* The initial size will be twice that */
+		lexerState->captureCapacity = 128; // The initial size will be twice that
 		assert(lexerState->captureBuf == NULL);
 		reallocCaptureBuf();
 		capture->body = NULL; // Indicate to retrieve the capture buffer when done capturing
@@ -2459,33 +2433,29 @@
 	size_t depth = 0;
 	int c = EOF;
 
-	/*
-	 * Due to parser internals, it reads the EOL after the expression before calling this.
-	 * Thus, we don't need to keep one in the buffer afterwards.
-	 * The following assertion checks that.
-	 */
+	// Due to parser internals, it reads the EOL after the expression before calling this.
+	// Thus, we don't need to keep one in the buffer afterwards.
+	// The following assertion checks that.
 	assert(lexerState->atLineStart);
 	for (;;) {
 		nextLine();
-		/* We're at line start, so attempt to match a `REPT` or `ENDR` token */
-		do { /* Discard initial whitespace */
+		// We're at line start, so attempt to match a `REPT` or `ENDR` token
+		do { // Discard initial whitespace
 			c = nextChar();
 		} while (isWhitespace(c));
-		/* Now, try to match `REPT`, `FOR` or `ENDR` as a **whole** identifier */
+		// Now, try to match `REPT`, `FOR` or `ENDR` as a **whole** identifier
 		if (startsIdentifier(c)) {
 			switch (readIdentifier(c)) {
 			case T_POP_REPT:
 			case T_POP_FOR:
 				depth++;
-				/* Ignore the rest of that line */
+				// Ignore the rest of that line
 				break;
 
 			case T_POP_ENDR:
 				if (!depth) {
-					/*
-					 * The final ENDR has been captured, but we don't want it!
-					 * We know we have read exactly "ENDR", not e.g. an EQUS
-					 */
+					// The final ENDR has been captured, but we don't want it!
+					// We know we have read exactly "ENDR", not e.g. an EQUS
 					lexerState->captureSize -= strlen("ENDR");
 					goto finish;
 				}
@@ -2493,7 +2463,7 @@
 			}
 		}
 
-		/* Just consume characters until EOL or EOF */
+		// Just consume characters until EOL or EOF
 		for (;; c = nextChar()) {
 			if (c == EOF) {
 				error("Unterminated REPT/FOR block\n");
@@ -2507,10 +2477,10 @@
 
 finish:
 	endCapture(capture);
-	/* ENDR or EOF puts us past the start of the line */
+	// ENDR or EOF puts us past the start of the line
 	lexerState->atLineStart = false;
 
-	/* Returns true if an ENDR terminated the block, false if it reached EOF first */
+	// Returns true if an ENDR terminated the block, false if it reached EOF first
 	return c != EOF;
 }
 
@@ -2518,38 +2488,34 @@
 {
 	startCapture(capture);
 
-	/* If the file is `mmap`ed, we need not to unmap it to keep access to the macro */
+	// If the file is `mmap`ed, we need not to unmap it to keep access to the macro
 	if (lexerState->isMmapped)
 		lexerState->isReferenced = true;
 
 	int c = EOF;
 
-	/*
-	 * Due to parser internals, it reads the EOL after the expression before calling this.
-	 * Thus, we don't need to keep one in the buffer afterwards.
-	 * The following assertion checks that.
-	 */
+	// Due to parser internals, it reads the EOL after the expression before calling this.
+	// Thus, we don't need to keep one in the buffer afterwards.
+	// The following assertion checks that.
 	assert(lexerState->atLineStart);
 	for (;;) {
 		nextLine();
-		/* We're at line start, so attempt to match an `ENDM` token */
-		do { /* Discard initial whitespace */
+		// We're at line start, so attempt to match an `ENDM` token
+		do { // Discard initial whitespace
 			c = nextChar();
 		} while (isWhitespace(c));
-		/* Now, try to match `ENDM` as a **whole** identifier */
+		// Now, try to match `ENDM` as a **whole** identifier
 		if (startsIdentifier(c)) {
 			switch (readIdentifier(c)) {
 			case T_POP_ENDM:
-				/*
-				 * The ENDM has been captured, but we don't want it!
-				 * We know we have read exactly "ENDM", not e.g. an EQUS
-				 */
+				// The ENDM has been captured, but we don't want it!
+				// We know we have read exactly "ENDM", not e.g. an EQUS
 				lexerState->captureSize -= strlen("ENDM");
 				goto finish;
 			}
 		}
 
-		/* Just consume characters until EOL or EOF */
+		// Just consume characters until EOL or EOF
 		for (;; c = nextChar()) {
 			if (c == EOF) {
 				error("Unterminated macro definition\n");
@@ -2563,9 +2529,9 @@
 
 finish:
 	endCapture(capture);
-	/* ENDM or EOF puts us past the start of the line */
+	// ENDM or EOF puts us past the start of the line
 	lexerState->atLineStart = false;
 
-	/* Returns true if an ENDM terminated the block, false if it reached EOF first */
+	// Returns true if an ENDM terminated the block, false if it reached EOF first
 	return c != EOF;
 }
--- a/src/asm/macro.c
+++ b/src/asm/macro.c
@@ -1,3 +1,10 @@
+/*
+ * This file is part of RGBDS.
+ *
+ * Copyright (c) 2022, Eldred Habert and RGBDS contributors.
+ *
+ * SPDX-License-Identifier: MIT
+ */
 
 #include <assert.h>
 #include <errno.h>
@@ -12,13 +19,11 @@
 
 #define MAXMACROARGS 99999
 
-/*
- * Your average macro invocation does not go past the tens, but some go further
- * This ensures that sane and slightly insane invocations suffer no penalties,
- * and the rest is insane and thus will assume responsibility.
- * Additionally, ~300 bytes (on x64) of memory per level of nesting has been
- * deemed reasonable. (Halve that on x86.)
- */
+// Your average macro invocation does not go past the tens, but some go further
+// This ensures that sane and slightly insane invocations suffer no penalties,
+// and the rest is insane and thus will assume responsibility.
+// Additionally, ~300 bytes (on x64) of memory per level of nesting has been
+// deemed reasonable. (Halve that on x86.)
 #define INITIAL_ARG_SIZE 32
 struct MacroArgs {
 	unsigned int nbArgs;
@@ -33,11 +38,9 @@
 static struct MacroArgs *macroArgs = NULL;
 static uint32_t uniqueID = 0;
 static uint32_t maxUniqueID = 0;
-/*
- * The initialization is somewhat harmful, since it is never used, but it
- * guarantees the size of the buffer will be correct. I was unable to find a
- * better solution, but if you have one, please feel free!
- */
+// The initialization is somewhat harmful, since it is never used, but it
+// guarantees the size of the buffer will be correct. I was unable to find a
+// better solution, but if you have one, please feel free!
 static char uniqueIDBuf[] = "_u4294967295"; // UINT32_MAX
 static char *uniqueIDPtr = NULL;
 
@@ -68,7 +71,7 @@
 		error("A maximum of " EXPAND_AND_STR(MAXMACROARGS) " arguments is allowed\n");
 	if (macArgs->nbArgs >= macArgs->capacity) {
 		macArgs->capacity *= 2;
-		/* Check that overflow didn't roll us back */
+		// Check that overflow didn't roll us back
 		if (macArgs->capacity <= macArgs->nbArgs)
 			fatalerror("Failed to add new macro argument: capacity overflow\n");
 		macArgs = realloc(macArgs, SIZEOF_ARGS(macArgs->capacity));
@@ -112,9 +115,9 @@
 	size_t len = 0;
 
 	for (uint32_t i = macroArgs->shift; i < macroArgs->nbArgs; i++)
-		len += strlen(macroArgs->args[i]) + 1; /* 1 for comma */
+		len += strlen(macroArgs->args[i]) + 1; // 1 for comma
 
-	char *str = malloc(len + 1); /* 1 for '\0' */
+	char *str = malloc(len + 1); // 1 for '\0'
 	char *ptr = str;
 
 	if (!str)
@@ -126,9 +129,9 @@
 		memcpy(ptr, macroArgs->args[i], n);
 		ptr += n;
 
-		/* Commas go between args and after a last empty arg */
+		// Commas go between args and after a last empty arg
 		if (i < macroArgs->nbArgs - 1 || n == 0)
-			*ptr++ = ','; /* no space after comma */
+			*ptr++ = ','; // no space after comma
 	}
 	*ptr = '\0';
 
@@ -153,8 +156,8 @@
 	} else {
 		if (uniqueID > maxUniqueID)
 			maxUniqueID = uniqueID;
-		/* The buffer is guaranteed to be the correct size */
-		/* This is a valid label fragment, but not a valid numeric */
+		// The buffer is guaranteed to be the correct size
+		// This is a valid label fragment, but not a valid numeric
 		sprintf(uniqueIDBuf, "_u%" PRIu32, id);
 		uniqueIDPtr = uniqueIDBuf;
 	}
--- a/src/asm/main.c
+++ b/src/asm/main.c
@@ -39,8 +39,8 @@
 #ifdef __clang__
 #if __has_feature(address_sanitizer) && !defined(__SANITIZE_ADDRESS__)
 #define __SANITIZE_ADDRESS__
-#endif /* __has_feature(address_sanitizer) && !defined(__SANITIZE_ADDRESS__) */
-#endif /* __clang__ */
+#endif // __has_feature(address_sanitizer) && !defined(__SANITIZE_ADDRESS__)
+#endif // __clang__
 
 #ifdef __SANITIZE_ADDRESS__
 // There are known, non-trivial to fix leaks. We would still like to have `make develop'
@@ -63,9 +63,9 @@
 bool optimizeLoads;
 bool warnOnLdOpt;
 bool verbose;
-bool warnings; /* True to enable warnings, false to disable them. */
+bool warnings; // True to enable warnings, false to disable them.
 
-/* Escapes Make-special chars from a string */
+// Escapes Make-special chars from a string
 static char *make_escape(char const *str)
 {
 	char * const escaped_str = malloc(strlen(str) * 2 + 1);
@@ -75,7 +75,7 @@
 		err("%s: Failed to allocate memory", __func__);
 
 	while (*str) {
-		/* All dollars needs to be doubled */
+		// All dollars needs to be doubled
 		if (*str == '$')
 			*dest++ = '$';
 		*dest++ = *str++;
@@ -85,22 +85,20 @@
 	return escaped_str;
 }
 
-/* Short options */
+// Short options
 static const char *optstring = "b:D:Eg:Hhi:LlM:o:p:r:VvW:w";
 
-/* Variables for the long-only options */
-static int depType; /* Variants of `-M` */
+// Variables for the long-only options
+static int depType; // Variants of `-M`
 
-/*
- * Equivalent long options
- * Please keep in the same order as short opts
- *
- * Also, make sure long opts don't create ambiguity:
- * A long opt's name should start with the same letter as its short opt,
- * except if it doesn't create any ambiguity (`verbose` versus `version`).
- * This is because long opt matching, even to a single char, is prioritized
- * over short opt matching
- */
+// Equivalent long options
+// Please keep in the same order as short opts
+//
+// Also, make sure long opts don't create ambiguity:
+// A long opt's name should start with the same letter as its short opt,
+// except if it doesn't create any ambiguity (`verbose` versus `version`).
+// This is because long opt matching, even to a single char, is prioritized
+// over short opt matching
 static struct option const longopts[] = {
 	{ "binary-digits",    required_argument, NULL,     'b' },
 	{ "define",           required_argument, NULL,     'D' },
@@ -152,10 +150,8 @@
 	time_t now = time(NULL);
 	char const *sourceDateEpoch = getenv("SOURCE_DATE_EPOCH");
 
-	/*
-	 * Support SOURCE_DATE_EPOCH for reproducible builds
-	 * https://reproducible-builds.org/docs/source-date-epoch/
-	 */
+	// Support SOURCE_DATE_EPOCH for reproducible builds
+	// https://reproducible-builds.org/docs/source-date-epoch/
 	if (sourceDateEpoch)
 		now = (time_t)strtoul(sourceDateEpoch, NULL, 0);
 
@@ -289,7 +285,7 @@
 			warnings = false;
 			break;
 
-		/* Long-only options */
+		// Long-only options
 		case 0:
 			switch (depType) {
 			case 'G':
@@ -321,10 +317,10 @@
 			}
 			break;
 
-		/* Unrecognized options */
+		// Unrecognized options
 		default:
 			print_usage();
-			/* NOTREACHED */
+			// NOTREACHED
 		}
 	}
 
@@ -376,7 +372,7 @@
 	if (failedOnMissingInclude)
 		return 0;
 
-	/* If no path specified, don't write file */
+	// If no path specified, don't write file
 	if (objectName != NULL)
 		out_WriteObject();
 	return 0;
--- a/src/asm/opt.c
+++ b/src/asm/opt.c
@@ -1,3 +1,11 @@
+/*
+ * This file is part of RGBDS.
+ *
+ * Copyright (c) 2022, RGBDS contributors.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
 #include <ctype.h>
 #include <errno.h>
 #include <stdbool.h>
--- a/src/asm/output.c
+++ b/src/asm/output.c
@@ -6,9 +6,7 @@
  * SPDX-License-Identifier: MIT
  */
 
-/*
- * Outputs an objectfile
- */
+// Outputs an objectfile
 
 #include <assert.h>
 #include <errno.h>
@@ -54,18 +52,16 @@
 
 struct Section *sectionList;
 
-/* Linked list of symbols to put in the object file */
+// Linked list of symbols to put in the object file
 static struct Symbol *objectSymbols = NULL;
 static struct Symbol **objectSymbolsTail = &objectSymbols;
-static uint32_t nbSymbols = 0; /* Length of the above list */
+static uint32_t nbSymbols = 0; // Length of the above list
 
 static struct Assertion *assertions = NULL;
 
 static struct FileStackNode *fileStackNodes = NULL;
 
-/*
- * Count the number of sections used in this object
- */
+// Count the number of sections used in this object
 static uint32_t countSections(void)
 {
 	uint32_t count = 0;
@@ -76,9 +72,7 @@
 	return count;
 }
 
-/*
- * Count the number of patches used in this object
- */
+// Count the number of patches used in this object
 static uint32_t countPatches(struct Section const *sect)
 {
 	uint32_t r = 0;
@@ -90,9 +84,7 @@
 	return r;
 }
 
-/**
- * Count the number of assertions used in this object
- */
+// Count the number of assertions used in this object
 static uint32_t countAsserts(void)
 {
 	struct Assertion *assert = assertions;
@@ -105,9 +97,7 @@
 	return count;
 }
 
-/*
- * Write a long to a file (little-endian)
- */
+// Write a long to a file (little-endian)
 static void putlong(uint32_t i, FILE *f)
 {
 	putc(i, f);
@@ -116,9 +106,7 @@
 	putc(i >> 24, f);
 }
 
-/*
- * Write a NULL-terminated string to a file
- */
+// Write a NULL-terminated string to a file
 static void putstring(char const *s, FILE *f)
 {
 	while (*s)
@@ -133,7 +121,7 @@
 
 void out_RegisterNode(struct FileStackNode *node)
 {
-	/* If node is not already registered, register it (and parents), and give it a unique ID */
+	// If node is not already registered, register it (and parents), and give it a unique ID
 	while (node->ID == (uint32_t)-1) {
 		node->ID = getNbFileStackNodes();
 		if (node->ID == (uint32_t)-1)
@@ -141,7 +129,7 @@
 		node->next = fileStackNodes;
 		fileStackNodes = node;
 
-		/* Also register the node's parents */
+		// Also register the node's parents
 		node = node->parent;
 		if (!node)
 			break;
@@ -156,25 +144,21 @@
 
 	struct FileStackNode **ptr = &fileStackNodes;
 
-	/*
-	 * The linked list is supposed to have decrementing IDs, so iterate with less memory reads,
-	 * to hopefully hit the cache less. A debug check is added after, in case a change is made
-	 * that breaks this assumption.
-	 */
+	// The linked list is supposed to have decrementing IDs, so iterate with less memory reads,
+	// to hopefully hit the cache less. A debug check is added after, in case a change is made
+	// that breaks this assumption.
 	for (uint32_t i = fileStackNodes->ID; i != node->ID; i--)
 		ptr = &(*ptr)->next;
 	assert((*ptr)->ID == node->ID);
 
 	node->next = (*ptr)->next;
-	assert(!node->next || node->next->ID == node->ID - 1); /* Catch inconsistencies early */
-	/* TODO: unreference the node */
+	assert(!node->next || node->next->ID == node->ID - 1); // Catch inconsistencies early
+	// TODO: unreference the node
 	*ptr = node;
 #endif
 }
 
-/*
- * Return a section's ID
- */
+// Return a section's ID
 static uint32_t getsectid(struct Section const *sect)
 {
 	struct Section const *sec = sectionList;
@@ -195,9 +179,7 @@
 	return sect ? getsectid(sect) : (uint32_t)-1;
 }
 
-/*
- * Write a patch to a file
- */
+// Write a patch to a file
 static void writepatch(struct Patch const *patch, FILE *f)
 {
 	assert(patch->src->ID != (uint32_t)-1);
@@ -211,9 +193,7 @@
 	fwrite(patch->rpn, 1, patch->rpnSize, f);
 }
 
-/*
- * Write a section to a file
- */
+// Write a section to a file
 static void writesection(struct Section const *sect, FILE *f)
 {
 	putstring(sect->name, f);
@@ -255,9 +235,7 @@
 	}
 }
 
-/*
- * Write a symbol to a file
- */
+// Write a symbol to a file
 static void writesymbol(struct Symbol const *sym, FILE *f)
 {
 	putstring(sym->name, f);
@@ -285,10 +263,8 @@
 	sym->ID = nbSymbols++;
 }
 
-/*
- * Returns a symbol's ID within the object file
- * If the symbol does not have one, one is assigned by registering the symbol
- */
+// Returns a symbol's ID within the object file
+// If the symbol does not have one, one is assigned by registering the symbol
 static uint32_t getSymbolID(struct Symbol *sym)
 {
 	if (sym->ID == (uint32_t)-1 && !sym_IsPC(sym))
@@ -392,10 +368,8 @@
 	}
 }
 
-/*
- * Allocate a new patch structure and link it into the list
- * WARNING: all patches are assumed to eventually be written, so the file stack node is registered
- */
+// Allocate a new patch structure and link it into the list
+// WARNING: all patches are assumed to eventually be written, so the file stack node is registered
 static struct Patch *allocpatch(uint32_t type, struct Expression const *expr, uint32_t ofs)
 {
 	struct Patch *patch = malloc(sizeof(struct Patch));
@@ -417,10 +391,10 @@
 	patch->pcSection = sect_GetSymbolSection();
 	patch->pcOffset = sect_GetSymbolOffset();
 
-	/* If the rpnSize's value is known, output a constant RPN rpnSize directly */
+	// If the rpnSize's value is known, output a constant RPN rpnSize directly
 	if (expr->isKnown) {
 		patch->rpnSize = rpnSize;
-		/* Make sure to update `rpnSize` above if modifying this! */
+		// Make sure to update `rpnSize` above if modifying this!
 		patch->rpn[0] = RPN_CONST;
 		patch->rpn[1] = (uint32_t)(expr->val) & 0xFF;
 		patch->rpn[2] = (uint32_t)(expr->val) >> 8;
@@ -435,9 +409,7 @@
 	return patch;
 }
 
-/*
- * Create a new patch (includes the rpn expr)
- */
+// Create a new patch (includes the rpn expr)
 void out_CreatePatch(uint32_t type, struct Expression const *expr, uint32_t ofs, uint32_t pcShift)
 {
 	struct Patch *patch = allocpatch(type, expr, ofs);
@@ -451,9 +423,7 @@
 	currentSection->patches = patch;
 }
 
-/**
- * Creates an assert that will be written to the object file
- */
+// Creates an assert that will be written to the object file
 bool out_CreateAssert(enum AssertionType type, struct Expression const *expr,
 		      char const *message, uint32_t ofs)
 {
@@ -499,7 +469,7 @@
 		struct FileStackReptNode const *reptNode = (struct FileStackReptNode const *)node;
 
 		putlong(reptNode->reptDepth, f);
-		/* Iters are stored by decreasing depth, so reverse the order for output */
+		// Iters are stored by decreasing depth, so reverse the order for output
 		for (uint32_t i = reptNode->reptDepth; i--; )
 			putlong(reptNode->iters[i], f);
 	}
@@ -515,9 +485,7 @@
 	}
 }
 
-/*
- * Write an objectfile
- */
+// Write an objectfile
 void out_WriteObject(void)
 {
 	FILE *f;
@@ -529,7 +497,7 @@
 	if (!f)
 		err("Couldn't write file '%s'", objectName);
 
-	/* Also write symbols that weren't written above */
+	// Also write symbols that weren't written above
 	sym_ForEach(registerUnregisteredSymbol, NULL);
 
 	fprintf(f, RGBDS_OBJECT_VERSION_STRING);
@@ -569,9 +537,7 @@
 	fclose(f);
 }
 
-/*
- * Set the objectfilename
- */
+// Set the objectfilename
 void out_SetFileName(char *s)
 {
 	objectName = s;
--- a/src/asm/parser.y
+++ b/src/asm/parser.y
@@ -36,7 +36,7 @@
 #include "linkdefs.h"
 #include "platform.h" // strncasecmp, strdup
 
-static struct CaptureBody captureBody; /* Captures a REPT/FOR or MACRO */
+static struct CaptureBody captureBody; // Captures a REPT/FOR or MACRO
 
 static void upperstring(char *dest, char const *src)
 {
@@ -104,7 +104,7 @@
 		case 1:
 			errorInvalidUTF8Byte(byte, "STRLEN");
 			state = 0;
-			/* fallthrough */
+			// fallthrough
 		case 0:
 			len++;
 			break;
@@ -111,7 +111,7 @@
 		}
 	}
 
-	/* Check for partial code point. */
+	// Check for partial code point.
 	if (state != 0)
 		error("STRLEN: Incomplete UTF-8 character\n");
 
@@ -127,13 +127,13 @@
 	uint32_t curLen = 0;
 	uint32_t curPos = 1;
 
-	/* Advance to starting position in source string. */
+	// Advance to starting position in source string.
 	while (src[srcIndex] && curPos < pos) {
 		switch (decode(&state, &codep, src[srcIndex])) {
 		case 1:
 			errorInvalidUTF8Byte(src[srcIndex], "STRSUB");
 			state = 0;
-			/* fallthrough */
+			// fallthrough
 		case 0:
 			curPos++;
 			break;
@@ -141,21 +141,19 @@
 		srcIndex++;
 	}
 
-	/*
-	 * A position 1 past the end of the string is allowed, but will trigger the
-	 * "Length too big" warning below if the length is nonzero.
-	 */
+	// A position 1 past the end of the string is allowed, but will trigger the
+	// "Length too big" warning below if the length is nonzero.
 	if (!src[srcIndex] && pos > curPos)
 		warning(WARNING_BUILTIN_ARG,
 			"STRSUB: Position %" PRIu32 " is past the end of the string\n", pos);
 
-	/* Copy from source to destination. */
+	// Copy from source to destination.
 	while (src[srcIndex] && destIndex < destLen - 1 && curLen < len) {
 		switch (decode(&state, &codep, src[srcIndex])) {
 		case 1:
 			errorInvalidUTF8Byte(src[srcIndex], "STRSUB");
 			state = 0;
-			/* fallthrough */
+			// fallthrough
 		case 0:
 			curLen++;
 			break;
@@ -166,7 +164,7 @@
 	if (curLen < len)
 		warning(WARNING_BUILTIN_ARG, "STRSUB: Length too big: %" PRIu32 "\n", len);
 
-	/* Check for partial code point. */
+	// Check for partial code point.
 	if (state != 0)
 		error("STRSUB: Incomplete UTF-8 character\n");
 
@@ -187,7 +185,7 @@
 {
 	size_t charLen = 1;
 
-	/* Advance to starting position in source string. */
+	// Advance to starting position in source string.
 	for (uint32_t curPos = 1; charLen && curPos < pos; curPos++)
 		charLen = charmap_ConvertNext(&src, NULL);
 
@@ -197,7 +195,7 @@
 		warning(WARNING_BUILTIN_ARG,
 			"CHARSUB: Position %" PRIu32 " is past the end of the string\n", pos);
 
-	/* Copy from source to destination. */
+	// Copy from source to destination.
 	memcpy(dest, start, src - start);
 
 	dest[src - start] = '\0';
@@ -205,10 +203,8 @@
 
 static uint32_t adjustNegativePos(int32_t pos, size_t len, char const *functionName)
 {
-	/*
-	 * STRSUB and CHARSUB adjust negative `pos` arguments the same way,
-	 * such that position -1 is the last character of a string.
-	 */
+	// STRSUB and CHARSUB adjust negative `pos` arguments the same way,
+	// such that position -1 is the last character of a string.
 	if (pos < 0)
 		pos += len + 1;
 	if (pos < 1) {
@@ -545,7 +541,7 @@
 %left	T_OP_SHL T_OP_SHR T_OP_USHR
 %left	T_OP_MUL T_OP_DIV T_OP_MOD
 
-%precedence	NEG /* negation -- unary minus */
+%precedence	NEG // negation -- unary minus
 
 %token	T_OP_EXP "**"
 %left	T_OP_EXP
@@ -588,7 +584,6 @@
 %type	<symName> scoped_id
 %type	<symName> scoped_anon_id
 %token	T_POP_EQU "EQU"
-%token	T_POP_SET "SET"
 %token	T_POP_EQUAL "="
 %token	T_POP_EQUS "EQUS"
 
@@ -642,7 +637,7 @@
 %type	<forArgs> for_args
 
 %token	T_Z80_ADC "adc" T_Z80_ADD "add" T_Z80_AND "and"
-%token	T_Z80_BIT "bit" // There is no T_Z80_SET, only T_POP_SET
+%token	T_Z80_BIT "bit"
 %token	T_Z80_CALL "call" T_Z80_CCF "ccf" T_Z80_CP "cp" T_Z80_CPL "cpl"
 %token	T_Z80_DAA "daa" T_Z80_DEC "dec" T_Z80_DI "di"
 %token	T_Z80_EI "ei"
@@ -659,7 +654,7 @@
 %token	T_Z80_RES "res" T_Z80_RET "ret" T_Z80_RETI "reti" T_Z80_RST "rst"
 %token	T_Z80_RL "rl" T_Z80_RLA "rla" T_Z80_RLC "rlc" T_Z80_RLCA "rlca"
 %token	T_Z80_RR "rr" T_Z80_RRA "rra" T_Z80_RRC "rrc" T_Z80_RRCA "rrca"
-%token	T_Z80_SBC "sbc" T_Z80_SCF "scf" T_Z80_STOP "stop"
+%token	T_Z80_SBC "sbc" T_Z80_SCF "scf" T_Z80_SET "set" T_Z80_STOP "stop"
 %token	T_Z80_SLA "sla" T_Z80_SRA "sra" T_Z80_SRL "srl" T_Z80_SUB "sub"
 %token	T_Z80_SWAP "swap"
 %token	T_Z80_XOR "xor"
@@ -707,8 +702,8 @@
 ;
 
 line		: plain_directive endofline
-		| line_directive /* Directives that manage newlines themselves */
-		/* Continue parsing the next line on a syntax error */
+		| line_directive // Directives that manage newlines themselves
+		// Continue parsing the next line on a syntax error
 		| error {
 			lexer_SetMode(LEXER_NORMAL);
 			lexer_ToggleStringExpansion(true);
@@ -716,7 +711,7 @@
 			fstk_StopRept();
 			yyerrok;
 		}
-		/* Hint about unindented macros parsed as labels */
+		// Hint about unindented macros parsed as labels
 		| T_LABEL error {
 			lexer_SetMode(LEXER_NORMAL);
 			lexer_ToggleStringExpansion(true);
@@ -731,12 +726,10 @@
 		}
 ;
 
-/*
- * For "logistical" reasons, these directives must manage newlines themselves.
- * This is because we need to switch the lexer's mode *after* the newline has been read,
- * and to avoid causing some grammar conflicts (token reducing is finicky).
- * This is DEFINITELY one of the more FRAGILE parts of the codebase, handle with care.
- */
+// For "logistical" reasons, these directives must manage newlines themselves.
+// This is because we need to switch the lexer's mode *after* the newline has been read,
+// and to avoid causing some grammar conflicts (token reducing is finicky).
+// This is DEFINITELY one of the more FRAGILE parts of the codebase, handle with care.
 line_directive	: macrodef
 		| rept
 		| for
@@ -743,7 +736,7 @@
 		| break
 		| include
 		| if
-		/* It's important that all of these require being at line start for `skipIfBlock` */
+		// It's important that all of these require being at line start for `skipIfBlock`
 		| elif
 		| else
 ;
@@ -854,7 +847,7 @@
 		}
 ;
 
-/* These commands start with a T_LABEL. */
+// These commands start with a T_LABEL.
 assignment_directive	: equ
 		| assignment
 		| rb
@@ -1300,7 +1293,7 @@
 			sect_RelByte(&$1, 0);
 		}
 		| string {
-			uint8_t *output = malloc(strlen($1)); /* Cannot be larger than that */
+			uint8_t *output = malloc(strlen($1)); // Cannot be larger than that
 			size_t length = charmap_Convert($1, output);
 
 			sect_AbsByteGroup(output, length);
@@ -1316,7 +1309,7 @@
 			sect_RelWord(&$1, 0);
 		}
 		| string {
-			uint8_t *output = malloc(strlen($1)); /* Cannot be larger than that */
+			uint8_t *output = malloc(strlen($1)); // Cannot be larger than that
 			size_t length = charmap_Convert($1, output);
 
 			sect_AbsWordGroup(output, length);
@@ -1681,7 +1674,7 @@
 			$$.alignOfs = $7;
 		}
 		| sectattrs T_COMMA T_OP_BANK T_LBRACK uconst T_RBRACK {
-			/* We cannot check the validity of this now */
+			// We cannot check the validity of this now
 			$$.bank = $5;
 		}
 ;
@@ -1998,10 +1991,8 @@
 			sect_AbsByte(0x01 | (REG_DE << 4));
 			sect_RelWord(&$4, 1);
 		}
-		/*
-		 * HL is taken care of in z80_ld_hl
-		 * SP is taken care of in z80_ld_sp
-		 */
+		// HL is taken care of in z80_ld_hl
+		// SP is taken care of in z80_ld_sp
 ;
 
 z80_nop		: T_Z80_NOP { sect_AbsByte(0x00); }
@@ -2089,7 +2080,7 @@
 z80_scf		: T_Z80_SCF { sect_AbsByte(0x37); }
 ;
 
-z80_set		: T_POP_SET const_3bit T_COMMA reg_r {
+z80_set		: T_Z80_SET const_3bit T_COMMA reg_r {
 			sect_AbsByte(0xCB);
 			sect_AbsByte(0xC0 | ($2 << 3) | $4);
 		}
--- a/src/asm/rpn.c
+++ b/src/asm/rpn.c
@@ -6,9 +6,7 @@
  * SPDX-License-Identifier: MIT
  */
 
-/*
- * Controls RPN expressions for objectfiles
- */
+// Controls RPN expressions for objectfiles
 
 #include <assert.h>
 #include <errno.h>
@@ -28,7 +26,7 @@
 
 #include "opmath.h"
 
-/* Makes an expression "not known", also setting its error message */
+// Makes an expression "not known", also setting its error message
 #define makeUnknown(expr_, ...) do { \
 	struct Expression *_expr = expr_; \
 	_expr->isKnown = false; \
@@ -47,17 +45,15 @@
 
 static uint8_t *reserveSpace(struct Expression *expr, uint32_t size)
 {
-	/* This assumes the RPN length is always less than the capacity */
+	// This assumes the RPN length is always less than the capacity
 	if (expr->rpnCapacity - expr->rpnLength < size) {
-		/* If there isn't enough room to reserve the space, realloc */
+		// If there isn't enough room to reserve the space, realloc
 		if (!expr->rpn)
-			expr->rpnCapacity = 256; /* Initial size */
+			expr->rpnCapacity = 256; // Initial size
 		while (expr->rpnCapacity - expr->rpnLength < size) {
 			if (expr->rpnCapacity >= MAXRPNLEN)
-				/*
-				 * To avoid generating humongous object files, cap the
-				 * size of RPN expressions
-				 */
+				// To avoid generating humongous object files, cap the
+				// size of RPN expressions
 				fatalerror("RPN expression cannot grow larger than "
 					   EXPAND_AND_STR(MAXRPNLEN) " bytes\n");
 			else if (expr->rpnCapacity > MAXRPNLEN / 2)
@@ -77,9 +73,7 @@
 	return ptr;
 }
 
-/*
- * Init a RPN expression
- */
+// Init a RPN expression
 static void rpn_Init(struct Expression *expr)
 {
 	expr->reason = NULL;
@@ -91,9 +85,7 @@
 	expr->rpnPatchSize = 0;
 }
 
-/*
- * Free the RPN expression
- */
+// Free the RPN expression
 void rpn_Free(struct Expression *expr)
 {
 	free(expr->rpn);
@@ -101,9 +93,7 @@
 	rpn_Init(expr);
 }
 
-/*
- * Add symbols, constants and operators to expression
- */
+// Add symbols, constants and operators to expression
 void rpn_Number(struct Expression *expr, uint32_t i)
 {
 	rpn_Init(expr);
@@ -124,9 +114,9 @@
 		makeUnknown(expr, sym_IsPC(sym) ? "PC is not constant at assembly time"
 						: "'%s' is not constant at assembly time", symName);
 		sym = sym_Ref(symName);
-		expr->rpnPatchSize += 5; /* 1-byte opcode + 4-byte symbol ID */
+		expr->rpnPatchSize += 5; // 1-byte opcode + 4-byte symbol ID
 
-		size_t nameLen = strlen(sym->name) + 1; /* Don't forget NUL! */
+		size_t nameLen = strlen(sym->name) + 1; // Don't forget NUL!
 		uint8_t *ptr = reserveSpace(expr, nameLen + 1);
 		*ptr++ = RPN_SYM;
 		memcpy(ptr, sym->name, nameLen);
@@ -155,7 +145,7 @@
 {
 	struct Symbol const *sym = sym_FindScopedSymbol(symName);
 
-	/* The @ symbol is treated differently. */
+	// The @ symbol is treated differently.
 	if (sym_IsPC(sym)) {
 		rpn_BankSelf(expr);
 		return;
@@ -169,13 +159,13 @@
 		assert(sym); // If the symbol didn't exist, it should have been created
 
 		if (sym_GetSection(sym) && sym_GetSection(sym)->bank != (uint32_t)-1) {
-			/* Symbol's section is known and bank is fixed */
+			// Symbol's section is known and bank is fixed
 			expr->val = sym_GetSection(sym)->bank;
 		} else {
 			makeUnknown(expr, "\"%s\"'s bank is not known", symName);
-			expr->rpnPatchSize += 5; /* opcode + 4-byte sect ID */
+			expr->rpnPatchSize += 5; // opcode + 4-byte sect ID
 
-			size_t nameLen = strlen(sym->name) + 1; /* Room for NUL! */
+			size_t nameLen = strlen(sym->name) + 1; // Room for NUL!
 			uint8_t *ptr = reserveSpace(expr, nameLen + 1);
 			*ptr++ = RPN_BANK_SYM;
 			memcpy(ptr, sym->name, nameLen);
@@ -194,7 +184,7 @@
 	} else {
 		makeUnknown(expr, "Section \"%s\"'s bank is not known", sectionName);
 
-		size_t nameLen = strlen(sectionName) + 1; /* Room for NUL! */
+		size_t nameLen = strlen(sectionName) + 1; // Room for NUL!
 		uint8_t *ptr = reserveSpace(expr, nameLen + 1);
 
 		expr->rpnPatchSize += nameLen + 1;
@@ -214,7 +204,7 @@
 	} else {
 		makeUnknown(expr, "Section \"%s\"'s size is not known", sectionName);
 
-		size_t nameLen = strlen(sectionName) + 1; /* Room for NUL! */
+		size_t nameLen = strlen(sectionName) + 1; // Room for NUL!
 		uint8_t *ptr = reserveSpace(expr, nameLen + 1);
 
 		expr->rpnPatchSize += nameLen + 1;
@@ -234,7 +224,7 @@
 	} else {
 		makeUnknown(expr, "Section \"%s\"'s start is not known", sectionName);
 
-		size_t nameLen = strlen(sectionName) + 1; /* Room for NUL! */
+		size_t nameLen = strlen(sectionName) + 1; // Room for NUL!
 		uint8_t *ptr = reserveSpace(expr, nameLen + 1);
 
 		expr->rpnPatchSize += nameLen + 1;
@@ -252,7 +242,7 @@
 		expr->rpnPatchSize++;
 		*reserveSpace(expr, 1) = RPN_HRAM;
 	} else if (expr->val >= 0xFF00 && expr->val <= 0xFFFF) {
-		/* That range is valid, but only keep the lower byte */
+		// That range is valid, but only keep the lower byte
 		expr->val &= 0xFF;
 	} else if (expr->val < 0 || expr->val > 0xFF) {
 		error("Source address $%" PRIx32 " not between $FF00 to $FFFF\n", expr->val);
@@ -264,10 +254,10 @@
 	*expr = *src;
 
 	if (rpn_isKnown(expr)) {
-		/* A valid RST address must be masked with 0x38 */
+		// A valid RST address must be masked with 0x38
 		if (expr->val & ~0x38)
 			error("Invalid address $%" PRIx32 " for RST\n", expr->val);
-		/* The target is in the "0x38" bits, all other bits are set */
+		// The target is in the "0x38" bits, all other bits are set
 		expr->val |= 0xC7;
 	} else {
 		expr->rpnPatchSize++;
@@ -275,9 +265,7 @@
 	}
 }
 
-/*
- * Checks that an RPN expression's value fits within N bits (signed or unsigned)
- */
+// Checks that an RPN expression's value fits within N bits (signed or unsigned)
 void rpn_CheckNBit(struct Expression const *expr, uint8_t n)
 {
 	assert(n != 0); // That doesn't make sense
@@ -324,7 +312,7 @@
 
 bool rpn_IsDiffConstant(struct Expression const *src, struct Symbol const *sym)
 {
-	/* Check if both expressions only refer to a single symbol */
+	// Check if both expressions only refer to a single symbol
 	struct Symbol const *sym1 = rpn_SymbolOf(src);
 
 	if (!sym1 || !sym || sym1->type != SYM_LABEL || sym->type != SYM_LABEL)
@@ -341,7 +329,7 @@
 	return rpn_IsDiffConstant(src1, rpn_SymbolOf(src2));
 }
 
-/**
+/*
  * Attempts to compute a constant binary AND from non-constant operands
  * This is possible if one operand is a symbol belonging to an `ALIGN[N]` section, and the other is
  * a constant that only keeps (some of) the lower N bits.
@@ -387,12 +375,12 @@
 	expr->isSymbol = false;
 	int32_t constMaskVal;
 
-	/* First, check if the expression is known */
+	// First, check if the expression is known
 	expr->isKnown = src1->isKnown && src2->isKnown;
 	if (expr->isKnown) {
-		rpn_Init(expr); /* Init the expression to something sane */
+		rpn_Init(expr); // Init the expression to something sane
 
-		/* If both expressions are known, just compute the value */
+		// If both expressions are known, just compute the value
 		uint32_t uleft = src1->val, uright = src2->val;
 
 		switch (op) {
@@ -537,9 +525,9 @@
 		expr->val = constMaskVal;
 		expr->isKnown = true;
 	} else {
-		/* If it's not known, start computing the RPN expression */
+		// If it's not known, start computing the RPN expression
 
-		/* Convert the left-hand expression if it's constant */
+		// Convert the left-hand expression if it's constant
 		if (src1->isKnown) {
 			uint32_t lval = src1->val;
 			uint8_t bytes[] = {RPN_CONST, lval, lval >> 8,
@@ -551,11 +539,11 @@
 			memcpy(reserveSpace(expr, sizeof(bytes)), bytes,
 			       sizeof(bytes));
 
-			/* Use the other expression's un-const reason */
+			// Use the other expression's un-const reason
 			expr->reason = src2->reason;
 			free(src1->reason);
 		} else {
-			/* Otherwise just reuse its RPN buffer */
+			// Otherwise just reuse its RPN buffer
 			expr->rpnPatchSize = src1->rpnPatchSize;
 			expr->rpn = src1->rpn;
 			expr->rpnCapacity = src1->rpnCapacity;
@@ -564,12 +552,12 @@
 			free(src2->reason);
 		}
 
-		/* Now, merge the right expression into the left one */
-		uint8_t *ptr = src2->rpn; /* Pointer to the right RPN */
-		uint32_t len = src2->rpnLength; /* Size of the right RPN */
+		// Now, merge the right expression into the left one
+		uint8_t *ptr = src2->rpn; // Pointer to the right RPN
+		uint32_t len = src2->rpnLength; // Size of the right RPN
 		uint32_t patchSize = src2->rpnPatchSize;
 
-		/* If the right expression is constant, merge a shim instead */
+		// If the right expression is constant, merge a shim instead
 		uint32_t rval = src2->val;
 		uint8_t bytes[] = {RPN_CONST, rval, rval >> 8, rval >> 16,
 				   rval >> 24};
@@ -578,13 +566,13 @@
 			len = sizeof(bytes);
 			patchSize = sizeof(bytes);
 		}
-		/* Copy the right RPN and append the operator */
+		// Copy the right RPN and append the operator
 		uint8_t *buf = reserveSpace(expr, len + 1);
 
 		memcpy(buf, ptr, len);
 		buf[len] = op;
 
-		free(src2->rpn); /* If there was none, this is `free(NULL)` */
+		free(src2->rpn); // If there was none, this is `free(NULL)`
 		expr->rpnPatchSize += patchSize + 1;
 	}
 }
--- a/src/asm/section.c
+++ b/src/asm/section.c
@@ -1,3 +1,10 @@
+/*
+ * This file is part of RGBDS.
+ *
+ * Copyright (c) 2022, RGBDS contributors.
+ *
+ * SPDX-License-Identifier: MIT
+ */
 
 #include <assert.h>
 #include <errno.h>
@@ -30,7 +37,7 @@
 struct SectionStackEntry {
 	struct Section *section;
 	struct Section *loadSection;
-	char const *scope; /* Section's symbol scope */
+	char const *scope; // Section's symbol scope
 	uint32_t offset;
 	int32_t loadOffset;
 	struct UnionStackEntry *unionStack;
@@ -38,14 +45,12 @@
 };
 
 struct SectionStackEntry *sectionStack;
-uint32_t curOffset; /* Offset into the current section (see sect_GetSymbolOffset) */
+uint32_t curOffset; // Offset into the current section (see sect_GetSymbolOffset)
 struct Section *currentSection = NULL;
 static struct Section *currentLoadSection = NULL;
-int32_t loadOffset; /* Offset into the LOAD section's parent (see sect_GetOutputOffset) */
+int32_t loadOffset; // Offset into the LOAD section's parent (see sect_GetOutputOffset)
 
-/*
- * A quick check to see if we have an initialized section
- */
+// A quick check to see if we have an initialized section
 attr_(warn_unused_result) static bool checksection(void)
 {
 	if (currentSection)
@@ -55,10 +60,8 @@
 	return false;
 }
 
-/*
- * A quick check to see if we have an initialized section that can contain
- * this much initialized data
- */
+// A quick check to see if we have an initialized section that can contain
+// this much initialized data
 attr_(warn_unused_result) static bool checkcodesection(void)
 {
 	if (!checksection())
@@ -85,17 +88,13 @@
 	return false;
 }
 
-/*
- * Check if the section has grown too much.
- */
+// Check if the section has grown too much.
 attr_(warn_unused_result) static bool reserveSpace(uint32_t delta_size)
 {
-	/*
-	 * This check is here to trap broken code that generates sections that are too big and to
-	 * prevent the assembler from generating huge object files or trying to allocate too much
-	 * memory.
-	 * A check at the linking stage is still necessary.
-	 */
+	// This check is here to trap broken code that generates sections that are too big and to
+	// prevent the assembler from generating huge object files or trying to allocate too much
+	// memory.
+	// A check at the linking stage is still necessary.
 
 	// If the section has already overflowed, skip the check to avoid erroring out ad nauseam
 	if (currentSection->size != UINT32_MAX
@@ -133,15 +132,13 @@
 	assert(alignment < 16); // Should be ensured by the caller
 	unsigned int nbSectErrors = 0;
 
-	/*
-	 * Unionized sections only need "compatible" constraints, and they end up with the strictest
-	 * combination of both.
-	 */
+	// Unionized sections only need "compatible" constraints, and they end up with the strictest
+	// combination of both.
 	if (sect_HasData(type))
 		fail("Cannot declare ROM sections as UNION\n");
 
 	if (org != (uint32_t)-1) {
-		/* If both are fixed, they must be the same */
+		// If both are fixed, they must be the same
 		if (sect->org != (uint32_t)-1 && sect->org != org)
 			fail("Section already declared as fixed at different address $%04"
 			     PRIx32 "\n", sect->org);
@@ -149,16 +146,16 @@
 			fail("Section already declared as aligned to %u bytes (offset %"
 				   PRIu16 ")\n", 1U << sect->align, sect->alignOfs);
 		else
-			/* Otherwise, just override */
+			// Otherwise, just override
 			sect->org = org;
 
 	} else if (alignment != 0) {
-		/* Make sure any fixed address given is compatible */
+		// Make sure any fixed address given is compatible
 		if (sect->org != (uint32_t)-1) {
 			if ((sect->org - alignOffset) & mask(alignment))
 				fail("Section already declared as fixed at incompatible address $%04"
 				     PRIx32 "\n", sect->org);
-		/* Check if alignment offsets are compatible */
+		// Check if alignment offsets are compatible
 		} else if ((alignOffset & mask(sect->align))
 			   != (sect->alignOfs & mask(alignment))) {
 			fail("Section already declared with incompatible %u"
@@ -181,15 +178,13 @@
 	assert(alignment < 16); // Should be ensured by the caller
 	unsigned int nbSectErrors = 0;
 
-	/*
-	 * Fragments only need "compatible" constraints, and they end up with the strictest
-	 * combination of both.
-	 * The merging is however performed at the *end* of the original section!
-	 */
+	// Fragments only need "compatible" constraints, and they end up with the strictest
+	// combination of both.
+	// The merging is however performed at the *end* of the original section!
 	if (org != (uint32_t)-1) {
 		uint16_t curOrg = org - sect->size;
 
-		/* If both are fixed, they must be the same */
+		// If both are fixed, they must be the same
 		if (sect->org != (uint32_t)-1 && sect->org != curOrg)
 			fail("Section already declared as fixed at incompatible address $%04"
 			     PRIx32 " (cur addr = %04" PRIx32 ")\n",
@@ -198,7 +193,7 @@
 			fail("Section already declared as aligned to %u bytes (offset %"
 			     PRIu16 ")\n", 1U << sect->align, sect->alignOfs);
 		else
-			/* Otherwise, just override */
+			// Otherwise, just override
 			sect->org = curOrg;
 
 	} else if (alignment != 0) {
@@ -207,12 +202,12 @@
 		if (curOfs < 0)
 			curOfs += 1U << alignment;
 
-		/* Make sure any fixed address given is compatible */
+		// Make sure any fixed address given is compatible
 		if (sect->org != (uint32_t)-1) {
 			if ((sect->org - curOfs) & mask(alignment))
 				fail("Section already declared as fixed at incompatible address $%04"
 				     PRIx32 "\n", sect->org);
-		/* Check if alignment offsets are compatible */
+		// Check if alignment offsets are compatible
 		} else if ((curOfs & mask(sect->align)) != (sect->alignOfs & mask(alignment))) {
 			fail("Section already declared with incompatible %u"
 			     "-byte alignment (offset %" PRIu16 ")\n",
@@ -246,10 +241,10 @@
 
 			// Common checks
 
-			/* If the section's bank is unspecified, override it */
+			// If the section's bank is unspecified, override it
 			if (sect->bank == (uint32_t)-1)
 				sect->bank = bank;
-			/* If both specify a bank, it must be the same one */
+			// If both specify a bank, it must be the same one
 			else if (bank != (uint32_t)-1 && sect->bank != bank)
 				fail("Section already declared with different bank %" PRIu32 "\n",
 				     sect->bank);
@@ -270,9 +265,7 @@
 
 #undef fail
 
-/*
- * Create a new section, not yet in the list.
- */
+// Create a new section, not yet in the list.
 static struct Section *createSection(char const *name, enum SectionType type,
 				     uint32_t org, uint32_t bank, uint8_t alignment,
 				     uint16_t alignOffset, enum SectionModifier mod)
@@ -298,7 +291,7 @@
 	sect->next = NULL;
 	sect->patches = NULL;
 
-	/* It is only needed to allocate memory for ROM sections. */
+	// It is only needed to allocate memory for ROM sections.
 	if (sect_HasData(type)) {
 		sect->data = malloc(sectionTypeInfo[type].size);
 		if (sect->data == NULL)
@@ -310,9 +303,7 @@
 	return sect;
 }
 
-/*
- * Find a section by name and type. If it doesn't exist, create it.
- */
+// Find a section by name and type. If it doesn't exist, create it.
 static struct Section *getSection(char const *name, enum SectionType type, uint32_t org,
 				  struct SectionSpec const *attrs, enum SectionModifier mod)
 {
@@ -353,7 +344,7 @@
 			error("Alignment must be between 0 and 16, not %u\n", alignment);
 			alignment = 16;
 		}
-		/* It doesn't make sense to have both alignment and org set */
+		// It doesn't make sense to have both alignment and org set
 		uint32_t mask = mask(alignment);
 
 		if (org != (uint32_t)-1) {
@@ -360,11 +351,11 @@
 			if ((org - alignOffset) & mask)
 				error("Section \"%s\"'s fixed address doesn't match its alignment\n",
 					name);
-			alignment = 0; /* Ignore it if it's satisfied */
+			alignment = 0; // Ignore it if it's satisfied
 		} else if (sectionTypeInfo[type].startAddr & mask) {
 			error("Section \"%s\"'s alignment cannot be attained in %s\n",
 				name, sectionTypeInfo[type].name);
-			alignment = 0; /* Ignore it if it's unattainable */
+			alignment = 0; // Ignore it if it's unattainable
 			org = 0;
 		} else if (alignment == 16) {
 			// Treat an alignment of 16 as being fixed at address 0
@@ -390,9 +381,7 @@
 	return sect;
 }
 
-/*
- * Set the current section
- */
+// Set the current section
 static void changeSection(void)
 {
 	if (unionStack)
@@ -401,9 +390,7 @@
 	sym_SetCurrentSymbolScope(NULL);
 }
 
-/*
- * Set the current section by name and type
- */
+// Set the current section by name and type
 void sect_NewSection(char const *name, uint32_t type, uint32_t org,
 		     struct SectionSpec const *attribs, enum SectionModifier mod)
 {
@@ -423,9 +410,7 @@
 	currentSection = sect;
 }
 
-/*
- * Set the current section by name and type
- */
+// Set the current section by name and type
 void sect_SetLoadSection(char const *name, uint32_t type, uint32_t org,
 			 struct SectionSpec const *attribs, enum SectionModifier mod)
 {
@@ -478,9 +463,7 @@
 	return currentLoadSection ? currentLoadSection : currentSection;
 }
 
-/*
- * The offset into the section above
- */
+// The offset into the section above
 uint32_t sect_GetSymbolOffset(void)
 {
 	return curOffset;
@@ -615,9 +598,7 @@
 		error("Unterminated UNION construct!\n");
 }
 
-/*
- * Output an absolute byte
- */
+// Output an absolute byte
 void sect_AbsByte(uint8_t b)
 {
 	if (!checkcodesection())
@@ -661,9 +642,7 @@
 		writelong(*s++);
 }
 
-/*
- * Skip this many bytes
- */
+// Skip this many bytes
 void sect_Skip(uint32_t skip, bool ds)
 {
 	if (!checksection())
@@ -683,9 +662,7 @@
 	}
 }
 
-/*
- * Output a NULL terminated string (excluding the NULL-character)
- */
+// Output a NULL terminated string (excluding the NULL-character)
 void sect_String(char const *s)
 {
 	if (!checkcodesection())
@@ -697,10 +674,8 @@
 		writebyte(*s++);
 }
 
-/*
- * Output a relocatable byte. Checking will be done to see if it
- * is an absolute value in disguise.
- */
+// Output a relocatable byte. Checking will be done to see if it
+// is an absolute value in disguise.
 void sect_RelByte(struct Expression *expr, uint32_t pcShift)
 {
 	if (!checkcodesection())
@@ -717,10 +692,8 @@
 	rpn_Free(expr);
 }
 
-/*
- * Output several copies of a relocatable byte. Checking will be done to see if
- * it is an absolute value in disguise.
- */
+// Output several copies of a relocatable byte. Checking will be done to see if
+// it is an absolute value in disguise.
 void sect_RelBytes(uint32_t n, struct Expression *exprs, size_t size)
 {
 	if (!checkcodesection())
@@ -743,10 +716,8 @@
 		rpn_Free(&exprs[i]);
 }
 
-/*
- * Output a relocatable word. Checking will be done to see if
- * it's an absolute value in disguise.
- */
+// Output a relocatable word. Checking will be done to see if
+// it's an absolute value in disguise.
 void sect_RelWord(struct Expression *expr, uint32_t pcShift)
 {
 	if (!checkcodesection())
@@ -763,10 +734,8 @@
 	rpn_Free(expr);
 }
 
-/*
- * Output a relocatable longword. Checking will be done to see if
- * is an absolute value in disguise.
- */
+// Output a relocatable longword. Checking will be done to see if
+// is an absolute value in disguise.
 void sect_RelLong(struct Expression *expr, uint32_t pcShift)
 {
 	if (!checkcodesection())
@@ -783,10 +752,8 @@
 	rpn_Free(expr);
 }
 
-/*
- * Output a PC-relative relocatable byte. Checking will be done to see if it
- * is an absolute value in disguise.
- */
+// Output a PC-relative relocatable byte. Checking will be done to see if it
+// is an absolute value in disguise.
 void sect_PCRelByte(struct Expression *expr, uint32_t pcShift)
 {
 	if (!checkcodesection())
@@ -800,12 +767,12 @@
 		writebyte(0);
 	} else {
 		struct Symbol const *sym = rpn_SymbolOf(expr);
-		/* The offset wraps (jump from ROM to HRAM, for example) */
+		// The offset wraps (jump from ROM to HRAM, for example)
 		int16_t offset;
 
-		/* Offset is relative to the byte *after* the operand */
+		// Offset is relative to the byte *after* the operand
 		if (sym == pc)
-			offset = -2; /* PC as operand to `jr` is lower than reference PC by 2 */
+			offset = -2; // PC as operand to `jr` is lower than reference PC by 2
 		else
 			offset = sym_GetValue(sym) - (sym_GetValue(pc) + 1);
 
@@ -820,9 +787,7 @@
 	rpn_Free(expr);
 }
 
-/*
- * Output a binary file
- */
+// Output a binary file
 void sect_BinaryFile(char const *s, int32_t startPos)
 {
 	if (startPos < 0) {
@@ -869,7 +834,7 @@
 		if (errno != ESPIPE)
 			error("Error determining size of INCBIN file '%s': %s\n",
 			      s, strerror(errno));
-		/* The file isn't seekable, so we'll just skip bytes */
+		// The file isn't seekable, so we'll just skip bytes
 		while (startPos--)
 			(void)fgetc(f);
 	}
@@ -901,7 +866,7 @@
 
 	if (!checkcodesection())
 		return;
-	if (length == 0) /* Don't even bother with 0-byte slices */
+	if (length == 0) // Don't even bother with 0-byte slices
 		return;
 	if (!reserveSpace(length))
 		return;
@@ -946,7 +911,7 @@
 		if (errno != ESPIPE)
 			error("Error determining size of INCBIN file '%s': %s\n",
 				s, strerror(errno));
-		/* The file isn't seekable, so we'll just skip bytes */
+		// The file isn't seekable, so we'll just skip bytes
 		while (start_pos--)
 			(void)fgetc(f);
 	}
@@ -968,9 +933,7 @@
 	fclose(f);
 }
 
-/*
- * Section stack routines
- */
+// Section stack routines
 void sect_PushSection(void)
 {
 	struct SectionStackEntry *entry = malloc(sizeof(*entry));
--- a/src/asm/symbol.c
+++ b/src/asm/symbol.c
@@ -6,9 +6,7 @@
  * SPDX-License-Identifier: MIT
  */
 
-/*
- * Symboltable and macroargs stuff
- */
+// Symboltable and macroargs stuff
 
 #include <assert.h>
 #include <errno.h>
@@ -36,7 +34,7 @@
 
 HashMap symbols;
 
-static char const *labelScope; /* Current section's label scope */
+static const char *labelScope; // Current section's label scope
 static struct Symbol *PCSymbol;
 static char savedTIME[256];
 static char savedDATE[256];
@@ -85,11 +83,9 @@
 
 static char const *Callback__FILE__(void)
 {
-	/*
-	 * FIXME: this is dangerous, and here's why this is CURRENTLY okay. It's still bad, fix it.
-	 * There are only two call sites for this; one copies the contents directly, the other is
-	 * EQUS expansions, which cannot straddle file boundaries. So this should be fine.
-	 */
+	// FIXME: this is dangerous, and here's why this is CURRENTLY okay. It's still bad, fix it.
+	// There are only two call sites for this; one copies the contents directly, the other is
+	// EQUS expansions, which cannot straddle file boundaries. So this should be fine.
 	static char *buf = NULL;
 	static size_t bufsize = 0;
 	char const *fileName = fstk_GetFileName();
@@ -96,13 +92,13 @@
 	size_t j = 1;
 
 	assert(fileName[0]);
-	/* The assertion above ensures the loop runs at least once */
+	// The assertion above ensures the loop runs at least once
 	for (size_t i = 0; fileName[i]; i++, j++) {
-		/* Account for the extra backslash inserted below */
+		// Account for the extra backslash inserted below
 		if (fileName[i] == '"')
 			j++;
-		/* Ensure there will be enough room; DO NOT PRINT ANYTHING ABOVE THIS!! */
-		if (j + 2 >= bufsize) { /* Always keep room for 2 tail chars */
+		// Ensure there will be enough room; DO NOT PRINT ANYTHING ABOVE THIS!!
+		if (j + 2 >= bufsize) { // Always keep room for 2 tail chars
 			bufsize = bufsize ? bufsize * 2 : 64;
 			buf = realloc(buf, bufsize);
 			if (!buf)
@@ -109,12 +105,12 @@
 				fatalerror("Failed to grow buffer for file name: %s\n",
 					   strerror(errno));
 		}
-		/* Escape quotes, since we're returning a string */
+		// Escape quotes, since we're returning a string
 		if (fileName[i] == '"')
 			buf[j - 1] = '\\';
 		buf[j] = fileName[i];
 	}
-	/* Write everything after the loop, to ensure the buffer has been allocated */
+	// Write everything after the loop, to ensure the buffer has been allocated
 	buf[0] = '"';
 	buf[j++] = '"';
 	buf[j] = '\0';
@@ -128,9 +124,7 @@
 	return section ? section->org + sect_GetSymbolOffset() : 0;
 }
 
-/*
- * Get the value field of a symbol
- */
+// Get the value field of a symbol
 int32_t sym_GetValue(struct Symbol const *sym)
 {
 	if (sym_IsNumeric(sym) && sym->hasCallback)
@@ -137,7 +131,7 @@
 		return sym->numCallback();
 
 	if (sym->type == SYM_LABEL)
-		/* TODO: do not use section's org directly */
+		// TODO: do not use section's org directly
 		return sym->value + sym_GetSection(sym)->org;
 
 	return sym->value;
@@ -153,9 +147,7 @@
 		fputs("<builtin>", stderr);
 }
 
-/*
- * Set a symbol's definition filename and line
- */
+// Set a symbol's definition filename and line
 static void setSymbolFilename(struct Symbol *sym)
 {
 	sym->src = fstk_GetFileStack();
@@ -162,23 +154,19 @@
 	sym->fileLine = sym->src ? lexer_GetLineNo() : 0; // This is (NULL, 1) for built-ins
 }
 
-/*
- * Update a symbol's definition filename and line
- */
+// Update a symbol's definition filename and line
 static void updateSymbolFilename(struct Symbol *sym)
 {
 	struct FileStackNode *oldSrc = sym->src;
 
 	setSymbolFilename(sym);
-	/* If the old node was referenced, ensure the new one is */
+	// If the old node was referenced, ensure the new one is
 	if (oldSrc && oldSrc->referenced && oldSrc->ID != (uint32_t)-1)
 		out_RegisterNode(sym->src);
-	/* TODO: unref the old node, and use `out_ReplaceNode` instead of deleting it */
+	// TODO: unref the old node, and use `out_ReplaceNode` instead of deleting it
 }
 
-/*
- * Create a new symbol by name
- */
+// Create a new symbol by name
 static struct Symbol *createsymbol(char const *symName)
 {
 	struct Symbol *sym = malloc(sizeof(*sym));
@@ -201,10 +189,8 @@
 	return sym;
 }
 
-/*
- * Creates the full name of a local symbol in a given scope, by prepending
- * the name with the parent symbol's name.
- */
+// Creates the full name of a local symbol in a given scope, by prepending
+// the name with the parent symbol's name.
 static void fullSymbolName(char *output, size_t outputSize,
 			   char const *localName, char const *scopeName)
 {
@@ -250,8 +236,8 @@
 		if (strchr(localName + 1, '.'))
 			fatalerror("'%s' is a nonsensical reference to a nested local symbol\n",
 				   symName);
-		/* If auto-scoped local label, expand the name */
-		if (localName == symName) { /* Meaning, the name begins with the dot */
+		// If auto-scoped local label, expand the name
+		if (localName == symName) { // Meaning, the name begins with the dot
 			char fullName[MAXSYMLEN + 1];
 
 			fullSymbolName(fullName, sizeof(fullName), symName, labelScope);
@@ -271,9 +257,7 @@
 	return sym->ID != (uint32_t)-1;
 }
 
-/*
- * Purge a symbol
- */
+// Purge a symbol
 void sym_Purge(char const *symName)
 {
 	struct Symbol *sym = sym_FindScopedSymbol(symName);
@@ -285,16 +269,14 @@
 	} else if (isReferenced(sym)) {
 		error("Symbol \"%s\" is referenced and thus cannot be purged\n", symName);
 	} else {
-		/* Do not keep a reference to the label's name after purging it */
+		// Do not keep a reference to the label's name after purging it
 		if (sym->name == labelScope)
 			sym_SetCurrentSymbolScope(NULL);
 
-		/*
-		 * FIXME: this leaks sym->macro for SYM_EQUS and SYM_MACRO, but this can't
-		 * free(sym->macro) because the expansion may be purging itself.
-		 */
+		// FIXME: this leaks sym->macro for SYM_EQUS and SYM_MACRO, but this can't
+		// free(sym->macro) because the expansion may be purging itself.
 		hash_RemoveElement(symbols, sym->name);
-		/* TODO: ideally, also unref the file stack nodes */
+		// TODO: ideally, also unref the file stack nodes
 		free(sym);
 	}
 }
@@ -312,9 +294,7 @@
 	return 0;
 }
 
-/*
- * Return a constant symbol's value, assuming it's defined
- */
+// Return a constant symbol's value, assuming it's defined
 uint32_t sym_GetConstantSymValue(struct Symbol const *sym)
 {
 	if (sym == PCSymbol)
@@ -327,9 +307,7 @@
 	return 0;
 }
 
-/*
- * Return a constant symbol's value
- */
+// Return a constant symbol's value
 uint32_t sym_GetConstantValue(char const *symName)
 {
 	struct Symbol const *sym = sym_FindScopedSymbol(symName);
@@ -381,9 +359,7 @@
 	return sym;
 }
 
-/*
- * Add an equated symbol
- */
+// Add an equated symbol
 struct Symbol *sym_AddEqu(char const *symName, int32_t value)
 {
 	struct Symbol *sym = createNonrelocSymbol(symName, true);
@@ -465,18 +441,14 @@
 	}
 
 	updateSymbolFilename(sym);
-	/*
-	 * FIXME: this leaks the previous sym->macro value, but this can't
-	 * free(sym->macro) because the expansion may be redefining itself.
-	 */
+	// FIXME: this leaks the previous sym->macro value, but this can't
+	// free(sym->macro) because the expansion may be redefining itself.
 	assignStringSymbol(sym, value);
 
 	return sym;
 }
 
-/*
- * Alter a mutable symbol's value
- */
+// Alter a mutable symbol's value
 struct Symbol *sym_AddVar(char const *symName, int32_t value)
 {
 	struct Symbol *sym = sym_FindExactSymbol(symName);
@@ -506,7 +478,7 @@
  */
 static struct Symbol *addLabel(char const *symName)
 {
-	assert(symName[0] != '.'); /* The symbol name must have been expanded prior */
+	assert(symName[0] != '.'); // The symbol name must have been expanded prior
 	struct Symbol *sym = sym_FindExactSymbol(symName);
 
 	if (!sym) {
@@ -519,7 +491,7 @@
 	} else {
 		updateSymbolFilename(sym);
 	}
-	/* If the symbol already exists as a ref, just "take over" it */
+	// If the symbol already exists as a ref, just "take over" it
 	sym->type = SYM_LABEL;
 	sym->value = sect_GetSymbolOffset();
 	if (exportall)
@@ -531,9 +503,7 @@
 	return sym;
 }
 
-/*
- * Add a local (`.name` or `Parent.name`) relocatable symbol
- */
+// Add a local (`.name` or `Parent.name`) relocatable symbol
 struct Symbol *sym_AddLocalLabel(char const *symName)
 {
 	if (!labelScope) {
@@ -540,34 +510,34 @@
 		error("Local label '%s' in main scope\n", symName);
 		return NULL;
 	}
-	assert(!strchr(labelScope, '.')); /* Assuming no dots in `labelScope` */
+	assert(!strchr(labelScope, '.')); // Assuming no dots in `labelScope`
 
 	char fullName[MAXSYMLEN + 1];
 	char const *localName = strchr(symName, '.');
 
-	assert(localName); /* There should be at least one dot in `symName` */
-	/* Check for something after the dot in `localName` */
+	assert(localName); // There should be at least one dot in `symName`
+	// Check for something after the dot in `localName`
 	if (localName[1] == '\0') {
 		fatalerror("'%s' is a nonsensical reference to an empty local label\n",
 			   symName);
 	}
-	/* Check for more than one dot in `localName` */
+	// Check for more than one dot in `localName`
 	if (strchr(localName + 1, '.'))
 		fatalerror("'%s' is a nonsensical reference to a nested local label\n",
 			   symName);
 
 	if (localName == symName) {
-		/* Expand `symName` to the full `labelScope.symName` name */
+		// Expand `symName` to the full `labelScope.symName` name
 		fullSymbolName(fullName, sizeof(fullName), symName, labelScope);
 		symName = fullName;
 	} else {
 		size_t i = 0;
 
-		/* Find where `labelScope` and `symName` first differ */
+		// Find where `labelScope` and `symName` first differ
 		while (labelScope[i] && symName[i] == labelScope[i])
 			i++;
 
-		/* Check that `symName` starts with `labelScope` and then a '.' */
+		// Check that `symName` starts with `labelScope` and then a '.'
 		if (labelScope[i] != '\0' || symName[i] != '.') {
 			size_t parentLen = localName - symName;
 
@@ -579,14 +549,12 @@
 	return addLabel(symName);
 }
 
-/*
- * Add a relocatable symbol
- */
+// Add a relocatable symbol
 struct Symbol *sym_AddLabel(char const *symName)
 {
 	struct Symbol *sym = addLabel(symName);
 
-	/* Set the symbol as the new scope */
+	// Set the symbol as the new scope
 	if (sym)
 		sym_SetCurrentSymbolScope(sym->name);
 	return sym;
@@ -594,9 +562,7 @@
 
 static uint32_t anonLabelID;
 
-/*
- * Add an anonymous label
- */
+// Add an anonymous label
 struct Symbol *sym_AddAnonLabel(void)
 {
 	if (anonLabelID == UINT32_MAX) {
@@ -610,9 +576,7 @@
 	return addLabel(name);
 }
 
-/*
- * Write an anonymous label's name to a buffer
- */
+// Write an anonymous label's name to a buffer
 void sym_WriteAnonLabelName(char buf[MIN_NB_ELMS(MAXSYMLEN + 1)], uint32_t ofs, bool neg)
 {
 	uint32_t id = 0;
@@ -636,9 +600,7 @@
 	sprintf(buf, "!%u", id);
 }
 
-/*
- * Export a symbol
- */
+// Export a symbol
 void sym_Export(char const *symName)
 {
 	if (symName[0] == '!') {
@@ -648,15 +610,13 @@
 
 	struct Symbol *sym = sym_FindScopedSymbol(symName);
 
-	/* If the symbol doesn't exist, create a ref that can be purged */
+	// If the symbol doesn't exist, create a ref that can be purged
 	if (!sym)
 		sym = sym_Ref(symName);
 	sym->isExported = true;
 }
 
-/*
- * Add a macro definition
- */
+// Add a macro definition
 struct Symbol *sym_AddMacro(char const *symName, int32_t defLineNo, char *body, size_t size)
 {
 	struct Symbol *sym = createNonrelocSymbol(symName, false);
@@ -667,20 +627,16 @@
 	sym->type = SYM_MACRO;
 	sym->macroSize = size;
 	sym->macro = body;
-	setSymbolFilename(sym); /* TODO: is this really necessary? */
-	/*
-	 * The symbol is created at the line after the `endm`,
-	 * override this with the actual definition line
-	 */
+	setSymbolFilename(sym); // TODO: is this really necessary?
+	// The symbol is created at the line after the `endm`,
+	// override this with the actual definition line
 	sym->fileLine = defLineNo;
 
 	return sym;
 }
 
-/*
- * Flag that a symbol is referenced in an RPN expression
- * and create it if it doesn't exist yet
- */
+// Flag that a symbol is referenced in an RPN expression
+// and create it if it doesn't exist yet
 struct Symbol *sym_Ref(char const *symName)
 {
 	struct Symbol *sym = sym_FindScopedSymbol(symName);
@@ -702,9 +658,7 @@
 	return sym;
 }
 
-/*
- * Set whether to export all relocatable symbols by default
- */
+// Set whether to export all relocatable symbols by default
 void sym_SetExportAll(bool set)
 {
 	exportall = set;
@@ -721,9 +675,7 @@
 	return sym;
 }
 
-/*
- * Initialize the symboltable
- */
+// Initialize the symboltable
 void sym_Init(time_t now)
 {
 	PCSymbol = createBuiltinSymbol("@");
@@ -761,7 +713,7 @@
 
 	if (now == (time_t)-1) {
 		warn("Couldn't determine current time");
-		/* Fall back by pretending we are at the Epoch */
+		// Fall back by pretending we are at the Epoch
 		now = 0;
 	}
 
--- a/src/asm/util.c
+++ b/src/asm/util.c
@@ -44,7 +44,7 @@
 		buf[2] = 't';
 		break;
 
-	default: /* Print as hex */
+	default: // Print as hex
 		buf[0] = '0';
 		buf[1] = 'x';
 		snprintf(&buf[2], 3, "%02hhX", (uint8_t)c); // includes the '\0'
--- a/src/asm/warning.c
+++ b/src/asm/warning.c
@@ -49,19 +49,19 @@
 
 enum WarningState warningStates[ARRAY_SIZE(warningStates)];
 
-bool warningsAreErrors; /* Set if `-Werror` was specified */
+bool warningsAreErrors; // Set if `-Werror` was specified
 
 static enum WarningState warningState(enum WarningID id)
 {
-	/* Check if warnings are globally disabled */
+	// Check if warnings are globally disabled
 	if (!warnings)
 		return WARNING_DISABLED;
 
-	/* Get the actual state */
+	// Get the actual state
 	enum WarningState state = warningStates[id];
 
 	if (state == WARNING_DEFAULT)
-		/* The state isn't set, grab its default state */
+		// The state isn't set, grab its default state
 		state = defaultWarnings[id];
 
 	if (warningsAreErrors && state == WARNING_ENABLED)
@@ -95,10 +95,10 @@
 	"truncation",
 	"truncation",
 
-	/* Meta warnings */
+	// Meta warnings
 	"all",
 	"extra",
-	"everything", /* Especially useful for testing */
+	"everything", // Especially useful for testing
 };
 
 static const struct {
@@ -151,7 +151,7 @@
 	META_WARNING_DONE = NB_WARNINGS
 };
 
-/* Warnings that probably indicate an error */
+// Warnings that probably indicate an error
 static uint8_t const _wallCommands[] = {
 	WARNING_BACKWARDS_FOR,
 	WARNING_BUILTIN_ARG,
@@ -167,7 +167,7 @@
 	META_WARNING_DONE
 };
 
-/* Warnings that are less likely to indicate an error */
+// Warnings that are less likely to indicate an error
 static uint8_t const _wextraCommands[] = {
 	WARNING_EMPTY_MACRO_ARG,
 	WARNING_MACRO_SHIFT,
@@ -179,7 +179,7 @@
 	META_WARNING_DONE
 };
 
-/* Literally everything. Notably useful for testing */
+// Literally everything. Notably useful for testing
 static uint8_t const _weverythingCommands[] = {
 	WARNING_BACKWARDS_FOR,
 	WARNING_BUILTIN_ARG,
@@ -199,7 +199,7 @@
 	WARNING_NUMERIC_STRING_2,
 	WARNING_TRUNCATION_1,
 	WARNING_TRUNCATION_2,
-	/* WARNING_USER, */
+	// WARNING_USER,
 	META_WARNING_DONE
 };
 
@@ -213,11 +213,11 @@
 {
 	static bool setError = false;
 
-	/* First, try to match against a "meta" warning */
+	// First, try to match against a "meta" warning
 	for (enum WarningID id = META_WARNINGS_START; id < NB_WARNINGS; id++) {
-		/* TODO: improve the matching performance? */
+		// TODO: improve the matching performance?
 		if (!strcmp(flag, warningFlags[id])) {
-			/* We got a match! */
+			// We got a match!
 			if (setError)
 				errx("Cannot make meta warning \"%s\" into an error",
 				     flag);
@@ -224,7 +224,7 @@
 
 			for (uint8_t const *ptr = metaWarningCommands[id - META_WARNINGS_START];
 			     *ptr != META_WARNING_DONE; ptr++) {
-				/* Warning flag, set without override */
+				// Warning flag, set without override
 				if (warningStates[*ptr] == WARNING_DEFAULT)
 					warningStates[*ptr] = WARNING_ENABLED;
 			}
@@ -233,31 +233,31 @@
 		}
 	}
 
-	/* If it's not a meta warning, specially check against `-Werror` */
+	// If it's not a meta warning, specially check against `-Werror`
 	if (!strncmp(flag, "error", strlen("error"))) {
 		char *errorFlag = flag + strlen("error");
 
 		switch (*errorFlag) {
 		case '\0':
-			/* `-Werror` */
+			// `-Werror`
 			warningsAreErrors = true;
 			return;
 
 		case '=':
-			/* `-Werror=XXX` */
+			// `-Werror=XXX`
 			setError = true;
-			processWarningFlag(errorFlag + 1); /* Skip the `=` */
+			processWarningFlag(errorFlag + 1); // Skip the `=`
 			setError = false;
 			return;
 
-		/* Otherwise, allow parsing as another flag */
+		// Otherwise, allow parsing as another flag
 		}
 	}
 
-	/* Well, it's either a normal warning or a mistake */
+	// Well, it's either a normal warning or a mistake
 
 	enum WarningState state = setError ? WARNING_ERROR :
-				  /* Not an error, then check if this is a negation */
+				  // Not an error, then check if this is a negation
 				  strncmp(flag, "no-", strlen("no-")) ? WARNING_ENABLED
 								      : WARNING_DISABLED;
 	char const *rootFlag = state == WARNING_DISABLED ? flag + strlen("no-") : flag;
@@ -308,10 +308,10 @@
 		}
 	}
 
-	/* Try to match the flag against a "normal" flag */
+	// Try to match the flag against a "normal" flag
 	for (enum WarningID id = 0; id < NB_PLAIN_WARNINGS; id++) {
 		if (!strcmp(rootFlag, warningFlags[id])) {
-			/* We got a match! */
+			// We got a match!
 			warningStates[id] = state;
 			return;
 		}
@@ -374,7 +374,7 @@
 
 	case WARNING_DEFAULT:
 		unreachable_();
-		/* Not reached */
+		// Not reached
 
 	case WARNING_ENABLED:
 		break;
--- a/src/fix/main.c
+++ b/src/fix/main.c
@@ -29,7 +29,7 @@
 
 #define BANK_SIZE 0x4000
 
-/* Short options */
+// Short options
 static const char *optstring = "Ccf:i:jk:l:m:n:Op:r:st:Vv";
 
 /*
@@ -191,7 +191,7 @@
 
 static uint8_t tpp1Rev[2];
 
-/**
+/*
  * @return False on failure
  */
 static bool readMBCSlice(char const **name, char const *expected)
@@ -837,7 +837,7 @@
 	return total;
 }
 
-/**
+/*
  * @param rom0 A pointer to rom0
  * @param addr What address to check
  * @param fixedByte The fixed byte at the address
@@ -853,7 +853,7 @@
 	rom0[addr] = fixedByte;
 }
 
-/**
+/*
  * @param rom0 A pointer to rom0
  * @param startAddr What address to begin checking from
  * @param fixed The fixed bytes at the address
@@ -878,7 +878,7 @@
 	memcpy(&rom0[startAddr], fixed, size);
 }
 
-/**
+/*
  * @param input File descriptor to be used for reading
  * @param output File descriptor to be used for writing, may be equal to `input`
  * @param name The file's name, to be displayed for error output
--- a/src/gfx/main.cpp
+++ b/src/gfx/main.cpp
@@ -153,7 +153,7 @@
 	exit(1);
 }
 
-/**
+/*
  * Parses a number at the beginning of a string, moving the pointer to skip the parsed characters
  * Returns the provided errVal on error
  */
@@ -179,7 +179,7 @@
 		}
 	}
 
-	/**
+	/*
 	 * Turns a digit into its numeric value in the current base, if it has one.
 	 * Maximum is inclusive. The string_view is modified to "consume" all digits.
 	 * Returns 255 on parse failure (including wrong char for base), in which case
@@ -248,7 +248,7 @@
 	}
 }
 
-/**
+/*
  * Turn an "at-file"'s contents into an argv that `getopt` can handle
  * @param argPool Argument characters will be appended to this vector, for storage purposes.
  */
@@ -317,7 +317,7 @@
 		} while (c != '\n' && c != EOF); // End if we reached EOL
 	}
 }
-/**
+/*
  * Parses an arg vector, modifying `options` as options are read.
  * The three booleans are for the "auto path" flags, since their processing must be deferred to the
  * end of option parsing.
@@ -785,7 +785,7 @@
 	}
 }
 
-/**
+/*
  * Returns the ID of the color in the palette, or `size()` if the color is not in
  */
 uint8_t Palette::indexOf(uint16_t color) const {
--- a/src/gfx/pal_packing.cpp
+++ b/src/gfx/pal_packing.cpp
@@ -39,12 +39,12 @@
 //  Tile | Proto-palette
 //  Page | Palette
 
-/**
+/*
  * A reference to a proto-palette, and attached attributes for sorting purposes
  */
 struct ProtoPalAttrs {
 	size_t const protoPalIndex;
-	/**
+	/*
 	 * Pages from which we are banned (to prevent infinite loops)
 	 * This is dynamic because we wish not to hard-cap the amount of palettes
 	 */
@@ -62,7 +62,7 @@
 	}
 };
 
-/**
+/*
  * A collection of proto-palettes assigned to a palette
  * Does not contain the actual color indices because we need to be able to remove elements
  */
@@ -139,7 +139,7 @@
 	}
 	const_iterator end() const { return const_iterator{&_assigned, _assigned.end()}; }
 
-	/**
+	/*
 	 * Assigns a new ProtoPalAttrs in a free slot, assuming there is one
 	 * Args are passed to the `ProtoPalAttrs`'s constructor
 	 */
@@ -198,7 +198,7 @@
 		return colors;
 	}
 public:
-	/**
+	/*
 	 * Returns the number of distinct colors
 	 */
 	size_t volume() const { return uniqueColors().size(); }
@@ -208,7 +208,7 @@
 		return colors.size() <= options.maxOpaqueColors();
 	}
 
-	/**
+	/*
 	 * Computes the "relative size" of a proto-palette on this palette
 	 */
 	double relSizeOf(ProtoPalette const &protoPal) const {
@@ -227,7 +227,7 @@
 		return relSize;
 	}
 
-	/**
+	/*
 	 * Computes the "relative size" of a set of proto-palettes on this palette
 	 */
 	template<typename Iter>
@@ -237,7 +237,7 @@
 		addUniqueColors(colors, std::forward<Iter>(begin), end, protoPals);
 		return colors.size();
 	}
-	/**
+	/*
 	 * Computes the "relative size" of a set of colors on this palette
 	 */
 	template<typename Iter>
--- a/src/gfx/pal_sorting.cpp
+++ b/src/gfx/pal_sorting.cpp
@@ -1,3 +1,10 @@
+/*
+ * This file is part of RGBDS.
+ *
+ * Copyright (c) 2022, Eldred Habert and RGBDS contributors.
+ *
+ * SPDX-License-Identifier: MIT
+ */
 
 #include "gfx/pal_sorting.hpp"
 
--- a/src/gfx/pal_spec.cpp
+++ b/src/gfx/pal_spec.cpp
@@ -165,7 +165,7 @@
 	}
 }
 
-/**
+/*
  * Tries to read some magic bytes from the provided `file`.
  * Returns whether the magic was correctly read.
  */
@@ -191,7 +191,7 @@
 	return val;
 }
 
-/**
+/*
  * **Appends** the first line read from `file` to the end of the provided `buffer`.
  */
 static void readLine(std::filebuf &file, std::string &buffer) {
@@ -214,7 +214,7 @@
 }
 
 // FIXME: Normally we'd use `std::from_chars`, but that's not available with GCC 7
-/**
+/*
  * Parses the initial part of a string_view, advancing the "read index" as it does
  */
 static uint16_t parseDec(std::string const &str, std::string::size_type &n) {
--- a/src/gfx/process.cpp
+++ b/src/gfx/process.cpp
@@ -42,7 +42,7 @@
 public:
 	ImagePalette() = default;
 
-	/**
+	/*
 	 * Registers a color in the palette.
 	 * If the newly inserted color "conflicts" with another one (different color, but same CGB
 	 * color), then the other color is returned. Otherwise, `nullptr` is returned.
@@ -164,7 +164,7 @@
 		return true;
 	}
 
-	/**
+	/*
 	 * Reads a PNG and notes all of its colors
 	 *
 	 * This code is more complicated than strictly necessary, but that's because of the API
@@ -466,7 +466,7 @@
 };
 
 class RawTiles {
-	/**
+	/*
 	 * A tile which only contains indices into the image's global palette
 	 */
 	class RawTile {
@@ -481,7 +481,7 @@
 	std::vector<RawTile> _tiles;
 
 public:
-	/**
+	/*
 	 * Creates a new raw tile, and returns a reference to it so it can be filled in
 	 */
 	RawTile &newTile() {
@@ -491,7 +491,7 @@
 };
 
 struct AttrmapEntry {
-	/**
+	/*
 	 * This field can either be a proto-palette ID, or `transparent` to indicate that the
 	 * corresponding tile is fully transparent. If you are looking to get the palette ID for this
 	 * attrmap entry while correctly handling the above, use `getPalID`.
@@ -831,7 +831,7 @@
 	UniqueTiles(UniqueTiles const &) = delete;
 	UniqueTiles(UniqueTiles &&) = default;
 
-	/**
+	/*
 	 * Adds a tile to the collection, and returns its ID
 	 */
 	std::tuple<uint16_t, TileData::MatchType> addTile(Png::TilesVisitor::Tile const &tile,
@@ -857,7 +857,7 @@
 	auto end() const { return tiles.end(); }
 };
 
-/**
+/*
  * Generate tile data while deduplicating unique tiles (via mirroring if enabled)
  * Additionally, while we have the info handy, convert from the 16-bit "global" tile IDs to
  * 8-bit tile IDs + the bank bit; this will save the work when we output the data later (potentially
@@ -986,16 +986,17 @@
 				protoPalettes[n] = tileColors; // Override them
 				// Remove any other proto-palettes that we encompass
 				// (Example [(0, 1), (0, 2)], inserting (0, 1, 2))
-				/* The following code does its job, except that references to the removed
+				/*
+				 * The following code does its job, except that references to the removed
 				 * proto-palettes are not updated, causing issues.
 				 * TODO: overlap might not be detrimental to the packing algorithm.
 				 * Investigation is necessary, especially if pathological cases are found.
-
-				for (size_t i = protoPalettes.size(); --i != n;) {
-				    if (tileColors.compare(protoPalettes[i]) == ProtoPalette::WE_BIGGER) {
-				        protoPalettes.erase(protoPalettes.begin() + i);
-				    }
-				}
+				 *
+				 * for (size_t i = protoPalettes.size(); --i != n;) {
+				 *     if (tileColors.compare(protoPalettes[i]) == ProtoPalette::WE_BIGGER) {
+				 *         protoPalettes.erase(protoPalettes.begin() + i);
+				 *     }
+				 * }
 				*/
 				[[fallthrough]];
 
--- a/src/gfx/rgba.cpp
+++ b/src/gfx/rgba.cpp
@@ -1,3 +1,11 @@
+/*
+ * This file is part of RGBDS.
+ *
+ * Copyright (c) 2022, Eldred Habert and RGBDS contributors.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
 #include "gfx/rgba.hpp"
 
 #include <assert.h>
--- a/src/hashmap.c
+++ b/src/hashmap.c
@@ -15,10 +15,8 @@
 #include "error.h"
 #include "hashmap.h"
 
-/*
- * The lower half of the hash is used to index the "master" table,
- * the upper half is used to help resolve collisions more quickly
- */
+// The lower half of the hash is used to index the "master" table,
+// the upper half is used to help resolve collisions more quickly
 #define UINT_BITS_(NB_BITS) uint##NB_BITS##_t
 #define UINT_BITS(NB_BITS)  UINT_BITS_(NB_BITS)
 typedef UINT_BITS(HASH_NB_BITS) HashType;
@@ -34,7 +32,7 @@
 #define FNV_OFFSET_BASIS 0x811c9dc5
 #define FNV_PRIME 16777619
 
-/* FNV-1a hash */
+// FNV-1a hash
 static HashType hash(char const *str)
 {
 	HashType hash = FNV_OFFSET_BASIS;
--- a/src/link/assign.c
+++ b/src/link/assign.c
@@ -34,14 +34,12 @@
 	struct FreeSpace *next, *prev;
 };
 
-/* Table of free space for each bank */
+// Table of free space for each bank
 struct FreeSpace *memory[SECTTYPE_INVALID];
 
 uint64_t nbSectionsToAssign;
 
-/**
- * Init the free space-modelling structs
- */
+// Init the free space-modelling structs
 static void initFreeSpace(void)
 {
 	for (enum SectionType type = 0; type < SECTTYPE_INVALID; type++) {
@@ -63,7 +61,7 @@
 	}
 }
 
-/**
+/*
  * Assigns a section to a given memory location
  * @param section The section to assign
  * @param location The location to assign the section to
@@ -85,7 +83,7 @@
 	out_AddSection(section);
 }
 
-/**
+/*
  * Checks whether a given location is suitable for placing a given section
  * This checks not only that the location has enough room for the section, but
  * also that the constraints (alignment...) are respected.
@@ -111,7 +109,7 @@
 					<= freeSpace->address + freeSpace->size;
 }
 
-/**
+/*
  * Finds a suitable location to place a section at.
  * @param section The section to be placed
  * @param location A pointer to a location struct that will be filled
@@ -146,61 +144,57 @@
 	struct FreeSpace *space;
 
 	for (;;) {
-		/* Switch to the beginning of the next bank */
+		// Switch to the beginning of the next bank
 #define BANK_INDEX (location->bank - sectionTypeInfo[section->type].firstBank)
 		space = memory[section->type][BANK_INDEX].next;
 		if (space)
 			location->address = space->address;
 
-		/* Process locations in that bank */
+		// Process locations in that bank
 		while (space) {
-			/* If that location is OK, return it */
+			// If that location is OK, return it
 			if (isLocationSuitable(section, space, location))
 				return space;
 
-			/* Go to the next *possible* location */
+			// Go to the next *possible* location
 			if (section->isAddressFixed) {
-				/*
-				 * If the address is fixed, there can be only
-				 * one candidate block per bank; if we already
-				 * reached it, give up.
-				 */
+				// If the address is fixed, there can be only
+				// one candidate block per bank; if we already
+				// reached it, give up.
 				if (location->address < section->org)
 					location->address = section->org;
 				else
-					/* Try again in next bank */
+					// Try again in next bank
 					space = NULL;
 			} else if (section->isAlignFixed) {
-				/* Move to next aligned location */
-				/* Move back to alignment boundary */
+				// Move to next aligned location
+				// Move back to alignment boundary
 				location->address -= section->alignOfs;
-				/* Ensure we're there (e.g. on first check) */
+				// Ensure we're there (e.g. on first check)
 				location->address &= ~section->alignMask;
-				/* Go to next align boundary and add offset */
+				// Go to next align boundary and add offset
 				location->address += section->alignMask + 1
 							+ section->alignOfs;
 			} else {
-				/* Any location is fine, so, next free block */
+				// Any location is fine, so, next free block
 				space = space->next;
 				if (space)
 					location->address = space->address;
 			}
 
-			/*
-			 * If that location is past the current block's end,
-			 * go forwards until that is no longer the case.
-			 */
+			// If that location is past the current block's end,
+			// go forwards until that is no longer the case.
 			while (space && location->address >=
 						space->address + space->size)
 				space = space->next;
 
-			/* Try again with the new location/free space combo */
+			// Try again with the new location/free space combo
 		}
 
 		if (section->isBankFixed)
 			return NULL;
 
-		/* Try again in the next bank */
+		// Try again in the next bank
 		location->bank++;
 		if (location->bank > sectionTypeInfo[section->type].lastBank)
 			return NULL;
@@ -208,7 +202,7 @@
 	}
 }
 
-/**
+/*
  * Places a section in a suitable location, or error out if it fails to.
  * @warning Due to the implemented algorithm, this should be called with
  *          sections of decreasing size.
@@ -218,12 +212,10 @@
 {
 	struct MemoryLocation location;
 
-	/* Specially handle 0-byte SECTIONs, as they can't overlap anything */
+	// Specially handle 0-byte SECTIONs, as they can't overlap anything
 	if (section->size == 0) {
-		/*
-		 * Unless the SECTION's address was fixed, the starting address
-		 * is fine for any alignment, as checked in sect_DoSanityChecks.
-		 */
+		// Unless the SECTION's address was fixed, the starting address
+		// is fine for any alignment, as checked in sect_DoSanityChecks.
 		location.address = section->isAddressFixed
 						? section->org
 						: sectionTypeInfo[section->type].startAddr;
@@ -234,60 +226,56 @@
 		return;
 	}
 
-	/*
-	 * Place section using first-fit decreasing algorithm
-	 * https://en.wikipedia.org/wiki/Bin_packing_problem#First-fit_algorithm
-	 */
+	// Place section using first-fit decreasing algorithm
+	// https://en.wikipedia.org/wiki/Bin_packing_problem#First-fit_algorithm
 	struct FreeSpace *freeSpace = getPlacement(section, &location);
 
 	if (freeSpace) {
 		assignSection(section, &location);
 
-		/* Split the free space */
+		// Split the free space
 		bool noLeftSpace  = freeSpace->address == section->org;
 		bool noRightSpace = freeSpace->address + freeSpace->size
 					== section->org + section->size;
 		if (noLeftSpace && noRightSpace) {
-			/* The free space is entirely deleted */
+			// The free space is entirely deleted
 			freeSpace->prev->next = freeSpace->next;
 			if (freeSpace->next)
 				freeSpace->next->prev = freeSpace->prev;
-			/*
-			 * If the space is the last one on the list, set its
-			 * size to 0 so it doesn't get picked, but don't free()
-			 * it as it will be freed when cleaning up
-			 */
+			// If the space is the last one on the list, set its
+			// size to 0 so it doesn't get picked, but don't free()
+			// it as it will be freed when cleaning up
 			free(freeSpace);
 		} else if (!noLeftSpace && !noRightSpace) {
-			/* The free space is split in two */
+			// The free space is split in two
 			struct FreeSpace *newSpace = malloc(sizeof(*newSpace));
 
 			if (!newSpace)
 				err("Failed to split new free space");
-			/* Append the new space after the chosen one */
+			// Append the new space after the chosen one
 			newSpace->prev = freeSpace;
 			newSpace->next = freeSpace->next;
 			if (freeSpace->next)
 				freeSpace->next->prev = newSpace;
 			freeSpace->next = newSpace;
-			/* Set its parameters */
+			// Set its parameters
 			newSpace->address = section->org + section->size;
 			newSpace->size = freeSpace->address + freeSpace->size -
 				newSpace->address;
-			/* Set the original space's new parameters */
+			// Set the original space's new parameters
 			freeSpace->size = section->org - freeSpace->address;
-			/* address is unmodified */
+			// address is unmodified
 		} else {
-			/* The amount of free spaces doesn't change: resize! */
+			// The amount of free spaces doesn't change: resize!
 			freeSpace->size -= section->size;
 			if (noLeftSpace)
-				/* The free space is moved *and* resized */
+				// The free space is moved *and* resized
 				freeSpace->address += section->size;
 		}
 		return;
 	}
 
-	/* Please adjust depending on longest message below */
+	// Please adjust depending on longest message below
 	char where[64];
 
 	if (section->isBankFixed && nbbanks(section->type) != 1) {
@@ -312,16 +300,16 @@
 			strcpy(where, "anywhere");
 	}
 
-	/* If a section failed to go to several places, nothing we can report */
+	// If a section failed to go to several places, nothing we can report
 	if (!section->isBankFixed || !section->isAddressFixed)
 		errx("Unable to place \"%s\" (%s section) %s",
 		     section->name, sectionTypeInfo[section->type].name, where);
-	/* If the section just can't fit the bank, report that */
+	// If the section just can't fit the bank, report that
 	else if (section->org + section->size > endaddr(section->type) + 1)
 		errx("Unable to place \"%s\" (%s section) %s: section runs past end of region ($%04x > $%04x)",
 		     section->name, sectionTypeInfo[section->type].name, where,
 		     section->org + section->size, endaddr(section->type) + 1);
-	/* Otherwise there is overlap with another section */
+	// Otherwise there is overlap with another section
 	else
 		errx("Unable to place \"%s\" (%s section) %s: section overlaps with \"%s\"",
 		     section->name, sectionTypeInfo[section->type].name, where,
@@ -339,7 +327,7 @@
 static struct UnassignedSection *unassignedSections[1 << 3] = {0};
 static struct UnassignedSection *sections;
 
-/**
+/*
  * Categorize a section depending on how constrained it is
  * This is so the most-constrained sections are placed first
  * @param section The section to categorize
@@ -354,13 +342,13 @@
 		constraints |= BANK_CONSTRAINED;
 	if (section->isAddressFixed)
 		constraints |= ORG_CONSTRAINED;
-	/* Can't have both! */
+	// Can't have both!
 	else if (section->isAlignFixed)
 		constraints |= ALIGN_CONSTRAINED;
 
 	struct UnassignedSection **ptr = &unassignedSections[constraints];
 
-	/* Insert section while keeping the list sorted by decreasing size */
+	// Insert section while keeping the list sorted by decreasing size
 	while (*ptr && (*ptr)->section->size > section->size)
 		ptr = &(*ptr)->next;
 
@@ -375,9 +363,9 @@
 {
 	verbosePrint("Beginning assignment...\n");
 
-	/** Initialize assignment **/
+	// Initialize assignment
 
-	/* Generate linked lists of sections to assign */
+	// Generate linked lists of sections to assign
 	sections = malloc(sizeof(*sections) * nbSectionsToAssign + 1);
 	if (!sections)
 		err("Failed to allocate memory for section assignment");
@@ -387,9 +375,9 @@
 	nbSectionsToAssign = 0;
 	sect_ForEach(categorizeSection, NULL);
 
-	/** Place sections, starting with the most constrained **/
+	// Place sections, starting with the most constrained
 
-	/* Specially process fully-constrained sections because of overlaying */
+	// Specially process fully-constrained sections because of overlaying
 	struct UnassignedSection *sectionPtr =
 		unassignedSections[BANK_CONSTRAINED | ORG_CONSTRAINED];
 
@@ -399,11 +387,11 @@
 		sectionPtr = sectionPtr->next;
 	}
 
-	/* If all sections were fully constrained, we have nothing left to do */
+	// If all sections were fully constrained, we have nothing left to do
 	if (!nbSectionsToAssign)
 		return;
 
-	/* Overlaying requires only fully-constrained sections */
+	// Overlaying requires only fully-constrained sections
 	verbosePrint("Assigning other sections...\n");
 	if (overlayFileName) {
 		fprintf(stderr, "FATAL: All sections must be fixed when using an overlay file");
@@ -427,7 +415,7 @@
 		exit(1);
 	}
 
-	/* Assign all remaining sections by decreasing constraint order */
+	// Assign all remaining sections by decreasing constraint order
 	for (int8_t constraints = BANK_CONSTRAINED | ALIGN_CONSTRAINED;
 	     constraints >= 0; constraints--) {
 		sectionPtr = unassignedSections[constraints];
--- a/src/link/main.c
+++ b/src/link/main.c
@@ -33,27 +33,26 @@
 #include "platform.h"
 #include "version.h"
 
-bool isDmgMode;               /* -d */
-char       *linkerScriptName; /* -l */
-char const *mapFileName;      /* -m */
-bool noSymInMap;              /* -M */
-char const *symFileName;      /* -n */
-char const *overlayFileName;  /* -O */
-char const *outputFileName;   /* -o */
-uint8_t padValue;             /* -p */
+bool isDmgMode;               // -d
+char       *linkerScriptName; // -l
+char const *mapFileName;      // -m
+bool noSymInMap;              // -M
+char const *symFileName;      // -n
+char const *overlayFileName;  // -O
+char const *outputFileName;   // -o
+uint8_t padValue;             // -p
 // Setting these three to 0 disables the functionality
-uint16_t scrambleROMX = 0;    /* -S */
+uint16_t scrambleROMX = 0;    // -S
 uint8_t scrambleWRAMX = 0;
 uint8_t scrambleSRAM = 0;
-bool is32kMode;               /* -t */
-bool beVerbose;               /* -v */
-bool isWRA0Mode;              /* -w */
-bool disablePadding;          /* -x */
+bool is32kMode;               // -t
+bool beVerbose;               // -v
+bool isWRA0Mode;              // -w
+bool disablePadding;          // -x
 
 static uint32_t nbErrors = 0;
 
-/***** Helper function to dump a file stack to stderr *****/
-
+// Helper function to dump a file stack to stderr
 char const *dumpFileStack(struct FileStackNode const *node)
 {
 	char const *lastName;
@@ -60,7 +59,7 @@
 
 	if (node->parent) {
 		lastName = dumpFileStack(node->parent);
-		/* REPT nodes use their parent's name */
+		// REPT nodes use their parent's name
 		if (node->type != NODE_REPT)
 			lastName = node->name;
 		fprintf(stderr, "(%" PRIu32 ") -> %s", node->lineNo, lastName);
@@ -165,7 +164,7 @@
 	return file;
 }
 
-/* Short options */
+// Short options
 static const char *optstring = "dl:m:Mn:O:o:p:S:s:tVvWwx";
 
 /*
@@ -197,9 +196,7 @@
 	{ NULL,            no_argument,       NULL, 0   }
 };
 
-/**
- * Prints the program's usage to stdout.
- */
+// Prints the program's usage to stdout.
 static void printUsage(void)
 {
 	fputs(
@@ -219,10 +216,8 @@
 	      stderr);
 }
 
-/**
- * Cleans up what has been done
- * Mostly here to please tools such as `valgrind` so actual errors can be seen
- */
+// Cleans up what has been done
+// Mostly here to please tools such as `valgrind` so actual errors can be seen
 static void cleanup(void)
 {
 	obj_Cleanup();
@@ -362,10 +357,10 @@
 int main(int argc, char *argv[])
 {
 	int optionChar;
-	char *endptr; /* For error checking with `strtoul` */
-	unsigned long value; /* For storing `strtoul`'s return value */
+	char *endptr; // For error checking with `strtoul`
+	unsigned long value; // For storing `strtoul`'s return value
 
-	/* Parse options */
+	// Parse options
 	while ((optionChar = musl_getopt_long_only(argc, argv, optstring,
 						   longopts, NULL)) != -1) {
 		switch (optionChar) {
@@ -407,7 +402,7 @@
 			parseScrambleSpec(musl_optarg);
 			break;
 		case 's':
-			/* FIXME: nobody knows what this does, figure it out */
+			// FIXME: nobody knows what this does, figure it out
 			(void)musl_optarg;
 			warning(NULL, 0, "Nobody has any idea what `-s` does");
 			break;
@@ -425,7 +420,7 @@
 			break;
 		case 'x':
 			disablePadding = true;
-			/* implies tiny mode */
+			// implies tiny mode
 			is32kMode = true;
 			break;
 		default:
@@ -436,7 +431,7 @@
 
 	int curArgIndex = musl_optind;
 
-	/* If no input files were specified, the user must have screwed up */
+	// If no input files were specified, the user must have screwed up
 	if (curArgIndex == argc) {
 		fputs("FATAL: no input files\n", stderr);
 		printUsage();
@@ -443,27 +438,27 @@
 		exit(1);
 	}
 
-	/* Patch the size array depending on command-line options */
+	// Patch the size array depending on command-line options
 	if (!is32kMode)
 		sectionTypeInfo[SECTTYPE_ROM0].size = 0x4000;
 	if (!isWRA0Mode)
 		sectionTypeInfo[SECTTYPE_WRAM0].size = 0x1000;
 
-	/* Patch the bank ranges array depending on command-line options */
+	// Patch the bank ranges array depending on command-line options
 	if (isDmgMode)
 		sectionTypeInfo[SECTTYPE_VRAM].lastBank = 0;
 
-	/* Read all object files first, */
+	// Read all object files first,
 	for (obj_Setup(argc - curArgIndex); curArgIndex < argc; curArgIndex++)
 		obj_ReadFile(argv[curArgIndex], argc - curArgIndex - 1);
 
-	/* apply the linker script's modifications, */
+	// apply the linker script's modifications,
 	if (linkerScriptName) {
 		verbosePrint("Reading linker script...\n");
 
 		linkerScript = openFile(linkerScriptName, "r");
 
-		/* Modify all sections according to the linker script */
+		// Modify all sections according to the linker script
 		struct SectionPlacement *placement;
 
 		while ((placement = script_NextSection())) {
@@ -470,7 +465,7 @@
 			struct Section *section = placement->section;
 
 			assert(section->offset == 0);
-			/* Check if this doesn't conflict with what the code says */
+			// Check if this doesn't conflict with what the code says
 			if (section->type == SECTTYPE_INVALID) {
 				for (struct Section *sect = section; sect; sect = sect->nextu)
 					sect->type = placement->type; // SDCC "unknown" sections
@@ -493,7 +488,7 @@
 			section->org = placement->org;
 			section->isBankFixed = true;
 			section->bank = placement->bank;
-			section->isAlignFixed = false; /* The alignment is satisfied */
+			section->isAlignFixed = false; // The alignment is satisfied
 		}
 
 		fclose(linkerScript);
@@ -506,7 +501,7 @@
 	}
 
 
-	/* then process them, */
+	// then process them,
 	obj_DoSanityChecks();
 	if (nbErrors != 0)
 		reportErrors();
@@ -514,12 +509,12 @@
 	obj_CheckAssertions();
 	assign_Cleanup();
 
-	/* and finally output the result. */
+	// and finally output the result.
 	patch_ApplyPatches();
 	if (nbErrors != 0)
 		reportErrors();
 	out_WriteFiles();
 
-	/* Do cleanup before quitting, though. */
+	// Do cleanup before quitting, though.
 	cleanup();
 }
--- a/src/link/object.c
+++ b/src/link/object.c
@@ -39,12 +39,10 @@
 } *nodes;
 static struct Assertion *assertions;
 
-/***** Helper functions for reading object files *****/
+// Helper functions for reading object files
 
-/*
- * Internal, DO NOT USE.
- * For helper wrapper macros defined below, such as `tryReadlong`
- */
+// Internal, DO NOT USE.
+// For helper wrapper macros defined below, such as `tryReadlong`
 #define tryRead(func, type, errval, var, file, ...) \
 	do { \
 		FILE *tmpFile = file; \
@@ -58,7 +56,7 @@
 		var = tmpVal; \
 	} while (0)
 
-/**
+/*
  * Reads an unsigned long (32-bit) value from a file.
  * @param file The file to read from. This will read 4 bytes from the file.
  * @return The value read, cast to a int64_t, or -1 on failure.
@@ -67,25 +65,24 @@
 {
 	uint32_t value = 0;
 
-	/* Read the little-endian value byte by byte */
+	// Read the little-endian value byte by byte
 	for (uint8_t shift = 0; shift < sizeof(value) * CHAR_BIT; shift += 8) {
 		int byte = getc(file);
 
 		if (byte == EOF)
 			return INT64_MAX;
-		/* This must be casted to `unsigned`, not `uint8_t`. Rationale:
-		 * the type of the shift is the type of `byte` after undergoing
-		 * integer promotion, which would be `int` if this was casted to
-		 * `uint8_t`, because int is large enough to hold a byte. This
-		 * however causes values larger than 127 to be too large when
-		 * shifted, potentially triggering undefined behavior.
-		 */
+		// This must be casted to `unsigned`, not `uint8_t`. Rationale:
+		// the type of the shift is the type of `byte` after undergoing
+		// integer promotion, which would be `int` if this was casted to
+		// `uint8_t`, because int is large enough to hold a byte. This
+		// however causes values larger than 127 to be too large when
+		// shifted, potentially triggering undefined behavior.
 		value |= (unsigned int)byte << shift;
 	}
 	return value;
 }
 
-/**
+/*
  * Helper macro for reading longs from a file, and errors out if it fails to.
  * Not as a function to avoid overhead in the general case.
  * @param var The variable to stash the number into
@@ -96,9 +93,9 @@
 #define tryReadlong(var, file, ...) \
 	tryRead(readlong, int64_t, INT64_MAX, var, file, __VA_ARGS__)
 
-/* There is no `readbyte`, just use `fgetc` or `getc`. */
+// There is no `readbyte`, just use `fgetc` or `getc`.
 
-/**
+/*
  * Helper macro for reading bytes from a file, and errors out if it fails to.
  * Differs from `tryGetc` in that the backing function is fgetc(1).
  * Not as a function to avoid overhead in the general case.
@@ -110,7 +107,7 @@
 #define tryFgetc(var, file, ...) \
 	tryRead(fgetc, int, EOF, var, file, __VA_ARGS__)
 
-/**
+/*
  * Helper macro for reading bytes from a file, and errors out if it fails to.
  * Differs from `tryGetc` in that the backing function is fgetc(1).
  * Not as a function to avoid overhead in the general case.
@@ -122,7 +119,7 @@
 #define tryGetc(var, file, ...) \
 	tryRead(getc, int, EOF, var, file, __VA_ARGS__)
 
-/**
+/*
  * Reads a '\0'-terminated string from a file.
  * @param file The file to read from. The file position will be advanced.
  * @return The string read, or NULL on failure.
@@ -130,26 +127,26 @@
  */
 static char *readstr(FILE *file)
 {
-	/* Default buffer size, have it close to the average string length */
+	// Default buffer size, have it close to the average string length
 	size_t capacity = 32 / 2;
 	size_t index = -1;
-	/* Force the first iteration to allocate */
+	// Force the first iteration to allocate
 	char *str = NULL;
 
 	do {
-		/* Prepare going to next char */
+		// Prepare going to next char
 		index++;
 
-		/* If the buffer isn't suitable to write the next char... */
+		// If the buffer isn't suitable to write the next char...
 		if (index >= capacity || !str) {
 			capacity *= 2;
 			str = realloc(str, capacity);
-			/* End now in case of error */
+			// End now in case of error
 			if (!str)
 				return NULL;
 		}
 
-		/* Read char */
+		// Read char
 		int byte = getc(file);
 
 		if (byte == EOF) {
@@ -161,7 +158,7 @@
 	return str;
 }
 
-/**
+/*
  * Helper macro for reading bytes from a file, and errors out if it fails to.
  * Not as a function to avoid overhead in the general case.
  * @param var The variable to stash the string into
@@ -172,9 +169,9 @@
 #define tryReadstr(var, file, ...) \
 	tryRead(readstr, char*, NULL, var, file, __VA_ARGS__)
 
-/***** Functions to parse object files *****/
+// Functions to parse object files
 
-/**
+/*
  * Reads a file stack node form a file.
  * @param file The file to read from
  * @param nodes The file's array of nodes
@@ -217,7 +214,7 @@
 	}
 }
 
-/**
+/*
  * Reads a symbol from a file.
  * @param file The file to read from
  * @param symbol The struct to fill
@@ -230,7 +227,7 @@
 		   fileName);
 	tryGetc(symbol->type, file, "%s: Cannot read \"%s\"'s type: %s",
 		fileName, symbol->name);
-	/* If the symbol is defined in this file, read its definition */
+	// If the symbol is defined in this file, read its definition
 	if (symbol->type != SYMTYPE_IMPORT) {
 		symbol->objFileName = fileName;
 		uint32_t nodeID;
@@ -253,7 +250,7 @@
 	}
 }
 
-/**
+/*
  * Reads a patch from a file.
  * @param file The file to read from
  * @param patch The struct to fill
@@ -303,7 +300,7 @@
 		     feof(file) ? "Unexpected end of file" : strerror(errno));
 }
 
-/**
+/*
  * Sets a patch's pcSection from its pcSectionID.
  * @param patch The struct to fix
  */
@@ -313,7 +310,7 @@
 							      : fileSections[patch->pcSectionID];
 }
 
-/**
+/*
  * Reads a section from a file.
  * @param file The file to read from
  * @param section The struct to fill
@@ -372,7 +369,7 @@
 	section->alignOfs = tmp;
 
 	if (sect_HasData(section->type)) {
-		/* Ensure we never allocate 0 bytes */
+		// Ensure we never allocate 0 bytes
 		uint8_t *data = malloc(sizeof(*data) * section->size + 1);
 
 		if (!data)
@@ -404,7 +401,7 @@
 	}
 }
 
-/**
+/*
  * Links a symbol to a section, keeping the section's symbol list sorted.
  * @param symbol The symbol to link
  * @param section The section to link
@@ -433,7 +430,7 @@
 	section->nbSymbols++;
 }
 
-/**
+/*
  * Reads an assertion from a file
  * @param file The file to read from
  * @param assert The struct to fill
@@ -500,7 +497,7 @@
 		return;
 	}
 
-	/* Begin by reading the magic bytes */
+	// Begin by reading the magic bytes
 	int matchedElems;
 
 	if (fscanf(file, RGBDS_OBJECT_VERSION_STRING "%n", &matchedElems) == 1
@@ -536,7 +533,7 @@
 	for (uint32_t i = nodes[fileID].nbNodes; i--; )
 		readFileStackNode(file, nodes[fileID].nodes, i, fileName);
 
-	/* This file's symbols, kept to link sections to them */
+	// This file's symbols, kept to link sections to them
 	struct Symbol **fileSymbols = malloc(sizeof(*fileSymbols) * nbSymbols + 1);
 
 	if (!fileSymbols)
@@ -556,7 +553,7 @@
 
 	verbosePrint("Reading %" PRIu32 " symbols...\n", nbSymbols);
 	for (uint32_t i = 0; i < nbSymbols; i++) {
-		/* Read symbol */
+		// Read symbol
 		struct Symbol *symbol = malloc(sizeof(*symbol));
 
 		if (!symbol)
@@ -570,13 +567,13 @@
 			nbSymPerSect[symbol->sectionID]++;
 	}
 
-	/* This file's sections, stored in a table to link symbols to them */
+	// This file's sections, stored in a table to link symbols to them
 	struct Section **fileSections = malloc(sizeof(*fileSections)
 					    * (nbSections ? nbSections : 1));
 
 	verbosePrint("Reading %" PRIu32 " sections...\n", nbSections);
 	for (uint32_t i = 0; i < nbSections; i++) {
-		/* Read section */
+		// Read section
 		fileSections[i] = malloc(sizeof(*fileSections[i]));
 		if (!fileSections[i])
 			err("%s: Couldn't create new section", fileName);
@@ -600,7 +597,7 @@
 
 	free(nbSymPerSect);
 
-	/* Give patches' PC section pointers to their sections */
+	// Give patches' PC section pointers to their sections
 	for (uint32_t i = 0; i < nbSections; i++) {
 		if (sect_HasData(fileSections[i]->type)) {
 			for (uint32_t j = 0; j < fileSections[i]->nbPatches; j++)
@@ -608,7 +605,7 @@
 		}
 	}
 
-	/* Give symbols' section pointers to their sections */
+	// Give symbols' section pointers to their sections
 	for (uint32_t i = 0; i < nbSymbols; i++) {
 		int32_t sectionID = fileSymbols[i]->sectionID;
 
@@ -617,12 +614,12 @@
 		} else {
 			struct Section *section = fileSections[sectionID];
 
-			/* Give the section a pointer to the symbol as well */
+			// Give the section a pointer to the symbol as well
 			linkSymToSect(fileSymbols[i], section);
 
 			if (section->modifier != SECTION_NORMAL) {
 				if (section->modifier == SECTION_FRAGMENT)
-					/* Add the fragment's offset to the symbol's */
+					// Add the fragment's offset to the symbol's
 					fileSymbols[i]->offset += section->offset;
 				section = getMainSection(section);
 			}
--- a/src/link/output.c
+++ b/src/link/output.c
@@ -47,7 +47,7 @@
 	} *banks;
 } sections[SECTTYPE_INVALID];
 
-/* Defines the order in which types are output to the sym and map files */
+// Defines the order in which types are output to the sym and map files
 static enum SectionType typeMap[SECTTYPE_INVALID] = {
 	SECTTYPE_ROM0,
 	SECTTYPE_ROMX,
@@ -124,7 +124,7 @@
 	return NULL;
 }
 
-/**
+/*
  * Performs sanity checks on the overlay file.
  * @return The number of ROM banks in the overlay file
  */
@@ -140,7 +140,7 @@
 
 	long overlaySize = ftell(overlayFile);
 
-	/* Reset back to beginning */
+	// Reset back to beginning
 	fseek(overlayFile, 0, SEEK_SET);
 
 	if (overlaySize % BANK_SIZE)
@@ -157,7 +157,7 @@
 	return nbOverlayBanks;
 }
 
-/**
+/*
  * Expand sections[SECTTYPE_ROMX].banks to cover all the overlay banks.
  * This ensures that writeROM will output each bank, even if some are not
  * covered by any sections.
@@ -165,9 +165,9 @@
  */
 static void coverOverlayBanks(uint32_t nbOverlayBanks)
 {
-	/* 2 if is32kMode, 1 otherwise */
+	// 2 if is32kMode, 1 otherwise
 	uint32_t nbRom0Banks = sectionTypeInfo[SECTTYPE_ROM0].size / BANK_SIZE;
-	/* Discount ROM0 banks to avoid outputting too much */
+	// Discount ROM0 banks to avoid outputting too much
 	uint32_t nbUncoveredBanks = nbOverlayBanks - nbRom0Banks > sections[SECTTYPE_ROMX].nbBanks
 				    ? nbOverlayBanks - nbRom0Banks
 				    : 0;
@@ -186,7 +186,7 @@
 	}
 }
 
-/**
+/*
  * Write a ROM bank's sections to the output file.
  * @param bankSections The bank's sections, ordered by increasing address
  * @param baseOffset The address of the bank's first byte in GB address space
@@ -201,7 +201,7 @@
 		struct Section const *section = bankSections->section;
 
 		assert(section->offset == 0);
-		/* Output padding up to the next SECTION */
+		// Output padding up to the next SECTION
 		while (offset + baseOffset < section->org) {
 			putc(overlayFile ? getc(overlayFile) : padValue,
 			     outputFile);
@@ -208,11 +208,11 @@
 			offset++;
 		}
 
-		/* Output the section itself */
+		// Output the section itself
 		fwrite(section->data, sizeof(*section->data), section->size,
 		       outputFile);
 		if (overlayFile) {
-			/* Skip bytes even with pipes */
+			// Skip bytes even with pipes
 			for (uint16_t i = 0; i < section->size; i++)
 				getc(overlayFile);
 		}
@@ -231,9 +231,7 @@
 	}
 }
 
-/**
- * Writes a ROM file to the output.
- */
+// Writes a ROM file to the output.
 static void writeROM(void)
 {
 	outputFile = openFile(outputFileName, "wb");
@@ -258,7 +256,7 @@
 	closeFile(overlayFile);
 }
 
-/**
+/*
  * Get the lowest section by address out of the two
  * @param s1 One choice
  * @param s2 The other
@@ -275,10 +273,8 @@
 	return (*s1)->section->org < (*s2)->section->org ? s1 : s2;
 }
 
-/*
- * Comparator function for `qsort` to sort symbols
- * Symbols are ordered by address, or else by original index for a stable sort
- */
+// Comparator function for `qsort` to sort symbols
+// Symbols are ordered by address, or else by original index for a stable sort
 static int compareSymbols(void const *a, void const *b)
 {
 	struct SortedSymbol const *sym1 = (struct SortedSymbol const *)a;
@@ -290,7 +286,7 @@
 	return sym1->idx < sym2->idx ? -1 : sym1->idx > sym2->idx ? 1 : 0;
 }
 
-/**
+/*
  * Write a bank's contents to the sym file
  * @param bankSections The bank's sections
  */
@@ -357,7 +353,7 @@
 	free(symList);
 }
 
-/**
+/*
  * Write a bank's contents to the map file
  * @param bankSections The bank's sections
  * @return The bank's used space
@@ -445,7 +441,7 @@
 	return used;
 }
 
-/**
+/*
  * Write the total used space by section type to the map file
  * @param usedMap The total used space by section type
  */
@@ -471,9 +467,7 @@
 	}
 }
 
-/**
- * Writes the sym and/or map files, if applicable.
- */
+// Writes the sym and/or map files, if applicable.
 static void writeSymAndMap(void)
 {
 	if (!symFileName && !mapFileName)
--- a/src/link/patch.c
+++ b/src/link/patch.c
@@ -63,11 +63,9 @@
 			realloc(stack.values, sizeof(*stack.values) * stack.capacity);
 		stack.errorFlags =
 			realloc(stack.errorFlags, sizeof(*stack.errorFlags) * stack.capacity);
-		/*
-		 * Static analysis tools complain that the capacity might become
-		 * zero due to overflow, but fail to realize that it's caught by
-		 * the overflow check above. Hence the stringent check below.
-		 */
+		// Static analysis tools complain that the capacity might become
+		// zero due to overflow, but fail to realize that it's caught by
+		// the overflow check above. Hence the stringent check below.
 		if (!stack.values || !stack.errorFlags || !stack.capacity)
 			err("Failed to resize RPN stack");
 	}
@@ -97,7 +95,7 @@
 	free(stack.errorFlags);
 }
 
-/* RPN operators */
+// RPN operators
 
 static uint32_t getRPNByte(uint8_t const **expression, int32_t *size,
 			   struct FileStackNode const *node, uint32_t lineNo)
@@ -111,10 +109,10 @@
 static struct Symbol const *getSymbol(struct Symbol const * const *symbolList,
 				      uint32_t index)
 {
-	assert(index != (uint32_t)-1); /* PC needs to be handled specially, not here */
+	assert(index != (uint32_t)-1); // PC needs to be handled specially, not here
 	struct Symbol const *symbol = symbolList[index];
 
-	/* If the symbol is defined elsewhere... */
+	// If the symbol is defined elsewhere...
 	if (symbol->type == SYMTYPE_IMPORT)
 		return sym_GetSymbol(symbol->name);
 
@@ -121,7 +119,7 @@
 	return symbol;
 }
 
-/**
+/*
  * Compute a patch's value from its RPN string.
  * @param patch The patch to compute the value of
  * @param section The section the patch is contained in
@@ -132,7 +130,7 @@
 static int32_t computeRPNExpr(struct Patch const *patch,
 			      struct Symbol const * const *fileSymbols)
 {
-/* Small shortcut to avoid a lot of repetition */
+// Small shortcut to avoid a lot of repetition
 #define popRPN() popRPN(patch->src, patch->lineNo)
 
 	uint8_t const *expression = patch->rpnExpression;
@@ -147,13 +145,10 @@
 
 		isError = false;
 
-		/*
-		 * Friendly reminder:
-		 * Be VERY careful with two `popRPN` in the same expression.
-		 * C does not guarantee order of evaluation of operands!!
-		 * So, if there are two `popRPN` in the same expression, make
-		 * sure the operation is commutative.
-		 */
+		// Be VERY careful with two `popRPN` in the same expression.
+		// C does not guarantee order of evaluation of operands!!
+		// So, if there are two `popRPN` in the same expression, make
+		// sure the operation is commutative.
 		switch (command) {
 			struct Symbol const *symbol;
 			char const *name;
@@ -295,11 +290,9 @@
 			break;
 
 		case RPN_BANK_SECT:
-			/*
-			 * `expression` is not guaranteed to be '\0'-terminated. If it is not,
-			 * `getRPNByte` will have a fatal internal error.
-			 * In either case, `getRPNByte` will not free `expression`.
-			 */
+			// `expression` is not guaranteed to be '\0'-terminated. If it is not,
+			// `getRPNByte` will have a fatal internal error.
+			// In either case, `getRPNByte` will not free `expression`.
 			name = (char const *)expression;
 			while (getRPNByte(&expression, &size, patch->src, patch->lineNo))
 				;
@@ -329,7 +322,7 @@
 			break;
 
 		case RPN_SIZEOF_SECT:
-			/* This has assumptions commented in the `RPN_BANK_SECT` case above. */
+			// This has assumptions commented in the `RPN_BANK_SECT` case above.
 			name = (char const *)expression;
 			while (getRPNByte(&expression, &size, patch->src, patch->lineNo))
 				;
@@ -348,7 +341,7 @@
 			break;
 
 		case RPN_STARTOF_SECT:
-			/* This has assumptions commented in the `RPN_BANK_SECT` case above. */
+			// This has assumptions commented in the `RPN_BANK_SECT` case above.
 			name = (char const *)expression;
 			while (getRPNByte(&expression, &size, patch->src, patch->lineNo))
 				;
@@ -381,9 +374,8 @@
 
 		case RPN_RST:
 			value = popRPN();
-			/* Acceptable values are 0x00, 0x08, 0x10, ..., 0x38
-			 * They can be easily checked with a bitmask
-			 */
+			// Acceptable values are 0x00, 0x08, 0x10, ..., 0x38
+			// They can be easily checked with a bitmask
 			if (value & ~0x38) {
 				if (!isError)
 					error(patch->src, patch->lineNo,
@@ -406,7 +398,7 @@
 				value |= getRPNByte(&expression, &size,
 						    patch->src, patch->lineNo) << shift;
 
-			if (value == -1) { /* PC */
+			if (value == -1) { // PC
 				if (!patch->pcSection) {
 					error(patch->src, patch->lineNo,
 					      "PC has no value outside a section");
@@ -424,7 +416,7 @@
 					isError = true;
 				} else {
 					value = symbol->value;
-					/* Symbols attached to sections have offsets */
+					// Symbols attached to sections have offsets
 					if (symbol->section)
 						value += symbol->section->org;
 				}
@@ -461,8 +453,8 @@
 				fatal(assert->patch.src, assert->patch.lineNo, "%s",
 				      assert->message[0] ? assert->message
 							 : "assert failure");
-				/* Not reached */
-				break; /* Here so checkpatch doesn't complain */
+				// Not reached
+				break; // Here so checkpatch doesn't complain
 			case ASSERT_ERROR:
 				error(assert->patch.src, assert->patch.lineNo, "%s",
 				      assert->message[0] ? assert->message
@@ -491,7 +483,7 @@
 	freeRPNStack();
 }
 
-/**
+/*
  * Applies all of a section's patches
  * @param section The section to patch
  * @param arg Ignored callback arg
@@ -506,7 +498,7 @@
 							section->fileSymbols);
 		uint16_t offset = patch->offset + section->offset;
 
-		/* `jr` is quite unlike the others... */
+		// `jr` is quite unlike the others...
 		if (patch->type == PATCHTYPE_JR) {
 			// Offset is relative to the byte *after* the operand
 			// PC as operand to `jr` is lower than reference PC by 2
@@ -519,7 +511,7 @@
 				      jumpOffset);
 			dataSection->data[offset] = jumpOffset & 0xFF;
 		} else {
-			/* Patch a certain number of bytes */
+			// Patch a certain number of bytes
 			struct {
 				uint8_t size;
 				int32_t min;
@@ -544,7 +536,7 @@
 	}
 }
 
-/**
+/*
  * Applies all of a section's patches, iterating over "components" of
  * unionized sections
  * @param section The section to patch
--- a/src/link/script.c
+++ b/src/link/script.c
@@ -41,7 +41,7 @@
 		     linkerScriptName, lineNo);
 
 	if (fileStackIndex == fileStackSize) {
-		if (!fileStackSize) /* Init file stack */
+		if (!fileStackSize) // Init file stack
 			fileStackSize = 4;
 		fileStackSize *= 2;
 		fileStack = realloc(fileStack, sizeof(*fileStack) * fileStackSize);
@@ -88,7 +88,7 @@
 	return c == '\r' || c == '\n';
 }
 
-/**
+/*
  * Try parsing a number, in base 16 if it begins with a dollar,
  * in base 10 otherwise
  * @param str The number to parse
@@ -108,7 +108,7 @@
 		base = 16;
 	}
 
-	/* An empty string is not a number */
+	// An empty string is not a number
 	if (!*str)
 		return false;
 
@@ -188,16 +188,16 @@
 	static struct LinkerScriptToken token;
 	int curchar;
 
-	/* If the token has a string, make sure to avoid leaking it */
+	// If the token has a string, make sure to avoid leaking it
 	if (token.type == TOKEN_STRING)
 		free(token.attr.string);
 
-	/* Skip initial whitespace... */
+	// Skip initial whitespace...
 	do
 		curchar = nextChar();
 	while (isWhiteSpace(curchar));
 
-	/* If this is a comment, skip to the end of the line */
+	// If this is a comment, skip to the end of the line
 	if (curchar == ';') {
 		do {
 			curchar = nextChar();
@@ -207,22 +207,22 @@
 	if (curchar == EOF) {
 		token.type = TOKEN_EOF;
 	} else if (isNewline(curchar)) {
-		/* If we have a newline char, this is a newline token */
+		// If we have a newline char, this is a newline token
 		token.type = TOKEN_NEWLINE;
 
 		if (curchar == '\r') {
-			/* Handle CRLF */
+			// Handle CRLF
 			curchar = nextChar();
 			if (curchar != '\n')
 				ungetc(curchar, linkerScript);
 		}
 	} else if (curchar == '"') {
-		/* If we have a string start, this is a string */
+		// If we have a string start, this is a string
 		token.type = TOKEN_STRING;
-		token.attr.string = NULL; /* Force initial alloc */
+		token.attr.string = NULL; // Force initial alloc
 
 		size_t size = 0;
-		size_t capacity = 16; /* Half of the default capacity */
+		size_t capacity = 16; // Half of the default capacity
 
 		do {
 			curchar = nextChar();
@@ -230,10 +230,10 @@
 				errx("%s(%" PRIu32 "): Unterminated string",
 				     linkerScriptName, lineNo);
 			} else if (curchar == '"') {
-				/* Quotes force a string termination */
+				// Quotes force a string termination
 				curchar = '\0';
 			} else if (curchar == '\\') {
-				/* Backslashes are escape sequences */
+				// Backslashes are escape sequences
 				curchar = nextChar();
 				if (curchar == EOF || isNewline(curchar))
 					errx("%s(%" PRIu32 "): Unterminated string",
@@ -259,10 +259,10 @@
 			token.attr.string[size++] = curchar;
 		} while (curchar);
 	} else {
-		/* This is either a number, command or bank, that is: a word */
+		// This is either a number, command or bank, that is: a word
 		char *str = NULL;
 		size_t size = 0;
-		size_t capacity = 8; /* Half of the default capacity */
+		size_t capacity = 8; // Half of the default capacity
 
 		for (;;) {
 			if (size >= capacity || str == NULL) {
@@ -279,7 +279,7 @@
 				break;
 
 			curchar = nextChar();
-			/* Whitespace, a newline or a comment end the token */
+			// Whitespace, a newline or a comment end the token
 			if (isWhiteSpace(curchar) || isNewline(curchar) || curchar == ';') {
 				ungetc(curchar, linkerScript);
 				curchar = '\0';
@@ -288,7 +288,7 @@
 
 		token.type = TOKEN_INVALID;
 
-		/* Try to match a command */
+		// Try to match a command
 		for (enum LinkerScriptCommand i = 0; i < COMMAND_INVALID; i++) {
 			if (!strcmp(commands[i], str)) {
 				token.type = TOKEN_COMMAND;
@@ -298,7 +298,7 @@
 		}
 
 		if (token.type == TOKEN_INVALID) {
-			/* Try to match a bank specifier */
+			// Try to match a bank specifier
 			for (enum SectionType type = 0; type < SECTTYPE_INVALID; type++) {
 				if (!strcmp(sectionTypeInfo[type].name, str)) {
 					token.type = TOKEN_BANK;
@@ -309,13 +309,13 @@
 		}
 
 		if (token.type == TOKEN_INVALID) {
-			/* Try to match an include token */
+			// Try to match an include token
 			if (!strcmp("INCLUDE", str))
 				token.type = TOKEN_INCLUDE;
 		}
 
 		if (token.type == TOKEN_INVALID) {
-			/* None of the strings matched, do we have a number? */
+			// None of the strings matched, do we have a number?
 			if (tryParseNumber(str, &token.attr.number))
 				token.type = TOKEN_NUMBER;
 			else
@@ -354,14 +354,14 @@
 enum LinkerScriptParserState {
 	PARSER_FIRSTTIME,
 	PARSER_LINESTART,
-	PARSER_INCLUDE, /* After an INCLUDE token */
+	PARSER_INCLUDE, // After an INCLUDE token
 	PARSER_LINEEND
 };
 
-/* Part of internal state, but has data that needs to be freed */
+// Part of internal state, but has data that needs to be freed
 static uint16_t *curaddr[SECTTYPE_INVALID];
 
-/* Put as global to ensure it's initialized only once */
+// Put as global to ensure it's initialized only once
 static enum LinkerScriptParserState parserState = PARSER_FIRSTTIME;
 
 struct SectionPlacement *script_NextSection(void)
@@ -373,7 +373,7 @@
 	if (parserState == PARSER_FIRSTTIME) {
 		lineNo = 1;
 
-		/* Init PC for all banks */
+		// Init PC for all banks
 		for (enum SectionType i = 0; i < SECTTYPE_INVALID; i++) {
 			curaddr[i] = malloc(sizeof(*curaddr[i]) * nbbanks(i));
 			for (uint32_t b = 0; b < nbbanks(i); b++)
@@ -427,7 +427,7 @@
 				lineNo++;
 				break;
 
-			/* A stray string is a section name */
+			// A stray string is a section name
 			case TOKEN_STRING:
 				parserState = PARSER_LINEEND;
 
@@ -454,15 +454,11 @@
 
 				token = nextToken();
 				hasArg = token->type == TOKEN_NUMBER;
-				/*
-				 * Leaving `arg` uninitialized when `!hasArg`
-				 * causes GCC to warn about its use as an
-				 * argument to `processCommand`. This cannot
-				 * happen because `hasArg` has to be true, but
-				 * silence the warning anyways.
-				 * I dislike doing this because it could swallow
-				 * actual errors, but I don't have a choice.
-				 */
+				// Leaving `arg` uninitialized when `!hasArg` causes GCC to warn
+				// about its use as an argument to `processCommand`. This cannot
+				// happen because `hasArg` has to be true, but silence the warning
+				// anyways. I dislike doing this because it could swallow actual
+				// errors, but I don't have a choice.
 				arg = hasArg ? token->attr.number : 0;
 
 				if (tokType == TOKEN_COMMAND) {
@@ -474,12 +470,10 @@
 						     linkerScriptName, lineNo);
 
 					processCommand(attr.command, arg, &curaddr[placement.type][bankID]);
-				} else { /* TOKEN_BANK */
+				} else { // TOKEN_BANK
 					placement.type = attr.secttype;
-					/*
-					 * If there's only one bank,
-					 * specifying the number is optional.
-					 */
+					// If there's only one bank,
+					// specifying the number is optional.
 					if (!hasArg && nbbanks(placement.type) != 1)
 						errx("%s(%" PRIu32 "): Didn't specify a bank number",
 						     linkerScriptName, lineNo);
@@ -497,7 +491,7 @@
 					bankID = arg - sectionTypeInfo[placement.type].firstBank;
 				}
 
-				/* If we read a token we shouldn't have... */
+				// If we read a token we shouldn't have...
 				if (token->type != TOKEN_NUMBER)
 					goto lineend;
 				break;
@@ -513,9 +507,9 @@
 				errx("%s(%" PRIu32 "): Expected a file name after INCLUDE",
 				     linkerScriptName, lineNo);
 
-			/* Switch to that file */
+			// Switch to that file
 			pushFile(token->attr.string);
-			/* The file stack took ownership of the string */
+			// The file stack took ownership of the string
 			token->attr.string = NULL;
 
 			parserState = PARSER_LINESTART;
--- a/src/link/sdas_obj.c
+++ b/src/link/sdas_obj.c
@@ -1,3 +1,10 @@
+/*
+ * This file is part of RGBDS.
+ *
+ * Copyright (c) 2022, Eldred Habert and RGBDS contributors.
+ *
+ * SPDX-License-Identifier: MIT
+ */
 
 #include <assert.h>
 #include <ctype.h>
--- a/src/link/section.c
+++ b/src/link/section.c
@@ -166,7 +166,7 @@
 		// `data` pointer, or a size of 0.
 		if (other->data) {
 			if (target->data) {
-				/* Ensure we're not allocating 0 bytes */
+				// Ensure we're not allocating 0 bytes
 				target->data = realloc(target->data,
 						       sizeof(*target->data) * target->size + 1);
 				if (!target->data)
@@ -177,7 +177,7 @@
 				target->data = other->data;
 				other->data = NULL; // Prevent a double free()
 			}
-			/* Adjust patches' PC offsets */
+			// Adjust patches' PC offsets
 			for (uint32_t patchID = 0; patchID < other->nbPatches; patchID++)
 				other->patches[patchID].pcOffset += other->offset;
 		} else if (target->data) {
@@ -195,7 +195,7 @@
 
 void sect_AddSection(struct Section *section)
 {
-	/* Check if the section already exists */
+	// Check if the section already exists
 	struct Section *other = hash_GetElement(sections, section->name);
 
 	if (other) {
@@ -210,7 +210,7 @@
 		errx("Section \"%s\" is of type %s, which cannot be unionized",
 		     section->name, sectionTypeInfo[section->type].name);
 	} else {
-		/* If not, add it */
+		// If not, add it
 		hash_AddElement(sections, section->name, section);
 	}
 }
@@ -229,7 +229,7 @@
 {
 	(void)ptr;
 
-	/* Sanity check the section's type */
+	// Sanity check the section's type
 
 	if (section->type < 0 || section->type >= SECTTYPE_INVALID) {
 		error(NULL, 0, "Section \"%s\" has an invalid type", section->name);
@@ -254,14 +254,12 @@
 		error(NULL, 0, "%s: VRAM bank 1 can't be used with option -d",
 		     section->name);
 
-	/*
-	 * Check if alignment is reasonable, this is important to avoid UB
-	 * An alignment of zero is equivalent to no alignment, basically
-	 */
+	// Check if alignment is reasonable, this is important to avoid UB
+	// An alignment of zero is equivalent to no alignment, basically
 	if (section->isAlignFixed && section->alignMask == 0)
 		section->isAlignFixed = false;
 
-	/* Too large an alignment may not be satisfiable */
+	// Too large an alignment may not be satisfiable
 	if (section->isAlignFixed && (section->alignMask & sectionTypeInfo[section->type].startAddr))
 		error(NULL, 0, "%s: %s sections cannot be aligned to $%04x bytes",
 		     section->name, sectionTypeInfo[section->type].name, section->alignMask + 1);
@@ -274,12 +272,12 @@
 			: "Cannot place section \"%s\" in bank %" PRIu32 ", it must be between %" PRIu32 " and %" PRIu32,
 		     section->name, section->bank, minbank, maxbank);
 
-	/* Check if section has a chance to be placed */
+	// Check if section has a chance to be placed
 	if (section->size > sectionTypeInfo[section->type].size)
 		error(NULL, 0, "Section \"%s\" is bigger than the max size for that type: %#" PRIx16 " > %#" PRIx16,
 		     section->name, section->size, sectionTypeInfo[section->type].size);
 
-	/* Translate loose constraints to strong ones when they're equivalent */
+	// Translate loose constraints to strong ones when they're equivalent
 
 	if (minbank == maxbank) {
 		section->bank = minbank;
@@ -287,7 +285,7 @@
 	}
 
 	if (section->isAddressFixed) {
-		/* It doesn't make sense to have both org and alignment set */
+		// It doesn't make sense to have both org and alignment set
 		if (section->isAlignFixed) {
 			if ((section->org & section->alignMask) != section->alignOfs)
 				error(NULL, 0, "Section \"%s\"'s fixed address doesn't match its alignment",
@@ -295,7 +293,7 @@
 			section->isAlignFixed = false;
 		}
 
-		/* Ensure the target address is valid */
+		// Ensure the target address is valid
 		if (section->org < sectionTypeInfo[section->type].startAddr
 		 || section->org > endaddr(section->type))
 			error(NULL, 0, "Section \"%s\"'s fixed address %#" PRIx16 " is outside of range [%#"
--- a/src/link/symbol.c
+++ b/src/link/symbol.c
@@ -40,7 +40,7 @@
 
 void sym_AddSymbol(struct Symbol *symbol)
 {
-	/* Check if the symbol already exists */
+	// Check if the symbol already exists
 	struct Symbol *other = hash_GetElement(symbols, symbol->name);
 
 	if (other) {
@@ -53,7 +53,7 @@
 		exit(1);
 	}
 
-	/* If not, add it */
+	// If not, add it
 	hash_AddElement(symbols, symbol->name, symbol);
 }
 
--- a/src/linkdefs.c
+++ b/src/linkdefs.c
@@ -1,3 +1,10 @@
+/*
+ * This file is part of RGBDS.
+ *
+ * Copyright (c) 2022, RGBDS contributors.
+ *
+ * SPDX-License-Identifier: MIT
+ */
 
 #include "linkdefs.h"
 
--- a/src/opmath.c
+++ b/src/opmath.c
@@ -6,9 +6,7 @@
  * SPDX-License-Identifier: MIT
  */
 
-/*
- * Mathematical operators that don't reuse C's behavior
- */
+// Mathematical operators that don't reuse C's behavior
 
 #include <stdint.h>
 
--- a/test/gfx/rgbgfx_test.cpp
+++ b/test/gfx/rgbgfx_test.cpp
@@ -1,3 +1,10 @@
+/*
+ * This file is part of RGBDS.
+ *
+ * Copyright (c) 2022, Eldred Habert and RGBDS contributors.
+ *
+ * SPDX-License-Identifier: MIT
+ */
 
 // For `execProg` (Windows is its special little snowflake again)
 #if !defined(_MSC_VER) && !defined(__MINGW32__)
@@ -125,7 +132,7 @@
 
 	Rgba const &pixel(uint32_t x, uint32_t y) const { return pixels[y * width + x]; }
 
-	/**
+	/*
 	 * Reads a PNG and notes all of its colors
 	 *
 	 * This code is more complicated than strictly necessary, but that's because of the API
@@ -298,7 +305,7 @@
 		fatal("%s returned with status %d", name, info.si_status);
 	}
 
-#else /* defined(_MSC_VER) || defined(__MINGW32__) */
+#else // defined(_MSC_VER) || defined(__MINGW32__)
 
 	auto winStrerror = [](DWORD errnum) {
 		LPTSTR buf;