[Coco] Let's figure out the best method to compile sprites for the CoCo - Please add your input

Steve Bamford stevecindybamford at yahoo.co.uk
Sat May 13 08:00:35 EDT 2017


[just noticed I hit reply, not reply all, so resending] :(

I'm not so much short of memory as keen to cram in as many fun elements as possible. :)


Pre-shifted sprites are working pretty well performance-wise. I strike a memory/performance balance by shifting and mirroring some sprite data into a common buffer only when it's required and overwrite it as necessary.


The lookup table suggestion is a interesting idea but wouldn't pay dividends in my situation.

I'm not that experienced at coding but I don't think there is a single best method for drawing sprites. The trade-offs are going to be different from game to game but being aware of a broad range of techniques definitely leads to better tailored solutions.

On a general related note, I find thinking about how data is stored can lead to efficiencies when it comes to processing sprites etc.

Cheers,
Steve.

      From: msmcdoug <msmcdoug at iinet.net.au>
 To: CoCoList for Color Computer Enthusiasts <coco at maltedmedia.com> 
Cc: Steve Bamford <stevecindybamford at yahoo.co.uk>
 Sent: Saturday, 13 May 2017, 11:28
 Subject: Re: [Coco] Let's figure out the best method to compile sprites for the CoCo - Please add your input
   
 If you're running out of space but your sprites are plenty fast enough you can use lookup tables for shifted bytes rather than store shifted sprites. Slower of course, but maybe fast enough. 

Sent from my Samsung GALAXY S5

-------- Original message --------
From: Steve Bamford via Coco <coco at maltedmedia.com> 
Date: 13/05/2017 7:56 PM (GMT+10:00) 
To: CoCoList for Color Computer Enthusiasts <coco at maltedmedia.com> 
Cc: Steve Bamford <stevecindybamford at yahoo.co.uk> 
Subject: Re: [Coco] Let's figure out the best method to compile sprites for the CoCo - Please add your input 

Hi Glen.
I haven't gone down the compiled sprite route as I'm fine for performance but limited on memory.
My game features a lot of sprites which are pre-shifted for speed but less than 32k of Ram to squeeze the whole game into. That said it's working out pretty well and the game runs smoothly at 60Hz.
I should add this is a Dragon/CoCo2 game so the graphics mode will differ from what you're using.
Cheers,Steve.

      From: Glen Hewlett <glen.hewlett at sympatico.ca>
 To: CoCoList for Color Computer Enthusiasts <coco at maltedmedia.com> 
 Sent: Saturday, 13 May 2017, 1:22
 Subject: Re: [Coco] Let's figure out the best method to compile sprites for the CoCo - Please add your input
   
Hi Steve,

Are you talking about regular stack blasting?  Where you do a PULS & PSHU then move U to the next line?  That is what I was using for my sprites originally.  Then I found compiled sprites are faster.  Now I’ve kind of combined them both the code is super fast and short.  This is an example of simple 8 x 8 sprite of a Pac Man Power Pill (which has a lot of repeated data).  In my case it needs to be 5 bytes long (shifted one pixel) so it’s actually 10x8
444AAAA444
44AAAAAA44
4AAAAAAAA4
4AAAAAAAA4
4AAAAAAAA4
4AAAAAAAA4
44AAAAAA44
444AAAA444
Stack Blasting version: Cycles = 238, bytes = 40 the  bytes are from the original sprite data to be copied from, the code below can be reused for all the sprites that are the same size so I won’t count that FYI it is 76 bytes
7D40 10FF7D8C        (pacman_6809_Main_):09388 [7]    7              STS    Temp1
7D44 10CE7D8E        (pacman_6809_Main_):09389 [4]    11              LDS    #PowerPillData
7D48 3384            (pacman_6809_Main_):09390 [4+0]  15              LEAU    ,X
7D4A 33C90385        (pacman_6809_Main_):09391 [4+4]  23              LEAU    5+128*7,U
7D4E 351E            (pacman_6809_Main_):09392 [5+5]  33              PULS    D,DP,X
7D50 361E            (pacman_6809_Main_):09393 [5+5]  43              PSHU    D,DP,X
7D52 33C885          (pacman_6809_Main_):09394 [4+1]  48              LEAU    -123,U
7D55 351E            (pacman_6809_Main_):09395 [5+5]  58              PULS    D,DP,X
7D57 361E            (pacman_6809_Main_):09396 [5+5]  68              PSHU    D,DP,X
7D59 33C885          (pacman_6809_Main_):09397 [4+1]  73              LEAU    -123,U
7D5C 351E            (pacman_6809_Main_):09398 [5+5]  83              PULS    D,DP,X
7D5E 361E            (pacman_6809_Main_):09399 [5+5]  93              PSHU    D,DP,X
7D60 33C885          (pacman_6809_Main_):09400 [4+1]  98              LEAU    -123,U
7D63 351E            (pacman_6809_Main_):09401 [5+5]  108            PULS    D,DP,X
7D65 361E            (pacman_6809_Main_):09402 [5+5]  118            PSHU    D,DP,X
7D67 33C885          (pacman_6809_Main_):09403 [4+1]  123            LEAU    -123,U
7D6A 351E            (pacman_6809_Main_):09404 [5+5]  133            PULS    D,DP,X
7D6C 361E            (pacman_6809_Main_):09405 [5+5]  143            PSHU    D,DP,X
7D6E 33C885          (pacman_6809_Main_):09406 [4+1]  148            LEAU    -123,U
7D71 351E            (pacman_6809_Main_):09407 [5+5]  158            PULS    D,DP,X
7D73 361E            (pacman_6809_Main_):09408 [5+5]  168            PSHU    D,DP,X
7D75 33C885          (pacman_6809_Main_):09409 [4+1]  173            LEAU    -123,U
7D78 351E            (pacman_6809_Main_):09410 [5+5]  183            PULS    D,DP,X
7D7A 361E            (pacman_6809_Main_):09411 [5+5]  193            PSHU    D,DP,X
7D7C 33C885          (pacman_6809_Main_):09412 [4+1]  198            LEAU    -123,U
7D7F 351E            (pacman_6809_Main_):09413 [5+5]  208            PULS    D,DP,X
7D81 361E            (pacman_6809_Main_):09414 [5+5]  218            PSHU    D,DP,X
7D83 8600            (pacman_6809_Main_):09415 [2]    220            LDA    #DirectPage/256
7D85 1F8B            (pacman_6809_Main_):09416 [6]    226            TFR    A,DP
7D87 10FE7D8C        (pacman_6809_Main_):09417 [7]    233            LDS    Temp1
7D8B 39              (pacman_6809_Main_):09418 [5]    238            RTS

Regular compiled sprite code (many methods can be used for this, and optimized a little more): Cycles = 199, bytes = 104
7C93 3005            (pacman_6809_Main_):09310 [4+1]  5              LEAX    5,X
7C95 CC444A          (pacman_6809_Main_):09311 [3]    8              LDD    #$444A
7C98 ED1B            (pacman_6809_Main_):09312 [5+1]  14              STD    -5,X
7C9A CCAAA4          (pacman_6809_Main_):09313 [3]    17              LDD    #$AAA4
7C9D ED1D            (pacman_6809_Main_):09314 [5+1]  23              STD    -3,X
7C9F C6AA            (pacman_6809_Main_):09315 [2]    25              LDB    #$AA
7CA1 ED887C          (pacman_6809_Main_):09316 [5+1]  31              STD    124,X
7CA4 C644            (pacman_6809_Main_):09317 [2]    33              LDB    #$44
7CA6 E71F            (pacman_6809_Main_):09318 [4+1]  38              STB    -1,X
7CA8 E7887B          (pacman_6809_Main_):09319 [4+1]  43              STB    123,X
7CAB ED887E          (pacman_6809_Main_):09320 [5+1]  49              STD    126,X
7CAE 30890100        (pacman_6809_Main_):09321 [4+4]  57              LEAX    256,X
7CB2 C6A4            (pacman_6809_Main_):09322 [2]    59              LDB    #$A4
7CB4 ED1E            (pacman_6809_Main_):09323 [5+1]  65              STD    -2,X
7CB6 ED887E          (pacman_6809_Main_):09324 [5+1]  71              STD    126,X
7CB9 C6AA            (pacman_6809_Main_):09325 [2]    73              LDB    #$AA
7CBB ED1C            (pacman_6809_Main_):09326 [5+1]  79              STD    -4,X
7CBD ED887C          (pacman_6809_Main_):09327 [5+1]  85              STD    124,X
7CC0 864A            (pacman_6809_Main_):09328 [2]    87              LDA    #$4A
7CC2 A71B            (pacman_6809_Main_):09329 [4+1]  92              STA    -5,X
7CC4 A7887B          (pacman_6809_Main_):09330 [4+1]  97              STA    123,X
7CC7 30890100        (pacman_6809_Main_):09331 [4+4]  105            LEAX    256,X
7CCB ED1B            (pacman_6809_Main_):09332 [5+1]  111            STD    -5,X
7CCD ED887B          (pacman_6809_Main_):09333 [5+1]  117            STD    123,X
7CD0 86AA            (pacman_6809_Main_):09334 [2]    119            LDA    #$AA
7CD2 ED1D            (pacman_6809_Main_):09335 [5+1]  125            STD    -3,X
7CD4 ED887D          (pacman_6809_Main_):09336 [5+1]  131            STD    125,X
7CD7 C6A4            (pacman_6809_Main_):09337 [2]    133            LDB    #$A4
7CD9 E71F            (pacman_6809_Main_):09338 [4+1]  138            STB    -1,X
7CDB E7887F          (pacman_6809_Main_):09339 [4+1]  143            STB    127,X
7CDE 30890100        (pacman_6809_Main_):09340 [4+4]  151            LEAX    256,X
7CE2 C644            (pacman_6809_Main_):09341 [2]    153            LDB    #$44
7CE4 ED1E            (pacman_6809_Main_):09342 [5+1]  159            STD    -2,X
7CE6 E71B            (pacman_6809_Main_):09343 [4+1]  164            STB    -5,X
7CE8 E7887B          (pacman_6809_Main_):09344 [4+1]  169            STB    123,X
7CEB C6AA            (pacman_6809_Main_):09345 [2]    171            LDB    #$AA
7CED ED1C            (pacman_6809_Main_):09346 [5+1]  177            STD    -4,X
7CEF 864A            (pacman_6809_Main_):09347 [2]    179            LDA    #$4A
7CF1 ED887C          (pacman_6809_Main_):09348 [5+1]  185            STD    124,X
7CF4 CCA444          (pacman_6809_Main_):09349 [3]    188            LDD    #$A444
7CF7 ED887E          (pacman_6809_Main_):09350 [5+1]  194            STD    126,X
7CFA 39              (pacman_6809_Main_):09351 [5]    199            RTS

Here is the new version using PSHU and the DP register:  Cycles = 167, bytes = 69
7CFB 3384            (pacman_6809_Main_):09356 [4+0]  4              LEAU    ,X
7CFD 33C90285        (pacman_6809_Main_):09357 [4+4]  12              LEAU    5+128*5,U
7D01 CC4AAA          (pacman_6809_Main_):09358 [3]    15              LDD    #$4AAA
7D04 1F9B            (pacman_6809_Main_):09359 [6]    21              TFR    B,DP
7D06 8EAAA4          (pacman_6809_Main_):09360 [3]    24              LDX    #$AAA4
7D09 361E            (pacman_6809_Main_):09361 [5+5]  34              PSHU    D,DP,X
7D0B 33C885          (pacman_6809_Main_):09362 [4+1]  39              LEAU    -123,U
7D0E 361E            (pacman_6809_Main_):09363 [5+5]  49              PSHU    D,DP,X
7D10 33C885          (pacman_6809_Main_):09364 [4+1]  54              LEAU    -123,U
7D13 361E            (pacman_6809_Main_):09365 [5+5]  64              PSHU    D,DP,X
7D15 33C885          (pacman_6809_Main_):09366 [4+1]  69              LEAU    -123,U
7D18 361E            (pacman_6809_Main_):09367 [5+5]  79              PSHU    D,DP,X
7D1A 33C885          (pacman_6809_Main_):09368 [4+1]  84              LEAU    -123,U
7D1D 8644            (pacman_6809_Main_):09369 [2]    86              LDA    #$44
7D1F 8EAA44          (pacman_6809_Main_):09370 [3]    89              LDX    #$AA44
7D22 361E            (pacman_6809_Main_):09371 [5+5]  99              PSHU    D,DP,X
7D24 33C90285        (pacman_6809_Main_):09372 [4+4]  107            LEAU    5+128*5,U
7D28 361E            (pacman_6809_Main_):09373 [5+5]  117            PSHU    D,DP,X
7D2A 33C90085        (pacman_6809_Main_):09374 [4+4]  125            LEAU    128+5,U
7D2E C64A            (pacman_6809_Main_):09375 [2]    127            LDB    #$4A
7D30 8EA444          (pacman_6809_Main_):09376 [3]    130            LDX    #$A444
7D33 361E            (pacman_6809_Main_):09377 [5+5]  140            PSHU    D,DP,X
7D35 33C9FC85        (pacman_6809_Main_):09378 [4+4]  148            LEAU    5-128*7,U
7D39 361E            (pacman_6809_Main_):09379 [5+5]  158            PSHU    D,DP,X
7D3B 8600            (pacman_6809_Main_):09380 [2]    160            LDA    #DirectPage/256
7D3D 1F8B            (pacman_6809_Main_):09381 [6]    166            TFR    A,DP
7D3F 39              (pacman_6809_Main_):09382 [5]    171            RTS

On simple sprites like the PSHU can save a lot of cycles and bytes over the already fast compiled sprites.  This one example went from 199 CPU cycles to 171 CPU cycles and the byte count went down from 104 to 69!  If I setup U as my pointer ahead of time before I call the sprite routine I can remove the LEAU    ,X instruction on the first line and save another 4 cycles and two bytes.

Another thing to think about could be the order of colours in the colour palette.  The Power Pill sprite above uses $4 for black and $A for almost white in the palette table.  If the black was changed to the value $B in the palette, then it might be possible to use INCA or INCB or DECA or DECB to save a byte and cycle if the accumulators can be changed in that way.  It doesn’t seem to work with this sprite but it might for others.  Just a thought...

This is looking very interesting now.  As always I’d love to hear if anyone has any other ideas for speeding up the sprite rendering.

Cheers,
Glen

> On May 12, 2017, at 3:06 PM, Steve Bamford via Coco <coco at maltedmedia.com> wrote:
> 
> This is exactly the technique I use for drawing sprites ie. PULing consecutive data bytes, (four bytes at a time), and drawing the sprite from bottom to top.
> 
> This approach also works well when a character's origin is at their feet.
> 
>      From: Glen Hewlett <glen.hewlett at sympatico.ca>
> To: CoCoList for Color Computer Enthusiasts <coco at maltedmedia.com> 
> Sent: Friday, 12 May 2017, 19:48
> Subject: Re: [Coco] Let's figure out the best method to compile sprites for the CoCo - Please add your input
> 
> Great idea Curtis!
> 
> That’s definitely something else to add to the collection of ideas on how to create the smallest and fastest compiled sprites.
> 
> Thanks for the input,
> Glen
>> On May 12, 2017, at 10:56 AM, L. Curtis Boyle <curtisboyle at sasktel.net> wrote:
>> 
>> Since PSHing goes backwards in RAM, it might be more efficient to draw your sprite from bottom to top (better chance that your LEAU’s will be smaller), depending on the graphics mode you are using, and the width of the sprite.
>> 
>> L. Curtis Boyle
>> curtisboyle at sasktel.net
>> 


-- 
Coco mailing list
Coco at maltedmedia.com
https://pairlist5.pair.net/mailman/listinfo/coco


   

-- 
Coco mailing list
Coco at maltedmedia.com
https://pairlist5.pair.net/mailman/listinfo/coco


   


More information about the Coco mailing list