Optimiser -o3 bug found (*solved*) - Printable Version +- Forum (https://www.boriel.com/forum) +-- Forum: Compilers and Computer Languages (https://www.boriel.com/forum/forumdisplay.php?fid=12) +--- Forum: ZX Basic Compiler (https://www.boriel.com/forum/forumdisplay.php?fid=11) +---- Forum: Bug Reports (https://www.boriel.com/forum/forumdisplay.php?fid=15) +---- Thread: Optimiser -o3 bug found (*solved*) (/showthread.php?tid=322) Optimiser -o3 bug found (*solved*) - LCD - 03-04-2011 Hi Boriel, I have found a bug with -o3 optimiser (-o2 works well) In following code (not fully finished yet) in -o3 mode not all chess Figures are displayed. The figures are named in german as they are just placeholders for graphics that will be added later. Oh, just noticed that also the binary operator shortcuts (|, &, ...) are not working too (yet). Code:```' Blind King (c) 2010 By LCD, written using BorIDE and ZXBC FUNCTION attrAddress(x as uByte, y as uByte) as uInteger               ';; This function returns the memory address of the Character Position ';; x,y in the attribute screen memory. ';; Adapted from code by Jonathan Cauldwell - Adapted for ZX BASiC by Britlion from Na_TH_AN's fourspriter asm     ld      a,(IX+7)        ;ypos     rrca     rrca     rrca               ;' Multiply by 32     ld      l,a        ;' Pass to L     and     3          ;' Mask with 00000011     add     a,88       ;' 88 * 256 = 22528 - start of attributes.     ld      h,a        ;' Put it in the High Byte     ld      a,l        ;' We get y value *32     and     224        ;' Mask with 11100000     ld      l,a        ;' Put it in L     ld      a,(IX+5)   ;' xpos     add     a,l        ;' Add it to the Low byte     ld      l,a        ;' Put it back in L, and we're done. HL=Address. end asm END FUNCTION FUNCTION scrAddress(x as uByte, y as uByte) as Uinteger asm ;' This fn returns the address into HL of the screen address ;' x,y in character grid notation. ;' Original code was extracted by BloodBaz - Adapted for ZX BASiC by Britlion from Na_TH_AN's fourspriter          ; x Arrives in A, y is in stack.          and     31          ld      l,a          ld      a,(IX+7) ; Y value          ld      d,a          and     24          add     a,64          ld      h,a          ld      a,d          and     7          rrca          rrca          rrca          or      l          ld      l,a                end asm END FUNCTION sub putblock(x as Ubyte,y as ubyte,wid as ubyte,hgt as ubyte,adr as Uinteger)     dim scr,attribute as Uinteger     dim x1,y1 as Ubyte     dim a as Ubyte     poke uinteger @putblock1+7,wid     poke uinteger @putblock2+7,wid     for y1=0 to hgt-1         scr=scrAddress(x,y+y1)         for a=0 to 7             poke uinteger @putblock1+1,adr             poke uinteger @putblock1+4,scr             putblock1:             asm                 ld hl,1                 ld de,2                 ld bc,3                 ldir             end asm             adr=adr+wid             scr=scr+256         next a     next y1     attribute=attrAddress(x,y)     for y1=0 to hgt-1         poke uinteger @putblock2+1,adr         poke uinteger @putblock2+4,attribute         adr=adr+wid         attribute=attribute+32         putblock2:         asm             ld hl,4             ld de,5             ld bc,6             ldir         end asm     next y1 End sub function ScanField(x as integer,y as integer,mask as ubyte) as ubyte     if x>=0 and x<8 and y>=0 and y<8 then         adr=@overlay+(y<<3)+x         return peek adr band mask     Else         return 0     end if end function sub SetField(x as uinteger,y as uinteger,fig as ubyte)     dim adr as uinteger     adr=@overlay+(y<<3)+x     poke adr,(peek adr) bor fig end sub function ScanDiagonal(x as ubyte,y as ubyte) as ubyte     dim dist,found,d1,d2,d3,d4 as ubyte   while found=0              end while 'This scans diagonal fields from x,y until figure or end of field for queen or bishop end Function function ScanStraight(x as ubyte,y as ubyte) as ubyte 'This scans straight fields until figure or end of field for queen or rook end Function function ScanNear(x as ubyte,y as ubyte) as ubyte 'This scans next fields of x,y until figure for king or pawn   dim result as ubyte   if ScanField(x-1,y-1,7)=1 or ScanField(x+1,y-1,7)=1 then result=1:end if     if ScanField(x-1,y-1,7)=6 or ScanField(x,y-1,7)=6 or ScanField(x+1,y-1,7)=6 or ScanField(x-1,y,7)=6 or ScanField(x+1,y,7)=6 or ScanField(x-1,y+1,7)=6 or ScanField(x,y+1,7)=6 or ScanField(x+1,y+1,7)=6 then result=result bor 32:end if     return result end Function function ScanKnight(x as ubyte,y as ubyte) as ubyte 'This scans field x,y if attacked by knight     dim result as ubyte     if ScanField(x-1,y-2,7)=3 or ScanField(x+1,y-2,7)=3    or ScanField(x-1,y+2,7)=3 or ScanField(x+1,y+2,7)=3    or ScanField(x-2,y-1,7)=3 or ScanField(x+2,y-1,7)=3    or ScanField(x-2,y+1,7)=3 or ScanField(x+2,y+1,7)=3 then result=3:end if     return result     end Function function ScanFields(x as ubyte,y as ubyte) as ubyte 'This scans all fields, first: diagonal for queen or bishop until figure or end of field print at 0,24;ScanNear(x,y);"  "; print at 1,24;ScanKnight(x,y);"  "; end Function paper 0:ink 6:bright 1:flash 0:border 2:cls 'print at 0,0;"\{i7}\{p1}Blind King 2010 By LCD" dim x,y,x1,y1,col,a,left,posx,posy as ubyte dim scr,adr as uinteger print at 23,0;"Press any key to start battle" pause 0 randomize cls adr=@chessboard for y=0 to 7     for x=0 to 7         col=peek(adr)         for y1=0 to 2             scr=attrAddress(x*3,y*3+y1)             poke scr,col:poke scr+1,col:poke scr+2,col         next y1         adr=adr+1     next x next y ' Setup field left=8 'Bauern while left>0     x=int(rnd*7.9999)     y=int(rnd*6.9999)     if ScanField(x,y,7)=0 then         SetField(x,y,1)         left=left-1     end If end while      left=2 'Türme while left>0     x=int(rnd*7.9999)     y=int(rnd*6.9999)     if ScanField(x,y,7)=0 then         SetField(x,y,2)         left=left-1     end If end while left=2 'Springer while left>0     x=int(rnd*7.9999)     y=int(rnd*6.9999)     if ScanField(x,y,7)=0 then         SetField(x,y,3)         left=left-1     end If end while left=2 'Läufer while left>0     x=int(rnd*7.9999)     y=int(rnd*6.9999)     if ScanField(x,y,7)=0 then         SetField(x,y,4)         left=left-1     end If end while left=1 'Dame while left>0     x=int(rnd*7.9999)     y=int(rnd*6.9999)     if ScanField(x,y,7)=0 then         SetField(x,y,5)         left=left-1     end If end while left=1 'König while left>0     x=int(rnd*7.9999)     y=int(rnd*6.9999)     if ScanField(x,y,7)=0 then         SetField(x,y,6)         left=left-1     end If end while ' Display field (test) for y=0 to 7     for x=0 to 7         a=ScanField(x,y,7)         x1=x*3+1         y1=y*3+1         if a=1 then print at y1,x1;"B";:end If         if a=2 then print at y1,x1;"T";:end If         if a=3 then print at y1,x1;"S";:end If         if a=4 then print at y1,x1;"L";:end If         if a=5 then print at y1,x1;"D";:end If         if a=6 then print at y1,x1;"K";:end If     next x next y posx=7:posy=7 Mainloop: x1=posx*3+1 y1=posy*3+1 print at y1,x1;"F"; if inkey\$="o" and posx>0 then print at y1,x1;" ";:posx=posx-1:ScanFields(posx,posy):end if if inkey\$="p" and posx<7 then print at y1,x1;" ";:posx=posx+1:ScanFields(posx,posy):end if if inkey\$="q" and posy>0 then print at y1,x1;" ";:posy=posy-1:ScanFields(posx,posy):end if if inkey\$="a" and posy<7 then print at y1,x1;" ";:posy=posy+1:ScanFields(posx,posy):end if goto Mainloop 'pause 0 End chessboard: asm     defb 32,64,32,64,32,64,32,64     defb 64,32,64,32,64,32,64,32     defb 32,64,32,64,32,64,32,64     defb 64,32,64,32,64,32,64,32     defb 32,64,32,64,32,64,32,64     defb 64,32,64,32,64,32,64,32     defb 32,64,32,64,32,64,32,64     defb 64,32,64,32,64,32,64,32      end asm overlay: '0=Leer '1=Bauer '2=Turm '3=Springer '4=Läufer '5=Königin '6=König '+128=hidden '+64=White field '+32=Black field asm     defb 56,80,56,80,56,80,56,80     defb 80,56,80,56,80,56,80,56     defb 56,80,56,80,56,80,56,80     defb 80,56,80,56,80,56,80,56     defb 56,80,56,80,56,80,56,80     defb 80,56,80,56,80,56,80,56     defb 56,80,56,80,56,80,56,80     defb 80,56,80,56,80,56,80,56 end asm``` Re: Optimiser -o3 bug found - boriel - 03-06-2011 LCD Wrote:Hi Boriel, I have found a bug with -o3 optimiser (-o2 works well) In following code (not fully finished yet) in -o3 mode not all chess Figures are displayed. The figures are named in german as they are just placeholders for graphics that will be added later.There seems to be another bug in the peephole optimizer. Will check it out... LCD Wrote:Oh, just noticed that also the binary operator shortcuts (|, &, ...) are not working too (yet).Damn! :evil: I forgot to include them! :oops: (fixing) Re: Optimiser -o3 bug found - boriel - 03-21-2011 I think I catched it! Please, download version 1.2.8s682 and tell me if -O3 works now (it should). :roll: Re: Optimiser -o3 bug found - LTee - 03-22-2011 All my tests seem to be working fine with the new version, and as a bonus my main game project will now compile again with -O3! It didn't before (I'm not sure if I mentioned it or not), but I hadn't tried compiling it with -O3 in earlier versions so I didn't know if it was a regression or not. Regardless, it's fixed! Thumbs up! :-) Re: Optimiser -o3 bug found (*solved*) - LCD - 03-22-2011 Confirmation: Chessboard Attacks now compiles with -o3 and no other problems arisen until now. Great, Boriel!!! Thank you.