diff -urN mcdp-0.3j/cddb.c mcdp-0.4/cddb.c
--- mcdp-0.3j/cddb.c	2002-07-12 15:26:07.000000000 +0200
+++ mcdp-0.4/cddb.c	2004-02-20 09:56:32.000000000 +0100
@@ -13,7 +13,7 @@
 /* searches a local entry, success returns 0 (needs CDB_PATH!)*/
 static short cddb_parseentry(struct mcdp *cd) {
  char *fn=malloc(sizeof(char)*PATH_MAX);
- int p=0,tr=0,len,fd; /* p=parse;tr=track */
+ int p=0,tr=1,len,fd; /* p=parse;tr=track */
  char ch;
 
  len=_snprintf(fn,PATH_MAX-1,"%s/%08x",
@@ -31,8 +31,10 @@
   if (p) { /* parse line */
    if (!strncmp(fn, "DTITLE=", 7))
     str_ncpy(cd->t[0].name, fn+7, str_len(fn));
-   if (!strncmp(fn, "TTITLE", 6))
-    str_ncpy(cd->t[++tr].name, fn+8+(int)(tr/10), str_len(fn));
+   if (!strncmp(fn, "TTITLE", 6)) {
+    str_ncpy(cd->t[tr].name, fn+8+(int)(tr/10), str_len(fn));
+    tr++;
+   }
    p=0;
   }
  } /* while() */
diff -urN mcdp-0.3j/cddev.c mcdp-0.4/cddev.c
--- mcdp-0.3j/cddev.c	2002-07-04 08:38:49.000000000 +0200
+++ mcdp-0.4/cddev.c	2004-02-20 10:24:05.000000000 +0100
@@ -12,6 +12,43 @@
 }
 
 /* GLOBAL */
+
+/* open device or exit ! */
+void cd_initdev(const char *cdpath, struct mcdp *cd) {
+
+ /* 1. check argv[1] */
+ if (cdpath) goto try;
+
+ /* 2. check $CDROM */
+ if ((cd->dev=getenv("CDROM"))!=NULL) goto try;
+
+ /* 3. try default */
+ {
+  struct stat st;
+  if (stat("/dev/.devfsd", &st)<0) {
+   cd->dev="/dev/cdrom";  /* really no devfs :( */
+  } else {
+   if (S_ISCHR(st.st_mode)
+    && (major(st.st_rdev)==8)
+    && (minor(st.st_rdev)==0)) {
+     cd->dev="/dev/cdroms/cdrom0";
+    /* yeah, we have devfs! */
+   } else cd->dev="/dev/cdrom";
+  }
+ }
+ try:
+ cd->fd=open(cd->dev, O_RDONLY|O_NONBLOCK);
+ if ((cd->fd<0) || (cd->status=ioctl(cd->fd,CDROM_DRIVE_STATUS,NULL)<0)) {
+  _printf("Sorry, can't open cd-device \"%s\" !\n", cd->dev);
+  exit(1);
+ }
+ if (cd->status==(100||105)) { /* audio/mixed */
+  mesg(1,"Sorry, your disc isn't a Mixed-CD or Audio-CD !\n");
+  exit(2);
+ }
+ return;
+}
+
 /* look at the specs, should do, what they want :) */
 unsigned cd_discid(struct mcdp *cd) {
  static unsigned cd_cddbsum(register int n) {
@@ -21,24 +58,13 @@
   }
   return ret;
  }
- unsigned int i=1, n=0;
+ int i=1, n=0;
  while (i<=cd->title[1]) {
   n+=cd_cddbsum(cd->t[i].cddb/75);i++;
  }
  return ((n%0xff)<<24|(cd->t[0].cddb - cd->t[1].cddb/75)<<8|cd->title[1]);
 }
 
-/* open device or exit ! */
-int cd_init(const char *cdpath, struct mcdp *cd) {
- cd->fd=open(cdpath,O_RDONLY|O_NONBLOCK);
- if ((cd->fd<0) || (cd->status=ioctl(cd->fd,CDROM_DISC_STATUS,NULL)<0)) {
-  _printf("Sorry, can't open cd-device \"%s\" !\n",cdpath);
-  exit(1);
- }
- if (cd->status==(100||105)) return -1; /* audio/mixed */
- return 0;
-}
-
 /* needs correct cd->fd; seems very efficient (no division...) */
 int cd_readtracks(struct mcdp *cd) {
  struct cdrom_tochdr cdth;        /* TocHdr Stuff */
diff -urN mcdp-0.3j/doc/AUTHOR mcdp-0.4/doc/AUTHOR
--- mcdp-0.3j/doc/AUTHOR	1970-01-01 01:00:00.000000000 +0100
+++ mcdp-0.4/doc/AUTHOR	2004-02-20 19:19:57.000000000 +0100
@@ -0,0 +1 @@
+Tino Reichardt <milky-mcdp@mcmilk.de>
diff -urN mcdp-0.3j/doc/BUGS mcdp-0.4/doc/BUGS
--- mcdp-0.3j/doc/BUGS	1970-01-01 01:00:00.000000000 +0100
+++ mcdp-0.4/doc/BUGS	2004-02-20 19:20:07.000000000 +0100
@@ -0,0 +1,2 @@
+Please report bugs to
+  milky-mcdp@mcmilk.de
diff -urN mcdp-0.3j/doc/CHANGES mcdp-0.4/doc/CHANGES
--- mcdp-0.3j/doc/CHANGES	2002-07-12 15:18:24.000000000 +0200
+++ mcdp-0.4/doc/CHANGES	2004-02-20 19:30:39.000000000 +0100
@@ -1,3 +1,7 @@
+0.4
+- added patch for better showing of the cddb data from Leo Rosa
+- fixed some code to avoid compiler warnings
+
 0.3j
 - marked CDDA_DEVICE to handle bus,lun,id in future, cd-text comes next
 - CDROM == /dev/cdrom an so on, like in old versdion -> will be removed,
diff -urN mcdp-0.3j/doc/INSTALL mcdp-0.4/doc/INSTALL
--- mcdp-0.3j/doc/INSTALL	2002-07-04 08:34:53.000000000 +0200
+++ mcdp-0.4/doc/INSTALL	2004-02-20 19:28:46.000000000 +0100
@@ -1,6 +1,6 @@
 
- Installing mcdp
-=================
+ INSTALL
+=========
 
 1. Possibly, edit the Makefile (compilertuning etc)
 	$ vi Makefile
diff -urN mcdp-0.3j/doc/README mcdp-0.4/doc/README
--- mcdp-0.3j/doc/README	2002-07-12 15:11:00.000000000 +0200
+++ mcdp-0.4/doc/README	2004-02-20 19:28:42.000000000 +0100
@@ -7,70 +7,3 @@
 - it can be compiled against dietlibc (~16kb static!)
 - working play methods: reapeat cd, repeat track and intro
 - since version 0.3a, minimal cddb title download is also included
-
-
-
- REQUIREMENTS
-==============
-
-- linux >= 2.2
-- some simple libc (glibc/dietlibc/...)
-- a cdrom (of cause, with a cable to your soundcard)
-
-
-
- COPYING
-=========
-
-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
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-!AND!
-
-Author strongly advices against using this code, or a part of it,
-in an application designed to run on any Microsoft(tm) platform.
-
-
-
- TODO
-======
-
-- term resizing works correct, since version 0.2 (if not started from mc
-  (btw: a new small mc will be my next project ...mmc?)
-- maybe some things of the wishlist... (if someone ask me, i will do it)
-- add a buffer for cddb stuff + fix protocol handling (we need FULL cddb!)
-- add a buffer for drawing (is on the way to ya)
-- CD-Text (will also come next)
-
-
-
- WISHLIST
-==========
-
-- shuffle/random
-- playlists
-
-
-
- HOMEPAGE
-==========
-
- http://www.mcmilk.de/projects/mcdp/
-
-
-
- BUGS
-======
-
-Please report bugs to:
-
-  Tino Reichardt <milky-mcdp@mcmilk.de>
diff -urN mcdp-0.3j/doc/REQUIREMENTS mcdp-0.4/doc/REQUIREMENTS
--- mcdp-0.3j/doc/REQUIREMENTS	1970-01-01 01:00:00.000000000 +0100
+++ mcdp-0.4/doc/REQUIREMENTS	2004-02-20 19:27:01.000000000 +0100
@@ -0,0 +1,7 @@
+
+ REQUIREMENTS
+==============
+
+- linux >= 2.2
+- some simple libc (glibc/dietlibc/...)
+- a cdrom (of cause, with a cable to your soundcard)
diff -urN mcdp-0.3j/doc/THANKS mcdp-0.4/doc/THANKS
--- mcdp-0.3j/doc/THANKS	2002-07-04 09:32:49.000000000 +0200
+++ mcdp-0.4/doc/THANKS	2004-02-20 19:28:23.000000000 +0100
@@ -1 +1,8 @@
-Leo Rosa <leorosa@feq.unicamp.br>
+Thanks to those people for success and failure reports, code, ideas and docs.
+
+
+FL  = Felix von Leitner <der@fefe.de>
+      - dietlibc + formats.c
+
+LR  = Leo Rosa <leorosa@feq.unicamp.br>
+      - misc patches ... see CHANGES
diff -urN mcdp-0.3j/doc/TODO mcdp-0.4/doc/TODO
--- mcdp-0.3j/doc/TODO	1970-01-01 01:00:00.000000000 +0100
+++ mcdp-0.4/doc/TODO	2004-02-20 19:27:44.000000000 +0100
@@ -0,0 +1,7 @@
+
+ TODO
+======
+
+- remove formats.c
+- split all .c files
+- add scsi generic code / linux is ugly in that way!
diff -urN mcdp-0.3j/doc/WISHLIST mcdp-0.4/doc/WISHLIST
--- mcdp-0.3j/doc/WISHLIST	1970-01-01 01:00:00.000000000 +0100
+++ mcdp-0.4/doc/WISHLIST	2004-02-20 19:27:28.000000000 +0100
@@ -0,0 +1,9 @@
+
+ WISHLIST
+==========
+
+- shuffle/random
+- playlists
+- add a buffer for cddb stuff + fix protocol handling
+- add a buffer for drawing
+- CD-Text support
diff -urN mcdp-0.3j/draw.c mcdp-0.4/draw.c
--- mcdp-0.3j/draw.c	2002-07-04 08:38:34.000000000 +0200
+++ mcdp-0.4/draw.c	2004-02-20 18:48:05.000000000 +0100
@@ -27,7 +27,7 @@
 }
 
 static void draw_method(char *msg) {
- gotoxy(11,5);
+ gotoxy(11,4);
  _printf(C_STATUS "%s" C_NORMAL, msg);
  return;
 }
@@ -36,33 +36,34 @@
  register int i;
  show1(C_NORMAL T_CLEAR C_BOX);
  draw_box(1,1,maxx,maxy); /* the bigbox */
- gotoxyw(1,9, AC_ML);
+ gotoxyw(1,8, AC_ML);
  draw_hline(maxx-1,AC_HL);
  show1(AC_MR); /* border */
 
  if (cddb) { /* vline */
-  gotoxy(34,1);show1(AC_MB);
-  for (i=2;i<6;i++) {
-   gotoxy(34,i);
+  gotoxy(maxx/2,1);show1(AC_MB);
+  for (i=2;i<5;i++) {
+   gotoxy(maxx/2,i);
    show1(AC_VL);
   }
-  gotoxy(34,i);show1(AC_BL);
-  draw_hline(maxx-34,AC_HL);
+  gotoxy(maxx/2,i);show1(AC_BL);
+  draw_hline(maxx/2,AC_HL);
   show1(AC_MR);
  }
  show1(C_HEADLINE);
  gotoxyw(3,2, "mcdp version " MCDP_VERSION);
- if (cddb) gotoxyw(36,2,"freedb info");
- gotoxyw(3,10,"tracklist");
+ if (cddb) gotoxyw(maxx/2+2,2,"freedb info");
+ gotoxy(9,8); _printf(" tracklist %d ", pluskey);
  show1(C_DESCRIPT);
- gotoxyw(3,4, "Status:");
- gotoxyw(3,5, "Method:");
- gotoxyw(3,6, "Volume:");
- gotoxyw(3,7, "Track:");
- gotoxyw(3,8, "CD:");
+ gotoxyw(3,3, "Status:");
+ gotoxyw(3,4, "Method:");
+ gotoxyw(3,5, "Volume:");
+ gotoxyw(3,6, "Track:");
+ gotoxyw(18,6, "CD:");
  if (cddb) {
-  gotoxyw(36,4,"Source:");
-  gotoxyw(36,5,"DiscID:");
+  gotoxyw(maxx/2+2,3,"Source:");
+  gotoxyw(maxx/2+2,4,"DiscID:");
+  gotoxyw(maxx/2+19,4,"Len:");
  }
  return;
 }
@@ -70,12 +71,39 @@
 /* this function looks strange since cddb =:) */
 static void draw_tracks(struct mcdp *cd) {
  register int i,m; /* title/modifier/realtitle */
- int y=0,x=0; /* x,y==diffs to real */
+ int x=0; /* x=diffs to real */
 
- for (i=1;(i<=cd->title[1] && i<=MCDP_CDAUDIO_MAX); i++) {
+ for (i=9;i<maxy;i++) for(x=3;x<maxx;x++) gotoxyw(x,i," ");
+ if (cddb) { /* if we have cddb */
+  gotoxyw(maxx/2+10,3,C_STATUS);
+  if (cddb==CDDB_WORKMAN) show1("~/.workmandb");
+  else if(cddb==CDDB_LOCAL) show1(getenv("CDDB_PATH"));
+  else _printf("remote, via %s:%s",ip,port); /* can only be REMOTE */
+  gotoxy(maxx/2+10,4);_printf("%08x",cd_discid(&cd[0]));
+  gotoxy(maxx/2+24,4);_printf("%ds",cd->t[0].cddb);
+/* titleinfo */
+  cd->t[0].name[maxx-3]='\0';
+  gotoxy(3,7); _printf(C_NORMAL T_BOLD "%s",cd->t[0].name); /* always */
+  gotoxy(15,9);show1(C_BOX AC_MB);
+  for(i=9;i<maxy;i++) { gotoxyw(15,i,AC_VL); }
+  gotoxy(15,maxy);show1(AC_MT C_NORMAL);
+ }
+ for(i=offset;(i<=cd->title[1] && i<=MCDP_CDAUDIO_MAX); i++) {
+/* automatic offset change - these are overriden by pressing [ or ] */
+  if(updates[U_TRACKS]==1) { /* if==2, don't scroll */
+   if(cd->title[0]>(i+maxy-10)) {
+    offset=cd->title[0]-maxy+10;
+    i=offset; continue;
+   }
+   if(cd->title[0]<offset) {
+    offset=1;
+    i=cd->title[0]; continue;
+   }
+  }
+  if ((i-offset)==(maxy-9)) { break; }
   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);
+
+  gotoxy(3,9+i-offset);
   if (m&&(i==cd->title[0])) _printf(C_STATUS "%02d" C_NORMAL, i); /* current */
   else if (m||(i==cd->title[0])) _printf(T_BOLD "%02d" C_NORMAL, i); /* current */
   else _printf("%02d",i); /* nothing special */
@@ -84,44 +112,22 @@
    cd->t[i].audio?'d':'a',
    cd->t[i].min,
    cd->t[i].sec);
-  if (i==cd->title[0]) show1(C_NORMAL); /* current */
- }
 
  if (cddb) { /* if we have cddb */
-  gotoxyw(44,4,C_STATUS);
-  if (cddb==CDDB_LOCAL) show1("local file");
-  else _printf("remote, via %s:%s",ip,port); /* can only be REMOTE */
-  gotoxy(44,5);_printf("%08x",cd_discid(&cd[0]));
-
-  /* titelinfo */
-  gotoxy(18,8); _printf(C_NORMAL T_BOLD "%s",cd->t[0].name); /* always */
-  if (x) {
-   /* we display only current */
-   gotoxy(18,7); _printf("%s" C_NORMAL, cd->t[cd->title[0]].name);
-   for (i=str_len(cd->t[cd->title[0]].name)+19;i<=maxx;i++)
-    write(1," ",1);  /* clear old titleinfos */
-  } else {
-   /* we display all title */
-   gotoxy(16,9);show1(C_BOX AC_MB);
-   for (i=10;i<maxy;i++) gotoxyw(16,i,AC_VL);
-   gotoxy(16,maxy);show1(AC_MT C_NORMAL);
-   for (i=1;i<=cd->title[1];i++) {
-    gotoxy(18,10+i);
-    if (i==cd->title[0]) show1(T_BOLD);
-    _printf("%s",cd->t[i].name);
-    if (i==cd->title[0]) show1(C_NORMAL);
-   }
-  } /* all title */
+  gotoxy(17,9+i-offset);
+  cd->t[i].name[maxx-17]='\0';
+  _printf("%s",cd->t[i].name);
  } /* cddb */
+  if(i==cd->title[0]) show1(C_NORMAL); /* current */
+ }
+
  show1(C_STATUS); /* trackmodifier */
