BEGIN PGM finish_side MM 
CC IX+0 IY+0
Q95 = 1
CALL PGM 25x_error
Q18 = Q108 / Q4                                 ; WKZ-Radius / Massfaktor
FN 17: SYSWRITE ID 212 =+3
Q55 = 0 ;                                       Zaehler
Q84 = Q48 ;                                     Eckenradius Ausraeumen
Q75 = 0 ;                                       Parameter initialisieren Flag Seite
Q33 = 0 ;                                       Parameter initialisieren Zhler 
Q34 = 0 ;                                       Parameter initialisieren Zust.
;********************************************                              
;************ Zustellung Tiefe **************                              
;********************************************                              
L Z+Q19 R0 FMAX                              
Q40 = Q338 + Q200 ;                             ZUST. GES.
Q41 = Q40
Q42 = Q70 + Q200 ;                              TIEFE GES.
;--- Wenn Zust. > Tiefe, verwende Tiefe als Zust.
FN 11: IF +Q42 GT +Q40 GOTO LBL 22
Q40 = Q70 + Q200 ;ZUST. GES.
Q41 = Q40
FN 9: IF +0 EQU +0 GOTO LBL 3
LBL 22
;--- n: Anzahl Zust. -> Q34
FN 11: IF +Q338 GT +0 GOTO LBL 200
;FN 14: ERROR= 1090 ;                           Fehler keine Zust. Schlichten
Q40 = Q70 + Q200 ;                              Zust Schlichte 0 => Tiefe
Q41 = Q40
Q338 = Q40
LBL 200
Q34 = Q70 / Q338
Q0 = FRAC Q34
;--- Wenn gerader Wert, verwende diesen
FN 9: IF +Q0 EQU +0 GOTO LBL 21
Q34 = INT Q34
Q34 = Q34 + 1
LBL 21
Q33 = 1
FN 9: IF +0 EQU +0 GOTO LBL 3
;
;----Einsprung fuer berwachung Zustellung / Tiefe
LBL 1
;---Letzte Zustellung: wenn Zaehler = nZust => Tiefe = Rest-
FN 9: IF +Q33 EQU +Q34 GOTO LBL 2
Q40 = Q40 + Q41 - Q200
FN 9: IF +0 EQU +0 GOTO LBL 3
LBL 2
Q40 = Q42 - Q40
Q41 = Q40 + Q200
LBL 3
;********************************************
;************* Schlichten  ******************
;********************************************
FN 9: IF +Q3 EQU +251 GOTO LBL "RECT"
FN 9: IF +Q3 EQU +252 GOTO LBL "CIRCL"
FN 9: IF +Q3 EQU +0 GOTO LBL 99
*############################
*# Schlichten Kreistasche
*############################
LBL "CIRCL"
*############################
*# Daten fuer Spirale berechnen
*# An- und Abfahrwinkel sind 180Grad
*# Startradius = Taschenrad - Aufm - WZR * 1/16
*# Unterscheide:
*# -Eine Zustellung (keine Erweiterung)
*# -Spiralerweiterung
*############################
QL0 = Q18												; Ueberlappung
QL1 = Q223 / 2											; Endradius
FN 11: IF +Q368 GT +QL0 GOTO LBL "CIRCL_SPIRAL"
QL2 = QL1 - Q368										; Startradius
QL10 = 0												; Anzahl Zustellungen
FN 9: IF +0 EQU +0 GOTO LBL "CIRCL_SPIRAL_END"
LBL "CIRCL_SPIRAL"
	QL2 = QL1 - Q368									; Startradius
	QL10 = INT( ((QL1 - QL2) / QL0) )					; Anzahl Zustellungen
	QL7 = Q92 + ( (QL1 - QL2) / QL10 ) / 4				; Mitte 1 Spirale
	QL8 = Q92 - ( (QL1 - QL2) / QL10 ) / 4				; Mitte 2 Spirale
	QL9 = 0												; Zustellungen
LBL "CIRCL_SPIRAL_END"
QL3 = QL2 - (Q18 * 1 / 16) 								; Radius Vorpositionierung mit RL/RR
FN 11: IF +QL3 GT +0 GOTO LBL "CIRCL_PRE_RADIUS"
	QL3 = 0												; limitiere Radius Vorpositionierung
