;
; Aufgabe Nr.: Speichermodul fuer uP- Praktikum II
; Autor: Joerg Vollandt 
; erstellt am : 01.07.1994
; letzte Aenderung am : 02.08.1994
; Bemerkung :
;
; Dateiname : run1.asm
;

;---------------------------------------------------------------------
Definitionen

ENDE_MARKE      EQU     0FFH
SYNC_MARKE      EQU     0FEH
READY_MARKE     EQU     0FDH
DRILL_MARKE     EQU     0FCH

PenUp           EQU     000H
PenDown         EQU     0FFH
d_z             EQU     200             ; Schritte fuer Auf-/Ab
Queue_Const     EQU     10              ; je Befehle ein GibReady an Frs

;---------------------------------------------------------------------
        SEGMENT CODE
;---------------------------------------------------------------------
; Funktion : Initialisierung
; Aufrufparameter : -
; Ruechgabeparameter : -
; Veraenderte Register :
; Stackbedarf :
; Zeitbedarf :
;

INIT_RUN:
        CLR RUNNINGBIT
        CLR Sync_Waiting
        CLR Ready_Waiting
        CLR Drilling
        CLR Drill_down
        CLR FrsWarning
        CLR PAUSE
        CLR SingleStep
        CLR Break
        MOV R_Sync_Counter,#0
        MOV Queue_Counter,#Queue_Const
        RET

;---------------------------------------------------------------------
; Funktion : Runmodul liesst ein Fkt.-Byte oder eine komplette Msg.
;            aus dem Speicher und schickt diese ins Netz.
; Aufrufparameter : -
; Ruechgabeparameter : -
; Veraenderte Register :
; Stackbedarf :
; Zeitbedarf :
;

RUN_MODUL:
        PUSH_ALL
        JNB Break,RUN1
        LJMP RUN_ENDE
RUN1:   LCALL GET_ELEMENT_MEM                   ; Anzahl Bytes
        JNC RUN4                                ; Speicher leer
        LJMP RUN_LEER
RUN4:   CJNE A,#ENDE_MARKE,RUN5                 ; Ende -MARKE im Speicher
        GET_16 RD_POINTER
        DEC_DPTR
        SET_16 RD_POINTER
        LJMP RUN_ENDE                           ; erkannt
RUN5:   CJNE A,#SYNC_MARKE,RUN6                 ; Sync -MARKE im Speicher
        LJMP RUN_SYNC                           ; erkannt
RUN6:   CJNE A,#READY_MARKE,RUN7                ; Ready -MARKE im Speicher
        LJMP RUN_READY                          ; erkannt
RUN7:   CJNE A,#DRILL_MARKE,RUN8                ; Drill -MARKE im Speicher
        LJMP RUN_DRILL                          ; erkannt
RUN8:
        LCD 40h,"Ablauf der Teachin- Datei.              "
        PUSH ACC
        MOV B,A
        USING 1                                 ; Msg.
        MOV R0,#AR0                             ; aus Speicher nach Bank 1
        USING 0
RUN_Next_Byte:
        LCALL GET_ELEMENT_MEM                   ; Bytes aus Speicher
        MOV @R0,A                               ; holen
        INC R0
        DJNZ B,RUN_Next_Byte

        POP B
        PUSH PSW
        CLR RS1                                 ; Bank 1
        SETB RS0
        MOV DPTR,#ModulNetAdr_Tab
        MOV A,R0
        MOVC A,@A+DPTR
        SEND_NET                                ; Msg senden
        POP PSW                                 ; alte Bank
        POP_ALL
        JNB SingleStep,RUN_Next_Ende
        PUSH_ALL
        LJMP RUN_READY
RUN_Next_Ende:
        RET                                     ; fertig !


RUN_READY:
        LCD 40h,"Warten bis Geraet fertig.               "
        JNB P3.5,RUN_READY_FRS
        post_message2 #Frs,#GibReady,#MemFrs,#GetFrsReady,#0 ; Ready-Anforderung
        LJMP RUN_READY_WEITER                   ; schicken
RUN_READY_FRS:
        post_message2 #Rob,#RobGibReady,#MemRob,#GetRobReady
RUN_READY_WEITER:
        SETB Ready_Waiting
        POP_ALL
        RET


RUN_SYNC:
        LCD 40h,"Warten auf Synchronisationspunkt Nr.: "
        LCALL GET_ELEMENT_MEM                   ; Sync_Counter aus Speicher
        LCALL A_LCD
        JB P3.5,RUN_SYNC_FRS
        post_message2 #MemFrs,#GetFrsSync,A     ; Sync.-Meldung an Partner
        LJMP RUN_SYNC0                          ; schicken
RUN_SYNC_FRS:
        post_message2 #MemRob,#GetRobSync,A
RUN_SYNC0:
        MOV B,A
        MOV A,R_Sync_Counter
        CJNE A,B,RUN_SYNC1
RUN_SYNC1: JNC RUN_SYNC_ENDE
        SETB Sync_Waiting
RUN_SYNC_ENDE:
        POP_ALL
        RET


RUN_DRILL:
        JNB P3.5,RUN_DRILL_ROB
        LJMP RUN_DRILL_FRS
RUN_DRILL_ROB:
        LCD 40h,"Roboter kann nicht fraesen! Abbruch.    "
        CLR RUNNINGBIT
        POP_ALL
        LCALL INIT_TEACH
        LCALL RESET_TEACH
        RET

RUN_DRILL_FRS:
        LCD 40h,"Fraesdatei wird abgearbeitet.           "
        SETB Drilling
        LCALL GET_ELEMENT_MEM                          ; Fraestiefe aus Speicher
        MOV Frs_Ref_Tiefe,A
        LCALL GET_ELEMENT_MEM
        MOV Frs_Ref_Tiefe+1,A
        post_message2 #Frs,#FrsVelocityDraw,#fast       ; schnelle Bewegung
        post_message2 #Frs,#GoPieceRefPos               ; Werkstueckreferenz
        post_message2 #Frs,#MoveRZ,#(d_z/256),#(d_z#256) ; Pen up
        post_message2 #Frs,#DRILL,#on                   ; Motor an
        clr DRILL_DOWN
        SETB DRILL_DOWN

        MOV A,MY_SLAVE_ADR
        SWAP A                                         ; *16
        ADD A,#MSG_PC_RESET+Msg_Frs_Datei
        MOV R0,A
        MOV A,#PC_Slave_Adr                            ; Datei oeffnen
        MOV B,#8
        SEND_NET
        MOV A,MY_SLAVE_ADR
        SWAP A                                         ; *16
        ADD A,#MSG_PC_GET+Msg_Frs_Datei
        MOV R0,A
        MOV A,#PC_Slave_Adr                            ;
        MOV B,#8
        MOV DPTR,#0
        SET_16 BLOCKNR                                 ; Blocknr.=0 setzen
        MOV R1,DPL                                     ; Blocknr.
        MOV R2,DPH
        SEND_NET                                       ; 0. Block laden
        POP_ALL
        RET


RUN_LEER:
        LCD 40h,"Speicherinhalt defeckt.                 "
        CLR RUNNINGBIT
        POP_ALL
        LCALL INIT_TEACH
        LCALL RESET_TEACH
        RET


RUN_ENDE:
        LCD 40h,"Ablauf beendet.                         "
        GET_16 NEXT_FREE
        DEC_DPTR
        SET_16 NEXT_FREE                        ; Ende- MARKE entfernen
        CLR RUNNINGBIT                          ; Ablaufbeenden
        MOV A,R_Sync_Counter
        MOV T_Sync_Counter,A
        GET_16 RD_POINTER
        SET_16 NEXT_FREE
        POP_ALL
        CLR Break
        RET

;---------------------------------------------------------------------
; Funktion : Start des Runmoduls. Schreibt die Endemarke in den Speicher,
;            setzt den Speicher zurueck und setzt das Bit RUNNINBIT.
; Aufrufparameter : -
; Ruechgabeparameter : -
; Veraenderte Register :
; Stackbedarf :
; Zeitbedarf :
;