- gotoxy(13,10);
- _printf("(%d)", pluskey);
  return;
 }
 
 void draw_status(char *msg, short again) {
- gotoxy(11,4);
- _printf(C_STATUS "%-23s" C_NORMAL, msg);
+ gotoxy(11,3);
+ _printf(C_STATUS "%-13s" C_NORMAL, msg);
  if (again) {
   updates[U_STATUS]=1;
   sleep(again);
@@ -131,7 +137,7 @@
 
 void draw_updatescr(struct mcdp *cd) {
  if (cd_readsubchannel(cd)<0) {
-  draw_status("no disc (use e/c)",0);
+  draw_status("no disc (e/c)",0);
   return;
  }
 
@@ -140,8 +146,8 @@
   signal(SIGWINCH,tty_resize);
   show1(C_NORMAL T_CLEAR);
   tty_getsize(&maxx,&maxy);
-  if (maxx<CDDB_TITLEMAX+16 || maxy<13) {
-   _printf(T_NORMAL T_CLEAR "Sorry, you need at least a termsize of %dx13.\n", CDDB_TITLEMAX+16);
+  if (maxx<50 || maxy<10) {
+   _printf(T_NORMAL T_CLEAR "Sorry, you need at least a termsize of 50x10.\n");
    tty_mode(TERM_QUIT);
   }
   cddb=cd_readtracks(&cd[0]);
@@ -177,17 +183,17 @@
 
  show1(C_STATUS);
  if (updates[U_VOLUME]==1) {
-  gotoxy(11,6);
+  gotoxy(11,5);
   _printf("%d%%  ", (int)(cd->vol.channel0/2.55));
   updates[U_VOLUME]=0;
  }
 
  /* always */
- gotoxy(11,7);
+ gotoxy(11,6);
  _printf("%02d:%02d",
   cd->cds.cdsc_reladdr.msf.minute,
   cd->cds.cdsc_reladdr.msf.second);
- gotoxy(11,8);
+ gotoxy(23,6);
  _printf("%02d:%02d",
   cd->cds.cdsc_absaddr.msf.minute,
   cd->cds.cdsc_absaddr.msf.second);
diff -urN mcdp-0.3j/Makefile mcdp-0.4/Makefile
--- mcdp-0.3j/Makefile	2002-07-04 09:33:02.000000000 +0200
+++ mcdp-0.4/Makefile	2004-02-20 19:29:06.000000000 +0100
@@ -2,12 +2,23 @@
 #
 # Change it to your needs, see also params.h !
 
+MANZIP	= gzip -f9
 MANDIR	= /usr/share/man
 BINDIR	= /usr/bin
 
-CC	= diet gcc
+ARCH	= $(shell uname -m | sed -e 's/i[4-9]86/i386/' -e 's/armv[3-6][lb]/arm/')
+DIET	= $(shell basename `which diet 2>/dev/null` 2>/dev/null)
+
+# compiler
+CC	= $(DIET) gcc
 CFLAGS	= -Os -Wall -pipe -fomit-frame-pointer
-LDFLAGS	= 
+LDFLAGS	=
+
+# extraflags
+CFLAGS += -mpreferred-stack-boundary=2 -march=$(ARCH) -mcpu=$(ARCH)
+#CFLAGS += -W -Wchar-subscripts -Wmissing-prototypes -Wmissing-declarations -Wswitch -Wredundant-decls -Wunused
+#CFLAGS += -Werror
+#CFLAGS += -funroll-loops
 
 S_FLAGS	= -R .note -R .comment
 
@@ -27,7 +38,7 @@
 
 install:
 	cp -f mcdp $(BINDIR)
-	cp -f mcdp.1 $(MANDIR)/man1 && gzip -f9 $(MANDIR)/man1/mcdp.1
+	cp -f mcdp.1 $(MANDIR)/man1 && $(MANZIP) -f9 $(MANDIR)/man1/mcdp.1
 	@echo "You may take a look at \"doc/profile.sh\" ... "
 
 uninstall:
diff -urN mcdp-0.3j/mcdp.1 mcdp-0.4/mcdp.1
--- mcdp-0.3j/mcdp.1	2002-07-12 15:19:26.000000000 +0200
+++ mcdp-0.4/mcdp.1	2004-02-20 10:15:26.000000000 +0100
@@ -1,5 +1,5 @@
 .\" Tino Reichardt <der@mcmilk.de>
-.TH MCDP 1 "2002-04-13" "mcdp-0.3i" "User commands"
+.TH MCDP 1 "2004-02-20" "mcdp-0.4" "User commands"
 .SH "NAME"
 mcdp \- a small cdplayer for linux
 .SH "SYNOPSIS"
@@ -8,7 +8,7 @@
 The command \fBmcdp\fR is used for playing AudioCD's. It has a curses like
 userinterface and is fairly simple to use.
 .SH "OPTIONS"
-There is only one (optional) option: a cd device (e.g. /dev/cdrom2) !
+There is only one optional option - a cd device (e.g. /dev/cdrom2) !
 .SH "KEYS"
 .TS
 tab (@);
@@ -69,7 +69,9 @@
 .PP
 If you haven't direct access to a freedb server, you may use some
 port redirector program ... see freshmeat.
+.PP
+If you have devfs, mcdp will try /dev/cdroms/cdrom0, else /dev/cdrom is tried!
 .SH "AUTHOR"
-Tino Reichardt <der@mcmilk.de>
+Tino Reichardt <milky-mcdp@mcmilk.de>
 .PP
 Homepage: http://www.mcmilk.de/projects/mcdp/
diff -urN mcdp-0.3j/mcdp.c mcdp-0.4/mcdp.c
--- mcdp-0.3j/mcdp.c	2002-07-12 15:14:01.000000000 +0200
+++ mcdp-0.4/mcdp.c	2004-02-20 18:44:53.000000000 +0100
@@ -1,27 +1,14 @@
 #include "mcdp.h"
 short pluskey=0;  /* 0..9|X is played */
 short updates[4]; /* see mcdp.h */
+short offset=1; /* vertical offset */
 
 int main(int argc, char **argv, char **environ) {
  struct mcdp *cd=malloc(sizeof(struct mcdp));
  int quit=0;
  char ch;
 
- if (argc>1) quit=cd_init(argv[1],&cd[0]);
- else { /* try default stuff */
-  /* CDDA_DEVICE -> 0,0,0 - like cdda2wav ... */
-  /*  if ((argv[1]=getenv("CDDA_DEVICE"))!=NULL) { */
-  if ((argv[1]=getenv("CDROM"))!=NULL) {
-   quit=cd_init(argv[1],&cd[0]);
-  } else {
-   quit=cd_init(CDROM_DEFAULT,&cd[0]); /* params.h */
-  }
- }
- if (quit<0) {
-  mesg(1,"Sorry, your disc isn't a Mixed-CD or Audio-CD !\n");
-  exit(2);
- }
-
+ cd_initdev(argv[1],&cd[0]);
  tty_mode(TERM_INIT);
  signal(SIGINT,mcdp_quit);
  signal(SIGQUIT,mcdp_quit);
@@ -96,11 +83,11 @@
     system("man mcdp");
     break;
    case '+':
-    pluskey=(pluskey<9)?++pluskey:0;
+    if (pluskey<9) pluskey++; else pluskey=0;
     updates[U_TRACKS]=1;
     break;
    case '-':
-    pluskey=(pluskey>0)?--pluskey:9;
+    if (pluskey>0) pluskey--; else pluskey=9;
     updates[U_TRACKS]=1;
     break;
    case '<':
@@ -117,13 +104,27 @@
      draw_status("error: setting volume",1);
     updates[U_VOLUME]=1;
     break;
+   case ',':
+    cd->vol.channel0=cd->vol.channel1=cd->vol.channel2=cd->vol.channel3=
+        (cd->vol.channel0>25)?cd->vol.channel0-=25:255;
+    if(ioctl(cd->fd,CDROMVOLCTRL,&cd->vol)<0)
+        draw_status("error: setting volume",1);
+    updates[U_VOLUME]=1;
+    break;
+   case '.':
+    cd->vol.channel0=cd->vol.channel1=cd->vol.channel2=cd->vol.channel3=
+        (cd->vol.channel0<230)?cd->vol.channel0+=25:0;
+    if(ioctl(cd->fd,CDROMVOLCTRL,&cd->vol)<0)
+        draw_status("error: setting volume",1);
+    updates[U_VOLUME]=1;
+    break;
    case 'q':
    case 'Q':
     quit=1;
     break;
    case '0':
     if (!pluskey && !((int)ch-48)) {
-     draw_status("hey, this isn't valid!",1);
+     draw_status("isn't valid!",1);
      break;
     }
    case '1': case '2': case '3': case '4': case '5': case '6':
@@ -135,6 +136,22 @@
      updates[U_TRACKS]=1;
     }
     break;
+   case ']':
+    if(cd->title[1]>(maxy-9))
+    offset=(offset<(cd->title[1]-maxy+10))?offset+1:(cd->title[1]-maxy+10);
+    updates[U_TRACKS]=2; break;
+   case '[':
+    if(cd->title[1]>(maxy-9))
+    offset=(offset>1)?offset-1:offset;
+    updates[U_TRACKS]=2; break;
+   case '}':
+    if(cd->title[1]>(maxy-9))
+    offset=((offset+5)<(cd->title[1]-maxy+10))?(offset+5):(cd->title[1]-maxy+10);
+    updates[U_TRACKS]=2; break;
+   case '{':
+    if(cd->title[1]>(maxy-9))
+    offset=((offset-5)>1)?(offset-5):1;
+    updates[U_TRACKS]=2; break;
    } /* switch */
   } /* select */
  } /* while */
diff -urN mcdp-0.3j/mcdp.h mcdp-0.4/mcdp.h
--- mcdp-0.3j/mcdp.h	2002-07-12 15:24:30.000000000 +0200
+++ mcdp-0.4/mcdp.h	2004-02-20 18:44:53.000000000 +0100
@@ -31,7 +31,7 @@
 
 #include "params.h"
 
-#define MCDP_VERSION "0.3j"
+#define MCDP_VERSION "0.4"
 
 /* METHODS */
 #define M_PLAY_CD    0 /* play whole cd and stop */
@@ -62,6 +62,7 @@
 };
 
 struct mcdp {
+ char *dev;    /* file name of device */
  int fd;       /* file descriptor */
  int method;   /* current playing METHOD (M_*) */
  int status;   /* old status, compared to cds.audiost.. */
@@ -77,7 +78,7 @@
  char *msg; /* some msg */
 };
 
-extern short pluskey,updates[4];
+extern short pluskey,updates[4],offset;
 extern void mcdp_quit(int);	/* cleanups + quit */
 
 /* ****** */
@@ -116,9 +117,9 @@
 
 /* ******* */
 /* cddev.c */
-extern int cd_init(const char *cdpath, struct mcdp *cd);
 extern int cd_readtracks(struct mcdp *cd);
 extern int cd_readsubchannel(struct mcdp *cd);
+extern void cd_initdev(const char *cdpath, struct mcdp *cd);
 extern void cd_pauseresume(struct mcdp *cd);
 extern void cd_skip(struct mcdp *cd, int secs);
 extern void cd_start(struct mcdp *cd);
diff -urN mcdp-0.3j/mcdp.lsm mcdp-0.4/mcdp.lsm
--- mcdp-0.3j/mcdp.lsm	2002-07-12 15:24:08.000000000 +0200
+++ mcdp-0.4/mcdp.lsm	2004-02-20 18:46:34.000000000 +0100
@@ -1,17 +1,17 @@
 Begin4
 Title:          mcdp
-Version:        0.3j
-Entered-date:   2002-04-13
+Version:        0.4
+Entered-date:   2004-02-20
 Description:    Is a small cd player application with a curses like
                 interface. Has a track database, supports remote/local cddb
                 track data, different play modes and volume control.
 Keywords:       cd, player, audio, sound, curses, dietlibc, cddb, freedb,
 		workmandb
-Author:         Tino Reichardt <der@mcmilk.de>
-Maintained-by:  Tino Reichardt <der@mcmilk.de>
+Author:         Tino Reichardt <milky-mcdp@mcmilk.de>
+Maintained-by:  Tino Reichardt <milky-mcdp@mcmilk.de>
 Primary-site:   sunsite.unc.edu /pub/Linux/apps/sound/cdrom
-		21kB  mcdp-0.3j.tar.gz
-		10kB  mcdp-0.3j.bin.gz (static binary, upx compressed!)
+		22kB  mcdp-0.4.tar.gz
+		15kB  mcdp-0.4.bin.gz (static i386 binary)
 Alternate-site: http://www.mcmilk.de/projects/mcdp/
 Platforms:      Linux >=2.2
 Copying-policy: Gnu Library General Public License (GLPL) 2.0
diff -urN mcdp-0.3j/params.h mcdp-0.4/params.h
--- mcdp-0.3j/params.h	2002-07-12 15:17:22.000000000 +0200
+++ mcdp-0.4/params.h	2004-02-20 18:46:47.000000000 +0100
@@ -6,9 +6,6 @@
 #ifndef _MCDP_PARAMS_H
 #define _MCDP_PARAMS_H
 
-// #define CDROM_DEFAULT   "/dev/cdrom"         /* !devfs */
-#define CDROM_DEFAULT   "/dev/cdroms/cdrom0" /* devfs */
-
 #define CDDB_CREATMODE  0644 /* used, for new entries */
 
 /* max size a titlename may have