LBL "CIRCL_PRE_RADIUS"
QL4 = QL3 - Q18											; Radius Vorpositionierung ohne RL/RR
QL11 = 180												; Maximaler Ein/Ausfahrwinkel
FN 12: IF +QL4 LT +3 GOTO LBL "CIRCL_PREPATH"
	QL11 = 180 * (3 / QL4)								; Limitiere Ein/Ausfahrwinkel
LBL "CIRCL_PREPATH"
QL12 = SQRT( SQ( QL2 ) + SQ( QL3 ) - 2 * QL2 * QL3 * COS( QL11 ) )		; Sehne Vorpositionierung-Startradius
QL13 = (SQ( QL3 ) - SQ( QL2 ) - SQ( QL12 )) / (-2 * QL2 * QL12)			; Winkel im Startradius
FN 12: IF +QL13 LT +1 GOTO LBL "CIRCL_ERR_RAD"
QL13 = QL13 + 1 - 1
QL13 = QL13 - 1 + 1
FN 9: IF +QL13 EQU +1 GOTO LBL "CIRCL_ERR_RAD"
	FN 14: ERROR= 1103									; WKZ-Radius zu gross
LBL "CIRCL_ERR_RAD"
QL13 = ACOS( QL13 )
QL14 = 180 - ( 2 * QL13 )								; Winkel am CC Anfahren
QL15 = SQRT( (0.5 * SQ( QL12 )) / (1 - COS( QL14 )) )	; Ein/Ausfahrradius
QL5 = Q92 - QL2 + QL15									; CCX Anfahren
QL6 = Q92 - QL1 + QL15									; CCX Abfahren
*############################
*# Vorpositionierung und Tiefenzustellung
*############################
CC  X+Q92 Y+Q93
FN 9: IF +Q80 EQU -1 GOTO LBL "CIRCL_CW_CALL"
	QL16 = 180 - QL11							; Winkel Vorpositionierung
	LP  PR+QL4 PA+QL16 R0 FMAX					; Vorpositionierung
	L IZ-Q41 FQ206								; Tiefe
	CALL LBL "CIRCL_CCW"
	Q33 = Q33 + 1								; inkr. Zaehler Zustellungen
	FN 9: IF +Q33 EQU +Q34 GOTO LBL 1
	FN 12: IF +Q33 LT +Q34 GOTO LBL 1
	FN 9: IF +0 EQU +0 GOTO LBL 99
LBL "CIRCL_CW_CALL"
QL16 = 180 + QL11								; Winkel Vorpositionierung
LP  PR+QL4 PA+QL16 R0 FMAX						; Vorpositionierung
L IZ-Q41 FQ206									; Tiefe
CALL LBL "CIRCL_CW"
Q33 = Q33 + 1									; inkr. Zaehler Zustellungen
FN 9: IF +Q33 EQU +Q34 GOTO LBL 1
FN 12: IF +Q33 LT +Q34 GOTO LBL 1
FN 9: IF +0 EQU +0 GOTO LBL 99
*############################
*# Spirale im Gegenuhrzeiger
*############################
LBL "CIRCL_CCW"
CC  X+Q92 Y+Q93
LP  PR+QL3 PA+QL16 RL FQ385						; Vorpositionierung
CC  X+QL5 Y+Q93
CP IPA+QL11 DR+
FN 9: IF +QL10 EQU +0 GOTO LBL "CIRCL_CCW_END"
	LBL "CIRCL_CCW_LOOP"
		CC  X+QL7 Y+Q93
		CP IPA+180 DR+
		CC  X+QL8 Y+Q93
		CP IPA+180 DR+
		QL9 = QL9 + 1
	FN 12: IF +QL9 LT QL10 GOTO LBL "CIRCL_CCW_LOOP"
LBL "CIRCL_CCW_END"
CC  X+Q92 Y+Q93									; Taschenmitte
CP  PA+0 DR+									; letzter Schlichtgang
CP  PA+180 DR+									; letzter Schlichtgang
CC  X+QL6 Y+Q93									; Abfahren
CP IPA+QL11 DR+									; Abfahren
L IZ+Q200										; Rueckzug
LBL 0
*############################
*# Spirale im Uhrzeiger
*############################
LBL "CIRCL_CW"
CC  X+Q92 Y+Q93
LP  PR+QL3 PA+QL16 RR FQ385						; Vorpositionierung
CC  X+QL5 Y+Q93
CP IPA-QL11 DR-
FN 9: IF +QL10 EQU +0 GOTO LBL "CIRCL_CW_END"
	LBL "CIRCL_CW_LOOP"
		CC  X+QL7 Y+Q93
		CP IPA-180 DR-
		CC  X+QL8 Y+Q93
		CP IPA-180 DR-
		QL9 = QL9 + 1
	FN 12: IF +QL9 LT QL10 GOTO LBL "CIRCL_CW_LOOP"
