1
0

docs: isa: add sized instructions

This commit is contained in:
2026-06-08 13:59:47 +02:00
parent 52b743de9a
commit 30ff19d7ff
4 changed files with 62 additions and 147 deletions

View File

@ -1,67 +0,0 @@
# PROGRAMS
CC = clang
CXX = clang++
LD = clang
AR = ar
RM = rm -f
TYPST = typst
# COMPILATION FLAGS
LIBS = raylib
ifdef DEBUG
CFLAGS += -Og -g -DDEBUG
else
CFLAGS += -O2
endif
CFLAGS += -Wall -Wextra -pedantic -std=gnu23 -Iinclude -Werror=return-type $(shell pkg-config --cflags $(LIBS))
LDFLAGS += $(shell pkg-config --libs $(LIBS))
# FILES
SRCS=$(wildcard src/*.c)
DEPS=$(patsubst src/%.c, build/%.d, $(SRCS))
OBJS=$(patsubst src/%.c, build/%.o, $(SRCS))
DOCSRC=$(wildcard docs/*.typ)
DOCS=$(patsubst docs/%.typ, docs/%.pdf, $(DOCSRC))
PROGRAM=ain48
.PHONY: all build docs clean deepclean setup
all: setup build docs
setup: compile_flags.txt
build: $(PROGRAM)
docs: $(DOCS)
docs/%.pdf: docs/%.typ
$(TYPST) c $< $@
clean:
$(RM) $(OBJS)
$(RM) $(DEPS)
$(RM) compile_flags.txt
deepclean: clean
$(RM) $(PROGRAM)
$(RM) $(DOCS)
compile_flags.txt: Makefile
printf "%s\n" $(CFLAGS) > $@
$(PROGRAM): $(OBJS)
$(LD) $(LDFLAGS) $(OBJS) -o $@
build/%.d: src/%.c
@mkdir -p $(@D)
@set -e ; $(RM) $@; \
$(CC) -M $(CFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,build/\1.o $@ : ,g' < $@.$$$$ > $@; \
$(RM) $@.$$$$
build/%.o: src/%.c
@mkdir -p $(@D)
$(CC) $(CFLAGS) -c $< -o $@
include $(DEPS)

17
docs/Makefile Normal file
View File

@ -0,0 +1,17 @@
# PROGRAMS
RM = rm -f
TYPST = typst
# FILES
DOCSRC=$(wildcard *.typ)
DOCS=$(DOCSRC:.typ=.pdf)
.PHONY: all docs clean
all: docs
docs: $(DOCS)
%.pdf: %.typ
$(TYPST) c $< $@
clean:
$(RM) $(DOCS)

View File

@ -6,7 +6,7 @@ file_extensions:
scope: source.ain48asm scope: source.ain48asm
contexts: contexts:
main: main:
- match: '(?i)\b(ADD|AEQ|AUT|CESS|CST|DEM|DST|DVD|EI|ET|I|ILG|IMLG|IPLG|IRRV|IVC|LG|MPL|NAM|NCIVC|NCRV|NEC|NEI|NI|NNI|NPI|NUI|PADD|PDEM|PDVD|PI|PILG|PIMLG|PIPLG|PMPL|PRSD|PSTR|RSD|RV|SC|SIM|STR|TSC|UI|VEL)\b' - match: '(?i)\b(P?[SBQ]?(ADD|DEM|DVD|MPL|RSD|SIM|STR)|AEQ|AN|AUT|[SBQ]?(LG|SC)|CESS|CST|DST|(N?[ENUP])?I|ET|P?I[MP]?LG|IRRV|(NC)?(IVC|RV)|NAM|NEC|TSC|VEL)\b'
scope: keyword.operator.word.ain48 scope: keyword.operator.word.ain48
- match: '(?i)%([a-z0-7]+)\b' - match: '(?i)%([a-z0-7]+)\b'
scope: variable.register.ain48 scope: variable.register.ain48

View File

@ -27,6 +27,9 @@
A *byte* (singulus) is the smallest addressable part of memory, that is, a 12-bit A *byte* (singulus) is the smallest addressable part of memory, that is, a 12-bit
binary number. binary number.
A *half-word* (binus) is a binary number composed of 2 bytes, that is, a 24 bit
binary number.
A *word* (quaternus) is a binary number composed of 4 bytes, that is, a 48 bit A *word* (quaternus) is a binary number composed of 4 bytes, that is, a 48 bit
binary number. binary number.
@ -79,9 +82,8 @@ memory address.
(1, [0]), (1, [0]),
(1, [0]), (1, [0]),
(1, [0]), (1, [0]),
(1, [0]), (2, [m]),
(1, [i#sub[2]\ 0]), (1, [i\ 0]),
(1, [i#sub[1]\ 0]),
(1, [s]), (1, [s]),
(4, [ac]), (4, [ac]),
), ((4, [r#sub[f]]), (4, [r#sub[2]]), (4, [r#sub[1]]))) ), ((4, [r#sub[f]]), (4, [r#sub[2]]), (4, [r#sub[1]])))
@ -91,33 +93,8 @@ memory address.
(1, [0]), (1, [0]),
(1, [0]), (1, [0]),
(1, [0]), (1, [0]),
(1, [0]), (2, [m]),
(1, [i#sub[2]\ 0]), (1, [i\ 1]),
(1, [i#sub[1]\ 1]),
(1, [s]),
(4, [ac]),
), ((4, [r#sub[f]]), (4, [r#sub[2]]), (4, text(size: .9em)[imm[0:3]])))
content((12.25, -6))[or]
byte_diag(voff: -10, (
(1, [0]),
(1, [0]),
(1, [0]),
(1, [0]),
(1, [0]),
(1, [i#sub[2]\ 1]),
(1, [i#sub[1]\ 0]),
(1, [s]),
(4, [op]),
), ((4, [r#sub[f]]), (4, text(size: .9em)[imm[0:3]]), (4, [r#sub[1]])))
content((12.25, -11))[or]
byte_diag(voff: -15, (
(1, [0]),
(1, [0]),
(1, [0]),
(1, [0]),
(1, [0]),
(1, [i#sub[2]\ 1]),
(1, [i#sub[1]\ 1]),
(1, [s]), (1, [s]),
(4, [ac]), (4, [ac]),
), ((4, [r#sub[f]]), (8, [imm[0:7]]))) ), ((4, [r#sub[f]]), (8, [imm[0:7]])))
@ -135,13 +112,13 @@ memory address.
import cetz.draw: * import cetz.draw: *
scale(.65) scale(.65)
byte_diag(( byte_diag((
(1, [0]),
(1, [0]), (1, [0]),
(1, [0]), (1, [0]),
(1, [1]), (1, [1]),
(1, [0]), (1, [0]),
(1, [0]), (1, [0]),
(1, [0]), (1, [0]),
(1, [0]),
(1, [s]), (1, [s]),
(4, [r]), (4, [r]),
), ((12, [imm[0:11]]),)) ), ((12, [imm[0:11]]),))
@ -160,9 +137,9 @@ memory address.
byte_diag(( byte_diag((
(1, [0]), (1, [0]),
(1, [0]), (1, [0]),
(1, [1]),
(1, [1]),
(1, [0]), (1, [0]),
(1, [1]),
(1, [1]),
(1, [0]), (1, [0]),
(1, [0]), (1, [0]),
(1, [s]), (1, [s]),
@ -176,9 +153,9 @@ memory address.
import cetz.draw: * import cetz.draw: *
scale(.65) scale(.65)
byte_diag(( byte_diag((
(1, [0]),
(1, [0]), (1, [0]),
(1, [1]), (1, [1]),
(1, [0]),
(1, [s]), (1, [s]),
(4, [r#sub[d]]), (4, [r#sub[d]]),
(4, [r#sub[l]]), (4, [r#sub[l]]),
@ -291,79 +268,65 @@ Common Notations:
h(1em) h(1em)
opts.pos().join(h(2em)) opts.pos().join(h(2em))
}) })
#let aludoc(mnemonic, opnum, opsym, commutative, s) = [ #let aludoc(mnemonic, opnum, opsym, s) = [
#optgrid(opt[op][#opnum], opt[s][#s]) #optgrid(opt[op][#opnum], opt[s][#s], opt[w][2])
/ Instruction format: #amal / Instruction format: #amal
/ #raw(mnemonic + " %a, %b, %c", lang: "ain48"): %a %b #opsym %c / #raw(mnemonic + " %a, %b, %c", lang: "ain48"): %a %b #opsym %c
#optgrid( #optgrid(
opt[i#sub[1]][0], opt[i][0],
opt[i#sub[2]][0],
opt[r#sub[f]][a], opt[r#sub[f]][a],
opt[r#sub[1]][b], opt[r#sub[1]][b],
opt[r#sub[2]][c], opt[r#sub[2]][c],
) )
/ #raw(mnemonic + " %a, %b, #imm[4]", lang: "ain48"): %a %b #opsym imm
#optgrid(
opt[i#sub[1]][0],
opt[i#sub[2]][1],
opt[r#sub[f]][a],
opt[r#sub[1]][b],
opt[imm][imm],
)
#if not commutative [
/ #raw(mnemonic + " %a, #imm[4], %b", lang: "ain48"): %a imm #opsym %b
#optgrid(
opt[i#sub[1]][1],
opt[i#sub[2]][0],
opt[r#sub[f]][a],
opt[r#sub[2]][b],
opt[imm][imm],
)
]
/ #raw(mnemonic + " %a, #imm[8]", lang: "ain48"): %a %a #opsym imm / #raw(mnemonic + " %a, #imm[8]", lang: "ain48"): %a %a #opsym imm
#optgrid(opt[i#sub[1]][1], opt[i#sub[2]][1], opt[r#sub[f]][a], opt[imm][imm]) #optgrid(opt[i][1], opt[r#sub[f]][a], opt[imm][imm])
] ]
#let sized_also(mnem, name) = (also: (
( "S" + mnem, "Singulum " + name, [Same as #istr(mnem), but operates on bytes #optgrid(opt[w][0])]),
( "B" + mnem, "Binum " + name, [Same as #istr(mnem), but operates on half-words #optgrid(opt[w][1])]),
( "Q" + mnem, "Quaternum " + name, [Alias for the unsized version, operates on words]),
))
#let instructions = ( #let instructions = (
(mnem: "STR", name: "Subtrahere", sign: true, description: [ (mnem: "STR", name: "Subtrahere", sign: true, description: [
Subtract one signed number from another. Subtract one signed number from another.
#aludoc("STR", "01", "-", false, 1) #aludoc("STR", "01", "-", 1)
/ Instruction format: #amal / Instruction format: #amal
]), ], ..sized_also("STR", "Subtrahere")),
(mnem: "ADD", name: "Addere", sign: true, description: [ (mnem: "ADD", name: "Addere", sign: true, description: [
Add two signed numbers together. Add two signed numbers together.
#aludoc("ADD", "00", "+", true, 1) #aludoc("ADD", "00", "+", 1)
/ Instruction format: #amal / Instruction format: #amal
]), ], ..sized_also("ADD", "Addere")),
(mnem: "MPL", name: "Multiplicáre", sign: true, description: [ (mnem: "MPL", name: "Multiplicáre", sign: true, description: [
Multiply two signed numbers together. Multiply two signed numbers together.
#aludoc("MPL", "02", "×", true, 1) #aludoc("MPL", "02", "×", 1)
/ Instruction format: #amal / Instruction format: #amal
]), ], ..sized_also("MPL", "Multiplicáre")),
(mnem: "RSD", name: "Residérí", sign: true, description: [ (mnem: "RSD", name: "Residérí", sign: true, description: [
Remainder of the Euclidean division of two signed integers. Remainder of the Euclidean division of two signed integers.
Will raise an arithmetic exception if the right operand is zero. Will raise an arithmetic exception if the right operand is zero.
#aludoc("RSD", "05", "mod", false, 1) #aludoc("RSD", "05", "mod", 1)
/ Instruction format: #amal / Instruction format: #amal
]), ], ..sized_also("RSD", "Residérí")),
(mnem: "DVD", name: "Dívidere", sign: true, description: [ (mnem: "DVD", name: "Dívidere", sign: true, description: [
Integer part of the Euclidean division of two signed integers. Integer part of the Euclidean division of two signed integers.
Will raise an arithmetic exception if the right operand is zero. Will raise an arithmetic exception if the right operand is zero.
#aludoc("DVD", "04", "/", false, 1) #aludoc("DVD", "04", "/", 1)
/ Instruction format: #amal / Instruction format: #amal
]), ], ..sized_also("DVD", "Dívidere")),
(mnem: "DEM", name: "Ad Dextró Movére", sign: true, description: [ (mnem: "DEM", name: "Ad Dextró Movére", sign: true, description: [
Shift a signed number right by a signed number. Shift a signed number right by a signed number.
Will raise an arithmetic exception if the right operand is negative. Will raise an arithmetic exception if the right operand is negative.
#aludoc("DEM", "06", ">>", false, 1) #aludoc("DEM", "06", ">>", 1)
/ Instruction format: #amal / Instruction format: #amal
]), ], ..sized_also("DEM", "Ad Dextró Movére")),
(mnem: "SIM", name: "Ad Sinistró Movére", description: [ (mnem: "SIM", name: "Ad Sinistró Movére", description: [
Shift a word to the left. Shift a word to the left.
Will raise an arithmetic exception if the right operand is negative. Will raise an arithmetic exception if the right operand is negative.
#aludoc("SIM", "07", "<<", false, 0) #aludoc("SIM", "07", "<<", 0)
/ Instruction format: #amal / Instruction format: #amal
]), ], ..sized_also("SIM", "Ad Sinistró Movére")),
( (
mnem: "ILG", mnem: "ILG",
name: "Immediátum Legere", name: "Immediátum Legere",
@ -526,27 +489,27 @@ Common Notations:
]), ]),
(mnem: "VEL", name: "Vel", description: [ (mnem: "VEL", name: "Vel", description: [
Bitwise disjunction between two words. Bitwise disjunction between two words.
#aludoc("VEL", [11], sym.or, true, 0) #aludoc("VEL", [11], sym.or, 0)
]), ]),
(mnem: "NEC", name: "Nec", description: [ (mnem: "NEC", name: "Nec", description: [
Bitwise negated disjunction between two words Bitwise negated disjunction between two words
#aludoc("NEC", [15], sym.not + sym.or, true, 0) #aludoc("NEC", [15], sym.not + sym.or, 0)
]), ]),
(mnem: "AUT", name: "Aut", description: [ (mnem: "AUT", name: "Aut", description: [
Bitwise difference between two numbers. Bitwise difference between two numbers.
#aludoc("AUT", [12], sym.xor, true, 0) #aludoc("AUT", [12], sym.xor, 0)
]), ]),
(mnem: "AEQ", name: "Aequí", description: [ (mnem: "AEQ", name: "Aequí", description: [
Bitwise equality between two numbers. Bitwise equality between two numbers.
#aludoc("AEQ", [16], [=], true, 0) #aludoc("AEQ", [16], [=], 0)
]), ]),
(mnem: "ET", name: "Et", description: [ (mnem: "ET", name: "Et", description: [
Bitwise logical conjunction between two numbers. Bitwise logical conjunction between two numbers.
#aludoc("ET", [10], sym.and, true, 0) #aludoc("ET", [10], sym.and, 0)
]), ]),
(mnem: "NAM", name: "Non ambó", description: [ (mnem: "NAM", name: "Non ambó", description: [
Bitwise negated logical conjunction between two numbers. Bitwise negated logical conjunction between two numbers.
#aludoc("NAM", [14], sym.not + sym.and, true, 0) #aludoc("NAM", [14], sym.not + sym.and, 0)
]), ]),
( (
mnem: "LG", mnem: "LG",
@ -558,6 +521,7 @@ Common Notations:
#optgrid(opt[s][0], opt[r#sub[d]][a], opt[r#sub[a]][b], opt[imm][imm]) #optgrid(opt[s][0], opt[r#sub[d]][a], opt[r#sub[a]][b], opt[imm][imm])
/ ```ain48 LG %a, (%b)```: This is a special case of ```ain48 LG %a, (%b), #imm[12]``` where imm = 0. / ```ain48 LG %a, (%b)```: This is a special case of ```ain48 LG %a, (%b), #imm[12]``` where imm = 0.
], ],
..sized_also("LG", "Legere"),
), ),
( (
mnem: "SC", mnem: "SC",
@ -569,6 +533,7 @@ Common Notations:
#optgrid(opt[s][1], opt[r#sub[d]][a], opt[r#sub[a]][b], opt[imm][imm]) #optgrid(opt[s][1], opt[r#sub[d]][a], opt[r#sub[a]][b], opt[imm][imm])
/ ```ain48 SC %a, (%b)```: This is a special case of ```ain48 SC %a, (%b), #imm[12]``` where imm = 0 / ```ain48 SC %a, (%b)```: This is a special case of ```ain48 SC %a, (%b), #imm[12]``` where imm = 0
], ],
..sized_also("SC", "Scríbere")
), ),
(mnem: "CESS", name: "Cessáre", description: [ (mnem: "CESS", name: "Cessáre", description: [
*Privileged* Halts the CPU. *Privileged* Halts the CPU.
@ -637,7 +602,7 @@ Common Notations:
mnem: "P" + m, mnem: "P" + m,
desc: [ desc: [
== P#m | Positivós #n == P#m | Positivós #n
Unsigned version of #m; see #ristr("P" + it.mnem) and #ristr(it.mnem). Unsigned version of #istr(m); see #ristr("P" + it.mnem) and #ristr(it.mnem).
], ],
), ),
) )