program SndBoardTest; {********************************************************************** * (c)2017 coinop.mally.eu * * * * Programm zum Abspielen der Klänge bzw. Sprache auf den * * BALLY Sound Boards * * SQUAWK & TALK und dem CHEAP SQUEAK (Midway) * * Ermöglicht den einfachen Test der Boards ohne Flipper Peripherie. * * * * MCU: ATMEGA8 oder ATmega48 * * Clock: 8 MHz * * Fuses: XTAL slow boot, keine weiteren Fuses. * * * **********************************************************************} { Declarations section } const bin: Array [0..7] Of Byte = (1, 2, 4, 8, 16, 32, 64, 128); MSN_trans: Array[0..5] Of Byte = (240, 248, 244, 252, 242, 250); LSN_trans: Array[0..15] Of Byte = (0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15); var i,j :Byte; LSN, MSN :Byte; counter: Byte; label restart; { Procedures & Functions } Procedure Trigger; // Sound triggern Begin PortC.4 := 0; // Sound Interrupt low delay_us(40); // 40us warten PortC.4 := 1; // Sound Interrupt high End; Procedure Send_Data; // zur Übertragung der Daten an S&T J1 Pin1- Pin4 Begin Trigger; // Sound Interrupt low für 40us delay_us(22); // 22us warten PortC := LSN; // 1. Nibble senden delay_us(145); // 145us warten PortC := MSN; // 2. Nibble senden delay_us(78); // 78us warten PortC := 255; // S&T Ports alle high (inaktiv) counter := 0; // Nibble Zähler zurückstellen End; { Main program } begin //*** Port Configuration **** DDRB := %11111111; // PB1-PB3 = LED2-LED5 (LED1 später) DDRC := %11111111; // PC0-PC3 = A-D; PC4 = Trigger-Out; PC5 = LS DDRD := %00001110; // PD0 = Trigger; PD4-PD7 = Schalter PortB := $FF; // alles Output PortC := $FF; // alles Output PortD := 241; // int. Pullups an {***** Signalzuordnung ***** brn = PC3, J1-1 blu = PC2, J1-2 orn = PC1, J1-3 grn = PC0, J1-4 ***************************} {******** Protocol ********* Trigger (S&T Sound Interrupt) low für 40us 20us warten 1st Nibble for 145us (an S&T J1-1 bis J1-4) 2nd Nibble for 78us (an S&T J1-1 bis J1-4) -->Sound wird auf S&T erzeugt ****************************} //**** Initialisierung ***** Sound_Init(PortC, 5); // für Piezo Sound_Play(400, 100); // Kammerton A für 100ms // Einsprunglabel restart: While (PinD.0 = 0) Do NOP; // falls Taste, dann warten PortB := 31; // alle LEDs aus PortC := 31; // Ports zur S&T alle high counter := 0; // Nibble Zähler LSN := 255; // least significant nibble MSN := 255; // most significant nibble While true Do // solange Gerät angeschaltet... Begin PortB := 31; // LEDs alle aus If (PIND.7 = 1) Then PortB := PortB - 1 * 2; // Schalter auf LED Port zeigen If (PIND.6 = 1) Then PortB := PortB - 2 * 2; If (PIND.5 = 1) Then PortB := PortB - 4 * 2; If (PIND.4 = 1) Then PortB := PortB - 8 * 2; Delay_ms(20); // 20ms warten If (PinD.0 = 0) And (counter < 2) Then // Wenn Taste und nicht alle Nibbles Begin Delay_ms(50); // Taste entprellen While (PinD.0 = 0) Do NOP; // Taste entprellen If (PIND.7 = 0) Then // Wenn Schalter 4 gedrückt... Begin // Wenn Nibble Zähler 1, dann // beim 1. Nibble sonst beim 2. Nibble // Bit 4 auf low (0111) if (counter = 1) Then LSN := LSN - 8 Else MSN := MSN - 8; End; If (PIND.6 = 0) Then // Wenn Schalter 3 gedrückt... Begin // Wenn Nibble Zähler 1, dann // beim 1. Nibble, sonst beim 2. Nibble // Bit 3 auf low (1011) if (counter = 1) Then LSN := LSN - 4 Else MSN := MSN - 4; End; If (PIND.5 = 0) Then // wie oben nur für Bit 2 Begin if (counter = 1) Then LSN := LSN - 2 Else MSN := MSN - 2; End; If (PIND.4 = 0) Then // wie oben nur für Bit 1 Begin if (counter = 1) Then LSN := LSN - 1 Else MSN := MSN - 1; End; For i := 0 to counter Do Begin Sound_Play(300,100); // Ton für 100ms auf Piezo ausgeben Delay_ms(100); // 100 ms warten End; inc(counter); // Nibble Zähler erhöhen End; If (counter = 2) Then // 1. und 2. Nibble existent Begin While (PinD.0 = 0) Do NOP; // Taste entprellen If ((MSN = 255) AND (LSN = 255)) Then // alle Sounds hintereinander spielen Begin For i := 0 To 5 Do // alle MSN nacheinander Begin For j := 0 To 15 Do // alle LSN nacheinander Begin MSN := MSN_trans[i]; // Übersetzung für unkonventionellen LSN := LSN_trans[j]; // Anschluss an S&T J1 PortB := j *2; // LSN auf LEDs anzeigen Send_Data; // Nibbles an S&T senden delay_ms(2700); // 2,7 sek. Zeit für Sound/Sample Sound_Play(400,100); // Kammeton A auf Piezo für 100ms If (PinD.0 = 0) Then Goto restart; //Abbruch End; End; End Else Begin Send_Data; LSN := 255; // LSN zurücksetzen MSN := 255; // MSN zurücksetzen End; End; End; end. // Aus die Maus...