📄 invaders.asm
字号:
F1_000475 equ $ ; in [INVADERS.BAS] Endif
bc@LL115
F1_000478 equ $ ; in [INVADERS.BAS] INVADER_LOOP = 0
Clrf INVADER_LOOP
F1_000479 equ $ ; in [INVADERS.BAS] Repeat
bc@LL121
F1_000480 equ $ ; in [INVADERS.BAS] If INVADER_ENABLED[INVADER_LOOP] = TRUE Then ' Only check if the invader is 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@LL124
F1_000481 equ $ ; in [INVADERS.BAS] If INVADER_YPOS[INVADER_LOOP] = MISSILE_YPOS / 8 Then
Lfsr 0,INVADER_YPOS
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movf INDF0,W
Movwf PBP#VAR0
Clrc
Rrcf MISSILE_YPOS,W
Movwf PBP#VAR1
Clrc
Rrcf PBP#VAR1,F
Clrc
Rrcf PBP#VAR1,F
Clrf PBP#VAR1H
Movf PBP#VAR1,W
Cpfseq PBP#VAR0
F@Jump bc@LL126
Tstfsz PBP#VAR1H
F@Jump bc@LL126
F1_000482 equ $ ; in [INVADERS.BAS] Select MISSILE_XPOS
Lfsr 0,INVADER_XPOS
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movf INDF0,W
Movwf PBP#VAR0
F1_000483 equ $ ; in [INVADERS.BAS] Case INVADER_XPOS[INVADER_LOOP] to INVADER_XPOS[INVADER_LOOP] + INVADER_WIDTH
Movf PBP#VAR0,W
Subwf MISSILE_XPOS,W
Btfss STATUS,0
Go@to bc@LL128
Lfsr 0,INVADER_XPOS
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movf INDF0,W
Movwf PBP#VAR1
Movlw 10
Addwf PBP#VAR1,W
Clrf PBP#VAR0H
Movwf PBP#VAR0
Rlcf PBP#VAR0H,F
Movf PBP#VAR0H,W
Bnz cp@lb13
Movf MISSILE_XPOS,W
Subwf PBP#VAR0,W
Btfss STATUS,0
Go@to bc@LL128
cp@lb13
F1_000484 equ $ ; in [INVADERS.BAS] INVADER_ENABLED[INVADER_LOOP] = FALSE
Lfsr 0,INVADER_ENABLED
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Clrf INDF0
F1_000485 equ $ ; in [INVADERS.BAS] MISSILE_HIT = TRUE ' Indicate the ship's missile has hit a target
Bsf MISSILE_STATUS,1
F1_000486 equ $ ; in [INVADERS.BAS] MISSILE_SOUND_ENABLE = 1
Bsf NOTE_STATUS,1
F1_000487 equ $ ; in [INVADERS.BAS] MISSILE_FREQ = 30
Movlw 30
Movwf MISSILE_FREQ
F1_000488 equ $ ; in [INVADERS.BAS] Select INVADER_LOOP ' Decide on the score depending on which invader is hit
F1_000489 equ $ ; in [INVADERS.BAS] Case 0 to 5 ' Top layer of invaders score 20
Movlw 6
Cpfslt INVADER_LOOP
F@Jump bc@LL131
F1_000490 equ $ ; in [INVADERS.BAS] LCDWRITE INVADER_YPOS[INVADER_LOOP],INVADER_XPOS[INVADER_LOOP],[$42,$61,$51,$49,$46,$00,$3E,$51,$49,$45,$3E,$00]
Lfsr 0,INVADER_YPOS
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movf INDF0,W
Movwf GEN
Lfsr 0,INVADER_XPOS
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movf INDF0,W
Movwf GENH
Movlw 66
F@Call Glcd@p
Movlw 97
F@Call Glcd@p
Movlw 81
F@Call Glcd@p
Movlw 73
F@Call Glcd@p
Movlw 70
F@Call Glcd@p
Clrw
F@Call Glcd@p
Movlw 62
F@Call Glcd@p
Movlw 81
F@Call Glcd@p
Movlw 73
F@Call Glcd@p
Movlw 69
F@Call Glcd@p
Movlw 62
F@Call Glcd@p
Clrw
F@Call Glcd@p
F1_000491 equ $ ; in [INVADERS.BAS] SCORE = SCORE + 20
Movlw 20
Addwf SCORE,F
Movlw 0
Addwfc SCOREH,F
Addwfc SCOREHH,F
Addwfc SCOREHHH,F
F@Jump bc@LL130
bc@LL131
F1_000492 equ $ ; in [INVADERS.BAS] Case 6 to 11 ' Middle layer of invaders score 10
Movlw 5
Cpfsgt INVADER_LOOP
F@Jump bc@LL134
Movlw 12
Cpfslt INVADER_LOOP
F@Jump bc@LL134
F1_000493 equ $ ; in [INVADERS.BAS] LCDWRITE INVADER_YPOS[INVADER_LOOP],INVADER_XPOS[INVADER_LOOP],[$00,$42,$7F,$40,$00,$00,$3E,$51,$49,$45,$3E,$00]
Lfsr 0,INVADER_YPOS
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movf INDF0,W
Movwf GEN
Lfsr 0,INVADER_XPOS
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movf INDF0,W
Movwf GENH
Clrw
F@Call Glcd@p
Movlw 66
F@Call Glcd@p
Movlw 127
F@Call Glcd@p
Movlw 64
F@Call Glcd@p
Clrw
F@Call Glcd@p
Clrw
F@Call Glcd@p
Movlw 62
F@Call Glcd@p
Movlw 81
F@Call Glcd@p
Movlw 73
F@Call Glcd@p
Movlw 69
F@Call Glcd@p
Movlw 62
F@Call Glcd@p
Clrw
F@Call Glcd@p
F1_000494 equ $ ; in [INVADERS.BAS] SCORE = SCORE + 10
Movlw 10
Addwf SCORE,F
Movlw 0
Addwfc SCOREH,F
Addwfc SCOREHH,F
Addwfc SCOREHHH,F
F@Jump bc@LL130
bc@LL134
F1_000495 equ $ ; in [INVADERS.BAS] Case 12 to 17 ' Bottom layer of invaders score 5
Movlw 11
Cpfsgt INVADER_LOOP
F@Jump bc@LL136
Movlw 18
Cpfslt INVADER_LOOP
F@Jump bc@LL136
F1_000496 equ $ ; in [INVADERS.BAS] LCDWRITE INVADER_YPOS[INVADER_LOOP],INVADER_XPOS[INVADER_LOOP],[$3E,$51,$49,$45,$3E,$00, $27,$45,$45,$45,$39,$00]
Lfsr 0,INVADER_YPOS
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movf INDF0,W
Movwf GEN
Lfsr 0,INVADER_XPOS
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movf INDF0,W
Movwf GENH
Movlw 62
F@Call Glcd@p
Movlw 81
F@Call Glcd@p
Movlw 73
F@Call Glcd@p
Movlw 69
F@Call Glcd@p
Movlw 62
F@Call Glcd@p
Clrw
F@Call Glcd@p
Movlw 39
F@Call Glcd@p
Movlw 69
F@Call Glcd@p
Movlw 69
F@Call Glcd@p
Movlw 69
F@Call Glcd@p
Movlw 57
F@Call Glcd@p
Clrw
F@Call Glcd@p
F1_000497 equ $ ; in [INVADERS.BAS] SCORE = SCORE + 5
Movlw 5
Addwf SCORE,F
Movlw 0
Addwfc SCOREH,F
Addwfc SCOREHH,F
Addwfc SCOREHHH,F
F1_000498 equ $ ; in [INVADERS.BAS] EndSelect
bc@LL136
bc@LL130
F1_000499 equ $ ; in [INVADERS.BAS] Delayms 10
Movlw 10
F@Call dl@ms
F1_000500 equ $ ; in [INVADERS.BAS] MISSILE_FREQ = 20
Movlw 20
Movwf MISSILE_FREQ
F1_000501 equ $ ; in [INVADERS.BAS] Delayms 10
Movlw 10
F@Call dl@ms
F1_000502 equ $ ; in [INVADERS.BAS] MISSILE_FREQ = 10
Movlw 10
Movwf MISSILE_FREQ
F1_000503 equ $ ; in [INVADERS.BAS] Delayms 20
Movlw 20
F@Call dl@ms
F1_000504 equ $ ; in [INVADERS.BAS] LCDWRITE INVADER_YPOS[INVADER_LOOP],INVADER_XPOS[INVADER_LOOP],[$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00] ' Erase the INVADER that was hit
Lfsr 0,INVADER_YPOS
Movf INVADER_LOOP,W
Addwf FSR0L,F
Movlw 0
Addwfc FSR0H,F
Movf INDF0,W
Movwf GEN
Lfsr 0,INVADER_XPOS
Movf INVADER_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_000507 equ $ ; in [INVADERS.BAS] Dec INVADERS_ENABLED ' Decrement the hits counter
Decf INVADERS_ENABLED,F
F1_000509 equ $ ; in [INVADERS.BAS] If INVADERS_ENABLED = 1 Then ' Increase the speed substantially if only one invader left
Decfsz INVADERS_ENABLED,W
F@Jump bc@LL138
F1_000510 equ $ ; in [INVADERS.BAS] INVADER_SPEED = 5
Movlw 5
Movwf INVADER_SPEED
F@Jump bc@LL137
F1_000511 equ $ ; in [INVADERS.BAS] Else if INVADERS_ENABLED = 2 Then
bc@LL138
Movlw 2
Cpfseq INVADERS_ENABLED
F@Jump bc@LL139
F1_000512 equ $ ; in [INVADERS.BAS] INVADER_SPEED = 10 ' Increase the speed to fast if there are only two invaders left
Movlw 10
Movwf INVADER_SPEED
F@Jump bc@LL140
bc@LL139
F1_000513 equ $ ; in [INVADERS.BAS] Else
F1_000515 equ $ ; in [INVADERS.BAS] If INVADER_SPEED >= 3 Then ' Is the inveders speed greater than 3 ?
Movlw 2
Cpfsgt INVADER_SPEED
F@Jump bc@LL142
F1_000516 equ $ ; in [INVADERS.BAS] If INVADERS_ENABLED <= 4 Then ' Are there 4 or less invaders left ?
Movlw 5
Cpfslt INVADERS_ENABLED
F@Jump bc@LL144
F1_000517 equ $ ; in [INVADERS.BAS] INVADER_SPEED = INVADER_SPEED - 3 ' Yes.. So increase their speed by a factor of three
Movlw 3
Subwf INVADER_SPEED,F
F@Jump bc@LL145
bc@LL144
F1_000518 equ $ ; in [INVADERS.BAS] Else
F1_000519 equ $ ; in [INVADERS.BAS] Dec INVADER_SPEED ' Otherwise.. Increase the speed of the remaining invaders
Decf INVADER_SPEED,F
F1_000520 equ $ ; in [INVADERS.BAS] Endif
bc@LL145
F1_000521 equ $ ; in [INVADERS.BAS] Endif
bc@LL142
F1_000522 equ $ ; in [INVADERS.BAS] Endif
bc@LL140
bc@LL137
F1_000523 equ $ ; in [INVADERS.BAS] MISSILE_SOUND_ENABLE = 0 ' Disable the missile's sound
Bcf NOTE_STATUS,1
F1_000524 equ $ ; in [INVADERS.BAS] Return ' And return from the subroutine prematurely
Return
F1_000525 equ $ ; in [INVADERS.BAS] Endselect
bc@LL128
bc@LL127
F1_000526 equ $ ; in [INVADERS.BAS] Endif
bc@LL126
F1_000527 equ $ ; in [INVADERS.BAS] Endif
bc@LL124
F1_000528 equ $ ; in [INVADERS.BAS] Inc INVADER_LOOP
Incf INVADER_LOOP,F
F1_000529 equ $ ; in [INVADERS.BAS] Until INVADER_LOOP > 17
Movlw 17
Cpfsgt INVADER_LOOP
F@Jump bc@LL121
bc@LL122
F1_000530 equ $ ; in [INVADERS.BAS] Endif
bc@LL105
F1_000531 equ $ ; in [INVADERS.BAS] Return
Return
MOVE_MISSILE
F1_000538 equ $ ; in [INVADERS.BAS] If MISSILE_FIRED = TRUE Then ' Don't enter the routine if the ship's missile is already flying
Btfss MISSILE_STATUS,0
Go@to bc@LL147
F1_000539 equ $ ; in [INVADERS.BAS] If TIME_TO_MOVE_SHIP_MISSILE = TRUE Then ' Is it time to move the ship's missile ?
Btfss MISSILE_STATUS,3
Go@to bc@LL149
F1_000540 equ $ ; in [INVADERS.BAS] Gosub DRAW_MISSILE
F@Call DRAW_MISSILE
F1_000541 equ $ ; in [INVADERS.BAS] Dec MISSILE_YPOS
Decf MISSILE_YPOS,F
F1_000542 equ $ ; in [INVADERS.BAS] MISSILE_FREQ = 63 - MISSILE_YPOS
Movf MISSILE_YPOS,W
Sublw 63
Movwf MISSILE_FREQ
F1_000543 equ $ ; in [INVADERS.BAS] Endif
bc@LL149
F1_000544 equ $ ; in [INVADERS.BAS] If MISSILE_YPOS = 0 OR MISSILE_HIT = TRUE Then ' Has the missile reached the top of the display or hit something ?
Movff MISSILE_YPOS,PP0
Clrw
F@Call t@eb
Movwf SP#P9
Clrw
Btfsc MISSILE_STATUS,1
Movlw 1
Iorwf SP#P9,W
Btfsc STATUS,2
Go@to bc@LL151
F1_000545 equ $ ; in [INVADERS.BAS] MISSILE_SOUND_ENABLE = 0
Bcf NOTE_STATUS,1
F1_000546 equ $ ; in [INVADERS.BAS] MISSILE_FIRED = FALSE ' Yes. So signal the missile is finished
Bcf MISSILE_STATUS,0
F1_000547 equ $ ; in [INVADERS.BAS] Gosub CLEAR_MISSILE ' Clear the missile
F@Call CLEAR_MISSILE
F1_000548 equ $ ; in [INVADERS.BAS] MISSILE_YPOS = 63 - 9 ' Reset the missile to the bottom of the display
Movlw 54
Movwf MISSILE_YPOS
F1_000549 equ $ ; in [INVADERS.BAS] Endif
bc@LL151
F1_000550 equ $ ; in [INVADERS.BAS] Endif
bc@LL147
F1_000551 equ $ ; in [INVADERS.BAS] Return
Return
SHIP_RIGHT
F1_000555 equ $ ; in [INVADERS.BAS] If SHIP_XPOS > 117 Then Return
Movlw 117
Cpfsgt SHIP_XPOS
F@Jump bc@LL153
Return
bc@LL153
F1_000556 equ $ ; in [INVADERS.BAS] Gosub DRAW_SHIP
F@Call DRAW_SHIP
F1_000557 equ $ ; in [INVADERS.BAS] Inc SHIP_XPOS
Incf SHIP_XPOS,F
F1_000558 equ $ ; in [INVADERS.BAS] Return
Return
SHIP_LEFT
F1_000562 equ $ ; in [INVADERS.BAS] If SHIP_XPOS = 0 Then Return
Tstfsz SHIP_XPOS
F@Jump bc@LL155
Return
bc@LL155
F1_000563 equ $ ; in [INVADERS.BAS] Gosub DRAW_SHIP
F@Call DRAW_SHIP
F1_000564 equ $ ; in [INVADERS.BAS] Dec SHIP_XPOS
Decf SHIP_XPOS,F
F1_000565 equ $ ; in [INVADERS.BAS] Return
Return
MOVE_INVADERS_DOWN
F1_000571 equ $ ; in [INVADERS.BAS] INVADERS_REACHED_BOTTOM = FALSE ' Default to the invaders not at bottom of the screen
Bcf _B#VR1,4
F1_000572 equ $ ; in [INVADERS.BAS] TEMP_LOOP = 18
Movlw 18
Movwf TEMP_LOOP
F1_000573 equ $ ; in [INVADERS.BAS] Repeat
bc@LL156
F1_000574 equ $ ; in [INVADERS.BAS] Dec TEMP_LOOP
Decf TEMP_LOOP,F
F1_000575 equ $ ; in [INVADERS.BAS] If INVADER_ENABLED[TEMP_LOOP] = TRUE Then
Lfsr 0,INVADER_ENABLED
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -