Vorwort:
Das Tutorial habe ich mal irgendwann irgendwo geschrieben, es ist also lange her, aber ich denke, es passt hier trotzdem gut rein!
Let's get the show on the road...
Also, Jungs und Mädels, für das ZCPU Tutorial braucht ihr die Wiremod - SVN Version, die man sich nur über das SVN-System saugen kann:
http://www.wiremod.com/index.php?showtopic=4
Da wird alles beschrieben. Habt ihr dieses Update, solltet ihr diese Liste immer im Hintergrund haben, wenn ihr etwas nicht wisst:
http://www.wiremod.com/index.php?showtopic=152
So, jetzt zum Tutorial:
Der ZCPU ist eine Einheit, die ihr mithilfe der leicht Assembler-orientierten Scriptsprache programmieren könnt. Keine Sorge, die Sprache ist so einfach, dass ihr innerhalb von Sekunden ein gutes Script haben könnt. Jedoch gibt es einiges zu beachten, aber dazu später. Beginnen wir mit dem Leichten, den wichtigsten Funktionen:
Code:
mov X,Y X = Y
sub X,Y X = X - Y
add X,Y X = X + Y
mul X,Y X = X * Y
div X,Y X = X / Y
jmp X Springt zu Label X
cmp X,Y CMPR = X - Y
(CMPR ist eine vordefinierte Variable zum Vergleichen)
(Zu cmp gehören noch weitere Dinge)
mov, sub, add, mul und div erklären sich von Selbst. Ein Beispiel wäre mov eax,50; was in eax, einer vordefinierten Variable, die ihr benutzen könnt, 50 speichert. Andere Variablen müssen mit #<varablenamen> aufgegriffen werden.
jmp springt zu einem Label, dass durch <labelname>: gekennzeichnet ist. Z.B:
Code:
startloop:
mov eax,50;
jmp startloop;
Würde also, nachdem EAX der Wert 50 zugewiesen wurde, wieder zum Anfang springen und dieses wiederholen.
cmp ist zum Vergleichen eines Wertes da. Vergleiche bestehen immer aus der Differenz zweier Zahlen (größer oder kleiner, gleich oder ungleich). Dieses wird ermöglicht, in dem cmp zwei Werte zugewiesen werden, die dann subrahiert werden. Das Ergebnis, die Differenz, wird in der festgelegten Variable cmpr gespeichert. Mit den Funktionen
Code:
JNE/JNZ X = Jump on not egual (!=)
JG/JNLE X = Jump on greater than (>)
JGE/JNL X = Jump on greater or equal (>=)
JL/JNGE X = Jump on less than (<)
JLE/JNG X = Jump on less or equal (<=)
JE/JZ X = Jump on equal (==)
wird dann zu einem bestimmten Label gesprungen, wenn cmpr die Anforderungen erfüllt. In der Liste steht alles, was ihr braucht
Also:
Code:
startloop:
mov eax,50;
cmp eax,50;
je startloop;
Bedeutet, dass zuerst EAX 50 zugewiesen wird. Mit cmp wird der Vergleich, die Differenz von eax und 50, in cmpr gespeichert und mit je wird "gejumpt", wenn das Ergebnis von cmpr gleich 0 ist, denn dass bedeutet, dass eax - 50 = 0 ist, was automatisch heist, dass eax auch 50 sein muss. Übrigens: je steht für "jump on equivalent" o.ä.
Aber was bringt euch das, wenn ihr nur mit Zahlen rechnen könnt und nichts danach passiert? Dafür gibt es 2 Möglichkeiten, diese umzusetzen:
Fast In/Outputs: Neuerdings kann man CPUs direkt mit bestimmten Schnittstellen verbinden, da dieses selbst für mich neu ist, könnt ihr noch warten
8 In/Outports: Die alte Methode - 8 Ports nach Draußen und 8 Ports nach Innen. Die bespreche ich jetzt:
Stellt euch vor, ihr habt ein explosives Fass, dass explodiert, wenn man ihm den Wert 1 zuweist und stellt euch vor, dass ihr ein kleines System mit Rangern aufgebaut habt, dass ebenfalls 1 ausgibt, wenn man durchgeht.
Ein CPU würde das Ganze so auffassen:
Code:
// Damit kann man COmments machen
// port0 ist das Fass
// Aber gleichzeitig der Ranger
// Am Anfang stehen ALLOC für Variablen, die definiert werden
// Und CODE; für das Script
CODE;
loop:
mov eax,port0;
cmp eax,0;
je loop;
mov port0,1;
jmp loop;
Nochmal vorab: Wenn ihr port0 einen Wert zuweist, dann ist das nicht port0, von dem ihr einen Wert bekommen könnt. Es gibt also insgesamt 16 Ports!
So das Script überprüft, ob von port0 ausgehend, also vom Ranger, ein Signal ausgeht. Ist es 0, springt es zum Anfang zurück. Falls nicht, wird dem anderen port0, also dem Fass, dem Output, der Wert 1 zugewiesen und das Fass explodiert.
Ok, jetzt machen wir mal ein Script, dass man auch gut beobachten kann:
Code:
CODE;
cube:
mov port0,2;
mov port0,4;
mov port0,6;
mov port0,8;
mov port0,10;
mov port0,12;
mov port0,14;
mov port0,16;
mov port0,18;
mov port1,2;
mov port1,4;
mov port1,6;
mov port1,8;
mov port1,10;
mov port1,12;
mov port1,14;
mov port1,16;
mov port1,18;
mov port0,16;
mov port0,14;
mov port0,12;
mov port0,10;
mov port0,8;
mov port0,6;
mov port0,4;
mov port0,2;
mov port0,0;
mov port1,16;
mov port1,14;
mov port1,12;
mov port1,10;
mov port1,8;
mov port1,6;
mov port1,4;
mov port1,2;
mov port1,0;
jmp cube;
So, damit wird ein Laser betrieben. Speichert das Script zunächst unter garrysmod\data\CPUchip\<name>.txt
Dann geht in Garrys mod und wählt den CPU Chip aus. Ladet das Script hinein (schreibt den Namen eures Scripts mit der .txt Endung) und plaziert den CPU irgendwo auf der Map, z.B. auf einer Platte. Klickt doppelt auf den CPU, damit das Script kompiliert wird (der Log in der Console). Jetzt braucht ihr noch die Ports. Spawnt dazu ein Data Port und verbindet das I/OBUS vom CPU mit irgendeinem Port des Data Ports (nur ein mal!). Jetzt macht ihr euch noch einen Togglebutton und verbindet ihn mit clk vom CPU Chip und ein Constant mit dem Wert 20 (für Laser gut geeignet) verbindet ihr mit der Frequency des CPU Chips.
Dann setzt ihr noch einen Laseremitter irgendwo hin, verbindet X mit port0, Y mit port1 und active verbindet ihr ebenfalls mit dem Togglebutton.
Jetzt schaltet euer Gerät ein und habt Spaß