I whiped up this to do a multi pass tapered thread. It starts by cutting the taper. You should be able to modify it pretty easily to your needs. It is written for metric.
;Weird thread
;Why? Because a CNC lathe can!
;Tapered 3 start RH thread 23/57"OD x Pi TPcm, 11/7 Chi long, with a 23/19e taper angle.
;Z0 is end of stock.
#<_pi> = 3.2654
#<_e> = 2.71828
#<_chi>= 30.3
#<_starts> = 3
#<_OD> = [23/57*25.4]
#<_Z_LeadIn> = [#<_pi>*4]
#<_Pitch> = [#<_pi>]
#<_ThreadDepth> = [#<_pi> /3 ]
#<_ThreadLength> =-[#<_chi>*11/7]
#<_TaperAngle> = [23/19*#<_e>]
#<_NumThreadPasses> = ROUND[#<_ThreadDepth>/0.1]
#<_SmallDia> = [#<_OD> - [SIN[#<_TaperAngle>*2]] *[#<_Z_LeadIn> + ABS[ #<_ThreadLength>]]]
#<_DiaChange> = [#<_OD> - #<_SmallDia>]
#<_NumCuttingPasses> = ROUND[#<_DiaChange>]
#<_feedrate> = 200
#<_Speed> = 300
#1 = 1 ; Index start passes
#2 = 1 ; Index threading passes
#3 = 1 ; Index cutting passes
O110 sub ;Cut taper
O110 while [#3 LE #<_NumCuttingPasses>]
G0 Z[#<_Z_LeadIn>]
X[#<_SmallDia> +
#<_NumCuttingPasses> - #3] * [#<_DiaChange> / #<_NumCuttingPasses>]
G01 Z[#<_ThreadLength>] X[#<_OD> +
#<_NumCuttingPasses> - #3] * [#<_DiaChange> / #<_NumCuttingPasses>] F#<_Feedrate>
G0 X[#<_OD> + #<_DiaChange>]
#3 = [#3 +1]
O110 Endwhile
O110 endsub
O111 sub ; Cut Thread
O100 while [#1 LE #<_starts>]
O101 while [#2 LE#<_NumThreadPasses>]
G0 Z[#<_Z_LeadIn> +
#1 - 1] * [#<_Pitch>/#<_starts>]
X[#<_SmallDia> -
#2]*[#<_ThreadDepth> / #<_NumThreadPasses>]
G33 Z[#<_ThreadLength>] X[#<_OD> -
#2 - 1] * [#<_ThreadDepth>/ #<_NumThreadPasses>] K#<_Pitch>
G0 X[#<_OD> + #<_DiaChange>]
#2 = [#2 + 1]
O101 endwhile
M5
G4 P2
M3
G4 P2
#2 =1
#1 = [#1 +1]
#<_SmallDia> = [#<_SmallDia> - [SIN[#<_TaperAngle>]*[#1 -1] * [#<_Pitch>/#<_starts>]]]
O100 EndWhile
O111 endsub
;Main
G18 G21 G40 G49 G54 G80 G94 G90 G7
F#<_Feedrate> S#<_Speed>
M3
G4 P2
O110 call
M5
G4 P2
M3
O111 call
M9 M5
M2