Forum: Compiler & IDEs Nanochess auf avr


von Sam .. (sam1994)


Lesenswert?

Hi

Ich möchte auf meinem atmega644 Nanochess zum laufen bringen 
(http://nanochess.110mb.com/chess3.html). Leider ist im Quellcode fast 
nichts zu erkennen. Ich dachte mir ich könnte das WinboardProtokoll 
simulieren um eine Verbindung zwischen avr-In/Output und chess-Engine 
herzustellen (Hardware funktioniert, Display ansteuerungsmethoden und 
Tastatur abfragfunktionen sind auch schon fertig). Nun habe ich aber 
nichts über das Winboard-Interface gefunden, zumindest nicht welche 
Befehle es hat.

Gebe ich im Prog (für Winboard) e2e4 ein kommt komischerweise folgendes:
1
e2e4
2
y}{|~z|{}   76Lsabcddcba .pknbrqmove a8e4

Stehe ich auf dem Schlauch oder ist da ein Bug im Programm?

von Sam .. (sam1994)


Lesenswert?

Hab den nicht Winboard Code ein bisschen auseinander genommen:
1
\**************************************************************************\
2
| Toledo Nanochess (c) Copyright 2009 Oscar Toledo G. All rights reserved  |
3
| 1257 non-blank characters. Evolution from my winning IOCCC 2005 entry.   |
4
| o Use D2D4 algebraic style for movements.  biyubi@gmail.com  Nov/20/2009 |
5
| o On promotion add a number for final piece (3=N, 4=B, 5=R, 6=Q)         |
6
| o Press Enter alone for computer to play.                                |
7
| o Full legal chess moves.                     http://nanochess.110mb.com |
8
| o Remove these comments to get 1326 bytes source code (*NIX end-of-line) |
9
\**************************************************************************/
10
char*l="ustvrtsuqqqqqqqqyyyyyyyy}{|~z|{}"
11
"   76Lsabcddcba .pknbrq  PKNBRQ ?A6J57IKJT576,+-48HLSU";
12
#define F getchar()&z
13
#define v X(0,0,0,21,
14
#define Z while(
15
#define _ ;if(
16
#define P return--G,y^=8,
17
B,i,y,u,b,I[411],*G=I,x=10,z=15,M=1e4;
18
19
X(w,c,h,e,S,s)
20
{
21
    int t,o,L,E,d,O=e,N=-M*M,K=78-h<<x,p,*g,n,*m,A,q,r,C,J,a=y?-x:x;y^=8;
22
    G++;
23
    d=w||s&&s>=h&&v 0,0)>M;
24
    do
25
    {
26
        _ o=I[p=O])
27
        {
28
            q=o&z^y 
29
            _ q<7)
30
            {
31
                A=q--&2?8:4;C=o-9&z?q["& .$  "]:42;
32
                do
33
                {
34
                    r=I[p+=C[l]-64]_!w|p==w)
35
                    {
36
                        g=q|p+a-S?0:I+S _!r&(q|A<3||g)||(r+1&z^y)>9&&q|A>2)
37
                        {
38
                            _ m=!(r-2&7))P G[1]=O,K;
39
                            J=n=o&z;
40
                            E=I[p-a]&z;
41
                            t=q|E-7?n:(n+=2,6^y);
42
                            Z n<=t)
43
                            {
44
                                L=r?l[r&7]*9-189-h-q:0 
45
                                _ s)L+=(1-q?l[p/x+5]-l[O/x+5]+l[p%x+6]*-~!q-l[O%x+6]+o/16*8:!!m*9)+(q?0:!(I[p-1]^n)+!(I[p+1]^n)+l[n&7]*9-386+!!g*99+(A<2))+!(E^y^9)
46
                                _ s>h||1<s&s==h&&L>z|d)
47
                                {
48
                                    p[I]=n,O[I]=m?*g=*m,*m=0:g?*g=0:0;L-=X(s>h|d?0:p,L-N,h+1,G[1],J=q|A>1?0:p,s)
49
                                    _!(h||s-1|B-O|i-n|p-b|L<-M))
50
                                        P y^=8,u=J;J=q-1|A<7||m||!s|d|r|o<z||v 0,0)>M;O[I]=o;p[I]=r;m?*m=*g,*g=0:g?*g=9^y:0;
51
                                }
52
                                _ L>N)
53
                                {
54
                                    *G=O 
55
                                    _ s>1)
56
                                    {
57
                                        _ h&&c-L<0)
58
                                            P L _!h)i=n,B=O,b=p;
59
                                    }N=L;
60
                                }
61
                                n+=J||(g=I+p,m=p<O?g-3:g+2,*m<z|m[O-p]||I[p+=p-O]);
62
                            }
63
                        }
64
                    }
65
                }
66
                Z!r&q>2||(p=O,q|A>2|o>z&!r&&++C*--A));
