-
Wire Stack Machine
Hab letzte Nacht (als es so gedonnert hat) diese Maschine gebaut, um mich mal wieder ein bisschen in Wiremod einzufinden. Hauptaugenmerk liegt auf der CPU, die einen modularisierten Code hat. Somit wäre es möglich verschiedene Arbeitsroutinen schnell und einfach zu schreiben. Ich hätte die verschiedenen Funktionen lieber etwas anders gestaltet, aber egal, im Grunde genommen ist's ja auch nur ein Proof of Concept.
Das Video:
http://www.youtube.com/watch?v=sc1N-ISlO9Q
Spoiler:
Der Code:
Code:
//in 0 -> start
//in 1 -> x-state
//in 2 -> y-state
//out 0 -> ready indicator
//out 1 -> x
//out 2 -> y
//out 3 -> grab
//out 4 -> nail
//eax -> first parameter
//ebx -> second parameter
DATA;
MoveX: //moves to eax
mov port1,eax;
loopX:
mov ebx,port1;
cmp ebx,eax;
jne loopX;
ret;
MoveY: //moves to eax
mov port2,eax;
loopY:
mov ebx,port2;
cmp ebx,eax;
jne loopY;
ret;
Wait: //waits half a second
timer eax;
add eax,0.5;
loopWait:
timer ebx;
cmp eax,ebx;
jg loopWait;
ret;
MoveStack: //moves to stack 1,2,3 or 4, saved in eax
mov ebx,95; //constant
sub eax,1; //IMPORTANT!! stack 1 is actually ZERO!!
mul ebx,eax;
mov eax,30;
add eax,ebx;
call MoveX;
ret;
Pick: //picks an item from the stack in eax
call MoveStack;
mov eax,30;
call MoveY;
call Wait;
mov port3,1;
call Wait;
mov eax,0;
call MoveY;
ret;
Stack: //stacks an item to stack in eax
call MoveStack;
mov eax,30;
call MoveY;
call Wait;
mov port3,0;
call Wait;
mov eax,0;
call MoveY;
ret;
Nail: //nails an item to stack in eax
call MoveStack;
mov eax,30;
call MoveY;
call Wait;
mov port3,0;
call Wait;
mov port4,1;
call Wait;
mov port4,0;
mov eax,0;
call MoveY;
ret;
mov ebx,95;
CODE;
init:
mov port0,0;
mov eax,30;
call MoveX;
mov eax,0;
call MoveY;
mov port3,0;
mov port4,0;
mov port0,1;
jmp idl;
idl:
mov eax,port0;
cmp eax,1;
je process1;
cmp eax,2;
je process2;
jmp idl;
//process1:
//pick item 4
//nail pick on 3
//pick item 3
//stack pick on 2
//pick item 1
//nail pick on 2
process1:
mov port0,0;
mov eax,4;
call Pick;
mov eax,3;
call Nail;
mov eax,3;
call Pick;
mov eax,2;
call Stack;
mov eax,1;
call Pick;
mov eax,2;
call Nail;
mov port0,1;
jmp idl;
process2:
mov port0,0;
mov eax,1;
call Pick;
mov eax,4;
call Stack;
mov eax,1;
call Pick;
mov eax,3;
call Stack;
mov port0,1;
jmp idl;
Ärgerlich finde ich dabei, dass die Größen der Abstände zwischen den PHX Platten keine Potenzen von 2 sind (2,4,8,16,32 usw...), sondern immer 95 betragen. Ich hab leider kein Tool, um die Abstände zu messen, muss ich mir also noch laden. Außerdem hatte ich grade kein Smart Weld, weswegen ich mir die Arbeit mitm Welden gespart und auf einen Adv. Dupe verzichtet hab. Immerhin hab ich ein Savegame, aber da funktionieren die Wire Sachen nicht mehr. Das einzige, was noch übrig geblieben ist und funktioniert, ist das Programm der CPU.
-
AW: Wire Stack Machine
Wow sieht ja sehr beeindruckend aus!
Also mir gefällt es. :D
Da ich auch mit Wire CPU "anfangen" will wäre es sehr freundlich von dir wenn du deinen Code hier posten würdest, vielleicht kann ich davon ja etwas lernen.
MfG.
-
AW: Wire Stack Machine
Kannst ja mal den Code reinstellen. :D
Sieht ganz nett aus.
-
AW: Wire Stack Machine
So hab den Code oben eingefügt. Man sieht, dass ich die Parameter per Register eingefügt habe. Hatte keine Lust alles übern Stack zu machen, ging ja auch so :)
-
AW: Wire Stack Machine
Interessante Maschine. Respekt!