Step a Data Pointer with INCD and DECD, not DPUP and DPDN by one

DPUP takes an immediate, so an offset of one is legal and does exactly the
right thing. It is also three bytes where INCD is two, and reads as "offset
the pointer up by one" where INCD reads as "step the pointer".

56 of them across 15 files: the system, the assembler, the editor, and eight
test programs. CosmOS is 9,564 bytes to 9,537, the native assembler 11,648
to 11,635, and every program in the repository together 49 bytes lighter.

The worst offender was numbers.asm, written this week, where every sixteen
bit helper reaches the low byte and comes back the long way round. It is the
file every other part of the assembler includes, so it is the first thing
anybody reads when they go looking - and it was teaching them the long way.
Pattern matched off sbfs.asm rather than off the instruction table I had
just embedded in two programs.

THIS IS NOT TWO WAYS TO DO ONE THING. DPUP takes an arbitrary number, so one
is inevitably among them; INCD earns its place by making the common case a
byte cheaper. The overlap is structural and the choice is a usage question,
which is a linter's job rather than an ISA's - "DPUP.n 0d01: INCD.n does
this in a byte less" is a mechanical rule with no judgement in it.

Nothing needed re-recording, which was not a foregone conclusion: cosmosBreak
prints the system addresses the registers happened to hold, and they did not
move. Both assemblers still produce identical bytes and CosmOS still builds
itself to a fixed point.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E2JrLzFvuFX9fgi1LDRjrW
This commit is contained in:
Anachronaut
2026-08-21 18:16:27 -04:00
co-authored by Claude Opus 5
parent 12cb489268
commit 4fd8bf7b3f
15 changed files with 56 additions and 56 deletions
+4 -4
View File
@@ -653,12 +653,12 @@ appendNode:
; DP2 is a two byte count. Takes one off it.
takeOneOff:
DPUP.2 0d01
INCD.2
LDA.2
DECA
STA.2
BNC takeOneDone ; No borrow, so the high half is untouched.
DPDN.2 0d01
DECD.2
LDA.2
DECA
STA.2
@@ -766,12 +766,12 @@ printWord:
; DP0 is a two byte number, A is a byte. Adds the one to the other.
addByteToWord:
DPUP.0 0d01
INCD.0
LDB.0
CCF
ADD
STQ.0
DPDN.0 0d01
DECD.0
LDA.0
RSTB
ADD
+3 -3
View File
@@ -290,11 +290,11 @@ checksumLoop:
INCD.2
LDA.2
BNA checksumLow
DPDN.2 0d01
DECD.2
LDA.2
DECA
STA.2 ; Borrow out of the high byte.
DPUP.2 0d01
INCD.2
INIA 0xFF
STA.2
BRI checksumTest
@@ -333,7 +333,7 @@ stepIndex:
INCA
STA.2
BNC stepIndexDone
DPDN.2 0d01
DECD.2
LDA.2
INCA
STA.2