📄 invaders.asm
字号:
Movf TEMP_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movf INDF0,W
Movwf PBP#VAR0
Decfsz PBP#VAR0,W
F@Jump bc@LL159
F1_000576 equ $ ; in [INVADERS.BAS] LCDWRITE INVADER_YPOS[TEMP_LOOP],INVADER_XPOS[TEMP_LOOP],[$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00]
Lfsr 0,INVADER_YPOS
Movf TEMP_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movf INDF0,W
Movwf GEN
Lfsr 0,INVADER_XPOS
Movf TEMP_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movf INDF0,W
Movwf GENH
Clrw
F@Call Glcd@p
Clrw
F@Call Glcd@p
Clrw
F@Call Glcd@p
Clrw
F@Call Glcd@p
Clrw
F@Call Glcd@p
Clrw
F@Call Glcd@p
Clrw
F@Call Glcd@p
Clrw
F@Call Glcd@p
Clrw
F@Call Glcd@p
Clrw
F@Call Glcd@p
Clrw
F@Call Glcd@p
Clrw
F@Call Glcd@p
F1_000577 equ $ ; in [INVADERS.BAS] INVADER_YPOS[TEMP_LOOP] = INVADER_YPOS[TEMP_LOOP] + 1
Lfsr 0,INVADER_YPOS
Movf TEMP_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movf INDF0,W
Movwf PBP#VAR1
Incf PBP#VAR1,W
Movwf PBP#VAR0
Lfsr 0,INVADER_YPOS
Movf TEMP_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movff PBP#VAR0,INDF0
F1_000578 equ $ ; in [INVADERS.BAS] If INVADER_YPOS[TEMP_LOOP] = 6 Then ' Have the invaders hit the bases ?
Lfsr 0,INVADER_YPOS
Movf TEMP_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movf INDF0,W
Movwf PBP#VAR0
Movlw 6
Cpfseq PBP#VAR0
F@Jump bc@LL161
F1_000579 equ $ ; in [INVADERS.BAS] Str BASE_ENABLED = 0,0,0,0,0,0,0,0,0 ' Yes.. So disable them all
Clrf BASE_ENABLED#0
Clrf BASE_ENABLED#1
Clrf BASE_ENABLED#2
Clrf BASE_ENABLED#3
Clrf BASE_ENABLED#4
Clrf BASE_ENABLED#5
Clrf BASE_ENABLED#6
Clrf BASE_ENABLED#7
Clrf BASE_ENABLED#8
F1_000580 equ $ ; in [INVADERS.BAS] Str BASE_HITS = 5,5,5,5,5,5,5,5,5 ' And move their hit counters to past their thresholds
Movlw 5
Movwf BASE_HITS#0
Movlw 5
Movwf BASE_HITS#1
Movlw 5
Movwf BASE_HITS#2
Movlw 5
Movwf BASE_HITS#3
Movlw 5
Movwf BASE_HITS#4
Movlw 5
Movwf BASE_HITS#5
Movlw 5
Movwf BASE_HITS#6
Movlw 5
Movwf BASE_HITS#7
Movlw 5
Movwf BASE_HITS#8
F1_000581 equ $ ; in [INVADERS.BAS] Endif
bc@LL161
F1_000582 equ $ ; in [INVADERS.BAS] If INVADER_YPOS[TEMP_LOOP] >= 7 Then INVADERS_REACHED_BOTTOM = TRUE ' Set a flag if the invaders have reached the bottom
Lfsr 0,INVADER_YPOS
Movf TEMP_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movf INDF0,W
Movwf PBP#VAR0
Movlw 6
Cpfsgt PBP#VAR0
F@Jump bc@LL163
Bsf _B#VR1,4
bc@LL163
F1_000583 equ $ ; in [INVADERS.BAS] LCDWRITE INVADER_YPOS[TEMP_LOOP],INVADER_XPOS[TEMP_LOOP],[$00,$06,$0C,$9C,$EA,$36,$36,$EA,$9C,$0C,$06,$00]
Lfsr 0,INVADER_YPOS
Movf TEMP_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movf INDF0,W
Movwf GEN
Lfsr 0,INVADER_XPOS
Movf TEMP_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movf INDF0,W
Movwf GENH
Clrw
F@Call Glcd@p
Movlw 6
F@Call Glcd@p
Movlw 12
F@Call Glcd@p
Movlw 156
F@Call Glcd@p
Movlw 234
F@Call Glcd@p
Movlw 54
F@Call Glcd@p
Movlw 54
F@Call Glcd@p
Movlw 234
F@Call Glcd@p
Movlw 156
F@Call Glcd@p
Movlw 12
F@Call Glcd@p
Movlw 6
F@Call Glcd@p
Clrw
F@Call Glcd@p
F1_000584 equ $ ; in [INVADERS.BAS] Endif
bc@LL159
F1_000585 equ $ ; in [INVADERS.BAS] Until TEMP_LOOP = 0
Tstfsz TEMP_LOOP
F@Jump bc@LL156
bc@LL157
F1_000586 equ $ ; in [INVADERS.BAS] Inc INVADER_MISSILE_SPEED ' Slow down the invader's missile speed as they approach the bottom of the screen
Incf INVADER_MISSILE_SPEED,F
F1_000587 equ $ ; in [INVADERS.BAS] If INVADER_SPEED >= 3 Then Dec INVADER_SPEED ' Increase the speed of the invaders
Movlw 2
Cpfsgt INVADER_SPEED
F@Jump bc@LL165
Decf INVADER_SPEED,F
bc@LL165
F1_000588 equ $ ; in [INVADERS.BAS] Return
Return
RESET_INVADERS
F1_000595 equ $ ; in [INVADERS.BAS] INVADER_LOOP = 0
Clrf INVADER_LOOP
F1_000596 equ $ ; in [INVADERS.BAS] Repeat
bc@LL166
F1_000597 equ $ ; in [INVADERS.BAS] INVADER_ENABLED[INVADER_LOOP] = TRUE ' Set all invaders to active and image 1
Lfsr 0,INVADER_ENABLED
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movlw 1
Movwf INDF0
F1_000598 equ $ ; in [INVADERS.BAS] Select INVADER_LOOP
F1_000599 equ $ ; in [INVADERS.BAS] Case 0 to 5
Movlw 6
Cpfslt INVADER_LOOP
F@Jump bc@LL169
F1_000600 equ $ ; in [INVADERS.BAS] INVADER_XPOS[INVADER_LOOP] = (INVADER_LOOP + 1) * 16
Movlw 1
Addwf INVADER_LOOP,W
Clrf PP7H
Movwf PP7
Rlcf PP7H,F
Movf PP7,W
Mullw 16
Movff PRODL,PBP#VAR0
Lfsr 0,INVADER_XPOS
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movff PBP#VAR0,INDF0
F1_000601 equ $ ; in [INVADERS.BAS] INVADER_YPOS[INVADER_LOOP] = 1
Lfsr 0,INVADER_YPOS
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movlw 1
Movwf INDF0
F@Jump bc@LL168
bc@LL169
F1_000602 equ $ ; in [INVADERS.BAS] Case 6 to 11
Movlw 5
Cpfsgt INVADER_LOOP
F@Jump bc@LL172
Movlw 12
Cpfslt INVADER_LOOP
F@Jump bc@LL172
F1_000603 equ $ ; in [INVADERS.BAS] INVADER_XPOS[INVADER_LOOP] = (INVADER_LOOP - 5) * 16
Movlw low (-5)
Addwf INVADER_LOOP,W
Movwf PP7
Movlw low ((-5) >> 8)
Skpnc
Addlw 1
Movwf PP7H
Movf PP7,W
Mullw 16
Movff PRODL,PBP#VAR0
Lfsr 0,INVADER_XPOS
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movff PBP#VAR0,INDF0
F1_000604 equ $ ; in [INVADERS.BAS] INVADER_YPOS[INVADER_LOOP] = 2
Lfsr 0,INVADER_YPOS
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movlw 2
Movwf INDF0
F@Jump bc@LL168
bc@LL172
F1_000605 equ $ ; in [INVADERS.BAS] Case 12 to 17
Movlw 11
Cpfsgt INVADER_LOOP
F@Jump bc@LL174
Movlw 18
Cpfslt INVADER_LOOP
F@Jump bc@LL174
F1_000606 equ $ ; in [INVADERS.BAS] INVADER_XPOS[INVADER_LOOP] = (INVADER_LOOP - 11) * 16
Movlw low (-11)
Addwf INVADER_LOOP,W
Movwf PP7
Movlw low ((-11) >> 8)
Skpnc
Addlw 1
Movwf PP7H
Movf PP7,W
Mullw 16
Movff PRODL,PBP#VAR0
Lfsr 0,INVADER_XPOS
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movff PBP#VAR0,INDF0
F1_000607 equ $ ; in [INVADERS.BAS] INVADER_YPOS[INVADER_LOOP] = 3
Lfsr 0,INVADER_YPOS
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movlw 3
Movwf INDF0
F1_000608 equ $ ; in [INVADERS.BAS] End Select
bc@LL174
bc@LL168
F1_000609 equ $ ; in [INVADERS.BAS] Inc INVADER_LOOP
Incf INVADER_LOOP,F
F1_000610 equ $ ; in [INVADERS.BAS] Until INVADER_LOOP > 17
Movlw 17
Cpfsgt INVADER_LOOP
F@Jump bc@LL166
bc@LL167
F1_000611 equ $ ; in [INVADERS.BAS] Return
Return
MOVE_INVADERS
F1_000617 equ $ ; in [INVADERS.BAS] TIME_TO_MOVE_INVADERS_DOWN = FALSE
Bcf _B#VR1,3
F1_000618 equ $ ; in [INVADERS.BAS] If INVADERS_DIRECTION = FORWARD Then ' Are the invaders to move forward (right) ?
Btfss _B#VR1,1
Go@to bc@LL176
F1_000619 equ $ ; in [INVADERS.BAS] INVADER_LOOP = 0 ' Yes.. So reset the invader loop
Clrf INVADER_LOOP
F1_000620 equ $ ; in [INVADERS.BAS] Repeat ' Create a loop for all the invaders
bc@LL177
F1_000621 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@LL180
F1_000622 equ $ ; in [INVADERS.BAS] INVADER_XPOS[INVADER_LOOP] = INVADER_XPOS[INVADER_LOOP] + 1 ' Yes.. So increment its XPOS
Lfsr 0,INVADER_XPOS
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movf INDF0,W
Movwf PBP#VAR1
Incf PBP#VAR1,W
Movwf PBP#VAR0
Lfsr 0,INVADER_XPOS
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movff PBP#VAR0,INDF0
F1_000623 equ $ ; in [INVADERS.BAS] If INVADER_XPOS[INVADER_LOOP] >= INVADER_RIGHT_LIMIT Then ' Have we hit the right side of the screen ?
Lfsr 0,INVADER_XPOS
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movf INDF0,W
Movwf PBP#VAR0
Movlw 116
Cpfsgt PBP#VAR0
F@Jump bc@LL182
F1_000624 equ $ ; in [INVADERS.BAS] INVADERS_DIRECTION = BACKWARD ' Yes.. So indicate that we need to go backwards
Bcf _B#VR1,1
F1_000625 equ $ ; in [INVADERS.BAS] SAUCER_ENABLED = TRUE
Bsf _B#VR2,3
F1_000626 equ $ ; in [INVADERS.BAS] TIME_TO_MOVE_INVADERS_DOWN = TRUE ' and signal that we need to move the invaders down
Bsf _B#VR1,3
F1_000627 equ $ ; in [INVADERS.BAS] Endif
bc@LL182
F1_000628 equ $ ; in [INVADERS.BAS] Endif
bc@LL180
F1_000629 equ $ ; in [INVADERS.BAS] Inc INVADER_LOOP
Incf INVADER_LOOP,F
F1_000630 equ $ ; in [INVADERS.BAS] Until INVADER_LOOP > 17 ' Close the loop after all the invader elements have been scanned
Movlw 17
Cpfsgt INVADER_LOOP
F@Jump bc@LL177
bc@LL178
F@Jump bc@LL183
bc@LL176
F1_000631 equ $ ; in [INVADERS.BAS] Else ' Otherwise we go backwards (left)
F1_000632 equ $ ; in [INVADERS.BAS] INVADER_LOOP = 0 ' Reset the invader loop
Clrf INVADER_LOOP
F1_000633 equ $ ; in [INVADERS.BAS] Repeat ' Create a loop for all the invaders
bc@LL184
F1_000634 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@LL187
F1_000635 equ $ ; in [INVADERS.BAS] INVADER_XPOS[INVADER_LOOP] = INVADER_XPOS[INVADER_LOOP] - 1 ' Yes.. So decrement its XPOS
Lfsr 0,INVADER_XPOS
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movf INDF0,W
Movwf PBP#VAR1
Decf PBP#VAR1,W
Movwf PBP#VAR0
Lfsr 0,INVADER_XPOS
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movff PBP#VAR0,INDF0
F1_000636 equ $ ; in [INVADERS.BAS] If INVADER_XPOS[INVADER_LOOP] <= 1 Then ' Have we hit the left side of the screen ?
Lfsr 0,INVADER_XPOS
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movf INDF0,W
Movwf PBP#VAR0
Movlw 2
Cpfslt PBP#VAR0
F@Jump bc@LL189
F1_000637 equ $ ; in [INVADERS.BAS] INVADERS_DIRECTION = FORWARD ' Yes.. So indicate that we need to go forwards
Bsf _B#VR1,1
F1_000638 equ $ ; in [INVADERS.BAS] TIME_TO_MOVE_INVADERS_DOWN = TRUE ' and signal that we need to move the invaders down
Bsf _B#VR1,3
F1_000639 equ $ ; in [INVADERS.BAS] Endif
bc@LL189
F1_000640 equ $ ; in [INVADERS.BAS] Endif
bc@LL187
F1_000641 equ $ ; in [INVADERS.BAS] Inc INVADER_LOOP
Incf INVADER_LOOP,F
F1_000642 equ $ ; in [INVADERS.BAS] Until INVADER_LOOP > 17 ' Close the loop after all the invader elements have been scanned
Movlw 17
Cpfsgt INVADER_LOOP
F@Jump bc@LL184
bc@LL185
F1_000643 equ $ ; in [INVADERS.BAS] Endif
bc@LL183
F1_000644 equ $ ; in [INVADERS.BAS] If TIME_TO_MOVE_INVADERS_DOWN = TRUE Then Gosub MOVE_INVADERS_DOWN ' Do we need to move the invaders down ?
Btfss _B#VR1,3
Go@to bc@LL191
F@Call MOVE_INVADERS_DOWN
bc@LL191
DRAW_INVADERS
F1_000660 equ $ ; in [INVADERS.BAS] INVADER_LOOP = 0
Clrf INVADER_LOOP
F1_000661 equ $ ; in [INVADERS.BAS] Repeat
bc@LL192
F1_000662 equ $ ; in [INVADERS.BAS] If INVADER_ENABLED[INVADER_LOOP] = TRUE Then
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@LL195
F1_000663 equ $ ; in [INVADERS.BAS] If INVADER_CHARACTER = 0 Then
Btfsc _B#VR1,5
Go@to bc@LL197
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -