www.mikrocontroller.net

Forum: Compiler & IDEs Nanochess auf avr


Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht 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:
e2e4
y}{|~z|{}   76Lsabcddcba .pknbrqmove a8e4

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

Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab den nicht Winboard Code ein bisschen auseinander genommen:
\**************************************************************************\
| Toledo Nanochess (c) Copyright 2009 Oscar Toledo G. All rights reserved  |
| 1257 non-blank characters. Evolution from my winning IOCCC 2005 entry.   |
| o Use D2D4 algebraic style for movements.  biyubi@gmail.com  Nov/20/2009 |
| o On promotion add a number for final piece (3=N, 4=B, 5=R, 6=Q)         |
| o Press Enter alone for computer to play.                                |
| o Full legal chess moves.                     http://nanochess.110mb.com |
| o Remove these comments to get 1326 bytes source code (*NIX end-of-line) |
\**************************************************************************/
char*l="ustvrtsuqqqqqqqqyyyyyyyy}{|~z|{}"
"   76Lsabcddcba .pknbrq  PKNBRQ ?A6J57IKJT576,+-48HLSU";
#define F getchar()&z
#define v X(0,0,0,21,
#define Z while(
#define _ ;if(
#define P return--G,y^=8,
B,i,y,u,b,I[411],*G=I,x=10,z=15,M=1e4;

X(w,c,h,e,S,s)
{
    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;
    G++;
    d=w||s&&s>=h&&v 0,0)>M;
    do
    {
        _ o=I[p=O])
        {
            q=o&z^y 
            _ q<7)
            {
                A=q--&2?8:4;C=o-9&z?q["& .$  "]:42;
                do
                {
                    r=I[p+=C[l]-64]_!w|p==w)
                    {
                        g=q|p+a-S?0:I+S _!r&(q|A<3||g)||(r+1&z^y)>9&&q|A>2)
                        {
                            _ m=!(r-2&7))P G[1]=O,K;
                            J=n=o&z;
                            E=I[p-a]&z;
                            t=q|E-7?n:(n+=2,6^y);
                            Z n<=t)
                            {
                                L=r?l[r&7]*9-189-h-q:0 
                                _ 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)
                                _ s>h||1<s&s==h&&L>z|d)
                                {
                                    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)
                                    _!(h||s-1|B-O|i-n|p-b|L<-M))
                                        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;
                                }
                                _ L>N)
                                {
                                    *G=O 
                                    _ s>1)
                                    {
                                        _ h&&c-L<0)
                                            P L _!h)i=n,B=O,b=p;
                                    }N=L;
                                }
                                n+=J||(g=I+p,m=p<O?g-3:g+2,*m<z|m[O-p]||I[p+=p-O]);
                            }
                        }
                    }
                }
                Z!r&q>2||(p=O,q|A>2|o>z&!r&&++C*--A));
            }
        }
    }
    Z++O>98?O=20:e-O);
    P N+M*M&&N>-K+1924|d?N:0;
}

main()
{
    Z++B<121)
    *G++=B/x%x<2|B%x<2?7:B/x&4?0:*l++&31;
    Z B=19)
    {
        Z B++<99)
        putchar(B%x?l[B[I]|16]:x)
        _ x-(B=F))
        {
            i=I[B+=(x-F)*x]&z;b=F;
            b+=(x-F)*x;
            Z x-(*G=F))i=*G^8^y;
            
        }
        else 
            v u,5);
        v u,1);
    }
}

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.

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

schau dir doch mal das an.

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

Gruss,
Tobi

Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hans Mayer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hast du mal E2E4 probiert?
in Großbuchstaben?

Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: derdas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
gcc -E schrott.c

Autor: Silvan König (silvan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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!!

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Silvan König (silvan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohhhhh...
Danke für den Hinweis.

Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Simon K. (simon) Benutzerseite
Datum:

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

Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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_Obfusca...

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

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kai S. (zigzeg)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernhard M. (boregard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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/

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Freax (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Elektor hatte sowas doch auch mal als projekt...

Autor: Sinnfrei. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernhard M. (boregard)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernhard M. (boregard)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
#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.

Autor: olikraus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So am Rande...

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

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/lib...

Grüße,
Oliver

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.