Sparse Invaders Source - Screen.txt

From Retrosoftware

Jump to: navigation, search

Sparse Invaders Source - Screen.txt

Screen Functionality. This includes displaying on screen messages, score and clearing the screen. This file also contains support functionality for handling the score etc.

the score is processed simply as you will notice once seeing the code, it's handled numbers up to 9999 which is more then enough for invaders.


   ;-------------------------------------------------------------------------------
   ;  ScreenFunctionality
   ;  Written by Neil Beresford.
   ;
   ;  Copyright 2008,2009 Neil Beresford
   ;
   ;    This file is part of Sparse Invaders.
   ;    Sparse Invaders is free software: you can redistribute it and/or modify
   ;    it under the terms of the GNU General Public License as published by
   ;    the Free Software Foundation, either version 3 of the License, or
   ;    (at your option) any later version.
   ;
   ;    Sparse Invaders is distributed in the hope that it will be useful,
   ;    but WITHOUT ANY WARRANTY; without even the implied warranty of
   ;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   ;    GNU General Public License for more details.
   ;
   ;    You should have received a copy of the GNU General Public License
   ;    along with Sparse Invaders.  If not, see <http://www.gnu.org/licenses/>.
   ;
   ;
   ;
   ;-------------------------------------------------------------------------------

   .require "Constands"
   .require "Macros"


   ;-------------------------------------------------------------------------------
   ;-------------------------------------------------------------------------------

SCREEN_UPDATE_COUNT - this is the delay before update the score.


   .alias SCREEN_UPDATE_COUNT 5


UpdateScreen updates the game on screen items like number of lives left and score. Please note the use of the SCREEN_UPDATE, this means that screen information is only updated every 5 game frames. This reduces unwanted drawing every frame, as the area of screen where this is drawn isn't drawn over. This could be a little smarter - and just be flagged when needed to be updated. However as killing an invader increases the score, this function would generally be called as much as it is.


   ;-------------------------------------------------------------------------------
   ; UpdateScreen - 
   ;     Invaders screen update, score etc
   ;
   ;-------------------------------------------------------------------------------
   UpdateScreen:

      ; check to see if update to screen needed...
      LDA   SCREEN_UPDATE
      BEQ   US_Update  
      RTS
      
   US_Update:

      ; update the player lifes 
      LDA   PLAYER_LIFES
      STA   SCRATCH3
      LDA   #39
      LDX   #1
      STX   SCRATCH4

   US_Lives:

      LDA   #39
      LDX   SCRATCH4
      LDY   #29
      jsr   BLockDrawer.BlockDraw

      INC   SCRATCH4
      
      DEC   SCRATCH3
      BNE   US_Lives

   US_ClearRest:

      LDA   #40
      LDX   SCRATCH4
      LDY   #29
      jsr   BLockDrawer.BlockDraw

      INC   SCRATCH4
      LDA   SCRATCH4
      CMP   #11   
      BNE   US_ClearRest





      ; reset count, this means screen update every 5 frames
      LDA   #SCREEN_UPDATE_COUNT
      STA   SCREEN_UPDATE

      ; check to see score addition needed...
      LDA   SCORE_ADDITION
      BEQ   US_End

      ; dec the score and then update the values ...
      DEC   SCORE_ADDITION
      
      ; use X for clearer...
      LDX   #0      

      ; inc the units, if less then 10, then update units only
      INC   ScreenScore+3
      LDA   ScreenScore+3
      CMP   #10
      BCC   US_D000X 
      STX   ScreenScore+3
      ; inc the tens, if less then 10, then update tens and units only
      INC   ScreenScore+2
      LDA   ScreenScore+2
      CMP   #10
      BCC   US_D00X0 
      STX   ScreenScore+2
      ; inc the hundreads, if less then 10, then update hundreds tens and units only
      INC   ScreenScore+1
      LDA   ScreenScore+1
      CMP   #10
      BCC   US_D0X00 
      STX   ScreenScore+1
      ; inc the thousands, then update all values
      INC   ScreenScore
      LDA   ScreenScore
      CMP   #10
      BCC   US_DX000 

      ; score wrap around - 
      STX   ScreenScore
      
   US_DX000:                     ; update the thousands

      LDA  ScreenScore
      LDX  #15
      LDY  #29
      jsr  BLockDrawer.BlockDraw
      
   US_D0X00:                     ; update the hundreds

      LDA  ScreenScore+1
      LDX  #16
      LDY  #29
      jsr  BLockDrawer.BlockDraw
      
   US_D00X0:                     ; update the tens

      LDA  ScreenScore+2
      LDX  #17
      LDY  #29
      jsr  BLockDrawer.BlockDraw
      
   US_D000X:                     ; update the units

      LDA  ScreenScore+3
      LDX  #18
      LDY  #29
      jsr  BLockDrawer.BlockDraw
      

   US_End:

      RTS