67
            }
68
        }
69
    }
70
    Z++O>98?O=20:e-O);
71
    P N+M*M&&N>-K+1924|d?N:0;
72
}
73
74
main()
75
{
76
    Z++B<121)
77
    *G++=B/x%x<2|B%x<2?7:B/x&4?0:*l++&31;
78
    Z B=19)
79
    {
80
        Z B++<99)
81
        putchar(B%x?l[B[I]|16]:x)
82
        _ x-(B=F))
83
        {
84
            i=I[B+=(x-F)*x]&z;b=F;
85
            b+=(x-F)*x;
86
            Z x-(*G=F))i=*G^8^y;
87
            
88
        }
89
        else 
90
            v u,5);
91
        v u,1);
92
    }
93
}

Konnte bisher aber nichts brauchbares rauslesen. Sieht vielleicht 
irgendjemand wie ich an der berechneten Zug komme? Eingeben kann ich ihn 
ja leicht, indem ich sie über die getchar-Funktion zukommen lasse.

von Tobi (Gast)


Lesenswert?

Moin,

schau dir doch mal das an.

http://nanochess.110mb.com/chess3.html

Gruss,
Tobi

von Sam .. (sam1994)


Lesenswert?

Tobi schrieb:
> Moin,
>
> schau dir doch mal das an.
>
> http://nanochess.110mb.com/chess3.html
>
> Gruss,
> Tobi

Was meinst du damit? Da hab ich doch den Source her.

von Hans Mayer (Gast)


Lesenswert?

hast du mal E2E4 probiert?
in Großbuchstaben?

von Sam .. (sam1994)


Lesenswert?

Hans Mayer schrieb:
> hast du mal E2E4 probiert?
> in Großbuchstaben?

Dem Programm ist das egal. Man kann beides eingeben. Es muss aber 
irgendwie doch möglich sein, den Zug abzufangen und weiterzuleiten, 
damit ich ihn anzeigen kann.

Natürlich könnte man auch das board abfragen, wie es sich geändert hat, 
aber das ist irgendwie doch total ineffizient.

von derdas (Gast)


Lesenswert?

Du willst es Dir antuen, und ein Programm vom IOCCC benutzen ???

Dir ist klar das diese Programme ausschliesslich auf Groesse und 
Unleserlichkeit getrimmt sind ? Performance spielt z.B. oft keine Rolle, 
wenn man es nur in die wenigen Bytes quetschen kann. Könnte auf 'nem 
Mikrocontroller ewig zur Berechnung brauchen.

Naja, als Tipp würde ich mal den Preprozessor über das Programm laufen 
lassen. Vielleicht kann man ja dann mehr erkennen als Chinesisch.

Das geht z.B. so:
1
gcc -E schrott.c

von Silvan K. (silvan) Benutzerseite


Lesenswert?

derdas schrieb:
> Naja, als Tipp würde ich mal den Preprozessor über das Programm laufen
> lassen. Vielleicht kann man ja dann mehr erkennen als Chinesisch.

Ich möchte ungern den Thread hier kapern, aber warum schreibt man so ein 
"Chinesisch":

Samuel K. schrieb:
> #define F getchar()&z
> #define v X(0,0,0,21,
> #define Z while(
> #define _ ;if(
> #define P return--G,y^=8,

Das ist doch Krank!!

von Stefan E. (sternst)


Lesenswert?

Silvan König schrieb:
> derdas schrieb:
>> Naja, als Tipp würde ich mal den Preprozessor über das Programm laufen
>> lassen. Vielleicht kann man ja dann mehr erkennen als Chinesisch.
>
> Ich möchte ungern den Thread hier kapern, aber warum schreibt man so ein
> "Chinesisch":

Aus Spaß. Google doch einfach mal nach "IOCCC". Es so unleserlich wie 
möglich zu schreiben, ist genau das, worum es dort geht.

von Silvan K. (silvan) Benutzerseite


Lesenswert?

Ohhhhh...
Danke für den Hinweis.

von Sam .. (sam1994)


Lesenswert?

derdas schrieb:
> Performance spielt z.B. oft keine Rolle,
> wenn man es nur in die wenigen Bytes quetschen kann. Könnte auf 'nem
> Mikrocontroller ewig zur Berechnung brauchen.

Ich kenne außer Micromax aber kein anderes das mit so wenig Ram 
auskommt.

Silvan König schrieb:
> Samuel K. schrieb:
>> #define F getchar()&z
>> #define v X(0,0,0,21,
>> #define Z while(
>> #define _ ;if(
>> #define P return--G,y^=8,
>
> Das ist doch Krank!!

Ja, das ist es. Das machen sie nur um den Code zu verkleinern.

von Simon K. (simon) Benutzerseite


Lesenswert?

Um den Code zu verkleinern?! Das machen die um ihn unleserlich zu 
machen. Aus welchen Gründen auch immer ;-)

von Sam .. (sam1994)


Lesenswert?

Simon K. schrieb:
> Um den Code zu verkleinern?! Das machen die um ihn unleserlich zu
> machen. Aus welchen Gründen auch immer ;-)

Lies doch den Text. Es geht ihnen um den kleinsten C-Code der Schach 
spielen kann. -> Alle Variablen/Funktionen nur ein Zeichen. Alles so 
klein wie möglich schreiben... und natürlich #define benutzen wenn der 
Code kleiner wird.

Man macht es auch wenn man den Code unleserlich machen möchte, 
allerdings glaube ich nicht das es hier um darum geht (Micromax schreibt 
sogar Kommentare hinter die Zeilen, bei einer Version, um es leichter zu 
verstehen. Dazu erklärt er das ganze Programm noch).

von Simon K. (simon) Benutzerseite


Lesenswert?

Kleinster C-Code vielleicht. Aber nicht kleinster Maschinencode. Kleines 
Missverständnis.

Trotzdem: Der IOCCC wurd ja schon genannt.

---
Der International Obfuscated C Code Contest (kurz IOCCC) ist ein 
Programmierwettbewerb für die am kreativsten verschleierten C-Programme, 
der seit 1984 jährlich veranstaltet wird (mit Ausnahme von 1997, 1999, 
2002 und 2003). (engl.: to obfuscate: von lat. obfuscare, dt.: 
verdunkeln).
---
http://de.wikipedia.org/wiki/International_Obfuscated_C_Code_Contest

Also geht es ums Verschleiern und nicht (vorrangig) ums Verkleinern. :-)

von Yalu X. (yalu) (Moderator)


Lesenswert?

Vielleicht habe ich dein Problem nicht ganz verstanden, aber was spricht
dagegen, einfach die getchar- und dir putchar-Funktion durch eigene
Funktionen zu ersetzen und dort die gesamte Ein-/Ausgabe (LCD, Taststur,
Sensorbrett, Roboterarm oder was auch immer) abzuwickeln? Das brauchst
du den eigentlichen Schachalgorithmus nicht verstehen.

von Mark B. (markbrandis)


Lesenswert?

Simon K. schrieb:

> Der International Obfuscated C Code Contest (kurz IOCCC) ist ein
> Programmierwettbewerb

War ein Programmierwettbewerb trifft es wohl eher. Das letzte Mal fand 
im Jahr 2006 statt.

von Kai S. (zigzeg)


Lesenswert?

Mark Brandis schrieb:
> Simon K. schrieb:
> War ein Programmierwettbewerb trifft es wohl eher. Das letzte Mal fand
> im Jahr 2006 statt.

Das waere ein Jammer. Da gab es immer so schoen kranke Sachen! Ich 
erinnere mich z.B. noch an ein 3D Labyrinth ala Castle Wolfenstein 
(natuerlich im Text-Modus): Der Plan des Labyrinths war die Formatierung 
des Source-codes, d.h. das compilierte Program hat seinen eigenen 
Source-Code eingelesen :-) (wobei das eher Standard war, als 
ungewoehnlich)

Oder ein BASIC interpreter oder compiler, und das alles in weniger als 
4096 Bytes Quelltext!

von Karl H. (kbuchegg)


Lesenswert?

erster Schritt bei den IOCCC Sachen ist es immer, das ganze auf einem PC 
zum laufen zu bringen. Nicht selten werden beim IOCCC nicht-standard 
konforme Dinge ausgenutzt, die eine bestimmte Compiler-Release macht und 
die nächste macht es schon wieder ganz anders. Rechne nicht damit, dass 
sich IOCCC Programme streng an C-Richtlinien halten.

Hast du das Ding am PC am laufen, dann beginnt die eigentliche Arbeit. 
Das Rück-Obfuscaten. Wobei man sinnvollerweise nach ausnahmlos jeder 
kleinen Änderung wieder Tests fährt um zu sehen ob und was man durch die 
Rückübersetzung zerstört hat.

Das geht jetzt ein paar Iterationen durch, bis man auf einem halbwegs 
akzeptablen C-Code gelandet ist. Und erst der hat dann auch Chancen, 
dass man ihn portieren kann.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Für avr-gcc scheitert es schon daran, daß ein int nur 16 Bits groß ist. 
Bei der Initialisierung läuft N zB über.

von Bernhard M. (boregard)


Lesenswert?

Wie wärs alternativ zu Nanochess mit AVR-Max:
http://www.schach-computer.info/wiki/index.php/AVR-Max-Schachzwerg

Edit: Wichtig auch die dort verlinkte Seite: 
http://www.andreadrian.de/schach/

von Uwe (Gast)


Lesenswert?


von Sam .. (sam1994)


Lesenswert?

