Der Nachfolger des WDR-Computerclub mit Wolfgang Back und Wolfgang Rudolph - ...und immer ein Bit übrigbehalten!


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Spiel "Senso" Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 19.04.2012 19:10)
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Mini M-Unit, Open-Mini Station, sonstige
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

Bisherige Antworten: