πŸ’Ύ Archived View for thingvellir.net β€Ί log β€Ί 2023-03-07.gmi captured on 2024-06-16 at 12:19:41. Gemini links have been rewritten to link to archived content

View Raw

More Information

⬅️ Previous capture (2023-04-19)

-=-=-=-=-=-=-

The Þog of 2023-03-07 β€” Another Fantasy ISA

This is another yet-unnamed fantasy CPU instruction set inspired by RISC-V, MIPS, and Professor Bruce Jacob's RiSC-16. It has fixed-length 16 bit instructions, 7 general purpose registers, and a zero register.

Instruction Encoding

The eight registers directly available contain 16 bit, two's-compliment integers. The zero register always returns 0, and all writes to it are ignored. Whether an instruction's immediate value is interpreted as signed or unsigned depends on the opcode.

A fault will be triggered if the program counter or a SW/LW is not word-aligned.

F   E   D   C   B   A   9   8   7   6   5   4   3   2   1   0  Bit
β”œβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 0 β”‚    rs2    β”‚    rs1    β”‚    rd     β”‚      opcode       β”‚  RRR Type
β””β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
F   E   D   C   B   A   9   8   7   6   5   4   3   2   1   0  Bit
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚     imm5      β”‚    rs1    β”‚    rd     β”‚      opcode       β”‚  RRI Type
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
F   E   D   C   B   A   9   8   7   6   5   4   3   2   1   0  Bit
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚           imm8            β”‚    rd     β”‚      opcode       β”‚  RI Type
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Opcodes

