Page 1 of 2

Problem with the linker ?

Posted: Tue Apr 01, 2014 9:27 pm
by waskol
Hello, I am trying to compile this C code (it is a full featured chess program, but it is not my work) :

Code: Select all

#define F(I,S,N) for(I=S;I<N;I++)
#define W(A) while(A)
#define K(A,B) *(int*)(T+A+(B&8)+S*(B&7))
#define J(A) K(y +A,b[y])-K(x+A,u)-K(H+A,t)

#define U 1032 //Was disigned with 16777224 instead of 1032 in the original program
struct _ {int K,V;char X,Y,D;} A[U];           /* hash table, 16M+8 entries*/

int V=112,M=136,S=128,I=8e4,C=799,Q,N,i;       /* V=0x70=rank mask, M=0x88 */

char O,K,L,
w[]={0,1,1,3,-1,3,5,9},                        /* relative piece values    */
o[]={-16,-15,-17,0,1,16,0,1,16,15,17,0,14,18,31,33,0, /* step-vector lists */
     7,-1,11,6,8,3,6,                          /* 1st dir. in o[] per piece*/
     6,3,5,7,4,5,3,6},                         /* initial piece setup      */
b[129],                                        /* board: half of 16x8+dummy*/
T[1035],                                       /* hash translation table   */

n[]=".?+nkbrq?*?NKBRQ";                        /* piece symbols on printout*/

D(k,q,l,e,J,Z,E,z,n)    /* recursive minimax search, k=moving side, n=depth*/
int k,q,l,e,J,Z,E,z,n;  /* (q,l)=window, e=current eval. score, E=e.p. sqr.*/
{                       /* e=score, z=prev.dest; J,Z=hashkeys; return score*/
 int j,r,m,v,d,h,i=9,F,G;
 char t,p,u,x,y,X,Y,H,B;
 struct _*a=A;
                                               /* lookup pos. in hash table*/
 j=(k*E^J)&U-9;                                /* try 8 consec. locations  */
 W((h=A[++j].K)&&h-Z&&--i);                    /* first empty or match     */
 a+=i?j:0;                                     /* dummy A[0] if miss & full*/
 if(a->K)                                      /* hit: pos. is in hash tab */
 {d=a->D;v=a->V;X=a->X;                        /* examine stored data      */
  if(d>=n)                                     /* if depth sufficient:     */
  {if(v>=l|X&S&&v<=q|X&8)return v;             /* use if window compatible */
   d=n-1;                                      /* or use as iter. start    */
  }X&=~M;Y=a->Y;                               /*      with best-move hint */
  Y=d?Y:0;                                     /* don't try best at d=0    */
 }else d=X=Y=0;                                /* start iter., no best yet */
 N++;                                          /* node count (for timing)  */
 W(d++<n|z==8&N<1e7&d<98)                      /* iterative deepening loop */
 {x=B=X;                                       /* start scan at prev. best */
  Y|=8&Y>>4;                                   /* request try noncastl. 1st*/
  m=d>1?-I:e;                                  /* unconsidered:static eval */
  do{u=b[x];                                   /* scan board looking for   */
   if(u&k)                                     /*  own piece (inefficient!)*/
   {r=p=u&7;                                   /* p = piece type (set r>0) */
    j=o[p+16];                                 /* first step vector f.piece*/
    W(r=p>2&r<0?-r:-o[++j])                    /* loop over directions o[] */
    {A:                                        /* resume normal after best */
     y=x;F=G=S;                                /* (x,y)=move, (F,G)=castl.R*/
     do{H=y+=r;                                /* y traverses ray          */
      if(Y&8)H=y=Y&~M;                         /* sneak in prev. best move */
      if(y&M)break;                            /* board edge hit           */
      if(p<3&y==E)H=y^16;                      /* shift capt.sqr. H if e.p.*/
      t=b[H];if(t&k|p<3&!(r&7)!=!t)break;      /* capt. own, bad pawn mode */
      i=99*w[t&7];                             /* value of capt. piece t   */
      if(i<0||E-S&&b[E]&&y-E<2&E-y<2)m=I;      /* K capt. or bad castling  */
      if(m>=l)goto C;                          /* abort on fail high       */
    
      if(h=d-(y!=z))                           /* remaining depth(-recapt.)*/
      {v=p<6?b[x+8]-b[y+8]:0;                  /* center positional pts.   */
       b[G]=b[H]=b[x]=0;b[y]=u&31;             /* do move, strip virgin-bit*/
       if(!(G&M)){b[F]=k+6;v+=30;}             /* castling: put R & score  */
       if(p<3)                                 /* pawns:                   */
       {v-=9*(((x-2)&M||b[x-2]!=u)+            /* structure, undefended    */
              ((x+2)&M||b[x+2]!=u)-1);         /*        squares plus bias */
        if(y+r+1&S){b[y]|=7;i+=C;}             /* promote p to Q, add score*/
       }
       v=-D(24-k,-l-(l>e),m>q?-m:-q,-e-v-i,    /* recursive eval. of reply */
            J+J(0),Z+J(8)+G-S,F,y,h);          /* J,Z: hash keys           */
       v-=v>e;                                 /* delayed-gain penalty     */
       if(z==9)                                /* called as move-legality  */
       {if(v!=-I&x==K&y==L)                    /*   checker: if move found */
        {Q=-e-i;O=F;return l;}                 /*   & not in check, signal */
        v=m;                                   /* (prevent fail-lows on    */
       }                                       /*   K-capt. replies)       */
       b[G]=k+38;b[F]=b[y]=0;b[x]=u;b[H]=t;    /* undo move,G can be dummy */
       if(Y&8){m=v;Y&=~8;goto A;}              /* best=1st done,redo normal*/
       if(v>m){m=v;X=x;Y=y|S&G;}               /* update max, mark with S  */
      }                                        /*          if non castling */
      t+=p<5;                                  /* fake capt. for nonsliding*/
      if(p<3&6*k+(y&V)==S                      /* pawn on 3rd/6th, or      */
          ||(u&~24)==36&j==7&&                 /* virgin K moving sideways,*/
          G&M&&b[G=(x|7)-(r>>1&7)]&32          /* 1st, virgin R in corner G*/
          &&!(b[G^1]|b[G^2])                   /* 2 empty sqrs. next to R  */
      ){F=y;t--;}                              /* unfake capt., enable e.p.*/
     }W(!t);                                   /* if not capt. continue ray*/
  }}}W((x=x+9&~M)-B);                          /* next sqr. of board, wrap */
C:if(m>I/4|m<-I/4)d=99;                        /* mate is indep. of depth  */
  m=m+I?m:-D(24-k,-I,I,0,J,Z,S,S,1)/2;         /* best loses K: (stale)mate*/
  if(!a->K|(a->X&M)!=M|a->D<=d)                /* if new/better type/depth:*/
  {a->K=Z;a->V=m;a->D=d;A->K=0;                /* store in hash,dummy stays*/
   a->X=X|8*(m>q)|S*(m<l);a->Y=Y;              /* empty, type (limit/exact)*/
  }                                            /*    encoded in X S,8 bits */
/*if(z==8)printf("%2d ply, %9d searched, %6d by (%2x,%2x)\n",d-1,N,m,X,Y&0x77);*/
 }
 if(z&8){K=X;L=Y&~M;}
 return m;                                     
}

main()
{
 int j,k=8,*p,c[9];

 F(i,0,8)
 {b[i]=(b[i+V]=o[i+24]+40)+8;b[i+16]=18;b[i+96]=9;   /* initial board setup*/
  F(j,0,8)b[16*j+i+8]=(i-4)*(i-4)+(j-3.5)*(j-3.5);   /* center-pts table   */
 }                                                   /*(in unused half b[])*/
 F(i,M,1035)T[i]=random()>>9;

 W(1)                                                /* play loop          */
 {F(i,0,121)printf(" %c",i&8&&(i+=7)?10:n[b[i]&15]); /* print board        */
  p=c;W((*p++=getchar())>10);                        /* read input line    */
  N=0;
  if(*c-10){K=c[0]-16*c[1]+C;L=c[2]-16*c[3]+C;}else  /* parse entered move */
   D(k,-I,I,Q,1,1,O,8,0);                            /* or think up one    */
  F(i,0,U)A[i].K=0;                                  /* clear hash table   */
  if(D(k,-I,I,Q,1,1,O,9,2)==I)k^=24;                 /* check legality & do*/
 }
}

Here is my log :

Code: Select all

Cross-Assembler 65xx V2.2.3 (19:04:08 / Jan 28 2014) 

(c) 1989-98 by A.Fachat

65816 opcodes and modes coded by Jolse Maginnis

Oric C adaptation and debugging by Mickael Pointier

Clean Linux port by Jean-Yves Lamoureux

 sta (fp)+1 
F:\osdk\dev\Microchess\chess.s(3949):  203c:Syntax error
 sta (fp)+1 
F:\osdk\dev\Microchess\chess.s(3963):  2055:Syntax error
 NE0W_C(3,Lchess77)
F:\osdk\dev\Microchess\chess.s(7262):  3433:Syntax error
Please, what's wrong ?



PS : the website of the crazy guy that did this impressive chess program is here : http://home.hccnet.nl/h.g.muller/chess.html

Re: Problem with the linker ?

Posted: Thu Apr 03, 2014 7:40 pm
by Dbug
Good thing: I managed to reproduce the issue.

I will dig more when I find time (this week is milestone week at work so...)

Re: Problem with the linker ?

Posted: Thu Apr 03, 2014 7:53 pm
by Dbug
Found the bug: Could you give a shot and modify your %OSDK%/macro/MACROS.H

Line 665 you have ADDW_III

Replace

Code: Select all

#define ADDW_III(ptr1,y1,ptr2,y2,ptr3,y3)\
	clc ;\
	ldy #y1 ;\
	lda ptr1,y ;\
	ldy #y2 ;\
	adc ptr2,y ;\
	ldy #y3 ;\
	sta ptr3,y ;\
	ldy #y1+1 ;\
	lda ptr1,y ;\
	ldy #y2+1 ;\
	adc ptr2,y ;\
	ldy #y3+1 ;\
	sta ptr3+1 ;\
by

Code: Select all

#define ADDW_III(ptr1,y1,ptr2,y2,ptr3,y3)\
	clc ;\
	ldy #y1 ;\
	lda ptr1,y ;\
	ldy #y2 ;\
	adc ptr2,y ;\
	ldy #y3 ;\
	sta ptr3,y ;\
	ldy #y1+1 ;\
	lda ptr1,y ;\
	ldy #y2+1 ;\
	adc ptr2,y ;\
	ldy #y3+1 ;\
	sta ptr3 ;\
If it's working, I will publish a new version of the OSDK with the fix.

Re: Problem with the linker ?

Posted: Fri Apr 04, 2014 7:31 am
by Godzil
I think there is still a bug..

If the first is storing a with

sta #y3,y


The last should be store with

sta #y3,y

also. Or the ldy #y3+1 just before is here for nothing :)

Re: Problem with the linker ?

Posted: Fri Apr 04, 2014 7:57 am
by waskol
Still not , but it seems close to be ok :

Code: Select all

Cross-Assembler 65xx V2.2.3 (19:04:08 / Jan 28 2014) 

(c) 1989-98 by A.Fachat

65816 opcodes and modes coded by Jolse Maginnis

Oric C adaptation and debugging by Mickael Pointier

Clean Linux port by Jean-Yves Lamoureux

 NE0W_C(3,Lchess77)
F:\osdk\dev\Microchess\chess.s(7262):  3433:Syntax error

Re: Problem with the linker ?

Posted: Fri Apr 04, 2014 9:32 am
by Godzil
Try with the latest version of the OSDK with the change dbug told you. There is not the NE0W_C error on latest version..
It build fine

Re: Problem with the linker ?

Posted: Fri Apr 04, 2014 10:26 am
by ibisum
Looks cool .. now we need Tiny C! :) Or 8086tiny, the one from this years IOCC..

Re: Problem with the linker ?

Posted: Fri Apr 04, 2014 7:51 pm
by Dbug
Godzil wrote:I think there is still a bug..

If the first is storing a with

sta #y3,y


The last should be store with

sta #y3,y

also. Or the ldy #y3+1 just before is here for nothing :)
Yeah obviously the last sta ptr3 was supposed to be sta ptr3,y.

That's what happen when answering in a hurry while waiting for a build to finish on a remote server at work :p

Re: Problem with the linker ?

Posted: Sat Apr 05, 2014 5:07 pm
by waskol
Godzil wrote:Try with the latest version of the OSDK with the change dbug told you. There is not the NE0W_C error on latest version..
It build fine
I've got the OSDK v1.2, and just modyfied the sta ptr3+1 ;\ by sta ptr3 ;\ and even by sta ptr3,y ;\

I still have that damned

Code: Select all

NE0W_C(2,Lchess65)
F:\osdk\dev\Microchess\chess.s(4623):  240b:Syntax error
:?

Re: Problem with the linker ?

Posted: Sat Apr 05, 2014 6:56 pm
by Dbug
I'm not sure how you did your set-up, but the version I tried is working:
http://miniserve.defence-force.org/svn/ ... LinkerBug/
Building the program chess at adress $600
Compiling main.C
- preprocess
- compile
- convert C to assembly code
- cleanup output
Linking
Assembling
Creating final program chess.TAP
File 'build\chess.tap' is 21373 bytes long (14 bytes header and 21359 bytes of data)
Build of chess.tap finished
Press any key to continue . . .

Re: Problem with the linker ?

Posted: Sun Apr 06, 2014 4:15 pm
by waskol
I've got the latest osdk release, with my OSDK global variable setup properly, that's all. (o add-on, nothing modified or changed or what so ever)

Re: Problem with the linker ?

Posted: Sun Apr 06, 2014 4:22 pm
by waskol
Ouch ! I finally found what was wrong ! You will never guess...

In my osdk_config.bat

I had this :

Code: Select all

SET OSDKADDR=$800
SET OSDKNAME=CHESS
SET OSDKFILE=main
Instead of that :

Code: Select all

SET OSDKADDR=$800
SET OSDKNAME=CHESS
SET OSDKFILE=MAIN

Re: Problem with the linker ?

Posted: Sun Apr 06, 2014 4:23 pm
by Dbug
:shock:

Re: Problem with the linker ?

Posted: Sun Apr 06, 2014 4:25 pm
by waskol
My file name is in lowercase, but it wants some uppercase.
No more error, it compiles, straight away.

Either it is a bug, either I missed something there I do not understand :)

My OS is Windows 7

Re: Problem with the linker ?

Posted: Sun Apr 06, 2014 4:27 pm
by waskol
Dbug wrote::shock:
:lol: :mrgreen:

Yes...