diff -urN mcd-0.2/cddev.c mcd-0.2a/cddev.c
--- mcd-0.2/cddev.c	Thu Jul 12 02:19:06 2001
+++ mcd-0.2a/cddev.c	Sun Jul 22 02:52:23 2001
@@ -20,37 +20,6 @@
 
 /* GLOBAL */
 
-/* looks a bit strange, but is a really simple (inefficient) thought */
-/* generates new t[i].rnd */
-void cd_initshuffle(struct mcd *cd) {
- register unsigned seed;
- int i;
-
- seed=(unsigned)time(NULL);
- for (i=1;i<=cd->title[1];i++) { /* title[1]==last */
-  seed+=i;srand(seed); /* stupid seed :P */
-  cd->t[i].rnd=1+(int)((double)cd->title[1]*rand()/(RAND_MAX+1.));
-  /* is number already given ? */
-  for (cd->t[0].rnd=1;cd->t[0].rnd<i;cd->t[0].rnd++) { /* t[0].rnd is count */
-   /* if so, break out and do it again */
-   if (cd->t[i].rnd==cd->t[cd->t[0].rnd].rnd) --i;
-  }
- }
- return;
-}
-
-void cd_randomize(struct mcd *cd) {
- register int i;
- struct track h[MCD_CDAUDIO_MAX+1];
- for (i=1;i<=cd->title[1];i++) h[i]=cd->t[i]; /* be sure */
- if (cd->method==M_SHUFFLE) {
-  for (i=1;i<=cd->title[1];i++) {cd->t[h[i].rnd]=h[i];}
- } else {
-  for (i=1;i<=cd->title[1];i++) {cd->t[h[i].nr]=h[i];}
- }
- return;
-}
-
 int cd_init(const char *cdpath, struct mcd *cd) {
  cd->fd=open(cdpath,O_RDONLY|O_NONBLOCK);
  if (cd->fd<0) return -1;
@@ -59,11 +28,10 @@
  return 0;
 }
 
-/* needs correct cd->fd; seems very efficient (no division qnd such) */
+/* needs correct cd->fd; seems efficient to me :) */
 int cd_readtracks(struct mcd *cd) {
- int i, sec, frame;
- struct track tmp[MCD_CDAUDIO_MAX]; /* Tmp Stuff */
- struct cdrom_tochdr cdth;        /* TocHdr Stuff */
+ struct cdrom_tochdr cdth; /* TocHdr Stuff */
+ int i, sec;
 
  if (ioctl(cd->fd, CDROMREADTOCHDR, &cdth)<0) {
   draw_status("can't read disc",1);
@@ -77,14 +45,12 @@
    draw_status("can't read disc",1);
    return -1;
   } else {
-   cd->t[i].nr=i;
-   cd->t[i].audio=cd->cdte[i].cdte_ctrl & CDROM_DATA_TRACK;
-   tmp[i].min=cd->cdte[i].cdte_addr.msf.minute;
-   tmp[i].sec=cd->cdte[i].cdte_addr.msf.second;
-   frame=cd->cdte[i].cdte_addr.msf.frame;
-   cd->t[i-1].min=tmp[i].min-tmp[i-1].min;
-   sec=(cd->t[i-1].sec=tmp[i].sec-tmp[i-1].sec);
-   if (frame>37) cd->t[i-1].sec++; /* rounding a bit :) */
+   cd->t[i].nr=i; /* for reordering after shuffle */
+   cd->t[i].audio = cd->cdte[i].cdte_ctrl & CDROM_DATA_TRACK;
+   cd->t[i-1].min=cd->cdte[i].cdte_addr.msf.minute-
+     cd->cdte[i-1].cdte_addr.msf.minute;
+   sec=(cd->t[i-1].sec=cd->t[i].sec - cd->t[i-1].sec);
+   if (cd->cdte[i].cdte_addr.msf.frame>37) cd->t[i-1].sec++; /* rounding a bit :) */
    if (sec<0) {
     cd->t[i-1].min--;cd->t[i-1].sec+=60;
    }
@@ -98,13 +64,12 @@
   return -1;
  } else {
   cd->t[i].nr=i;
-  cd->t[0].audio=cd->cdte[0].cdte_ctrl & CDROM_DATA_TRACK;
-  cd->t[0].min=cd->cdte[0].cdte_addr.msf.minute;
-  cd->t[0].sec=cd->cdte[0].cdte_addr.msf.second;
-  frame=cd->cdte[0].cdte_addr.msf.frame;
-  cd->t[i-1].min=cd->t[0].min-tmp[i-1].min;
-  sec=(cd->t[i-1].sec=cd->t[0].sec-tmp[i-1].sec);
-  if (frame>37) cd->t[i-1].sec++; /* rounding a bit :) */
+  cd->t[0].audio = cd->cdte[0].cdte_ctrl & CDROM_DATA_TRACK;
+  cd->t[0].min   = cd->cdte[0].cdte_addr.msf.minute;
+  cd->t[0].sec   = cd->cdte[0].cdte_addr.msf.second;
+  cd->t[i-1].min=cd->t[0].min - cd->t[i-1].min;
+  sec=(cd->t[i-1].sec=cd->t[0].sec - cd->t[i-1].sec);
+  if (cd->cdte[0].cdte_addr.msf.frame>37) cd->t[i-1].sec++; /* rounding a bit :) */
   if (sec<0) {
    cd->t[i-1].min--;cd->t[i-1].sec+=60;
   }
diff -urN mcd-0.2/doc/README mcd-0.2a/doc/README
--- mcd-0.2/doc/README	Thu Jul 12 23:50:54 2001
+++ mcd-0.2a/doc/README	Sun Jul 22 04:19:38 2001
@@ -2,24 +2,26 @@
  WHAT IS IT
 ===========
 
-- mcd (0.2) is a small (maybe the smallest) cd-player for _linux_
+- mcd (0.2a) is a small (maybe the smallest) cd-player for _linux_
 - it should compile/run out off the box
 - it compiles against dietlibc (12kb static!)
 - working play methods: reapeat cd, repeat track and intro (@ some time shuffle)
 
 
+
  REQUIREMENTS
 ==============
 
-- linux >=2.2
-- /usr/include/termios.h (tcgetattr(),...)
+- linux >= 2.2
+- some simple libc (glibc/dietlibc/...)
+- a cdrom (of cause, with a cable to your soundcard)
 
 
 
  COPYING
 =========
 
-Copyright (C) 2000 Tino Reichardt <der@mcmilk.de>
+Copyright (C) 2001 Tino Reichardt <der@mcmilk.de>
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
@@ -45,8 +47,8 @@
   to catch the SIGWINCH signal !!!
   (btw: a new rewrite of the midnight commander will be my next project ...)
 - maybe some things of the wishlist... if someone ask me, i will do it, but for
-  now, this (mcd-0.2) is the stable release of mcd !
-- shuffle isn't really inclued yet !!!!!
+  now, this (mcd-0.2a) is the stable release of mcd !
+
 
 
  WISHLIST
@@ -54,6 +56,8 @@
 
 - CD-Text (i like this!)
 - maybe cddb (i don't like it much!)
+- shuffle isn't really done yet, it is now in my private 0.3 version :)
+
 
 
  HOMEPAGE
diff -urN mcd-0.2/doc/README.de mcd-0.2a/doc/README.de
--- mcd-0.2/doc/README.de	Sun Jul  8 15:07:37 2001
+++ mcd-0.2a/doc/README.de	Thu Jan  1 01:00:00 1970
@@ -1,102 +0,0 @@
-siehe README !!!
-
-
-
-Technisches:
-
-
-CD-DA Standard alias RedBook
-============================
-
-Der Standard der Audio-CD (CD-DA) wurde also 1982 von Philips und Sony im
-RedBook definiert. Die maximale Spielzeit einer 12cm-CD beträgt 74 Minuten und
-33 Sekunden, eine 8cm Single-CD hat eine Laufzeit von etwa 21 Minuten. Auf
-einer CD können bis zu 99 Tracks direkt von einem CD-Player adressiert werden,
-wobei ein Track mindestens 4 Sekunden lang sein muß. Die maximale Länge eines
-Tracks wird nur von der Länge der CD begrenzt. Einem Musikstück wird auf einer
-CD-DA ein Track zugeordnet.
-
-Die Audio-Daten einer CD-DA liegen grundsätzlich im PCM-Format vor.
-Der Aufbau einer CD gestaltet sich nun wie folgt. Generell
-muß der Audio-Datenstrom einer CD mit einem Mechanismus zur Fehlererkennung
-und Korrektur ausgestattet werden, sodaß eine gewisse Toleranz bei der
-Signal-Umwandlung gewährleistet ist. Bei CD-DA wird dabei ein Cross Interleave
-Reed-Solomon Code (CIRC) eingesetzt. Man nimmt also eine kleine Portion
-der Audio-Daten und versieht diese mit dem Fehlererkennungs- und
--korrektur-Code.
-
-Diese kleine Portion ist mit 6 32-Bit-Samples bestimmt, was einer
-Audio-Datenmenge von 192 Bits entspricht. Diese Daten werden nun mit 64 CIRC
-Parity Bits, 8 Subcode Bits und 24 Sync-Bits erweitert, sodaß unsere Portion
-288 Bits breit ist. Eine solche Daten-Portion wird Frame genannt. 98 solcher
-Frames werden zu einem Block> oder auch Sektor zusammengefaßt. Bei einer
-Abtastrate von 44.1 kHz ergibt sich somit eine Framerate von 44.100 / 6 =
-7.350 Frames pro Sekunde. Zuguterletzt ergibt sich weiters die sog. Subcode
-block rate mit 7.350 / 98 = 75 Blocks pro Sekunde. Insgesammt werden für eine
-Sekunde der CD 2.116.800 Bits bzw. 264.600 Byte benötigt, wovon 176.400 Byte
-Audio-Daten sind. Dies resultiert also in einer Übertragungsrate von 1.411.200
-Bit/Sekunde (1.41 Mbit/sec).
-
-Betrachten wir die Einteilung der Daten in einem Block bzw. Sektor noch etwas
-genauer. Da ein Block aus 98 Frames besteht, transportiert jeder Block 2.352
-Bytes Nutzdaten, in diesem Fall reine Audio-Daten. Dazu kommen noch 882 Bytes
-für die beiden Ebenen des Fehlererkennungs- und -korrektur-Codes von CIRC
-(784) und die Kontroll-Bytes (98) sowie die Sync-Reihe mit 294 Bytes. Ein
-Block umfaßt also insgesammt 3.528 Bytes. Interessant sind hier vorallem die
-Kontrollbytes. Jedem Bit eines Kontroll-Bytes wird ein Buchstabe zugewiesen,
-"P", "Q", "R", "S", "T", "U", "V" und "W". Das erste Bit wird mit "P"
-bezeichnet, das zweite mit "Q" und so weiter. Der Datenstrom bestehend aus
-allen ersten Bits der 98 Kontroll-Bytes wird P-Subchannel genannt. Analog dazu
-bezeichnet man den Datenstrom aller zweiten Bits mit Q-Subchannel. Der dritte
-Datenstrom kombiniert die restlichen Bits "R", "S", "T", "U", "V" und "W" zu
-einem 6-Bit Wort und wird "R bis W"-Subchannel genannt.
-
-Der P-Subchannel enthält ein Flag (on/off), wenn ein Track beginnt. Der
-Q-Subchannel besteht aus den Zeitmarkierungen für die absolute und die
-relative Zeit. Im Lead-In enthält dieser Subchannel den Inhalt der CD (Table
-of contents, TOC). 72 der 98 Bits des Q-Subchannels werden für Informationen,
-der Rest zur Synchronisation, Kontrolle und Fehlerkorrektur der Subchannels
-genutzt. Neben den Bits für die Synchronisation, Kontrolle und Fehlerkorrektur
-kann der "R bis W"-Subchannel Benutzerdaten für zusätzliche Informationen
-enthalten (64 6-Bit Worte pro Block).
-
-So, nach soviel Zahlen- und Bit-Theorie machen wir uns an etwas handfesteres -
-die Adressierung von Tracks einer CD. Jeder Track auf einer CD wird
-grundsätzlich durch die Angabe von Minuten, Sekunden und Sektoren genau
-adressiert. Daraus ergibt sich ein interessanter Nebeneffekt bei der
-Berechnung der Spieldauer eines Tracks. Um nicht in die Verlegenheit zu
-geraten, sehr breite Fließkommazahlen im TOC einer CD zu halten, werden
-Zeitangaben in Minuten und Sekunden geführt. Natürlich geht sich nicht jeder
-Track auf eine ganze Sekundenzahl aus. In diesem Fall wird der verbleibende
-Rest in Sektoren angegeben. Da eine Sekunde wie bereits eingangs erklärt in 75
-Sektoren unterteilt wird, ergibt sich eine Genauigkeit von 0.01 Sekunden.
-
-Wie zu Beginn dieses Abschnittes bereits erwähnt muß jeder Track mindestens 4
-Sekunden lang sein. Diese Mindestlänge entspricht 300 Sektoren. Diesen Betrag
-an Sektoren teilen sich auch der Lead-In und Lead-Out, sodaß der erste Track
-beim Sektor 150 beginnt. Längenangaben können grundsätzlich auch in Sektoren
-gemacht werden.
-
-
--> cd-extra cd's
-  - eine mixed-mode cd mit 2 sessions
-  - 1. session == alle audio tracks (weil cd-player nur 1.lesen)
-  - 2. session == alle daten
-
--> mixed-mode cd's
-  - 1. track daten + 2-XX track == audio (nachfolger von cd-extra)
-  - ...
-
--> cd-text
-  - in den subchannels r+w drinne
-  - subchannel q enthält z.b. verzeichnisstruktur....
-  - information @ftp://ftp.t10.org/t10/drafts/mmc2/mmc2r11a.pdf (last pages)
-
-
--> subchannels
-  - P/Q/R/S/T/U/V/W mit je max. 4MB
-  - P/Q/R/W werden mehr oder weniger genutzt
-
--- 
-Tino Reichardt
-+ Stuff from http://www.all4freaks.org/
diff -urN mcd-0.2/draw.c mcd-0.2a/draw.c
--- mcd-0.2/draw.c	Thu Jul 12 02:45:16 2001
+++ mcd-0.2a/draw.c	Sun Jul 22 02:54:19 2001
@@ -30,7 +30,6 @@
  return;
 }
 
-
 static void draw_method(char *msg) {
  gotoxy(11,5);
  _printf(C_STATUS "%s" C_NORMAL, msg);
@@ -45,7 +44,7 @@
  register int i=1,m=1; /* title/modifier/realtitle */
  int y=0,x=0; /* x,y==diffs to real */
 
- for (i=1;(i<=cd->title[1] && i<=99); i++) {
+ for (i=1;(i<=cd->title[1] && i<=MCD_CDAUDIO_MAX); i++) {
   m=((i-(pluskey+1)*10)<0 && (i-(pluskey+1)*10)>-11); /* is shortcut? */
   if (i%(maxy-10)==0) {y=-i;x+=15;} /* bottom reached, horiz. isn't checked! */
   gotoxy(3+x,10+i+y);
@@ -112,9 +111,7 @@
   if ((cd->title[1]=cd_readtracks(&cd[0]))<1) {
    draw_status("can't read tracks",1);return;
   }
-  /* last, but not least, init the shuffle tracks */
   draw_initscr();
-  cd_initshuffle(&cd[0]);
   updates[U_TRACKS]=updates[U_STATUS]=updates[U_METHOD]=updates[U_VOLUME]=1;
   updates[U_ALL]=0;
  }
@@ -131,14 +128,10 @@
  }
 
  if (updates[U_METHOD]) {
-  if (cd->method==M_SHUFFLE) {
-   cd_randomize(&cd[0]); updates[U_TRACKS]=1; /* shuffle in */
-  }
   draw_method(
   (cd->method==M_PLAY_CD)    ? "play cd     ":"" &&
   (cd->method==M_REPEAT_CD)  ? "repeat cd   ":"" &&
   (cd->method==M_REPEAT_TRK) ? "repeat track":"" &&
-  (cd->method==M_SHUFFLE)    ? "shuffle     ":"" &&
   (cd->method==M_INTRO)      ? "intro       ":"");
   updates[U_METHOD]=0;
  }
diff -urN mcd-0.2/mcd.1 mcd-0.2a/mcd.1
--- mcd-0.2/mcd.1	Thu Jul 12 00:50:27 2001
+++ mcd-0.2a/mcd.1	Sun Jul 22 03:00:26 2001
@@ -1,5 +1,5 @@
 .\" Tino Reichardt <der@mcmilk.de>
-.TH MCD 1 "2001-07-10" "" "User commands"
+.TH MCD 1 "2001-07-22" "mcd-0.2a" "User commands"
 .SH "NAME"
 mcd \- a small cdplayer for linux
 .SH "SYNOPSIS"
@@ -11,21 +11,23 @@
 .TS
 tab (@);
 l l.
+KEY@DESCRIPTION
+@
 #@play track number # (0,1..9)
 cursor up@fast forward
 cursor right@slow forward
 cursor left@slow rewind
 cursor down@fast rewind
-</>@change volume (-/+)
-+/-@change trackmodifier (+/-)
 space@next track
 b/B@previous track
-M/m@change playmethod (-/+)
 S/s@toggle start/stop
 P/p@toggle pause/resume
 E/e@eject cdrom device
 C/c@close cdrom device
-R/r@redraw screen and reinit shuffle
+R/r@redraw screen
+M/m@change playmethod (-/+)
++/-@change trackmodifier (+/-)
+</>@change audio volume of cdrom device (-/+)
 Q/q@quit mcd
 .TE
 .SH "RETURN VALUE"
@@ -44,3 +46,7 @@
 .B linux,
 .B xterm,
 .B xterm-color
+.SH "AUTHOR"
+Tino Reichardt <der@mcmilk.de>
+.PP
+Homepage: http://www.mcmilk.de/projects/mcd/
diff -urN mcd-0.2/mcd.c mcd-0.2a/mcd.c
--- mcd-0.2/mcd.c	Thu Jul 12 02:44:53 2001
+++ mcd-0.2a/mcd.c	Sun Jul 22 02:43:44 2001
@@ -59,23 +59,11 @@
     updates[U_ALL]=1;
     break;
    case 'm':
-    if (cd->method==M_SHUFFLE) { /* out of shuffle */
-     cd->method++;
-     cd_randomize(&cd[0]);
-     updates[U_TRACKS]=updates[U_METHOD]=1;
-     break;
-    }
     if (cd->method<M_INTRO) cd->method++;
     else cd->method=M_PLAY_CD;
     updates[U_TRACKS]=updates[U_METHOD]=1;
     break;
    case 'M':
-    if (cd->method==M_SHUFFLE) { /* out of shuffle */
-     cd->method--;
-     cd_randomize(&cd[0]);
-     updates[U_TRACKS]=updates[U_METHOD]=1;
-     break;
-    }
     if (cd->method>M_PLAY_CD) cd->method--;
     else cd->method=M_INTRO;
     updates[U_METHOD]=1;
diff -urN mcd-0.2/mcd.h mcd-0.2a/mcd.h
--- mcd-0.2/mcd.h	Thu Jul 12 02:23:14 2001
+++ mcd-0.2a/mcd.h	Sun Jul 22 04:22:59 2001
@@ -24,28 +24,25 @@
 
 #include "params.h"
 
-#define MCD_VERSION "0.2"
+#define MCD_VERSION "0.2a"
 
 /* METHODS (don't change!) */
-#define M_PLAY_CD	0	/* play whole cd and stop */
-#define M_REPEAT_CD 	1	/* play whole cd in endless-loop */
-#define M_REPEAT_TRK	2	/* play current track in endless-loop */
-#define M_SHUFFLE	3	/* play some random tracks */
-#define M_INTRO		4	/* play first ten seconds of each track and stop */
+#define M_PLAY_CD	0 /* play whole cd and stop */
+#define M_REPEAT_CD 	1 /* play whole cd in endless-loop */
+#define M_REPEAT_TRK	2 /* play current track in endless-loop */
+#define M_INTRO		3 /* play first ten seconds of each track and stop */
 
 /* for selected refresh (times are always refr..) */
 #define U_STATUS	0 /* only titles are updated */
 #define U_METHOD	1 /* status-method is updated */
 #define U_VOLUME	2 /* status-volume is updated */
 #define U_TRACKS	3 /* all tracks are updated */
-#define U_CDCHANGER	4 /* ... reserved */
-#define U_ALL		5 /* really ALL is updated */
+#define U_ALL		4 /* really ALL is updated */
 
 /* ***** */
 /* mcd.c */
 struct track {
  int nr;    /* title number */
- int rnd;   /* random title */
  int audio; /* current track is audio */
  int sec;   /* seconds of current title */
  int min;   /* minutes of current title */
diff -urN mcd-0.2/params.h mcd-0.2a/params.h
--- mcd-0.2/params.h	Wed Jul 11 11:18:54 2001
+++ mcd-0.2a/params.h	Sun Jul 22 04:18:35 2001
@@ -26,31 +26,31 @@
  */
 
 /* needed */
-#define T_NORMAL  "\033[0m"        /* normal mode */
-#define T_BOLD    "\033[1m"        /* bold mode */
-#define T_HOME    "\033[H"         /* goto 0,0 */
-#define T_CLEAR   "\033[2J"        /* clear screen */
-#define T_GOTO_XY "\033[%d;%dH"    /* goto x,y position (%d=int) */
+#define T_NORMAL   "\033[0m"     /* normal mode */
+#define T_BOLD     "\033[1m"     /* bold mode */
+#define T_HOME     "\033[H"      /* goto 0,0 */
+#define T_CLEAR    "\033[2J"     /* clear screen */
+#define T_GOTO_XY  "\033[%d;%dH" /* goto x,y position (%d=int) */
 
 /* box drawing */
-#define AC_TL  "\016l\017"         /* top left */
-#define AC_TR  "\016k\017"         /* top right */
-#define AC_BL  "\016m\017"         /* bottom left */
-#define AC_BR  "\016j\017"         /* bottom right */
-#define AC_MT  "\016v\017"         /* top 2middle */
-#define AC_MB  "\016w\017"         /* bottom 2middle */
-#define AC_ML  "\016t\017"         /* left 2middle */
-#define AC_MR  "\016u\017"         /* right 2middle */
-#define AC_MM  "\016n\017"         /* middle + */
-#define AC_HL  "\016q\017"         /* hline - */
-#define AC_VL  "\016x\017"         /* vline | */
+#define AC_TL      "\016l\017"   /* top left */
+#define AC_TR      "\016k\017"   /* top right */
+#define AC_BL      "\016m\017"   /* bottom left */
+#define AC_BR      "\016j\017"   /* bottom right */
+#define AC_MT      "\016v\017"   /* top 2middle */
+#define AC_MB      "\016w\017"   /* bottom 2middle */
+#define AC_ML      "\016t\017"   /* left 2middle */
+#define AC_MR      "\016u\017"   /* right 2middle */
+#define AC_MM      "\016n\017"   /* middle + */
+#define AC_HL      "\016q\017"   /* hline - */
+#define AC_VL      "\016x\017"   /* vline | */
 
 /* colors */
-#define C_BOX       "\033[0;34m"  /* blue   - boxdrawing */
-#define C_NORMAL    "\033[0;37m"  /* grey   - normal/default/tracks */
-#define C_STATUS    "\033[0;31m"  /* red    - stausline (track++) */
-#define C_DESCRIPT  "\033[1;33m"  /* yellow - descriptions */
-#define C_HEADLINE  "\033[0;33m"  /* brown  - version, headlines */
+#define C_BOX      "\033[0;34m"  /* blue   - boxdrawing */
+#define C_NORMAL   "\033[0;37m"  /* grey   - normal/default/tracks */
+#define C_STATUS   "\033[0;31m"  /* red    - stausline (track++) */
+#define C_DESCRIPT "\033[1;33m"  /* yellow - descriptions */
+#define C_HEADLINE "\033[0;33m"  /* brown  - version, headlines */
 /* style: 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
  * fg: 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=grey
  * bg: 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=grey
