Sprite memory viewer


As I am finishing TX-1696, there is some more polish being added as I go through the levels one more time, and with that extra polish is the need for 5 more hardware sprites.

Having made changes and additions to the game over the last 18 months or so its hard to remember what sprites are still being used and what has been replaced therefore it would be good to see what the sprite memory on the real next hardware looks like at any given moment, to this end I have written a small sprite memory viewer which does the job for me.

Just call this function after you have uploaded your sprites to the hardware, remembering to place a break point at the bottom of the function.

I have commented the code for you and shared it so you may make use of it or even modify it to your own needs.

Sorry about the spaces, but this stupid plugin requires spaces rather than tabs.

Enjoy

REG_PALETTE_CONTROL        equ    $43
SPRITES_1ST_PALETTE        equ    %00100000
REG_PALETTE_INDEX          equ    $40
REG_PALETTE_COLOUR         equ    $41    
REG_SPRITE_CLIP            equ    $19

REG_SPRITE_NUMBER          equ    $34
REG_SPRITE_ATTRIBUTE0      equ    $35
REG_SPRITE_ATTRIBUTE1      equ    $36
REG_SPRITE_ATTRIBUTE2      equ    $37
REG_SPRITE_ATTRIBUTE3      equ    $38
REG_SPRITE_ATTRIBUTE4      equ    $39

VIEW_COLOUR                equ    255
SPRITES_ACROSS             equ    14
SPRITES_X_START            equ    32
SPRITES_Y_START            equ    32

spriteMemViewer:
                          nextreg    REG_PALETTE_CONTROL,SPRITES_1ST_PALETTE  // say we are changing the sprite 
                                                                              // first palette    
                          ld         b,16                                     // 16 colours
                          nextreg    REG_PALETTE_INDEX,0                      // start with colour zero
.paletteLoop:    
                          nextreg    REG_PALETTE_COLOUR,VIEW_COLOUR           // send the viewer colour to the hardware
                          djnz       .paletteLoop                             // do 16 colours

                          nextreg    REG_SPRITE_CLIP,0                        // make sure we 
                          nextreg    REG_SPRITE_CLIP,255                      // can see all the sprites
                          nextreg    REG_SPRITE_CLIP,0                        // by resetting the clip of the screen
                          nextreg    REG_SPRITE_CLIP,191                      // to its default settings

                          ld         b,0                                      // count for 128 sprites
                          ld         c,0                                      // count for how many across the screen
                          ld         hl,SPRITES_X_START                       // first sprite X start position  
                          ld         de,SPRITES_Y_START                       // first sprite Y start position  
.show128Sprites:
                          ld         a,b                                      // get the sprite index (number)
                          nextreg    REG_SPRITE_NUMBER,a                      // and tell the hardware the attributes
                                                                              // are for this sprite
                          ld         a,l                                      // get the x pos LSB
                          nextreg    REG_SPRITE_ATTRIBUTE0,a                  // set the harware x pos
                          ld         a,e                                      // get the y pos LSB
                          nextreg    REG_SPRITE_ATTRIBUTE1,a                  // set the harware y pos
                          ld         a,h                                      // get the x pos MSB
                          and        1                                        // mask off the position high bit
                          nextreg    REG_SPRITE_ATTRIBUTE2,a                  // set the harware x pos MSB
                          ld         a,b                                      // now get the sprite count
                          srl        a                                        // divide by two (only for 4 bit patterns)
                          or         %11000000                                // or in the visible bit using attribute 4 
                          nextreg    REG_SPRITE_ATTRIBUTE3,a                  // send the hardware pattern (0-63)
                                                                              // and display bits
                          ld         a,b                                      // get the count again
                          and        1                                        // and see if its an odd number
                          jp         nz,.notPlus128                           // it is odd
                          ld         a,%10000000                              // not odd so set the 4 bit patterns bit
                          jp         .att4                                    // done    
.notPlus128:
                          ld         a,%11000000                              // odd so set the 4 bit patterns bit
                                                                              // and last 128 bytes bit
.att4:
                          nextreg    REG_SPRITE_ATTRIBUTE4,a                  // tell set the attribute 4
                          add        hl,18                                    // add 18 pixels between sprites
                          inc        c                                        // increment the sprite number across screen
                          ld         a,c                                      // move for math
                          cp         SPRITES_ACROSS                           // is it a full row
                          jp         nz,.notNextRow                           // not yet
                          ld         c,0                                      // it is so reset the count
                          ld         hl,SPRITES_X_START                       // reset the start position
                          add        de,18                                    // add 18 to the Y position
.notNextRow:
                          inc        b                                        // next sprite    
                          bit        7,b                                      // have we done 128 of them
                          jp         z,.show128Sprites                        // not yet so keep going 
                          ret                                                 // add a break point here