📄 invaders.asm
字号:
;*******************************************************
;* Code Produced by the *
;* PROTON+ Compiler. Version 3.0 *
;* Copyright Rosetta Technologies/Crownhill Associates *
;* Written by Les Johnson. 2004 *
;*******************************************************
NOLIST
#include "D:\PRODEV\VSM\BASIC\ISIS_DSNS\INVADERS\INVADERS.PBP"
LIST
BASE_ENABLED = 61
Variable BASE_ENABLED#0=61,BASE_ENABLED#1=62,BASE_ENABLED#2=63,BASE_ENABLED#3=64,BASE_ENABLED#4=65,BASE_ENABLED#5=66
Variable BASE_ENABLED#6=67,BASE_ENABLED#7=68,BASE_ENABLED#8=69
BASE_HITS = 70
Variable BASE_HITS#0=70,BASE_HITS#1=71,BASE_HITS#2=72,BASE_HITS#3=73,BASE_HITS#4=74,BASE_HITS#5=75
Variable BASE_HITS#6=76,BASE_HITS#7=77,BASE_HITS#8=78
INVADER_XPOS = 79
Variable INVADER_XPOS#0=79,INVADER_XPOS#1=80,INVADER_XPOS#2=81,INVADER_XPOS#3=82,INVADER_XPOS#4=83,INVADER_XPOS#5=84
Variable INVADER_XPOS#6=85,INVADER_XPOS#7=86,INVADER_XPOS#8=87,INVADER_XPOS#9=88,INVADER_XPOS#10=89,INVADER_XPOS#11=90
Variable INVADER_XPOS#12=91,INVADER_XPOS#13=92,INVADER_XPOS#14=93,INVADER_XPOS#15=94,INVADER_XPOS#16=95,INVADER_XPOS#17=96
INVADER_YPOS = 97
Variable INVADER_YPOS#0=97,INVADER_YPOS#1=98,INVADER_YPOS#2=99,INVADER_YPOS#3=100,INVADER_YPOS#4=101,INVADER_YPOS#5=102
Variable INVADER_YPOS#6=103,INVADER_YPOS#7=104,INVADER_YPOS#8=105,INVADER_YPOS#9=106,INVADER_YPOS#10=107,INVADER_YPOS#11=108
Variable INVADER_YPOS#12=109,INVADER_YPOS#13=110,INVADER_YPOS#14=111,INVADER_YPOS#15=112,INVADER_YPOS#16=113,INVADER_YPOS#17=114
INVADER_ENABLED = 115
Variable INVADER_ENABLED#0=115,INVADER_ENABLED#1=116,INVADER_ENABLED#2=117,INVADER_ENABLED#3=118,INVADER_ENABLED#4=119,INVADER_ENABLED#5=120
Variable INVADER_ENABLED#6=121,INVADER_ENABLED#7=122,INVADER_ENABLED#8=123,INVADER_ENABLED#9=124,INVADER_ENABLED#10=125,INVADER_ENABLED#11=126
Variable INVADER_ENABLED#12=127,INVADER_ENABLED#13=128,INVADER_ENABLED#14=129,INVADER_ENABLED#15=130,INVADER_ENABLED#16=131,INVADER_ENABLED#17=132
SHIP_XPOS = 133
MISSILE_YPOS = 134
MISSILE_XPOS = 135
SHIP_SPEED = 136
INVADER_TICK = 137
INVADER_MISSILE_TICK = 138
SHIP_MISSILE_TICK = 139
TEMP_LOOP = 140
INVADERS_ENABLED = 141
INVADER_SPEED = 142
BASE_XPOS_TEST = 143
INVADER_MISSILE_YPOS = 144
INVADER_MISSILE_XPOS = 145
INVADER_MISSILE_SPEED = 146
DEFAULT_INVADER_SPEED = 147
INVADER_MISSILE2_TICK = 148
INVADER_MISSILE2_YPOS = 149
INVADER_MISSILE2_XPOS = 150
INVADER_MISSILE2_SPEED = 151
SAUCER_XPOS = 152
SAUCER_SPEED = 153
SCORE = 154
SCOREH = 155
SCOREHH = 156
SCOREHHH = 157
LEVEL = 158
LEVELH = 159
LIVES = 160
RANDOM_VALUE = 161
#Define INVADER_SOUND_ENABLE NOTE_STATUS,0
#Define MISSILE_SOUND_ENABLE NOTE_STATUS,1
#Define SAUCER_SOUND_ENABLE NOTE_STATUS,2
#Define INTERNAL_INVADER_SOUND_ENABLE NOTE_STATUS,4
#Define MISSILE_FIRED MISSILE_STATUS,0
#Define MISSILE_HIT MISSILE_STATUS,1
#Define TIME_TO_MOVE_INVADERS MISSILE_STATUS,7
#Define BASE_HIT MISSILE_STATUS,2
#Define TIME_TO_MOVE_SHIP_MISSILE MISSILE_STATUS,3
#Define TIME_TO_MOVE_BASE _B#VR1,0
#Define INVADERS_DIRECTION _B#VR1,1
#Define SHIP_HIT _B#VR1,2
#Define TIME_TO_MOVE_INV_MISSILE MISSILE_STATUS,4
#Define INVADER_MISSILE_FIRED MISSILE_STATUS,5
#Define INVADER_MISSILE_HIT MISSILE_STATUS,6
#Define TIME_TO_MOVE_INVADERS_DOWN _B#VR1,3
#Define INVADERS_REACHED_BOTTOM _B#VR1,4
#Define INVADER_CHARACTER _B#VR1,5
#Define TIME_TO_MOVE_INV_MISSILE2 _B#VR1,6
#Define INVADER_MISSILE2_FIRED _B#VR1,7
#Define INVADER_MISSILE2_HIT _B#VR2,0
#Define SAUCER_HIT _B#VR2,1
#Define TIME_TO_MOVE_SAUCER _B#VR2,2
#Define SAUCER_ENABLED _B#VR2,3
#Define L_BUTTON PORTB,0
#Define R_BUTTON PORTB,1
#Define FIRE_BUTTON PORTB,2
#Define SPEAKER PORTB,3
#Define SHIP_WIDTH 9
#Define INVADER_WIDTH 10
#Define INVADER_RIGHT_LIMIT 117
#Define SAUCER_WIDTH 14
#Define TRUE 1
#Define FALSE 0
#Define FORWARD 1
#Define BACKWARD 0
#Define T0IF INTCON,2
#Define GIE INTCON,7
F1_SOF equ $ ; INVADERS.BAS
F2_SOF equ $ ; PROTON18_G8.INT
F2_000068 equ $ ; in [PROTON18_G8.INT] ALL_DIGITAL = True ' Set PORTA and PORTE to all digital
Movlw 7
Movwf ADCON1
F2_EOF equ $ ; PROTON18_G8.INT
F1_000137 equ $ ; in [INVADERS.BAS] Input L_BUTTON
Bsf TRISB,0
F1_000138 equ $ ; in [INVADERS.BAS] Input R_BUTTON
Bsf TRISB,1
F1_000139 equ $ ; in [INVADERS.BAS] Input FIRE_BUTTON
Bsf TRISB,2
F1_000140 equ $ ; in [INVADERS.BAS] Delayms 200 ' Wait for the PICmicro to stabilise
Movlw 200
F@Call dl@ms
F1_000141 equ $ ; in [INVADERS.BAS] PORTB_PULLUPS = ON
Bcf INTCON2,7
F1_000142 equ $ ; in [INVADERS.BAS] Cls ' Clear the LCD
F@Call GLcd@Cls
F1_000143 equ $ ; in [INVADERS.BAS] Goto MAIN_PROGRAM_LOOP ' Jump over any subroutines
F@Jump MAIN_PROGRAM_LOOP
CLEAR_INVADER_MISSILE
F1_000148 equ $ ; in [INVADERS.BAS] UnPlot INVADER_MISSILE_YPOS, INVADER_MISSILE_XPOS
Movff INVADER_MISSILE_YPOS,GEN
Movf INVADER_MISSILE_XPOS,W
F@Call LCD@UnPlot
F1_000149 equ $ ; in [INVADERS.BAS] UnPlot INVADER_MISSILE_YPOS, INVADER_MISSILE_XPOS + 1
Movff INVADER_MISSILE_YPOS,GEN
Incf INVADER_MISSILE_XPOS,W
F@Call LCD@UnPlot
F1_000150 equ $ ; in [INVADERS.BAS] UnPlot INVADER_MISSILE_YPOS + 1, INVADER_MISSILE_XPOS
Incf INVADER_MISSILE_YPOS,W
Movwf GEN
Movf INVADER_MISSILE_XPOS,W
F@Call LCD@UnPlot
F1_000151 equ $ ; in [INVADERS.BAS] UnPlot INVADER_MISSILE_YPOS + 1, INVADER_MISSILE_XPOS + 1
Incf INVADER_MISSILE_YPOS,W
Movwf GEN
Incf INVADER_MISSILE_XPOS,W
F@Call LCD@UnPlot
F1_000152 equ $ ; in [INVADERS.BAS] UnPlot INVADER_MISSILE_YPOS + 2, INVADER_MISSILE_XPOS
Movlw 2
Addwf INVADER_MISSILE_YPOS,W
Movwf GEN
Movf INVADER_MISSILE_XPOS,W
F@Call LCD@UnPlot
F1_000153 equ $ ; in [INVADERS.BAS] UnPlot INVADER_MISSILE_YPOS + 2, INVADER_MISSILE_XPOS + 1
Movlw 2
Addwf INVADER_MISSILE_YPOS,W
Movwf GEN
Incf INVADER_MISSILE_XPOS,W
F@Call LCD@UnPlot
F1_000154 equ $ ; in [INVADERS.BAS] Return
Return
DRAW_INVADER_MISSILE
F1_000156 equ $ ; in [INVADERS.BAS] UnPlot INVADER_MISSILE_YPOS, INVADER_MISSILE_XPOS
Movff INVADER_MISSILE_YPOS,GEN
Movf INVADER_MISSILE_XPOS,W
F@Call LCD@UnPlot
F1_000157 equ $ ; in [INVADERS.BAS] UnPlot INVADER_MISSILE_YPOS, INVADER_MISSILE_XPOS + 1
Movff INVADER_MISSILE_YPOS,GEN
Incf INVADER_MISSILE_XPOS,W
F@Call LCD@UnPlot
F1_000158 equ $ ; in [INVADERS.BAS] Plot INVADER_MISSILE_YPOS + 1, INVADER_MISSILE_XPOS
Incf INVADER_MISSILE_YPOS,W
Movwf GEN
Movf INVADER_MISSILE_XPOS,W
F@Call LCD@Plot
F1_000159 equ $ ; in [INVADERS.BAS] Plot INVADER_MISSILE_YPOS + 1, INVADER_MISSILE_XPOS + 1
Incf INVADER_MISSILE_YPOS,W
Movwf GEN
Incf INVADER_MISSILE_XPOS,W
F@Call LCD@Plot
F1_000160 equ $ ; in [INVADERS.BAS] Plot INVADER_MISSILE_YPOS + 2, INVADER_MISSILE_XPOS
Movlw 2
Addwf INVADER_MISSILE_YPOS,W
Movwf GEN
Movf INVADER_MISSILE_XPOS,W
F@Call LCD@Plot
F1_000161 equ $ ; in [INVADERS.BAS] Plot INVADER_MISSILE_YPOS + 2, INVADER_MISSILE_XPOS + 1
Movlw 2
Addwf INVADER_MISSILE_YPOS,W
Movwf GEN
Incf INVADER_MISSILE_XPOS,W
F@Call LCD@Plot
F1_000162 equ $ ; in [INVADERS.BAS] Return
Return
CLEAR_INVADER_MISSILE2
F1_000167 equ $ ; in [INVADERS.BAS] UnPlot INVADER_MISSILE2_YPOS, INVADER_MISSILE2_XPOS
Movff INVADER_MISSILE2_YPOS,GEN
Movf INVADER_MISSILE2_XPOS,W
F@Call LCD@UnPlot
F1_000168 equ $ ; in [INVADERS.BAS] UnPlot INVADER_MISSILE2_YPOS, INVADER_MISSILE2_XPOS + 1
Movff INVADER_MISSILE2_YPOS,GEN
Incf INVADER_MISSILE2_XPOS,W
F@Call LCD@UnPlot
F1_000169 equ $ ; in [INVADERS.BAS] UnPlot INVADER_MISSILE2_YPOS + 1, INVADER_MISSILE2_XPOS
Incf INVADER_MISSILE2_YPOS,W
Movwf GEN
Movf INVADER_MISSILE2_XPOS,W
F@Call LCD@UnPlot
F1_000170 equ $ ; in [INVADERS.BAS] UnPlot INVADER_MISSILE2_YPOS + 1, INVADER_MISSILE2_XPOS + 1
Incf INVADER_MISSILE2_YPOS,W
Movwf GEN
Incf INVADER_MISSILE2_XPOS,W
F@Call LCD@UnPlot
F1_000171 equ $ ; in [INVADERS.BAS] UnPlot INVADER_MISSILE2_YPOS + 2, INVADER_MISSILE2_XPOS
Movlw 2
Addwf INVADER_MISSILE2_YPOS,W
Movwf GEN
Movf INVADER_MISSILE2_XPOS,W
F@Call LCD@UnPlot
F1_000172 equ $ ; in [INVADERS.BAS] UnPlot INVADER_MISSILE2_YPOS + 2, INVADER_MISSILE2_XPOS + 1
Movlw 2
Addwf INVADER_MISSILE2_YPOS,W
Movwf GEN
Incf INVADER_MISSILE2_XPOS,W
F@Call LCD@UnPlot
F1_000173 equ $ ; in [INVADERS.BAS] Return
Return
DRAW_INVADER_MISSILE2
F1_000175 equ $ ; in [INVADERS.BAS] UnPlot INVADER_MISSILE2_YPOS, INVADER_MISSILE2_XPOS
Movff INVADER_MISSILE2_YPOS,GEN
Movf INVADER_MISSILE2_XPOS,W
F@Call LCD@UnPlot
F1_000176 equ $ ; in [INVADERS.BAS] UnPlot INVADER_MISSILE2_YPOS, INVADER_MISSILE2_XPOS + 1
Movff INVADER_MISSILE2_YPOS,GEN
Incf INVADER_MISSILE2_XPOS,W
F@Call LCD@UnPlot
F1_000177 equ $ ; in [INVADERS.BAS] Plot INVADER_MISSILE2_YPOS + 1, INVADER_MISSILE2_XPOS
Incf INVADER_MISSILE2_YPOS,W
Movwf GEN
Movf INVADER_MISSILE2_XPOS,W
F@Call LCD@Plot
F1_000178 equ $ ; in [INVADERS.BAS] Plot INVADER_MISSILE2_YPOS + 1, INVADER_MISSILE2_XPOS + 1
Incf INVADER_MISSILE2_YPOS,W
Movwf GEN
Incf INVADER_MISSILE2_XPOS,W
F@Call LCD@Plot
F1_000179 equ $ ; in [INVADERS.BAS] Plot INVADER_MISSILE2_YPOS + 2, INVADER_MISSILE2_XPOS
Movlw 2
Addwf INVADER_MISSILE2_YPOS,W
Movwf GEN
Movf INVADER_MISSILE2_XPOS,W
F@Call LCD@Plot
F1_000180 equ $ ; in [INVADERS.BAS] Plot INVADER_MISSILE2_YPOS + 2, INVADER_MISSILE2_XPOS + 1
Movlw 2
Addwf INVADER_MISSILE2_YPOS,W
Movwf GEN
Incf INVADER_MISSILE2_XPOS,W
F@Call LCD@Plot
F1_000181 equ $ ; in [INVADERS.BAS] Return
Return
UPDATE_BASES
F1_000185 equ $ ; in [INVADERS.BAS] Print at 6,2,2 + BASE_HITS#0,8 + BASE_HITS#1,14 + BASE_HITS#2,_
Movlw 6
Movwf GEN
Movlw 2
F@Call GLCD_Cur
Movlw 2
Addwf BASE_HITS#0,W
Movwf PP2
F@Call Print
Movlw 8
Addwf BASE_HITS#1,W
Movwf PP2
F@Call Print
Movlw 14
Addwf BASE_HITS#2,W
Movwf PP2
F@Call Print
Movlw 6
Movwf GEN
Movlw 9
F@Call GLCD_Cur
Movlw 2
Addwf BASE_HITS#3,W
Movwf PP2
F@Call Print
Movlw 8
Addwf BASE_HITS#4,W
Movwf PP2
F@Call Print
Movlw 14
Addwf BASE_HITS#5,W
Movwf PP2
F@Call Print
Movlw 6
Movwf GEN
Movlw 15
F@Call GLCD_Cur
Movlw 2
Addwf BASE_HITS#6,W
Movwf PP2
F@Call Print
Movlw 8
Addwf BASE_HITS#7,W
Movwf PP2
F@Call Print
Movlw 14
Addwf BASE_HITS#8,W
Movwf PP2
F@Call Print
F1_000188 equ $ ; in [INVADERS.BAS] Return
Return
CHECK_BASE_HIT
F1_000194 equ $ ; in [INVADERS.BAS] BASE_HIT = FALSE ' Default to no hit detected
Bcf MISSILE_STATUS,2
F1_000195 equ $ ; in [INVADERS.BAS] Select BASE_XPOS_TEST
F1_000196 equ $ ; in [INVADERS.BAS] Case 12 to 17 ' Has the missile XPOS hit BASE 1, ELEMENT 0
Movlw 11
Cpfsgt BASE_XPOS_TEST
F@Jump bc@LL2
Movlw 18
Cpfslt BASE_XPOS_TEST
F@Jump bc@LL2
F1_000197 equ $ ; in [INVADERS.BAS] If BASE_HITS#0 < 5 AND BASE_ENABLED#0 = TRUE Then ' Is the base element enabled, and has had less than 5 hits ?
Movlw 5
Subwf BASE_HITS#0,W
Movlw 1
Btfsc STATUS,0
Clrw
Movwf SP#P9
Movff BASE_ENABLED#0,PP0
Movlw 1
F@Call t@eb
Andwf SP#P9,W
Btfsc STATUS,2
Go@to bc@LL5
F1_000198 equ $ ; in [INVADERS.BAS] Inc BASE_HITS#0 ' Increment the amount of hits the base element has sustained
Incf BASE_HITS#0,F
F1_000199 equ $ ; in [INVADERS.BAS] BASE_HIT = TRUE ' Indicate a missile has hit a target
Bsf MISSILE_STATUS,2
F@Jump bc@LL6
bc@LL5
F1_000200 equ $ ; in [INVADERS.BAS] Else
F1_000201 equ $ ; in [INVADERS.BAS] BASE_ENABLED#0 = FALSE ' Disable the base element
Clrf BASE_ENABLED#0
F1_000202 equ $ ; in [INVADERS.BAS] Endif
bc@LL6
F@Jump bc@LL1
bc@LL2
F1_000203 equ $ ; in [INVADERS.BAS] Case 18 to 23 ' Has the missile XPOS hit BASE 1, ELEMENT 1
Movlw 17
Cpfsgt BASE_XPOS_TEST
F@Jump bc@LL8
Movlw 24
Cpfslt BASE_XPOS_TEST
F@Jump bc@LL8
F1_000204 equ $ ; in [INVADERS.BAS] If BASE_HITS#1 < 5 AND BASE_ENABLED#1 = TRUE Then ' Is the base element enabled, and has had less than 5 hits ?
Movlw 5
Subwf BASE_HITS#1,W
Movlw 1
Btfsc STATUS,0
Clrw
Movwf SP#P9
Movff BASE_ENABLED#1,PP0
Movlw 1
F@Call t@eb
Andwf SP#P9,W
Btfsc STATUS,2
Go@to bc@LL10
F1_000205 equ $ ; in [INVADERS.BAS] Inc BASE_HITS#1 ' Increment the amount of hits the base element has sustained
Incf BASE_HITS#1,F
F1_000206 equ $ ; in [INVADERS.BAS] BASE_HIT = TRUE ' Indicate a missile has hit a target
Bsf MISSILE_STATUS,2
F@Jump bc@LL11
bc@LL10
F1_000207 equ $ ; in [INVADERS.BAS] Else
F1_000208 equ $ ; in [INVADERS.BAS] BASE_ENABLED#1 = FALSE ' Disable the base element
Clrf BASE_ENABLED#1
F1_000209 equ $ ; in [INVADERS.BAS] Endif
bc@LL11
F@Jump bc@LL1
bc@LL8
F1_000210 equ $ ; in [INVADERS.BAS] Case 24 to 29 ' Has the missile XPOS hit BASE 1, ELEMENT 2
Movlw 23
Cpfsgt BASE_XPOS_TEST
F@Jump bc@LL13
Movlw 30
Cpfslt BASE_XPOS_TEST
F@Jump bc@LL13
F1_000211 equ $ ; in [INVADERS.BAS] If BASE_HITS#2 < 5 AND BASE_ENABLED#2 = TRUE Then ' Is the base element enabled, and has had less than 5 hits ?
Movlw 5
Subwf BASE_HITS#2,W
Movlw 1
Btfsc STATUS,0
Clrw
Movwf SP#P9
Movff BASE_ENABLED#2,PP0
Movlw 1
F@Call t@eb
Andwf SP#P9,W
Btfsc STATUS,2
Go@to bc@LL15
F1_000212 equ $ ; in [INVADERS.BAS] Inc BASE_HITS#2 ' Increment the amount of hits the base element has sustained
Incf BASE_HITS#2,F
F1_000213 equ $ ; in [INVADERS.BAS] BASE_HIT = TRUE ' Indicate a missile has hit a target
Bsf MISSILE_STATUS,2
F@Jump bc@LL16
bc@LL15
F1_000214 equ $ ; in [INVADERS.BAS] Else
F1_000215 equ $ ; in [INVADERS.BAS] BASE_ENABLED#2 = FALSE ' Disable the base element
Clrf BASE_ENABLED#2
F1_000216 equ $ ; in [INVADERS.BAS] Endif
bc@LL16
F@Jump bc@LL1
bc@LL13
F1_000217 equ $ ; in [INVADERS.BAS] Case 54 to 59 ' Has the missile XPOS hit BASE 2, ELEMENT 3
Movlw 53
Cpfsgt BASE_XPOS_TEST
F@Jump bc@LL18
Movlw 60
Cpfslt BASE_XPOS_TEST
F@Jump bc@LL18
F1_000218 equ $ ; in [INVADERS.BAS] If BASE_HITS#3 < 5 AND BASE_ENABLED#3 = TRUE Then ' Is the base element enabled, and has had less than 5 hits ?
Movlw 5
Subwf BASE_HITS#3,W
Movlw 1
Btfsc STATUS,0
Clrw
Movwf SP#P9
Movff BASE_ENABLED#3,PP0
Movlw 1
F@Call t@eb
Andwf SP#P9,W
Btfsc STATUS,2
Go@to bc@LL20
F1_000219 equ $ ; in [INVADERS.BAS] Inc BASE_HITS#3 ' Increment the amount of hits the base element has sustained
Incf BASE_HITS#3,F
F1_000220 equ $ ; in [INVADERS.BAS] BASE_HIT = TRUE ' Indicate a missile has hit a target
Bsf MISSILE_STATUS,2
F@Jump bc@LL21
bc@LL20
F1_000221 equ $ ; in [INVADERS.BAS] Else
F1_000222 equ $ ; in [INVADERS.BAS] BASE_ENABLED#3 = FALSE ' Disable the base element
Clrf BASE_ENABLED#3
F1_000223 equ $ ; in [INVADERS.BAS] Endif
bc@LL21
F@Jump bc@LL1
bc@LL18
F1_000224 equ $ ; in [INVADERS.BAS] Case 60 to 65 ' Has the missile XPOS hit BASE 2, ELEMENT 4
Movlw 59
Cpfsgt BASE_XPOS_TEST
F@Jump bc@LL23
Movlw 66
Cpfslt BASE_XPOS_TEST
F@Jump bc@LL23
F1_000225 equ $ ; in [INVADERS.BAS] If BASE_HITS#4 < 5 AND BASE_ENABLED#4 = TRUE Then ' Is the base element enabled, and has had less than 5 hits ?
Movlw 5
Subwf BASE_HITS#4,W
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -