Sparse Invaders Source - Invaders Bases.txt

Sparse Invaders Source - Invader_Bases.txt
;---   ;  Invader_Bases ; 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 . ;   ;    ;   Notes: ;   Controls the bases, setup, drawing and removal plus collison. ;   ;---    .require "Constands" .require "Macros" ;---   .alias   BLOCKS_BOTH  36            ; block number for drawing .alias  BLOCKS_LEFT  37	    ; ...    .alias   BLOCKS_RIGHT 38            ; ...    .alias   BLOCKS_BLANK 40	    ; ...     .alias   BASE_Y       22            ; block line for top of base .alias  BASE_Y2      23            ; block line for mid section of base .alias  BASE_Y3      24            ; block line for bottom f base .alias  BASE1_X      4             ; block x start for base 1 .alias  BASE2_X      9             ; block x start for base 2 .alias  BASE3_X      14            ; block x start for base 3 .alias  PIXELS_BASE_Y1START 22*8   ; pixel start for Y position of top row .alias  PIXELS_BASE_Y2START 23*8   ; pixel start for Y position of mid row .alias  PIXELS_BASE_Y3START 24*8   ; pixel start for Y position of bottom row .alias  PIXELS_BASE1_XSTART 32     ; pixel start for X position for base one .alias  PIXELS_BASE1_XEND   56     ; pixel end for X position for base one .alias  PIXELS_BASE2_XSTART 72     ; pixel start for X position for base two .alias  PIXELS_BASE2_XEND   96     ; pixel end for X position for base two .alias  PIXELS_BASE3_XSTART 112    ; pixel start for X position for base three .alias  PIXELS_BASE3_XEND   136    ; pixel end for X position for base three ; masking for the block sections ... .alias  BLOCKRIGHT_MASK     $03    ; bit mask for both segments for the right block .alias  BLOCKRIGHT_BOTH     $03    ; bit value for both segments for the right block .alias  BLOCKRIGHT_LEFT     $02    ; bit value for left segment for the right block .alias  BLOCKRIGHT_RIGHT    $01    ; bit value for right segment for the right block .alias  BLOCKMID_MASK       $0c    ; bit mask for both segments for the mid block .alias  BLOCKMID_BOTH       $0c    ; bit value for both segments for the mid block .alias  BLOCKMID_LEFT       $08    ; bit value for left segment for the mid block .alias  BLOCKMID_RIGHT      $04    ; bit value for right segment for the mid block .alias  BLOCKLEFT_MASK      $30    ; bit mask for both segments for the left block .alias  BLOCKLEFT_BOTH      $30    ; bit value for both segments for the left block .alias  BLOCKLEFT_LEFT      $20    ; bit value for left segment for the left block .alias  BLOCKLEFT_RIGHT     $10    ; bit value for right segment for the left block ;---   ; Init: ;  initializes the bases ;---   Init: ; sort out the bit mask for the blocks LDA #$3f STA BASE1_1 STA BASE2_1 STA BASE3_1 STA BASE1_2 STA BASE2_2 STA BASE3_2 STA BASE1_3 STA BASE2_3 STA BASE3_3 ; clear the flag for clearing the base lines if the invaders reach that pos LDA #0 STA BASELINEFLAG RTS ;---   ;---    ; CheckCollison: ;   Checks the collison, retruns Carry clear if no collisons...    ;    This checks the collision with the three bases. It's a little long winded ;   as I decided, for better or worse, to use bit masks for the shootable blocks ;   within the bases. ;   X - x position ;   y - y position ;---   CheckCollison: ; firstly, do the Y check, as easy ...      TYA LSR LSR LSR STA STOREY CMP #BASE_Y BMI CC_end CMP #BASE_Y3+1 BPL CC_end ; now the x positions...      LDA  #0 STA SCRATCH1 TXA ASL STA SCRATCH4 STA STOREX CMP #PIXELS_BASE1_XSTART BMI CC_end CMP #PIXELS_BASE1_XEND BMI CC_gotya1 INC SCRATCH1 CMP #PIXELS_BASE2_XSTART BMI CC_end CMP #PIXELS_BASE2_XEND BMI CC_gotya2 INC SCRATCH1 CMP #PIXELS_BASE3_XSTART BMI CC_end CMP #PIXELS_BASE3_XEND BMI CC_gotya3 CC_end: CLC RTS CC_gotya1: ; ok got a collison with a block base 1 ... LDA STOREX SEC SBC #PIXELS_BASE1_XSTART LSR LSR TAX LSR STA STOREX JMP CC_cont CC_gotya2: ; ok got a collison with a block base 2 ... LDA STOREX SEC SBC #PIXELS_BASE2_XSTART LSR LSR TAX LSR STA STOREX JMP CC_cont CC_gotya3: ; ok got a collison with a block base 3 ... LDA STOREX SEC SBC #PIXELS_BASE3_XSTART LSR LSR TAX LSR STA STOREX CC_cont: ; calculate the position / segment within the block that has collided LDA STOREY SEC SBC #BASE_Y STA STOREY LDA SCRATCH1 `MUL3 TEMP CLC ADC STOREY CLC ADC #BASE1_1 STA USERPTR LDA #0 STA USERPTR+1 ; create mask for the segment within the byte ( note six segments per row ) LDA #$DF                   ;  11011111 CPX #0 BEQ CC_sortmask ROR                        ;  11101111 DEX BEQ CC_sortmask ROR                        ;  11110111 DEX BEQ CC_sortmask ROR                        ;  11111011 DEX BEQ CC_sortmask ROR                        ;  11111101 DEX BEQ CC_sortmask ROR                        ;  11111110 CC_sortmask: ; scratch1 - block number ; scratch2 - block mask position (starting at Base1_1 ) ; scratch3 - bit to lose in collison STA SCRATCH3 EOR #255 STA SCRATCH4 ; better check and if removed, don't draw ... This is not optinal as check at end of function LDX #0 LDA (USERPTR,X) AND SCRATCH4 BEQ CC_alreadygot ; store the new bit mask ... LDA (USERPTR,X) AND SCRATCH3 STA (USERPTR,X) ; redraw the block .... note it's BLANK, LEFT, RIGHT, BOTH LDA SCRATCH1 LDX STOREX LDY STOREY JSR RedrawBlock ; collision - so set carry before return... SEC RTS CC_alreadygot: ; no collision so clear carry ... CLC RTS ;---   ;  RedrawBlock ;    A - Block number ;    X - Block x - i.e  0,1 or 2 ;    y - Block y position - i.e  0,1 or 2 ;---   RedrawBlock: ; store the information passed in ...       STA  STOREA STX STOREX STY STOREY ; calculate line for block details ... `MUL3 TEMP CLC ADC #BASE1_1 CLC ADC STOREY STA USERPTR LDX #0 STX USERPTR+1 LDA (USERPTR,X) STA SCRATCH1 ; store the block line address LDA STOREX BEQ RW_CALCL CMP #1 BEQ RW_CALCM RW_CALCR: LDA SCRATCH1 LDX #BLOCKS_BLANK AND #BLOCKRIGHT_MASK BEQ RW_DrawBlock LDX #BLOCKS_BOTH CMP #BLOCKRIGHT_BOTH BEQ RW_DrawBlock LDX #BLOCKS_LEFT CMP #BLOCKRIGHT_LEFT BEQ RW_DrawBlock LDX #BLOCKS_RIGHT JMP RW_DrawBlock RW_CALCM: LDA SCRATCH1 LDX #BLOCKS_BLANK AND #BLOCKMID_MASK BEQ RW_DrawBlock LDX #BLOCKS_BOTH CMP #BLOCKMID_BOTH BEQ RW_DrawBlock LDX #BLOCKS_LEFT CMP #BLOCKMID_LEFT BEQ RW_DrawBlock LDX #BLOCKS_RIGHT JMP RW_DrawBlock RW_CALCL: LDA SCRATCH1 LDX #BLOCKS_BLANK AND #BLOCKLEFT_MASK BEQ RW_DrawBlock LDX #BLOCKS_BOTH CMP #BLOCKLEFT_BOTH BEQ RW_DrawBlock LDX #BLOCKS_LEFT CMP #BLOCKLEFT_LEFT BEQ RW_DrawBlock LDX #BLOCKS_RIGHT RW_DrawBlock: STX SCRATCH1 LDA STOREY CLC ADC #BASE_Y TAY INC STOREA LDA STOREA `MUL5 TEMP SEC SBC #1 CLC ADC STOREX TAX LDA SCRATCH1  ; block JMP BlockDrawer.BlockDraw ;---   ;  BlankLine ;   draws the base, y block coords for the line to remove... ;   Note - this was written for when the ivaders reach the y position just ;   before the row in question. This row is then completey removed... ;---   BlankLine: ; better blank the mask... TYA CMP #BASE_Y BNE BL_try2 LDA BASELINEFLAG AND #$01 BNE BL_end ORA #$01 STA BASELINEFLAG LDA #0 STA BASE1_1 STA BASE2_1 STA BASE3_1 JMP BL_Hmm BL_try2: CMP #BASE_Y2 BNE BL_try3 LDA BASELINEFLAG AND #$02 BNE BL_end ORA #$02 STA BASELINEFLAG LDA #0 STA BASE1_2 STA BASE2_2 STA BASE3_2 JMP BL_Hmm BL_try3: CMP #BASE_Y3 BEQ BL_do3 BL_end: RTS BL_do3: LDA BASELINEFLAG AND #$04 BNE BL_end ORA #$04 STA BASELINEFLAG LDA #0 STA BASE1_3 STA BASE2_3 STA BASE3_3 BL_Hmm: ; blank the whole line, even if already partially blanked... LDX #BASE1_x STX XPOS STY YPOS LDA #40 JSR BlockDrawer.BlockDraw INC XPOS LDA #40 LDX XPOS LDY YPOS JSR BlockDrawer.BlockDraw INC XPOS LDA #40 LDX XPOS LDY YPOS JSR BlockDrawer.BlockDraw LDX #BASE2_X STX XPOS LDA #40 LDY YPOS JSR BlockDrawer.BlockDraw INC XPOS LDA #40 LDX XPOS LDY YPOS JSR BlockDrawer.BlockDraw INC XPOS LDA #40 LDX XPOS LDY YPOS JSR BlockDrawer.BlockDraw LDX #BASE3_X STX XPOS LDA #40 LDY YPOS JSR BlockDrawer.BlockDraw INC XPOS LDA #40 LDX XPOS LDY YPOS JSR BlockDrawer.BlockDraw INC XPOS LDA #40 LDX XPOS LDY YPOS JMP BlockDrawer.BlockDraw ;---   ;  DrawBases ;   draws the bases... ;---   DrawBases: LDX #BASE1_x LDY #BASE_Y JSR DrawBase LDX #BASE2_x LDY #BASE_Y JSR DrawBase LDX #BASE3_x LDY #BASE_Y JMP DrawBase ;---   ;  DrawBase ;   draws the base, x,y block coords for top left of base... ;---   DrawBase: STX XPOS STY YPOS LDA #BLOCKS_BOTH JSR BlockDrawer.BlockDraw INC XPOS LDA #BLOCKS_BOTH LDX XPOS LDY YPOS JSR BlockDrawer.BlockDraw INC XPOS LDA #BLOCKS_BOTH LDX XPOS LDY YPOS JSR BlockDrawer.BlockDraw DEC XPOS DEC XPOS INC YPOS LDA #BLOCKS_BOTH LDX XPOS LDY YPOS JSR BlockDrawer.BlockDraw INC XPOS LDA #BLOCKS_BOTH LDX XPOS LDY YPOS JSR BlockDrawer.BlockDraw INC XPOS LDA #BLOCKS_BOTH LDX XPOS LDY YPOS JSR BlockDrawer.BlockDraw DEC XPOS DEC XPOS INC YPOS LDA #BLOCKS_BOTH LDX XPOS LDY YPOS JSR BlockDrawer.BlockDraw INC XPOS LDA #BLOCKS_BOTH LDX XPOS LDY YPOS JSR BlockDrawer.BlockDraw INC XPOS LDA #BLOCKS_BOTH LDX XPOS LDY YPOS JSR BlockDrawer.BlockDraw RTS ;---