English Amiga Board


Go Back   English Amiga Board > Coders > Coders. Asm / Hardware

 
 
Thread Tools
Old 18 November 2019, 23:18   #21
ross
Per aspera ad astra

ross's Avatar
 
Join Date: Mar 2017
Location: Crossing the Rubicon
Age: 49
Posts: 2,234
I'm the only one that associate minterms with Karnaugh maps?
https://en.wikipedia.org/wiki/Karnaugh_map
I'm used to it by high school.

@Antiriad: of course your method is fine.
I used very non-standard minterms on certain occasions
ross is offline  
Old 18 November 2019, 23:32   #22
Antiriad_UK
Registered User

 
Join Date: Mar 2019
Location: Birmingham, UK
Posts: 142
Quote:
Originally Posted by ross View Post
I'm the only one that associate minterms with Karnaugh maps?
Yep, just you
Antiriad_UK is offline  
Old 18 November 2019, 23:45   #23
ross
Per aspera ad astra

ross's Avatar
 
Join Date: Mar 2017
Location: Crossing the Rubicon
Age: 49
Posts: 2,234
Quote:
Originally Posted by antiriad_uk View Post
yep, just you
the forum does not make me use a single smiley face

EDIT: OK, I've to write more than just the solo emoticons, else a :d is displayed

Last edited by ross; 19 November 2019 at 00:12.
ross is offline  
Old 19 November 2019, 01:20   #24
DanScott
Lemon. / Core Design

DanScott's Avatar
 
Join Date: Mar 2016
Location: Sunny Bournemouth, UK
Posts: 480
Quote:
Originally Posted by jotd View Post
that makes a lot of sense. I'm using amigeconv which does NOT create the extra mask "bitplane" but I'm also hacking the converted "raw" format to add dimensions, number of planes (header), so I can also read bitplane data, OR them together and add the last bitplane, or just generate it when I read the data (which is less flexible as if we need a real black and not transparent we can't do that)

Thanks. I'll test that when I have the time. Too much work/family/sports/other ATM...
THe only way to guarantee a proper "mask" is to have it hand drawn. Most times, colour 0 will be black, but still you need this "cutout" pixel in the mask
DanScott is offline  
Old 19 November 2019, 01:23   #25
DanScott
Lemon. / Core Design

DanScott's Avatar
 
Join Date: Mar 2016
Location: Sunny Bournemouth, UK
Posts: 480
Quote:
Originally Posted by Antiriad_UK View Post
@Dan, yeah sorry A and B for Bob/Mask, C for screen
[/CODE]
Bulk of your quote removed but yes, I use this truth table method. To me it is the easiest way to caclulate the minterm for the desired result based on source (ABC) and dest (D)

A lot easier than other methods I've read about or seen
DanScott is offline  
Old 19 November 2019, 01:24   #26
DanScott
Lemon. / Core Design

DanScott's Avatar
 
Join Date: Mar 2016
Location: Sunny Bournemouth, UK
Posts: 480
plus it makes it easy to determine minterms value for "strange" and custom blitter operaions
DanScott is offline  
Old 22 November 2019, 21:40   #27
Photon
Moderator

Photon's Avatar
 
Join Date: Nov 2004
Location: Eksjö / Sweden
Posts: 4,781
Yes, I've never used minterms(!) They do have many formal applications in CS, but the Blitter has 3 sources and that means that as long as you know binary logic, you can figure there are 8 combinations, number them 000...111, give them the result expected in D, and you get the $ca in $fca directly.

So I've always had this 8-row table as a file that I can include and fill in. How was it ever in the HRM!? HRM is the book that taught me minterms and nothing else. Oh well, weird. But good.

And yep, masks are needed before starting to blit bobs. They are created by ORing together the bitplanes of the bob, causing every pixel where the color combination of bits is not 0 (background color) to be 1.

Quote:
Originally Posted by jotd View Post
when you read blitter "tutorials" they explain you all the minterm equation shit and you don't understand anything practical. Okay I can mask/shift and test XOR/AND at the same time on 3 different planets but I just wanted to paste an image...
This is because the Amiga Blitter was created by a visionary - it's general-purpose and versatile. Any logical operation upon memory is possible with it, and then some. And that was the point!

It's true that before and after, we saw all manner of custom chips, but special-purpose - narrower vision.
Photon is offline  
Old 23 November 2019, 01:12   #28
DanScott
Lemon. / Core Design

DanScott's Avatar
 
Join Date: Mar 2016
Location: Sunny Bournemouth, UK
Posts: 480
Quote:
Originally Posted by Photon View Post
They are created by ORing together the bitplanes of the bob, causing every pixel where the color combination of bits is not 0 (background color) to be 1.
As I mentioned a couple of posts up, this is not necessarily the case, as often (in all the games I made anyway), colour 0 would / could also be used in the bob graphics data
DanScott is offline  
Old 23 November 2019, 04:47   #29
NorthWay
Registered User
 
Join Date: May 2013
Location: Grimstad / Norway
Posts: 614
Quote:
Originally Posted by DanScott View Post
As I mentioned a couple of posts up, this is not necessarily the case, as often (in all the games I made anyway), colour 0 would / could also be used in the bob graphics data
You could make some ZX style graphics by having the mask bigger than the OR of the pixels - they often cleared 1 pixel every way around the image.
NorthWay is offline  
Old 23 November 2019, 11:54   #30
Antiriad_UK
Registered User

 
Join Date: Mar 2019
Location: Birmingham, UK
Posts: 142
While we are on the subject of masks...

I've got a 3bpl 32x32px BOB. The bob changes every frame and I want to generate the cookie cut mask for it. I want to blit the BOB in one blit so it is interleaved so I need 3 copies of the mask. Is there a cunning way to do this?

1. Use some CPU time during another blit and just use the CPU to generate the masks.

2. With blitter. A=bpl1, B=bpl2, C=bpl3. First blit A|B|C to generate one copy of the mask. Then 2 more blits to make another 2 copies.
Antiriad_UK is offline  
Old 23 November 2019, 13:43   #31
ross
Per aspera ad astra

ross's Avatar
 
Join Date: Mar 2017
Location: Crossing the Rubicon
Age: 49
Posts: 2,234
Quote:
Originally Posted by Antiriad_UK View Post
While we are on the subject of masks...

I've got a 3bpl 32x32px BOB. The bob changes every frame and I want to generate the cookie cut mask for it. I want to blit the BOB in one blit so it is interleaved so I need 3 copies of the mask. Is there a cunning way to do this?

1. Use some CPU time during another blit and just use the CPU to generate the masks.

2. With blitter. A=bpl1, B=bpl2, C=bpl3. First blit A|B|C to generate one copy of the mask. Then 2 more blits to make another 2 copies.
On A500 target, sure 2. is faster.
No advantages from 1. because practically the CPU routine would do nothing but read and write on 16-bit chip memory
(therefore no operation superimposable to that of the blitter, unless you are using filling or cleaning operations..).
ross is offline  
Old 23 November 2019, 13:59   #32
Antiriad_UK
Registered User

 
Join Date: Mar 2019
Location: Birmingham, UK
Posts: 142
Yeah, that's what I'm thinking . There is a blit fill occurring but its of the same 32x32 area I want to mask, and I'm already using some CPU routines there
Antiriad_UK is offline  
Old 23 November 2019, 16:20   #33
Photon
Moderator

Photon's Avatar
 
Join Date: Nov 2004
Location: Eksjö / Sweden
Posts: 4,781
Quote:
Originally Posted by Antiriad_UK View Post
While we are on the subject of masks...

Is there a cunning way to do this?
It's not time-critical, because this is usually done when the bob graphics are loaded/unpacked. So do it any old way. Also worth considering is that, at that time you might also want to do any shifting-to-column-0 and cutting them out automatically with pixel-precision from a densely packed picture that the artist delivered.

For small amounts of bobs, you can cut them out manually in the Kefrens Iff Converter, and it will create the masks for you, with interleaved copies if you want.

Quote:
Originally Posted by DanScott View Post
As I mentioned a couple of posts up, this is not necessarily the case, as often (in all the games I made anyway), colour 0 would / could also be used in the bob graphics data
I mentioned the general case, I have to see this as a special case because a custom mask can be drawn by the graphics artist, sure, on the assumption that all objects are n-bitplane bobs and are blitted onto the n-bitplane screen buffer, but this is quite expensive and so will force a choice to decrease bob count, color count, or frame rate.

If that assumption is not met, you would in some cases not get color 0 where the extra mask is, but other graphics would show through it, and so now you have to plan and communicate the bitplane use and layout to the artist, and this can cause some headaches with delivery.

Quote:
Originally Posted by NorthWay View Post
You could make some ZX style graphics by having the mask bigger than the OR of the pixels - they often cleared 1 pixel every way around the image.
The ZX didn't have multi-colored objects, so this works on it and always gives the background color. The ZX had color clashing, and so games would often be 1 foreground color and 1 background color for the majority of the screen. On the ZX, the larger mask created outlines, making the main software sprites stand out better on the monochrome screen (the contour sometimes broadened and finagled to lessen color clashes).

On Amiga though, the assumption above must be met to make the outline color 0.
Photon is offline  
Old 30 November 2019, 13:36   #34
jotd
This cat is no more
jotd's Avatar
 
Join Date: Dec 2004
Location: FRANCE
Age: 48
Posts: 3,303
okay, here's my SDL_UpperBlit (the main routine that blits images to the screen) C++ routine.

It uses amiga bitplanes + mask. The straight copy to screen (without masking) works with shifting, clipping and all, but the "cookie cut" mode doesn't work properly. We clearly see that the background & the main sprite are merged, but there are stripes and I was wondering what did I forget (I didn't use BLTCON1 as I don't have a clue, I don't need it in basic copy but maybe in "cookie cut" mode).