START_RUNNING:
        JB READY,START_R
        LJMP START_NICHT_BEREIT
START_R: PUSH ACC
        MOV A,#ENDE_MARKE
        LCALL PUT_ELEMENT_MEM
        POP ACC
        LCALL RESET_MEM
        SETB RUNNINGBIT
        CLR Sync_Waiting
        CLR Ready_Waiting
        MOV R_Sync_Counter,#0
        RET

START_NICHT_BEREIT:
        LCD 40H,"Modul nicht bereit fuer Ablauf.         "
        RET

 ;---------------------------------------------------------------------
; Funktion : Piece-Ref-Position der Fraese speichern. 1. Teil: Position
;            anforndern.
; Aufrufparameter : -
; Ruechgabeparameter : -
; Veraenderte Register :
; Stackbedarf :
; Zeitbedarf :
;

STORE_PIECE_REF:
        PUSH PSW
        PUSH ACC
        PUSH AR0
        JNB READY,STORE_P_REF_ENDE              ; Fertig und Fraese?
        JNB P3.5,STORE_P_REF_ENDE

;        MOV B,#4                                ; Msg. an Frs um Pos.
;        MOV R2,#MemFrs                          ; Empfaenger angeben
;        MOV R3,#FrsPieceRef                     ; Msg.-Nr. Empfaenger angeben
;        post_message1 Frs,GibFrsPos1            ; zu erfragen
        post_message2 #Frs,#GibFrsPos1,#MemFrs,#FrsPieceRef

STORE_P_REF_ENDE:
        CLR READY                               ; Teach- In nicht bereit
        POP AR0
        POP ACC
        POP PSW
        RET

 ;---------------------------------------------------------------------
; Funktion : Piece-Ref-Position der Fraese speichern. 2. Teil: Position
;            in x,y,z speichern, Ref_Flag setzen.
; Aufrufparameter : -
; Ruechgabeparameter : -
; Veraenderte Register : -
; Stackbedarf :
; Zeitbedarf :
;

PIECE_REF_FROM_FRS:
        PUSH PSW
        PUSH ACC
        PUSH AR0
        JNB READY,P_REF_FRS_DO                    ; NICHT Fertig und Roboter ?
        JB P3.5,P_REF_FRS_DO
        LJMP P_REF_FRS_ENDE
P_REF_FRS_DO:
        MOV Frs_Ref_x,R2                        ; Position speichern
        MOV Frs_Ref_x+1,R3                      ; Position speichern
        MOV Frs_Ref_y,R4                        ; Position speichern
        MOV Frs_Ref_y+1,R5                      ; Position speichern
        MOV Frs_Ref_z,R6                        ; Position speichern
        MOV Frs_Ref_z+1,R7                      ; Position speichern

P_REF_FRS_ENDE:
        POP AR0
        POP ACC
        POP PSW
        SETB READY                               ; Teach- In wieder bereit
        SETB Ref_Flag
        RET

 ;---------------------------------------------------------------------
; Funktion : Fraestiefe der Fraese speichern. 1. Teil: Position
;            anforndern.
; Aufrufparameter : -
; Ruechgabeparameter : -
; Veraenderte Register :
; Stackbedarf :
; Zeitbedarf :
;

STORE_TIEFE:
        PUSH PSW
        PUSH ACC
        PUSH AR0
        JNB READY,STORE_TIEFE_ENDE              ; Fertig und Fraese?
        JNB P3.5,STORE_TIEFE_ENDE

;        MOV B,#4                                ; Msg. an Frs um Pos.
;        MOV R2,#MemFrs                          ; Empfaenger angeben
;        MOV R3,#FrsTiefe                        ; Msg.-Nr. Empfaenger angeben
;        post_message1 Frs,GibFrsPos1            ; zu erfragen
        post_message2 #Frs,#GibFrsPos1,#MemFrs,#FrsTiefe

STORE_TIEFE_ENDE:
        CLR READY                               ; Teach- In nicht bereit
        POP AR0
        POP ACC
        POP PSW
        RET

 ;---------------------------------------------------------------------
; Funktion : Fraestiefe der Fraese speichern. 2. Teil: Tiefe berechnen
;            und in Frs_Ref_Tiefe speichern, Tiefe_Flag setzen.
; Aufrufparameter : -
; Ruechgabeparameter : -
; Veraenderte Register : -
; Stackbedarf :
; Zeitbedarf :
;

TIEFE_FROM_FRS:
        PUSH PSW
        PUSH ACC
        PUSH AR0
        JNB READY,TIEFE_FRS_DO                  ; NICHT Fertig und Roboter ?
        JB P3.5,TIEFE_FRS_DO
        LJMP TIEFE_FRS_ENDE
TIEFE_FRS_DO:
;        MOV A,AR7                               ; Fraestiefe berechnen
;        CLR C                                   ; und speichern
;        SUBB A,Frs_Ref_Tiefe+1
        MOV Frs_Ref_Tiefe+1,AR7
;  7
;        MOV A,AR6
;        SUBB A,Frs_Ref_Tiefe
        MOV Frs_Ref_Tiefe,AR6
TIEFE_FRS_ENDE:
        POP AR0
        POP ACC
        POP PSW
        SETB READY                               ; Teach- In wieder bereit
        SETB Tiefe_Flag
        RET

;---------------------------------------------------------------------
; Funktion : Flags abfragen, nur wenn Ref_Flag und Tiefe_Flag low weiter.
;            SetPieceRef Msg. in Speicher ablegen, Drill Marke ablegen,
;            Tiefe ablegen.
; Aufrrameter : -
; Ruechgabeparameter : -
; Veraenderte Register :
; Stackbedarf :
; Zeitbedarf :
;

STORE_DRILL:
        PUSH PSW
        PUSH ACC
        JNB Ref_Flag,STORE_DRILL_ERROR          ; PieceRefPos und Tiefe
        JNB Tiefe_Flag,STORE_DRILL_ERROR        ; definiert
        LJMP STORE_DRILL_OK

STORE_DRILL_ERROR:
        LCD 40h,"Fehler: RefPos/ Tiefe nicht definiert.  "
        POP ACC
        POP PSW
        RET

STORE_DRILL_OK:
        MOV A,#8                                ; Msg- Header speichern
        LCALL PUT_ELEMENT_MEM                   ; (Msg.-Laenge)
        ERROR 0
        MOV A,#Frs                              ; Msg- Header speichern
        LCALL PUT_ELEMENT_MEM                   ; (Modulnr.)
        ERROR 0
        MOV A,#SetPieceRef                      ; Msg- Header speichern
        LCALL PUT_ELEMENT_MEM                   ; (Msg.- Nr.)
        ERROR 0
        MOV A,Frs_Ref_x                         ; Position speichern
        LCALL PUT_ELEMENT_MEM                   ; (Parameter 1 High)
        ERROR 0
        MOV A,Frs_Ref_x+1                       ; Position speichern
        LCALL PUT_ELEMENT_MEM                   ; (Parameter 1 Low)
        ERROR 0
        MOV A,Frs_Ref_y                         ; Position speichern
        LCALL PUT_ELEMENT_MEM                   ; (Parameter 2 High)
        ERROR 0
        MOV A,Frs_Ref_y+1                       ; Position speichern
        LCALL PUT_ELEMENT_MEM                   ; (Parameter 2 Low)
        ERROR 0
        MOV A,Frs_Ref_z                         ; Position speichern
        LCALL PUT_ELEMENT_MEM                   ; (Parameter 3 High)
        ERROR 0
        MOV A,Frs_Ref_z+1                       ; Position speichern
        LCALL PUT_ELEMENT_MEM                   ; (Parameter 3 Low)
        ERROR 0

        MOV A,#DRILL_MARKE
        LCALL PUT_ELEMENT_MEM

        MOV A,Frs_Ref_Tiefe                     ; Position speichern
        LCALL PUT_ELEMENT_MEM                   ; (Parameter 3 High)
        ERROR 0
        MOV A,Frs_Ref_Tiefe+1                   ; Position speichern
        LCALL PUT_ELEMENT_MEM                   ; (Parameter 3 Low)
        ERROR 0

        POP ACC
        POP PSW
        RET

