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