PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Wire-Tutorial] ZCPU



Scarecrow
09.07.2008, 16:17
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:


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:



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



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:



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 :D

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:



// 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;
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ß ;)

A.I.
09.07.2008, 16:30
Schönes Layot
Schöne Rechtschreibung
Für alle normalen Menschen verständlich.


:-? :shock:
http://littlesnipes.li.ohost.de/bilder/lolwtfomgepic.gif

don-banane
09.07.2008, 17:51
Aha, das ist ja mal interessant zu wissen :up: :gmod:
Allerdings ist es anfangs nicht ganz soo einfach, ist ja schließlich komplett was neues (also der Assembler Stil) :D

Scarecrow
10.07.2008, 05:09
Assembler ist halt sehr maschinennah. Man könnte glatt sagen, dass der die ZCPU die realste Einheit von Wire ist, weil man mit diesem Grundwissen gut in Assembler einsteigen kann. Auf der Originalseite von Wire gehen 'se aber noch nen Schritt weiter: Sie arbeiten mit dem Stack und bauen so Funktionen, aber man sollte erst einmal das hier beherrschen :gmod:

Andrey
10.07.2008, 10:43
Argh. D:

Das wollte ich machen!

Naja, ich hätte es wahrscheinlich nicht so gut hinbekommen wie du jetzt.

Scarecrow
11.07.2008, 07:13
Argh. D:

Das wollte ich machen!

Naja, ich hätte es wahrscheinlich nicht so gut hinbekommen wie du jetzt.

Das Tutorial ist auch schon alt, sonst hätte ich zeitlich gesehen keine Chance gegen deine Tutorial-Welle :)

Andrey
14.07.2008, 17:51
Hallo? Pinned das mal jemand an? :gmod:

Scarecrow
26.07.2008, 23:26
Hallo? Pinned das mal jemand an? :gmod:

Wäre ich dafür ;)

Pac_187
27.07.2008, 09:46
Oh, muss ich wohl übersehen haben, sorry :mad:

Mr Jack
06.08.2008, 09:25
Würd ja mal verstehen aber das ist wieklich zu viel für mich :-?.
Aber gut das du das Hochgeladen hast.

nowai
09.09.2008, 19:32
Hab heute wieder meine Lust an Gmod gefunden und plötzlich wieder sehr großes
Interesse am skripten gefühlt.

Ich danke dir vielmals für dieses verständliche Tutorial.

Wir sehen uns auf dem Schlachtfeld!

the.only.one
03.05.2009, 11:48
Also bei mir haut irgend etwas nicht hin. Ich hab probiert das Laser Tool aus dem Tut zu bauen.

Ich hab alles so aufgebaut wie beschrieben. Im Compiler steht das:


----> ZyeliosASM compiler - Version 2.0 (SVN REV 0/801) <----
-> ZyeliosASM: Compiling...
-> ZyeliosASM: Pass 1
-> ZyeliosASM: Pass 2
-> ZyeliosASM: Compile succeded! 41 lines, 114 bytes, 10 definitions.


http://img254.imageshack.us/my.php?image=garry.jpg
Die Kabel vom Laser zum Data Port zeigt er mir nicht an aber der Data Port hat ja auch schon keinen Output.

Der rote Button ist nur zum reseten da.

Aky
03.05.2009, 14:15
Ich finde dieses Tutorial viel zu allgemein gehalten,
ohne irgentwelche anderen Tutorials im bereich ASM oder ZASM konnte ich damit nichts anfangen.

Hab mir deswegen einmal dieses Tutorial durchgelesen: klick mich (http://www.wiremod.com/forum/cpu-tutorials/271-assembly-programming-tutorial.html)
und dieses klick auch mich :P (http://www.wiremod.com/forum/cpu-tutorials/6643-foxy-cpu.html)

sind zwar auf Englisch geschrieben, aber durch Beispiele und Line-by-Line Erläuterungen sollte man diese auch mit weniger gut gereiften Sprachkentnissen verstehen ;)

the.only.one
03.05.2009, 15:20
Ich fand das Tut hier auch nicht so toll und hab mir das Foxy durchgelesen. Trotzdem gehts nicht ich glaub ich muss Wire neuinstallieren?

edit:
Ich wer bekloppt geht immer noch nicht!
Was muss ich den machen?
Den Dateinamen unter "Source Code File Name" reinschreiben ist schon richtig oder?
Wenn ich übrigens kein ; benutze compiled er mir das auch ohne Fehlermeldung.

Aky
03.05.2009, 16:22
Hab das nun auch mal mit dem Laser ausprobiert,
bei mir bleibt das Ding auch einfach in der Mitte stehen,

weiß auch nicht warum...

the.only.one
03.05.2009, 16:46
Ja bei mir auch aber die CPU gibt auch nichts aus.

edit:
Wo sind den die Experten?

Aky
06.05.2009, 17:21
Ich suche nun schon seit Stunden nach der Liste, in der steht welcher Tahl welchen Error darstellt....
Kann mir jemand helfen?
Hab error 4 und 999

Mitsuma
06.05.2009, 22:23
Ja bei mir auch aber die CPU gibt auch nichts aus.

edit:
Wo sind den die Experten?

Entweder ihr macht was falsch oder es liegt an WireMod. Das programm hatte bei mir noch funktioniert bevor ich kein Inet mehr hatte.
Ich würd mal sagen einfach auf nen update warten.
Ach ja schreib mir mal schritt für schritt genau wie du es machts, da ich zur zeit kein gmod spielen kann kann ich es nicht selbst testen. Es könnte nur an einem fehler beim bauen sein.

the.only.one
07.05.2009, 16:51
Also Aufbau müsste eigentlich schon passen, da alles was ich mit Expression 1 oder 2 baue 100% funktioniert.

Nur die CPUs spinnen irgendwie manchmal gehts manchmal nicht.
Ich hab von einer CPU 3 Werte ausgeben lassen, extern addiert und auf nem Bildschirm ausgeben lassen. Das selbe nochmal mit 5 Werten hintereinander ging dann nicht mehr. Dann wollte ich wieder die selben 3 Werte machen ging wieder.

Vermute deshalb ein Fehler im Mod bei mir. Also mach dir nicht zuviel Mühe aber trotzdem danke.

PlayEgoShooter
09.06.2009, 15:43
wieso wird zcpu eigentlich in Assembler geschrieben?
warum nicht in cpp? das kann ich wenigstens gut

Aky
14.06.2009, 19:50
Weil ASM einfach die schnellste und maschienen änhlichste Programmier sprache ist ;)

Wenn du etwas Cpp ähnliches suchst dann benutze doch EXP2, wesentlich einfacher und doch noch schnell genug, zum. für das was ich baue xD

PlayEgoShooter
21.06.2009, 17:00
ok
aber was ist "EXP2"
?

Pij
21.06.2009, 17:22
Expression 2

PlayEgoShooter
21.06.2009, 17:25
hab noch nicht so oft mit wire gearbeitet

Aky
19.08.2009, 19:06
Unterscheidet sich ASM eigentlich in groben zügen zu ZASM?
Lerne demnächst ASM in der Schule :) Hoffe das kann ich dann auch auf den ZCPU anwenden :D