$m100000
main
'
> PROCEDURE main
  '
  DIM q_ras%(5),z_ras%(5),par%(8)
  planes&=1
  ~GRAF_MOUSE(0,0)
  ' --------------------------------------------------------------
  datum$="26.09.1987"
  CLS
  anfang=TIMER
  tippzahl=0
  musik=TRUE
  DIM a$(150),x1(150),x2(150),y1(150),y2(150)
  DIM stufe(150),art$(150),shift(150),finger(150)
  DIM kleinkon$(50),grosskon$(50),zeich$(50),vok$(50)
  DIM finger$(9),pfeil_x(9),pfeil_y(9)
  DIM spielzeichen$(29)
  GOSUB bildbau
  DEFTEXT 1,16,0,32
  TEXT 125,50,"Zehn-Finger-Lehrgang"
  DEFTEXT 1,0,0,4
  TEXT 40,100,"programmiert in GfA-BASIC von Heiko Mller, Mozartstraže 17, 2905 Edewecht"
  TEXT 40,115,"Version vom "+datum$+", berarbeitet am 08.06.93/04.03.94 von Gregor Duchalski@do.maus.ruhr.de"
  DO
    PRINT AT(5,24);"Erkl„rung mit der Taste [Help]      oder      Starten mit der Taste [F1]"
    a$=INKEY$
    EXIT IF ASC(LEFT$(a$))=0 AND (ASC(RIGHT$(a$))=98 OR ASC(RIGHT$(a$))=59)
    PAUSE 15
    PRINT AT(5,24);"Erkl„rung mit der Taste             oder      Starten mit der Taste      "
    a$=INKEY$
    EXIT IF ASC(LEFT$(a$))=0 AND (ASC(RIGHT$(a$))=98 OR ASC(RIGHT$(a$))=59)
    PAUSE 15
  LOOP
  IF ASC(RIGHT$(a$))=98
    GOSUB erklaerung
  ENDIF
hier_gehts_los:
  GOSUB stufe_eingeben
  IF stufe<9
    DO
      GOSUB uebungsstring_erstellen
      GOSUB ueben
      EXIT IF stufe=9
    LOOP
  ENDIF
  GOSUB text_abschreiben
  GOTO hier_gehts_los
  '
RETURN
'
> PROCEDURE erklaerung
  CLS
  PRINT
  PRINT " Gleich wird Dir ein Bild gezeigt, auf dem Du die Schwierigkeitsstufe aus-"
  PRINT " w„hlen sollst. Die Buchstaben, die bei der gew„hlten Stufe gebt werden"
  PRINT " sollen, sind schwarz unterlegt."
  PRINT
  PRINT " Die Auswahl kannst Du treffen, indem Du einfach auf die Zahlentaste mit"
  PRINT " der gewnschten Stufe tippst. Es ist auch m”glich, die Stufe mit der Maus"
  PRINT " oder den Pfeiltasten zu bestimmen. Wenn Du Deine Wahl getroffen hast,"
  PRINT " tippst Du auf die Taste [Return] oder klickst das Return-Feld mit der Maus"
  PRINT " an."
  PRINT
  PRINT " Danach wirst Du gefragt, ob Du eine Einfhrung in diese Stufe wnscht. Du"
  PRINT " kannst die Antwort durch Bet„tigung der Tasten [J] oder [N] geben oder"
  PRINT " auch wieder durch Anklicken der entsprechenden K„sten mit der Maus."
  PRINT
  PRINT " Wenn Du diese Frage mit >Ja< beantwortest, bekommst Du auf dem Monitor"
  PRINT " gezeigt, welche Taste mit welchem Finger getippt wird. Wenn Du meinst,"
  PRINT " daž Du die Tasten gut genug finden kannst, beginnst Du mit der Taste [Esc]"
  PRINT " den dazugeh”rigen šbungstext."
  PRINT
  PRINT " Regle bitte die Lautst„rke so, daž Du die Tastenbet„tigung h”ren kannst."
  PRINT " (am besten gleich mit irgendeiner Taste ausprobieren)"
  PRINT
  PRINT " Das Programm beginnt nun mit einem Druck auf die Taste [F1].";
  REPEAT
    a$=INKEY$
  UNTIL ASC(LEFT$(a$))=0 AND ASC(RIGHT$(a$))=59
RETURN
> PROCEDURE uebungsstring_erstellen
  ueb$=""
  IF stufe<9
    REPEAT
      wort$=""
      IF stufe>6
        wort$=STR$(RANDOM(100))+" "
      ENDIF
      IF stufe>5
        wort$=wort$+grosskon$(RANDOM(gko))
      ELSE
        wort$=wort$+kleinkon$(RANDOM(kko))
      ENDIF
      wort$=wort$+vok$(RANDOM(vo))
      wort$=wort$+kleinkon$(RANDOM(kko))
      wort$=wort$+vok$(RANDOM(vo))
      wort$=wort$+kleinkon$(RANDOM(kko))
      wort$=wort$+vok$(RANDOM(vo))
      IF stufe>4
        wort$=wort$+kleinkon$(RANDOM(kko))
        wort$=wort$+zeich$(RANDOM(ze))
      ENDIF
      IF LEFT$(wort$,1)<>" "
        wort$=wort$+" "
      ENDIF
      ueb$=ueb$+wort$
    UNTIL LEN(ueb$)>65
    ueb$=LEFT$(ueb$,65)
  ENDIF
RETURN
> PROCEDURE ueben
  tippanfang=TIMER
  l=LEN(ueb$)
  IF RIGHT$(ueb$,1)=" "
    DEC l
  ENDIF
  fehler=0
  CLS
  PRINT AT(8,2);"Schwierigkeitsstufe ";stufe
  PRINT AT(8,7);"šbungstext bitte abschreiben:"
  PRINT AT(8,19);"[Esc] = Abbruch"
  RBOX 40,120,600,220
  PRINT CHR$(27);"e"            ! Cursor einschalten
  PRINT AT(8,10);ueb$
  PRINT AT(8,12);
  FOR s=1 TO l
    x$=MID$(ueb$,s,1)
    wiederholung=0
    REPEAT
      REPEAT
        a$=INKEY$
      UNTIL a$>""
      IF a$<>x$ AND ASC(a$)<>27
        PRINT CHR$(27);"j";      ! Cursorposition merken
        PRINT a$;
        PRINT CHR$(27);"k";      ! an gespeicherte Cursorposition gehen
        OUT 2,7
        INC fehler
        INC wiederholung
        INC fehlerzahl
        IF wiederholung>1
          sget(bild%)
          PRINT CHR$(27);"f";      ! Cursor ausschalten
          PRINT CHR$(27);"j";      ! Cursorposition merken
          GOSUB hilfe
          PRINT CHR$(27);"e";      ! Cursor anschalten
          PRINT CHR$(27);"k";      ! an gespeicherte Cursorposition gehen
          sput(bild%)
        ENDIF
      ENDIF
      IF ASC(a$)=27 AND s<50
        PRINT " - abgebrochen"
      ENDIF
      EXIT IF ASC(a$)=27
    UNTIL a$=x$
    EXIT IF ASC(a$)=27
    PRINT x$;
    INC tippzahl
  NEXT s
  tippzeit=tippzeit+TIMER-tippanfang
  IF fehler=0 AND ASC(a$)<>27 AND musik=TRUE
    SOUND 1,15,1,4,4
    SOUND 1,15,5,4,5
    SOUND 1,15,8,4,5
    FOR i=15 DOWNTO 0
      SOUND 1,i,1,5,5
    NEXT i
  ENDIF
  PRINT CHR$(27);"f"                              ! Cursor ausschalten
  PRINT AT(8,16);fehler;" Fehler"
  PRINT AT(8,7);"                             "
abfrage:
  PRINT AT(8,18);"[Return] = Neuer šbungstext"
  PRINT AT(8,19);"[ F1 ]   = Programmende"
  PRINT AT(8,20);"[ F2 ]   = Schwierigkeitsstufe „ndern"
  PRINT AT(8,21);"[ F3 ]   = Zwischenspiel"
  PRINT AT(8,22);"[ F4 ]   = Statistik"
  IF fehler=0 AND musik AND s>l
    PRINT AT(8,23);"[ F10 ]  = Musik ausschalten"
  ENDIF
  REPEAT
    a$=INKEY$
    rs=ASC(RIGHT$(a$))
  UNTIL ASC(LEFT$(a$))=0 AND ((rs>58 AND rs<63) OR rs=68) OR ASC(a$)=13
  IF ASC(LEFT$(a$))=0 AND rs=59
    GOSUB aufhoeren
  ENDIF
  IF ASC(LEFT$(a$))=0 AND rs=60
    GOSUB stufe_eingeben
  ENDIF
  IF ASC(LEFT$(a$))=0 AND rs=61
    GOSUB tippen
    GOTO abfrage
  ENDIF
  IF ASC(LEFT$(a$))=0 AND rs=62
    GOSUB statistik
    GOTO abfrage
  ENDIF
  IF ASC(LEFT$(a$))=0 AND rs=68
    IF musik
      ALERT 0,"Die Musik kann am Ende einer|šbungszeile mit der Taste [F10]|wieder eingeschaltet werden.| ",1," Return ",dummy
      PRINT AT(8,23);SPACE$(30)
    ENDIF
    musik=NOT musik
    GOTO abfrage
  ENDIF
RETURN
> PROCEDURE bildbau
  FOR s=0 TO 8
    READ finger$(s),pfeil_x(s),pfeil_y(s)
  NEXT s
  DEFTEXT 1,0,0,13
  s=0
  DO
    INC s
    READ a$(s),x1(s),x2(s),y1(s),y2(s)
    READ stufe(s),art$(s),shift(s),finger(s)
    EXIT IF a$(s)="grossende"
    BOX x1(s),y1(s),x2(s),y2(s)
    TEXT x1(s)+5,y1(s)+15,a$(s)
  LOOP
  '
  a$(3)=CHR$(34)           ! Changed by GD
  '
  COLOR 0
  LINE 576,210,624,210     ! Unterteilung in Returntaste l”schen
  COLOR 1
  DEC s
  DO
    INC s
    READ a$(s),x1(s),x2(s),y1(s),y2(s)
    READ stufe(s),art$(s),shift(s),finger(s)
    EXIT IF a$(s)="ende"
    BOX x1(s),y1(s),x2(s),y2(s)
    IF LEN(a$(s))<2
      TEXT x1(s)+5,y1(s)+30,a$(s)
    ENDIF
  LOOP
  sget(tastbild%)
  GET 515,290,585,330,capslock$
  FOR s=1 TO 29
    READ spielzeichen$(s)
  NEXT s
RETURN
> PROCEDURE speicher_einlesen
  s=-1
  vo=-1
  kko=-1
  gko=-1
  ze=-1
  DO
    INC s
    IF stufe(s)<=stufe
      IF art$(s)="vo" AND NOT shift(s)
        INC vo
        vok$(vo)=a$(s)
      ENDIF
      IF art$(s)="ko" AND shift(s)
        INC gko
        grosskon$(gko)=a$(s)
      ENDIF
      IF art$(s)="ko" AND NOT shift(s)
        INC kko
        kleinkon$(kko)=a$(s)
      ENDIF
      IF art$(s)="ze"
        INC ze
        zeich$(ze)=a$(s)
      ENDIF
    ENDIF
    EXIT IF a$(s)="ende"
  LOOP
  INC vo
  INC gko
  INC kko
  INC ze
RETURN
> PROCEDURE hilfe
  DEFLINE 1,5,0,1
  sput(tastbild%)
  IF einfuehrung
    PRINT AT(5,24);"Einfhrung in Stufe ";stufe;
    PRINT AT(47,24);"[Esc] = Start des šbungstextes";
    IF stufe=6
      PRINT AT(5,2);" Die Shift-Tasten werden mit den kleinen Fingern gehalten."
    ENDIF
    IF stufe=0
      PRINT AT(5,2);"Das Zeichen, das oben eingerahmt ist, soll getippt werden. Sieh"
      PRINT AT(5,3);"dabei m”glichst wenig auf das Tastenbild unten auf dem Bildschirm!"
    ENDIF
  ENDIF
  DEFTEXT 1,0,0,32
  TEXT 300,100,x$
  RBOX 290,65,325,110
  GRAPHMODE 3
  such=0
  REPEAT
    INC such
  UNTIL a$(such)=x$
  DEFFILL 0,2,8
  PBOX x1(such),y1(such),x2(such),y2(such)
  f=finger(such)
  IF shift(such)
    IF f<5
      PBOX 535,250,605,290
    ELSE
      PBOX 35,250,95,290
    ENDIF
  ENDIF
  DEFFILL 1,1,1
  IF pfeil_x(f)<>x1(such) OR pfeil_y(f)<>y1(such)
    LINE pfeil_x(f)+20,pfeil_y(f)+20,x1(such)+20,y1(such)+20
  ENDIF
  GRAPHMODE 1
  DEFTEXT 1,16,0,13
  TEXT 450+400*(f<5),80,finger$(f)
capslock:
  cl=BIOS(11,-1) AND 16
  IF cl=16
    GRAPHMODE 3
    DEFFILL 1,2,1
    PBOX 516,291,584,329
  ELSE
    PUT 515,290,capslock$
  ENDIF
  GRAPHMODE 1
  capslock=FALSE
  daneben=0
  REPEAT
    REPEAT
      a$=INKEY$
      clo=BIOS(11,-1) AND 16
      IF clo<>cl
        capslock=TRUE
      ENDIF
      EXIT IF capslock
    UNTIL a$>""
    EXIT IF capslock
    IF a$<>x$
      INC daneben
      IF daneben>2
        IF cl=16
          DEFFILL 0,1,1
          DEFLINE 1,5,2,2
          GET 180,150,460,270,sicher$
          PBOX 180,150,460,270
          BOX 185,155,455,265
          PRINT AT(25,12);" Du hast mit der Taste CapsLock "
          PRINT AT(25,13);" auf Grožschreibung umgestellt! "
          PRINT AT(25,14);"                                "
          PRINT AT(25,15);"     Bitte zurckschalten!      ";
          REPEAT
            clo=BIOS(11,-1) AND 16
          UNTIL clo=0
          PUT 180,150,sicher$
          daneben=0
        ENDIF
      ENDIF
    ENDIF
  UNTIL a$=x$ OR ASC(a$)=27
  DEFLINE 1,1,0,0
  IF capslock
    GOTO capslock
  ENDIF
RETURN
> PROCEDURE stufe_eingeben
  '
  REPEAT
    CLS
    DEFLINE 1,1,2,2
    '
    IF stufenwahl%=0
      DEFTEXT 1,0,0,13
      PRINT AT(6,2);"Bitte Schwierigkeitsstufe ausw„hlen, dann [Return]"
      PRINT AT(6,5);"0     A S D F J K L ™                 Anf„nger"
      PRINT AT(6,7);"1     Q W E R U I O P"
      PRINT AT(6,9);"2     G H T Z"
      PRINT AT(6,11);"3     V B N M"
      PRINT AT(6,13);"4     Y X C , . -"
      PRINT AT(6,15);"5     Ž š ž"
      PRINT AT(6,17);"6     ! ? ; : _ und Grožschreibung"
      PRINT AT(6,19);"7     1 2 3 4 5 6 7 8 9 0 + * < >"
      PRINT AT(6,21);"8     ";CHR$(34);" Ý $ % & / ( ) = ' ` # ^       Profi"
      PRINT AT(6,23);"9     gedruckte Texte abschreiben"
      PRINT AT(63,5);"Return"
      GRAPHMODE 1
      FOR s=1 TO 10
        BOX 32,23+s*32,320,55+s*32
      NEXT s
      LINE 64,55,64,375
      BOX 480,55,560,87
      FOR s=0 TO 6
        TEXT 360,110+s*32,""
      NEXT s
      sget(stufenwahl%)
      '
    ELSE
      sput(stufenwahl%)
    ENDIF
    '
    DEFFILL 1,1,1
    GRAPHMODE 3
    PBOX 32,55,320,87+stufe*32
    '
    DO
      MOUSE x,y,k
      a$=INKEY$
      EXIT IF k=1 OR ASC(a$)=13
      EXIT IF ASC(a$)>47 AND ASC(a$)<59
      EXIT IF LEN(a$)=2 AND (RIGHT$(a$)="H" OR RIGHT$(a$)="P")
    LOOP
    '
    EXIT IF ASC(a$)=13
    '
    REPEAT
    UNTIL MOUSEK=0
    '
    IF ASC(a$)>47 AND ASC(a$)<58
      stufe=VAL(a$)
    ENDIF
    '
    IF k=1 AND x>32 AND x<320 AND y>55 AND y<375
      stufe=INT((y-23)/32)-1
    ENDIF
    '
    IF RIGHT$(a$)="H" AND stufe>0
      DEC stufe
    ENDIF
    '
    IF RIGHT$(a$)="P" AND stufe<9
      INC stufe
    ENDIF
    '
  UNTIL x>480 AND x<560 AND y>55 AND y<87
  '
  IF stufe<9
    GRAPHMODE 1
    DEFFILL 0,1,1
    PBOX 330,0,600,400
    GOSUB speicher_einlesen
    PRINT AT(6,2);SPACE$(60)
    PRINT AT(50,17);"Wnschst Du eine Einfhrung"
    PRINT AT(50,18);"in Stufe"'stufe'"?"
    PRINT AT(50,21);"  Ja     Nein"
    BOX 390,311,510,342
    LINE 450,311,450,342
    DO
      MOUSE x,y,k
      EXIT IF k=1 AND x>390 AND x<510 AND y>311 AND y<342
      s$=INKEY$
      EXIT IF s$="J" OR s$="j" OR s$="N" OR s$="n"
    LOOP
    IF s$="J" OR s$="j" OR (k=1 AND x<450)
      GOSUB einfuehrung
    ENDIF
  ENDIF
  '
RETURN
> PROCEDURE einfuehrung
  einfuehrung=TRUE
  DO
    RESTORE einfuehrung
    REPEAT
      REPEAT
        READ s,ueb$
      UNTIL s=stufe OR s=9
      IF s<9
        FOR s=1 TO LEN(ueb$)
          x$=MID$(ueb$,s,1)
          GOSUB hilfe
          EXIT IF ASC(a$)=27
        NEXT s
      ENDIF
    UNTIL ASC(a$)=27 OR s=9
    EXIT IF ASC(a$)=27
  LOOP
  einfuehrung=FALSE
  CLS
  PAUSE 20
RETURN
> PROCEDURE aufhoeren
  ' ALERT 2," Soll das Programm | wirklich beendet werden? ",2,"  ja  | nein ",antw
  ' IF antw=1
  schluss=TRUE
  GOSUB statistik
  END
  ' ENDIF
RETURN
> PROCEDURE statistik
  uebzeit=INT((TIMER-anfang)/200)
  stunden=INT(uebzeit/3600)
  minuten=INT(uebzeit/60)-stunden*60
  sekunden=uebzeit-stunden*60-minuten*60
  IF tippzeit>0
    tippquote=INT(tippzahl*12000/tippzeit)
  ENDIF
  IF tippzahl>0
    fehlerquote=INT((fehlerzahl/tippzahl*100)*10)/10
  ENDIF
  CLS
  PRINT AT(10,5);"Statistik"
  PRINT AT(10,8);"Du hast jetzt ";
  IF stunden>0
    PRINT stunden;" Stunden, ";
  ENDIF
  IF minuten>0 OR stunden>0
    PRINT minuten;" Minuten und ";
  ENDIF
  PRINT sekunden;" Sekunden"
  PRINT AT(10,9);"mit diesem Programm gearbeitet."
  PRINT AT(10,11);"In den šbungstexten hast Du insgesamt ";tippzahl;" Zeichen getippt. Dabei"
  PRINT AT(10,12);"hast Du durchschnittlich ";tippquote;" Anschl„ge pro Minute geschafft."
  PRINT AT(10,14);"Insgesamt hast Du ";fehlerzahl;" Fehler gemacht."
  PRINT AT(10,15);"Das entspricht einer Fehlerquote von ";fehlerquote;"%"
  RBOX 50,55,590,265
  LINE 50,90,590,90
  IF schluss
    REPEAT
    UNTIL INKEY$>""
  ENDIF
RETURN
> PROCEDURE tippen
  CLS
  DEFTEXT 1,16,0,32
  PRINT AT(4,5);"Es kommt darauf an, bis zum Ablauf der Zeit"
  PRINT AT(4,6);"m”glichst viele der Zufallsbuchstaben zu tippen."
  PRINT AT(4,7);"Grož- oder Kleinschreibung spielt keine Rolle."
  PRINT AT(4,9);"Mit der Leertaste geht's los."
  RESTORE spielstufen
  FOR s=0 TO stufe
    READ x
  NEXT s
  REPEAT
  UNTIL INKEY$=" "
  CLS
  REPEAT
    zeit=1000
    treffer=0
    BOX 280,252,340,274
    DO
      PRINT AT(35,8);treffer'"Treffer  "
      x$=spielzeichen$(RANDOM(x)+1)
      TEXT 300,200,x$
      REPEAT
        a$=INKEY$
        ' ----------------------
        IF a$="„"          ! diese Zeilen ersetzen das Kommando A$=Upper$(A$),
          a$="Ž"           ! das leider nicht vom Compiler verstanden wird.
        ENDIF
        IF a$="”"
          a$="™"
        ENDIF
        IF a$=""
          a$="š"
        ENDIF
        IF ASC(a$)>96 AND ASC(a$)<123
          a$=CHR$(ASC(a$)-32)
        ENDIF
        ' ----------------------
        DEC zeit
        PRINT AT(38,17);zeit;'
        EXIT IF zeit<1
        PAUSE 1
      UNTIL a$=x$ OR ASC(a$)=27
      INC treffer
      EXIT IF zeit<1 OR ASC(a$)=27
    LOOP
    EXIT IF ASC(a$)=27
    FOR s=15 DOWNTO 0
      SOUND 1,s,1,4,4
    NEXT s
    PRINT AT(4,22);"nochmal ?  (J/N)"
    REPEAT
      a$=INKEY$
    UNTIL a$="J" OR a$="N" OR a$="j" OR a$="n"
  UNTIL a$="N" OR a$="n"
  CLS
RETURN
> PROCEDURE text_abschreiben
  CLS
  PRINT AT(15,15);"[ Help ]   = Erkl„rung        (oder beide Maustasten)"
  PRINT AT(15,16);"[ Return ] = weiter           (oder rechte Maustaste)"
  DO
    a$=INKEY$
    EXIT IF (ASC(LEFT$(a$))=0 AND (ASC(RIGHT$(a$))=98)) OR ASC(a$)=13
    MOUSE x,y,k
    EXIT IF k>1
  LOOP
  IF ASC(RIGHT$(a$))=98 OR k=3
    GOSUB erklaerung2
  ENDIF
  IF ASC(a$)=27
    GOTO abbruch
  ENDIF
  REPEAT
    REPEAT
      CLS
      PRINT
      PRINT " Bitte die gewnschte šbungstext-Datei mit der linken Maustaste anklicken,"
      PRINT " dann das Feld [OK] anklicken oder [Return] tippen."
      PRINT AT(1,24);" šbungstexte enthalten das Anh„ngsel .UEB. Sie befinden sich normalerweise"
      PRINT " im Ordner UEBTEXTE, der durch Anklicken ge”ffnet wird.";
      FILESELECT "\*.ueb","",b$
      EXIT IF NOT EXIST(b$)
      OPEN "I",#1,b$
      uebungstext$=""
      s=0
      CLS
      PRINT
      DO
        INC s
        LINE INPUT #1;text$
        uebungstext$=uebungstext$+text$+CHR$(13)
        IF s<24
          PRINT 'text$;CHR$(13);CHR$(10);
        ENDIF
        EXIT IF MOUSEK>1 OR EOF(#1)
      LOOP
      CLOSE #1
      GRAPHMODE 1
      DEFFILL 0,1,1
      DEFLINE 1,5,2,2
      PRBOX 150,150,450,270
      RBOX 150,150,450,270
      l=LEN(uebungstext$)
      WHILE ASC(RIGHT$(uebungstext$,1))<33
        uebungstext$=LEFT$(uebungstext$,l-1)
        DEC l
      WEND
      PRINT AT(22,11);"Diesen Text habe ich eingelesen."
      PRINT AT(22,12);"Er hat ";l;" Zeichen."
      PRINT AT(22,14);"Ist das der richtige?"
      PRINT AT(22,16);"  Ja    Nein"
      DEFLINE 1,1,2,2
      BOX 170,235,270,260
      LINE 220,235,220,260
      DO
        a$=INKEY$
        EXIT IF a$="j" OR a$="J" OR a$="n" OR a$="N"
        MOUSE x,y,k
        EXIT IF x>170 AND x<270 AND y>235 AND y<260 AND k=1
      LOOP
    UNTIL a$="J" OR a$="j" OR (k=1 AND x<235)
    EXIT IF NOT EXIST(b$)
    tippanfang=TIMER
    fehler=0
    daneben=FALSE
    CLS
    PRINT " Schreibe bitte den gedruckten šbungstext ab.                   [Esc] = Abbruch"
    PRINT CHR$(27);"e"            ! Cursor einschalten
    zeile=0
    PRINT " ";
    FOR s=1 TO l
      INC zeile
      x$=MID$(uebungstext$,s,1)
      REPEAT
        REPEAT
          a$=INKEY$
        UNTIL a$>""
        IF a$=" " AND x$=CHR$(13) AND zeile>50
          a$=x$
        ENDIF
        EXIT IF ASC(a$)=27
        IF a$<>x$ AND ASC(a$)<>27
          daneben=TRUE
          OUT 2,7
          INC fehler
          INC wiederholung
          INC fehlerzahl
          PRINT CHR$(27);"j";      ! Cursorposition merken
          PRINT a$;
          PRINT CHR$(27);"k";      ! an gespeicherte Cursorposition gehen
        ENDIF
        EXIT IF ASC(a$)=27
      UNTIL a$=x$
      EXIT IF ASC(a$)=27
      IF daneben
        daneben=FALSE
        IF x$<>CHR$(13)
          PRINT CHR$(27);"p";      ! inverse Darstellung einschalten
          PRINT x$;
          PRINT CHR$(27);"q";      ! inverse Darstellung ausschalten
        ELSE
          zeile=0
          PRINT CHR$(27);"p";      ! inverse Darstellung einschalten
          PRINT " ";
          PRINT CHR$(27);"q";      ! inverse Darstellung ausschalten
          PRINT x$;CHR$(10);" ";
        ENDIF
      ELSE
        PRINT x$;
        IF x$=CHR$(13)
          zeile=0
          PRINT CHR$(10);" ";
        ENDIF
      ENDIF
      IF (x$=" " OR x$="-") AND MID$(uebungstext$,(s+1),1)=CHR$(13)
        INC s
        zeile=0
        PRINT CHR$(13);CHR$(10);" ";
      ENDIF
      INC tippzahl
    NEXT s
    tippzeit=tippzeit+TIMER-tippanfang
    PRINT CHR$(27);"f"                              ! Cursor ausschalten
    PRINT
    PRINT 'fehler;" Fehler     ";
  was_nun:
    PRINT " [Return] = Neuer Text    [ F2 ] = Neue Schwierigkeitsstufe"
    PRINT " [ F1 ] = Programmende    [ F3 ] = Zwischenspiel    [ F4 ] = Statistik;"
    REPEAT
      a$=INKEY$
      rs=ASC(RIGHT$(a$))
      IF ASC(LEFT$(a$))=0 AND rs=59
        GOSUB aufhoeren
      ENDIF
      IF ASC(LEFT$(a$))=0 AND rs=61
        GOSUB tippen
        PRINT AT(1,20)
        GOTO was_nun
      ENDIF
      IF ASC(LEFT$(a$))=0 AND rs=62
        GOSUB statistik
        PRINT AT(1,20)
        GOTO was_nun
      ENDIF
    UNTIL ASC(a$)=13 OR rs=60
  UNTIL rs=60
abbruch:
RETURN
> PROCEDURE erklaerung2
  CLS
  PRINT
  PRINT "   Wenn Du in dieser Schwierigkeitsstufe arbeiten willst, brauchst Du"
  PRINT "   ausgedruckte Texte zum Abschreiben. Die Texte befinden sich auf dieser"
  PRINT "   Diskette. Wenn Du sie nicht in ausgedruckter Form vorliegen hast,"
  PRINT "   kannst Du an dieser Stelle nicht weitermachen."
  PRINT "   Tippe dann die Taste [Esc]."
  PRINT
  PRINT "   Beim Abschreiben kannst Du am Zeilenende mit [Return] in die n„chste"
  PRINT "   Zeile kommen - wie bei einer Schreibmaschine - oder einfach mit einem"
  PRINT "   Leeranschlag zum n„chsten Wort weitergehen - wie bei einem Textver-"
  PRINT "   arbeitungsprogramm. Dies funktioniert allerdings nicht am Ende eines"
  PRINT "   Absatzes (mitten in der Zeile)!"
  PRINT
  PRINT "   Fehler werden durch einen Glockenton signalisiert. Das Programm ar-"
  PRINT "   beitet erst weiter, wenn das richtige Zeichen getippt ist, jedoch"
  PRINT "   bleibt die Stelle, an der der Fehler gemacht wurde, markiert."
  ' žžžžžžžžž
  PRINT
  PRINT "   Das Ausdrucken der šbungstexte geht am besten mit Hilfe eines Textver-"
  PRINT "   arbeitungsprogramms. Zur Not geht es auch vom Desktop aus. Wie das"
  PRINT "   geht, findest Du in der Bedienungsanleitung des Computers. Bei dieser"
  PRINT "   Ausdruckart wird aber wahrscheinlich das ž (und vielleicht auch die"
  PRINT "   Umlaute „, ”  und ) nicht richtig ausgedruckt."
  ' žžžžžžžžž
  PRINT
  PRINT "   [Return]  = šbungstext aussuchen      [Esc] = Abbruch";
  DO
    a$=INKEY$
    EXIT IF ASC(a$)=27 OR ASC(a$)=13
  LOOP
RETURN
'
> PROCEDURE daten
  '
  ' ##########
  DATA Daumen,155,290,kleiner Finger,115,210,Ringfinger,155,210,Mittelfinger,195,210,Zeigefinger,235,210
  DATA Zeigefinger,355,210,Mittelfinger,395,210,Ringfinger,435,210,kleiner Finger,475,210
  ' ##########
  ' Reihenfolge der Daten: Zeichen, X-Wert oben links, X-Wert unten rechts,
  '                        Y-Wert oben links, Y-Wert unten rechts,
  '                        Stufe, Art, Shift oder nicht, Fingernummer
  ' ########## obere Reihe
  DATA Esc,35,85,130,170,9,9,9,9
  DATA !,85,125,130,170,6,ze,-1,1
  DATA "",125,165,130,170,8,ze,-1,1
  DATA Ý,165,205,130,170,8,ze,-1,2
  DATA $,205,245,130,170,8,ze,-1,3
  DATA %,245,285,130,170,8,ze,-1,4
  DATA &,285,325,130,170,8,ze,-1,4
  DATA /,325,365,130,170,8,ze,-1,5
  DATA (,365,405,130,170,8,ze,-1,5
  DATA ),405,445,130,170,8,ze,-1,6
  DATA =,445,485,130,170,8,ze,-1,7
  DATA ?,485,525,130,170,6,ze,-1,8
  DATA `,525,565,130,170,8,ze,-1,8
  DATA ^,565,605,130,170,8,ze,-1,8
  ' ########## zweite Reihe von oben
  DATA Tab,35,105,170,210,9,9,9,9
  DATA Q,105,145,170,210,9,ko,-1,1
  DATA W,145,185,170,210,6,ko,-1,2
  DATA E,185,225,170,210,6,vo,-1,3
  DATA R,225,265,170,210,6,ko,-1,4
  DATA T,265,305,170,210,6,ko,-1,4
  ' DATA Z,305,345,170,210,6,ko,-1,5
  ' Ge„ndert GD:
  DATA Z,305,345,170,210,6,ko,-1,4
  DATA U,345,385,170,210,6,vo,-1,5
  DATA I,385,425,170,210,6,vo,-1,6
  DATA O,425,465,170,210,6,vo,-1,7
  DATA P,465,505,170,210,6,ko,-1,8
  DATA š,505,545,170,210,6,vo,-1,8
  DATA *,545,585,170,210,7,ze,-1,8
  DATA   ,585,625,170,210,9,9,9,9
  ' ########### dritte Reihe von oben
  DATA Control,35,115,210,250,9,9,9,9
  DATA A,115,155,210,250,6,vo,-1,1
  DATA S,155,195,210,250,6,ko,-1,2
  DATA D,195,235,210,250,6,ko,-1,3
  DATA F,235,275,210,250,6,ko,-1,4
  DATA G,275,315,210,250,6,ko,-1,4
  DATA H,315,355,210,250,6,ko,-1,5
  DATA J,355,395,210,250,6,ko,-1,5
  DATA K,395,435,210,250,6,ko,-1,6
  DATA L,435,475,210,250,6,ko,-1,7
  DATA ™,475,515,210,250,6,vo,-1,8
  DATA Ž,515,555,210,250,6,vo,-1,8
  DATA Return,555,625,210,250,9,9,9,9
  ' ########## vierte Reihe von oben
  DATA Shift,35,95,250,290,9,9,9,9
  DATA >,95,135,250,290,7,ze,-1,1
  DATA Y,135,175,250,290,6,vo,-1,1
  DATA Y,135,175,250,290,6,ko,-1,1
  DATA X,175,215,250,290,6,ko,-1,2
  DATA C,215,255,250,290,6,ko,-1,3
  DATA V,255,295,250,290,6,ko,-1,4
  DATA B,295,335,250,290,6,ko,-1,4
  DATA N,335,375,250,290,6,ko,-1,5
  DATA M,375,415,250,290,6,ko,-1,5
  DATA ;,415,455,250,290,6,ze,-1,6
  DATA :,455,495,250,290,6,ze,-1,7
  DATA _,495,535,250,290,6,ze,-1,8
  DATA Shift,535,605,250,290,9,9,9,9
  ' ########### unterste Reihe
  DATA Altern,95,155,290,330,9,9,9,9
  DATA  ,155,515,290,330,0,9,0,0
  DATA CapsLock,515,585,290,330,9,9,9,9
  DATA grossende,0,0,0,0,0,0,0,0
  ' ########### obere Reihe
  DATA 1,85,125,130,170,7,za,0,1
  DATA 2,125,165,130,170,7,za,0,1
  DATA 3,165,205,130,170,7,za,0,2
  DATA 4,205,245,130,170,7,za,0,3
  DATA 5,245,285,130,170,7,za,0,4
  DATA 6,285,325,130,170,7,za,0,4
  DATA 7,325,365,130,170,7,za,0,5
  DATA 8,365,405,130,170,7,za,0,5
  DATA 9,405,445,130,170,7,za,0,6
  DATA 0,445,485,130,170,7,za,0,7
  DATA ž,485,525,130,170,7,ze,0,8
  DATA ',525,565,130,170,8,ze,0,8
  DATA #,565,605,130,170,8,ze,0,8
  ' ########## zweite Reihe
  DATA q,105,145,170,210,9,ko,0,1
  DATA w,145,185,170,210,1,ko,0,2
  DATA e,185,225,170,210,1,vo,0,3
  DATA r,225,265,170,210,1,ko,0,4
  DATA t,265,305,170,210,2,ko,0,4
  ' DATA z,305,345,170,210,2,ko,0,5     ! Changed by GD
  DATA z,305,345,170,210,2,ko,0,4
  DATA u,345,385,170,210,1,vo,0,5
  DATA i,385,425,170,210,1,vo,0,6
  DATA o,425,465,170,210,1,vo,0,7
  DATA p,465,505,170,210,1,ko,0,8
  DATA ,505,545,170,210,5,vo,0,8
  DATA +,545,585,170,210,7,ze,0,8
  ' ########## dritte Reihe von oben
  DATA a,115,155,210,250,0,vo,0,1
  DATA s,155,195,210,250,0,ko,0,2
  DATA d,195,235,210,250,0,ko,0,3
  DATA f,235,275,210,250,0,ko,0,4
  DATA g,275,315,210,250,2,ko,0,4
  DATA h,315,355,210,250,2,ko,0,5
  DATA j,355,395,210,250,0,ko,0,5
  DATA k,395,435,210,250,0,ko,0,6
  DATA l,435,475,210,250,0,ko,0,7
  DATA ”,475,515,210,250,0,vo,0,8
  DATA „,515,555,210,250,5,vo,0,8
  ' ############ vierte Reihe von oben
  DATA <,95,135,250,290,7,ze,0,1
  DATA y,135,175,250,290,4,vo,0,1
  DATA x,175,215,250,290,4,ko,0,2
  DATA c,215,255,250,290,4,ko,0,3
  DATA v,255,295,250,290,3,ko,0,4
  DATA b,295,335,250,290,3,ko,0,4
  DATA n,335,375,250,290,3,ko,0,5
  DATA m,375,415,250,290,3,ko,0,5
  DATA ",",415,455,250,290,4,ze,0,6
  DATA .,455,495,250,290,4,ze,0,7
  DATA -,495,535,250,290,4,ze,0,8
  ' ########## Zeichen, die aus mehreren Buchstaben bestehen
  DATA Qu,0,0,0,0,6,ko,-1,9
  DATA qu,0,0,0,0,1,ko,0,9
  DATA tz,0,0,0,0,2,ko,0,9
  DATA st,0,0,0,0,2,ko,0,9
  DATA ck,0,0,0,0,4,ko,0,9
  DATA ng,0,0,0,0,3,ko,0,9
  DATA Ch,0,0,0,0,6,ko,-1,9
  DATA ch,0,0,0,0,4,ko,0,9
  DATA Sch,0,0,0,0,6,ko,-1,9
  DATA sch,0,0,0,0,4,ko,0,9
  DATA ei,0,0,0,0,1,vo,0,9
  DATA eu,0,0,0,0,1,vo,0,9
  DATA au,0,0,0,0,1,vo,0,9
  DATA ai,0,0,0,0,1,vo,0,9
  DATA „u,0,0,0,0,5,vo,0,9
  DATA ee,0,0,0,0,1,vo,0,9
  DATA oo,0,0,0,0,1,vo,0,9
  DATA ie,0,0,0,0,1,vo,0,9
  ' ##########
  DATA ende,0,0,0,0,0,0,0,0
  ' ##########
  DATA A,S,D,F,J,K,L,™,Q,W,E,R,U,I,O,P,T,Z,G,H,V,B,N,M,Y,X,C,V,Ž,š
spielstufen:
  DATA 8,16,20,24,27,29,29,29,29,29
  ' ##########
  ' Die folgenden Texte werden bei der Einfhrung eingelesen.
  ' Vorne steht die dazugeh”rige Schwierigkeitsstufe. Es drfen beliebig
  ' viele neue šbungszeilen hinzugefgt werden. Bei der Einfhrung werden
  ' sie der Reihe nach immer wieder von vorne eingelesen.
  ' ##########
einfuehrung:
  DATA 0,asdf”lkj fdsajkl” adsf”klj afkj”fls djslak”s j”sfklfa”
  DATA 1,aqswdefrjukilo”pasdfqwer”lkjpoiufrfjjuj”p”p”fqfaqaqf
  DATA 2,fgfgfgjhjhjhftftftjzjzjzfgtfrfjhzjatfagafatarf”j”h”z”ujsrzltahr”gu
  DATA 3,fvfbfvfbjmjnjmjnfrftfgfbfvjujzjhjnjmgztuvmbnfjghtzruzntumnhutfgrbfjuzht
  DATA 4,"aysxdck,l.”-fyfxfcj,j.j-scyak-.kc,daqayswsxdedcqyqyakik,lol.”p”p-p-”"
  DATA 5,"”„”„”p””p””p”ž”p”ž”j”j„jjpjžj-j”j-j„jjpjžk„k”kkpk-k”kžk"
  DATA 6,"AaBbCcdDeEFfGghHiIjJKkLlmMNnoOpPQqrRsSTtUuvVWwXxYyzZ„Ž”™š"
  DATA 6,"k,k;k,k;l.l:l.l:”-”_”-”-”aqa!aqa!ž”?”ž”?kik,lol.”p”-j-j_j„j?a!y!-_-?"
  DATA 7,a1a2s3d4f5f6j7k8l9”0+0*8as12df34fg56jk78l”90a<a>y<y>”„”+”*”ž”
  DATA 7,"aqa1a2aqayasws3swsxsded4dedcdfrf5frf6fvfjuj7juj8jmjkik9kik,klol0lol.l"
  DATA 7,1357924680+17364941349+7085461028157+93641467930353+04891349762
  DATA 8,"1!a2"s3Ýd4$f5%f6&g7/h8(9)k0=l'`”'`„#^+„#^+„"
  DATA 8,"a1aya2aya"frf5f%fvf6f&j8j7j(j/jn”ž”?”'”`””„”+”#”^”"
  DATA 9,9
  '
RETURN
' ------------------------------------------------------------------------------
> PROCEDURE sput(a%)
  '
  m_put(a%,0,0,3)
  '
RETURN
> PROCEDURE sget(VAR a%)
  LOCAL w&,h&
  '
  w&=MIN(640,SUCC(WORK_OUT(0)))
  h&=MIN(400,SUCC(WORK_OUT(1)))
  a%=@m_get(0,0,w&,h&)
  '
RETURN
'
> FUNCTION m_get(x&,y&,w&,h&)
$F%
LOCAL l&,a%,l%
'
IF w&>0 AND h&>0
  '
  l&=DIV(ADD(w&,15),16)         ! Breite in Words
  '                             ! Speicherbedarf...
  l%=ADD(MUL(MUL(ADD(l&,l&),h&),planes&),4)
  '
  a%=MALLOC(l%)
  '
  IF a%                         ! Hat geklappt
    '
    INT{a%}=w&                  ! Ausmaže vermerken
    INT{ADD(a%,2)}=h&
    '
    q_ras%(0)=0                 ! Adresse des Quellrasters
    '
    z_ras%(0)=ADD(a%,4)         ! Adresse des Zielrasters
    z_ras%(1)=MUL(l&,16)        ! Breite
    z_ras%(2)=h&                ! H”he
    z_ras%(3)=l&                ! Breite in Words
    z_ras%(4)=0                 ! Immer 0
    z_ras%(5)=planes&           ! Bitplanes
    '
    par%(0)=x&                  ! X1-Quelle
    par%(1)=y&                  ! Y1-Quelle
    par%(2)=ADD(x&,PRED(w&))    ! X2-Quelle
    par%(3)=ADD(y&,PRED(h&))    ! Y2-Quelle
    par%(4)=0                   ! X1-Ziel
    par%(5)=0                   ! Y1-Ziel
    par%(6)=PRED(w&)            ! X2-Ziel
    par%(7)=PRED(h&)            ! Y2-Ziel
    par%(8)=3                   ! Modus
    '
    BITBLT q_ras%(),z_ras%(),par%()
    '
  ENDIF
ENDIF
'
RETURN a%
ENDFUNC
> PROCEDURE m_put(a%,x&,y&,m&)
$F%
LOCAL w&,h&,l&
'
IF a%
  '
  w&=INT{a%}                    ! Ausmaže holen
  h&=INT{ADD(a%,2)}
  '
  l&=DIV(ADD(w&,15),16)         ! Breite in Words
  '
  q_ras%(0)=ADD(a%,4)           ! Adresse des Quellrasters
  q_ras%(1)=MUL(l&,16)          ! Breite
  q_ras%(2)=h&                  ! H”he
  q_ras%(3)=l&                  ! Breite in Words
  q_ras%(4)=0                   ! Immer 0
  q_ras%(5)=planes&             ! Bitplanes
  '
  z_ras%(0)=0                   ! Adresse des Zielrasters: Bildschirm
  '
  par%(0)=0                     ! X1-Quelle
  par%(1)=0                     ! Y1-Quelle
  par%(2)=PRED(w&)              ! X2-Quelle
  par%(3)=PRED(h&)              ! Y2-Quelle
  par%(4)=x&                    ! X1-Ziel
  par%(5)=y&                    ! Y1-Ziel
  par%(6)=ADD(x&,PRED(w&))      ! X2-Ziel
  par%(7)=ADD(y&,PRED(h&))      ! Y2-Ziel
  par%(8)=m&                    ! Modus
  '
  BITBLT q_ras%(),z_ras%(),par%()
  '
ENDIF
'
RETURN
