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:
co-authored by
Claude Opus 5
parent
12cb489268
commit
4fd8bf7b3f
@@ -262,7 +262,7 @@ dirCheck:
|
||||
; A file's length is its block count times 256 plus its tail, which is the block count
|
||||
; in the high byte and the tail in the low one. Nothing has to multiply anything.
|
||||
SETD.0 SbfsFileBlocks
|
||||
DPUP.0 0d01
|
||||
INCD.0
|
||||
LDA.0
|
||||
SETD.1 DirSize
|
||||
STA.1
|
||||
@@ -1281,14 +1281,14 @@ breakAddress:
|
||||
SETD.0 SRegText
|
||||
PSHD.3
|
||||
POPD.1
|
||||
DPUP.1 0d1
|
||||
INCD.1
|
||||
CALL breakByte
|
||||
|
||||
; And which bits of it those are, since a debug dump that makes you look the number up is
|
||||
; only half of one. Halt is not among them: the machine is plainly not halted.
|
||||
PSHD.3
|
||||
POPD.1
|
||||
DPUP.1 0d1
|
||||
INCD.1
|
||||
LDA.1
|
||||
PSHA
|
||||
INIB 0x01
|
||||
@@ -2283,12 +2283,12 @@ assembleNeedsValue:
|
||||
|
||||
; DP0 is a two byte address and A is how far to move it on.
|
||||
stepCursor:
|
||||
DPUP.0 0d01
|
||||
INCD.0
|
||||
LDB.0
|
||||
CCF
|
||||
ADD
|
||||
STQ.0
|
||||
DPDN.0 0d01
|
||||
DECD.0
|
||||
LDA.0
|
||||
RSTB
|
||||
ADD
|
||||
|
||||
@@ -101,7 +101,7 @@ sbfsFind:
|
||||
SETD.1 SbfsBlock
|
||||
CALL sbfsCopyWord
|
||||
SETD.0 SbfsDirBlocks
|
||||
DPUP.0 0d01
|
||||
INCD.0
|
||||
LDA.0
|
||||
SETD.1 SbfsLeft
|
||||
STA.1 ; Only the low byte: a directory of 256 blocks is 2048 files.
|
||||
@@ -163,7 +163,7 @@ sbfsFindFound:
|
||||
|
||||
PSHD.3
|
||||
POPD.0
|
||||
DPUP.0 0d01
|
||||
INCD.0
|
||||
SETD.1 SbfsFileStart
|
||||
CALL sbfsCopyWord
|
||||
|
||||
@@ -208,7 +208,7 @@ sbfsFirst:
|
||||
SETD.1 SbfsWalkBlock
|
||||
CALL sbfsCopyWord
|
||||
SETD.0 SbfsDirBlocks
|
||||
DPUP.0 0d01
|
||||
INCD.0
|
||||
LDA.0
|
||||
SETD.1 SbfsWalkLeft
|
||||
STA.1 ; Only the low byte, the same as sbfsFind.
|
||||
@@ -308,7 +308,7 @@ sbfsWalkEnd:
|
||||
sbfsWalkTake:
|
||||
SETD.1 SbfsWalkAt
|
||||
LDD.0.1
|
||||
DPUP.0 0d01
|
||||
INCD.0
|
||||
SETD.1 SbfsFileStart
|
||||
CALL sbfsCopyWord
|
||||
|
||||
@@ -428,7 +428,7 @@ sbfsRead:
|
||||
CALL sbfsCopyWord
|
||||
|
||||
SETD.0 SbfsFileBlocks
|
||||
DPUP.0 0d01
|
||||
INCD.0
|
||||
LDA.0
|
||||
SETD.1 SbfsLeft
|
||||
STA.1
|
||||
@@ -456,7 +456,7 @@ sbfsReadGot:
|
||||
|
||||
; On by a whole block. DPUP carries one byte at a time, so 256 takes two of them.
|
||||
DPUP.3 0xFF
|
||||
DPUP.3 0x01
|
||||
INCD.3
|
||||
SETD.0 SbfsBlock
|
||||
CALL sbfsStepWord
|
||||
|
||||
@@ -534,7 +534,7 @@ sbfsEntryBounds:
|
||||
POPD.3
|
||||
PSHD.3
|
||||
POPD.0
|
||||
DPUP.0 0d01
|
||||
INCD.0
|
||||
SETD.1 SbfsEntryStart
|
||||
CALL sbfsCopyWord
|
||||
SETD.0 SbfsEntryEnd
|
||||
@@ -586,7 +586,7 @@ sbfsAllocTry:
|
||||
SETD.1 SbfsBlock
|
||||
CALL sbfsCopyWord
|
||||
SETD.0 SbfsDirBlocks
|
||||
DPUP.0 0d01
|
||||
INCD.0
|
||||
LDA.0
|
||||
SETD.1 SbfsLeft
|
||||
STA.1
|
||||
@@ -682,16 +682,16 @@ sbfsSetWord:
|
||||
|
||||
; The two byte number at DP0 becomes itself less the one at DP2.
|
||||
sbfsSubWord:
|
||||
DPUP.0 0d01
|
||||
DPUP.2 0d01
|
||||
INCD.0
|
||||
INCD.2
|
||||
LDA.0
|
||||
LDB.2
|
||||
CCF
|
||||
SUB
|
||||
MVQA
|
||||
STA.0
|
||||
DPDN.0 0d01
|
||||
DPDN.2 0d01
|
||||
DECD.0
|
||||
DECD.2
|
||||
LDA.0
|
||||
LDB.2
|
||||
SUB ; Borrows in from the low half.
|
||||
@@ -730,7 +730,7 @@ sbfsCreate:
|
||||
SETD.1 SbfsBlock
|
||||
CALL sbfsCopyWord
|
||||
SETD.0 SbfsDirBlocks
|
||||
DPUP.0 0d01
|
||||
INCD.0
|
||||
LDA.0
|
||||
SETD.1 SbfsLeft
|
||||
STA.1
|
||||
@@ -781,7 +781,7 @@ sbfsCreateFill:
|
||||
|
||||
PSHD.3
|
||||
POPD.1
|
||||
DPUP.1 0d01
|
||||
INCD.1
|
||||
SETD.0 SbfsFileStart
|
||||
CALL sbfsCopyWord
|
||||
|
||||
@@ -859,7 +859,7 @@ sbfsWriteFile:
|
||||
CALL sbfsSetWord
|
||||
CALL sbfsFileExtent
|
||||
SETD.0 SbfsWantBlocks
|
||||
DPUP.0 0d01
|
||||
INCD.0
|
||||
LDA.0
|
||||
SETD.1 SbfsLeft
|
||||
STA.1
|
||||
@@ -872,7 +872,7 @@ sbfsWriteLoop:
|
||||
CALL sbfsWriteBlock
|
||||
BNQ sbfsWriteFailed
|
||||
DPUP.3 0xFF
|
||||
DPUP.3 0x01
|
||||
INCD.3
|
||||
SETD.0 SbfsBlock
|
||||
CALL sbfsStepWord
|
||||
SETD.0 SbfsLeft
|
||||
@@ -983,12 +983,12 @@ sbfsCopyWord:
|
||||
|
||||
; Adds one to the two byte number at DP0.
|
||||
sbfsStepWord:
|
||||
DPUP.0 0d01
|
||||
INCD.0
|
||||
LDA.0
|
||||
INCA
|
||||
STA.0
|
||||
BNC sbfsStepDone ; It did not wrap, so the high byte is untouched.
|
||||
DPDN.0 0d01
|
||||
DECD.0
|
||||
LDA.0
|
||||
INCA
|
||||
STA.0
|
||||
@@ -998,16 +998,16 @@ sbfsStepDone:
|
||||
; The two byte number at DP0 becomes itself plus the one at DP2. Only memory changes, so
|
||||
; it survives the return: a routine cannot hand back a pointer or a register.
|
||||
sbfsAddWord:
|
||||
DPUP.0 0d01
|
||||
DPUP.2 0d01
|
||||
INCD.0
|
||||
INCD.2
|
||||
LDA.0
|
||||
LDB.2
|
||||
CCF
|
||||
ADD
|
||||
MVQA
|
||||
STA.0
|
||||
DPDN.0 0d01
|
||||
DPDN.2 0d01
|
||||
DECD.0
|
||||
DECD.2
|
||||
LDA.0
|
||||
LDB.2
|
||||
ADD ; Carries in from the low half. Nothing between the two touches it.
|
||||
|
||||
Reference in New Issue
Block a user