Johann L. schrieb:
> Für avr-gcc scheitert es schon daran, daß ein int nur 16 Bits groß ist.
> Bei der Initialisierung läuft N zB über.

Also bei mir läuft das ganze am PC einwandfrei.

Yalu X. schrieb:
> Vielleicht habe ich dein Problem nicht ganz verstanden, aber was spricht
> dagegen, einfach die getchar- und dir putchar-Funktion durch eigene
> Funktionen zu ersetzen und dort die gesamte Ein-/Ausgabe (LCD, Taststur,
> Sensorbrett, Roboterarm oder was auch immer) abzuwickeln? Das brauchst
> du den eigentlichen Schachalgorithmus nicht verstehen.

Mein Problem hast du erkannt, aber ausgegeben wird nur das Board, dh ich 
müsste das Board nach Änderung untersuchen (und das kostet Code, Zeit, 
Ram,  und ist ineffizient) Achja das ganze kostet auch einen haufen Ram, 
denn das alte Board muss gespeichert werden (min. 32Byte).

Bernhard M. schrieb:
> Wie wärs alternativ zu Nanochess mit AVR-Max:
> http://www.schach-computer.info/wiki/index.php/AVR...
>
> Edit: Wichtig auch die dort verlinkte Seite:
> http://www.andreadrian.de/schach/

Auf den Seiten war ich auch schon, allerdings finde ich den Code 
ebenfalls extremst unleserlich.

von Freax (Gast)


Lesenswert?

Elektor hatte sowas doch auch mal als projekt...

von Sinnfrei. (Gast)


Lesenswert?

Samuel K. schrieb:
> Johann L. schrieb:
>> Für avr-gcc scheitert es schon daran, daß ein int nur 16 Bits groß ist.
>> Bei der Initialisierung läuft N zB über.
>
> Also bei mir läuft das ganze am PC einwandfrei.

Was ist denn das für eine völlig sinnfreie Stellungnahme zu dem genanten 
Problem?? Ganz schön disquallifizierende Aussage.

von Bernhard M. (boregard)


Lesenswert?

Samuel K. schrieb:
> Auf den Seiten war ich auch schon, allerdings finde ich den Code
> ebenfalls extremst unleserlich.

Dafür gibts eine wirklich ausführliche Erklärung beim Autor des 
Originals auf:
http://home.hccnet.nl/h.g.muller/max-src2.html

Wenn man sich eh richtig in das Programm einarbeiten will (es also 
komplett verstehen will) ist es eine gute Übung, es mithilfe der 
Beschreibung leserlich zu machen.

von Bernhard M. (boregard)


Lesenswert?

Eine Alternative ist noch die Schachengine in der uWatch:
http://www.calcwatch.com/

Ist zwar für PIC, nicht für AVR, aber schönerer Sourcecode.

von Sam .. (sam1994)


Lesenswert?

Sinnfrei. schrieb:
> Was ist denn das für eine völlig sinnfreie Stellungnahme zu dem genanten
> Problem?? Ganz schön disquallifizierende Aussage.

Am PC wird das Board ausgegeben. Ich den Befehl, der das Board 
aktualisiert, durch einen ersetzen, der den Zug ausgibt.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Samuel K. schrieb:
> Johann L. schrieb:
>> Für avr-gcc scheitert es schon daran, daß ein int nur 16 Bits groß ist.
>> Bei der Initialisierung läuft N zB über.
>
> Also bei mir läuft das ganze am PC einwandfrei.

Ich dachte es ging um eine Implementierung für avr-gcc?

Auf nem PC ist ein int üblicherweise mindestens 16 Bits groß. Für 
Nanochess bringt jedoch ein
1
#define int long // bzw. int32_t
kaum was, weil man damit nicht (implizite) Type-Promotion erschlägt, 
d.h. man müsste an gegebenen Stellen explizite Casts einfügen. Ohne 
jedoch den Code zu verstehen, ist das nicht ganz einfach. Immerhin ist 
der Code dafür geschrieben, unverständlich zu sein.

Weiters wäre es interessant, für das Programm eine RAM-Analyse zu machen 
um zu sehen, ob der AVR überhaupt genügend RAM hat.

Ausserdem...spielt das Programm so grottenschlecht, daß es keim Spaß 
macht, dagegen zu spielen.

von olikraus (Gast)


Lesenswert?

So am Rande...

Die H.G.Muller Engine wurde mal auf den AVR portiert:
http://www.andreadrian.de/schach/#Selbstbau_Schachcomputer_SHAH

Ganz interessant ist auch diese Seite hier:
http://chessprogramming.wikispaces.com/

Und hier meine 8 Bit AVR Engine:
http://code.google.com/p/dogm128/wiki/chess

Code:
http://code.google.com/p/dogm128/source/browse/libraries/Dogm/utility/chess.c

Grüße,
Oliver

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.