Monitor: a line assembler

a <address>, then instructions until a line that is just a dot.

The syntax is the assembler's own: a selector rides on the mnemonic as LDA.0
or LDD.0.1, and leaving one off means Data Pointer 0 exactly as it does in a
source file, so nothing learned at the monitor has to be unlearned when
writing a program. Case is folded, since the assembler does not care either.

Numbers are hexadecimal and bare. A source file writes 0x2000 or 0d16 because
it has both and must say which; a monitor has one and says so once, in the
manual, rather than on every line.

It reads the same table the disassembler does, searched the other way round,
which is the point of it being a table rather than two lists: what a writes,
d reads back, and neither can drift from the other or from the assembler both
were generated from. Instruction lengths come from the shared shape table
too, so the cursor cannot get out of step with what was written.

THE WHOLE LINE IS UNDERSTOOD BEFORE ANYTHING IS WRITTEN. Emitting the opcode
first and discovering a missing operand afterwards leaves half an instruction
in memory, which the next line usually covers up and the last line of a
session does not. Written that way first and fixed.

What cannot be written is a label, and that is the whole difference between
this and the assembler proper: a label is a promise to fill an address in
later, and later is what a line at a time does not have.

The recorded test now types in a complete program - a string poked into Data
Memory, instructions assembled into Program Memory, and the result run - and
includes a lower case mnemonic, both selector forms, an instruction that does
not exist and one missing its value, so the refusals sit beside the successes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Anachronaut
2026-08-19 22:29:50 -04:00
co-authored by Claude Opus 5
parent c23adb2836
commit 3b800a69e8
8 changed files with 475 additions and 6 deletions
+2 -2
View File
@@ -3,11 +3,11 @@ CosmOS
> two stops, and what the registers were at each
break at 200E
A 11 B 22 Q 00 status 00
DP0 1030 DP1 05EF DP2 039A DP3 2000 SP FFFF
DP0 1030 DP1 0661 DP2 039A DP3 2000 SP FFFF
press a key
break at 2023
A 44 B 55 Q 00 status 00
DP0 1000 DP1 05EF DP2 039A DP3 2000 SP FFF5
DP0 1000 DP1 0661 DP2 039A DP3 2000 SP FFF5
press a key
carried on to the end
finished
+1 -1
View File
@@ -8,7 +8,7 @@ finished
cd
the console has been handed back
finished
> > x examine, d disassemble, s set, b bank, g go, exit leaves
> > x examine, d disassemble, a assemble, s set, b bank, g go, exit leaves
* bank 00
* FE00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
FE10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
+15 -1
View File
@@ -1,5 +1,5 @@
CosmOS
> x examine, d disassemble, s set, b bank, g go, exit leaves
> x examine, d disassemble, a assemble, s set, b bank, g go, exit leaves
* b <program|data|number>
* there is no such bank
* loaded, starting at 2000
@@ -46,6 +46,20 @@ finished
800A 00 ADD
800B 00 ADD
800C 00 ADD
* bank 01
* * bank 00
* 8200: 8204: 8206: 8208: 820B: no such instruction
820B: that one needs a value after it
820B: 820D: * 8200 47 00 81 00 SETD.0 8100
8204 18 10 SWI 10
8206 42 02 LDA.2
8208 4A 00 01 LDD.0.1
820B 18 12 SWI 12
820D 00 ADD
820E 00 ADD
820F 00 ADD
* hello, typed
finished
* > greet.sbx 210
hello.sbx 52
Life.sbx 1411