;---------------------------------------------------------------------
; Funktion : Speichert die Ready-MARKE im Speicher
; Aufrufparameter : -
; Ruechgabeparameter : -
; Veraenderte Register :
; Stackbedarf :
; Zeitbedarf :
;

STORE_READY:
        PUSH ACC
        MOV A,#READY_MARKE
        LCALL PUT_ELEMENT_MEM
        POP ACC
        RET

;---------------------------------------------------------------------
; Funktion : Speichert das Sync.-MARKE und den Sync.-Counter im Speicher
; Aufrufparameter : -
; Ruechgabeparameter : -
; Veraenderte Register :
; Stackbedarf :
; Zeitbedarf :
;

STORE_SYNC:
        PUSH ACC
        MOV A,#SYNC_MARKE
        LCALL PUT_ELEMENT_MEM
        INC T_Sync_Counter                ; Sync_Counter +1
        MOV A,T_Sync_Counter
        LCALL PUT_ELEMENT_MEM
        LCD 29,"Sync.-Nr."
        LCALL A_LCD
        POP ACC
        RET

;---------------------------------------------------------------------
; Funktion : Ready-Msg. erhalten und bearbeiten.
; Aufrufparameter : -
; Ruechgabeparameter : -
; Veraenderte Register :
; Stackbedarf :
; Zeitbedarf :
;

GET_READY_MSG:
        LCD 40H,"                                        "
        CLR Ready_Waiting
        RET

;---------------------------------------------------------------------
; Funktion : Sync.-Msg. erhalten und bearbeiten. Bricht Running ab
;            wenn von Partner Sync.-Nr. 0 kommt. Wenn eigenes Modul
;            noch nicht getstartet wird Sync.-Msg. mit #0 an Partner
;            geschickt.
; Aufrufparameter : -
; Ruechgabeparameter : -
; Veraenderte Register :
; Stackbedarf :
; Zeitbedarf :
;

GET_SYNC_MSG:
        JNB RunningBit,G_S_1
        LJMP G_S_2
G_S_1:  PUSH B
        MOV B,#3                                ; Msg.
        MOV R2,#0                               ; mit #0
        JB P3.5,G_S_FRS
        post_message1 MemFrs,GetFrsSync         ; Sync.-Meldung an Partner
        POP B
        RET                                     ; schicken
G_S_FRS: post_message1 MemRob,GetRobSync
        POP B
        RET

G_S_2:  PUSH PSW
        PUSH ACC
        INC R_Sync_Counter
        MOV A,R2                        ; Sync_Counter aus Msg. holen
        CJNE A,#0,G_S_KEIN_ABBRUCH        ; Abbruch bei #0
        LJMP G_S_ABBRUCH
G_S_KEIN_ABBRUCH:
        CJNE A,R_Sync_Counter,G_S_ERROR   ; Fehler wenn ungleich
        CLR Sync_Waiting
        POP ACC
        POP PSW
        RET

G_S_ABBRUCH:
        LCD 40h,"Partner nicht bereit. Abbruch.          "
        CLR RUNNINGBIT
        POP ACC
        POP PSW
        LCALL INIT_TEACH
        LCALL RESET_TEACH
        RET

G_S_ERROR:
        LCD 40h,"Synchronisationsfehler.                 "
        CLR RUNNINGBIT
        POP ACC
        POP PSW
        LCALL INIT_TEACH
        LCALL RESET_TEACH
        RET

;---------------------------------------------------------------------
; Funktion : Testen ob Queue- Warnung von Frs gekommen ist. Wenn ja,
;            GibReady an die Fraese schicken und warten bis kommt.
; Aufrufparameter : -
; Ruechgabeparameter : -
; Veraenderte Register :
; Stackbedarf :
; Zeitbedarf :
;

queue_test      macro

