Index: config_gram.y
===================================================================
--- config_gram.y	(revision 1025)
+++ config_gram.y	(working copy)
@@ -60,6 +60,7 @@
 int yyerror(char * errmsg);
 
 static int assign_pin(int pinno, TOKEN * v, int invert);
+static int assign_pin_list(int invert);
 static int which_opcode(TOKEN * opcode);
 static int parse_cmdbits(OPCODE * op);
 
@@ -511,22 +512,8 @@
 ;
 
 pin_list:
-  num_list {
-    {
-      TOKEN * t;
-      int pin;
-
-      current_prog->pinno[pin_name] = 0;
-
-      while (lsize(number_list)) {
-        t = lrmv_n(number_list, 1);
-        pin = t->value.number;
-        current_prog->pinno[pin_name] |= (1 << pin);
-
-        free_token(t);
-      }
-    }
-  }
+  num_list            { assign_pin_list(0); } |
+  TKN_TILDE num_list  { assign_pin_list(1); }
 ;
 
 prog_parm_pins:
@@ -1331,6 +1318,22 @@
   return 0;
 }
 
+static int assign_pin_list(int invert)
+{
+  TOKEN * t;
+  int pin;
+
+  current_prog->pinno[pin_name] = 0;
+  while (lsize(number_list)) {
+    t = lrmv_n(number_list, 1);
+    pin = t->value.number;
+    current_prog->pinno[pin_name] |= (1 << pin);
+    if (invert)
+      current_prog->pinno[pin_name] |= PIN_INVERSE;
+    free_token(t);
+  }
+}
+
 static int which_opcode(TOKEN * opcode)
 {
   switch (opcode->primary) {
Index: par.c
===================================================================
--- par.c	(revision 1025)
+++ par.c	(working copy)
@@ -105,12 +105,16 @@
 
 static void par_setmany(PROGRAMMER * pgm, unsigned int pinset, int value)
 {
-  int pin;
+  int pin, mask;
 
+  /* mask is anything non-pin - needs to be applied to each par_setpin to preserve inversion */
+  mask = pinset & (~PIN_MASK);
+
   for (pin = 1; pin <= 17; pin++) {
     if (pinset & (1 << pin))
-      par_setpin(pgm, pin, value);
+      par_setpin(pgm, pin | mask, value);
   }
+
 }
 
 static int par_getpin(PROGRAMMER * pgm, int pin)
