![]() ![]() INFO - FAQ - CC2-Forum - CCPro-Forum |
|
Hallo zusammen, ich habe mir überlegt, wie man den Demo-Sourcecode BEEP während Programmausführung am sinnvollsten testen kann. Dabei ist mir das Spiel Senso in den Sinn gekommen, das Anfang der 80er Jahre sehr populär war. Übrigens befindet sich ein weiteres Spiel für die Open-Macro namens Meteor-Mess im Beispiel Kleine Pizza-Uhr bei den Downloads auf der OM-Infosite. ' =========================================================================== ' Spiel "Senso" auf der Open-Macro ' In OCBASIC 1.08a von Dietmar Harlos am 19. April 2012 ' =========================================================================== ' Das Spiel besteht aus vier LEDs, vier Tasten und einem Piezo-Schallwandler. ' Die LEDs leuchten abwechselnd auf und es wird für jede LED ein kurzer, ' individueller Signalton ausgegeben. Der Spieler muß sich diese Reihenfolge ' merken und nach Abschluß der Vorgabe wiederholen. Mit jeder Runde kommt ' eine weitere LED-Ton-Kombination hinzu. ' Der Piezo-Schallwandler muß an PORT[16] (PTB7/TCH3) angeschlossen werden. ' Die LEDs zeigen den Portzustand an und müssen (wie auf dem PE-Board) per ' 4049-IC an die Ports angeschlossen werden. Die Tasten schalten nach Masse. ' Bei der Eingabe durch den Spieler arbeiten die LEDs invertiert, da sonst ' nicht gleichzeitig die Tasten abgefragt werden könnten. ' Es wird immer die gleiche Reihenfolge der LED-Ton-Kombinationen erzeugt. ' Wer das nicht möchte, muß an zwei Stellen das "RANDOMIZE 0" ändern. ' --------------------------------------------------------------------------- INCLUDE "omac.def" 'Definitionen für die Open-Macro DEFINE tasten BYTEPORT[1] 'Tasten werden per BYTEPORT abgefragt DEFINE led0 PORT[1] 'an PORT[1] eine LED (per 4049) und ein Taster DEFINE led1 PORT[2] 'an PORT[2] eine LED (per 4049) und ein Taster DEFINE led2 PORT[4] 'an PORT[4] eine LED (per 4049) und ein Taster DEFINE led3 PORT[5] 'an PORT[5] eine LED (per 4049) und ein Taster DIM ton WORD 'Variable für die Tonhöhe DIM a,anzahl,t,nr,zustand,z,fail BYTE ' --------------------------------------------------------------------------- ' Systemerweiterung für Tonausgabe an PORT[16] (gleich TCH3) per Interrupt ' Hinweis: Das Hauptprogramm startet hinter dem Label "main". ' Die folgende PROCEDURE steht am Programmbeginn und es ist das Schlüssel- ' wort INLASM angegeben. Es handelt sich daher um eine IIAR. Also um eine ' Assembler-Interruptroutine, die bei einem aktivierten User-Interrupt ge- ' startet wird. Wenn mehr als eine IIAR in das System eingebunden werden ' soll, muß die Interruptquelle unterschieden und gegebenenfalls zur ' nächsten IIAR gesprungen werden (siehe dazu zum Beispiel DTMFRECT.BAS). PROCEDURE iiar_tim3 INLASM ! pusha 'Platz für Highbyte ! lda TCH3L ! add ton+1 ! pusha 'Lowbyte ! pusha ! lda TCH3H ! adc ton ! sta 3,sp 'Highbyte ! tax ! popa ! sub #$e8 ! pusha ! poph 'Lowbyte ins H-Register ! txa ! sbc #$03 ! bcs iiar_tim1_1 ! sta 2,sp 'Highbyte ! popa ! pushh #iiar_tim1_1 ! popx ! poph ! sthx TCH3H ! clc 'Diese Assemblerroutine übergibt nun wieder an ! rts 'das Betriebssystem. Dazu wird Carry geloescht. END PROCEDURE PROCEDURE init_tim3 INLASM ! bset bTSTOP,TSC 'Before changing a channel function by writing to ! bset bTRST,TSC ' the MSxB or MSxA bit, set the TSTOP and TRST bits. ! mov #&b01010100,TSC3 ! lda #$ff ! sta TCH3H 'TSC3: CH3F CH3IE 0 MS3A ELS3B ELS3A TOV3 CH3MAX ! sta TCH3L ! bclr bTSTOP,TSC ! rts END PROCEDURE PROCEDURE setbeep(ton) IF ton=0 THEN TCH3H=&hff 'Tonausgabe deaktivieren TCH3L=&hff ELSE TCH3H=0 'Tonausgabe aktivieren TCH3L=0 END IF RETURN END PROCEDURE ' --------------------------------------------------------------------------- ' Hauptprogramm #main UIRTim3=ON 'wir wollen den Timer3-User-Interrupt nutzen init_tim3 'Timer3 initialisieren und Interrupt aktivieren anzahl=1 fail=OFF WHILE TRUE FOR a=0 to 3 setled a,OFF NEXT a PAUSE 40 achtung PAUSE 40 RANDOMIZE 0 'für andere Zufallszahlen diese Zahl ändern FOR a=1 TO anzahl z=(RAND SHR 14) AND 3 'Zufallszahlen 0..3 setled z,ON setbeep ((3-z)*15+25) PAUSE 30 setled z,OFF setbeep 0 PAUSE 40 NEXT a DEACT led0 DEACT led1 DEACT led2 DEACT led3 achtung RANDOMIZE 0 'für andere Zufallszahlen diese Zahl ändern FOR a=1 TO anzahl PAUSE 5 REPEAT 'Warten, bis eine Taste gedrückt t=tasten UNTIL (t AND &b011011)<>&b011011 IF (t AND &b000001)=0 THEN t=0 'Taste an PORT[1] gedrückt ELSE IF (t AND &b000010)=0 THEN t=1 'Taste an PORT[2] gedrückt ELSE IF (t AND &b001000)=0 THEN t=2 'Taste an PORT[4] gedrückt ELSE t=3 'Taste an PORT[5] gedrückt END IF z=(RAND SHR 14) AND 3 'Zufallszahlen 0..3 IF t=z THEN setbeep ((3-t)*15+25) ELSE setbeep 999 fail=ON 'wird auf 255 gesetzt, da "fail" Byteformat hat! END IF PAUSE 5 REPEAT 'Warten, bis alle Tasten losgelassen UNTIL (tasten AND &b011011)=&b011011 setbeep 0 IF fail THEN GOTO exit NEXT a ADD anzahl,1 WEND #exit End2Host=ON END ' --------------------------------------------------------------------------- ' Eine LED auf einen bestimmten Zustand (ON oder OFF) setzen PROCEDURE setled(nr,zustand) IF nr=0 THEN led0=zustand ELSE IF nr=1 THEN led1=zustand ELSE IF nr=2 THEN led2=zustand ELSE led3=zustand END IF RETURN END PROCEDURE ' --------------------------------------------------------------------------- ' Tonsignal, das den Anwender aufmerksam machen soll PROCEDURE achtung FOR a=0 to 1 setbeep 15 '50000/(2*15) = 1667 Hz PAUSE 10 setbeep 0 PAUSE 10 NEXT a RETURN END PROCEDURE Viel Spaß mit den OM-Controllern Dietmar Meine Homepage: http://ccintern.dharlos.de |
Antwort schreiben |