Q_T_Main_Loop:
        LCALL MAIN_EVENT_LOOP
        JB PAUSE,Q_T_Main_Loop                  ; Pause aktiv
        JB READY_WAITING,Q_T_Main_Loop          ; warten auf Ready von Frs
        LCALL READ_STATUS
        JB ACC.1,Q_T_Main_Loop

        endm

;---------------------------------------------------------------------
; Funktion : Daten aus der Fraesdatei vom PC empfangen, konvertieren
;            und an die Fraese schicken.
; Aufrufparameter : -
; Ruechgabeparameter : -
; Veraenderte Register :
; Stackbedarf :
; Zeitbedarf :
;


GET_WORKFR_FROM_PC:
        PUSH_ALL
        JB RUNNINGBIT,GET_WORKFR_FROM_PC_START
        LJMP GET_WORKFR_FROM_PC_ABBRUCH
GET_WORKFR_FROM_PC_START:
        MOV A,R1                                ; testen ob Dateiende
        CJNE A,#0ffh,GET_WORKFR_FROM_PC_NEXT
        MOV A,R2
        CJNE A,#0ffh,GET_WORKFR_FROM_PC_NEXT
        LJMP GET_WORKFR_FROM_PC_ENDE

GET_WORKFR_FROM_PC_NEXT:                        ; naechste Msg. von PC
        PUSH_ALL                                ; konvertieren und an Frs
        queue_test
        MOV A,AR7                               ; schicken
        CJNE A,#PenDown,G_W_PenUp               ; Auf- oder Abbewegung?
        ljmp G_W_PenDown
G_W_PenUp:
        jb drill_down,G_W_Make_Up
        ljmp G_W_Pen_Ready                      ; ist schon oben
G_W_Make_Up:
        post_message2 #Frs,#MoveZ,Frs_Ref_z,Frs_Ref_z+1 ; Pen aus Werkstueck ziehen
        queue_test
        post_message2 #Frs,#FrsVelocityDraw,#fast ; schnelle Bewegung
        queue_test
        post_message2 #Frs,#MoveRZ,#(d_z/256),#(d_z#256) ; Pen up
        clr DRILL_DOWN
        queue_test
        LJMP G_W_Pen_Ready                      ; fertig

G_W_PenDown:
        jnb drill_down,G_W_Make_Down
        ljmp G_W_Pen_Ready                       ; ist schon unten
G_W_Make_Down:
        post_message2 #Frs,#MoveRZ,#(((-d_z) & 0ffffh) / 256),#(((-d_z) & 0ffffh) # 256) ; Ab
        queue_test
        post_message2 #Frs,#FrsVelocityDraw,#slow ; langsame Bewegung
        queue_test
        post_message2 #Frs,#MoveZ,Frs_Ref_Tiefe,Frs_Ref_Tiefe+1 ; Pen aus Werkstueck ziehen
        queue_test
        SETB DRILL_DOWN
G_W_Pen_Ready:                                  ; Pen fertig !

        POP_ALL
        post_message2 #Frs,#MovePR,AR4,AR3,AR6,AR5,#0,#0 ; rel. Bewegung
        queue_test

;        DJNZ Queue_Counter,G_W_Send_no_Ready
;        MOV Queue_Counter,#Queue_Const
;        PUSH_ALL
;        post_message2 #Frs,#GibReady,#MemFrs,#GetFrsReady,#0
;        POP_ALL

G_W_Send_no_Ready:

        GET_16 BLOCKNR
        INC DPTR
        SET_16 BLOCKNR                          ; Blocknr.=+1 setzen
        MOV R1,DPL                              ; Blocknr.
        MOV R2,DPH
        MOV A,MY_SLAVE_ADR
        SWAP A                                  ; *16
        ADD A,#MSG_PC_GET+Msg_Frs_Datei
        MOV R0,A
        MOV A,#PC_Slave_Adr
        MOV B,#8
        SEND_NET                                ; naechsten Block anfordern
        POP_ALL
        RET