AdjustScore updates the score using SCORE_ADDITION. Any score achived would be added to this value - and the score would increment accordingly. The speed of the increment is fast enough as to keep up with the scores achived within Invaders.


   ;-------------------------------------------------------------------------------
   ; AdjustScore  - 
   ;     Updates the score value only...
   ;-------------------------------------------------------------------------------
   AdjustScore:

      ; check to see score addition needed...
      LDA   SCORE_ADDITION
      BEQ   US_End

      ; dec the score and then update the values ...
      DEC   SCORE_ADDITION
      
      ; use X for clearer...
      LDX   #0      

      ; inc the units, if less then 10, then update units only
      INC   ScreenScore+3
      LDA   ScreenScore+3
      CMP   #10
      BCC   AS_end 
      STX   ScreenScore+3
      ; inc the tens, if less then 10, then update tens and units only
      INC   ScreenScore+2
      LDA   ScreenScore+2
      CMP   #10
      BCC   AS_end 
      STX   ScreenScore+2
      ; inc the hundreads, if less then 10, then update hundreds tens and units only
      INC   ScreenScore+1
      LDA   ScreenScore+1
      CMP   #10
      BCC   AS_end 
      STX   ScreenScore+1
      ; inc the thousands, then update all values
      INC   ScreenScore
      LDA   ScreenScore
      CMP   #10
      BCC   AS_end 

      ; score wrap around - 
      STX   ScreenScore
      
   AS_end:

      RTS
       


DrawScore jumps into the score drawing functionality.


   ;-------------------------------------------------------------------------------
   ; DrawScore - 
   ;     Updates the score on the screen...
   ;
   ;-------------------------------------------------------------------------------
   DrawScore:

      JMP  US_DX000  ; i'M SURE this label makes sence, just give me a moment ... ;-)


   ;-------------------------------------------------------------------------------


ClearScore clears the stored values.


   ClearScore:
 
      LDA #0
      STA ScreenScore
      STA ScreenScore+1
      STA ScreenScore+2
      STA ScreenScore+3
      RTS   

   ScreenScore:
      .byte 0,0,0,0



Screen_CopyScoreToString converts the score into ascii and stores in the string (USERPTR points to this)


   ;-------------------------------------------------------------------------------
   ; Screen_CopyScoreToString:
   ;   USERPTR - points to string
   ;-------------------------------------------------------------------------------
   Screen_CopyScoreToString:

      LDY  #0
      LDA  ScreenScore
      CLC
      ADC  #48
      STA  (USERPTR),Y
      INY
      LDA  ScreenScore+1
      CLC
      ADC  #48
      STA  (USERPTR),Y
      INY
      LDA  ScreenScore+2
      CLC
      ADC  #48
      STA  (USERPTR),Y
      INY
      LDA  ScreenScore+3
      CLC
      ADC  #48
      STA  (USERPTR),Y

      RTS   



Screen_PositionedMessage displays the string onto the screen. The first two bytes are screen position then follows the NULL terminated string.


   ;-------------------------------------------------------------------------------
   ; Screen_PositionedMessage:
   ;     displays message, using blocks
   ;     No gramma please in string - and only lowercase and numbers!
   ;     USERPTR - string to display... first two chars position...
   ;-------------------------------------------------------------------------------
   Screen_PositionedMessage:

      LDY  #0
      LDA  (USERPTR),Y
      STA  SCRATCH2
      INY
      LDA  (USERPTR),Y
      INY
      STA  SCRATCH3
      JMP  SM_Loop   

   ;-------------------------------------------------------------------------------
   ; Screen_Message - 
   ;     displays message, using blocks (starting at 10)
   ;     zero terminated.
   ;     No gramma please in string - and only lowercase!
   ;     USERPTR - string to display...
   ;     x - xpos in 8x8 blocks
   ;     y - ypos in 8x8 blocks
   ;-------------------------------------------------------------------------------
   Screen_Message:

      STX  SCRATCH2
      STY  SCRATCH3
      LDY  #0

       
   SM_loop:

      LDA  (USERPTR),Y
      BEQ  SM_end

      CMP  #32    ; space value ...
      BNE  SM_checknum


      ; DRAW SPACE ...
      STY  SCRATCH4
      LDA  #40
      LDX  SCRATCH2
      LDY  SCRATCH3
      JSR  BlockDrawer.BlockDraw
      LDY  SCRATCH4
      JMP  SM_next

   SM_checknum:

      CMP  #96
      BCS  SM_char 
      SEC
      SBC  #48
      JMP  SM_draw   
 
   SM_char:
       
      SEC
      SBC  #97-10   ; lower 'a' then plus the numbers

   SM_draw:
       
      STY  SCRATCH4
      LDX  SCRATCH2
      LDY  SCRATCH3
      JSR  BlockDrawer.BlockDraw
      LDY  SCRATCH4 
 
   SM_Next:
 
      INC  SCRATCH2
      INY
      JMP  SM_Loop
 
   SM_end:
 
      RTS


Screen_Clear clears the full screen, setting it to colour ZERO (black in game)


   ;-------------------------------------------------------------------------------
   ; Screen_Clear - 
   ;     clears the screen to colour zero
   ;
   ;-------------------------------------------------------------------------------
   Screen_Clear:
 
      LDA  #SCREENLOW
      STA  ScreenClearAddPtr+1
      LDA  #SCREENHIGH
      STA  ScreenClearAddPtr+2
 
   SC_Reset:
 
      LDA  #0
 
   SC_Loop:
   ScreenClearAddPtr:
      STA  $FFFF
 
      INC  ScreenClearAddPtr+1
      BNE  SC_Loop
      LDA  ScreenClearAddPtr+2
      CLC
      ADC  #1
      STA  ScreenClearAddPtr+2
      CMP  #$80
      BNE  SC_Reset
 
      RTS
  
 
   ;-------------------------------------------------------------------------------
   ; End of ScreenFunctionality
   ;-------------------------------------------------------------------------------