β”Œβ”€β”€β”€β”€β”€β”¬β”€β”€β”¬β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”
β”‚00000β”‚00β”‚RRRβ”‚  ADDβ”‚ rd := rs1 + rs2
β”œβ”€β”€β”€β”€β”€β”Όβ”€β”€β”Όβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€
β”‚00001β”‚01β”‚RRRβ”‚  SUBβ”‚ rd := rs1 - rs2
β”œβ”€β”€β”€β”€β”€β”Όβ”€β”€β”Όβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€
β”‚00010β”‚02β”‚RRRβ”‚  SLLβ”‚ rd := rs1 << rs2
β”œβ”€β”€β”€β”€β”€β”Όβ”€β”€β”Όβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€
β”‚00011β”‚03β”‚RRRβ”‚  SRLβ”‚ rd := rs1 >>> rs2
β”œβ”€β”€β”€β”€β”€β”Όβ”€β”€β”Όβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€
β”‚00100β”‚04β”‚RRRβ”‚  SRAβ”‚ rd := rs1 >> rs2
β”œβ”€β”€β”€β”€β”€β”Όβ”€β”€β”Όβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€
β”‚00101β”‚05β”‚RRIβ”‚  ADIβ”‚ rd := rs1 + (signed)imm5
β”œβ”€β”€β”€β”€β”€β”Όβ”€β”€β”Όβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€
β”‚00110β”‚06β”‚RI β”‚  LUIβ”‚ rd := imm8 << 8
β”œβ”€β”€β”€β”€β”€β”Όβ”€β”€β”Όβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€
β”‚00111β”‚07β”‚RI β”‚  LLIβ”‚ rd := (rd & 0xFF00) | imm8
β””β”€β”€β”€β”€β”€β”΄β”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”˜
β”Œβ”€β”€β”€β”€β”€β”¬β”€β”€β”¬β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”
β”‚01000β”‚08β”‚RRIβ”‚   SWβ”‚ *(u16)(rd + imm5) := rs1
β”œβ”€β”€β”€β”€β”€β”Όβ”€β”€β”Όβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€
β”‚01001β”‚09β”‚RRIβ”‚   LWβ”‚ rd := *(u16)(rs1 + imm5)
β”œβ”€β”€β”€β”€β”€β”Όβ”€β”€β”Όβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€
β”‚01010β”‚0Aβ”‚RRIβ”‚   SBβ”‚ *(u8)(rd + imm5) := rs1 & 0xFF
β”œβ”€β”€β”€β”€β”€β”Όβ”€β”€β”Όβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€
β”‚01011β”‚0Bβ”‚RRIβ”‚   LBβ”‚ rd := *(i8)(rs1 + imm5)
β”œβ”€β”€β”€β”€β”€β”Όβ”€β”€β”Όβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€
β”‚01100β”‚0Cβ”‚RRIβ”‚  LBUβ”‚ rd := *(u8)(rs1 + imm5)
β”œβ”€β”€β”€β”€β”€β”Όβ”€β”€β”Όβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€
β”‚01101β”‚0Dβ”‚   β”‚     β”‚
β”‚01110β”‚0Eβ”‚   β”‚     β”‚ Reserved
β”‚01111β”‚0Fβ”‚   β”‚     β”‚
β””β”€β”€β”€β”€β”€β”΄β”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”˜
β”Œβ”€β”€β”€β”€β”€β”¬β”€β”€β”¬β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”
β”‚10000β”‚10β”‚RRRβ”‚  ANDβ”‚ rd := rs1 & rs2
β”œβ”€β”€β”€β”€β”€β”Όβ”€β”€β”Όβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€
β”‚10001β”‚11β”‚RRRβ”‚   ORβ”‚ rd := rs1 | rs2
β”œβ”€β”€β”€β”€β”€β”Όβ”€β”€β”Όβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€
β”‚10010β”‚12β”‚RRRβ”‚  XORβ”‚ rd := rs1 ^ rs2
β””β”€β”€β”€β”€β”€β”΄β”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”˜
β”Œβ”€β”€β”€β”€β”€β”¬β”€β”€β”¬β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”
β”‚10011β”‚13β”‚RRRβ”‚   EQβ”‚ rd := rs1 == rs2
β”œβ”€β”€β”€β”€β”€β”Όβ”€β”€β”Όβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€
β”‚10100β”‚14β”‚RRRβ”‚   GTβ”‚ rd := (signed)rs1 > (signed)rs2
β”œβ”€β”€β”€β”€β”€β”Όβ”€β”€β”Όβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€
β”‚10101β”‚15β”‚RRRβ”‚   GEβ”‚ rd := (signed)rs1 >= (signed)rs2
β”œβ”€β”€β”€β”€β”€β”Όβ”€β”€β”Όβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€
β”‚10110β”‚16β”‚RRRβ”‚  GTUβ”‚ rd := (unsigned)rs1 > (unsigned)rs2
β”œβ”€β”€β”€β”€β”€β”Όβ”€β”€β”Όβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€
β”‚10111β”‚17β”‚RRRβ”‚  GEUβ”‚ rd := (unsigned)rs1 >= (unsigned)rs2
β””β”€β”€β”€β”€β”€β”΄β”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”˜
β”Œβ”€β”€β”€β”€β”€β”¬β”€β”€β”¬β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”
β”‚11000β”‚18β”‚RRRβ”‚  JLRβ”‚ rd := pc + 2; pc := rs1 + (signed)rs2
β”œβ”€β”€β”€β”€β”€β”Όβ”€β”€β”Όβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€
β”‚11001β”‚19β”‚RI β”‚  BNSβ”‚ if rd == 0 then pc := pc + (signed)(imm8 * 2)
β”œβ”€β”€β”€β”€β”€β”Όβ”€β”€β”Όβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€
β”‚11010β”‚1Aβ”‚RI β”‚   BSβ”‚ if rd != 0 then pc := pc + (signed)(imm8 * 2)
β”œβ”€β”€β”€β”€β”€β”Όβ”€β”€β”Όβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€
β”‚11011β”‚1Bβ”‚   β”‚     β”‚ Reserved
β””β”€β”€β”€β”€β”€β”΄β”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”˜
β”Œβ”€β”€β”€β”€β”€β”¬β”€β”€β”¬β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”
β”‚11100β”‚1Cβ”‚RI β”‚   SFβ”‚ csr[imm8] := rd
β”œβ”€β”€β”€β”€β”€β”Όβ”€β”€β”Όβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€
β”‚11101β”‚1Dβ”‚RI β”‚   LFβ”‚ rd := csr[imm8]
β”œβ”€β”€β”€β”€β”€β”Όβ”€β”€β”Όβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€
β”‚11110β”‚1Eβ”‚RI β”‚  SYCβ”‚ System call
β”œβ”€β”€β”€β”€β”€β”Όβ”€β”€β”Όβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€
β”‚11111β”‚1Fβ”‚RI β”‚  BRKβ”‚ Break to debugger/environment
β””β”€β”€β”€β”€β”€β”΄β”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”˜

Assembler Syntax

; routine that prints 'hello, world\n' to an imaginary uart
.org $0100
Start:
	li  r1, Hello
	add r2, r0, 13
	add r3, r0, 4  ; the imaginary uart's address

@Loop:
	lbu r4, r1, 0
	sb  r1, r4, 0
	adi r1, r1, 1
	adi r2, r2, -1
	eq  r4, r2, r0
	bns r4, @Loop

	brk  $00


.org $0200
Hello:
	.ascii "hello, world"
	.byte $0a
β”Œβ”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚nopβ”‚     add r0, r0, r0β”‚
β”œβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚notβ”‚       sub A, B, r0β”‚
β”œβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚li β”‚lui A, IMM & 0xFF00β”‚
β”‚   β”‚lli A, IMM & 0x00FFβ”‚
β””β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