LOC OBJECT CODE LINE SOURCE TEXT VALUE 00001 ;**************************************************************** 00002 ;* MEMORY GAME - SIMON * 00003 ;* BY KEITH WILSON * 00004 ;* * 00005 ;**************************************************************** 00006 00015 LIST P=16F84A, ;microcontroller 00016 00017 INCLUDE "p16F84A.inc" ;register memory mapping file 00001 LIST 00002 ; P16F84A.INC 00134 LIST 00018 INCLUDE "simonF84.inc" ;Simon definitions 00001 ;**************************************************************** 00002 ;* MEMORY GAME - simon * 00003 ;* BY KEITH WILSON * 00004 ;* * 00005 ;**************************************************************** 00006 00007 ;Port A definitions 00000011 00008 PORTA_CONFIG1 EQU 0X11 ;bit4: in,out,out,out,in :bit0 00000000 00009 RANDOM_PULSE EQU 0 ;random pulse input 00000001 00010 BUZZER EQU 1 ;buzzer output 00000002 00011 LED_REMEMBER EQU 2 ;play status - remember 00000003 00012 LED_REPEAT EQU 3 ;play status - repeat 00000004 00013 LEVEL EQU 4 ;level of difficulty input 00014 00015 ;Port B definitions 0000000F 00016 PORTB_CONFIG1 EQU 0X0F ;bit7: out,out,out,out,in,in,in,in :bit0 00000000 00017 KEY_RED EQU 0 ;red key input - bit0 00000001 00018 KEY_GREEN EQU 1 ;green key input - bit1 00000002 00019 KEY_YELLOW EQU 2 ;yellow key input - bit2 00000003 00020 KEY_BLUE EQU 3 ;blue key input - bit3 00000004 00021 LED_RED EQU 4 ;red led output - bit4 00000005 00022 LED_GREEN EQU 5 ;green led output - bit5 00000006 00023 LED_YELLOW EQU 6 ;yellow led output- bit6 00000007 00024 LED_BLUE EQU 7 ;blue led output- bit7 00025 0000000C 00026 RAM_START EQU 0X0C ;start of global variable ram 0000001A 00027 LINE_OFFSET EQU 0X1A ;start of step memory in ram area 00028 00000000 00029 RECORD_STEPS EQU 0X00 ;eeprom address for step record 00030 00031 ;Data for song notes LOC OBJECT CODE LINE SOURCE TEXT VALUE 00032 00033 ;NOTE 00034 ;Value= 10's of microseconds 00035 ;octave 1 000000FF 00036 NOTE_G0 EQU D'255' ;196 Hz 000000E3 00037 NOTE_A0 EQU D'227' ;220 Hz 000000CA 00038 NOTE_B0 EQU D'202' ;247 Hz 00039 00040 ;octave 2 000000BF 00041 NOTE_C1 EQU D'191' ;262 Hz 000000AA 00042 NOTE_D1 EQU D'170' ;294 Hz 00000098 00043 NOTE_E1 EQU D'152' ;330 Hz 0000008F 00044 NOTE_F1 EQU D'143' ;349 Hz 00000080 00045 NOTE_G1 EQU D'128' ;392 Hz 00000072 00046 NOTE_A1 EQU D'114' ;440 Hz 00000065 00047 NOTE_B1 EQU D'101' ;494 Hz 00048 00049 ;octave 3 0000005F 00050 NOTE_C2 EQU D'95' ;524 Hz 00000055 00051 NOTE_D2 EQU D'85' ;588 Hz 0000004C 00052 NOTE_E2 EQU D'76' ;660 Hz 00000048 00053 NOTE_F2 EQU D'72' ;698 Hz 00000040 00054 NOTE_G2 EQU D'64' ;784 Hz 00000039 00055 NOTE_A2 EQU D'57' ;880 Hz 00000033 00056 NOTE_B2 EQU D'51' ;988 Hz 00057 00058 ;octave 4 00000030 00059 NOTE_C3 EQU D'48' ;1048 Hz 0000002B 00060 NOTE_D3 EQU D'43' ;1176 Hz 00000026 00061 NOTE_E3 EQU D'38' ;1320 Hz 00000024 00062 NOTE_F3 EQU D'36' ;1396 Hz 00000020 00063 NOTE_G3 EQU D'32' ;1568 Hz 0000001C 00064 NOTE_A3 EQU D'28' ;1760 Hz 00000019 00065 NOTE_B3 EQU D'25' ;1976 Hz 00066 00067 ;length of notes 00068 ;"tempo"(nomalized) length is set in SoundPlay function by timerb 00000020 00069 LENGTH_SEMIBREVE EQU 0X20 ;tempo 00000010 00070 LENGTH_MINIM EQU 0X10 ;tempo/2 00000008 00071 LENGTH_CROTCHET EQU 0X08 ;tempo/4 00000004 00072 LENGTH_QUAVER EQU 0X04 ;tempo/8 00000002 00073 LENGTH_SEMIQUAVER EQU 0X02 ;tempo/16 00000001 00074 LENGTH_DEMISEMIQUAVER EQU 0X01 ;tempo/32 00075 00076 00000044 00077 SONG_HEY_JUDE_LEN EQU D'68' ;total number of notes + lengths 0000006C 00078 SONG_OSUSANA_LEN EQU D'108' 00000016 00079 SONG_DEATHMARCH_LEN EQU D'22' 00080 0000005F 00081 KEY_RED_SOUND EQU NOTE_C2 0000004C 00082 KEY_GREEN_SOUND EQU NOTE_E2 00000040 00083 KEY_YELLOW_SOUND EQU NOTE_G2 00000033 00084 KEY_BLUE_SOUND EQU NOTE_B2 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00085 00019 2007 3FF3 00020 __CONFIG 3FF3H 00021 00022 ;**************************************************************** 00023 ;global variable memory 00024 ;**************************************************************** 0000000C 00025 TIMERA EQU 0X0C ;general purpose timer 0000000D 00026 TIMERB EQU 0X0D ;general purpose timer 0000000E 00027 TIMERC EQU 0X0E ;general purpose timer 0000000F 00028 TIMERD EQU 0X0F ;general purpose timer 00000010 00029 NOTE_SELECT EQU 0X10 ;selection of note 00000011 00030 NOTE_TONE EQU 0X11 ;frequency of note 00000012 00031 NOTE_LENGTH EQU 0X12 ;length of note 00000013 00032 NOTE_TEMPO EQU 0X13 ;tempo of song 00000014 00033 RANDOM EQU 0X14 ;random number 00000015 00034 KEY EQU 0X15 ;key last pressed 00000016 00035 COLUMN_W EQU 0X16 ;write pointer in sequence table X 00000017 00036 LINE_W EQU 0X17 ;write pointer in sequence table Y 00000018 00037 COLUMN_R EQU 0X18 ;read pointer in sequence table X 00000019 00038 LINE_R EQU 0X19 ;read pointer in sequnece table Y 0000001A 00039 STEPS0104 EQU 0X1A ;step memory 0000001B 00040 STEPS0508 EQU 0X1B ;step memory 0000001C 00041 STEPS0912 EQU 0X1C ;step memory 0000001D 00042 STEPS1316 EQU 0X1D ;step memory 0000001E 00043 STEPS1720 EQU 0X1E ;step memory 0000001F 00044 STEPS2124 EQU 0X1F ;step memory 00000020 00045 STEPS2528 EQU 0X20 ;step memory 00000021 00046 STEPS2932 EQU 0X21 ;step memory 00000022 00047 STEPS3336 EQU 0X22 ;step memory 00000023 00048 STEPS3740 EQU 0X23 ;step memory 00000024 00049 STEPS4144 EQU 0X24 ;step memory 00000025 00050 STEPS4548 EQU 0X25 ;step memory 00000026 00051 STEPS4952 EQU 0X26 ;step memory 00000027 00052 STEPTEMP EQU 0X27 ;temporary step memory 00000028 00053 STEPSGOOD EQU 0X28 ;number of succesful steps by player 00054 00055 ;**************************************************************** 00056 ;reset vector 00057 ;**************************************************************** 0000 00058 RESET: ORG 0X00 ;reset vector address 0000 2806 00059 GOTO START ;start program execution 00060 00061 0006 00062 START: ORG 0X06 ;start of program 0006 28D0 00063 GOTO INITIALISATION 00064 00065 ;**************************************************************** 00066 ; Data tables for Songs 00067 ;**************************************************************** 0007 00068 SONGHEYJUDE: 0007 0782 00069 ADDWF PCL,F ;jump formward accoding to W value 0008 3480 00070 RETLW NOTE_G1 ;Hey LOC OBJECT CODE LINE SOURCE TEXT VALUE 0009 3408 00071 RETLW LENGTH_CROTCHET 000A 3498 00072 RETLW NOTE_E1 ;jude 000B 3410 00073 RETLW LENGTH_MINIM 000C 3498 00074 RETLW NOTE_E1 ;don't 000D 3404 00075 RETLW LENGTH_QUAVER 000E 3480 00076 RETLW NOTE_G1 ;make 000F 3404 00077 RETLW LENGTH_QUAVER 0010 3472 00078 RETLW NOTE_A1 ;it 0011 3404 00079 RETLW LENGTH_QUAVER 0012 34AA 00080 RETLW NOTE_D1 ;bad, 0013 3410 00081 RETLW LENGTH_MINIM 0014 34AA 00082 RETLW NOTE_D1 ;take 0015 3404 00083 RETLW LENGTH_QUAVER 0016 3498 00084 RETLW NOTE_E1 ;a 0017 3404 00085 RETLW LENGTH_QUAVER 0018 348F 00086 RETLW NOTE_F1 ;sad 0019 3408 00087 RETLW LENGTH_CROTCHET 001A 345F 00088 RETLW NOTE_C2 ;song 001B 3410 00089 RETLW LENGTH_MINIM 001C 345F 00090 RETLW NOTE_C2 ;and 001D 3404 00091 RETLW LENGTH_QUAVER 001E 3465 00092 RETLW NOTE_B1 ;make 001F 3404 00093 RETLW LENGTH_QUAVER 0020 3480 00094 RETLW NOTE_G1 ;it 0021 3404 00095 RETLW LENGTH_QUAVER 0022 3472 00096 RETLW NOTE_A1 ;bet- 0023 3404 00097 RETLW LENGTH_QUAVER 0024 3480 00098 RETLW NOTE_G1 ;ter. 0025 3410 00099 RETLW LENGTH_MINIM 0026 3480 00100 RETLW NOTE_G1 ;Re- 0027 3404 00101 RETLW LENGTH_QUAVER 0028 3472 00102 RETLW NOTE_A1 ;mem- 0029 3404 00103 RETLW LENGTH_QUAVER 002A 3472 00104 RETLW NOTE_A1 ;ber 002B 3408 00105 RETLW LENGTH_CROTCHET 002C 3472 00106 RETLW NOTE_A1 ;to 002D 3404 00107 RETLW LENGTH_QUAVER 002E 3455 00108 RETLW NOTE_D2 ;let 002F 3402 00109 RETLW LENGTH_SEMIQUAVER 0030 345F 00110 RETLW NOTE_C2 ;her 0031 3408 00111 RETLW LENGTH_CROTCHET 0032 3465 00112 RETLW NOTE_B1 ;in 0033 3404 00113 RETLW LENGTH_QUAVER 0034 345F 00114 RETLW NOTE_C2 ;to 0035 3404 00115 RETLW LENGTH_QUAVER 0036 3472 00116 RETLW NOTE_A1 ;your 0037 3408 00117 RETLW LENGTH_CROTCHET 0038 3480 00118 RETLW NOTE_G1 ;heart, 0039 3410 00119 RETLW LENGTH_MINIM 003A 34BF 00120 RETLW NOTE_C1 ;then 003B 3404 00121 RETLW LENGTH_QUAVER 003C 34AA 00122 RETLW NOTE_D1 ;you 003D 3404 00123 RETLW LENGTH_QUAVER LOC OBJECT CODE LINE SOURCE TEXT VALUE 003E 3498 00124 RETLW NOTE_E1 ;can 003F 3404 00125 RETLW LENGTH_QUAVER 0040 3472 00126 RETLW NOTE_A1 ;start 0041 3410 00127 RETLW LENGTH_MINIM 0042 3480 00128 RETLW NOTE_G1 ;to 0043 3404 00129 RETLW LENGTH_QUAVER 0044 348F 00130 RETLW NOTE_F1 ;make 0045 3404 00131 RETLW LENGTH_QUAVER 0046 3498 00132 RETLW NOTE_E1 ;it 0047 3404 00133 RETLW LENGTH_QUAVER 0048 34BF 00134 RETLW NOTE_C1 ;bet- 0049 3404 00135 RETLW LENGTH_QUAVER 004A 34BF 00136 RETLW NOTE_C1 ;ter. 004B 3410 00137 RETLW LENGTH_MINIM 00138 004C 00139 SONGOSUSANA: 004C 0782 00140 ADDWF PCL,F ;jump formward according to W value 004D 345F 00141 RETLW NOTE_C2 004E 3410 00142 RETLW LENGTH_MINIM 004F 3455 00143 RETLW NOTE_D2 0050 3404 00144 RETLW LENGTH_QUAVER 0051 344C 00145 RETLW NOTE_E2 0052 3408 00146 RETLW LENGTH_CROTCHET 0053 3440 00147 RETLW NOTE_G2 0054 3408 00148 RETLW LENGTH_CROTCHET 0055 3440 00149 RETLW NOTE_G2 0056 3408 00150 RETLW LENGTH_CROTCHET 0057 3439 00151 RETLW NOTE_A2 0058 3408 00152 RETLW LENGTH_CROTCHET 0059 3440 00153 RETLW NOTE_G2 005A 3408 00154 RETLW LENGTH_CROTCHET 005B 344C 00155 RETLW NOTE_E2 005C 3408 00156 RETLW LENGTH_CROTCHET 005D 345F 00157 RETLW NOTE_C2 005E 3410 00158 RETLW LENGTH_MINIM 005F 3455 00159 RETLW NOTE_D2 0060 3404 00160 RETLW LENGTH_QUAVER 0061 344C 00161 RETLW NOTE_E2 0062 3408 00162 RETLW LENGTH_CROTCHET 0063 344C 00163 RETLW NOTE_E2 0064 3408 00164 RETLW LENGTH_CROTCHET 0065 3455 00165 RETLW NOTE_D2 0066 3408 00166 RETLW LENGTH_CROTCHET 0067 345F 00167 RETLW NOTE_C2 0068 3408 00168 RETLW LENGTH_CROTCHET 0069 3455 00169 RETLW NOTE_D2 006A 3410 00170 RETLW LENGTH_MINIM 006B 345F 00171 RETLW NOTE_C2 006C 3410 00172 RETLW LENGTH_MINIM 006D 3455 00173 RETLW NOTE_D2 006E 3404 00174 RETLW LENGTH_QUAVER 006F 344C 00175 RETLW NOTE_E2 0070 3408 00176 RETLW LENGTH_CROTCHET LOC OBJECT CODE LINE SOURCE TEXT VALUE 0071 3440 00177 RETLW NOTE_G2 0072 3408 00178 RETLW LENGTH_CROTCHET 0073 3440 00179 RETLW NOTE_G2 0074 3408 00180 RETLW LENGTH_CROTCHET 0075 3439 00181 RETLW NOTE_A2 0076 3408 00182 RETLW LENGTH_CROTCHET 0077 3440 00183 RETLW NOTE_G2 0078 3408 00184 RETLW LENGTH_CROTCHET 0079 344C 00185 RETLW NOTE_E2 007A 3408 00186 RETLW LENGTH_CROTCHET 007B 345F 00187 RETLW NOTE_C2 007C 3410 00188 RETLW LENGTH_MINIM 007D 3455 00189 RETLW NOTE_D2 007E 3410 00190 RETLW LENGTH_MINIM 007F 344C 00191 RETLW NOTE_E2 0080 3408 00192 RETLW LENGTH_CROTCHET 0081 344C 00193 RETLW NOTE_E2 0082 3408 00194 RETLW LENGTH_CROTCHET 0083 3455 00195 RETLW NOTE_D2 0084 3408 00196 RETLW LENGTH_CROTCHET 0085 345F 00197 RETLW NOTE_C2 0086 3410 00198 RETLW LENGTH_MINIM 0087 3448 00199 RETLW NOTE_F2 0088 3408 00200 RETLW LENGTH_CROTCHET 0089 3448 00201 RETLW NOTE_F2 008A 3408 00202 RETLW LENGTH_CROTCHET 008B 3439 00203 RETLW NOTE_A2 008C 3408 00204 RETLW LENGTH_CROTCHET 008D 3439 00205 RETLW NOTE_A2 008E 3408 00206 RETLW LENGTH_CROTCHET 008F 3439 00207 RETLW NOTE_A2 0090 3408 00208 RETLW LENGTH_CROTCHET 0091 3440 00209 RETLW NOTE_G2 0092 3408 00210 RETLW LENGTH_CROTCHET 0093 3440 00211 RETLW NOTE_G2 0094 3408 00212 RETLW LENGTH_CROTCHET 0095 344C 00213 RETLW NOTE_E2 0096 3408 00214 RETLW LENGTH_CROTCHET 0097 345F 00215 RETLW NOTE_C2 0098 3408 00216 RETLW LENGTH_CROTCHET 0099 3455 00217 RETLW NOTE_D2 009A 3410 00218 RETLW LENGTH_MINIM 009B 345F 00219 RETLW NOTE_C2 009C 3410 00220 RETLW LENGTH_MINIM 009D 3455 00221 RETLW NOTE_D2 009E 3404 00222 RETLW LENGTH_QUAVER 009F 344C 00223 RETLW NOTE_E2 00A0 3408 00224 RETLW LENGTH_CROTCHET 00A1 3440 00225 RETLW NOTE_G2 00A2 3408 00226 RETLW LENGTH_CROTCHET 00A3 3440 00227 RETLW NOTE_G2 00A4 3408 00228 RETLW LENGTH_CROTCHET 00A5 3439 00229 RETLW NOTE_A2 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00A6 3408 00230 RETLW LENGTH_CROTCHET 00A7 3440 00231 RETLW NOTE_G2 00A8 3408 00232 RETLW LENGTH_CROTCHET 00A9 344C 00233 RETLW NOTE_E2 00AA 3408 00234 RETLW LENGTH_CROTCHET 00AB 345F 00235 RETLW NOTE_C2 00AC 3410 00236 RETLW LENGTH_MINIM 00AD 3455 00237 RETLW NOTE_D2 00AE 3404 00238 RETLW LENGTH_QUAVER 00AF 344C 00239 RETLW NOTE_E2 00B0 3408 00240 RETLW LENGTH_CROTCHET 00B1 344C 00241 RETLW NOTE_E2 00B2 3408 00242 RETLW LENGTH_CROTCHET 00B3 3455 00243 RETLW NOTE_D2 00B4 3408 00244 RETLW LENGTH_CROTCHET 00B5 3455 00245 RETLW NOTE_D2 00B6 3408 00246 RETLW LENGTH_CROTCHET 00B7 345F 00247 RETLW NOTE_C2 00B8 3420 00248 RETLW LENGTH_SEMIBREVE 00249 00B9 00250 SONGDEATHMARCH: 00B9 0782 00251 ADDWF PCL,F ;jump formward accoding to W value 00BA 34BF 00252 RETLW NOTE_C1 00BB 3410 00253 RETLW LENGTH_MINIM 00BC 34BF 00254 RETLW NOTE_C1 00BD 3404 00255 RETLW LENGTH_QUAVER 00BE 34BF 00256 RETLW NOTE_C1 00BF 3408 00257 RETLW LENGTH_CROTCHET 00C0 34BF 00258 RETLW NOTE_C1 00C1 3404 00259 RETLW LENGTH_QUAVER 00C2 34BF 00260 RETLW NOTE_C1 00C3 3408 00261 RETLW LENGTH_CROTCHET 00C4 3498 00262 RETLW NOTE_E1 00C5 3404 00263 RETLW LENGTH_QUAVER 00C6 34AA 00264 RETLW NOTE_D1 00C7 3408 00265 RETLW LENGTH_CROTCHET 00C8 34BF 00266 RETLW NOTE_C1 00C9 3404 00267 RETLW LENGTH_QUAVER 00CA 34BF 00268 RETLW NOTE_C1 00CB 3408 00269 RETLW LENGTH_CROTCHET 00CC 34CA 00270 RETLW NOTE_B0 00CD 3408 00271 RETLW LENGTH_CROTCHET 00CE 34BF 00272 RETLW NOTE_C1 00CF 3410 00273 RETLW LENGTH_MINIM 00274 00275 ;**************************************************************** 00276 ;Name : Initialisation 00277 ;Description : system initialisation and mainloop 00278 ;Inputs : none 00279 ;Outputs : none 00280 ;**************************************************************** 00D0 00281 INITIALISATION: 00282 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00283 ;system initialisation 00284 00285 ;port A and port B initialisation 00286 00D0 1303 00287 BCF STATUS,RP1 ;select bank1 register 00D1 1683 00288 BSF STATUS,RP0 00289 00D2 3011 00290 MOVLW PORTA_CONFIG1 ;porta configuration 00D3 0085 00291 MOVWF TRISA 00D4 300F 00292 MOVLW PORTB_CONFIG1 ;portb configuration 00D5 0086 00293 MOVWF TRISB 00294 00D6 3088 00295 MOVLW 0X88 ;Fosc/4;No prescaler 00D7 0081 00296 MOVWF 0X81 ;Timer configuration in option register 00297 00D8 1283 00298 BCF STATUS,RP0 ;select bank0 registers 00299 00D9 00300 NEWGAME: 00D9 0185 00301 CLRF PORTA ;turn off status leds 00DA 0186 00302 CLRF PORTB ;turn off all leds 00303 00DB 300C 00304 MOVLW RAM_START ;clear global variables 00DC 0084 00305 MOVWF FSR 00DD 0180 00306 S1: CLRF INDF 00DE 0A84 00307 INCF FSR,F 00DF 1F04 00308 BTFSS FSR,6 00E0 28DD 00309 GOTO S1 00310 00E1 0817 00311 MOVF LINE_W,W ;initialise step memory base 00E2 3E1A 00312 ADDLW LINE_OFFSET ;add step memory offset 00E3 0097 00313 MOVWF LINE_W 00314 00E4 20F9 00315 CALL CLEARRECORD ;clear record steps? 00E5 2110 00316 CALL INTRODUCTION ;introductory song & calibration 00317 00318 ;**************************************************************** 00319 ;Name : Mainloop 00320 ;Description : 00321 ;Inputs : none 00322 ;Outputs : none 00323 ;**************************************************************** 00E6 00324 MAINLOOP: 00E6 215F 00325 CALL GETSTEP ;create a new step & add it to sequence 00E7 217E 00326 CALL SHOWSEQUENCE ;show sequence on LEDs 00E8 21C9 00327 CALL GETUSERSEQUENCE ;player's sequence(result returned in W) 00328 ;W=1 - correct, W=0 - wrong 00E9 3A01 00329 XORLW 1 ;is player's sequence correct? 00EA 1D03 00330 BTFSS STATUS,Z ;yes - ignore next instruction 00EB 2A31 00331 GOTO SEQUENCEBAD ;no - it's wrong! 00332 00EC 0AA8 00333 INCF STEPSGOOD,F ;another successful step by player 00334 00ED 2289 00335 CALL DELAY150 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00EE 2289 00336 CALL DELAY150 00EF 2289 00337 CALL DELAY150 00338 00F0 0817 00339 MOVF LINE_W,W ;max sequence reached(52 steps)? 00F1 3A34 00340 XORLW D'52' 00F2 1D03 00341 BTFSS STATUS,Z 00F3 28E6 00342 GOTO MAINLOOP ;no - do another step 00F4 0816 00343 MOVF COLUMN_W,W 00F5 3A03 00344 XORLW D'3' 00F6 1D03 00345 BTFSS STATUS,Z 00F7 28E6 00346 GOTO MAINLOOP ;no - do another step 00347 00F8 2A5F 00348 GOTO SEQUENCERECORD ;yes - max sequence correct! 00349 00350 00351 ;**************************************************************** 00352 ;Name : ClearRecord 00353 ;Description : allows the player to clear the current step 00354 ; : record. Player must press one of the keys 00355 ; : at power-on for EEPROM to be set to zero 00356 ;Inputs : none 00357 ;Outputs : none 00358 ;**************************************************************** 00F9 00359 CLEARRECORD: 00F9 0806 00360 MOVF PORTB,W ;test for a key press 00FA 390F 00361 ANDLW 0X0F ;mask keys 00FB 3A00 00362 XORLW 0X00 ;are any keys being pressed? 00FC 1903 00363 BTFSC STATUS,Z ;yes - skip next instruction 00FD 0008 00364 RETURN ;no - return! 00365 00FE 3000 00366 MOVLW RECORD_STEPS ;clear step record in EEPROM 00FF 0089 00367 MOVWF EEADR 0100 0188 00368 CLRF EEDATA 00369 0101 1683 00370 BSF STATUS,RP0 ;select bank1 0102 1508 00371 BSF EECON1,WREN ;enable write 0103 3055 00372 MOVLW 0X55 ;unlock codes 0104 0089 00373 MOVWF EECON2 0105 30AA 00374 MOVLW 0XAA 0106 0089 00375 MOVWF EECON2 0107 1488 00376 BSF EECON1,WR ;write begins 0108 1108 00377 BCF EECON1,WREN ;disable further writes 0109 1888 00378 CREC: BTFSC EECON1,WR ;wait to write complete 010A 2909 00379 GOTO CREC 010B 1283 00380 BCF STATUS,RP0 ;select bank0 00381 010C 3002 00382 MOVLW 0X02 010D 0093 00383 MOVWF NOTE_TEMPO 010E 214B 00384 CALL SOUNDRISINGROCKET ;cleared record indication 00385 010F 0008 00386 RETURN 00387 00388 ;**************************************************************** LOC OBJECT CODE LINE SOURCE TEXT VALUE 00389 ;Name : Introduction 00390 ;Description : plays the introductory "hey jude" song until 00391 ; : one of the keys is pressed. 00392 ;Inputs : none 00393 ;Outputs : none 00394 ;**************************************************************** 0110 00395 INTRODUCTION: 0110 0190 00396 CLRF NOTE_SELECT ;beginning of "hey jude" song 0111 0AA7 00397 INTR1: INCF STEPTEMP,F 0112 0827 00398 MOVF STEPTEMP,W 0113 3903 00399 ANDLW 0X03 0114 0094 00400 MOVWF RANDOM 0115 2289 00401 CALL DELAY150 0116 21B6 00402 CALL SHOWLED ;show it on leds 0117 3010 00403 MOVLW 0X10 0118 0093 00404 MOVWF NOTE_TEMPO ;speed of song 0119 0810 00405 MOVF NOTE_SELECT,W ;get next "hey jude" note 011A 2007 00406 CALL SONGHEYJUDE ;returned in W 011B 0091 00407 MOVWF NOTE_TONE 011C 0A90 00408 INCF NOTE_SELECT,F 011D 0810 00409 MOVF NOTE_SELECT,W ;get length of note 011E 2007 00410 CALL SONGHEYJUDE 011F 0092 00411 MOVWF NOTE_LENGTH 00412 0120 2130 00413 CALL SOUNDPLAY ;play music 00414 0121 0186 00415 CLRF PORTB ;turn all leds off 0122 0A90 00416 INCF NOTE_SELECT,F ;select next note 0123 0810 00417 MOVF NOTE_SELECT,W 0124 3A44 00418 XORLW SONG_HEY_JUDE_LEN ;end of song? 0125 1903 00419 BTFSC STATUS,Z ;no - skip next instruction 0126 0190 00420 CLRF NOTE_SELECT ;yes - play it again from beginning 00421 0127 0806 00422 MOVF PORTB,W ;test for a key press 0128 390F 00423 ANDLW 0X0F ;mask keys 0129 3A00 00424 XORLW 0X00 ;are any keys being pressed? 012A 1903 00425 BTFSC STATUS,Z ;yes - skip next instruction 012B 2911 00426 GOTO INTR1 ;no - keep playing music! 00427 012C 3002 00428 MOVLW 0X02 012D 0093 00429 MOVWF NOTE_TEMPO 012E 214B 00430 CALL SOUNDRISINGROCKET ;start new game indication 00431 012F 0008 00432 RETURN ;start new game 00433 00434 00435 ;**************************************************************** 00436 ;Name : SoundPlay 00437 ;Description : plays a tone on the buzzer 00438 ;Inputs : note_tone - frequency of the tone 00439 ; : note_length - length of note 00440 ; : note_tempo - speed of song 00441 ;Outputs : none LOC OBJECT CODE LINE SOURCE TEXT VALUE 00442 ;**************************************************************** 0130 00443 SOUNDPLAY: 0130 018E 00444 CLRF TIMERC ;initialise timer 0131 080E 00445 SP1: MOVF TIMERC,W 0132 0612 00446 XORWF NOTE_LENGTH,W ;end of note? 0133 1903 00447 BTFSC STATUS,Z ;no - skip next instruction 0134 0008 00448 RETURN ;yes - exit function 00449 0135 0813 00450 MOVF NOTE_TEMPO,W 0136 008D 00451 MOVWF TIMERB 00452 0137 0811 00453 SP2: MOVF NOTE_TONE,W ;frequency 0138 1485 00454 BSF PORTA,BUZZER ;high time 0139 2140 00455 CALL SOUNDDELAY 013A 1085 00456 BCF PORTA,BUZZER ;low time 013B 2140 00457 CALL SOUNDDELAY 013C 0B8D 00458 DECFSZ TIMERB,F 013D 2937 00459 GOTO SP2 013E 0A8E 00460 INCF TIMERC,F 013F 2931 00461 GOTO SP1 00462 00463 ;**************************************************************** 00464 ;Name : SoundDelay 00465 ;Description : a special delay function used whenever sound 00466 ; : must be produced on the buzzer. The W register 00467 ; : contains the number of cycles to wait (in 10's 00468 ; : of microseconds. 00469 ;Inputs : W - contains the note to be played 00470 ; : ie. W=191, delay==1,91msec 00471 ;Outputs : none 00472 ;**************************************************************** 0140 00473 SOUNDDELAY: 0140 008C 00474 MOVWF TIMERA 0141 0000 00475 SD1: NOP 0142 0000 00476 NOP 0143 0000 00477 NOP 0144 0000 00478 NOP 0145 0000 00479 NOP 0146 0000 00480 NOP 0147 0000 00481 NOP 0148 0B8C 00482 DECFSZ TIMERA,F 0149 2941 00483 GOTO SD1 00484 014A 0008 00485 RETURN 00486 00487 00488 ;**************************************************************** 00489 ;Name : SoundRisingRocket 00490 ;Description : rising rocket sound effect 00491 ;Inputs : note_tempo - speed of rocket 00492 ;Outputs : none 00493 ;**************************************************************** 014B 00494 SOUNDRISINGROCKET: LOC OBJECT CODE LINE SOURCE TEXT VALUE 014B 0191 00495 CLRF NOTE_TONE ;make tone=255 - start 014C 0991 00496 COMF NOTE_TONE,F ;with lowest frequency 00497 014D 3001 00498 SRR1: MOVLW LENGTH_DEMISEMIQUAVER 014E 0092 00499 MOVWF NOTE_LENGTH 014F 2130 00500 CALL SOUNDPLAY 0150 0B91 00501 DECFSZ NOTE_TONE,F ;do a "rising" sound 0151 294D 00502 GOTO SRR1 0152 2289 00503 CALL DELAY150 0153 2289 00504 CALL DELAY150 0154 2289 00505 CALL DELAY150 0155 2289 00506 CALL DELAY150 0156 2289 00507 CALL DELAY150 0157 2289 00508 CALL DELAY150 0158 2289 00509 CALL DELAY150 0159 2289 00510 CALL DELAY150 00511 00512 015A 0008 00513 RETURN 00514 00515 ;**************************************************************** 00516 ;Name : GetRandom 00517 ;Description : reads the PIC's timer register at various 00518 ; : "random" intervals caused by the player 00519 ;Inputs : pressing one of the keys. 00520 ;Outputs : random - random number 0-3 00521 ;**************************************************************** 015B 00522 GETRANDOM: 015B 0801 00523 MOVF TMR0,W 015C 3903 00524 ANDLW 0X03 ;mask all but bit0,bit1 015D 0094 00525 MOVWF RANDOM 00526 015E 0008 00527 RETURN 00528 00529 ;**************************************************************** 00530 ;Name : GetStep 00531 ;Description : gets a random number and stores it into the 00532 ; : next available position in sequence table. 00533 ;Inputs : none 00534 ;Outputs : none 00535 ;**************************************************************** 015F 00536 GETSTEP: 015F 1185 00537 BCF PORTA,LED_REPEAT ;tell player to start watching! 0160 1505 00538 BSF PORTA,LED_REMEMBER 00539 0161 215B 00540 CALL GETRANDOM ;ascertain random number 00541 0162 0817 00542 MOVF LINE_W,W ;get current line 0163 0084 00543 MOVWF FSR ;pointer to next available memory 0164 1003 00544 BCF STATUS,C ;initialise carry 00545 0165 0816 00546 MOVF COLUMN_W,W ;get current column 0166 3A00 00547 XORLW 0 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0167 1903 00548 BTFSC STATUS,Z 0168 2975 00549 GOTO GCOL0 ;column=0 - don't shift 0169 3A01 00550 XORLW 0X01 016A 1903 00551 BTFSC STATUS,Z 016B 2973 00552 GOTO GCOL1 ;column=1 - shift random 2 times 016C 3A03 00553 XORLW 0X03 016D 1903 00554 BTFSC STATUS,Z 016E 2971 00555 GOTO GCOL2 ;column=2 - shift random 4 times 00556 016F 0D94 00557 GCOL3: RLF RANDOM,F ;column=3 - shift random 6 times 0170 0D94 00558 RLF RANDOM,F 0171 0D94 00559 GCOL2: RLF RANDOM,F 0172 0D94 00560 RLF RANDOM,F 0173 0D94 00561 GCOL1: RLF RANDOM,F 0174 0D94 00562 RLF RANDOM,F 0175 0800 00563 GCOL0: MOVF INDF,W ;get current memory byte of sequence table 0176 0414 00564 IORWF RANDOM,W ;merge new random number into table 0177 0080 00565 MOVWF INDF ;restore in sequence table 00566 0178 0A96 00567 INCF COLUMN_W,F ;update column 0179 1D16 00568 BTFSS COLUMN_W,2 ;end of this memory byte in sequence table? 017A 0008 00569 RETURN ;no - return 017B 0196 00570 CLRF COLUMN_W ;yes - select next memory byte in sequence table 017C 0A97 00571 INCF LINE_W,F 00572 017D 0008 00573 RETURN 00574 00575 ;**************************************************************** 00576 ;Name : ShowSequence 00577 ;Description : displays the step sequence that the player 00578 ; : has to remember and repeat. 00579 ;Inputs : none 00580 ;Outputs : none 00581 ;**************************************************************** 017E 00582 SHOWSEQUENCE: 017E 0198 00583 CLRF COLUMN_R ;begin at start of step sequence 017F 301A 00584 MOVLW LINE_OFFSET 0180 0099 00585 MOVWF LINE_R 00586 0181 0819 00587 SS1: MOVF LINE_R,W 0182 0084 00588 MOVWF FSR 0183 0800 00589 MOVF INDF,W 0184 00A7 00590 MOVWF STEPTEMP 00591 0185 0818 00592 MOVF COLUMN_R,W ;get current column 0186 3A00 00593 XORLW 0 0187 1903 00594 BTFSC STATUS,Z 0188 2995 00595 GOTO SCOL0 ;column=0 - don't shift 0189 3A01 00596 XORLW 0X01 018A 1903 00597 BTFSC STATUS,Z 018B 2993 00598 GOTO SCOL1 ;column=1 - shift random 2 times 018C 3A03 00599 XORLW 0X03 018D 1903 00600 BTFSC STATUS,Z LOC OBJECT CODE LINE SOURCE TEXT VALUE 018E 2991 00601 GOTO SCOL2 ;column=2 - shift random 4 times 00602 018F 0CA7 00603 SCOL3: RRF STEPTEMP,F ;column=3 - shift random 6 times 0190 0CA7 00604 RRF STEPTEMP,F 0191 0CA7 00605 SCOL2: RRF STEPTEMP,F 0192 0CA7 00606 RRF STEPTEMP,F 0193 0CA7 00607 SCOL1: RRF STEPTEMP,F 0194 0CA7 00608 RRF STEPTEMP,F 0195 0827 00609 SCOL0: MOVF STEPTEMP,W ;get current memory byte of sequence table 0196 3903 00610 ANDLW 0X03 ;mask bits 2-7 0197 0094 00611 MOVWF RANDOM 00612 0198 21AB 00613 CALL SHOWSTEP ;display LED according to stored value 00614 0199 2289 00615 CALL DELAY150 ;wait a little after player 019A 2289 00616 CALL DELAY150 ;has pressed a key 019B 2289 00617 CALL DELAY150 00618 019C 0A98 00619 INCF COLUMN_R,F ;update column 019D 1918 00620 BTFSC COLUMN_R,2 ;overflow? 019E 29A8 00621 GOTO COLOV1 ;yes 019F 0818 00622 SS2: MOVF COLUMN_R,W ;no 01A0 0616 00623 XORWF COLUMN_W,W ;column pointers the same? 01A1 1D03 00624 BTFSS STATUS,Z 01A2 2981 00625 GOTO SS1 ;no - at least another step to show 01A3 0819 00626 MOVF LINE_R,W ;yes 01A4 0617 00627 XORWF LINE_W,W ;reached the end of sequence? 01A5 1903 00628 BTFSC STATUS,Z ;no - jump next instruction 01A6 0008 00629 RETURN ;yes - sequence complete! 01A7 2981 00630 GOTO SS1 ;at least another step to show 00631 01A8 0198 00632 COLOV1: CLRF COLUMN_R 01A9 0A99 00633 INCF LINE_R,F 01AA 299F 00634 GOTO SS2 00635 00636 ;**************************************************************** 00637 ;Name : ShowStep 00638 ;Description : turns on one of the LEDs and beeps according to 00639 ; : the random number & level of difficulty 00640 ;Inputs : random - random number 00641 ;Outputs : none 00642 ;**************************************************************** 01AB 00643 SHOWSTEP: 01AB 21B6 00644 CALL SHOWLED ;show random number on led 01AC 0091 00645 MOVWF NOTE_TONE ;ShowLed returns with beep value in W 00646 01AD 3020 00647 MOVLW LENGTH_SEMIBREVE 01AE 0092 00648 MOVWF NOTE_LENGTH 00649 01AF 3010 00650 MOVLW 0X10 ;easy level 01B0 1E05 00651 BTFSS PORTA,LEVEL ;get level of difficulty 01B1 3001 00652 MOVLW 0X01 ;hard level 00653 LOC OBJECT CODE LINE SOURCE TEXT VALUE 01B2 0093 00654 MOVWF NOTE_TEMPO ;speed of beep 01B3 2130 00655 CALL SOUNDPLAY ;play button beep 01B4 0186 00656 CLRF PORTB ;turn all leds off 00657 01B5 0008 00658 RETURN 00659 00660 ;**************************************************************** 00661 ;Name : ShowLed 00662 ;Description : turns on one of the LEDs according to the random 00663 ; : number & prepares W with tone value 00664 ;Inputs : random - random number 00665 ;Outputs : W - value of tone frequency 00666 ;**************************************************************** 01B6 00667 SHOWLED: 01B6 0814 00668 MOVF RANDOM,W ;get random number 01B7 3A00 00669 XORLW 0 01B8 1903 00670 BTFSC STATUS,Z 01B9 29C1 00671 GOTO SHOWRED ;random=0 01BA 3A01 00672 XORLW 0X01 01BB 1903 00673 BTFSC STATUS,Z 01BC 29C3 00674 GOTO SHOWGREEN ;random=1 01BD 3A03 00675 XORLW 0X03 01BE 1903 00676 BTFSC STATUS,Z 01BF 29C5 00677 GOTO SHOWYELLOW ;random=2 01C0 29C7 00678 GOTO SHOWBLUE ;random=3 00679 01C1 00680 SHOWRED: 01C1 1606 00681 BSF PORTB,LED_RED ;turn on red led 01C2 345F 00682 RETLW KEY_RED_SOUND ;tone frequency 00683 01C3 00684 SHOWGREEN: 01C3 1686 00685 BSF PORTB,LED_GREEN ;turn on green led 01C4 344C 00686 RETLW KEY_GREEN_SOUND ;tone frequency 00687 01C5 00688 SHOWYELLOW: 01C5 1706 00689 BSF PORTB,LED_YELLOW ;turn on yellow led 01C6 3440 00690 RETLW KEY_YELLOW_SOUND ;tone frequency 00691 01C7 00692 SHOWBLUE: 01C7 1786 00693 BSF PORTB,LED_BLUE ;turn on blue led 01C8 3433 00694 RETLW KEY_BLUE_SOUND ;tone frequency 00695 00696 ;**************************************************************** 00697 ;Name : GetUserSequence 00698 ;Description : checks the player's sequence to that required 00699 ;Inputs : none 00700 ;Outputs : W=0 : player has made a mistake 00701 ; : W=1 : player has successfully repeated sequence 00702 ;**************************************************************** 01C9 00703 GETUSERSEQUENCE: 01C9 1105 00704 BCF PORTA,LED_REMEMBER ;tell player to repeat sequence 01CA 1585 00705 BSF PORTA,LED_REPEAT 00706 LOC OBJECT CODE LINE SOURCE TEXT VALUE 01CB 0198 00707 CLRF COLUMN_R ;begin at start of step sequence 01CC 301A 00708 MOVLW LINE_OFFSET 01CD 0099 00709 MOVWF LINE_R 00710 01CE 0819 00711 US1: MOVF LINE_R,W 01CF 0084 00712 MOVWF FSR 01D0 0800 00713 MOVF INDF,W 01D1 00A7 00714 MOVWF STEPTEMP 00715 01D2 0818 00716 MOVF COLUMN_R,W ;get current column 01D3 3A00 00717 XORLW 0 01D4 1903 00718 BTFSC STATUS,Z 01D5 29E2 00719 GOTO UCOL0 ;column=0 - don't shift 01D6 3A01 00720 XORLW 0X01 01D7 1903 00721 BTFSC STATUS,Z 01D8 29E0 00722 GOTO UCOL1 ;column=1 - shift random 2 times 01D9 3A03 00723 XORLW 0X03 01DA 1903 00724 BTFSC STATUS,Z 01DB 29DE 00725 GOTO UCOL2 ;column=2 - shift random 4 times 01DC 0CA7 00726 UCOL3: RRF STEPTEMP,F ;column=3 - shift random 6 times 01DD 0CA7 00727 RRF STEPTEMP,F 01DE 0CA7 00728 UCOL2: RRF STEPTEMP,F 01DF 0CA7 00729 RRF STEPTEMP,F 01E0 0CA7 00730 UCOL1: RRF STEPTEMP,F 01E1 0CA7 00731 RRF STEPTEMP,F 01E2 0827 00732 UCOL0: MOVF STEPTEMP,W ;get current memory byte of sequence table 01E3 3903 00733 ANDLW 0X03 ;mask bits 2-7 01E4 0094 00734 MOVWF RANDOM 00735 01E5 21FC 00736 CALL KEYPAD ;get player's input - returned in W 00737 ;W=0 - no key pressed(timeout) 00738 ;W=1 - player has pressed a key 01E6 3A00 00739 XORLW 0 ;did player press a key? 01E7 1903 00740 BTFSC STATUS,Z ;yes - jump next instruction 01E8 3400 00741 RETLW 0 ;no - exit function 00742 01E9 0815 00743 MOVF KEY,W ;compare pressed key with step 01EA 0614 00744 XORWF RANDOM,W ;is it the same? 01EB 1D03 00745 BTFSS STATUS,Z ;yes - jump next instruction 01EC 3400 00746 RETLW 0 ;no - incorrect, exit function 00747 01ED 0A98 00748 INCF COLUMN_R,F ;update column 01EE 1918 00749 BTFSC COLUMN_R,2 ;overflow? 01EF 29F9 00750 GOTO COLOV2 ;yes 01F0 0818 00751 US2: MOVF COLUMN_R,W ;no 01F1 0616 00752 XORWF COLUMN_W,W ;column pointers the same? 01F2 1D03 00753 BTFSS STATUS,Z 01F3 29CE 00754 GOTO US1 ;no - at least another step to show 01F4 0819 00755 MOVF LINE_R,W ;yes 01F5 0617 00756 XORWF LINE_W,W ;reached the end of sequence? 01F6 1903 00757 BTFSC STATUS,Z ;no - jump next instruction 01F7 3401 00758 RETLW 1 ;yes - sequence complete! 01F8 29CE 00759 GOTO US1 ;at least another step to show LOC OBJECT CODE LINE SOURCE TEXT VALUE 00760 01F9 0198 00761 COLOV2: CLRF COLUMN_R 01FA 0A99 00762 INCF LINE_R,F 01FB 29F0 00763 GOTO US2 00764 00765 ;**************************************************************** 00766 ;Name : Keypad 00767 ;Description : scans the keys for a press and lights up the 00768 ; : corresponding LED and beeps. 00769 ;Inputs : none 00770 ;Outputs : W=0 : key timeout - no key has been pressed 00771 ; : W=1 : key has been pressed 00772 ; : key : 0=red,1=green,2=yellow,3=blue 00773 ;**************************************************************** 01FC 00774 KEYPAD: 01FC 0195 00775 CLRF KEY ;initialise key 01FD 3007 00776 MOVLW 0X07 ;assume easy level - 5 sec timeout 01FE 1E05 00777 BTFSS PORTA,LEVEL ;get level of difficulty 01FF 3003 00778 MOVLW 0X03 ;hard level - 2 sec timeout 0200 008E 00779 MOVWF TIMERC 0201 30FF 00780 KP2: MOVLW 0XFF 0202 008D 00781 MOVWF TIMERB 0203 30FF 00782 KP1: MOVLW 0XFF 0204 008C 00783 MOVWF TIMERA 00784 0205 1806 00785 KWAIT: BTFSC PORTB,KEY_RED 0206 2A14 00786 GOTO KEYRED 0207 1886 00787 BTFSC PORTB,KEY_GREEN 0208 2A18 00788 GOTO KEYGREEN 0209 1906 00789 BTFSC PORTB,KEY_YELLOW 020A 2A1C 00790 GOTO KEYYELLOW 020B 1986 00791 BTFSC PORTB,KEY_BLUE 020C 2A20 00792 GOTO KEYBLUE 00793 020D 0B8C 00794 DECFSZ TIMERA,F 020E 2A05 00795 GOTO KWAIT 020F 0B8D 00796 DECFSZ TIMERB,F 0210 2A03 00797 GOTO KP1 0211 0B8E 00798 DECFSZ TIMERC,F 0212 2A01 00799 GOTO KP2 00800 0213 3400 00801 RETLW 0 ;player hasn't pressed key! 00802 0214 00803 KEYRED: 0214 1606 00804 BSF PORTB,LED_RED ;turn on red led 0215 0195 00805 CLRF KEY ;key=0 0216 305F 00806 MOVLW KEY_RED_SOUND ;tone frequency 0217 2A24 00807 GOTO BEEP1 00808 0218 00809 KEYGREEN: 0218 1686 00810 BSF PORTB,LED_GREEN ;turn on green led 0219 1415 00811 BSF KEY,0 ;key=1 021A 304C 00812 MOVLW KEY_GREEN_SOUND ;tone frequency LOC OBJECT CODE LINE SOURCE TEXT VALUE 021B 2A24 00813 GOTO BEEP1 00814 021C 00815 KEYYELLOW: 021C 1706 00816 BSF PORTB,LED_YELLOW ;turn on yellow led 021D 1495 00817 BSF KEY,1 ;key=2 021E 3040 00818 MOVLW KEY_YELLOW_SOUND ;tone frequency 021F 2A24 00819 GOTO BEEP1 00820 0220 00821 KEYBLUE: 0220 1786 00822 BSF PORTB,LED_BLUE ;turn on blue led 0221 1415 00823 BSF KEY,0 ;key=3 0222 1495 00824 BSF KEY,1 0223 3033 00825 MOVLW KEY_BLUE_SOUND ;tone frequency 00826 0224 0091 00827 BEEP1: MOVWF NOTE_TONE ;save tone 0225 3020 00828 MOVLW LENGTH_SEMIBREVE 0226 0092 00829 MOVWF NOTE_LENGTH 00830 0227 3003 00831 MOVLW 0X03 0228 0093 00832 MOVWF NOTE_TEMPO ;speed of beep 0229 2130 00833 BEEP2: CALL SOUNDPLAY ;play button beep 00834 022A 0806 00835 MOVF PORTB,W ;test for a key press 022B 390F 00836 ANDLW 0X0F ;mask keys 022C 3A00 00837 XORLW 0X00 ;are any keys being pressed? 022D 1D03 00838 BTFSS STATUS,Z ;no - skip next instruction 022E 2A29 00839 GOTO BEEP2 ;yes - keep beeping! 00840 022F 0186 00841 CLRF PORTB ;turn off all leds 00842 0230 3401 00843 RETLW 1 ;return to calling function 00844 00845 00846 ;**************************************************************** 00847 ;Name : SequenceBad 00848 ;Description : player has made a mistake - show player the 00849 ; : correct sequence. Test to see if a record has 00850 ; : been made. 00851 ;Inputs : none 00852 ;Outputs : none 00853 ;**************************************************************** 0231 00854 SEQUENCEBAD: 0231 3001 00855 MOVLW 0X01 0232 0093 00856 MOVWF NOTE_TEMPO 0233 214B 00857 CALL SOUNDRISINGROCKET 0234 3001 00858 MOVLW 0X01 0235 0093 00859 MOVWF NOTE_TEMPO 0236 214B 00860 CALL SOUNDRISINGROCKET 00861 0237 217E 00862 CALL SHOWSEQUENCE ;replay proper sequence again 00863 0238 3001 00864 MOVLW 0X01 0239 0093 00865 MOVWF NOTE_TEMPO LOC OBJECT CODE LINE SOURCE TEXT VALUE 023A 214B 00866 CALL SOUNDRISINGROCKET 023B 3001 00867 MOVLW 0X01 023C 0093 00868 MOVWF NOTE_TEMPO 023D 214B 00869 CALL SOUNDRISINGROCKET 00870 023E 2289 00871 CALL DELAY150 023F 2289 00872 CALL DELAY150 0240 2289 00873 CALL DELAY150 00874 00875 ;get current record from EEPROM 0241 3000 00876 MOVLW RECORD_STEPS ;get current record from EEPROM 0242 0089 00877 MOVWF EEADR 0243 1683 00878 BSF STATUS,RP0 ;select bank1 0244 1408 00879 BSF EECON1,RD ;read eeprom 0245 1283 00880 BCF STATUS,RP0 ;select bank0 0246 0808 00881 MOVF EEDATA,W ;W=record number of steps 0247 0228 00882 SUBWF STEPSGOOD,W ;a record sequence (or same)? 0248 1803 00883 BTFSC STATUS,C ;no - jump next instruction 0249 2A5F 00884 GOTO SEQUENCERECORD ;yes - tell player about it! 00885 024A 0190 00886 CLRF NOTE_SELECT ;beginning of song 024B 3010 00887 MOVLW 0X10 ;slow 024C 0093 00888 MOVWF NOTE_TEMPO ;speed of song 024D 2289 00889 SB1: CALL DELAY150 024E 0810 00890 MOVF NOTE_SELECT,W ;get next note 024F 20B9 00891 CALL SONGDEATHMARCH ;returned in W 0250 0091 00892 MOVWF NOTE_TONE 0251 0A90 00893 INCF NOTE_SELECT,F 0252 0810 00894 MOVF NOTE_SELECT,W ;get length of note 0253 20B9 00895 CALL SONGDEATHMARCH 0254 0092 00896 MOVWF NOTE_LENGTH 0255 2130 00897 CALL SOUNDPLAY ;play music 00898 0256 0A90 00899 INCF NOTE_SELECT,F ;select next note 0257 0810 00900 MOVF NOTE_SELECT,W 0258 3A16 00901 XORLW SONG_DEATHMARCH_LEN ;end of song? 0259 1D03 00902 BTFSS STATUS,Z ;yes - skip next instruction 025A 2A4D 00903 GOTO SB1 ;no - keep playing 00904 025B 2289 00905 CALL DELAY150 025C 2289 00906 CALL DELAY150 025D 2289 00907 CALL DELAY150 00908 025E 28D9 00909 GOTO NEWGAME ;start new game 00910 00911 ;**************************************************************** 00912 ;Name : SequenceRecord 00913 ;Description : player has beaten the record, save new step 00914 ; : record in EEPROM and play record tune. 00915 ;Inputs : none 00916 ;Outputs : none 00917 ;**************************************************************** 025F 00918 SEQUENCERECORD: LOC OBJECT CODE LINE SOURCE TEXT VALUE 025F 3000 00919 MOVLW RECORD_STEPS ;save new step record in EEPROM 0260 0089 00920 MOVWF EEADR 0261 0828 00921 MOVF STEPSGOOD,W 0262 0088 00922 MOVWF EEDATA 00923 0263 1683 00924 BSF STATUS,RP0 ;select bank1 0264 1508 00925 BSF EECON1,WREN ;enable write 0265 3055 00926 MOVLW 0X55 ;unlock codes 0266 0089 00927 MOVWF EECON2 0267 30AA 00928 MOVLW 0XAA 0268 0089 00929 MOVWF EECON2 0269 1488 00930 BSF EECON1,WR ;write begins 026A 1108 00931 BCF EECON1,WREN ;disable other writes 026B 1888 00932 SRE1: BTFSC EECON1,WR ;wait to write complete 026C 2A6B 00933 GOTO SRE1 026D 1283 00934 BCF STATUS,RP0 ;select bank0 00935 026E 0190 00936 CLRF NOTE_SELECT ;beginning of song 026F 0AA7 00937 SR1: INCF STEPTEMP,F 0270 0827 00938 MOVF STEPTEMP,W 0271 3903 00939 ANDLW 0X03 0272 0094 00940 MOVWF RANDOM 0273 2289 00941 CALL DELAY150 0274 21B6 00942 CALL SHOWLED ;show it on leds 0275 3005 00943 MOVLW 0X5 ;fast 0276 0093 00944 MOVWF NOTE_TEMPO ;speed of song 0277 0810 00945 MOVF NOTE_SELECT,W ;get next note 0278 204C 00946 CALL SONGOSUSANA ;returned in W 0279 0091 00947 MOVWF NOTE_TONE 027A 0A90 00948 INCF NOTE_SELECT,F 027B 0810 00949 MOVF NOTE_SELECT,W ;get length of note 027C 204C 00950 CALL SONGOSUSANA 027D 0092 00951 MOVWF NOTE_LENGTH 027E 2130 00952 CALL SOUNDPLAY ;play music 00953 027F 0186 00954 CLRF PORTB ;turn all leds off 00955 0280 0A90 00956 INCF NOTE_SELECT,F ;select next note 0281 0810 00957 MOVF NOTE_SELECT,W 0282 3A6C 00958 XORLW SONG_OSUSANA_LEN ;end of song? 0283 1D03 00959 BTFSS STATUS,Z ;yes - skip next instruction 0284 2A6F 00960 GOTO SR1 ;no - keep playing 00961 0285 2289 00962 CALL DELAY150 0286 2289 00963 CALL DELAY150 0287 2289 00964 CALL DELAY150 00965 0288 28D9 00966 GOTO NEWGAME ;start new game 00967 00968 ;**************************************************************** 00969 ;Name : Delay 00970 ;Description : causes a delay of 150msec with 4MHz crystal! 00971 ;Inputs : none LOC OBJECT CODE LINE SOURCE TEXT VALUE 00972 ;Outputs : none 00973 ;**************************************************************** 0289 00974 DELAY150: 0289 30C3 00975 MOVLW 0XC3 ;number of wait states 028A 008D 00976 MOVWF TIMERB 028B 30FF 00977 L4: MOVLW 0XFF ;number of wait states 028C 008C 00978 MOVWF TIMERA 028D 0B8C 00979 L5: DECFSZ TIMERA,F 028E 2A8D 00980 GOTO L5 028F 0B8D 00981 DECFSZ TIMERB,F 0290 2A8B 00982 GOTO L4 00983 0291 0008 00984 RETURN 00985 00986 END SYMBOL TABLE LABEL VALUE BEEP1 00000224 BEEP2 00000229 BUZZER 00000001 C 00000000 CLEARRECORD 000000F9 COLOV1 000001A8 COLOV2 000001F9 COLUMN_R 00000018 COLUMN_W 00000016 CREC 00000109 DC 00000001 DELAY150 00000289 EEADR 00000009 EECON1 00000088 EECON2 00000089 EEDATA 00000008 EEIE 00000006 EEIF 00000004 F 00000001 FSR 00000004 GCOL0 00000175 GCOL1 00000173 GCOL2 00000171 GCOL3 0000016F GETRANDOM 0000015B GETSTEP 0000015F GETUSERSEQUENCE 000001C9 GIE 00000007 INDF 00000000 INITIALISATION 000000D0 INTCON 0000000B INTE 00000004 INTEDG 00000006 INTF 00000001 INTR1 00000111 INTRODUCTION 00000110 IRP 00000007 KEY 00000015 KEYBLUE 00000220 KEYGREEN 00000218 KEYPAD 000001FC KEYRED 00000214 KEYYELLOW 0000021C KEY_BLUE 00000003 KEY_BLUE_SOUND 00000033 KEY_GREEN 00000001 KEY_GREEN_SOUND 0000004C KEY_RED 00000000 KEY_RED_SOUND 0000005F KEY_YELLOW 00000002 KEY_YELLOW_SOUND 00000040 KP1 00000203 KP2 00000201 SYMBOL TABLE LABEL VALUE KWAIT 00000205 L4 0000028B L5 0000028D LED_BLUE 00000007 LED_GREEN 00000005 LED_RED 00000004 LED_REMEMBER 00000002 LED_REPEAT 00000003 LED_YELLOW 00000006 LENGTH_CROTCHET 00000008 LENGTH_DEMISEMIQUAVER 00000001 LENGTH_MINIM 00000010 LENGTH_QUAVER 00000004 LENGTH_SEMIBREVE 00000020 LENGTH_SEMIQUAVER 00000002 LEVEL 00000004 LINE_OFFSET 0000001A LINE_R 00000019 LINE_W 00000017 MAINLOOP 000000E6 NEWGAME 000000D9 NOTE_A0 000000E3 NOTE_A1 00000072 NOTE_A2 00000039 NOTE_A3 0000001C NOTE_B0 000000CA NOTE_B1 00000065 NOTE_B2 00000033 NOTE_B3 00000019 NOTE_C1 000000BF NOTE_C2 0000005F NOTE_C3 00000030 NOTE_D1 000000AA NOTE_D2 00000055 NOTE_D3 0000002B NOTE_E1 00000098 NOTE_E2 0000004C NOTE_E3 00000026 NOTE_F1 0000008F NOTE_F2 00000048 NOTE_F3 00000024 NOTE_G0 000000FF NOTE_G1 00000080 NOTE_G2 00000040 NOTE_G3 00000020 NOTE_LENGTH 00000012 NOTE_SELECT 00000010 NOTE_TEMPO 00000013 NOTE_TONE 00000011 NOT_PD 00000003 NOT_RBPU 00000007 NOT_TO 00000004 OPTION_REG 00000081 SYMBOL TABLE LABEL VALUE PCL 00000002 PCLATH 0000000A PORTA 00000005 PORTA_CONFIG1 00000011 PORTB 00000006 PORTB_CONFIG1 0000000F PS0 00000000 PS1 00000001 PS2 00000002 PSA 00000003 RAM_START 0000000C RANDOM 00000014 RANDOM_PULSE 00000000 RBIE 00000003 RBIF 00000000 RD 00000000 RECORD_STEPS 00000000 RESET 00000000 RP0 00000005 RP1 00000006 S1 000000DD SB1 0000024D SCOL0 00000195 SCOL1 00000193 SCOL2 00000191 SCOL3 0000018F SD1 00000141 SEQUENCEBAD 00000231 SEQUENCERECORD 0000025F SHOWBLUE 000001C7 SHOWGREEN 000001C3 SHOWLED 000001B6 SHOWRED 000001C1 SHOWSEQUENCE 0000017E SHOWSTEP 000001AB SHOWYELLOW 000001C5 SONGDEATHMARCH 000000B9 SONGHEYJUDE 00000007 SONGOSUSANA 0000004C SONG_DEATHMARCH_LEN 00000016 SONG_HEY_JUDE_LEN 00000044 SONG_OSUSANA_LEN 0000006C SOUNDDELAY 00000140 SOUNDPLAY 00000130 SOUNDRISINGROCKET 0000014B SP1 00000131 SP2 00000137 SR1 0000026F SRE1 0000026B SRR1 0000014D SS1 00000181 SS2 0000019F START 00000006 SYMBOL TABLE LABEL VALUE STATUS 00000003 STEPS0104 0000001A STEPS0508 0000001B STEPS0912 0000001C STEPS1316 0000001D STEPS1720 0000001E STEPS2124 0000001F STEPS2528 00000020 STEPS2932 00000021 STEPS3336 00000022 STEPS3740 00000023 STEPS4144 00000024 STEPS4548 00000025 STEPS4952 00000026 STEPSGOOD 00000028 STEPTEMP 00000027 T0CS 00000005 T0IE 00000005 T0IF 00000002 T0SE 00000004 TIMERA 0000000C TIMERB 0000000D TIMERC 0000000E TIMERD 0000000F TMR0 00000001 TRISA 00000085 TRISB 00000086 UCOL0 000001E2 UCOL1 000001E0 UCOL2 000001DE UCOL3 000001DC US1 000001CE US2 000001F0 W 00000000 WR 00000001 WREN 00000002 WRERR 00000003 Z 00000002 _CP_OFF 00003FFF _CP_ON 0000000F _HS_OSC 00003FFE _LP_OSC 00003FFC _PWRTE_OFF 00003FFF _PWRTE_ON 00003FF7 _RC_OSC 00003FFF _WDT_OFF 00003FFB _WDT_ON 00003FFF _XT_OSC 00003FFD __16F84A 00000001 MEMORY USAGE MAP ('X' = Used, '-' = Unused) 0000 : X-----XXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0040 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0080 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 00C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0100 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0140 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0180 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 01C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0200 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0240 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0280 : XXXXXXXXXXXXXXXX XX-------------- ---------------- ---------------- 2000 : -------X-------- ---------------- ---------------- ---------------- All other memory blocks unused. Program Memory Words Used: 653 Program Memory Words Free: 371 Errors : 0 Warnings : 1 reported, 0 suppressed Messages : 0 reported, 16 suppressed