Program for PIC16F84A
The program for Simon, using the numerical-value for each file (no equates):
LIST P=16F84A, F=INHX8M include "P16F84A.inc" ORG 0x0000 GOTO start ORG 0x0006 start GOTO Initialisation SongHeyJude ADDWF PCL,f RETLW 0x80 RETLW 0x08 RETLW 0x98 RETLW 0x10 RETLW 0x98 RETLW 0x04 RETLW 0x80 RETLW 0x04 RETLW 0x72 RETLW 0x04 RETLW 0xAA RETLW 0x10 RETLW 0xAA RETLW 0x04 RETLW 0x98 RETLW 0x04 RETLW 0x8F RETLW 0x08 RETLW 0x5F RETLW 0x10 RETLW 0x5F RETLW 0x04 RETLW 0x65 RETLW 0x04 RETLW 0x80 RETLW 0x04 RETLW 0x72 RETLW 0x04 RETLW 0x80 RETLW 0x10 RETLW 0x80 RETLW 0x04 RETLW 0x72 RETLW 0x04 RETLW 0x72 RETLW 0x08 RETLW 0x72 RETLW 0x04 RETLW 0x55 RETLW 0x02 RETLW 0x5F RETLW 0x08 RETLW 0x65 RETLW 0x04 RETLW 0x5F RETLW 0x04 RETLW 0x72 RETLW 0x08 RETLW 0x80 RETLW 0x10 RETLW 0xBF RETLW 0x04 RETLW 0xAA RETLW 0x04 RETLW 0x98 RETLW 0x04 RETLW 0x72 RETLW 0x10 RETLW 0x80 RETLW 0x04 RETLW 0x8F RETLW 0x04 RETLW 0x98 RETLW 0x04 RETLW 0xBF RETLW 0x04 RETLW 0xBF RETLW 0x10 SongoSusana ADDWF PCL,f RETLW 0x5F RETLW 0x10 RETLW 0x55 RETLW 0x04 RETLW 0x4C RETLW 0x08 RETLW 0x40 RETLW 0x08 RETLW 0x40 RETLW 0x08 RETLW 0x39 RETLW 0x08 RETLW 0x40 RETLW 0x08 RETLW 0x4C RETLW 0x08 RETLW 0x5F RETLW 0x10 RETLW 0x55 RETLW 0x04 RETLW 0x4C RETLW 0x08 RETLW 0x4C RETLW 0x08 RETLW 0x55 RETLW 0x08 RETLW 0x5F RETLW 0x08 RETLW 0x55 RETLW 0x10 RETLW 0x5F RETLW 0x10 RETLW 0x55 RETLW 0x04 RETLW 0x4C RETLW 0x08 RETLW 0x40 RETLW 0x08 RETLW 0x40 RETLW 0x08 RETLW 0x39 RETLW 0x08 RETLW 0x40 RETLW 0x08 RETLW 0x4C RETLW 0x08 RETLW 0x5F RETLW 0x10 RETLW 0x55 RETLW 0x10 RETLW 0x4C RETLW 0x08 RETLW 0x4C RETLW 0x08 RETLW 0x55 RETLW 0x08 RETLW 0x5F RETLW 0x10 RETLW 0x48 RETLW 0x08 RETLW 0x48 RETLW 0x08 RETLW 0x39 RETLW 0x08 RETLW 0x39 RETLW 0x08 RETLW 0x39 RETLW 0x08 RETLW 0x40 RETLW 0x08 RETLW 0x40 RETLW 0x08 RETLW 0x4C RETLW 0x08 RETLW 0x5F RETLW 0x08 RETLW 0x55 RETLW 0x10 RETLW 0x5F RETLW 0x10 RETLW 0x55 RETLW 0x04 RETLW 0x4C RETLW 0x08 RETLW 0x40 RETLW 0x08 RETLW 0x40 RETLW 0x08 RETLW 0x39 RETLW 0x08 RETLW 0x40 RETLW 0x08 RETLW 0x4C RETLW 0x08 RETLW 0x5F RETLW 0x10 RETLW 0x55 RETLW 0x04 RETLW 0x4C RETLW 0x08 RETLW 0x4C RETLW 0x08 RETLW 0x55 RETLW 0x08 RETLW 0x55 RETLW 0x08 RETLW 0x5F RETLW 0x20 SongDeathMarch: ADDWF PCL,f RETLW 0xBF RETLW 0x10 RETLW 0xBF RETLW 0x04 RETLW 0xBF RETLW 0x08 RETLW 0xBF RETLW 0x04 RETLW 0xBF RETLW 0x08 RETLW 0x98 RETLW 0x04 RETLW 0xAA RETLW 0x08 RETLW 0xBF RETLW 0x04 RETLW 0xBF RETLW 0x08 RETLW 0xCA RETLW 0x08 RETLW 0xBF RETLW 0x10 Initialisation: BCF STATUS,RP1 BSF STATUS,RP0 MOVLW 0x11 MOVWF TRISA MOVLW 0x0F MOVWF TRISB MOVLW 0x88 MOVWF OPTION_REG BCF STATUS,RP0 NewGame CLRF PORTA CLRF PORTB MOVLW 0x0C MOVWF FSR S1 CLRF INDF INCF FSR,f BTFSS FSR,06 GOTO S1 MOVF 0x17,W ADDLW 0x1A MOVWF 0x17 CALL ClearRecord CALL Introduction Mainloop CALL GetStep CALL ShowSequence CALL GetUserSequence XORLW 0x01 BTFSS STATUS,Z GOTO SequenceBad INCF 0x28,f CALL Delay150 CALL Delay150 CALL Delay150 MOVF 0x17,W XORLW 0x34 BTFSS STATUS,Z GOTO Mainloop MOVF 0x16,W XORLW 0x03 BTFSS STATUS,Z GOTO Mainloop GOTO SequenceRecord ClearRecord MOVF PORTB,W ANDLW 0x0F XORLW 0x00 BTFSC STATUS,Z RETURN MOVLW 0x00 MOVWF EEADR CLRF EEDATA BSF STATUS,RP0 BSF EECON1,02 MOVLW 0x55 MOVWF EECON2 MOVLW 0xAA MOVWF EECON2 BSF EECON1,01 BCF EECON1,02 Crec BTFSC EECON1,01 GOTO Crec BCF STATUS,RP0 MOVLW 0x02 MOVWF 0x13 CALL SoundRisingRocket RETURN Introduction: CLRF 0x10 Intr1 INCF 0x27,f MOVF 0x27,W ANDLW 0x03 MOVWF 0x14 CALL Delay150 CALL ShowLed MOVLW 0x10 MOVWF 0x13 MOVF 0x10,W CALL SongHeyJude MOVWF 0x11 INCF 0x10,f MOVF 0x10,W CALL SongHeyJude MOVWF 0x12 CALL SoundPlay CLRF PORTB INCF 0x10,f MOVF 0x10,W XORLW 0x44 BTFSC STATUS,Z CLRF 0x10 MOVF PORTB,W ANDLW 0x0F XORLW 0x00 BTFSC STATUS,Z GOTO Intr1 MOVLW 0x02 MOVWF 0x13 CALL SoundRisingRocket RETURN SoundPlay CLRF 0x0E Sp1 MOVF 0x0E,W XORWF 0x12,W BTFSC STATUS,Z RETURN MOVF 0x13,W MOVWF 0x0D Sp2 MOVF 0x11,W BSF PORTA,01 CALL SoundDelay BCF PORTA,01 CALL SoundDelay DECFSZ 0x0D,f GOTO Sp2 INCF 0x0E,f GOTO Sp1 SoundDelay MOVWF 0x0C Sd1 NOP NOP NOP NOP NOP NOP NOP DECFSZ 0x0C,f GOTO Sd1 RETURN SoundRisingRocket: CLRF 0x11 COMF 0x11,f Srr1 MOVLW 0x01 MOVWF 0x12 CALL SoundPlay DECFSZ 0x11,f GOTO Srr1 CALL Delay150 CALL Delay150 CALL Delay150 CALL Delay150 CALL Delay150 CALL Delay150 CALL Delay150 CALL Delay150 RETURN GetRandom MOVF TMR0,W ANDLW 0x03 MOVWF 0x14 RETURN GetStep BCF PORTA,03 BSF PORTA,02 CALL GetRandom MOVF 0x17,W MOVWF FSR BCF STATUS,C MOVF 0x16,W XORLW 0x00 BTFSC STATUS,Z GOTO GCol0 XORLW 0x01 BTFSC STATUS,Z GOTO GCol1 XORLW 0x03 BTFSC STATUS,Z GOTO GCol2 RLF 0x14,f RLF 0x14,f GCol2 RLF 0x14,f RLF 0x14,f GCol1 RLF 0x14,f RLF 0x14,f GCol0 MOVF INDF,W IORWF 0x14,W MOVWF INDF INCF 0x16,f BTFSS 0x16,02 RETURN CLRF 0x16 INCF 0x17,f RETURN ShowSequence: CLRF 0x18 MOVLW 0x1A MOVWF 0x19 Ss1 MOVF 0x19,W MOVWF FSR MOVF INDF,W MOVWF 0x27 MOVF 0x18,W XORLW 0x00 BTFSC STATUS,Z GOTO SCol0 XORLW 0x01 BTFSC STATUS,Z GOTO SCol1 XORLW 0x03 BTFSC STATUS,Z GOTO SCol2 RRF 0x27,f RRF 0x27,f SCol2 RRF 0x27,f RRF 0x27,f SCol1 RRF 0x27,f RRF 0x27,f SCol0 MOVF 0x27,W ANDLW 0x03 MOVWF 0x14 CALL ShowStep CALL Delay150 CALL Delay150 CALL Delay150 INCF 0x18,f BTFSC 0x18,02 GOTO Colov1 Ss2 MOVF 0x18,W XORWF 0x16,W BTFSS STATUS,Z GOTO Ss1 MOVF 0x19,W XORWF 0x17,W BTFSC STATUS,Z RETURN GOTO Ss1 Colov1 CLRF 0x18 INCF 0x19,f GOTO Ss2 ShowStep CALL ShowLed MOVWF 0x11 MOVLW 0x20 MOVWF 0x12 MOVLW 0x10 BTFSS PORTA,04 MOVLW 0x01 MOVWF 0x13 CALL SoundPlay CLRF PORTB RETURN ShowLed MOVF 0x14,W XORLW 0x00 BTFSC STATUS,Z GOTO ShowRed XORLW 0x01 BTFSC STATUS,Z GOTO ShowGreen XORLW 0x03 BTFSC STATUS,Z GOTO ShowYellow GOTO ShowOrange ShowRed BSF PORTB,04 RETLW 0x5F ShowGreen BSF PORTB,05 RETLW 0x4C ShowYellow BSF PORTB,06 RETLW 0x40 ShowOrange BSF PORTB,07 RETLW 0x33 GetUserSequence: BCF PORTA,02 BSF PORTA,03 CLRF 0x18 MOVLW 0x1A MOVWF 0x19 Us1 MOVF 0x19,W MOVWF FSR MOVF INDF,W MOVWF 0x27 MOVF 0x18,W XORLW 0x00 BTFSC STATUS,Z GOTO UCol0 XORLW 0x01 BTFSC STATUS,Z GOTO UCol1 XORLW 0x03 BTFSC STATUS,Z GOTO UCol2 RRF 0x27,f RRF 0x27,f UCol2 RRF 0x27,f RRF 0x27,f UCol1 RRF 0x27,f RRF 0x27,f UCol0 MOVF 0x27,W ANDLW 0x03 MOVWF 0x14 CALL Keypad XORLW 0x00 BTFSC STATUS,Z RETLW 0x00 MOVF 0x15,W XORWF 0x14,W BTFSS STATUS,Z RETLW 0x00 INCF 0x18,f BTFSC 0x18,02 GOTO Colov2 Us2 MOVF 0x18,W XORWF 0x16,W BTFSS STATUS,Z GOTO Us1 MOVF 0x19,W XORWF 0x17,W BTFSC STATUS,Z RETLW 0x01 GOTO Us1 Colov2 CLRF 0x18 INCF 0x19,f GOTO Us2 Keypad CLRF 0x15 MOVLW 0x07 BTFSS PORTA,04 MOVLW 0x03 MOVWF 0x0E Kp2 MOVLW 0xFF MOVWF 0x0D Kp1 MOVLW 0xFF MOVWF 0x0C Kwait BTFSC PORTB,00 GOTO KeyRed BTFSC PORTB,01 GOTO KeyGreen BTFSC PORTB,02 GOTO KeyYellow BTFSC PORTB,03 GOTO KeyOrange DECFSZ 0x0C,f GOTO Kwait DECFSZ 0x0D,f GOTO Kp1 DECFSZ 0x0E,f GOTO Kp2 RETLW 0x00 KeyRed BSF PORTB,04 CLRF 0x15 MOVLW 0x5F GOTO Beep1 KeyGreen BSF PORTB,05 BSF 0x15,00 MOVLW 0x4C GOTO Beep1 KeyYellow BSF PORTB,06 BSF 0x15,01 MOVLW 0x40 GOTO Beep1 KeyOrange BSF PORTB,07 BSF 0x15,00 BSF 0x15,01 MOVLW 0x33 Beep1 MOVWF 0x11 MOVLW 0x20 MOVWF 0x12 MOVLW 0x03 MOVWF 0x13 Beep2 CALL SoundPlay MOVF PORTB,W ANDLW 0x0F XORLW 0x00 BTFSS STATUS,Z GOTO Beep2 CLRF PORTB RETLW 0x01 SequenceBad MOVLW 0x01 MOVWF 0x13 CALL SoundRisingRocket MOVLW 0x01 MOVWF 0x13 CALL SoundRisingRocket CALL ShowSequence MOVLW 0x01 MOVWF 0x13 CALL SoundRisingRocket MOVLW 0x01 MOVWF 0x13 CALL SoundRisingRocket CALL Delay150 CALL Delay150 CALL Delay150 MOVLW 0x00 MOVWF EEADR BSF STATUS,RP0 BSF EECON1,00 BCF STATUS,RP0 MOVF EEDATA,W SUBWF 0x28,W BTFSC STATUS,C GOTO SequenceRecord CLRF 0x10 MOVLW 0x10 MOVWF 0x13 Sb1 CALL Delay150 MOVF 0x10,W CALL SongDeathMarch MOVWF 0x11 INCF 0x10,f MOVF 0x10,W CALL SongDeathMarch MOVWF 0x12 CALL SoundPlay INCF 0x10,f MOVF 0x10,W XORLW 0x16 BTFSS STATUS,Z GOTO Sb1 CALL Delay150 CALL Delay150 CALL Delay150 GOTO NewGame SequenceRecord: MOVLW 0x00 MOVWF EEADR MOVF 0x28,W MOVWF EEDATA BSF STATUS,RP0 BSF EECON1,02 MOVLW 0x55 MOVWF EECON2 MOVLW 0xAA MOVWF EECON2 BSF EECON1,01 BCF EECON1,02 Sre1 BTFSC EECON1,01 GOTO Sre1 BCF STATUS,RP0 CLRF 0x10 Sr1 INCF 0x27,f MOVF 0x27,W ANDLW 0x03 MOVWF 0x14 CALL Delay150 CALL ShowLed MOVLW 0x05 MOVWF 0x13 MOVF 0x10,W CALL Song0Susana MOVWF 0x11 INCF 0x10,f MOVF 0x10,W CALL Song0Susana MOVWF 0x12 CALL SoundPlay CLRF PORTB INCF 0x10,f MOVF 0x10,W XORLW 0x6C BTFSS STATUS,Z GOTO Sr1 CALL Delay150 CALL Delay150 CALL Delay150 GOTO NewGame Delay150 MOVLW 0xC3 MOVWF 0x0D L4 MOVLW 0xFF MOVWF 0x0C L5 DECFSZ 0x0C,f GOTO L5 DECFSZ 0x0D,f GOTO L4 RETURN END
The equates for the musical notes for Simon:
;**************************************************************** ;* MEMORY GAME - simon * ;**************************************************************** ;Port A definitions PORTA_CONFIG1 equ 0x1D ;bit4: in,in,in,out,in :bit0 0 ;not used BUZZER equ 1 ;buzzer output 2 ;not used 3 ;not used 4 ;not used ;Port B definitions PORTB_CONFIG1 equ 0x0f ;bit7: out,out,out,out,in,in,in,in :bit0 KEY_RED equ 0 ;red key input - bit0 KEY_GREEN equ 1 ;green key input - bit1 KEY_YELLOW equ 2 ;yellow key input - bit2 KEY_ORANGE equ 3 ;orange key input - bit3 LED_RED equ 4 ;red led output - bit4 LED_GREEN equ 5 ;green led output - bit5 LED_YELLOW equ 6 ;yellow led output- bit6 LED_ORANGE equ 7 ;orange led output- bit7 RAM_START equ 0x0C ;start of global variable ram LINE_OFFSET equ 0x1A ;start of step memory in ram area RECORD_STEPS equ 0x00 ;eeprom address for step record ;Data for song notes ;Value= 10's of microseconds ;octave 1 NOTE_G0 equ D'255' ;196 Hz NOTE_A0 equ D'227' ;220 Hz NOTE_B0 equ D'202' ;247 Hz ;octave 2 NOTE_C1 equ D'191' ;262 Hz NOTE_D1 equ D'170' ;294 Hz NOTE_E1 equ D'152' ;330 Hz NOTE_F1 equ D'143' ;349 Hz NOTE_G1 equ D'128' ;392 Hz NOTE_A1 equ D'114' ;440 Hz NOTE_B1 equ D'101' ;494 Hz ;octave 3 NOTE_C2 equ D'95' ;524 Hz NOTE_D2 equ D'85' ;588 Hz NOTE_E2 equ D'76' ;660 Hz NOTE_F2 equ D'72' ;698 Hz NOTE_G2 equ D'64' ;784 Hz NOTE_A2 equ D'57' ;880 Hz NOTE_B2 equ D'51' ;988 Hz ;octave 4 NOTE_C3 equ D'48' ;1048 Hz NOTE_D3 equ D'43' ;1176 Hz NOTE_E3 equ D'38' ;1320 Hz NOTE_F3 equ D'36' ;1396 Hz NOTE_G3 equ D'32' ;1568 Hz NOTE_A3 equ D'28' ;1760 Hz NOTE_B3 equ D'25' ;1976 Hz ;length of notes ;"tempo"(nomalized) length is set in SoundPlay function by timerb LENGTH_SEMIBREVE equ 0x20 ;tempo LENGTH_MINIM equ 0x10 ;tempo/2 LENGTH_CROTCHET equ 0x08 ;tempo/4 LENGTH_QUAVER equ 0x04 ;tempo/8 LENGTH_SEMIQUAVER equ 0x02 ;tempo/16 LENGTH_DEMISEMIQUAVER equ 0x01 ;tempo/32 SONG_HEY_JUDE_LEN equ D'68' ;total No of notes + lengths SONG_OSUSANA_LEN equ D'108' SONG_DEATHMARCH_LEN equ D'22' KEY_RED_SOUND equ NOTE_C2 KEY_GREEN_SOUND equ NOTE_E2 KEY_YELLOW_SOUND equ NOTE_G2 KEY_ORANGE_SOUND equ NOTE_B2
The program for Simon, with comments:
;**************************************************************** ;* MEMORY GAME - SIMON * ;**************************************************************** list p=16f84,r=hex ;microcontroller & base include "p16F84A.inc" ;register memory mapping file include "simon.inc" ;Simon definitions __Config 3FF3h ;**************************************************************** ;global variable memory ;**************************************************************** timera equ 0x0c ;general purpose timer timerb equ 0x0d ;general purpose timer timerc equ 0x0e ;general purpose timer timerd equ 0x0f ;general purpose timer note_select equ 0x10 ;selection of note note_tone equ 0x11 ;frequency of note note_length equ 0x12 ;length of note note_tempo equ 0x13 ;tempo of song random equ 0x14 ;random number key equ 0x15 ;key last pressed column_w equ 0x16 ;write pointer in sequence table X line_w equ 0x17 ;write pointer in sequence table Y column_r equ 0x18 ;read pointer in sequence table X line_r equ 0x19 ;read pointer in sequence table Y steps0104 equ 0x1a ;step memory steps0508 equ 0x1b ;step memory steps0912 equ 0x1c ;step memory steps1316 equ 0x1d ;step memory steps1720 equ 0x1e ;step memory steps2124 equ 0x1f ;step memory steps2528 equ 0x20 ;step memory steps2932 equ 0x21 ;step memory steps3336 equ 0x22 ;step memory steps3740 equ 0x23 ;step memory steps4144 equ 0x24 ;step memory steps4548 equ 0x25 ;step memory steps4952 equ 0x26 ;step memory steptemp equ 0x27 ;temporary step memory stepsgood equ 0x28 ;number of successful steps by player ;**************************************************************** ;reset vector ;**************************************************************** reset: org 0x00 ;reset vector address goto start ;start program execution start: org 0x06 ;start of program goto Initialisation ;**************************************************************** ; Data tables for Songs ;**************************************************************** SongHeyJude: addwf pcl,f ;jump forward according to W value retlw NOTE_G1 ;Hey retlw LENGTH_CROTCHET retlw NOTE_E1 ;jude retlw LENGTH_MINIM retlw NOTE_E1 ;don't retlw LENGTH_QUAVER retlw NOTE_G1 ;make retlw LENGTH_QUAVER retlw NOTE_A1 ;it retlw LENGTH_QUAVER retlw NOTE_D1 ;bad, retlw LENGTH_MINIM retlw NOTE_D1 ;take retlw LENGTH_QUAVER retlw NOTE_E1 ;a retlw LENGTH_QUAVER retlw NOTE_F1 ;sad retlw LENGTH_CROTCHET retlw NOTE_C2 ;song retlw LENGTH_MINIM retlw NOTE_C2 ;and retlw LENGTH_QUAVER retlw NOTE_B1 ;make retlw LENGTH_QUAVER retlw NOTE_G1 ;it retlw LENGTH_QUAVER retlw NOTE_A1 ;bet- retlw LENGTH_QUAVER retlw NOTE_G1 ;ter. retlw LENGTH_MINIM retlw NOTE_G1 ;Re- retlw LENGTH_QUAVER retlw NOTE_A1 ;mem- retlw LENGTH_QUAVER retlw NOTE_A1 ;ber retlw LENGTH_CROTCHET retlw NOTE_A1 ;to retlw LENGTH_QUAVER retlw NOTE_D2 ;let retlw LENGTH_SEMIQUAVER retlw NOTE_C2 ;her retlw LENGTH_CROTCHET retlw NOTE_B1 ;in retlw LENGTH_QUAVER retlw NOTE_C2 ;to retlw LENGTH_QUAVER retlw NOTE_A1 ;your retlw LENGTH_CROTCHET retlw NOTE_G1 ;heart, retlw LENGTH_MINIM retlw NOTE_C1 ;then retlw LENGTH_QUAVER retlw NOTE_D1 ;you retlw LENGTH_QUAVER retlw NOTE_E1 ;can retlw LENGTH_QUAVER retlw NOTE_A1 ;start retlw LENGTH_MINIM retlw NOTE_G1 ;to retlw LENGTH_QUAVER retlw NOTE_F1 ;make retlw LENGTH_QUAVER retlw NOTE_E1 ;it retlw LENGTH_QUAVER retlw NOTE_C1 ;bet- retlw LENGTH_QUAVER retlw NOTE_C1 ;ter. retlw LENGTH_MINIM SongOSusana: addwf pcl,f ;jump forward according to W value retlw NOTE_C2 retlw LENGTH_MINIM retlw NOTE_D2 retlw LENGTH_QUAVER retlw NOTE_E2 retlw LENGTH_CROTCHET retlw NOTE_G2 retlw LENGTH_CROTCHET retlw NOTE_G2 retlw LENGTH_CROTCHET retlw NOTE_A2 retlw LENGTH_CROTCHET retlw NOTE_G2 retlw LENGTH_CROTCHET retlw NOTE_E2 retlw LENGTH_CROTCHET retlw NOTE_C2 retlw LENGTH_MINIM retlw NOTE_D2 retlw LENGTH_QUAVER retlw NOTE_E2 retlw LENGTH_CROTCHET retlw NOTE_E2 retlw LENGTH_CROTCHET retlw NOTE_D2 retlw LENGTH_CROTCHET retlw NOTE_C2 retlw LENGTH_CROTCHET retlw NOTE_D2 retlw LENGTH_MINIM retlw NOTE_C2 retlw LENGTH_MINIM retlw NOTE_D2 retlw LENGTH_QUAVER retlw NOTE_E2 retlw LENGTH_CROTCHET retlw NOTE_G2 retlw LENGTH_CROTCHET retlw NOTE_G2 retlw LENGTH_CROTCHET retlw NOTE_A2 retlw LENGTH_CROTCHET retlw NOTE_G2 retlw LENGTH_CROTCHET retlw NOTE_E2 retlw LENGTH_CROTCHET retlw NOTE_C2 retlw LENGTH_MINIM retlw NOTE_D2 retlw LENGTH_MINIM retlw NOTE_E2 retlw LENGTH_CROTCHET retlw NOTE_E2 retlw LENGTH_CROTCHET retlw NOTE_D2 retlw LENGTH_CROTCHET retlw NOTE_C2 retlw LENGTH_MINIM retlw NOTE_F2 retlw LENGTH_CROTCHET retlw NOTE_F2 retlw LENGTH_CROTCHET retlw NOTE_A2 retlw LENGTH_CROTCHET retlw NOTE_A2 retlw LENGTH_CROTCHET retlw NOTE_A2 retlw LENGTH_CROTCHET retlw NOTE_G2 retlw LENGTH_CROTCHET retlw NOTE_G2 retlw LENGTH_CROTCHET retlw NOTE_E2 retlw LENGTH_CROTCHET retlw NOTE_C2 retlw LENGTH_CROTCHET retlw NOTE_D2 retlw LENGTH_MINIM retlw NOTE_C2 retlw LENGTH_MINIM retlw NOTE_D2 retlw LENGTH_QUAVER retlw NOTE_E2 retlw LENGTH_CROTCHET retlw NOTE_G2 retlw LENGTH_CROTCHET retlw NOTE_G2 retlw LENGTH_CROTCHET retlw NOTE_A2 retlw LENGTH_CROTCHET retlw NOTE_G2 retlw LENGTH_CROTCHET retlw NOTE_E2 retlw LENGTH_CROTCHET retlw NOTE_C2 retlw LENGTH_MINIM retlw NOTE_D2 retlw LENGTH_QUAVER retlw NOTE_E2 retlw LENGTH_CROTCHET retlw NOTE_E2 retlw LENGTH_CROTCHET retlw NOTE_D2 retlw LENGTH_CROTCHET retlw NOTE_D2 retlw LENGTH_CROTCHET retlw NOTE_C2 retlw LENGTH_SEMIBREVE SongDeathMarch: addwf pcl,f ;jump forward according to W value retlw NOTE_C1 retlw LENGTH_MINIM retlw NOTE_C1 retlw LENGTH_QUAVER retlw NOTE_C1 retlw LENGTH_CROTCHET retlw NOTE_C1 retlw LENGTH_QUAVER retlw NOTE_C1 retlw LENGTH_CROTCHET retlw NOTE_E1 retlw LENGTH_QUAVER retlw NOTE_D1 retlw LENGTH_CROTCHET retlw NOTE_C1 retlw LENGTH_QUAVER retlw NOTE_C1 retlw LENGTH_CROTCHET retlw NOTE_B0 retlw LENGTH_CROTCHET retlw NOTE_C1 retlw LENGTH_MINIM ;**************************************************************** ;Name : Initialisation ;Description : system initialisation and mainloop ;**************************************************************** Initialisation: ;system initialisation ;port A and port B initialisation bcf status,rp1 ;select bank1 registers bsf status,rp0 movlw PORTA_CONFIG1 ;porta configuration movwf trisa movlw PORTB_CONFIG1 ;portb configuration movwf trisb movlw 0x88 ;Fosc/4;No prescaler movwf 0x81 ;Timer configuration in option register bcf status,rp0 ;select bank0 registers NewGame: clrf porta ;turn off status leds clrf portb ;turn off all leds movlw RAM_START ;clear global variables movwf fsr S1: clrf indf incf fsr,f btfss fsr,6 goto S1 movf line_w,w ;initialise step memory base addlw LINE_OFFSET ;add step memory offset movwf line_w call ClearRecord ;clear record steps? call Introduction ;introductory song & calibration ;**************************************************************** ;Name : Mainloop ;Description : ;**************************************************************** Mainloop: call GetStep ;create a new step & add it to sequence call ShowSequence ;show sequence on LEDs call GetUserSequence ;player's sequence (result returned in W) ;W=1 - correct, W=0 - wrong xorlw 1 ;is player's sequence correct? btfss status,z ;yes - ignore next instruction goto SequenceBad ;no - it's wrong! incf stepsgood,f ;another successful step by player call Delay150 call Delay150 call Delay150 movf line_w,w ;max sequence reached (52 steps)? xorlw D'52' btfss status,z goto Mainloop ;no - do another step movf column_w,w xorlw D'3' btfss status,z goto Mainloop ;no - do another step goto SequenceRecord ;yes - max sequence correct! ;**************************************************************** ;Name : ClearRecord ;Description : allows the player to clear the current step ; : record. Player must press one of the keys ; : at power-on for EEPROM to be set to zero ;**************************************************************** ClearRecord: movf portb,w ;test for a key press andlw 0x0f ;mask keys xorlw 0x00 ;are any keys being pressed? btfsc status,z ;yes - skip next instruction return ;no - return! movlw RECORD_STEPS ;clear step record in EEPROM movwf eeadr clrf eedata bsf status,rp0 ;select bank1 bsf eecon1,wren ;enable write movlw 0x55 ;unlock codes movwf eecon2 movlw 0xaa movwf eecon2 bsf eecon1,wr ;write begins bcf eecon1,wren ;disable further writes Crec: btfsc eecon1,wr ;wait to write complete goto Crec bcf status,rp0 ;select bank0 movlw 0x02 movwf note_tempo call SoundRisingRocket ;cleared record indication return ;**************************************************************** ;Name : Introduction ;Description : plays the introductory "hey jude" song until ; : one of the keys is pressed. ;Inputs : none ;**************************************************************** Introduction: clrf note_select ;beginning of "hey jude" song Intr1: incf steptemp,f movf steptemp,w andlw 0x03 movwf random call Delay150 call ShowLed ;show it on leds movlw 0x10 movwf note_tempo ;speed of song movf note_select,w ;get next "hey jude" note call SongHeyJude ;returned in W movwf note_tone incf note_select,f movf note_select,w ;get length of note call SongHeyJude movwf note_length call SoundPlay ;play music clrf portb ;turn all leds off incf note_select,f ;select next note movf note_select,w xorlw SONG_HEY_JUDE_LEN ;end of song? btfsc status,z ;no - skip next instruction clrf note_select ;yes - play it again from beginning movf portb,w ;test for a key press andlw 0x0f ;mask keys xorlw 0x00 ;are any keys being pressed? btfsc status,z ;yes - skip next instruction goto Intr1 ;no - keep playing music! movlw 0x02 movwf note_tempo call SoundRisingRocket ;start new game indication return ;start new game ;**************************************************************** ;Name : SoundPlay ;Description : plays a tone on the buzzer ;Inputs : note_tone - frequency of the tone ; : note_length - length of note ; : note_tempo - speed of song ;**************************************************************** SoundPlay: clrf timerc ;initialise timer Sp1: movf timerc,w xorwf note_length,w ;end of note? btfsc status,z ;no - skip next instruction return ;yes - exit function movf note_tempo,w movwf timerb Sp2: movf note_tone,w ;frequency bsf porta,BUZZER ;high time call SoundDelay bcf porta,BUZZER ;low time call SoundDelay decfsz timerb,f goto Sp2 incf timerc,f goto Sp1 ;**************************************************************** ;Name : SoundDelay ;Description : a delay used whenever sound ; : must be produced on the piezo diaphragm. The W register ; : contains the number of cycles to wait (in 10's ; : of microseconds. ;Inputs : W - contains the note to be played ; : ie. W=191, delay==1,91msec ;**************************************************************** SoundDelay: movwf timera Sd1: nop nop nop nop nop nop nop decfsz timera,f goto Sd1 return ;**************************************************************** ;Name : SoundRisingRocket ;Description : rising rocket sound effect ;Inputs : note_tempo - speed of rocket ;Outputs : none ;**************************************************************** SoundRisingRocket: clrf note_tone ;make tone=255 - start comf note_tone,f ;with lowest frequency Srr1: movlw LENGTH_DEMISEMIQUAVER movwf note_length call SoundPlay decfsz note_tone,f ;do a "rising" sound goto Srr1 CALL Delay150 CALL Delay150 CALL Delay150 CALL Delay150 CALL Delay150 CALL Delay150 CALL Delay150 CALL Delay150 return ;**************************************************************** ;Name : GetRandom ;Description : reads the PIC's timer register at various ; : "random" intervals caused by the player ;Inputs : pressing one of the keys. ;Outputs : random - random number 0-3 ;**************************************************************** GetRandom: movf tmr0,w andlw 0x03 ;mask all but bit0 and bit1 movwf random return ;**************************************************************** ;Name : GetStep ;Description : gets a random number and stores it into the ; : next available position in sequence table. ;**************************************************************** GetStep: call GetRandom ;ascertain random number movf line_w,w ;get current line movwf fsr ;pointer to next available memory bcf status,c ;initialise carry movf column_w,w ;get current column xorlw 0 BTFSC STATUS,Z GOTO GCol0 ;column=0 - don't shift xorlw 0x01 BTFSC STATUS,Z GOTO GCol1 ;column=1 - shift random 2 times XORLW 0x03 BTFSC STATUS,Z GOTO GCol2 ;column=2 - shift random 4 times GCol3: rlf random,f ;column=3 - shift random 6 times rlf random,f GCol2: rlf random,f rlf random,f GCol1: rlf random,f rlf random,f GCol0: movf indf,w ;get current memory byte of table iorwf random,w ;merge new random number into table movwf indf ;restore in sequence table incf column_w,f ;update column btfss column_w,2 ;end of this memory byte in table? return ;no - return clrf column_w ;yes - select next memory byte in table incf line_w,f return ;**************************************************************** ;Name : ShowSequence ;Description : displays the step sequence that the player ; : has to remember and repeat. ;**************************************************************** ShowSequence: clrf column_r ;begin at start of step sequence movlw LINE_OFFSET movwf line_r Ss1: movf line_r,w movwf fsr movf indf,w movwf steptemp movf column_r,w ;get current column xorlw 0 BTFSC STATUS,Z GOTO SCol0 ;column=0 - don't shift xorlw 0x01 BTFSC STATUS,Z GOTO SCol1 ;column=1 - shift random 2 times XORLW 0x03 BTFSC STATUS,Z GOTO SCol2 ;column=2 - shift random 4 times SCol3: rrf steptemp,f ;column=3 - shift random 6 times rrf steptemp,f SCol2: rrf steptemp,f rrf steptemp,f SCol1: rrf steptemp,f rrf steptemp,f SCol0: movf steptemp,w ;get current memory byte of table andlw 0x03 ;mask bits 2-7 movwf random call ShowStep ;display LED according to stored value call Delay150 ;wait a little after player call Delay150 ;has pressed a key call Delay150 incf column_r,f ;update column btfsc column_r,2 ;overflow? goto Colov1 ;yes Ss2: movf column_r,w ;no xorwf column_w,w ;column pointers the same? btfss status,z goto Ss1 ;no - at least another step to show movf line_r,w ;yes xorwf line_w,w ;reached the end of sequence? btfsc status,z ;no - jump next instruction return ;yes - sequence complete! goto Ss1 ;at least another step to show Colov1: clrf column_r incf line_r,f goto Ss2 ;**************************************************************** ;Name : ShowStep ;Description : turns on one of the LEDs and beeps according to ; : the random number & level of difficulty ;Inputs : random - random number ;Outputs : none ;**************************************************************** ShowStep: call ShowLed ;show random number on led movwf note_tone ;ShowLed returns with beep value in W movlw LENGTH_SEMIBREVE movwf note_length movlw 0x10 ;easy level btfss porta,LEVEL ;get level of difficulty movlw 0x01 ;hard level movwf note_tempo ;speed of beep call SoundPlay ;play button beep clrf portb ;turn all leds off return ;**************************************************************** ;Name : ShowLed ;Description : turns on one of the LEDs according to the random ; : number & prepares W with tone value ;Inputs : random - random number ;Outputs : W - value of tone frequency ;**************************************************************** ShowLed: movf random,w ;get random number xorlw 0 BTFSC STATUS,Z goto ShowRed ;random=0 xorlw 0x01 BTFSC STATUS,Z GOTO ShowGreen ;random=1 xorlw 0x03 BTFSC STATUS,Z GOTO ShowYellow ;random=2 goto ShowOrange ;random=3 ShowRed: bsf portb,LED_RED ;turn on red led retlw KEY_RED_SOUND ;tone frequency ShowGreen: bsf portb,LED_GREEN ;turn on green led retlw KEY_GREEN_SOUND ;tone frequency ShowYellow: bsf portb,LED_YELLOW ;turn on yellow led retlw KEY_YELLOW_SOUND ;tone frequency ShowOrange: bsf portb,LED_ORANGE ;turn on orange led retlw KEY_ORANGE_SOUND ;tone frequency ;**************************************************************** ;Name : GetUserSequence ;Description : checks the player's sequence to that required ;Inputs : none ;Outputs : W=0 : player has made a mistake ; : W=1 : player has successfully repeated sequence ;**************************************************************** GetUserSequence: clrf column_r ;begin at start of step sequence movlw LINE_OFFSET movwf line_r Us1: movf line_r,w movwf fsr movf indf,w movwf steptemp movf column_r,w ;get current column xorlw 0 BTFSC STATUS,Z GOTO UCol0 ;column=0 - don't shift xorlw 0x01 BTFSC STATUS,Z GOTO UCol1 ;column=1 - shift random 2 times xorlw 0x03 BTFSC STATUS,Z GOTO UCol2 ;column=2 - shift random 4 times UCol3: rrf steptemp,f ;column=3 - shift random 6 times rrf steptemp,f UCol2: rrf steptemp,f rrf steptemp,f UCol1: rrf steptemp,f rrf steptemp,f UCol0: movf steptemp,w ;get current memory byte of table andlw 0x03 ;mask bits 2-7 movwf random call Keypad ;get player's input - returned in W ;W=0 - no key pressed (timeout) ;W=1 - player has pressed a key xorlw 0 ;did player press a key? btfsc status,z ;yes - jump next instruction retlw 0 ;no - exit function movf key,w ;compare pressed key with step xorwf random,w ;is it the same? btfss status,z ;yes - jump next instruction retlw 0 ;no - incorrect, exit function incf column_r,f ;update column btfsc column_r,2 ;overflow? goto Colov2 ;yes Us2: movf column_r,w ;no xorwf column_w,w ;column pointers the same? btfss status,z goto Us1 ;no - at least another step to show movf line_r,w ;yes xorwf line_w,w ;reached the end of sequence? btfsc status,z ;no - jump next instruction retlw 1 ;yes - sequence complete! goto Us1 ;at least another step to show Colov2: clrf column_r incf line_r,f goto Us2 ;**************************************************************** ;Name : Keypad ;Description : scans the keys for a press and lights up the ; : corresponding LED and beeps. ;Inputs : none ;Outputs : W=0 : key timeout - no key has been pressed ; : W=1 : key has been pressed ; : key : 0=red,1=green,2=yellow,3=orange ;**************************************************************** Keypad: clrf key ;initialise key movlw 0x07 ;assume easy level - 5 sec timeout btfss porta,LEVEL ;get level of difficulty movlw 0x03 ;hard level - 2 sec timeout movwf timerc Kp2: movlw 0xff movwf timerb Kp1: movlw 0xff movwf timera Kwait: btfsc portb,KEY_RED goto KeyRed btfsc portb,KEY_GREEN goto KeyGreen btfsc portb,KEY_YELLOW goto KeyYellow btfsc portb,KEY_ORANGE goto KeyOrange decfsz timera,f goto Kwait decfsz timerb,f goto Kp1 decfsz timerc,f goto Kp2 retlw 0 ;player hasn't pressed key! KeyRed: bsf portb,LED_RED ;turn on red led clrf key ;key=0 movlw KEY_RED_SOUND ;tone frequency goto Beep1 KeyGreen: bsf portb,LED_GREEN ;turn on green led bsf key,0 ;key=1 movlw KEY_GREEN_SOUND ;tone frequency goto Beep1 KeyYellow: bsf portb,LED_YELLOW ;turn on yellow led bsf key,1 ;key=2 movlw KEY_YELLOW_SOUND ;tone frequency goto Beep1 KeyOrange: bsf portb,LED_ORANGE ;turn on orange led bsf key,0 ;key=3 bsf key,1 movlw KEY_ORANGE_SOUND ;tone frequency Beep1: movwf note_tone ;save tone movlw LENGTH_SEMIBREVE movwf note_length movlw 0x03 movwf note_tempo ;speed of beep Beep2: call SoundPlay ;play button beep movf portb,w ;test for a key press andlw 0x0f ;mask keys xorlw 0x00 ;are any keys being pressed? btfss status,z ;no - skip next instruction goto Beep2 ;yes - keep beeping! clrf portb ;turn off all leds retlw 1 ;return to calling function ;**************************************************************** ;Name : SequenceBad ;Description : player has made a mistake - show player the ; : correct sequence. Test to see if a record has ; : been made. ;**************************************************************** SequenceBad: movlw 0x01 movwf note_tempo call SoundRisingRocket movlw 0x01 movwf note_tempo call SoundRisingRocket call ShowSequence ;replay proper sequence again movlw 0x01 movwf note_tempo call SoundRisingRocket movlw 0x01 movwf note_tempo call SoundRisingRocket call Delay150 call Delay150 call Delay150 movlw RECORD_STEPS ;get current record from EEPROM movwf eeadr bsf status,rp0 ;select bank1 bsf eecon1,rd ;read eeprom bcf status,rp0 ;select bank0 movf eedata,w ;W=record number of steps subwf stepsgood,w ;a record sequence (or same)? btfsc status,c ;no - jump next instruction goto SequenceRecord ;yes - tell player about it! clrf note_select ;beginning of song movlw 0x10 ;slow movwf note_tempo ;speed of song Sb1: call Delay150 movf note_select,w ;get next note call SongDeathMarch ;returned in W movwf note_tone incf note_select,f movf note_select,w ;get length of note call SongDeathMarch movwf note_length call SoundPlay ;play music incf note_select,f ;select next note movf note_select,w xorlw SONG_DEATHMARCH_LEN ;end of song? btfss status,z ;yes - skip next instruction goto Sb1 ;no - keep playing call Delay150 call Delay150 call Delay150 goto NewGame ;start new game ;**************************************************************** ;Name : SequenceRecord ;Description : player has beaten the record, save new step ; : record in EEPROM and play record tune. ;**************************************************************** SequenceRecord: movlw RECORD_STEPS ;save new step record in EEPROM movwf eeadr movf stepsgood,w movwf eedata bsf status,rp0 ;select bank1 bsf eecon1,wren ;enable write movlw 0x55 ;unlock codes movwf eecon2 movlw 0xaa movwf eecon2 bsf eecon1,wr ;write begins bcf eecon1,wren ;disable other writes Sre1: btfsc eecon1,wr ;wait for "write" to complete goto Sre1 bcf status,rp0 ;select bank0 clrf note_select ;beginning of song Sr1: incf steptemp,f movf steptemp,w andlw 0x03 movwf random call Delay150 call ShowLed ;show it on leds movlw 0x5 ;fast movwf note_tempo ;speed of song movf note_select,w ;get next note call SongOSusana ;returned in W movwf note_tone incf note_select,f movf note_select,w ;get length of note call SongOSusana movwf note_length call SoundPlay ;play music clrf portb ;turn all leds off incf note_select,f ;select next note movf note_select,w xorlw SONG_OSUSANA_LEN ;end of song? btfss status,z ;yes - skip next instruction goto Sr1 ;no - keep playing call Delay150 call Delay150 call Delay150 goto NewGame ;start new game ;**************************************************************** ;Name : Delay ;Description : causes a delay of 150msec with 4MHz crystal! ;**************************************************************** Delay150: movlw 0xc3 ;number of wait states movwf timerb L4: movlw 0xff ;number of wait states movwf timera L5: decfsz timera,f goto L5 decfsz timerb,f goto L4 return END
Quick Links
Legal Stuff
Social Media