Problem with the linker ?

Since we do not have native C compilers on the Oric, this forum will be mostly be used by people using CC65 or the OSDK. But any general C related post will be welcome !
User avatar
waskol
Flight Lieutenant
Posts: 414
Joined: Wed Jun 13, 2007 8:20 pm
Location: FRANCE, Paris

Problem with the linker ?

Post 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
User avatar
Dbug
Site Admin
Posts: 4437
Joined: Fri Jan 06, 2006 10:00 pm
Location: Oslo, Norway
Contact:

Re: Problem with the linker ?

Post 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...)
User avatar
Dbug
Site Admin
Posts: 4437
Joined: Fri Jan 06, 2006 10:00 pm
Location: Oslo, Norway
Contact:

Re: Problem with the linker ?

Post 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.
Godzil
Squad Leader
Posts: 774
Joined: Sat May 21, 2011 7:21 pm
Location: Between UK and France
Contact:

Re: Problem with the linker ?

Post 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 :)
User avatar
waskol
Flight Lieutenant
Posts: 414
Joined: Wed Jun 13, 2007 8:20 pm
Location: FRANCE, Paris

Re: Problem with the linker ?

Post 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
Godzil
Squad Leader
Posts: 774
Joined: Sat May 21, 2011 7:21 pm
Location: Between UK and France
Contact:

Re: Problem with the linker ?

Post 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
Attachments
chess.7z
Sample version with build results
(9.33 KiB) Downloaded 526 times
User avatar
ibisum
Wing Commander
Posts: 1643
Joined: Fri Apr 03, 2009 8:56 am
Location: Vienna, Austria
Contact:

Re: Problem with the linker ?

Post by ibisum »

Looks cool .. now we need Tiny C! :) Or 8086tiny, the one from this years IOCC..
User avatar
Dbug
Site Admin
Posts: 4437
Joined: Fri Jan 06, 2006 10:00 pm
Location: Oslo, Norway
Contact:

Re: Problem with the linker ?

Post 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
User avatar
waskol
Flight Lieutenant
Posts: 414
Joined: Wed Jun 13, 2007 8:20 pm
Location: FRANCE, Paris

Re: Problem with the linker ?

Post 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
:?
User avatar
Dbug
Site Admin
Posts: 4437
Joined: Fri Jan 06, 2006 10:00 pm
Location: Oslo, Norway
Contact:

Re: Problem with the linker ?

Post 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 . . .
User avatar
waskol
Flight Lieutenant
Posts: 414
Joined: Wed Jun 13, 2007 8:20 pm
Location: FRANCE, Paris

Re: Problem with the linker ?

Post 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)
User avatar
waskol
Flight Lieutenant
Posts: 414
Joined: Wed Jun 13, 2007 8:20 pm
Location: FRANCE, Paris

Re: Problem with the linker ?

Post 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
User avatar
Dbug
Site Admin
Posts: 4437
Joined: Fri Jan 06, 2006 10:00 pm
Location: Oslo, Norway
Contact:

Re: Problem with the linker ?

Post by Dbug »

:shock:
User avatar
waskol
Flight Lieutenant
Posts: 414
Joined: Wed Jun 13, 2007 8:20 pm
Location: FRANCE, Paris

Re: Problem with the linker ?

Post 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
User avatar
waskol
Flight Lieutenant
Posts: 414
Joined: Wed Jun 13, 2007 8:20 pm
Location: FRANCE, Paris

Re: Problem with the linker ?

Post by waskol »

Dbug wrote::shock:
:lol: :mrgreen:

Yes...
Post Reply