6.1 KiB
6.1 KiB
DSA Documentation Inconsistencies Analysis
1. Register Descriptions
Issue: System Registers vs Assembly-Accessible Registers
registers.mdlists MAR, STS, CIR, MDR as "System" registers- These are NOT mentioned in
dsa_assembly_reference.mdorinstruction_set.md - Resolution: System registers are internal CPU registers not directly accessible in assembly. They should be documented separately from programmer-accessible registers.
Issue: Register Naming Inconsistencies
registers.mdusesRG0-RGF(uppercase)dsa_assembly_reference.mdusesrg0-rgf(lowercase)- Resolution: Assembly syntax should be lowercase (standard convention)
Issue: NOREG Register
registers.md: "Loads/using as dest register must cause an illegal instruction trap"dsa_assembly_reference.md: "on-read/write: illegal instruction fault"- Resolution: Consistent terminology needed - use "illegal instruction fault"
2. Instruction Operand Order Inconsistencies
Issue: Load Instructions
instruction_set.md:LDB BaseReg, Offset, DestRegdsa_assembly_reference.md:LDB base_reg, dest_reg [, offset]- Resolution: Assembly reference shows standard syntax (base, dest, offset optional), instruction set shows encoding order
Issue: Store Instructions
instruction_set.md:STB SrcReg, BaseReg, Offsetdsa_assembly_reference.md:STB src_reg, base_reg [, offset]- Resolution: Consistent - offset is optional
Issue: Immediate Load Instructions
instruction_set.md:LLI DstReg, Value(destination first)dsa_assembly_reference.md:LLI imm, dest_reg(immediate first)- Resolution: Assembly reference shows gas-style syntax (source, dest), instruction set shows encoding order
Issue: Jump Instructions
instruction_set.md:JMP DestReg, Offset | Addressdsa_assembly_reference.md:JMP addr [, offset_reg]orJMP imm, offset_reg- Resolution: Different perspectives - instruction set shows encoding, assembly shows usage
3. Instruction Behavior Differences
Issue: IADD/ISUB Operands
instruction_set.md:IADD Src1, Literal, Dest(3 operands)dsa_assembly_reference.md:IADD src_reg, imm [, dest_reg](dest optional)- Resolution: Assembly allows dest to default to src_reg
Issue: SHL/SHR Operands
instruction_set.md:SHL Reg, Literal | ValRegdsa_assembly_reference.md:SHL reg, shift_amount- Resolution: Both literal and register shifts supported
4. Pseudo-Instruction Inconsistencies
Issue: PUSH/POP Expansion
pseudoinstructions.md:- PUSH =
INC SPRthenSTW register, SPR - POP =
LDW SPR, registerthenDEC SPR
- PUSH =
- Standard stack conventions suggest PUSH should decrement (grow down)
- Resolution: Clarify stack growth direction
Issue: LDB/LDH/LDW Pseudo vs Hardware
pseudoinstructions.mdlists LDB, LDH, LDW as pseudo-instructions with label addressinginstruction_set.mdlists them as hardware instructions- Resolution: Both exist - hardware instructions use registers, pseudo-instructions add label support
Issue: LWI Naming
dsa_assembly_reference.md: LWI = Load Word Immediate (load address)- Could be confused with "Load Word Immediate" (load literal value)
- Resolution: LWI specifically means "Load Word address Into register"
5. Calling Convention Details
Issue: Argument Offsets
- Calling convention says "first 3 args at offsets 8, 12, 16"
- This assumes 32-bit words (4 bytes each)
- Offset 8 is position of first argument (after return address at offset 4, and old BPR at offset 0)
- Resolution: Clarify that SPR+0 = old BPR, SPR+4 = return address, SPR+8 = first arg
Issue: Return Value Location
- Says "Store return value (if any) to
spr+8" - This overwrites the first argument
- Resolution: This is intentional - return value replaces first argument position after cleanup
6. Missing Information
From instruction_set.md not in assembly reference:
- Instruction encoding details (R-type, I-type, J-type)
- Hex opcodes for each instruction
- Alignment requirements for memory operations
- Sign extension behavior details
From assembly reference not in instruction_set:
- Complete pseudo-instruction expansions showing what they compile to
- Library examples (multiply, print)
- Detailed calling convention walkthrough
- Module system (INCLUDE directive)
From registers.md not elsewhere:
- STS (Status Register) bit layout
- Boot values for status flags
- System registers (MAR, STS, CIR, MDR)
7. Terminology Inconsistencies
- "halfword" vs "half-word" vs "16-bit value"
- "word" assumed to be 32-bit (should be explicit)
- "register" vs "reg" in syntax
- "immediate" vs "literal" vs "constant"
8. Critical Missing Details
CALL and RETURN Pseudo-instructions
- Assembly reference shows them but doesn't show their expansion
- Need to document what they expand to
Label Addressing Mode
- Shows expansions for loads/stores with labels
- Uses RGF as scratch register - should this be documented as reserved for this purpose?
Stack Direction
- Not explicitly stated whether stack grows up or down
- PUSH uses INC SPR (suggests growing up) - unusual!
Recommendations
-
Separate Documentation into Logical Layers:
- ISA Specification (hardware-level, for CPU implementers)
- Assembly Language Reference (for programmers)
- ABI/Calling Convention (for compiler/linker writers)
-
Standardize Terminology:
- Use consistent casing (lowercase for assembly mnemonics)
- Define terms clearly (word = 32-bit, halfword = 16-bit, byte = 8-bit)
- Distinguish "literal" (immediate value in code) from "address" (memory location)
-
Document Stack Convention Clearly:
- Explicitly state stack grows upward (unusual but valid)
- Show memory layout diagrams
-
Show Complete Pseudo-instruction Expansions:
- CALL, RETURN need full expansion documentation
- Document which register(s) are used as temporaries
-
Clarify Register Usage Conventions:
- ACC: used by pseudo-instructions, volatile
- RGF: used by label addressing, volatile
- RG0-RGE: general purpose, callee may use per calling convention