If I may interject something else instead of sub programs.
I absolutely abhor having multiple programs for the same parts, therefore always prefer local subs. Unlike Fanuc, HAAS uses them easy as pie.
Also, in all cases I avoid using incremental programming.
So, to make an easy example, here is a 1" square done 4 times using G54 - G57 workoffsets.
%
O00100
(SAMPLE - SQUAREX4)
(DATE - 08/06/07)
(OPERATION - MILL SQUARE)
(X0=PART CTR, Y0=PART CTR)
(Z0=TOP)
(CYCLE TIME: )
(ROUGH 3/8 CARB)
(SET DIA TO .385)
G00 G53 Z0
G90 G17 G54 G80 G94 G49 G40
T1 M06
G00 G43 H01 D01
G00 X0. Y0 Z0.5
S700 M03
M08
M97 P1000
G55
M97 P1000
G56
M97 P1000
G57
M97 P1000
M09
M05
G00 G49 G53 Z0
(FINISH - 3/8 CARB)
T2 M06
G00 G43 H02 D02
G57
G00 X0 Y0 Z.5
S1400 M03
M08
M97 P1000
G56
M97 P1000
G55
M97 P1000
G54
M97 P1000
M09
M05
G00 G49 G53 Y0 Z0
T1 M06
M30
N1000 (MILL SQUARE SUB)
G00 X0 Y0 Z.5
G01 Z-.5 F200.
G01 G41 X0 Y.5 F2.
G01 X-.5 Y.5
G01 X-.5 Y-.5
G01 X.5 Y-.5
G01 X.5 Y.5
G01 X0 Y.5
G01 G40 X0 Y0 Z.5 F200.
M99
%
Note that this is a quick and dirty way of reducing the program size. The same sub is called for rough and finish for each part. The only caveat is that the roughing tool has a .01 oversize offset entered in the control, leaving you precisely .005 to finish all around.
Also note that the finishing is called in reverse order, so the table is not whizzing back and forth between rough and finish.
There is only one program and there is only one place to mess with to tweak.