$regfile = "m8def.dat" $crystal = 8000000 $baud = 19200 Osccal = &HAE '$sim Config Portd.5 = Output 'achtung! invertiert Multidata Alias Portd.5 Config Portd.6 = Output 'schaltet bei steigender flanke Multiclock Alias Portd.6 Config Portd.7 = Output 'achtung! invertiert Reihendata Alias Portd.7 Config Portb.0 = Output Reihenclock Alias Portb.0 Config Pinc.1 = Input Taster_rechts Alias Pinc.1 Portc.1 = 1 'interner pullup Config Pinc.0 = Input Taster_oben Alias Pinc.0 Portc.0 = 1 Config Pinb.2 = Input Taster_links Alias Pinb.2 Portb.2 = 1 Config Pinb.1 = Input Taster_unten Alias Pinb.1 Portb.1 = 1 'zeichnet bei einem takt eine zeile: Config Timer0 = Timer , Prescale = 256 Enable Timer0 On Timer0 Isr_timer0 Config Timer1 = Timer , Prescale = 64 Enable Timer1 On Timer1 Isr_timer1 Enable Interrupts Declare Sub Zeichnen Declare Function Position(xp As Byte , Yp As Byte) As Byte 'zeit fürs entprellen in ms Config Debounce = 0 Dim I As Byte Dim X As Byte Dim Y As Byte Dim Xplus As Integer Dim Yplus As Integer Dim Temp As Byte Dim Temp2 As Byte 'enthält den zustand der leds: Dim Bild(64) As Byte 'fürs zeichnen: Dim Spalte As Byte Dim Reihe As Byte 'für die timer: Dim Naechster_frame As Bit Dim Naechster_zug As Bit 'für snake Dim Schlange_x(64) As Byte Dim Schlange_y(64) As Byte Dim Kirsche_x As Byte Dim Kirsche_y As Byte Dim Laenge As Byte Waitms 100 Multiclock = 0 Reihenclock = 0 'alles resetten For I = 1 To 8 Multidata = 1 Multiclock = 0 Multiclock = 1 Next I For I = 1 To 8 Reihendata = 1 Reihenclock = 0 Reihenclock = 1 Next I Snake: Laenge = 3 For I = 1 To Laenge Schlange_x(i) = 5 - I Schlange_y(i) = 4 Next Xplus = 1 Yplus = 0 Kirsche_x = Rnd(8) Kirsche_x = Kirsche_x + 1 Kirsche_y = Rnd(8) Kirsche_y = Kirsche_y + 1 Temp = Position(kirsche_x , Kirsche_y) Bild(temp) = 1 Do Debounce Taster_oben , 0 , T_oben , Sub Debounce Taster_rechts , 0 , T_rechts , Sub Debounce Taster_unten , 0 , T_unten , Sub Debounce Taster_links , 0 , T_links , Sub If Naechster_frame = 1 Then Zeichnen Naechster_frame = 0 End If If Naechster_zug = 1 Then Naechster_zug = 0 'hier wird der letzte pixel gelöscht X = Schlange_x(laenge) Y = Schlange_y(laenge) Temp = Position(x , Y ) Bild(temp) = 0 'alle felder zwischen 2 und dem ende werden um eins nach vorne geschoben For I = Laenge To 2 Step -1 Schlange_x(i) = Schlange_x(i - 1) Schlange_y(i) = Schlange_y(i - 1) Next I 'der neue erste pixel der schlange Schlange_x(1) = Schlange_x(1) + Xplus Schlange_y(1) = Schlange_y(1) + Yplus If Schlange_x(1) < 1 Then Schlange_x(1) = 8 If Schlange_x(1) => 9 Then Schlange_x(1) = 1 If Schlange_y(1) < 1 Then Schlange_y(1) = 8 If Schlange_y(1) => 9 Then Schlange_y(1) = 1 'überprüfung auf kollision For I = 2 To Laenge X = Schlange_x(1) Temp = Schlange_x(i) If X = Temp Then Y = Schlange_y(1) Temp = Schlange_y(i) If Y = Temp Then Goto Tod End If End If Next 'überprüfen ob kirsche gefressen wurde:: If Schlange_x(1) = Kirsche_x Then If Schlange_y(1) = Kirsche_y Then Laenge = Laenge + 1 'überprüfen ob kirsche auf schlange liegt: Do Temp = 0 Kirsche_x = Rnd(8) Kirsche_x = Kirsche_x + 1 Kirsche_y = Rnd(8) Kirsche_y = Kirsche_y + 1 For I = 1 To Laenge If Schlange_x(i) = Kirsche_x Then If Schlange_y(i) = Kirsche_y Then Temp = 1 End If End If Next Loop Until Temp = 0 Temp = Position(kirsche_x , Kirsche_y) Bild(temp) = 1 End If End If 'neuen pixel der schlange zeichnen X = Schlange_x(1) Y = Schlange_y(1) Temp = Position(x , Y ) Bild(temp) = 1 'kirsche zeichnen ' Temp = Position(kirsche_x , Kirsche_y) ' Bild(temp) = 1 End If Loop Tod: For I = 1 To 8 Multidata = 1 Multiclock = 0 Multiclock = 1 Next I For I = 1 To 8 Reihendata = 1 Reihenclock = 0 Reihenclock = 1 Next I Waitms 1000 For I = 1 To 64 Bild(i) = 1 Next Do If Naechster_frame = 1 Then Zeichnen Naechster_frame = 0 End If Debounce Taster_oben , 0 , New_game , Sub Debounce Taster_rechts , 0 , New_game , Sub Debounce Taster_unten , 0 , New_game , Sub Debounce Taster_links , 0 , New_game , Sub Loop New_game: For I = 1 To 64 Bild(i) = 0 Next Goto Snake Return Function Position(xp As Byte , Yp As Byte) As Byte Temp = Xp - 1 Temp = Temp * 8 Position = Yp + Temp End Function T_oben: If Yplus <> 1 Then Yplus = -1 Xplus = 0 End If Return T_rechts: If Xplus <> -1 Then Xplus = 1 Yplus = 0 End If Return T_unten: If Yplus <> -1 Then Yplus = 1 Xplus = 0 End If Return T_links: If Xplus <> 1 Then Xplus = -1 Yplus = 0 End If Return 'ein takt = eine zeile Isr_timer0: Timer0 = 150 Naechster_frame = 1 Return Isr_timer1: Timer1 = 30000 Naechster_zug = 1 Return Sub Zeichnen Spalte = Spalte + 1 If Spalte = 9 Then Spalte = 1 If Spalte = 1 Then Multidata = 0 Else Multidata = 1 End If Multiclock = 0 Multiclock = 1 'pin der spalte von hinten -1 *8 Select Case Spalte Case 1 : Temp2 = 48 Case 2 : Temp2 = 32 Case 3 : Temp2 = 16 Case 4 : Temp2 = 0 Case 5 : Temp2 = 8 Case 6 : Temp2 = 24 Case 7 : Temp2 = 40 Case 8 : Temp2 = 56 End Select For Reihe = 1 To 8 Select Case Reihe Case 1 : Temp = Temp2 + 1 Case 2 : Temp = Temp2 + 3 Case 3 : Temp = Temp2 + 5 Case 4 : Temp = Temp2 + 7 Case 5 : Temp = Temp2 + 8 Case 6 : Temp = Temp2 + 6 Case 7 : Temp = Temp2 + 4 Case 8 : Temp = Temp2 + 2 End Select If Bild(temp) = 1 Then Reihendata = 0 Else Reihendata = 1 End If Reihenclock = 0 Reihenclock = 1 Next Reihe End Sub