;   --------------------------------------------------------------
;                       Programmstart
;   --------------------------------------------------------------
; Funktion :    In Anwendungen mit Motion-Control muss oft die Istposition
;		eingegeben werden. 
;		Die Darstellung der Position erfolgt ab Zeile 40
;		der eigentliche 'Steup' ab Zeile 7000
;		Der Rest ist nur notwendige Testumgebung
; 	Verbesserung der Anzeige durch einen Schrittfaktor moeglich
15 STRING 1370,16			; Str.laenge 16 => (1300-1)/(16+1)=80 Strings
17 S=GET
19 IF S<>0 THEN EA=0 ELSE EA=1		; Falls Taste gedrückt EA über PC
20 GOSUB 10000				; Initialisierung und Einschaltmeldung
31 DO:T=GET:UNTIL T=0			; Tastenpuffer leeren
35 GOTO 500				; Hauptprogramm Handbetrieb
;   --------------------------------------------------------------
;   ------------------ Position ausgeben ---------------------
;   --------------------------------------------------------------
; Funktion : Ausgabe des internen Positionszählers
; Eingang  : 
; Ausgang  : --
; lokal    : 
; global   : POS in steps, POSM in mm
40 CALL 3018H : POP POS			; hole Pos
50 P.U.(###.###),			; Formatieren
60 POSM=INT(POS)/1000			; darstellen als µm
70 CUR 0,8:P. POSM,			; ins Display
80 P.U.(0),				; Print wieder normal
90 RETURN
;   --------------------------------------------------------------
;                       Handbetrieb
;   --------------------------------------------------------------
500 GOSUB 750                           ; Anzeige Handbetrieb
; Schleife:
540 T=GET
660   IF T = F3 THEN GOSUB 7000:GOSUB 750	; Set-Up
710 GOTO 540
; --- Handbetrieb neue Anzeige nach Untermenu -------------
; Beispiel: V(10)=Programmnummer 
750 CLS: PRINT "M POS           ",      ; Identifier Handbetrieb
755   CUR 1,0: PRINT CHR(V(10)+48),	; Programmnummer anzeigen
760   GOSUB 40				; Anzeige
770   DO:T=GET:UNTIL T=0              	; Tastaturspeicher löschen
779 RETURN

'   --------------------------------------------------------------
'                Set-Up
'   --------------------------------------------------------------
' Funktion : - Eine neue Position wird gesetzt
' Eingang: POSM
' Ausgang: POSM neu
' lokal: X
7000 BITCLR A5                  ; A5=nicht betr.bereit
7005 CUR 1,8:P. "       ",
7010 CUR 1,2:P. $(52),$(0),     ; ? Setup und Rest löschen
7015 GOSUB 40
7020 CPOS=10			; Cursor für 2 Vorkomma- + 3 Nachkommast.
7025 IF POSM>=10 THEN CPOS=9	; Cursor anpassen
7030 IF POSM>=100 THEN CPOS=8	; Cursor anpassen
; Vorbereitung für den Aufruf von GOSUB 12050
; <Variable>,<Text>,<Einh>,<Vor>,<Nachkommastellen>,<Min>,<Max>,<MODE>
7035 WERT=POSM:ZAHL=POSM:N=3:V=3:MAX=200:MIN=0	; Zahl wird dargestellt
7040  IF WERT<0 THEN MINUS=-1 ELSE MINUS=1	; Vorzeichen
; Sonderaufruf der INPUT Routine neue Zahl->Stack
7045 GOSUB 12050 : POP X	
; zurück kommt ein Wert z.B. in mm
7050 POS=X*1000			; darstellen in µm
7055 PUSH POS:CALL 301BH        ; Zähler neu setzen
7060 E=0                        ; nach Abbr. mit ESC ist E=11
7065 GOSUB 40
7070 CUR 1,2:P. $(0),           ; 2. Zeile löschen
7080 RETURN
;   --------------------------------------------------------------
;               Initialisierung
;   --------------------------------------------------------------
; --- Ein/Ausgabe initialisieren ---
10000 INIT DISP                 ; Display initialisieren
10005 INIT INP,EA*3             ; Eingabe initialisieren, EA = PC oder Tast
10010 INIT OUT,EA               ; Ausgabe initialisieren  EA = PC oder Disp
10015 PUSH 12 : CALL 481EH      ; Cursor aus
; --- Speicheraufteilung siehe Einleitung ---
10020 ADR=4FFFH                 ; Speicheranfangsadresse 6 Byte RAM (temporär)
10025 ADEPRO=0DA00H             ; Speicheranfangsadresse EEPROM
10030 POSADR=ADEPRO+2FEH        ; Speicheradresse für Position
; --- Anfangsmeldung Version ---
10035 GOSUB 20000               ; Ausgabetexte laden (deutsch)
10050 CLS
10055 CUR 0,0 : PRINT " SET-UP TEST"
10060 CUR 1,0 : PRINT $(17),    ; ? SPEICHERTEST
10090 CUR 1,0
; SPEICHER OK
10110 GOSUB 10200               ; Konstanten definieren
10115 BITCLR LEDR:BITSET LEDG   ; rote LED aus, grüne an
10190 RETURN
; =============================================================
; -------------- Konstanten definieren -----------------------
; hier als Beispiel BaMaII
10200 INF=0 : MAXINF=5 : BAINF=70	; Info-Menü-Merker
10203 A0=0                      ; Ausgang "im Set-Point"
10205 A1=1                      ; Ausgang "Zyklus läuft"
10210 A2=2                      ; Ausgang "Schruppen Ende"
10215 A3=3                      ; Ausgang "Schlichten Ende"
10220 A4=4                      ; Ausgang "Nullmaß Ende"
10225 A5=5                      ; Ausgang "betriebsbereit"
10230 A6=6                      ; Ausgang "Meßgerät"
10235 A7=7                      ; Ausgang "Halt oder Notrück aktiv"
10240 EN0=0                     ; Endschalter 1
10245 EN1=4                     ; Endschalter 2
10250 STRG=5                    ; Eingang "Störung Endstufe"
10255 E0=8                      ; Eingang "Hand=0 Auto=1"
10260 E1=9                      ; Eingang "Start"
10265 E2=10                     ; Eingang "Anschleifen"
10270 E3=11                     ; Eingang "Ende Schrupp"
10275 E4=12                     ; Eingang "Ende Schlicht"
10280 E5=13                     ; Eingang "Fertigmaß"
10285 E6=14                     ; Eingang "Halt"
10290 E7=15                     ; Eingang "Not-Rück"
10292 E8=20                     ; Eingang 
10293 E9=21                     ; Eingang 
10295 LEDR=159                  ; Leuchtdiode rot
10300 LEDG=158                  ; Leuchtdiode grün
10305 CODE=9876                 ; Maschinencode
; ---- Initialisierung Tastaturcodes ----
;---- Initcodes für BAMA und LEA ---
10320 ESC = 27                  ; Tastaturcode <Escape>
10325 F1  = 80                  ; Tastaturcode <F1>
10330 F2  = 73                  ; Tastaturcode <F2>
10335 F3  = 85                  ; Tastaturcode <F3>
10340 F4  = 78                  ; Tastaturcode <F4>
10345 F5  = 79                  ; Tastaturcode <F5>
10350 F6  = 84                  ; Tastaturcode <F6>
10355 INFO = 44                 ; Tastaturcode <i>
10360 RET = 13                  ; Tastaturcode <Return>
10365 DEL = 8                   ; Tastaturcode <Backspace>
10370 PKT = 46                  ; Tastaturcode <Punkt>
; gesteuert über Variable <EA> 0=PC 1=LEA ---
10380 IF EA=1 THEN RETURN       ; wenn BaMa dann Return
; --- Sonder-Initcodes für PC ---
10385 F1  = 33                  ; Tastaturcode <shift 1>
10390 F2  = 34                  ; Tastaturcode <shift 2>
; F3 war =245 ??
10395 F3  = 167			; Tastaturcode <shift 3>
10400 F4  = 36                  ; Tastaturcode <shift 4>
10405 F5  = 37                  ; Tastaturcode <shift 5>
10410 F6  = 38                  ; Tastaturcode <shift 6>
10415 INFO = 105                ; Tastaturcode <i>
10435 RETURN

;  ---------------------------------------------------------------
;                       INPUT
;   --------------------------------------------------------------
;Funktion : INPUT Routine.
;           Zuerst wird die Zahl in Vor- und Nachkommastellen zerlegt
;           und angezeigt. Dann wird die Tastatur abgefragt und eine
;           neue Zahl gebildet.
;           Format der auf dem Stack übergebenen Werte :
;           Zu editierende Zahl   : Normale REAL Zahl ohne Exponent
;           Vor-,Nachkommastellen : zB. 2,4  = 2 Stellen VOR und
;                                              4 Stellen NACH dem Komma
;
;Eingang  : 7 Werte auf dem Stack    7.  MAX
;                                    6.  MIN
;                                    5.  NACH
;                                    4.  VOR
;                                    3.  EINH
;                                    2.  Text
;                                    1.  WERT
;Ausgang  : --
;lokal    : V,N,NN,VV
;           WERT,ZAHL,MODE
;           A,B,Z,Z1,Z2
;global   : --
; Änderungen
; 20.6.07 Bu	12902,12942 vor der Schleife nullen
12000  POP MAX,MIN			; Min/Maxwert
12010  POP N,V				; Grenzen Nachkomma, Vorkomma
12015  POP TXT2,TXT1			; Bezeichung und Einheit
12020  NN=0 : VV=0			; init Edit Nach-, Vorkomma
12030  POP WERT				; zu editierende Zahl
12040  ZAHL=ABS(WERT)			; Edit Zahl
12042  IF WERT<0 THEN MINUS=-1 ELSE MINUS=1	; Vorzeichen
12045  GOSUB 12350			; Display, Cur steht auf 1,0, CPOS=0
12050  GOSUB 12900			; Display, Zahl darstellen
; ------------- Tastaturabfrage -----------------
12200  DO:T=GET
12210    IF T = ESC THEN PUSH WERT : E=11       ; Routine verlassen ohne sp.
12220    IF T = DEL THEN GOSUB 12500            ; ein Zeichen löschen
12230    IF T = INFO THEN GOSUB 12700           ; total löschen
12240    IF T = RET THEN GOSUB 12300		; MIN/MAX, T=0 wenn falsch
12245    IF T = RET THEN PUSH MINUS*ZAHL	; Vorzeichen*WERT ok
12250    IF T = PKT THEN GOSUB 12400            ; Punkt nur einmal einfügen
12255    IF T = F2 THEN GOSUB 12430		; Vorzeichenwechsel
12260    IF T>47 .AND. T<58 THEN GOSUB 12800    ; Zahlentasten
12270  UNTIL T=ESC.OR.T=RET
12280  RETURN					; Routine verlassen
; ------------ Min/Max-Pruefung ------------
12300 X=MINUS*ZAHL:IF X>=MIN .AND. X<=MAX THEN RETURN	; alles ok
12305 CLS : PRINT $(21),			; ? DATENFEHLER
12310 CUR1,0: P.U.(####.###),	;Darstellung mit Exp. vermeiden
12315 IF X<MIN PRINT "MIN=",MIN, ELSE PRINT "MAX=",MAX,
12320 P.U.(0),
12330 FOR I=0 TO 2000 : NEXT                    ; wait
12335 GOSUB 12350:GOSUB 12900			; CPOS=0
12340 T=0:RETURN				; FehlerMerker für return
; ------------ Display-Darstellung ------------
12350 CLS : PRINT $(TXT1),           ; ? Bezeichnung
' ? Einheit:
12360 ON TXT2 GOSUB 12380,12381,12382,12383,12384,12385,12386,12387,12388	;Liste der Einheiten
12365 CPOS=0: RETURN
; Liste der Einheiten ohne 0
12380 CUR 1,8 : PRINT "        ",: RETURN	;Einheit 0
12381 CUR 1,12: PRINT "[um]",	 : RETURN	;Einheit 1
12382 CUR 1,12: PRINT "[mm]",    : RETURN	;Einheit 2
12383 CUR 1,8 : PRINT "[um/min]",: RETURN	;Einheit 3
12384 CUR 1,13: PRINT "[s]",     : RETURN	;Einheit 4
12385 CUR 1,12: PRINT "[Hz]",    : RETURN	;Einheit 5
12386 CUR 1,10: PRINT "[1..9]",  : RETURN	;Einheit 6
12387 CUR 1,12: PRINT "[um]",    : RETURN	;Einheit 7 Reserve
12388 CUR 1,12: PRINT "[um]",    : RETURN	;Einheit 8 Reserve
12389 IF V(16)=1 THEN CUR 1,10:PRINT "[high]", ELSE CUR 1,10:PRINT "[low] ",
; ------------ Dezimalpunkt eingeben ------------
12400  IF N=0 THEN RETURN                       ; nur ganze Zahl zugelassen?
12410  IF NN=0 THEN NN=0.5 : PRINT ".",         ; Dezimalpunkt anzeigen
12420  RETURN
; ------------ Vorzeichenwechsel ----------------
12430 IF MINUS=-1 THEN MINUS=1 ELSE MINUS=-1
12450 GOSUB 12900			; Zahl darstellen, CPOS nicht verändern
12460 RETURN
; --------------- Zeichen löschen ---------------
12500  IF VV=0 THEN RETURN                      ; Alle Vorkommastellen gelöscht
12510  IF NN=0.5 THEN NN=0  : GOTO 12530        ; Dezimalpunkt löschen
12515  IF NN=0 THEN VV=VV-1 : GOSUB 12600       ; Vorkommastelle löschen
12520  IF NN=1 THEN NN=0 : GOSUB 12650 : NN=0.5 ; erste Nachkommastelle löschen
12525  IF NN>1 THEN NN=NN-1 : GOSUB 12650       ; Nachkommastelle löschen
12530  PRINT CHR(DEL),                          ; Bildschirmzeichen löschen
12540  IF EA=1 THEN PRINT " ",CHR(DEL),         ; BackDEL auf LCDisplay
;12550  RETURN
12550  goto 12672
; -- Vorkomma --
12600  ZAHL=INT(ZAHL/10)                        ; letzte Stelle löschen
; -- Nachkomma --
12650  Z1=(ZAHL-INT(ZAHL))*10**NN               ; letzte Nachkommastelle
12660  Z2=Z1-INT(Z1)                            ; löschen
12670  ZAHL=ZAHL-(Z2*10**(-NN))
12672  init out,0:?"delete",VV,NN,Zahl
12676  init out,1
12680  RETURN
; ----------------- Alles löschen ---------------
12700  IF VV=0 THEN RETURN		; es ist bereits alles gelöscht
12710  IF NN >0 THEN NN=NN+1		; plus 1 für Dezimalpunkt
12720  FOR I=1 TO (NN+VV) 
12730  IF EA=1 THEN PRINT CHR(DEL)," ",	; BackDEL auf LCDisplay
12740  PRINT CHR(DEL), : NEXT		; Editierfeld löschen
12750  ZAHL=0                                   
12760  NN=0
12770  VV=0
12780  RETURN
; ------------- neue Ziffer eingeben --------------
12800  IF NN>0 THEN GOTO 12840                 
; -- Vorkomma --
12810  IF VV=V THEN RETURN		; Keine weitere Stelle erlaubt
12820  VV=VV+1
12825  PRINT CHR(T),
12830  ZAHL=ZAHL*10+T-48		; neue Vorkommastelle anfügen 
;12835  RETURN
12835  goto 12882
; -- Nachkomma --
12840  IF NN=N THEN RETURN		; Keine weitere Stelle erlaubt
12850  IF NN=0.5 THEN NN=0		; Dez.Punkt wurde neu eingegeben (Krücke!) 
12860  NN=NN+1
12870  PRINT CHR(T), 
12880  ZAHL=ZAHL+((T-48)*10**(-NN))	; neue Nachkommastelle anfügen 
12882  init out,0:?"neue",VV,NN,Zahl
12886  init out,1
12890  RETURN
; -------- übergebene Zahl darstellen -----------
; EVar.: CPOS=Cursorpos., Zahl
; AVar.: VV,NN
12900 CUR 1,CPOS:Z=ZAHL			; Hilfsvariable
12902 VV=0				; init
12905 DO 
12910    Z=Z/10 : VV=VV+1		; Vorkomma von WERT bestimmen
12915 WHILE INT(Z)<>0
12917  init out,0:?"AnzeigeVor",VV,NN,Zahl
12918  init out,1
12920  PRINT INT(MINUS*ZAHL),CHR(DEL),	; Vorkommastelle ausgeben 
; wenn Zahl -1 ... 0 wird - nicht dargestellt
12922 IF INT(ZAHL)>0 THEN 12925		; weiter
12923 CUR 1,CPOS:IF MINUS=1 THEN PRINT " ", ELSE PRINT "-",; Minus auf 1. Stelle
12924 CUR 1,CPOS+2
; normal weiter
12925  Z=ZAHL-INT(ZAHL)                 ; Z = Nachkomma von Zahl
; wenn unplausibel
12930  IF Z=0 THEN RETURN		; ZAHL ist eine Ganzzahl
12935  A=Z                              ; Hilfsvariable
12940  PRINT ".",			; Dezimalpunkt ausgeben
12942 NN=0
12945  DO
12950    Z=Z*10 : NN=NN+1		; Nachkomma von WERT bestimmen
12955    A=A*10 : PRINT CHR(INT(A)+48),	; Nachkommastelle ausgeben
12960    A=A-INT(A)			; Platz für neue Nachkommastelle
12980  WHILE Z-INT(Z)<>0
12987  init out,0:?"AnzeigeNach",VV,NN,Zahl
12988  init out,1
12990 RETURN
; -----------------------------------------------------------
;                       Ausgabetexte
; -----------------------------------------------------------
;
; --- Texte Deutsch ---
;         Parameter 
20000 $(0)="                "
20260 $(52)="SET UP"
20699 RETURN

