📄 invaders.asm
字号:
Movlw 1
Btfsc STATUS,0
Clrw
Movwf SP#P9
Movff BASE_ENABLED#4,PP0
Movlw 1
F@Call t@eb
Andwf SP#P9,W
Btfsc STATUS,2
Go@to bc@LL25
F1_000226 equ $ ; in [INVADERS.BAS] Inc BASE_HITS#4 ' Increment the amount of hits the base element has sustained
Incf BASE_HITS#4,F
F1_000227 equ $ ; in [INVADERS.BAS] BASE_HIT = TRUE ' Indicate a missile has hit a target
Bsf MISSILE_STATUS,2
F@Jump bc@LL26
bc@LL25
F1_000228 equ $ ; in [INVADERS.BAS] Else
F1_000229 equ $ ; in [INVADERS.BAS] BASE_ENABLED#4 = FALSE ' Disable the base element
Clrf BASE_ENABLED#4
F1_000230 equ $ ; in [INVADERS.BAS] Endif
bc@LL26
F@Jump bc@LL1
bc@LL23
F1_000231 equ $ ; in [INVADERS.BAS] Case 66 to 71 ' Has the missile XPOS hit BASE 2, ELEMENT 5
Movlw 65
Cpfsgt BASE_XPOS_TEST
F@Jump bc@LL28
Movlw 72
Cpfslt BASE_XPOS_TEST
F@Jump bc@LL28
F1_000232 equ $ ; in [INVADERS.BAS] If BASE_HITS#5 < 5 AND BASE_ENABLED#5 = TRUE Then ' Is the base element enabled, and has had less than 5 hits ?
Movlw 5
Subwf BASE_HITS#5,W
Movlw 1
Btfsc STATUS,0
Clrw
Movwf SP#P9
Movff BASE_ENABLED#5,PP0
Movlw 1
F@Call t@eb
Andwf SP#P9,W
Btfsc STATUS,2
Go@to bc@LL30
F1_000233 equ $ ; in [INVADERS.BAS] Inc BASE_HITS#5 ' Increment the amount of hits the base element has sustained
Incf BASE_HITS#5,F
F1_000234 equ $ ; in [INVADERS.BAS] BASE_HIT = TRUE ' Indicate a missile has hit a target
Bsf MISSILE_STATUS,2
F@Jump bc@LL31
bc@LL30
F1_000235 equ $ ; in [INVADERS.BAS] Else
F1_000236 equ $ ; in [INVADERS.BAS] BASE_ENABLED#5 = FALSE ' Disable the base element
Clrf BASE_ENABLED#5
F1_000237 equ $ ; in [INVADERS.BAS] Endif
bc@LL31
F@Jump bc@LL1
bc@LL28
F1_000238 equ $ ; in [INVADERS.BAS] Case 90 to 95 ' Has the missile XPOS hit BASE 3, ELEMENT 6
Movlw 89
Cpfsgt BASE_XPOS_TEST
F@Jump bc@LL33
Movlw 96
Cpfslt BASE_XPOS_TEST
F@Jump bc@LL33
F1_000239 equ $ ; in [INVADERS.BAS] If BASE_HITS#6 < 5 AND BASE_ENABLED#6 = TRUE Then ' Is the base element enabled, and has had less than 5 hits ?
Movlw 5
Subwf BASE_HITS#6,W
Movlw 1
Btfsc STATUS,0
Clrw
Movwf SP#P9
Movff BASE_ENABLED#6,PP0
Movlw 1
F@Call t@eb
Andwf SP#P9,W
Btfsc STATUS,2
Go@to bc@LL35
F1_000240 equ $ ; in [INVADERS.BAS] Inc BASE_HITS#6 ' Increment the amount of hits the base element has sustained
Incf BASE_HITS#6,F
F1_000241 equ $ ; in [INVADERS.BAS] BASE_HIT = TRUE ' Indicate a missile has hit a target
Bsf MISSILE_STATUS,2
F@Jump bc@LL36
bc@LL35
F1_000242 equ $ ; in [INVADERS.BAS] Else
F1_000243 equ $ ; in [INVADERS.BAS] BASE_ENABLED#6 = FALSE ' Disable the base element
Clrf BASE_ENABLED#6
F1_000244 equ $ ; in [INVADERS.BAS] Endif
bc@LL36
F@Jump bc@LL1
bc@LL33
F1_000245 equ $ ; in [INVADERS.BAS] Case 96 to 101 ' Has the missile XPOS hit BASE 3, ELEMENT 7
Movlw 95
Cpfsgt BASE_XPOS_TEST
F@Jump bc@LL38
Movlw 102
Cpfslt BASE_XPOS_TEST
F@Jump bc@LL38
F1_000246 equ $ ; in [INVADERS.BAS] If BASE_HITS#7 < 5 AND BASE_ENABLED#7 = TRUE Then ' Is the base element enabled, and has had less than 5 hits ?
Movlw 5
Subwf BASE_HITS#7,W
Movlw 1
Btfsc STATUS,0
Clrw
Movwf SP#P9
Movff BASE_ENABLED#7,PP0
Movlw 1
F@Call t@eb
Andwf SP#P9,W
Btfsc STATUS,2
Go@to bc@LL40
F1_000247 equ $ ; in [INVADERS.BAS] Inc BASE_HITS#7 ' Increment the amount of hits the base element has sustained
Incf BASE_HITS#7,F
F1_000248 equ $ ; in [INVADERS.BAS] BASE_HIT = TRUE ' Indicate a missile has hit a target
Bsf MISSILE_STATUS,2
F@Jump bc@LL41
bc@LL40
F1_000249 equ $ ; in [INVADERS.BAS] Else
F1_000250 equ $ ; in [INVADERS.BAS] BASE_ENABLED#7 = FALSE ' Disable the base element
Clrf BASE_ENABLED#7
F1_000251 equ $ ; in [INVADERS.BAS] Endif
bc@LL41
F@Jump bc@LL1
bc@LL38
F1_000252 equ $ ; in [INVADERS.BAS] Case 102 to 107 ' Has the missile XPOS hit BASE 3, ELEMENT 8
Movlw 101
Cpfsgt BASE_XPOS_TEST
F@Jump bc@LL43
Movlw 108
Cpfslt BASE_XPOS_TEST
F@Jump bc@LL43
F1_000253 equ $ ; in [INVADERS.BAS] If BASE_HITS#8 < 5 AND BASE_ENABLED#8 = TRUE Then ' Is the base element enabled, and has had less than 5 hits ?
Movlw 5
Subwf BASE_HITS#8,W
Movlw 1
Btfsc STATUS,0
Clrw
Movwf SP#P9
Movff BASE_ENABLED#8,PP0
Movlw 1
F@Call t@eb
Andwf SP#P9,W
Btfsc STATUS,2
Go@to bc@LL45
F1_000254 equ $ ; in [INVADERS.BAS] Inc BASE_HITS#8 ' Increment the amount of hits the base element has sustained
Incf BASE_HITS#8,F
F1_000255 equ $ ; in [INVADERS.BAS] BASE_HIT = TRUE ' Indicate a missile has hit a target
Bsf MISSILE_STATUS,2
F@Jump bc@LL46
bc@LL45
F1_000256 equ $ ; in [INVADERS.BAS] Else
F1_000257 equ $ ; in [INVADERS.BAS] BASE_ENABLED#8 = FALSE ' Disable the base element
Clrf BASE_ENABLED#8
F1_000258 equ $ ; in [INVADERS.BAS] Endif
bc@LL46
F1_000259 equ $ ; in [INVADERS.BAS] End Select
bc@LL43
bc@LL1
F1_000260 equ $ ; in [INVADERS.BAS] If BASE_HIT = TRUE Then Gosub UPDATE_BASES ' Update the base shapes if a hit was detected
Btfss MISSILE_STATUS,2
Go@to bc@LL48
F@Call UPDATE_BASES
bc@LL48
F1_000261 equ $ ; in [INVADERS.BAS] Return
Return
MOVE_INVADER_MISSILE
F1_000268 equ $ ; in [INVADERS.BAS] If INVADER_MISSILE_FIRED = TRUE Then ' Don't enter the routine if the invader's missile is already flying
Btfss MISSILE_STATUS,5
Go@to bc@LL50
F1_000269 equ $ ; in [INVADERS.BAS] If TIME_TO_MOVE_INV_MISSILE = TRUE Then ' Is it time to move the invader's missile ?
Btfss MISSILE_STATUS,4
Go@to bc@LL52
F1_000270 equ $ ; in [INVADERS.BAS] Gosub DRAW_INVADER_MISSILE
F@Call DRAW_INVADER_MISSILE
F1_000271 equ $ ; in [INVADERS.BAS] Inc INVADER_MISSILE_YPOS
Incf INVADER_MISSILE_YPOS,F
F1_000272 equ $ ; in [INVADERS.BAS] Endif
bc@LL52
F1_000273 equ $ ; in [INVADERS.BAS] If INVADER_MISSILE_YPOS >= 63 OR INVADER_MISSILE_HIT = TRUE Then ' Has the invader's missile reached the bottom of the display or hit something ?
Movlw 63
Subwf INVADER_MISSILE_YPOS,W
Clrw
Btfsc STATUS,0
Movlw 1
Movwf SP#P9
Clrw
Btfsc MISSILE_STATUS,6
Movlw 1
Iorwf SP#P9,W
Btfsc STATUS,2
Go@to bc@LL54
F1_000274 equ $ ; in [INVADERS.BAS] INVADER_MISSILE_FIRED = FALSE ' Yes. So signal the invader's missile is finished
Bcf MISSILE_STATUS,5
F1_000275 equ $ ; in [INVADERS.BAS] Gosub CLEAR_INVADER_MISSILE ' Clear the invader's missile
F@Call CLEAR_INVADER_MISSILE
F1_000276 equ $ ; in [INVADERS.BAS] INVADER_MISSILE_HIT = FALSE
Bcf MISSILE_STATUS,6
F1_000277 equ $ ; in [INVADERS.BAS] Endif
bc@LL54
F1_000278 equ $ ; in [INVADERS.BAS] Endif
bc@LL50
F1_000279 equ $ ; in [INVADERS.BAS] Return
Return
MOVE_INVADER_MISSILE2
F1_000286 equ $ ; in [INVADERS.BAS] If INVADER_MISSILE2_FIRED = TRUE Then ' Don't enter the routine if the invader's missile is already flying
Btfss _B#VR1,7
Go@to bc@LL56
F1_000287 equ $ ; in [INVADERS.BAS] If TIME_TO_MOVE_INV_MISSILE2 = TRUE Then ' Is it time to move the invader's missile ?
Btfss _B#VR1,6
Go@to bc@LL58
F1_000288 equ $ ; in [INVADERS.BAS] Gosub DRAW_INVADER_MISSILE2
F@Call DRAW_INVADER_MISSILE2
F1_000289 equ $ ; in [INVADERS.BAS] Inc INVADER_MISSILE2_YPOS
Incf INVADER_MISSILE2_YPOS,F
F1_000290 equ $ ; in [INVADERS.BAS] Endif
bc@LL58
F1_000291 equ $ ; in [INVADERS.BAS] If INVADER_MISSILE2_YPOS >= 63 OR INVADER_MISSILE2_HIT = TRUE Then ' Has the invader's missile reached the bottom of the display or hit something ?
Movlw 63
Subwf INVADER_MISSILE2_YPOS,W
Clrw
Btfsc STATUS,0
Movlw 1
Movwf SP#P9
Clrw
Btfsc _B#VR2,0
Movlw 1
Iorwf SP#P9,W
Btfsc STATUS,2
Go@to bc@LL60
F1_000292 equ $ ; in [INVADERS.BAS] INVADER_MISSILE2_FIRED = FALSE ' Yes. So signal the invader's missile is finished
Bcf _B#VR1,7
F1_000293 equ $ ; in [INVADERS.BAS] Gosub CLEAR_INVADER_MISSILE2 ' Clear the invader's missile
F@Call CLEAR_INVADER_MISSILE2
F1_000294 equ $ ; in [INVADERS.BAS] INVADER_MISSILE2_HIT = FALSE
Bcf _B#VR2,0
F1_000295 equ $ ; in [INVADERS.BAS] Endif
bc@LL60
F1_000296 equ $ ; in [INVADERS.BAS] Endif
bc@LL56
F1_000297 equ $ ; in [INVADERS.BAS] Return
Return
FIRE_INVADER_MISSILE
F1_000306 equ $ ; in [INVADERS.BAS] If INVADER_MISSILE_FIRED = FALSE Then ' Is it OK to fire an invader missile ?
Btfsc MISSILE_STATUS,5
Go@to bc@LL62
F1_000307 equ $ ; in [INVADERS.BAS] INVADER_LOOP = 0
Clrf INVADER_LOOP
F1_000308 equ $ ; in [INVADERS.BAS] Repeat ' Create a loop for all the invaders
bc@LL63
F1_000309 equ $ ; in [INVADERS.BAS] If INVADER_ENABLED[INVADER_LOOP] = TRUE Then ' Is this invader enabled ?
Lfsr 0,INVADER_ENABLED
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movf INDF0,W
Movwf PBP#VAR0
Decfsz PBP#VAR0,W
F@Jump bc@LL66
F1_000310 equ $ ; in [INVADERS.BAS] Select INVADER_XPOS[INVADER_LOOP] + 5
Lfsr 0,INVADER_XPOS
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movf INDF0,W
Movwf PBP#VAR1
Movlw 5
Addwf PBP#VAR1,W
Clrf PBP#VAR0H
Movwf PBP#VAR0
Rlcf PBP#VAR0H,F
F1_000311 equ $ ; in [INVADERS.BAS] Case SHIP_XPOS to SHIP_XPOS + 8 ' Is the invader over the ship ?
Movf PBP#VAR0H,W
Bnz cp@lb2
Movf SHIP_XPOS,W
Subwf PBP#VAR0,W
Btfss STATUS,0
Go@to bc@LL68
cp@lb2
Movlw 8
Addwf SHIP_XPOS,W
Clrf PBP#VAR1H
Movwf PBP#VAR1
Rlcf PBP#VAR1H,F
Movf PBP#VAR0,W
Subwf PBP#VAR1,W
Movf PBP#VAR0H,W
Subwfb PBP#VAR1H,W
Btfss STATUS,0
Go@to bc@LL68
F1_000312 equ $ ; in [INVADERS.BAS] INVADER_MISSILE_FIRED = TRUE ' Signal that an invader's missile is in the air
Bsf MISSILE_STATUS,5
F1_000313 equ $ ; in [INVADERS.BAS] INVADER_MISSILE_XPOS = INVADER_XPOS[INVADER_LOOP] + 5 ' Move missile XPOS to the middle of the invader
Lfsr 0,INVADER_XPOS
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movf INDF0,W
Movwf PBP#VAR1
Movlw 5
Addwf PBP#VAR1,W
Movwf INVADER_MISSILE_XPOS
F1_000314 equ $ ; in [INVADERS.BAS] INVADER_MISSILE_YPOS = (INVADER_YPOS[INVADER_LOOP] * 8) + 8 ' Move missile YPOS to below the invader
Lfsr 0,INVADER_YPOS
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movf INDF0,W
Movwf PBP#VAR1
Movf PBP#VAR1,W
Mullw 8
Movff PRODL,PP7
Movff PRODH,PP7H
Movlw 8
Addwf PP7,W
Movwf INVADER_MISSILE_YPOS
F1_000315 equ $ ; in [INVADERS.BAS] End Select
bc@LL68
bc@LL67
F1_000316 equ $ ; in [INVADERS.BAS] Endif
bc@LL66
F1_000317 equ $ ; in [INVADERS.BAS] Inc INVADER_LOOP
Incf INVADER_LOOP,F
F1_000318 equ $ ; in [INVADERS.BAS] Until INVADER_LOOP > 17 ' Close the loop when all invaders have been scanned
Movlw 17
Cpfsgt INVADER_LOOP
F@Jump bc@LL63
bc@LL64
F1_000319 equ $ ; in [INVADERS.BAS] Endif
bc@LL62
F1_000320 equ $ ; in [INVADERS.BAS] Return
Return
FIRE_INVADER_MISSILE2
F1_000330 equ $ ; in [INVADERS.BAS] If INVADER_MISSILE2_FIRED = FALSE Then ' Is it OK to fire an invader second missile ?
Btfsc _B#VR1,7
Go@to bc@LL71
F1_000332 equ $ ; in [INVADERS.BAS] Select SHIP_XPOS
Movf INVADER_MISSILE_XPOS,W
Addwf RANDOM_VALUE,W
Movwf PBP#VAR0
Clrf PBP#VAR0H
Rlcf PBP#VAR0H,F
F1_000333 equ $ ; in [INVADERS.BAS] Case > INVADER_MISSILE_XPOS + RANDOM_VALUE , < INVADER_MISSILE_XPOS - RANDOM_VALUE
Movf PBP#VAR0H,W
Bnz cp@lb4
Movf SHIP_XPOS,W
Subwf PBP#VAR0,W
Btfss STATUS,0
Go@to bc@LL74
cp@lb4
Movf RANDOM_VALUE,W
Subwf INVADER_MISSILE_XPOS,W
Movwf PBP#VAR0
Clrf PBP#VAR0H
Skpc
Decf PBP#VAR0H,F
Movf PBP#VAR0H,W
Bnz cp@lb5
Movf PBP#VAR0,W
Cpfslt SHIP_XPOS
F@Jump bc@LL73
cp@lb5
bc@LL74
F1_000334 equ $ ; in [INVADERS.BAS] INVADER_LOOP = 0
Clrf INVADER_LOOP
F1_000335 equ $ ; in [INVADERS.BAS] Repeat ' Create a loop for all the invaders
bc@LL75
F1_000336 equ $ ; in [INVADERS.BAS] If INVADER_ENABLED[INVADER_LOOP] = TRUE Then ' Is this invader enabled ?
Lfsr 0,INVADER_ENABLED
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movf INDF0,W
Movwf PBP#VAR0
Decfsz PBP#VAR0,W
F@Jump bc@LL78
F1_000337 equ $ ; in [INVADERS.BAS] Select INVADER_XPOS[INVADER_LOOP] + 5
Lfsr 0,INVADER_XPOS
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movf INDF0,W
Movwf PBP#VAR1
Movlw 5
Addwf PBP#VAR1,W
Clrf PBP#VAR0H
Movwf PBP#VAR0
Rlcf PBP#VAR0H,F
F1_000338 equ $ ; in [INVADERS.BAS] Case SHIP_XPOS to SHIP_XPOS + 8 ' Is the invader over the ship ?
Movf PBP#VAR0H,W
Bnz cp@lb6
Movf SHIP_XPOS,W
Subwf PBP#VAR0,W
Btfss STATUS,0
Go@to bc@LL80
cp@lb6
Movlw 8
Addwf SHIP_XPOS,W
Clrf PBP#VAR1H
Movwf PBP#VAR1
Rlcf PBP#VAR1H,F
Movf PBP#VAR0,W
Subwf PBP#VAR1,W
Movf PBP#VAR0H,W
Subwfb PBP#VAR1H,W
Btfss STATUS,0
Go@to bc@LL80
F1_000339 equ $ ; in [INVADERS.BAS] INVADER_MISSILE2_FIRED = TRUE ' Signal that an invader's missile is in the air
Bsf _B#VR1,7
F1_000340 equ $ ; in [INVADERS.BAS] INVADER_MISSILE2_XPOS = INVADER_XPOS[INVADER_LOOP] + 5 ' Move missile XPOS to the middle of the invader
Lfsr 0,INVADER_XPOS
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movf INDF0,W
Movwf PBP#VAR1
Movlw 5
Addwf PBP#VAR1,W
Movwf INVADER_MISSILE2_XPOS
F1_000341 equ $ ; in [INVADERS.BAS] INVADER_MISSILE2_YPOS = (INVADER_YPOS[INVADER_LOOP] * 8) + 8 ' Move missile YPOS to below the invader
Lfsr 0,INVADER_YPOS
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movf INDF0,W
Movwf PBP#VAR1
Movf PBP#VAR1,W
Mullw 8
Movff PRODL,PP7
Movff PRODH,PP7H
Movlw 8
Addwf PP7,W
Movwf INVADER_MISSILE2_YPOS
F1_000342 equ $ ; in [INVADERS.BAS] End Select
bc@LL80
bc@LL79
F1_000343 equ $ ; in [INVADERS.BAS] Endif
bc@LL78
F1_000344 equ $ ; in [INVADERS.BAS] Inc INVADER_LOOP
Incf INVADER_LOOP,F
F1_000345 equ $ ; in [INVADERS.BAS] Until INVADER_LOOP > 17 ' Close the loop when all invaders have been scanned
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -