File pcb-1.6.3.djb.patch of Package pcb

--- pcb-1.6.3/README_FILES/CHANGES
+++ pcb-1.6.3/README_FILES/CHANGES
@@ -1,4 +1,62 @@
 /*
+ * Additions of D.J. Barrow dj_barrow@ariasoft.ie
+ *
+ */
+Main changes
+A few new package definitions including 
+Common SMT components,PCI Board Templates, XCS40 FPGA,
+Improvments to QFP definitions.
+
+Made Soldermask Adjustable it was set to 15 Mils
+this was impractical for SMT components as the primary
+use of the soldermask is to prevent unwanted soldering
+of tracks & pads together & as the space between components
+on a PCI board is typically 4 mils this is too much.
+
+Made gridding adjustable to 1 mil increments 
+( 1 thousand'th of an inch ), this is required for SMT development.
+
+Fixed one crashbug in insert.c owing to missing protype
+
+
+Files added:
+lib/fpga.list
+lib/fpga.m4
+lib/pci.inc
+lib/pci.list
+lib/pci.m4
+genericsmt.inc
+genericsmt.list
+lib/genericsmt.m4
+
+Files Modified:
+globalconst.h
+lib/common.m4
+lib/qfp.inc
+lib/transistor.list
+src/Pcb.ad.raw
+src/action.c
+src/create.c
+src/dev_gerber.c
+src/dev_ps.c
+src/dev_rs274x.c
+src/file.c
+src/global.h
+src/insert.c
+src/main.c
+src/menu.c
+src/parse_l.l
+src/parse_y.h
+src/parse_y.y
+src/print.c
+src/report.c
+src/sed.script
+src/set.c
+src/set.h
+
+
+
+/*
  *  This package is PCB 1.6.3 release by harry eaton.
  *  
  *  I'm too lazy to document all of the changed files
--- pcb-1.6.3/README_FILES/DJBARROW_HINTS.TXT
+++ pcb-1.6.3/README_FILES/DJBARROW_HINTS.TXT
@@ -0,0 +1,145 @@
+Hi all,
+
+Hopefully the following hints & suggestions will make it easier
+for you to build your PCB's.
+
+Stuff I figured out the hard way
+================================
+Firstly the unit of measurment of pcb-1.6.3 is a mil
+whichis a thousand'th of an inch.
+I defined a m4 UM_TO_MIL ( micrometer to mil ) 
+macro to ease entering metric components.
+
+The main purpose of a soldermask/component mask is to insulate
+the tracks & prevent bad soldering joining tracks
+or pads together unintensionally.
+For this reason I made the soldermask size adjustable
+it was 15 mils which was simply too big for PCI boards.
+
+
+To get good at designing new components is pretty
+painful they are written in a macro language called
+m4 & this is used extensively, this saved coding
+which otherwise would be needed in the parser of the
+gnu pcb files, a gui editor would be better provided
+it used text files which is a blessing in gnu pcb. 
+
+
+i.e. 2 passes of m4 are run by the CreateLibrary.sh
+& CreateLibraryContents.sh scripts & a final pass
+is run internally by the Expandfilename function.
+
+The most useful hotkey in gnu pcb is the c key this recentres
+the board at the current mouse cursor position which
+is extremely useful for moving around boards larger than the
+screensize.
+
+
+invoke like
+m4 -dV 
+for verbose debugging info.
+
+The large m4 files
+pcblib & pcblib.contents in
+/usr/X11R6/lib/X11/pcb
+are created by running scripts like
+CreateLibrary.sh ../pcblib m4/common.m4 m4/*.m4
+CreateLibraryContents.sh m4/common.m4 m4/*.list > pcblib.contents
+
+
+To get a single component parsed which might give you some
+ideas on debugging do something like.
+../CreateLibrary.sh ../pcblib common.m4 *.m4
+../CreateLibraryContents.sh common.m4 *.list >../pcblib.contents
+/usr/X11R6/lib/X11/pcb/QueryLibrary.sh '/usr/X11R6/lib/X11/pcb' 'pcblib' 'XCS40_PQ208' 'XCS40' 'COMPACTQFP' 
+
+
+To find out about m4 type 'info m4' if you have m4
+documentation installed in your distro.
+
+The central place where these m4 files are loaded is
+the popen call in misc.c ExpandFilename function the parseing
+functions in parse_l.l parse_y.y are called from here
+If you get parse errors get gdb involved * do some debugging.
+
+It is also very useful to edit the saved pcb files by hand
+as you can do a lot this way which might not be possible from
+within the package.
+
+
+For building boards I recommend www.pcbpool.com  ( this is not
+a plug ) however they have managed to build my boards which is pretty
+unbelievable they are very cost effective & much less painful than 
+explaining ruined carpets etc. with chemicals if you plan to do it yourself.
+
+
+For soldering SMT QFP's with .5 mil between the pins it was suggested
+by a more experienced hardware engineer to use solder paste & a stensil,
+rather than soldering the pins ( I wasted quite a few components by trying
+to solder them the normal way ), if somebody can make a stensil with an inkjet printer
+please let me know how you do it.
+
+For practicing soldering dummy components are also a good idea,
+see
+
+
+
+They have a free package online called GCPrevue which runs
+under windows ( & possibly wine too ) which is the file format
+they expect to receive the files, the gerber files from gnu pcb can be 
+imported to this transparently the only thing which causes a little fun is
+the drill sizes which need to be entered by hand.
+
+
+What can be improved
+====================
+
+It is so much easier to suggest what could be improved than spending
+the few man months required to do it.
+
+It would be an ideal final year project for some electronic engineer or
+computer science guy ( Talk to your teacher ).
+
+
+The code is okay but needs a cleanup the objects should
+be inherited from a single base & flags like solder side & component side
+shouldn't be used insead the code should have layer numbers.
+
+The objects should be a proper linked list tree ( i.e with parent child sibling ) rather than
+current 3 level Board, Element, Pad etc as it currently is.
+& it should be possible to select everything from a single
+pad to the whole board with the same code & based on a single base class
+( to use a C++ ism, this can be done in C ).
+
+e.g. 
+There is distinct code for handling lines & elementlines, arcs & elementarcs.
+I tried adding an outline layer for the PCI m4 components I added however
+the fact that an elementline has to belong to the same layer as its parent
+element & would require extensive coding & testing to verify it was okay
+prevented me.
+So for now you have to move the PCI board outline I set up by hand in the file to
+the appropriate layer.
+
+The polygon tool ( which is commonly needed for ground planes is absolutely awful ),
+it took me as long to put down ground planes as it did the rest of my board.
+This should be like a paint tool in common paint packages & automatically fill
+using the tracks & pads as an outline.
+
+A kde front end would be nice.
+
+Auto routing, there is apparently a freeware algorithm for this available,
+I am sure this would be very difficult to add till the code is cleaned up,
+it possibly can be found on www.opencollector.org.
+
+
+Have Fun,
+D.J.
+dj_barrow@ariasoft.ie
+
+
+
+
+
+
+
+
--- pcb-1.6.3/globalconst.h
+++ pcb-1.6.3/globalconst.h
@@ -74,6 +74,10 @@
 #define	CHUNK			5	/* step size for size sliders */
 #define	MIN_ZOOM		0	/* min zoom (shift operations) */
 #define	MAX_ZOOM		4	/* max zoom (shift operations) */
+#define MIN_SOLDERMASK_FRAME    0      /* tolerance between soldermask & pads. */
+#define DEFAULT_SOLDERMASK_FRAME 0
+#define MAX_SOLDERMASK_FRAME     100
+
 #define	MAX_FONTPOSITION	127	/* upper limit of characters in my font */
 
 #define	MAX_COORD		20000	/* coordinate limits */
--- pcb-1.6.3/lib/Imakefile
+++ pcb-1.6.3/lib/Imakefile
@@ -33,21 +33,22 @@
 
 TARGETS = $(DEFAULTLIBRARY) $(DEFAULTLIBRARY).contents
 COMMON  = common.m4
-INC     = connector.inc dil.inc misc.inc plcc.inc to.inc qfp.inc
+INC     = connector.inc dil.inc misc.inc plcc.inc to.inc qfp.inc \
+	pci.inc genericsmt.inc
 
 SRC     = TTL_74xx_DIL.m4 \
 		  crystal.m4 connector.m4 generic.m4 \
 		  linear.m4 logic.m4 lsi.m4 memory.m4 \
 		  optical.m4 resistor_array.m4 resistor_0.25W.m4 \
 		  texas_inst_voltage_reg.m4 texas_inst_amplifier.m4 \
-		  transistor.m4
+		  transistor.m4 fpga.m4 pci.m4 genericsmt.m4
 
 LIST    = TTL_74xx_DIL.list \
 		  crystal.list connector.list generic.list \
 		  linear.list logic.list lsi.list memory.list \
 		  optical.list resistor_array.list resistor_0.25W.list \
 		  texas_inst_voltage_reg.list texas_inst_amplifier.list \
-		  transistor.list
+		  transistor.list fpga.list pci.list genericsmt.list 
 
 SCRIPTS = CreateLibrary.sh CreateLibraryContents.sh \
           ListLibraryContents.sh QueryLibrary.sh
--- pcb-1.6.3/lib/common.m4
+++ pcb-1.6.3/lib/common.m4
@@ -54,7 +54,9 @@
 # the first two arguments are skipped
 #
 define(`PIN', `Pin($1 $2 $3 $4 ifdef(`P_$5', "P_$5", "$5") ifelse($5, 1, 0x101, 0x01))')
-define(`PAD', `Pad($1 $2 $3 $4 $5 ifdef(`P_$6', "P_$6", "$6") ifelse($6, 1, 0x00, 0x100))')
+define(`PAD', `Pad($1 $2 $3 $4 $5 ifdef(`P_$6', "P_$6", "$6") "$6" ifelse($6, 1, 0x00, 0x100))')
+
+define(`EDGECONN', `Pad($1 $2 $3 $4 $5 ifdef(`P_$6', "P_$6", "$6") "$6" $7)')
 define(`DEFPIN', `define(`count', incr(count))' `define(`P_'count, $1)')
 define(`DefinePinList', `ifelse($#, 1, ,
 	`pushdef(`count')'
@@ -65,11 +67,16 @@
 	`DEFPIN(`$1')'`
 	_DEFPINLIST(shift($@))')')
 
+define(`args',`
+	ifelse($#, 0, , $#, 1,`define(`arg'cnt,`$1')',
+	`define(`arg'cnt,`$1') define(`cnt',incr(cnt)) args(shift($@))')')
+
 include(connector.inc)
 include(dil.inc)
 include(misc.inc)
 include(plcc.inc)
 include(to.inc)
 include(qfp.inc)
-
+include(pci.inc)
+include(genericsmt.inc)
 divert(0)dnl
--- pcb-1.6.3/lib/fpga.list
+++ pcb-1.6.3/lib/fpga.list
@@ -0,0 +1,2 @@
+XCS40_PQ208:COMPACTQFP:XCS40
+AT512:JEDECQFP2:JEDEC
--- pcb-1.6.3/lib/fpga.m4
+++ pcb-1.6.3/lib/fpga.m4
@@ -0,0 +1,48 @@
+divert(-1)
+#
+# Definitions for Xilinx XCS40 FPGA's
+# by D.J. Barrow dj_barrow@ariasoft.ie
+#
+define(`PL_XCS40_PQ208_1',``GND',`IO_GCK1',`I/O',`I/O',`I/O',`I/O(TDI)',`I/O_TCK',`I/O',`I/O',`I/O',`I/O',`I/O'') #P12
+
+define(`PL_XCS40_PQ208_2',``GND',`I/O',`I/O',`I/O(TMS)',`I/O',`VCC'') #P18
+
+define(`PL_XCS40_PQ208_3',``I/O',`I/O',`I/O',`I/O',`I/O',`I/O',`GND',`VCC',`I/O',`I/O',`I/O',`I/O'') #29
+
+define(`PL_XCS40_PQ208_4',``I/O',`I/O',`VCC',`I/O',`I/O',`I/O',`I/O',`GND',`I/O',`I/O',`I/O',`I/O',`I/O',`I/O',`I/O',`I/O',`I/O',`I/O',`I/O_GCK2'') #P49
+
+define(`PL_XCS40_PQ208_5',``M1',`GND',`M0',`VCC',`PWRDOWN',`I/O(GCK3)',`I/O(HDC)',`I/O',`I/O',`I/O',`I/O(LDC)',`I/O',`I/O',`I/O',`I/O',`I/O'') #66
+
+define(`PL_XCS40_PQ208_6',``GND',`I/O',`I/O',`I/O',`I/O',`VCC',`I/O',`I/O',`I/O',`I/O',`I/O',`I/O(INIT)',`VCC',`GND',`I/O',`I/O',`I/O',`I/O'') #83
+
+define(`PL_XCS40_PQ208_7',``I/O',`I/O',`VCC',`I/O',`I/O',`I/O',`I/O',`GND',`I/O',`I/O',`I/O',`I/O',`I/O',`I/O',`I/O',`I/O',`I/O',`I/O',`I/O(GCK4)',`GND',`DONE',`VCC',`PROGRAM',`I/O(D7)'') #107
+
+define(`PL_XCS40_PQ208_8',``I/O(GCK5)',`I/O',`I/O',`I/O',`I/O(D6)',`I/O',`I/O',`I/O',`I/O',`I/O',`GND',`I/O',`I/O',`VCC',`I/O(D5)',`I/O'') #123
+
+define(`PL_XCS40_PQ208_9',``I/O',`I/O',`I/O',`I/O',`I/O(D4)',`I/O',`VCC',`GND',`I/O(D3)',`I/O',`I/O',`I/O',`I/O',`I/O'') #137
+
+define(`PL_XCS40_PQ208_10',``I/O(D2)',`I/O',`VCC',`I/O',`I/O',`GND',`I/O',`I/O',`I/O',`I/O',`I/O',`I/O(D1)',`I/O',`I/O',`I/O',`I/O(D0_DIN)',`I/O(GCK6_DOUT)',`CCLK',`VCC',`O(TDO)'') #157
+
+define(`PL_XCS40_PQ208_11',``GND',`I/O',`I/O(GCK7)',`I/O',`I/O',`I/O(CS1)',`I/O',`I/O',`I/O',`I/O',`I/O',`I/O',`GND',`I/O',`I/O',`VCC',`I/O',`I/O',`I/O',`I/O',`I/O',`I/O',`I/O',`I/O',`GND'')
+
+define(`PL_XCS40_PQ208_12',``VCC',`I/O',`I/O',`I/O',`I/O',`I/O',`I/O',`I/O',`I/O',`VCC',`I/O',`I/O',`GND',`I/O',`I/O',`I/O',`I/O',`I/O',`I/O',`I/O',`I/O',`I/O',`I/O',`I/O',`I/O(GCK8)',`VCC'') #208
+
+define(`Description_XCS40_PQ208',`Xilinx XCS40 PQ208')
+define(`PinList_XCS40_PQ208',`PL_XCS40_PQ208_1,PL_XCS40_PQ208_2,PL_XCS40_PQ208_3,PL_XCS40_PQ208_4,PL_XCS40_PQ208_5,PL_XCS40_PQ208_6,PL_XCS40_PQ208_7,PL_XCS40_PQ208_8,PL_XCS40_PQ208_9,PL_XCS40_PQ208_10,PL_XCS40_PQ208_11,PL_XCS40_PQ208_12')
+define(`Param1_XCS40_PQ208',`208')
+define(`Param2_XCS40_PQ208',`0')
+define(`Description_AT512',`Atmel FPGA Configuration Memory AT512 AT010')
+define(`Param1_AT512',`20')
+define(`Param2_AT512',`0')
+define(`PinList_AT512',``NC',`DATA',`NC',`CLK',`WP1',`RESET_OE',`WP2',`CE',`NC',`GND',`NC',`NC',`NC',`CEO_A2',`READY',`NC',`SER_EN',`NC',`NC',`VCC'')
+divert(0)dnl
+
+
+
+
+
+
+
+
+
+
--- pcb-1.6.3/lib/genericsmt.inc
+++ pcb-1.6.3/lib/genericsmt.inc
@@ -0,0 +1,42 @@
+# Convert micrometers to mils ( thousandths of an inch ) 
+define(`UM_TO_MIL',`eval(($1*10)/254)')
+# the definition of a general axial package
+# $1: canonical name
+# $2: name on PCB
+# $3: length, width,padlength
+define(`PKG_GENERIC_SMT',`
+ 	define(`cnt',`1')
+	define(`ARGS',$3)	
+	args(ARGS)
+	define(`LENGTH',`UM_TO_MIL(arg1)')
+ 	define(`WIDTH',`UM_TO_MIL(arg2)')
+	define(`PADLENGTH',`UM_TO_MIL(arg3)')
+   	define(`CENTRE',`eval(LENGTH/2)')
+	define(`PENWIDTH',`eval(PADLENGTH)')
+	define(`PADLENGTH2',`eval(LENGTH-PADLENGTH)')
+	define(`PADCENTRE',`eval(PADLENGTH/2)')
+	define(`PADCENTRE2',`eval(LENGTH-(PADLENGTH/2))')
+Element(0x00 "$1" "$2" "$3" CENTRE eval(WIDTH+10) 0 100 0x00)
+(
+ 	PAD(0,0,0,WIDTH,PENWIDTH, 1)
+	PAD(0,0,PADLENGTH,0,PENWIDTH,1)
+	PAD(PADLENGTH,0,PADLENGTH,WIDTH,PENWIDTH, 1)
+	PAD(0,WIDTH,PADLENGTH,WIDTH,PENWIDTH, 1)
+	PAD(PADCENTRE,0,PADCENTRE,WIDTH,PENWIDTH,1)
+
+
+	PAD(LENGTH,0,LENGTH,WIDTH,PENWIDTH, 1)
+	PAD(LENGTH,0,PADLENGTH2,0,PENWIDTH,1)
+	PAD(PADLENGTH2,0,PADLENGTH2,WIDTH,PENWIDTH, 1)
+	PAD(LENGTH,WIDTH,PADLENGTH2,WIDTH,PENWIDTH, 1)
+	PAD(PADCENTRE2,0,PADCENTRE2,WIDTH,PENWIDTH,1)
+
+        ElementLine(0 0 LENGTH 0 1)
+	ElementLine(LENGTH 0 LENGTH WIDTH 1)
+	ElementLine(0 WIDTH LENGTH WIDTH 1)
+	ElementLine(0 0 0 WIDTH 1)
+        	
+)
+')
+
+
--- pcb-1.6.3/lib/genericsmt.list
+++ pcb-1.6.3/lib/genericsmt.list
@@ -0,0 +1,12 @@
+JEDEC_20_PIN_PLCC:JEDECQFP:JEDEC
+SMT_402_CAP_RES:GENERIC_SMT:1000,500,250
+SMT_603_CAP_RES:GENERIC_SMT:1600,800,250
+SMT_805_CAP_RES:GENERIC_SMT:2100,1300,350
+SMT_1206_CAP_RES:GENERIC_SMT:3100,1550,450
+SMT_2010_CAP_RES:GENERIC_SMT:5000,2500,650
+SMT_2512_CAP_RES:GENERIC_SMT:6400,3200,750
+
+
+
+
+
--- pcb-1.6.3/lib/genericsmt.m4
+++ pcb-1.6.3/lib/genericsmt.m4
@@ -0,0 +1,23 @@
+divert(-1)
+#
+# Definitions for common SMT components
+# by D.J. Barrow dj_barrow@ariasoft.ie
+#
+define(`Description_JEDEC_20_PIN_PLCC',`Jedec 20 pin PLCC QFP')
+define(`Param1_JEDEC_20_PIN_PLCC',`20')
+define(`Param2_JEDEC_20_PIN_PLCC',`0')
+define(`Description_SMT_402_CAP_RES',`SMT 402 type capicitor/resistor')
+define(`Description_SMT_603_CAP_RES',`SMT 603 type capicitor/resistor')
+define(`Description_SMT_805_CAP_RES',`SMT 805 type capicitor/resistor')
+define(`Description_SMT_1206_CAP_RES',`SMT 1206 type capicitor/resistor')
+define(`Description_SMT_2010_CAP_RES',`SMT 2010 type capicitor/resistor')
+define(`Description_SMT_2512_CAP_RES',`SMT 2512 type capicitor/resistor')
+divert(0)dnl
+
+
+
+
+
+
+
+
--- pcb-1.6.3/lib/pci.inc
+++ pcb-1.6.3/lib/pci.inc
@@ -0,0 +1,133 @@
+#
+# Definitions for PCI boards
+# by D.J. Barrow dj_barrow@ariasoft.ie
+#
+# please note that you will need to edit the saved pcb file
+# by hand to move the board outline onto a seperate layer
+# I suggest one of the unused layers.
+
+define(`GETNUMARRAYS',`eval(($#)/2)')
+# $1: canonical name
+# $2: name on PCB
+# $3: boardheight,number of pins,arcradius,..., number of pins
+define(`PKG_PCIPINARRAY',
+	`
+        define(`cnt',`1')
+        define(`ARGS',$3)
+	args(ARGS)
+	define(`LEFTOFFSET',`100')
+	define(`EDGEGAP',`12')
+	define(`PINDIST',`50')
+    	define(`PINWIDTH',`25')
+	define(`NUMARRAYS',`GETNUMARRAYS(ARGS)')
+        define(`TOTALPINS1',forloop(`IDX',0,eval(NUMARRAYS-1),
+		``arg'eval((IDX*2)+2) + ')0)
+	define(`TOTALPINS',eval(TOTALPINS1))
+	ifelse(1,eval(NUMARRAYS>1),`
+		define(`TOTALDIAMETER1',forloop(`IDX',0,eval(NUMARRAYS-2),
+			``arg'eval((IDX*2)+3) + ')0)
+		define(`TOTALDIAMETER',eval(TOTALDIAMETER1))
+	')
+    	define(`PINCENTER',`eval(LEFTOFFSET+(PINDIST/2))')
+    	define(`PINRADIUS',`eval(PINWIDTH/2)')
+    	define(`PINLEFT',`eval(PINCENTER-PINRADIUS)')
+    	define(`PINRIGHT',`eval(PINCENTER+PINRADIUS)')
+    	define(`PENWIDTH',`eval(PINRADIUS+1)')
+    	define(`PENRADIUS',`eval(PENWIDTH/2)')
+    	define(`MAXIDX',`eval(TOTALPINS - 1)')
+    	define(`ARRAYWIDTH', `eval((TOTALPINS*PINDIST)+TOTALDIAMETER)')
+    	define(`CENTERX', `eval(((ARRAYWIDTH+LEFTOFFSET)/2))')
+    	define(`MINY',`20')
+    	define(`MIDY',`220')
+    	define(`MAXY',`270')
+    	define(`ARCRADIUS',`12')
+	define(`ARCDIAMETER',`eval(ARCRADIUS*2)')
+    	define(`LMAXY',`eval(MAXY+ARCRADIUS)')
+	define(`BOARDTOP',`eval(LMAXY-arg1)')
+	define(`SCREWBORDER',275)
+Element(0x00  "$1" "$2" "$3" CENTERX 10 1 30 0x00)
+(
+	Mark(CENTERX 135)
+	define(`ADDSIDE',0)
+	define(`FLAG',0x0)
+	define(`LOOPIDX1',eval(NUMARRAYS-1))
+	define(`LEFT1',`eval(PINLEFT-ARCRADIUS)')
+	define(`ARCRADIUS2',`100')
+	define(`SLOTWIDTH',`1000')
+	define(`BRACKETLEFT',`-1525')
+	define(`LEFT2',`eval(LEFT1-ARCRADIUS2)')
+	define(`LEFT3',`eval(LEFT1+ARCRADIUS2-SLOTWIDTH)')
+	define(`LEFT4',`eval(LEFT1-SLOTWIDTH)')
+	ElementArc(LEFT2 0 ARCRADIUS2 ARCRADIUS2 180 90 1)
+  	ElementLine(LEFT2 -ARCRADIUS2 LEFT3 -ARCRADIUS2 1)
+	ElementArc(LEFT3 0 ARCRADIUS2 ARCRADIUS2 270 90 1)
+	ElementLine(LEFT4 0 LEFT4 MAXY 1)
+        define(`LEFT5',`eval(LEFT4-ARCRADIUS)')
+	ElementArc(LEFT5 MAXY ARCRADIUS ARCRADIUS 90 90 1)
+        ElementLine(LEFT5 LMAXY BRACKETLEFT LMAXY 1)
+   	forloop(`SIDE',0,1,
+   	`
+		define(`IDX',`0')
+		define(`ADDDIAMETER',`0')
+		forloop(`IDX1',0,LOOPIDX1,
+		`
+			define(`CURRNUMPINS',`arg'eval((IDX1*2)+2))
+			ifelse(SIDE,`0',`
+				define(`CURRLEFT',`eval((PINDIST*IDX)+(ADDDIAMETER)+PINLEFT)')
+				define(`CURRRIGHT',`eval(CURRLEFT+((CURRNUMPINS-1)*PINDIST)+PINWIDTH)')
+				ElementLine(CURRLEFT LMAXY CURRRIGHT LMAXY 2)
+				ElementArc(CURRLEFT MAXY ARCRADIUS ARCRADIUS 0 90 2)
+				ElementArc(CURRRIGHT MAXY ARCRADIUS ARCRADIUS 90 90 2)
+				define(`CURRLEFT1',`eval(CURRLEFT-ARCRADIUS)')
+				define(`CURRRIGHT1',`eval(CURRRIGHT+ARCRADIUS)')
+		                ElementLine(CURRLEFT1 0 CURRLEFT1 MAXY 1)
+                                ElementLine(CURRRIGHT1 0 CURRRIGHT1 MAXY 1)
+		                ifelse(1,eval((NUMARRAYS>1)&&(IDX1<LOOPIDX1)),`
+					define(`CURRDIAMETER',`arg'eval((IDX1*2)+3))
+					define(`CURRRADIUS',`eval(CURRDIAMETER/2)')
+					ElementArc(eval(CURRRIGHT+EDGEGAP+(CURRDIAMETER/2)) 0 CURRRADIUS CURRRADIUS 180 180 1)
+				')
+	   			ifelse(1,eval(IDX1==LOOPIDX1),`
+					ElementLine(BRACKETLEFT LMAXY BRACKETLEFT BOARDTOP 1)
+					ElementLine(BRACKETLEFT BOARDTOP CURRRIGHT1 BOARDTOP 1)
+					ElementLine(CURRRIGHT1 BOARDTOP CURRRIGHT1 0 1)
+				        
+				        ElementArc(eval(BRACKETLEFT+SCREWBORDER) eval(LMAXY-SCREWBORDER) 125 125 0 360 1)
+				        ElementArc(eval(BRACKETLEFT+SCREWBORDER) eval(BOARDTOP+SCREWBORDER) 125 125 0 360 1)
+				')
+			')
+   			forloop(`IDX2',0,eval(CURRNUMPINS-1),
+   			`
+				define(`CURRX',`eval((PINDIST*IDX)+(ADDDIAMETER))')
+				define(`MINX',`eval(PINLEFT+CURRX)')
+				define(`MIDX',`eval(PINCENTER+CURRX)')
+				define(`MAXX',`eval(PINRIGHT+CURRX)')
+				define(`PINIDX',`eval(IDX+1+ADDSIDE)')
+	                        EDGECONN(MINX,MINY,MAXX,MINY,PENWIDTH,PINIDX,FLAG)
+				EDGECONN(MINX,MINY,MINX,MIDY,PENWIDTH,PINIDX,FLAG)
+				EDGECONN(MINX,MIDY,MIDX,MAXY,PENWIDTH,PINIDX,FLAG)
+				EDGECONN(MIDX,MINY,MIDX,MAXY,PENWIDTH,PINIDX,FLAG)
+				EDGECONN(MAXX,MINY,MAXX,MIDY,PENWIDTH,PINIDX,FLAG)
+				EDGECONN(MAXX,MIDY,MIDX,MAXY,PENWIDTH,PINIDX,FLAG)				
+				define(`IDX',incr(IDX))
+			')
+			
+			ifelse(1,eval((NUMARRAYS>1)&&(IDX1<LOOPIDX1)),`
+				define(`ADDDIAMETER1',forloop(`IDX2',0,eval(IDX1),
+				``arg'eval((IDX2*2)+3)+')0)
+				define(`ADDDIAMETER',eval(ADDDIAMETER1+(EDGEGAP*2)-PINDIST+PINWIDTH))
+			')
+		')
+		define(`ADDSIDE',`TOTALPINS')
+		define(`FLAG',0x80)
+  	')
+	 
+)')
+
+
+
+
+
+
+
+
--- pcb-1.6.3/lib/pci.list
+++ pcb-1.6.3/lib/pci.list
@@ -0,0 +1,6 @@
+PCI5V_AVE_HEIGHT:PCIPINARRAY:2810,49,100,11
+PCI5V_MIN_HEIGHT:PCIPINARRAY:1420,49,100,11
+PCI5V_MAX_HEIGHT:PCIPINARRAY:4200,49,100,11
+PCI5V_SMALL_HEIGHT:PCIPINARRAY:2063,49,100,11
+
+
--- pcb-1.6.3/lib/pci.m4
+++ pcb-1.6.3/lib/pci.m4
@@ -0,0 +1,42 @@
+divert(-1)
+#
+# Definitions for PCI boards
+# by D.J. Barrow dj_barrow@ariasoft.ie
+#
+define(`PL_PCISideB1',``-12V',`TCK',`Ground',`TD0',`+5V',`+5V',`INTB*',`INTD*',`PRSNT1*',`Reserved',`PRSNT2*'')
+
+define(`PL_PCISideB2',``Ground',`Ground'')
+
+define(`PL_PCISideB3',``Reserved',`Ground',`CLK',`Ground',`REQ*',`+5V',`AD[31]',`AD[29]',`Ground',`AD[27]',`AD[25]',`+3.3V',`C/BE[3]*',`AD[23]',`Ground',`AD[21]',`AD[19]',`+3.3V',`AD[17]',`C/BE[2]*',`Ground',`IRDY*',`+3.3V',`DEVSEL*',`Ground',`LOCK*',`PERR*',`+3.3V',`SERR*',`+3.3V',`C/BE[1]*',`AD[14]',`Ground',`AD[12]',`AD[10]',`Ground'')
+
+define(`PL_PCISideB4',``Ground',`Ground'')
+define(`PL_PCISideB5',``AD[08]',`AD[07]',`+3.3V',`AD[05]',`AD[03]',`Ground',`AD[01]',`+5V',`ACK64*',`+5V',`+5V'')
+
+
+define(`PL_PCISideB6',``Reserved',`Ground',`C/BE[6]*',`C/BE[4]*',`Ground',`AD[63]',`AD[61]',`+5V',`AD[59]',`AD[57]',`Ground',`AD[55]',`AD[53]',`Ground',`AD[51]',`AD[49]',`+5V',`AD[47]',`AD[45]',`Ground',`AD[43]',`AD[41]',`Ground',`AD[39]',`AD[37]',`+5V',`AD[35]',`AD[33]',`Ground',`Reserved',`Reserved',`Ground'')
+
+define(`PL_PCISideA1',``TRST*',`+12V',`TMS',`TDI',`+5V',`INTA*',`INTC*',`+5V',`Reserved',`+5V',`Reserved'')
+
+define(`PL_PCISideA2',``Ground',`Ground'')
+define(`PL_PCISideA3',``3.3Vaux',`RST*',`+5V',`GNT*',`Ground',`PME*',`AD[30]',`+3.3V',`AD[28]',`AD[26]',`Ground',`AD[24]',`IDSEL',`+3.3V',`AD[22]',`AD[20]',`Ground',`AD[18]',`AD[16]',`+3.3V',`FRAME*',`Ground',`TRDY*',`Ground',`STOP*',`+3.3V',`Reserved',`Reserved',`Ground',`PAR',`AD[15]',`+3.3V',`AD[13]',`AD[11]',`Ground',`AD[09]'')
+
+
+define(`PL_PCISideA4',``Ground',`Ground'')
+define(`PL_PCISideA5',``C/BE[0]*',`+3.3V',`AD[06]',`AD[04]',`Ground',`AD[02]',`AD[00]',`+5V',`REQ64*',`+5V',`+5V'')
+
+define(`PL_PCISideA6',``Ground',`C/BE[7]*',`C/BE[5]*',`+5V',`PAR64',`AD[62]',`Ground',`AD[60]',`AD[58]',`Ground',`AD[56]',`AD[54]',`+5V',`AD[52]',`AD[50]',`Ground',`AD[48]',`AD[46]',`Ground',`AD[44]',`AD[42]',`+5V',`AD[40]',`AD[38]',`Ground',`AD[36]',`AD[34]',`Ground',`AD[32]',`Reserved',`Ground',`Reserved'')
+define(`Description_PCI5V_AVE_HEIGHT',`PCI 5V Array Average Height')
+define(`Description_PCI5V_MIN_HEIGHT',`PCI 5V Array Min Height')
+define(`Description_PCI5V_MAX_HEIGHT',`PCI 5V Array Max Height')
+define(`Description_PCI5V_SMALL_HEIGHT',`PCI 5V Array Small Height')
+define(`PinList_PCI5V',`PL_PCISideB1,PL_PCISideB2,PL_PCISideB3,PL_PCISideB5,PL_PCISideA1,PL_PCISideA2,PL_PCISideA3,PL_PCISideA5')
+
+divert(0)dnl
+
+
+
+
+
+
+
+
--- pcb-1.6.3/lib/qfp.inc
+++ pcb-1.6.3/lib/qfp.inc
@@ -21,79 +21,119 @@
 #   Contact addresses for paper mail and Email:
 #   Thomas Nau, Schlehenweg 15, 88471 Baustetten, Germany
 #   Thomas.Nau@rz.uni-ulm.de
+#   Improvments by D.J. Barrow dj_barrow@ariasoft.ie
 # 
 #   RCS: $Id: qfp.inc,v 0.1 1998/03/31 00:34:00 olson Exp $
 #
 #  QFP packages
 #
-
-# -------------------------------------------------------------------
-# ThanX to Johan Andersson (johan@homemail.com), modified by Thomas Nau
-# the definition of a plcc package for base code to make qfp package.
-# modified for correct pad numbering by Holm Tiffe
-#
-# Code from plcc.inc modified by Thomas Olson to make this qfp.inc definition.
-# Although in retrospec quad flat packs are more diverse than this algorithm will do.
-# Many qfp are the same physical size but have more thus narrower pads. 
 # $1: canonical name
 # $2: name on PCB
 # $3: value
 # $4: number of pins
-# $5: additional border (will be ignored)
-#
-define(`PKG_QFP',
+# $5: additional border
+# $6: pad pitch in millionths of inches
+# $7: pad thickness
+# $8: pad min offset ( edge nearest package )
+# $9: pad max offset ( edge furthest away from package )
+# $10: pin0 in middle
+define(`PKG_GENERIC_QFP',
 	`define(`QUARTER', `eval($4 /4)')
 	define(`OFFSET', `eval((QUARTER +1) /2)')
-	define(`WIDTH', `eval((QUARTER-1) *31 +2*42)')
+	define(`BORDER',`$5')
+	define(`PITCH',`$6')
+	define(`WIDTH', `eval((((QUARTER-1)*PITCH)/1000)+2*BORDER)')
 	define(`CENTER', `eval(WIDTH / 2)')
 	define(`NUMPINS', `$4')
+	define(`PADTHICKNESS',`$7')
+	define(`PADMINOFFSET',`$8')
+	define(`PADMAXOFFSET',`$9')
+	define(`FARPIN',`eval(WIDTH-BORDER)')
+        define(`PIN1INMIDDLE',`$10')
+        define(`EDGECUT',`ifelse(1,eval(PIN1INMIDDLE),`0',`28')')
+	define(`STARTPIN',`ifelse(1,eval(PIN1INMIDDLE),`eval(((QUARTER+1)/2)+1)',`1')')
+	define(`CIRCLECENTRE',`ifelse(1,eval(PIN1INMIDDLE),`eval(WIDTH/2)',35)')
 Element(0x00 "$1" "$2" "$3" 100 CENTER 0 100 0x00)
 (
 
 	# left row
 define(`X', 0)
-define(`Y', 42)
-#define(`count', `eval(OFFSET+1)')
-define(`count', 1)
+define(`QFPPIN',`STARTPIN')
+define(`idx',0)
 forloop(`i', 1, QUARTER,
-	`PAD(eval(X-65), Y, eval(X+5), Y, 20, count)' `define(`count', incr(count))'
-	`define(`Y', eval(Y+31))'
-	)
+	`define(`Y', `eval(BORDER+((PITCH*idx)/1000))')'
+	`PAD(eval(X-PADMAXOFFSET), Y, eval(X+PADMINOFFSET), Y, PADTHICKNESS, QFPPIN)' 
+	`define(`QFPPIN', incr(QFPPIN))'
+	`define(`idx',incr(idx))'
+)
 
 	# bottom row
-define(`X', 42)
 define(`Y', WIDTH)
+define(`idx',0)
 forloop(`i', 1, QUARTER,
-	`PAD(X, eval(Y+65), X, eval(Y-5), 20, count)' `define(`count', incr(count))'
-	`define(`X', eval(X+31))'
+	`define(`X', `eval(BORDER+((PITCH*idx)/1000))')'
+	`PAD(X, eval(Y+PADMAXOFFSET), X, eval(Y-PADMINOFFSET), PADTHICKNESS, QFPPIN)' 
+	`define(`QFPPIN', incr(QFPPIN))'
+	`define(`idx',incr(idx))'
 )
 
 	# right row
 define(`X', WIDTH)
-define(`Y', eval(WIDTH-42))
+define(`idx',0)
 forloop(`i', 1, QUARTER,
-	`PAD(eval(X+65), Y, eval(X-5), Y, 20, count)' `define(`count', incr(count))'
-	`define(`Y', eval(Y-31))'
+	`define(`Y', `eval(FARPIN-((PITCH*idx)/1000))')'
+	`PAD(eval(X+PADMAXOFFSET), Y, eval(X-PADMINOFFSET), Y, PADTHICKNESS, QFPPIN)' 
+	`define(`QFPPIN', incr(QFPPIN))'
+	`define(`idx',incr(idx))'
 )
 
 	# top row
-define(`X', eval(WIDTH-42))
 define(`Y', 0)
+define(`idx',0)
 forloop(`i', 1, QUARTER,
-	`PAD(X, eval(Y-65), X, eval(Y+5), 20, count)' `define(`count', incr(count))'
-	`ifelse(eval(count > NUMPINS), 1, `define(`count', 1)')'
-	`define(`X', eval(X-31))'
+	`define(`X',`eval(FARPIN-((PITCH*idx)/1000))')'
+	`PAD(X, eval(Y-PADMAXOFFSET), X, eval(Y+PADMINOFFSET), PADTHICKNESS, QFPPIN)' 
+	`define(`QFPPIN', incr(QFPPIN))'
+	`ifelse(eval(QFPPIN > NUMPINS), 1, `define(`QFPPIN', 1)')'
+	`define(`idx',incr(idx))'
 )
 
-	ElementLine(28 0 WIDTH 0 10)
+	ElementLine(EDGECUT 0 WIDTH 0 10)
 	ElementLine(WIDTH 0 WIDTH WIDTH 10)
 	ElementLine(WIDTH WIDTH 0 WIDTH 10)
-	ElementLine(0 WIDTH 0 28 10)
-	ElementLine(0 28 28 0 10)
-
-	ElementArc(80 80 20 20 0 360 10)
+	ElementLine(0 WIDTH 0 EDGECUT 10)
+	ElementLine(0 EDGECUT EDGECUT 0 10)
+	ElementArc(CIRCLECENTRE 35 10 10 0 360 10)
 
 	Mark(0 0)
 )')
 
 # -------------------------------------------------------------------
+# ThanX to Johan Andersson (johan@homemail.com), modified by Thomas Nau
+# the definition of a plcc package for base code to make qfp package.
+# modified for correct pad numbering by Holm Tiffe
+#
+# Code from plcc.inc modified by Thomas Olson to make this qfp.inc definition.
+# Although in retrospec quad flat packs are more diverse than this algorithm will do.
+# Many qfp are the same physical size but have more thus narrower pads. 
+# $1: canonical name
+# $2: name on PCB
+# $3: value
+# $4: number of pins
+# $5: additional border (will be ignored)
+#
+define(`PKG_QFP',`PKG_GENERIC_QFP(`$1',`$2',`$3',`$4',`42',`31000',`20',`5',`65',`0')')	
+# Same as QFP except more compact typical example is a XCS40 PQ 208C
+define(`PKG_COMPACTQFP',`PKG_GENERIC_QFP(`$1',`$2',`$3',`$4',`39',`19685',`12',`-20',`80',`0')')
+define(`PKG_JEDECQFP2',`PKG_GENERIC_QFP(`$1',`$2',`$3',`$4',`42',`50000',`35',`-5',`65',`1')')	
+
+# -------------------------------------------------------------------
+
+
+
+
+
+
+
+
+
--- pcb-1.6.3/src/Pcb.ad.raw
+++ pcb-1.6.3/src/Pcb.ad.raw
@@ -402,8 +402,8 @@
   !Shift<Key>e:        DeleteRats(SelectedRats) \n\
   None<Key>f:          Connection(Find) \n\
   !Shift<Key>f:        Connection(Reset) \n\
-  None<Key>g:          SetValue(Grid, +5) \n\
-  !Shift<Key>g:        SetValue(Grid, -5) \n\
+  None<Key>g:          SetValue(Grid, +1) \n\
+  !Shift<Key>g:        SetValue(Grid, -1) \n\
   None<Key>h:          ToggleHideName(Object) \n\
   !Shift<Key>h:        ToggleHideName(SelectedElements) \n\
   !Ctrl<Key>h:         ChangeHole(ToggleObject) \n\
--- pcb-1.6.3/src/action.c
+++ pcb-1.6.3/src/action.c
@@ -147,6 +147,7 @@
 	F_SelectedTexts,
 	F_SelectedVias,
 	F_SelectedRats,
+	F_SoldermaskFrame,
 	F_Text,
 	F_TextByName,
 	F_TextScale,
@@ -252,6 +253,7 @@
         { "SelectedRats", F_SelectedRats },
 	{ "SelectedTexts", F_SelectedTexts },
 	{ "SelectedVias", F_SelectedVias },
+	{ "SoldermaskFrame", F_SoldermaskFrame },
 	{ "Text", F_Text },
 	{ "TextByName", F_TextByName },
 	{ "TextScale", F_TextScale },
@@ -894,6 +896,9 @@
 			case F_TextScale:
 				SetTextScale(r ? value +Settings.TextScale : value);
 				break;
+		   case F_SoldermaskFrame:
+		                SetSoldermaskFrame(r ? value + PCB->SoldermaskFrame : value);
+		                break;
 		}
 		RestoreCrosshair(True);
 	}
--- pcb-1.6.3/src/create.c
+++ pcb-1.6.3/src/create.c
@@ -115,6 +115,7 @@
 		/* no pixmap allocated yet */
 	ptr->SaveUnder = BadAlloc;
 	ptr->ID = ID++;
+	ptr->SoldermaskFrame=Settings.SoldermaskFrame;
 	return(ptr);
 }
 
--- pcb-1.6.3/src/dev_gerber.c
+++ pcb-1.6.3/src/dev_gerber.c
@@ -21,6 +21,7 @@
  *  Contact addresses for paper mail and Email:
  *  Thomas Nau, Schlehenweg 15, 88471 Baustetten, Germany
  *  Thomas.Nau@rz.uni-ulm.de
+ *  D.J. Barrow dj_barrow@ariasoft.ie added soldermask support.
  *
  */
 
@@ -215,7 +216,7 @@
 static	void	GB_PrintPad(PadTypePtr, int);
 static	void	GB_PrintPinOrVia(PinTypePtr, int);
 static	void	GB_PrintPadMask(PadTypePtr, int);
-static	void	GB_PrintPinOrViaMask(PinTypePtr, int);
+static	void	GB_PrintPinMask(PinTypePtr, int);
 static	void	GB_PrintClearPinOrViaOnGroundplane(PinTypePtr, int);
 static	void	GB_PrintMaskOrGroundplaneRectangle(Position, Position,
 			Position, Position, int);
@@ -255,7 +256,7 @@
 	GB_PrintPad,				/* print pad */
 	GB_PrintPinOrVia,			/* print pin or via */
 	GB_PrintPadMask,			/* print pad mask */
-	GB_PrintPinOrViaMask,			/* print pin or via mask */
+	GB_PrintPinMask,			/* print pin or via mask */
 	GB_PrintClearPinOrViaOnGroundplane,	/* print clear pin or via on groundplane */
 	GB_PrintMaskOrGroundplaneRectangle,	/* print filled rectangle
 						   for ground planes and/or
@@ -1123,7 +1124,7 @@
 /* ----------------------------------------------------------------------
  * prints a via or pin mask
  */
-static void GB_PrintPinOrViaMask(PinTypePtr Pin, int unsued)
+static void GB_PrintPinMask(PinTypePtr Pin, int unsued)
 {
 		/* Add pin/via to the solder mask. */
 	GB_FPrintPinOrVia(GB_Flags.FP, Pin, unsued);
--- pcb-1.6.3/src/dev_ps.c
+++ pcb-1.6.3/src/dev_ps.c
@@ -80,7 +80,7 @@
 static	void	PS_PrintPinOrVia(PinTypePtr, int);
 static	void	PS_PrintClearPinOrViaOnGroundplane(PinTypePtr, int);
 static	void	PS_PrintPadMask(PadTypePtr, int);
-static	void	PS_PrintPinOrViaMask(PinTypePtr, int);
+static	void	PS_PrintPinMask(PinTypePtr, int);
 static	void	PS_FilledRectangle(Position, Position,
 			Position, Position, int);
 static	void	PS_Outline(Position, Position,
@@ -132,7 +132,7 @@
 	PS_PrintPad,
 	PS_PrintPinOrVia,
 	PS_PrintPadMask,
-	PS_PrintPinOrViaMask,
+	PS_PrintPinMask,
 	PS_PrintClearPinOrViaOnGroundplane,
 	PS_FilledRectangle,
 	PS_Outline,
@@ -164,7 +164,7 @@
 	PS_PrintPad,
 	PS_PrintPinOrVia,
 	PS_PrintPadMask,
-	PS_PrintPinOrViaMask,
+	PS_PrintPinMask,
 	PS_PrintClearPinOrViaOnGroundplane,
 	PS_FilledRectangle,
 	PS_Outline,
@@ -920,7 +920,7 @@
 {
 	if (TEST_FLAG(SQUAREFLAG, Pad))
 	{
-		Dimension scrunch = Pad->Thickness/2 + GROUNDPLANEFRAME;
+		Dimension scrunch = Pad->Thickness/2 + PCB->SoldermaskFrame;
 	fprintf(PS_Flags.FP, "%d %d %d %d CLRB\n",
 		((Pad->Point1.X > Pad->Point2.X) ? Pad->Point2.X  : Pad->Point1.X) - scrunch,
 		((Pad->Point1.Y > Pad->Point2.Y) ? Pad->Point2.Y  : Pad->Point1.Y) - scrunch,
@@ -933,18 +933,18 @@
 		(int) Pad->Point1.Y,
 		(int) Pad->Point2.X,
 		(int) Pad->Point2.Y,
-		(int) Pad->Thickness + 2*GROUNDPLANEFRAME);
+		(int) Pad->Thickness + 2* PCB->SoldermaskFrame);
 }
 
 /* ----------------------------------------------------------------------
  * prints a via or pin mask
  */
-static void PS_PrintPinOrViaMask(PinTypePtr Ptr, int unused)
+static void PS_PrintPinMask(PinTypePtr Ptr, int unused)
 {
 	fprintf(PS_Flags.FP, "%d %d %d %s\n",
 		(int) Ptr->X,
 		(int) Ptr->Y,
-		(int) Ptr->Thickness + 2*GROUNDPLANEFRAME,
+		(int) Ptr->Thickness + 2* PCB->SoldermaskFrame,
 		TEST_FLAG(SQUAREFLAG, Ptr) ? "CLRPVSQ" : TEST_FLAG(OCTAGONFLAG, Ptr) ? "CLRPV" : "CLRPVR");
 }
 
--- pcb-1.6.3/src/dev_rs274x.c
+++ pcb-1.6.3/src/dev_rs274x.c
@@ -140,7 +140,7 @@
 static  void    GBX_PrintPad(PadTypePtr, int);
 static  void    GBX_PrintPinOrVia(PinTypePtr, int);
 static  void    GBX_PrintPadMask(PadTypePtr, int);
-static  void    GBX_PrintPinOrViaMask(PinTypePtr, int);
+static  void    GBX_PrintPinMask(PinTypePtr, int);
 static  void    GBX_PrintClearPinOrViaOnGroundplane(PinTypePtr, int);
 static  void    GBX_PrintMaskOrGroundplaneRectangle(Position, Position, Position, Position, int);
 static  void    GBX_PrintOutline(Position, Position, Position, Position, int);
@@ -175,7 +175,7 @@
 			GBX_PrintPad,				/* print pad */
 			GBX_PrintPinOrVia,			/* print pin or via */
 			GBX_PrintPadMask,			/* print pad mask */
-			GBX_PrintPinOrViaMask,			/* print pin or via mask */
+			GBX_PrintPinMask,			/* print pin or via mask */
 			GBX_PrintClearPinOrViaOnGroundplane,	/* print clear pin or via on groundplane */
 			GBX_PrintMaskOrGroundplaneRectangle,	/* print filled rectangle
 													for ground planes and/or
@@ -382,6 +382,8 @@
 				/* pads always need clear masks */
 			findApertureCode(&GBX_Apertures, pad->Thickness + 2*GROUNDPLANEFRAME,
 				TEST_FLAG(SQUAREFLAG, pad) ? SQUARE : ROUND);
+			findApertureCode(&GBX_Apertures, pad->Thickness + 2*PCB->SoldermaskFrame,
+				TEST_FLAG(SQUAREFLAG, pad) ? SQUARE : ROUND);
 		);
 		ELEMENTLINE_LOOP(element,
 			findApertureCode(&GBX_Apertures, line->Thickness, ROUND));
@@ -1171,7 +1173,7 @@
 	FILE *FP;
 	
 	FP = GBX_Flags.FP;
-	apCode = findApertureCode(&GBX_Apertures, Pad->Thickness +2*GROUNDPLANEFRAME,
+	apCode = findApertureCode(&GBX_Apertures, Pad->Thickness +2* PCB->SoldermaskFrame,
 	          (Pad->Flags & SQUAREFLAG) ? SQUARE : ROUND);
 	if (lastAperture != apCode)
 	{
@@ -1210,11 +1212,11 @@
 /* ----------------------------------------------------------------------
  * prints a via or pin on the solder mask
  */
-static void GBX_PrintPinOrViaMask(PinTypePtr Pin, int unused)
+static void GBX_PrintPinMask(PinTypePtr Pin, int unused)
 {
 	int apCode;
 	
-	apCode = findApertureCode(&GBX_Apertures, Pin->Thickness +2*GROUNDPLANEFRAME,
+	apCode = findApertureCode(&GBX_Apertures, Pin->Thickness +2* PCB->SoldermaskFrame,
 			TEST_FLAG(SQUAREFLAG, Pin) ? SQUARE :
 			(TEST_FLAG(OCTAGONFLAG, Pin) ? OCTAGON : ROUND));
 	if (lastAperture != apCode)
--- pcb-1.6.3/src/file.c
+++ pcb-1.6.3/src/file.c
@@ -244,6 +244,9 @@
 		(int) PCB->MaxWidth, (int) PCB->MaxHeight);
 	fprintf(FP, "Grid(%i %i %i)\n",
 		(int) PCB->Grid, (int) PCB->GridOffsetX, (int) PCB->GridOffsetY);
+	/* Maintain backwards compatibility with the Soldermask frame if possible */
+	if(PCB->SoldermaskFrame!=DEFAULT_SOLDERMASK_FRAME)
+	   fprintf(FP, "SoldermaskFrame(%i)\n",PCB->SoldermaskFrame);
 	fprintf(FP, "Cursor(%i %i %i)\n",
 		(int) Crosshair.X, (int) Crosshair.Y, PCB->Zoom);
 	fprintf(FP, "Flags(0x%08x)\n", (int) PCB->Flags);
--- pcb-1.6.3/src/global.h
+++ pcb-1.6.3/src/global.h
@@ -355,6 +355,7 @@
 	RouteStyleType	RouteStyle[NUM_STYLES];
 	Pixmap		SaveUnder;		/* saves data during dialog handling */
 	DataTypePtr	Data;
+        int             SoldermaskFrame;       /* Area around pads etc not touched by soldermask */
 } PCBType, *PCBTypePtr;
 
 typedef struct				/* information about the paste buffer */
@@ -516,6 +517,7 @@
 						/* produced when searching of */
 						/* connections is done */
 	XFontStruct	*PinoutFont[MAX_ZOOM+1];/* font ID used for pin names */
+        int             SoldermaskFrame;       /* Area around pads etc not touched by soldermask */
 } SettingType, *SettingTypePtr;
 
 /* ----------------------------------------------------------------------
@@ -577,7 +579,7 @@
 	void		(*Pad)(PadTypePtr, int);	
 	void		(*PinOrVia)(PinTypePtr, int);
 	void		(*PadMask)(PadTypePtr, int);
-	void		(*PinOrViaMask)(PinTypePtr, int);
+	void		(*PinMask)(PinTypePtr, int);
 	void		(*ClearPinOrViaOnGroundplane)(PinTypePtr, int);
 	void		(*FilledRectangle)(Position, Position, Position, Position, int);
 	void		(*Outline)(Position, Position, Position, Position, int);
--- pcb-1.6.3/src/insert.c
+++ pcb-1.6.3/src/insert.c
@@ -42,6 +42,7 @@
 #include "select.h"
 #include "set.h"
 #include "undo.h"
+#include "search.h"
 
 /* ---------------------------------------------------------------------------
  * some local prototypes
--- pcb-1.6.3/src/main.c
+++ pcb-1.6.3/src/main.c
@@ -341,7 +341,10 @@
 	{ "warnColor", XtCColor, XtRPixel, sizeof(Pixel),
 	  XtOffsetOf(SettingType, WarnColor), XtRString, XtDefaultForeground },
 	{ "zoom", "Zoom", XtRInt, sizeof(int),
-	  XtOffsetOf(SettingType, Zoom), XtRString, "3" }};
+	  XtOffsetOf(SettingType, Zoom), XtRString, "3" },
+	{ "SoldermaskFrame", "SoldermaskFrame", XtRInt, sizeof(int),
+	  XtOffsetOf(SettingType, SoldermaskFrame), XtRString,
+         "15" } };
 
 /* ---------------------------------------------------------------------------
  * additional command line arguments
--- pcb-1.6.3/src/menu.c
+++ pcb-1.6.3/src/menu.c
@@ -135,14 +135,15 @@
 	{ "solderSide", "look at solder-side", CB_Action, "SwapSides", NULL },
 	{ "line", NULL, NULL, NULL, NULL },
 	{ "header", "grid setting", NULL, NULL, NULL },
+	{ "grid01", " 1 mil", CB_Position, "SetValue,Grid,1", NULL },
 	{ "grid05", " 5 mil", CB_Position, "SetValue,Grid,5", NULL },
 	{ "grid10", "10 mil", CB_Position, "SetValue,Grid,10", NULL },
 	{ "grid20", "20 mil", CB_Position, "SetValue,Grid,20", NULL },
 	{ "grid25", "25 mil", CB_Position, "SetValue,Grid,25", NULL },
 	{ "grid50", "50 mil", CB_Position, "SetValue,Grid,50", NULL },
 	{ "grid100", "100 mil", CB_Position, "SetValue,Grid,100", NULL },
-	{ "gridInc", "increment by 5", CB_Action, "SetValue,Grid,+5", NULL },
-	{ "gridDec", "decrement by 5", CB_Action, "SetValue,Grid,-5", NULL },
+	{ "gridInc", "increment by 1", CB_Action, "SetValue,Grid,+1", NULL },
+	{ "gridDec", "decrement by 1", CB_Action, "SetValue,Grid,-1", NULL },
 	{ "line", NULL, NULL, NULL, NULL },
 	{ "header", "zoom setting", NULL, NULL, NULL },
 	{ "zoom1", "1 : 1 ", CB_Position, "SetValue,Zoom,0", NULL },
@@ -165,7 +166,7 @@
 /* ----------------------------------------------------------------------
  * Sizes menu button - contains variable contents
  */
-static	PopupEntryType 	SizesMenuEntries[NUM_STYLES * 2 + 2];
+static	PopupEntryType 	SizesMenuEntries[NUM_STYLES * 2 + 4];
 static PopupMenuType	SizesMenu =
 	{ "sizes", NULL, SizesMenuEntries, CBPOPUP_Sizes, NULL, NULL };
 static	MenuButtonType SizesMenuButton =
@@ -392,8 +393,19 @@
 	SizesMenuEntries[i].Callback = CB_Action;
 	SizesMenuEntries[i].ClientData = (XtPointer) action[i];
 	i++;
+	SizesMenuEntries[i].Name="soldermaskframeInc";
+	SizesMenuEntries[i].Label="increment soldermask frame";
+	SizesMenuEntries[i].Callback = CB_Action;
+	SizesMenuEntries[i].ClientData = "SetValue,SoldermaskFrame,+1";
+	i++;
+	SizesMenuEntries[i].Name="soldermaskframeDec";
+	SizesMenuEntries[i].Label="decrement soldermask frame";
+        SizesMenuEntries[i].Callback = CB_Action;
+        SizesMenuEntries[i].ClientData = "SetValue,SoldermaskFrame,-1";
+	i++;
 	SizesMenuEntries[i].Name = NULL;
 	SizesMenuEntries[i].Label = NULL;
+
 }
 
 void UpdateSizesMenu(void)
--- pcb-1.6.3/src/parse_l.l
+++ pcb-1.6.3/src/parse_l.l
@@ -98,6 +98,8 @@
 Styles		{ return(T_STYLES); }
 Polygon		{ return(T_POLYGON); }
 Arc		{ return(T_ARC); }
+SoldermaskFrame { return(T_SOLDERMASKFRAME); }
+
 
 \'.\'				{
 						yylval.number = (unsigned) *(yytext+1);
--- pcb-1.6.3/src/parse_y.h
+++ pcb-1.6.3/src/parse_y.h
@@ -1,32 +0,0 @@
-typedef union									/* define YYSTACK type */
-{
-	unsigned	number;
-	char		*string;
-} YYSTYPE;
-#define	NUMBER	258
-#define	CHAR_CONST	259
-#define	STRING	260
-#define	T_PCB	261
-#define	T_LAYER	262
-#define	T_VIA	263
-#define	T_LINE	264
-#define	T_ARC	265
-#define	T_RECTANGLE	266
-#define	T_TEXT	267
-#define	T_ELEMENTLINE	268
-#define	T_ELEMENT	269
-#define	T_PIN	270
-#define	T_PAD	271
-#define	T_GRID	272
-#define	T_FLAGS	273
-#define	T_SYMBOL	274
-#define	T_SYMBOLLINE	275
-#define	T_CURSOR	276
-#define	T_ELEMENTARC	277
-#define	T_MARK	278
-#define	T_GROUPS	279
-#define	T_STYLES	280
-#define	T_POLYGON	281
-
-
-extern YYSTYPE yylval;
--- pcb-1.6.3/src/parse_y.y
+++ pcb-1.6.3/src/parse_y.y
@@ -22,6 +22,7 @@
  *  Contact addresses for paper mail and Email:
  *  Thomas Nau, Schlehenweg 15, 88471 Baustetten, Germany
  *  Thomas.Nau@rz.uni-ulm.de
+ *  D.J. Barrow dj_barrow@ariasoft.ie added soldermask adjustment support.
  *
  */
 
@@ -66,7 +67,7 @@
 
 %token	T_PCB T_LAYER T_VIA T_LINE T_ARC T_RECTANGLE T_TEXT T_ELEMENTLINE
 %token	T_ELEMENT T_PIN T_PAD T_GRID T_FLAGS T_SYMBOL T_SYMBOLLINE T_CURSOR
-%token	T_ELEMENTARC T_MARK T_GROUPS T_STYLES T_POLYGON
+%token	T_ELEMENTARC T_MARK T_GROUPS T_STYLES T_POLYGON T_SOLDERMASKFRAME
 
 %type	<number>	symbolid
 
@@ -98,6 +99,7 @@
 			}
 		  pcbname 
 		  pcbgrid
+                  pcbsoldermaskframe
 		  pcbcursor
 		  pcbflags
 		  pcbgroups
@@ -168,7 +170,12 @@
 			}
 		|
 		;
-
+pcbsoldermaskframe : T_SOLDERMASKFRAME '(' NUMBER ')'
+                       {
+			        yyPCB->SoldermaskFrame = $3;
+                       }
+                 |
+                 ;
 pcbcursor
 		: T_CURSOR '(' NUMBER NUMBER NUMBER ')'
 			{
--- pcb-1.6.3/src/print.c
+++ pcb-1.6.3/src/print.c
@@ -498,8 +498,7 @@
 				ALLPAD_LOOP(PCB->Data,
 					if ((TEST_FLAG(ONSOLDERFLAG, pad) == 0) == (i == 0))
 						Device->PadMask(pad, 0););
-				ALLPIN_LOOP(PCB->Data, Device->PinOrViaMask(pin, 0););
-				VIA_LOOP(PCB->Data, Device->PinOrViaMask(via, 0););
+				ALLPIN_LOOP(PCB->Data, Device->PinMask(pin, 0););
 			}
 
 			if (GlobalAlignmentFlag)
@@ -509,8 +508,7 @@
 			ALLPAD_LOOP(PCB->Data,
 				if ((TEST_FLAG(ONSOLDERFLAG, pad) == 0) == (i == 0))
 					Device->PadMask(pad, 1););
-			ALLPIN_LOOP(PCB->Data, Device->PinOrViaMask(pin, 1););
-			VIA_LOOP(PCB->Data, Device->PinOrViaMask(via, 1););
+			ALLPIN_LOOP(PCB->Data, Device->PinMask(pin, 1););
 
 			ClosePrintFile();
 		}
--- pcb-1.6.3/src/report.c
+++ pcb-1.6.3/src/report.c
@@ -215,12 +215,15 @@
 			sprintf(&report[0],"PAD ID# %d   Flags:0x%08x\n"
 				"FirstPoint(X,Y) = (%d, %d)  ID = %d\n"
 				"SecondPoint(X,Y) = (%d, %d)  ID = %d\n"
+				"Name = \"%s\"\n"
 				"Width = %d It is owned by SMD element %s\n"
 				"As pin number %s and is on the %s\n"
 				"side of the board.\n", Pad->ID,
 				Pad->Flags, Pad->Point1.X,
 				Pad->Point1.Y, Pad->Point1.ID, Pad->Point2.X, Pad->Point2.Y,
-				Pad->Point2.ID, Pad->Thickness,
+				Pad->Point2.ID,
+				EMPTY(Pad->Name),
+				Pad->Thickness,
 				EMPTY(element->Name[1].TextString), EMPTY(Pad->Number),
 				TEST_FLAG(ONSOLDERFLAG, Pad) ? "solder (bottom)" : "component");
 			break;
--- pcb-1.6.3/src/set.c
+++ pcb-1.6.3/src/set.c
@@ -21,6 +21,7 @@
  *  Contact addresses for paper mail and Email:
  *  Thomas Nau, Schlehenweg 15, 88471 Baustetten, Germany
  *  Thomas.Nau@rz.uni-ulm.de
+ *  D.J. Barrow dj_barrow@ariasoft.ie added adjustable soldermask.
  *
  */
 
@@ -70,7 +71,7 @@
 	char	text[140];
 	int		length;
 
-	sprintf(text, "%c %s,%s,%s%s, grid=%i:%i, zoom=%-i:%-i, line=%-i, via=%-i(%-i), text=%i%%, buffer=#%-i, name: ",
+	sprintf(text, "%c %s,%s,%s%s, grid=%i:%i, zoom=%-i:%-i, line=%-i, via=%-i(%-i), text=%i%%, buffer=#%-i, sold_msk_frame=%i, name: ",
 		PCB->Changed ? '*' : ' ',
 		Settings.ShowSolderSide ? "solder" : "component",
 		TEST_FLAG(ABSOLUTEFLAG, PCB) ? "abs" : "rel",
@@ -84,7 +85,8 @@
 		(int) Settings.LineThickness,
 		(int) Settings.ViaThickness, (int) Settings.ViaDrillingHole,
 		(int) Settings.TextScale,
-		Settings.BufferNumber+1);
+		Settings.BufferNumber+1,
+		(int) PCB->SoldermaskFrame);
 
 		/* append the name of the layout */
 	length = sizeof(text) -1 -strlen(text);
@@ -152,6 +154,18 @@
 	SetStatusLine();
 } 
 
+
+void SetSoldermaskFrame(int SoldermaskFrame)
+{
+   SoldermaskFrame = MAX(MIN_SOLDERMASK_FRAME, SoldermaskFrame);
+   SoldermaskFrame = MIN(MAX_SOLDERMASK_FRAME, SoldermaskFrame);
+   if(PCB->SoldermaskFrame!= SoldermaskFrame)
+   {
+      PCB->SoldermaskFrame=SoldermaskFrame;
+      SetStatusLine();
+   }
+}
+
 /* ---------------------------------------------------------------------------
  * sets a new line thickness
  */
--- pcb-1.6.3/src/set.h
+++ pcb-1.6.3/src/set.h
@@ -37,6 +37,7 @@
 void		SetStatusLine(void);
 void		SetGrid(int);
 void		SetZoom(int);
+void            SetSoldermaskFrame(int);
 void		SetLineSize(Dimension);
 void		SetViaSize(Dimension, Boolean);
 void		SetViaDrillingHole(Dimension, Boolean);
openSUSE Build Service is sponsored by