Of course my mask may be wrong, but I've created them with a python program, ORing all the other bitplanes. And it would not stripe the pic

Code:
 int SDLCALL SDL_UpperBlit
    (SDL_Surface *source, SDL_Rect *src_rect,
    SDL_Surface *destination, SDL_Rect *dst_rect)
  {

    SDL_Rect src_clip;
    if (src_rect == nullptr)
      {
	// no source rect: clip bounds are source bounds
	src_clip.x = 0;
	src_clip.y = 0;
	src_clip.w = source->w;
	src_clip.h = source->h;
      }
    else
      {
	src_clip = *src_rect;
      }
    


    SDL_Rect dst_clip;
    //dst_clip.w = destination->w;
    //dst_clip.h = destination->h;

    if (dst_rect == nullptr)
      {
	// no source rect: clip bounds are source bounds
	dst_clip.x = 0;
	dst_clip.y = 0;
      }
    else
      {
	dst_clip.x = dst_rect->x;
	dst_clip.y = dst_rect->y;
      }
    

    // clipping to avoid that a bob writes past end of the screen
    // handle blitting out of target bounds
    if (dst_clip.x < 0)
      {
	// remove left part
	src_clip.x -= dst_clip.x;
	src_clip.w += dst_clip.x;
	dst_clip.x = 0;
      }
    else if (dst_clip.x+src_clip.w > destination->w)
      {
	// remove right part
	src_clip.w = destination->w - dst_clip.x;
      }
    
    if (dst_clip.y < 0)
      {
	// remove left part
	src_clip.y -= dst_clip.y;
	src_clip.h += dst_clip.y;
	dst_clip.y = 0;
      }
    else if (dst_clip.y+src_clip.h > destination->h)
      {
	// remove right part
	src_clip.h = destination->h - dst_clip.y;
      }
   
    if (source->w < 16 or src_clip.w <16)
      {

	// not using the blitter. Slow but not a problem since those objects aren't written
	// frequently
	// an optimization could be to copy a byte if width is exactly 8 and x is divisible by 8...
	for (int y=0; y < std::min(src_clip.h,dst_clip.h); y++)
	  {
	    for (int x=0; x < std::min(src_clip.w,dst_clip.w); x++)
	      {
		SDL_SetPixel(destination,x+dst_clip.x,y+dst_clip.y,SDL_GetPixel(source,x+src_clip.x,y+src_clip.y));
	      }
	  }
      }
    else
      {
	SDL_Amiga_Surface *amiga_source = (SDL_Amiga_Surface *)(source);
	SDL_Amiga_Surface *amiga_destination = (SDL_Amiga_Surface *)(destination);

	
	if ((src_clip.y >= src_clip.h) or (src_clip.x >= src_clip.w))
	  {
	    // x/y clip start too high: don't draw
	    return 0;
	  }
	// safety: limit source width if too wide / image width
	if (src_clip.x + src_clip.w > source->w)
	  {
	    src_clip.w = source->w - src_clip.x;
	  }
	// safety: limit source height if too wide / image height
	if (src_clip.y + src_clip.h > source->h)
	  {
	    src_clip.h = source->h - src_clip.y;
	  }
	if ((src_clip.w <= 0) or (src_clip.h <= 0))
	  {
	    // if width or height end up being negative, don't blit anything
	    return 0;
	  }
	

	  
	// TEMP don't do anything
	if ((destination->w < src_clip.w) or (destination->h < src_clip.h))
	  {
	    return 0;
	  }

	UBYTE *srcptr = (UBYTE *)amiga_source->pixels + (src_clip.x>>3);
	if (src_clip.y)
	  {	    
	    srcptr +=  src_clip.y * ((amiga_source->w)>>3);
	  }
	
	OwnBlitter();

	custom.dmacon = 0x8040;   // dirty enable blit
	
	bool cookie_cut_mode = (amiga_source->image_type == SDL_Amiga_Surface::SHIFTABLE_TRANSPARENT_BOB);
	UWORD xshift = (amiga_source->image_type == SDL_Amiga_Surface::SHIFTABLE_BOB ? ((dst_clip.x & 0xF) << 12) : 0);
	// compute shift mask too if shiftable bob (else leave at 0)
	custom.bltcon1 = 0x0000;
	if (not cookie_cut_mode)
	  {
	    // no cookie cut: blit overwrites what's underneath
	    //move.l #$09f00000,bltcon0(a5)	;A->D copy, no shifts, ascending mode
	    custom.bltcon0 = 0x09f0 | xshift;
	  }
	else
	  {
	    // cookie cut
	    // thanks for help found in this thread: http://eab.abime.net/showthread.php?p=1359724#post1359724
	    // quoting mcgeezer:
	    // "You have to feed the blitter with a mask of your sprite through channel A,
	    // you feed your actual bob bitmap through channel B, and you feed your pristine background through channel C."
	    
	    // setting the proper mintern value + shift
	    custom.bltcon0 = 0x0fca | xshift;
	    
	  }
	
	custom.bltafwm = 0xFFFF;
	custom.bltalwm = 0xFFFF;
	UWORD source_modulo = (amiga_source->w-src_clip.w)>>3;
	UWORD dest_modulo = (amiga_destination->w-src_clip.w)>>3;
	//move.l #$ffffffff,bltafwm(a5)	;no masking of first/last word
	custom.bltamod = source_modulo;
	//move.w #0,bltamod(a5)		;A modulo=bytes to skip between lines
	custom.bltdmod = dest_modulo;


	int pixoffset = (dst_clip.x>>3) + dst_clip.y*(amiga_destination->w>>3);
	UBYTE *dstptr = (UBYTE*)amiga_destination->pixels + pixoffset;

	if (cookie_cut_mode)
	  {
	    custom.bltbmod = source_modulo;
	    custom.bltcmod = dest_modulo;
	    custom.bltapt = amiga_destination->mask + pixoffset;
	  }
	
	auto asrcbw = src_clip.w>>4;
	// BLTSIZE=height*64+width(words: so width divided by 16 and min 1)
	UWORD blit_size = src_clip.h*64+asrcbw;


	for (int i=0;i<NB_PLANES;i++)
	  {
	    if (cookie_cut_mode)
	      {
		custom.bltbpt = srcptr;
		custom.bltcpt = dstptr;
	      }
	    else    
	      {
		custom.bltapt = srcptr;
	      }
	    custom.bltdpt = dstptr;
	    // BLTSIZE=height*64+width(words: so width divided by 16 and min 1)
	    custom.bltsize = blit_size;

	    //move.l a0,bltapt(a5)	;source graphic top left corner
	    //move.l a3,bltdpt(a5)	;destination top left corner
	    //move.w #blith*64+blitw,bltsize(a5)	;rectangle size, starts blit

	    srcptr += amiga_source->plane_size;
	    dstptr += amiga_destination->plane_size;
	    wait_blit();
	  }
	DisownBlitter();
      }

    return 0;
  }