GET_WORKFR_FROM_PC_ENDE:
        post_message2 #Frs,#DRILL,#off          ;
        CLR Drilling

        POP_ALL
        LCD 40h,"Fraesdatei fertig.                      "
        RET

GET_WORKFR_FROM_PC_ABBRUCH:
        CLR Drilling
        POP_ALL
        RET

;---------------------------------------------------------------------
; Funktion : Warnung von Frs erhalten und verarbeiten.
; Aufrufparameter : -
; Ruechgabeparameter : -
; Veraenderte Register :
; Stackbedarf :
; Zeitbedarf :
;

Get_Warning_From_Frs:
        LCD 40h,"Warnung Fraese:                         "
        PUSH ACC
        PUSH PSW
        PUSH B
        PUSH_DPTR

        MOV A,AR2
        IFMAKE QUEUE_WARNING,SETB FrsWarning    ; Queue Fraese laeuf ueber

        MOV DPTR,#ParamStr_Tab                  ; Tabellenbasis laden
GWFF_NEXT:
        MOV A,#0
        MOVC A,@A+DPTR                          ; Wert laden
        PUSH ACC                                ; retten
        MOV A,#1
        MOVC A,@A+DPTR                          ; Stringlaenge laden
        MOV B,A
        POP ACC                                 ; Wert mit empfangenem
        CJNE A,AR2,GWFF_LOOP                    ; vergleichen
        LJMP GWFF_AUSGABE
GWFF_LOOP:
        MOV A,B                                 ; Stringlaende auf Tabellen-
        ADD A,DPL                               ; zeiger addieren
        MOV DPL,A
        MOV A,#0
        ADDC A,DPH
        MOV DPH,A
        LJMP GWFF_NEXT

GWFF_AUSGABE:
        MOV A,#50h                              ; LCD- Position
        LCALL LCD_SET_DD_RAM_ADDRESS
        INC DPTR
        INC DPTR
        LCALL LCD_WRITE_STRING                  ; Meldung ausgeben
        MOV A,#0h                               ; LCD- Position
        LCALL LCD_SET_DD_RAM_ADDRESS

        POP_DPTR
        POP B
        POP PSW
        POP ACC
        RET

;---------------------------------------------------------------------
; Funktion : Fehler von Frs erhalten und verarbeiten.
; Aufrufparameter : -
; Ruechgabeparameter : -
; Veraenderte Register :
; Stackbedarf :
; Zeitbedarf :
;

Get_Error_From_Frs:
        LCD 40h,"Fehler Fraese:                          "
        PUSH ACC
        PUSH PSW
        PUSH B
        PUSH_DPTR
        MOV DPTR,#ParamStr_Tab                  ; Tabellenbasis laden
GEFF_NEXT:
        MOV A,#0
        MOVC A,@A+DPTR                          ; Wert laden
        PUSH ACC
        MOV A,#1
        MOVC A,@A+DPTR                          ; Stringlaenge laden
        MOV B,A
        POP ACC                                 ; Wert mit empfangenem
        CJNE A,AR2,GEFF_LOOP                    ; vergleichen
        LJMP GEFF_AUSGABE
GEFF_LOOP:
        MOV A,B                                 ; Stringlaende auf Tabellen-
        ADD A,DPL                               ; zeiger addieren
        MOV DPL,A
        MOV A,#0
        ADDC A,DPH
        MOV DPH,A
        LJMP GEFF_NEXT

GEFF_AUSGABE:
        MOV A,#4Fh                              ; LCD- Position
        LCALL LCD_SET_DD_RAM_ADDRESS
        INC DPTR
        INC DPTR
        LCALL LCD_WRITE_STRING                  ; Meldung ausgeben
        MOV A,#0h                               ; LCD- Position
        LCALL LCD_SET_DD_RAM_ADDRESS

        POP_DPTR
        POP B
        POP PSW
        POP ACC
        RET

;---------------------------------------------------------------------
; Funktion :
; Aufrufparameter : -
; Ruechgabeparameter : -
; Veraenderte Register :
; Stackbedarf :
; Zeitbedarf :
;

;=====================================================================
;        END
;---------------------------------------------------------------------



