diff --git a/avrdude/avr.c b/avrdude/avr.c
index 7de9cdcc..70d86f33 100644
--- a/avrdude/avr.c
+++ b/avrdude/avr.c
@@ -174,32 +174,6 @@ AVRMEM * avr_locate_mem(AVRPART * p, char * desc)
 
 
 
-/*
- * transmit and receive a bit of data to/from the AVR device
- */
-int avr_txrx_bit(int fd, int bit)
-{
-  int r;
-
-  /* 
-   * read the result bit (it is either valid from a previous clock
-   * pulse or it is ignored in the current context)
-   */
-  r = ppi_getpin(fd, pgm->pinno[PIN_AVR_MISO]);
-
-  /* set the data input line as desired */
-  ppi_setpin(fd, pgm->pinno[PIN_AVR_MOSI], bit);
-
-  /* 
-   * pulse the clock line, clocking in the MOSI data, and clocking out
-   * the next result bit
-   */
-  ppi_pulsepin(fd, pgm->pinno[PIN_AVR_SCK]);
-
-  return r;
-}
-
-
 /*
  * transmit and receive a byte of data to/from the AVR device
  */
@@ -211,7 +185,22 @@ unsigned char avr_txrx(int fd, unsigned char byte)
   rbyte = 0;
   for (i=0; i<8; i++) {
     b = (byte >> (7-i)) & 0x01;
-    r = avr_txrx_bit(fd, b);
+
+    /* 
+     * read the result bit (it is either valid from a previous clock
+     * pulse or it is ignored in the current context)
+     */
+    r = ppi_getpin(fd, pgm->pinno[PIN_AVR_MISO]);
+    
+    /* set the data input line as desired */
+    ppi_setpin(fd, pgm->pinno[PIN_AVR_MOSI], b);
+    
+    /* 
+     * pulse the clock line, clocking in the MOSI data, and clocking out
+     * the next result bit
+     */
+    ppi_pulsepin(fd, pgm->pinno[PIN_AVR_SCK]);
+
     rbyte = rbyte | (r << (7-i));
   }
 
@@ -245,6 +234,11 @@ int avr_cmd(int fd, unsigned char cmd[4], unsigned char res[4])
 }
 
 
+/*
+ * avr_set_bits()
+ *
+ * Set instruction bits in the specified command based on the opcode.  
+ */
 int avr_set_bits(OPCODE * op, unsigned char * cmd)
 {
   int i, j, bit;
@@ -266,6 +260,12 @@ int avr_set_bits(OPCODE * op, unsigned char * cmd)
 }
 
 
+/*
+ * avr_set_addr()
+ *
+ * Set address bits in the specified command based on the opcode, and
+ * the address.
+ */
 int avr_set_addr(OPCODE * op, unsigned char * cmd, unsigned long addr)
 {
   int i, j, bit;
@@ -289,6 +289,12 @@ int avr_set_addr(OPCODE * op, unsigned char * cmd, unsigned long addr)
 }
 
 
+/*
+ * avr_set_input()
+ *
+ * Set input data bits in the specified command based on the opcode,
+ * and the data byte.
+ */
 int avr_set_input(OPCODE * op, unsigned char * cmd, unsigned char data)
 {
   int i, j, bit;
@@ -312,7 +318,13 @@ int avr_set_input(OPCODE * op, unsigned char * cmd, unsigned char data)
 }
 
 
-int avr_get_output(OPCODE * op, unsigned char * cmd, unsigned char * data)
+/*
+ * avr_get_output()
+ *
+ * Retreive output data bits from the command results based on the
+ * opcode data.
+ */
+int avr_get_output(OPCODE * op, unsigned char * res, unsigned char * data)
 {
   int i, j, bit;
   unsigned char value;
@@ -323,7 +335,7 @@ int avr_get_output(OPCODE * op, unsigned char * cmd, unsigned char * data)
       j = 3 - i / 8;
       bit = i % 8;
       mask = 1 << bit;
-      value = ((cmd[j] & mask) >> bit) & 0x01;
+      value = ((res[j] & mask) >> bit) & 0x01;
       value = value << op->bit[i].bitno;
       if (value)
         *data = *data | value;
@@ -350,6 +362,9 @@ int avr_read_byte(int fd, AVRPART * p, AVRMEM * mem, unsigned long addr,
   LED_ON(fd, pgm->pinno[PIN_LED_PGM]);
   LED_OFF(fd, pgm->pinno[PIN_LED_ERR]);
 
+  /*
+   * figure out what opcode to use
+   */
   if (mem->op[AVR_OP_READ_LO]) {
     if (addr & 0x00000001)
       readop = mem->op[AVR_OP_READ_HI];
@@ -389,7 +404,7 @@ int avr_read_byte(int fd, AVRPART * p, AVRMEM * mem, unsigned long addr,
  * corresponding buffer of the avrpart pointed to by 'p'.  If size =
  * 0, read the entire contents, otherwise, read 'size' bytes.
  *
- * Return the number of bytes read, or -1 if an error occurs.  
+ * Return the number of bytes read, or < 0 if an error occurs.  
  */
 int avr_read(int fd, AVRPART * p, char * memtype, int size, int verbose)
 {
@@ -430,11 +445,8 @@ int avr_read(int fd, AVRPART * p, char * memtype, int size, int verbose)
 }
 
 
-
-
-
 /*
- * write a byte of data to the indicated memory region
+ * write a page data at the specified address
  */
 int avr_write_page(int fd, AVRPART * p, AVRMEM * mem,
                    unsigned long addr)
@@ -451,6 +463,10 @@ int avr_write_page(int fd, AVRPART * p, AVRMEM * mem,
     return -1;
   }
 
+  /*
+   * if this memory is word-addressable, adjust the address
+   * accordingly
+   */
   if (mem->op[AVR_OP_LOADPAGE_LO])
     addr = addr / 2;
 
@@ -475,7 +491,7 @@ int avr_write_page(int fd, AVRPART * p, AVRMEM * mem,
 
 
 /*
- * write a byte of data to the indicated memory region
+ * write a byte of data at the specified address
  */
 int avr_write_byte(int fd, AVRPART * p, AVRMEM * mem,
                    unsigned long addr, unsigned char data)
@@ -601,11 +617,11 @@ int avr_write_byte(int fd, AVRPART * p, AVRMEM * mem,
 
 
 /*
- * Write the whole memory region (flash or eeprom, specified by
- * 'memtype') from the corresponding buffer of the avrpart pointed to
- * by 'p'.  Write up to 'size' bytes from the buffer.  Data is only
- * written if the new data value is different from the existing data
- * value.  Data beyond 'size' bytes is not affected.
+ * Write the whole memory region of the specified memory from the
+ * corresponding buffer of the avrpart pointed to by 'p'.  Write up to
+ * 'size' bytes from the buffer.  Data is only written if the new data
+ * value is different from the existing data value.  Data beyond
+ * 'size' bytes is not affected.
  *
  * Return the number of bytes written, or -1 if an error occurs.
  */
@@ -625,7 +641,6 @@ int avr_write(int fd, AVRPART * p, char * memtype, int size, int verbose)
     return -1;
   }
 
-
   LED_OFF(fd, pgm->pinno[PIN_LED_ERR]);
 
   werror = 0;
@@ -643,7 +658,6 @@ int avr_write(int fd, AVRPART * p, char * memtype, int size, int verbose)
   }
 
   for (i=0; i<wsize; i++) {
-    /* eeprom or low byte of flash */
     data = m->buf[i];
     if (verbose) {
       if (i % 16 == 0)
@@ -658,6 +672,10 @@ int avr_write(int fd, AVRPART * p, char * memtype, int size, int verbose)
     }
 
     if (m->paged) {
+      /*
+       * check to see if it is time to flush the page with a page
+       * write
+       */
       if (((i % m->page_size) == m->page_size-1) ||
           (i == wsize-1)) {
         rc = avr_write_page(fd, p, m, i);
@@ -792,7 +810,6 @@ int avr_initialize(int fd, AVRPART * p)
 
   avr_powerup(fd);
 
-
   ppi_setpin(fd, pgm->pinno[PIN_AVR_SCK], 0);
   ppi_setpin(fd, pgm->pinno[PIN_AVR_RESET], 0);
   ppi_pulsepin(fd, pgm->pinno[PIN_AVR_RESET]);
@@ -833,7 +850,10 @@ int avr_initialize(int fd, AVRPART * p)
 }
 
 
-
+/*
+ * Allocate and initialize memory buffers for each of the device's
+ * defined memory regions.  
+ */
 int avr_initmem(AVRPART * p)
 {
   LNODEID ln;
@@ -918,8 +938,8 @@ void avr_mem_display(char * prefix, FILE * f, AVRMEM * m, int type)
 {
   if (m == NULL) {
     fprintf(f, 
-            "%sMem                       Page                       Polled\n"
-            "%sType        Paged  Size   Size #Pages MinW  MaxW   ReadBack\n"
+            "%s                          Page                       Polled\n"
+            "%sMemory Type Paged  Size   Size #Pages MinW  MaxW   ReadBack\n"
             "%s----------- ------ ------ ---- ------ ----- ----- ---------\n",
             prefix, prefix, prefix);
   }
diff --git a/avrdude/config_gram.y b/avrdude/config_gram.y
index 4e930a3e..62f3fb8d 100644
--- a/avrdude/config_gram.y
+++ b/avrdude/config_gram.y
@@ -29,7 +29,6 @@
 
 /* $Id$ */
 
-%token K_OP
 %token K_READ
 %token K_WRITE
 %token K_READ_LO
diff --git a/avrdude/lexer.l b/avrdude/lexer.l
index ffcd4bd5..989a885e 100644
--- a/avrdude/lexer.l
+++ b/avrdude/lexer.l
@@ -152,7 +152,6 @@ size             { yylval=NULL; return K_SIZE; }
 vcc              { yylval=NULL; return K_VCC; }
 vfyled           { yylval=NULL; return K_VFYLED; }
 
-op               { yylval=NULL; return K_OP; }
 read             { yylval=new_token(K_READ); return K_READ; }
 write            { yylval=new_token(K_WRITE); return K_WRITE; }
 read_lo          { yylval=new_token(K_READ_LO); return K_READ_LO; }
diff --git a/avrdude/term.c b/avrdude/term.c
index c99de90d..74d2c6a4 100644
--- a/avrdude/term.c
+++ b/avrdude/term.c
@@ -206,6 +206,7 @@ int hexdump_buf(FILE * f, int startaddr, unsigned char * buf, int len)
 
 int cmd_dump(int fd, struct avrpart * p, int argc, char * argv[])
 {
+  static char prevmem[128] = {0};
   char * e;
   unsigned char * buf;
   int maxsize;
@@ -223,6 +224,13 @@ int cmd_dump(int fd, struct avrpart * p, int argc, char * argv[])
 
   memtype = argv[1];
 
+  if (strncmp(prevmem, memtype, strlen(memtype)) != 0) {
+    addr = 0;
+    len  = 64;
+    strncpy(prevmem, memtype, sizeof(prevmem)-1);
+    prevmem[sizeof(prevmem)-1] = 0;
+  }
+
   mem = avr_locate_mem(p, memtype);
   if (mem == NULL) {
     fprintf(stderr, "\"%s\" memory type not defined for part \"%s\"\n",
@@ -298,7 +306,7 @@ int cmd_write(int fd, struct avrpart * p, int argc, char * argv[])
   AVRMEM * mem;
 
   if (argc < 4) {
-    fprintf(stderr, "Usage: write flash|eeprom|fuse <addr> <byte1> "
+    fprintf(stderr, "Usage: write <memtype> <addr> <byte1> "
             "<byte2> ... byteN>\n");
     return -1;
   }