botched pic

Name:  botched_mask.PNG
Views: 89
Size:  645 Bytes

Last edited by jotd; 30 November 2019 at 13:43.
jotd is offline  
Old 30 November 2019, 14:02   #35
Antiriad_UK
Registered User

 
Join Date: Mar 2019
Location: Birmingham, UK
Posts: 142
Can you just change the code in the simple copy version to copy the mask to the screen, easy way to confirm if mask is ok. Looking at the rest.

Edit: You'll need to write the B shift value in bltcon1 as well. Mask and BOB both need to be shifted the same
Edit: You are not setting the bltapth each bitplane loop in cookie cut mode. Assuming it's a single bpl mask so you need to repoint to it each loop.

Last edited by Antiriad_UK; 30 November 2019 at 14:38.
Antiriad_UK is offline  
Old 30 November 2019, 23:46   #36
mcgeezer
Registered User

 
Join Date: Oct 2017
Location: Sunderland, England
Posts: 1,510
Quote:
Originally Posted by jotd View Post
okay, here's my SDL_UpperBlit (the main routine that blits images to the screen) C++ routine.

It uses amiga bitplanes + mask. The straight copy to screen (without masking) works with shifting, clipping and all, but the "cookie cut" mode doesn't work properly. We clearly see that the background & the main sprite are merged, but there are stripes and I was wondering what did I forget (I didn't use BLTCON1 as I don't have a clue, I don't need it in basic copy but maybe in "cookie cut" mode).

Of course my mask may be wrong, but I've created them with a python program, ORing all the other bitplanes. And it would not stripe the pic

Code:
 int SDLCALL SDL_UpperBlit
    (SDL_Surface *source, SDL_Rect *src_rect,
    SDL_Surface *destination, SDL_Rect *dst_rect)
  {

    SDL_Rect src_clip;
    if (src_rect == nullptr)
      {
	// no source rect: clip bounds are source bounds
	src_clip.x = 0;
	src_clip.y = 0;
	src_clip.w = source->w;
	src_clip.h = source->h;
      }
    else
      {
	src_clip = *src_rect;
      }
    


    SDL_Rect dst_clip;
    //dst_clip.w = destination->w;
    //dst_clip.h = destination->h;

    if (dst_rect == nullptr)
      {
	// no source rect: clip bounds are source bounds
	dst_clip.x = 0;
	dst_clip.y = 0;
      }
    else
      {
	dst_clip.x = dst_rect->x;
	dst_clip.y = dst_rect->y;
      }
    

    // clipping to avoid that a bob writes past end of the screen
    // handle blitting out of target bounds
    if (dst_clip.x < 0)
      {
	// remove left part
	src_clip.x -= dst_clip.x;
	src_clip.w += dst_clip.x;
	dst_clip.x = 0;
      }
    else if (dst_clip.x+src_clip.w > destination->w)
      {
	// remove right part
	src_clip.w = destination->w - dst_clip.x;
      }
    
    if (dst_clip.y < 0)
      {
	// remove left part
	src_clip.y -= dst_clip.y;
	src_clip.h += dst_clip.y;
	dst_clip.y = 0;
      }
    else if (dst_clip.y+src_clip.h > destination->h)
      {
	// remove right part
	src_clip.h = destination->h - dst_clip.y;
      }
   
    if (source->w < 16 or src_clip.w <16)
      {

	// not using the blitter. Slow but not a problem since those objects aren't written
	// frequently
	// an optimization could be to copy a byte if width is exactly 8 and x is divisible by 8...
	for (int y=0; y < std::min(src_clip.h,dst_clip.h); y++)
	  {
	    for (int x=0; x < std::min(src_clip.w,dst_clip.w); x++)
	      {
		SDL_SetPixel(destination,x+dst_clip.x,y+dst_clip.y,SDL_GetPixel(source,x+src_clip.x,y+src_clip.y));
	      }
	  }
      }
    else
      {
	SDL_Amiga_Surface *amiga_source = (SDL_Amiga_Surface *)(source);
	SDL_Amiga_Surface *amiga_destination = (SDL_Amiga_Surface *)(destination);

	
	if ((src_clip.y >= src_clip.h) or (src_clip.x >= src_clip.w))
	  {
	    // x/y clip start too high: don't draw
	    return 0;
	  }
	// safety: limit source width if too wide / image width
	if (src_clip.x + src_clip.w > source->w)
	  {
	    src_clip.w = source->w - src_clip.x;
	  }
	// safety: limit source height if too wide / image height
	if (src_clip.y + src_clip.h > source->h)
	  {
	    src_clip.h = source->h - src_clip.y;
	  }
	if ((src_clip.w <= 0) or (src_clip.h <= 0))
	  {
	    // if width or height end up being negative, don't blit anything
	    return 0;
	  }
	

	  
	// TEMP don't do anything
	if ((destination->w < src_clip.w) or (destination->h < src_clip.h))
	  {
	    return 0;
	  }

	UBYTE *srcptr = (UBYTE *)amiga_source->pixels + (src_clip.x>>3);
	if (src_clip.y)
	  {	    
	    srcptr +=  src_clip.y * ((amiga_source->w)>>3);
	  }
	
	OwnBlitter();

	custom.dmacon = 0x8040;   // dirty enable blit
	
	bool cookie_cut_mode = (amiga_source->image_type == SDL_Amiga_Surface::SHIFTABLE_TRANSPARENT_BOB);
	UWORD xshift = (amiga_source->image_type == SDL_Amiga_Surface::SHIFTABLE_BOB ? ((dst_clip.x & 0xF) << 12) : 0);
	// compute shift mask too if shiftable bob (else leave at 0)
	custom.bltcon1 = 0x0000;
	if (not cookie_cut_mode)
	  {
	    // no cookie cut: blit overwrites what's underneath
	    //move.l #$09f00000,bltcon0(a5)	;A->D copy, no shifts, ascending mode
	    custom.bltcon0 = 0x09f0 | xshift;
	  }
	else
	  {
	    // cookie cut
	    // thanks for help found in this thread: http://eab.abime.net/showthread.php?p=1359724#post1359724
	    // quoting mcgeezer:
	    // "You have to feed the blitter with a mask of your sprite through channel A,
	    // you feed your actual bob bitmap through channel B, and you feed your pristine background through channel C."
	    
	    // setting the proper mintern value + shift
	    custom.bltcon0 = 0x0fca | xshift;
	    
	  }
	
	custom.bltafwm = 0xFFFF;
	custom.bltalwm = 0xFFFF;
	UWORD source_modulo = (amiga_source->w-src_clip.w)>>3;
	UWORD dest_modulo = (amiga_destination->w-src_clip.w)>>3;
	//move.l #$ffffffff,bltafwm(a5)	;no masking of first/last word
	custom.bltamod = source_modulo;
	//move.w #0,bltamod(a5)		;A modulo=bytes to skip between lines
	custom.bltdmod = dest_modulo;


	int pixoffset = (dst_clip.x>>3) + dst_clip.y*(amiga_destination->w>>3);
	UBYTE *dstptr = (UBYTE*)amiga_destination->pixels + pixoffset;

	if (cookie_cut_mode)
	  {
	    custom.bltbmod = source_modulo;
	    custom.bltcmod = dest_modulo;
	    custom.bltapt = amiga_destination->mask + pixoffset;
	  }
	
	auto asrcbw = src_clip.w>>4;
	// BLTSIZE=height*64+width(words: so width divided by 16 and min 1)
	UWORD blit_size = src_clip.h*64+asrcbw;


	for (int i=0;i<NB_PLANES;i++)
	  {
	    if (cookie_cut_mode)
	      {
		custom.bltbpt = srcptr;
		custom.bltcpt = dstptr;
	      }
	    else    
	      {
		custom.bltapt = srcptr;
	      }
	    custom.bltdpt = dstptr;
	    // BLTSIZE=height*64+width(words: so width divided by 16 and min 1)
	    custom.bltsize = blit_size;

	    //move.l a0,bltapt(a5)	;source graphic top left corner
	    //move.l a3,bltdpt(a5)	;destination top left corner
	    //move.w #blith*64+blitw,bltsize(a5)	;rectangle size, starts blit

	    srcptr += amiga_source->plane_size;
	    dstptr += amiga_destination->plane_size;
	    wait_blit();
	  }
	DisownBlitter();
      }

    return 0;
  }