LBL "CIRCL_CW_END"
CC  X+Q92 Y+Q93									; Taschenmitte
CP PA+0 DR-										; letzter Schlichtgang
CP PA+180 DR-									; letzter Schlichtgang
CC  X+QL6 Y+Q93									; Abfahren
CP IPA-QL11 DR-									; Abfahren
L IZ+Q200										; Rueckzug
LBL 0
;********************************************
;************ Schlichten Rechteck ***********
;********************************************
; Q50 = n seitl. Zust.
; Q81 = 1.Seite berechnen
; Q82 = 2.Seite berechnen
; Q52 = 1. Seite
; Q53 = 2. Seite
; Q45 = Zustellwert 1.Seite 
; Q46 = Zustellwert 2.Seite
; Q48 = Rundungsaradius
; Q47 = berlappung An-, Abfahren; R
; Q71 = Verfahrlnge X
; Q72 = Verfahrlnge Y
; Q56 = Startpos 1. Seite
; Q58 = Restbetrag
; Q75 = 1 ;FLAG Y groesser Werte tauschen
; Q78 = Eckenradius dynamisch pro Zust.
LBL "RECT"
Q48 = Q84
L IZ-Q41 R0 FQ206
;**********************************
; --- Mehrere seitl. Zust. ---
; --- WZ * F > 1/4 kl. Seitenl. ---
Q81 = ( Q68 - 2 * Q18 ) / 2 ;                   1.Seite berechnen
Q82 = ( Q69 - 2 * Q18 ) / 2 ;                   2.Seite berechnen
Q52 = Q81 ; 1. Seite
Q53 = Q82 ; 2. Seite
LBL 309
;**********************************
;---wenn Y groesser -> Werte tauschen
FN 11: IF +Q81 GT +Q82 GOTO LBL 199
FN 9: IF +Q81 EQU +Q82 GOTO LBL 199
Q52 = Q82
Q53 = Q81
Q75 = 1 ;FLAG
LBL 199
;**********************************
Q54 = Q370 * Q18 ;                              Ueberlappung
Q56 = Q68 / 2 - Q18 - Q368 ;                    X Startpos. PR
Q58 = Q68 / 2 - Q18 - Q56 ;                     X Restbetrag
Q57 = Q52 - 2 * Q220 - 2 * Q18 ;                Bereich X - R - WZR
Q50 = ( Q58 / 1 ) / Q54
Q51 = FRAC Q50
Q71 = Q58 / Q50
FN 9: IF +Q51 EQU +0 GOTO LBL 4
Q62 = INT Q50
Q50 = Q62 + 1 ;                                 n seitl. Zust.
Q71 = Q58 / Q50 ;                               seitl. Zust. mit geaden Wert n 
LBL 4
Q66 = Q69 / 2 - Q18 - Q368 
Q64 = Q69 / 2 - Q18 - Q66 ;                     Y Restbetrag
Q72 = Q64 / Q50 ;                               Seitl. Y
Q83 = Q53 / 4 ;                                 2.Seite / 4
;**********************************
FN 9: IF +Q75 EQU +1 GOTO LBL 201
; --- wenn X groesser 
Q45 = Q71
Q46 = Q72
LBL 209
Q47 = Q72 / 2 - 0.001 ; Anfahrradius 
FN 9: IF +Q75 EQU +0 GOTO LBL 202
; --- wenn Y groesser -> Werte tauschen
LBL 201 ; Y groesser
Q45 = Q72
Q46 = Q71
LBL 208
Q47 = Q72 / 2 - 0.001
LBL 202
Q78 = Q220 - Q18 
Q5 = 1
Q71 = 0
Q72 = 0
FN 11: IF +Q48 GT +0 GOTO LBL 213
; --- Wenn R = 0 u. mehrere Umlaeufe
Q48 = Q220 - Q368 ;( Q220 - Q18 ) /	 Q50 
FN 11: IF +Q48 GT +0 GOTO LBL 213
Q48 = 0
LBL 213
Q61 = ( Q220 - Q18 - Q48 ) / Q50 

FN 11: IF +Q48 GT +0 GOTO LBL 212 ; IF Q48
; --- neg. Wert weil WZ > R
Q48 = 0 
Q61 = 0 
LBL 212
;-------------------------------------
Q71 = Q71 + Q45 + Q56
FN 12: IF +Q220 LT +Q48 GOTO LBL 203
Q48 = Q48 + Q61 ;                               Radius 
QL48 = Q48 - 0.001
LBL 203
Q79 = Q71 - Q48 
Q77 = ABS Q72 + Q46 + Q66
CALL LBL 313
Q44 = Q53 / 4 ;                                 2.Seite / 4
;Q44 = Q18 / 20
FN 11: IF +Q48 GT +0 GOTO LBL 215
; --- Anfahren wenn R < WZ-R
Q79 = Q71 / 2
APPR LCT IX+Q79 IY-Q77 RQ44 R0 FQ385
L IX+Q79 IY+0 R0 FQ385 M110;>
L IY+Q77 IX+0 FQ385
FN 9: IF +Q48 EQU +0 GOTO LBL 216
LBL 215
; --- Anfahren wenn R > WZ-R
APPR LCT IX+Q79 IY-Q77 RQ44 R0 FQ385
L IX+Q48 IY+0 R0 FQ385 M110;>
RND RQL48
L IY+Q77 IX+0 FQ385
LBL 216
;===============================================
LBL 5
FN 12: IF +Q5 LT +Q50 GOTO LBL 206
Q48 = Q220 - Q18 
FN 11: IF +Q220 GT +Q18 GOTO LBL 206
Q48 = 0 
LBL 206
Q72 = ABS Q72 + Q46 + Q66
CALL LBL 313
L IY+Q72 IX+0 FQ385 M110;A
RND RQ48
Q71 = Q71 + Q45 + Q56
L IX-Q71 IY+0 ;<
RND RQ48
Q72 = ABS Q72 + Q46 + Q66 
CALL LBL 313
L IY-Q72 IX+0 ;V
RND RQ48
Q5 = Q5 + 1 ;                                   Zaehler
FN 11: IF +Q5 GT +Q50 GOTO LBL 314
Q71 = Q71 + Q45
L IX+Q71 IY+0 R0 FQ385 ;>
FN 11: IF +Q5 GT +Q50 GOTO LBL 204
FN 12: IF +Q78 LT +Q47 GOTO LBL 204 
Q48 = Q48 + Q61 ;                               Radius 
LBL 204 
RND RQ48
Q56 = 0
Q66 = 0
FN 12: IF +Q5 LT +Q50 GOTO LBL 5
FN 9: IF +Q5 EQU +Q50 GOTO LBL 5
;===============================================
LBL 314
L IX+Q71 IY+0 R0 FQ385 ;>
Q72 = Q72 / 2 
RND RQ48
L IY+Q72 IX+0 FQ385 ;A Y+Q72
DEP PLCT PR+0 PA+0 RQ44 M111
;FN 9: IF +Q215 EQU +0 GOTO LBL 214
;Q48 = 0 ; R=dynamisch naechste Zust.
;LBL 214
FN 9: IF +0 EQU +0 GOTO LBL 312
LBL 313
FN 9: IF +Q80 EQU +1 GOTO LBL 312
Q72 = Q72 * - 1 ;                               Gegenl. 2. Seite umkehren
Q77 = Q77 * - 1 ;                               Anfhahrbew.
LBL 312
LBL 0
;-----------------------------------------
LBL 501
Q94 = 0
L IZ+Q200 R0 FMAX
LBL 0
;-----------------------------------------
; --- Ruecksprung zu Berechnung Tiefenzust.
Q33 = Q33 + 1 ;-Zahler Zustellung
; --- Wenn Zaehler ungleich o. gleich nZust
FN 9: IF +Q33 EQU +Q34 GOTO LBL 1
FN 12: IF +Q33 LT +Q34 GOTO LBL 1
FN 9: IF +0 EQU +0 GOTO LBL 99
;-----------------------------------------
LBL 99
Q95 = 0
END PGM finish_side MM 
