Das Open-Control-Projekt - Die Alternative zur C-Control-I


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: