diff --git a/docs/rgbasm.5.html b/docs/rgbasm.5.html
index a9194599..88776565 100644
--- a/docs/rgbasm.5.html
+++ b/docs/rgbasm.5.html
@@ -42,6 +42,12 @@ Example:
All pseudo‐ops, mnemonics and registers (reserved keywords) are
case‐insensitive and all labels are case‐sensitive.
+
+There are two syntaxes for comments. In both cases, a comment ends at the end of
+ the line. The most common one is: anything that follows a semicolon
+ ";" (that isn't inside a string) is a comment. There is another
+ format: anything that follows a "*" that is placed right at the
+ start of a line is a comment.
Before you can start writing code, you must define a section. This tells the
assembler what kind of information follows and, if it is code, where to put
diff --git a/src/asm/lexer.c b/src/asm/lexer.c
index 1462383a..0c728784 100644
--- a/src/asm/lexer.c
+++ b/src/asm/lexer.c
@@ -159,6 +159,8 @@ YY_BUFFER_STATE yy_create_buffer(FILE *f)
pBuffer->pBuffer[size + 1] = 0;
pBuffer->nBufferSize = size + 1;
+ /* Convert all line endings to LF and spaces */
+
char *mem = pBuffer->pBuffer;
uint32_t instring = 0;
@@ -171,20 +173,44 @@ YY_BUFFER_STATE yy_create_buffer(FILE *f)
} else if (instring) {
mem += 1;
} else {
- if ((mem[0] == 10 && mem[1] == 13)
- || (mem[0] == 13 && mem[1] == 10)) {
+ /* LF CR and CR LF */
+ if (((mem[0] == 10) && (mem[1] == 13))
+ || ((mem[0] == 13) && (mem[1] == 10))) {
mem[0] = ' ';
mem[1] = '\n';
mem += 2;
- } else if (mem[0] == 10 || mem[0] == 13) {
+ /* LF and CR */
+ } else if ((mem[0] == 10) || (mem[0] == 13)) {
mem[0] = '\n';
mem += 1;
- } else if (mem[0] == '\n' && mem[1] == '*') {
+ } else {
mem += 1;
- while (!(*mem == '\n' || *mem == '\0'))
+ }
+ }
+ }
+
+ /* Remove comments */
+
+ mem = pBuffer->pBuffer;
+ instring = 0;
+
+ while (*mem) {
+ if (*mem == '\"')
+ instring = 1 - instring;
+
+ if ((mem[0] == '\\') && (mem[1] == '\"' || mem[1] == '\\')) {
+ mem += 2;
+ } else if (instring) {
+ mem += 1;
+ } else {
+ /* Comments that start with ; anywhere in a line */
+ if (*mem == ';') {
+ while (!((*mem == '\n') || (*mem == '\0')))
*mem++ = ' ';
- } else if (*mem == ';') {
- while (!(*mem == '\n' || *mem == '\0'))
+ /* Comments that start with * at the start of a line */
+ } else if ((mem[0] == '\n') && (mem[1] == '*')) {
+ mem += 1;
+ while (!((*mem == '\n') || (*mem == '\0')))
*mem++ = ' ';
} else {
mem += 1;
diff --git a/src/asm/rgbasm.5 b/src/asm/rgbasm.5
index b3a00fd9..64a028fa 100644
--- a/src/asm/rgbasm.5
+++ b/src/asm/rgbasm.5
@@ -30,6 +30,12 @@ Example:
.Pp
All pseudo‐ops, mnemonics and registers (reserved keywords) are case‐insensitive
and all labels are case‐sensitive.
+.Pp
+There are two syntaxes for comments. In both cases, a comment ends at the end of
+the line. The most common one is: anything that follows a semicolon
+\[dq]\&;\[dq] (that isn't inside a string) is a comment. There is another
+format: anything that follows a \[dq]*\[dq] that is placed right at the start of
+a line is a comment.
.Ss Sections
Before you can start writing code, you must define a section.
This tells the assembler what kind of information follows and, if it is code,