botched pic

Attachment 65369

I may have missed it and I'm no C programmer but I can't see in your code where you are setting the barrel shifter in BLTCON1 in Cookie Cut mode, I see it in BLTCON0 though.

You need to set the high nibble of BLTCON1 to the same as BLTCON0.

For example, if BLTCON0 is $6FCA then BLTCON1 needs to be $6000.

mcgeezer
mcgeezer is offline  
Old 01 December 2019, 00:23   #37
jotd
This cat is no more
jotd's Avatar
 
Join Date: Dec 2004
Location: FRANCE
Age: 48
Posts: 3,303
Barrel shifter! of course. Thanks both of you. now fixed (hey this isn't C it's C++ 2011 standard could it be the first amiga game written in C++ looks like C but the rest of the game use OO techniques)

Oh and thanks Antiriad_UK: the mask was indeed wrong. I had the same idea (display the mask) then I just was too lazy to implement it. Now the blit & mask is perfect !

I made a quick test and the graphics are shifted & wrong (still things to improve) but the speed is very good for a standard machine (at least on WinUAE). I think game can run at 50 Hz without issues.

Last edited by jotd; 01 December 2019 at 00:36.
jotd is offline  
 


Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
 
Thread Tools

Similar Threads
Thread Thread Starter Forum Replies Last Post
Blitter queues h0ffman Coders. General 28 22 August 2019 11:29
Blitter problem zeGouky Coders. Asm / Hardware 7 26 March 2014 15:12
Blitter busy flag with blitter DMA off? NorthWay Coders. Asm / Hardware 9 23 February 2014 22:05
Help, need a CWB refresher please! rave project.ClassicWB 9 03 January 2011 17:08
Blitter Question. cdoty Coders. General 11 06 May 2005 16:22

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT +2. The time now is 04:16.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, vBulletin Solutions Inc.
Page generated in 0.08438 seconds with 14 queries