Small Projects
2023-04-01
A collection of smaller projects I did.
Table of Contents
Hier finden sich Projektbeschreibungen von kleinen Projekten, die zwar erwähnenswert sind, aber zu klein für eine eigene Projektseite sind.
ftz - a tiny file transfer tool
A small and simple file transfer utility.
Features
- Upload and download files
- Server can chose to provide only downloads or uploads
- Clients are restricted to the subfolders, no way to break out.
- Native cross platform support (Windows, Linux, MacOS, BSDs)
- Static, small binary (207K on Linux, 128K on Windows, 123K on MacOS)
Links
pbody “Partikelsimulation”
Wer noch das Powder Game kennt, wird die selbe Idee in pbody wiedererkennen. Das ganze ist eine zellenbasierte Simulation, die Interaktionen zwischen verschiedenen “Materialien” simuliert.
Es gibt verschiedene Materialien, unter anderem Sand, Metall, Wasser, Eis, ein Duplikations-Material (erzeugt um sich herum neues Material) und ein Vernichter. Durch verschiedene Interaktionen von Materialien sowie einer einfachen Energie-Übertragung (Temperatur der Elemente gleicht sich an) können schöne Effekte geschaffen werden.
Quellcode sowie eine Linux-Executable kann man hier herunterladen. Das Projekt benötigt nur SDL2, sollte also auch für Windows problemlos compilierbar sein.
Die Steuerung ist etwas suboptimal und muss hier aus dem Quellcode entnommen werden. Grundlegend können mit S oder der linken Maustaste Partikel gespawnt werden. Mit ~ oder - kann die Größe des Partikel-Pinsels angepasst werden.
Mit w, s, c, m, v, I, j oder b kann ein Material gewählt werden.
Via É (Normal) oder È (Heatmap) kann eine alternative Ansicht gewählt werden.
TankVM
TankVM ist eine kleine virtuelle Maschine, die dafür gedacht ist, in Spielen eingebettet zu werden. Programmiert wird das ganze in einem sehr einfachen Assembler-Dialekt.
Die Idee hinter der ganzen Geschichte war es, ein Spiel zu schaffen, wo der Spieler selbst Geräte im Spiel programmieren kann. Das ganze sollte im Retro-Stil gehalten sein, also muss Assembler programmiert werden, es soll aber eben auch nicht zu anstrengend sein.
Die virtuelle CPU ist sehr einfach gehalten und besitzt nur 11 Register (r0
-r7
sowie rx
, ry
, rz
), kann aber auch sehr mächte Instruktionen ausführen (sin
, pow
oder atan2
). Speicherzugriff erfolgt ausschließlich über Indirektion, kann dafür aber auch mit jeglicher Quelle verwendet werden. Der Speicherzugriff über ein Register ([r0]
) unterscheidet sich nur wenig über den direkten Speicherzugriff über eine Adresse ([10]
). Zudem ist Indirektion beliebig oft anwendbar: [[0]]
.
Die Speicherzellen enthalten entweder Werte oder Instruktionen, wobei nur mit Werten gerechnet werden kann. Instruktionen zerfallen hierbei zu einem Hashwert und sind damit pseudozufällig.
Die virtuellen Geräte habe 16 Steckplätze für “Erweiterungskarten”, welche mit {Card:Feature}
im Assembler adressiert werden. Erweiterungskarten sind frei programmierbare Features, welche jeweils 16 Ports besitzten, mit denen die CPU kommunizieren kann. Ports einer Erweiterungskarte verhalten sich wie ein spezielles Register.
Es gibt zudem eine einfache Art der Interrupt-Verwaltung, wobei hier die Interrupts ausschließlich von Erweiterungskarten ausgelöst werden können.
; == TankVM CPU ==
; RAM:
; 4 kB
; Slots:
; 16 with 16 Ports each and 16 Events
; Registers:
; r0-r7, rx, ry, rz
;
init:
; Connect Slot2.ev1 with "fire"
isr fire, {2:1}
loop:
; Read Slot2.(in1,in0) to (rx,ry)
mov ry, {1:0}
mov rx, {1:1}
mul r1, rx, ry
snz r1
jmp loop_1
atan2 r1, ry, rx
; Set Slot0.out1 to r1 (angle)
mov {0:1}, r1
; Set Slot0.out0 to "forward"
mov {0:0}, 255
jmp loop_2
; No steering
loop_1:
; Set Slot0.out0 to "stop"
mov {0:0}, 0
loop_2:
mov rx, {2:8}
mov ry, {2:9}
atan2 r1, ry, rx
mov {1:0}, r1
; We're done for this frame,
; something like yield
sync
jmp loop
fire:
; Read Slot2.in2 to r1
mov r1, {2:2}
; Skip when r1 = zero
skz r1
; Write to Slot1.out1
mov {1:1}, 255
ret ; Returning from an event
TankVM wurde komplett in C# entwickelt und benutzt abgesehen von T4-Templates keine besondere Code-Magie oder Parser-Generatoren.
Die Bibliothek erlaubt quantisierte Ausführung des Codes (wichtig für Spiele) sowie beliebige Erweiterungen des Instruction Sets oder der Steckkarten.
Im Moment gibt es keinen offiziellen Release der Bibliothek, wer aber Interesse hat, möge sich melden, dann kann ich da auch ein bisschen Dokumentation zur Benutzung schreiben.