
; Aufgabe Nr.: Teach- In Einheit fuer uP- Praktikum II
;              --- Link- Modul ---
; Autor: Joerg Vollandt 
; erstellt am : 13.06.1994
; letzte Aenderung am : 02.08.1994
; Bemerkung :
;
; Dateiname : t_mod1.asm
;
;=====================================================================
        SEGMENT CODE
        USING 0

        INCLUDE MAKRO1.ASM
        INCLUDE TAST1.ASM
        INCLUDE MEM1.ASM
        INCLUDE TEACH1.ASM
        INCLUDE RUN1.ASM
        INCLUDE DEBUG.ASM
;=====================================================================
; Definitionen der Funktionen der Teach- In Einheit

Adr_InitRobTeach   EQU    INIT_TEACH       ; Initialisieren der Teach- In Einheit
Adr_InitFrsTeach   EQU    INIT_TEACH       ; Initialisieren der Teach- In Einheit
Adr_DeinitRobTeach EQU     DEINIT_TEACH    ; Deinitialisieren der Teach- In Einheit
Adr_DeinitFrsTeach EQU     DEINIT_TEACH    ; Deinitialisieren der Teach- In Einheit
Adr_ClearRobTeach  EQU     CLEAR_TEACH     ; Speicher loeschen
Adr_ClearFrsTeach  EQU     CLEAR_TEACH     ; Speicher loeschen
Adr_ResetRobTeach  EQU     RESET_TEACH     ; Speicher zum lesen zuruecksetzen
Adr_ResetFrsTeach  EQU     RESET_TEACH     ; Speicher zum lesen zuruecksetzen
Adr_StoreRobPos    EQU     STORE_ROB       ; Position Roboter speichern
Adr_StoreFrsPos    EQU     STORE_FRAES     ; Position Fraese speichern
Adr_StoreRobSync   EQU     STORE_SYNC      ; Synchronisation speichern
Adr_StoreFrsSync   EQU     STORE_SYNC      ; Synchronisation speichern
Adr_StoreRobReady  EQU     STORE_READY     ; Warten auf Geraet speichern
Adr_StoreFrsReady  EQU     STORE_READY     ; Warten auf Geraet speichern
Adr_StoreFrsPieceRef EQU   STORE_PIECE_REF ; Werkstueck Nullpkt. festlegen
Adr_StoreFrsTiefe  EQU     STORE_TIEFE     ; Fraestiefe festlegen
Adr_StoreFrsDrill  EQU     STORE_DRILL     ; Fraesdatei bearbeiten
Adr_GetRobSync     EQU     GET_SYNC_MSG    ; Synchronisation empfangen
Adr_GetFrsSync     EQU     GET_SYNC_MSG    ; Synchronisation empfangen
Adr_GetRobReady    EQU     GET_READY_MSG   ; Ready empfangen
Adr_GetFrsReady    EQU     GET_READY_MSG   ; Ready empfangen
Adr_LoadRob        EQU     LOAD_ROB        ; Roboter Teach- In Datei von PC laden
Adr_LoadFrs        EQU     LOAD_FRAES      ; Fraese- Teach- In Datei von PC laden
Adr_SaveRob        EQU     SAVE_ROB        ; Roboter Teach- In Datei auf PC speichern
Adr_SaveFrs        EQU     SAVE_FRAES      ; Fraese- Teach- In Datei auf PC speichern

Adr_RobPos1        EQU     FIRST_FROM_ROB  ; Position von Roboter 1. Teil
Adr_RobPos2        EQU     SECOND_FROM_ROB ; Position von Roboter 2. Teil
Adr_FrsPos1        EQU     FIRST_FROM_FRS  ; Position von Fraese 1. Teil
Adr_FrsPos2        EQU     SECOND_FROM_FRS ; Position von Fraese 2. Teil
Adr_FrsPieceRef    EQU     PIECE_REF_FROM_FRS ; Position von Fraese
Adr_FrsTiefe       EQU     TIEFE_FROM_FRS  ; Position von Fraese

Adr_DebugRob       EQU     DEBUG_MEM       ; Position von Roboter 2. Teil
Adr_DebugFrs       EQU     DEBUG_MEM       ; Position von Roboter 2. Teil
Adr_StartRobRun    EQU     START_RUNNING   ; Runmanager starten
Adr_StartFrsRun    EQU     START_RUNNING   ; Runmanager starten

Adr_GetFrsError    EQU     Get_Error_from_frs   ;
Adr_GetFrsWarning  EQU     Get_Warning_from_frs ;


MemRob_MsgCall_Tab:
        include defMsg.inc
MemRob_MsgCall_Tend:

MemFrs_MsgCall_Tab:
        include defMsg.inc
MemFrs_MsgCall_Tend:

;------------------------------------------------------------------------------
; Speicherdefinitionen


        SEGMENT BITDATA

MSG             DB      ?
Sp_MSG          DB      ?
READY           DB      ?
CRC             DB      ?

TESTBIT         DB      ?
RUNNINGBIT      DB      ?
Sync_Waiting    DB      ?
Ready_Waiting   DB      ?
Drilling        DB      ?
Drill_down      DB      ?
PAUSE           DB      ?
FrsWarning      DB      ?
SingleStep      DB      ?
Break           DB      ?

Ref_Flag        DB      ?
Tiefe_Flag      DB      ?

        SEGMENT DATA

Sp_MSG_Buffer     DB      ?
T_Sync_Counter    DB      ?
R_Sync_Counter    DB      ?
Queue_Counter     DB      ?

Frs_Ref_x         DW      ?
Frs_Ref_y         DW      ?
Frs_Ref_z         DW      ?
Frs_Ref_Tiefe     DW      ?

;---------------------------------------------------------------------
        SEGMENT CODE
;---------------------------------------------------------------------
; Funktion : CALL_BACK- Fkt. wird nach Empfang einer Message
;            aufgerufen.
; Aufrufparameter : -
; Ruechgabeparameter : -
; Veraenderte Register :
; Stackbedarf :
; Zeitbedarf :
;

MESSAGE_BIT             BIT     ACC.0   ; Message Bits
SPECIAL_MESSAGE_BIT     BIT     ACC.2
START_BIT               BIT     ACC.0   ; Special- Message Bits
STOP_BIT                BIT     ACC.1
RESET_BIT               BIT     ACC.3
PAUSE_BIT               BIT     ACC.2
AUX1_BIT                BIT     ACC.4
AUX2_BIT                BIT     ACC.5

MESSAGE_INTERRUPT:
        PUSH ACC
        LCALL READ_STATUS
        JNB SPECIAL_MESSAGE_BIT,MESSAGE_INTERRUPT1
        LCALL READ_SPECIAL_MESSAGE              ; Special_Message lesen
        MOV Sp_MSG_Buffer,A                     ; und retten
        SETB Sp_MSG
        POP ACC
        RET

MESSAGE_INTERRUPT1:
        JNB MESSAGE_BIT,MESSAGE_INTERRUPT2
        SETB MSG                                ; Normale Msg.empfangen
MESSAGE_INTERRUPT2:
        POP ACC
        RET


;---------------------------------------------------------------------
; Funktion : Message- Scheduler fuer Speichermodul.
; Aufrufparameter : -
; Ruechgabeparameter : -
; Veraenderte Register : -
; Stackbedarf :
; Zeitbedarf :
;
; ****************************************************************************
; R0    Empf„nger (logische Adresse)
; R1    Message
; R2 - R7 Parameter
; ****************************************************************************

Message_Handler MACRO   Modul

        push PSW
        push ACC
        push DPH
        push DPL

        mov  DPTR,#Msg_Hndl_Ret        ; Ruecksprungadresse vom indirekten
        push DPL                        ; Jump ergibt indirekten Call
        push DPH
        mov  DPTR,#Modul_MsgCall_Tab
        mov  A,AR1
        clr  C
        rlc  A
        mov  AR1,A
        jnc  No_inc
        inc DPH
No_inc: movc A,@A+DPTR
        push ACC
        inc DPTR
        mov  A,AR1
        movc A,@A+DPTR
        push ACC
        ret                             ; indireckter Sprung

Msg_Hndl_Ret:
        pop  DPL
        pop  DPH
Msg_Ha_Exit:
        pop  ACC
        pop  PSW

        ENDM

;---------------------------------------------------------------------
; Funktion : Message- Scheduler fuer PC- Messages.
; Aufrufparameter : -
; Ruechgabeparameter : -
; Veraenderte Register : -
; Stackbedarf :
; Zeitbedarf :
;

MEM_SCHEDULER:
        PUSH PSW
        PUSH ACC
        CLR MSG
        MOV A,R0
        IFCALL  02h,GET_FROM_PC         ; TI-Datei von PC an Roboter
        IFCALL  03h,GET_FROM_PC         ; TI-Datei von PC an Fraese
        IFCALL  01h,GET_WORKFR_FROM_PC  ; Fraesdatei von PC
        POP ACC
        POP PSW
        RET

;---------------------------------------------------------------------
; Funktion : Message auf die Module verteilen
; Aufrufparameter : -
; Ruechgabeparameter : -
; Veraenderte Register : -
; Stackbedarf :
; Zeitbedarf :
;

Dispatch_Msg:
        PUSH PSW
        PUSH ACC
        MOV A,R0
        CJNE A,#10h,Dis_Msg0            ; Msg.-Nr. <=10h sind von PC
Dis_Msg0: JC Dis_Msg01                  ; und werden von MEM_SCHEDULER
        LJMP Dis_Msg02                  ; bearbeitet
Dis_Msg01:
        LCALL MEM_SCHEDULER
        LJMP Dis_Msg_Ret

Dis_Msg02:
        cjne A,#TeachRob,Dis_Msg10
        LJMP Dis_Msg11
Dis_Msg10: LJMP Dis_Msg2
Dis_Msg11:
        ifdef TeachRob_MsgCall_Tab
          Message_Handler TeachRob
        endif
        ljmp Dis_Msg_Ret

Dis_Msg2: cjne A,#TeachFrs,Dis_Msg20
        LJMP Dis_Msg21
Dis_Msg20: LJMP Dis_Msg3
Dis_Msg21:
        ifdef TeachFrs_MsgCall_Tab
          Message_Handler TeachFrs
        endif
        ljmp Dis_Msg_Ret

Dis_Msg3: cjne A,#Rob,Dis_Msg30
        LJMP Dis_Msg31
Dis_Msg30: LJMP Dis_Msg4
Dis_Msg31:
        ifdef Rob_MsgCall_Tab
          Message_Handler Rob
        endif
        ljmp Dis_Msg_Ret

Dis_Msg4: cjne A,#Frs,Dis_Msg40
        LJMP Dis_Msg41
Dis_Msg40: LJMP Dis_Msg5
Dis_Msg41:
        ifdef Frs_MsgCall_Tab
          Message_Handler Frs
        endif
        ljmp Dis_Msg_Ret

Dis_Msg5: cjne A,#MemFrs,Dis_Msg50
        LJMP Dis_Msg51
Dis_Msg50: LJMP Dis_Msg6
Dis_Msg51:
        ifdef MemFrs_MsgCall_Tab
          Message_Handler MemFrs
        endif
        ljmp Dis_Msg_Ret

Dis_Msg6: cjne A,#MemRob,Dis_Msg60
        LJMP Dis_Msg61
Dis_Msg60: LJMP Dis_Msg7
Dis_Msg61:
        ifdef MemRob_MsgCall_Tab
          Message_Handler MemRob
        endif
        ljmp Dis_Msg_Ret

Dis_Msg7:

Dis_Msg_Ret:
        POP ACC
        POP PSW
        RET

;---------------------------------------------------------------------
; Funktion : START-Routine
; Aufrufparameter : Wird durch die globale Message "START" ausgeloesst
; Ruechgabeparameter : -
; Veraenderte Register :
; Stackbedarf :
; Zeitbedarf :
;
GLOBAL_START:
        ;LCD 40H,"START-Routine                           "
        LCALL START_RUNNING
        RET

;---------------------------------------------------------------------
; Funktion : NOTAUS-Routine
; Aufrufparameter : Wird durch die globale Message "STOP" ausgeloesst
; Ruechgabeparameter : -
; Veraenderte Register :
; Stackbedarf :
; Zeitbedarf :
;
GLOBAL_NOTAUS:
        LCD 40H,"NOTAUS!!! Abbruch.                      "
        CLR RUNNINGBIT
        LCALL INIT_TEACH
        LCALL RESET_TEACH
        RET

;---------------------------------------------------------------------
; Funktion : RESET-Routine
; Aufrufparameter : Wird durch die globale Message "RESET" ausgeloesst
; Ruechgabeparameter : -
; Veraenderte Register :
; Stackbedarf :
; Zeitbedarf :
;
GLOBAL_RESET:
        LCD 40H,"Teachin- u. Runmanager initialisiert.   "
        LCALL INIT_TEACH
        LCALL INIT_RUN
        LCALL RESET_TEACH
        LCALL INIT_FRS
        CLR TESTBIT

        RET

;---------------------------------------------------------------------
; Funktion : PAUSE-Routine
; Aufrufparameter : Wird durch die globale Message "PAUSE" ausgeloesst
; Ruechgabeparameter : -
; Veraenderte Register :
; Stackbedarf :
; Zeitbedarf :
;
GLOBAL_PAUSE:
        JB RUNNINGBIT,GLOBAL_PAUSE_1
        LJMP GLOBAL_PAUSE_ENDE
GLOBAL_PAUSE_1:
        CPL PAUSE
        JNB PAUSE,GLOBAL_PAUSE_AUS
        LCD 40H,"Pausemodus. Weiter mit <PAUSE>.         "
        RET
GLOBAL_PAUSE_AUS:
        LCD 40H,"Pausemodus aufgehoben.                  "
        RET
GLOBAL_PAUSE_ENDE:
        RET

;---------------------------------------------------------------------
; Funktion : AUX1-Routine
; Aufrufparameter : Wird durch die globale Message "AUX1" ausgeloesst
; Ruechgabeparameter : -
; Veraenderte Register :
; Stackbedarf :
; Zeitbedarf :
;
GLOBAL_AUX1:
        LCD 40H,"AUX1-Routine                            "
        SETB SingleStep
        JNB Ready_Waiting,GLOBAL_AUX1_ENDE
        SETB Break
GLOBAL_AUX1_ENDE
        RET

;---------------------------------------------------------------------
; Funktion : AUX2-Routine
; Aufrufparameter : Wird durch die globale Message "AUX2" ausgeloesst
; Ruechgabeparameter : -
; Veraenderte Register :
; Stackbedarf :
; Zeitbedarf :
;
GLOBAL_AUX2:
        ;LCD 40H,"AUX2-Routine                            "
        LCD 40H,"Teachin- Datei wird gelaeden.           "
        LCALL LOAD_ROB
        LCALL LOAD_FRAES
        RET

;---------------------------------------------------------------------
; Funktion : Hauptprogramm fuer das Speichermodul
; Aufrufparameter : -
; Ruechgabeparameter : -
; Veraenderte Register :
; Stackbedarf :
; Zeitbedarf :
;

Main_Event_Loop:
        JNB Sp_MSG,No_Sp_Msg
        LCALL Do_Sp_Msg
        JB Sp_MSG,Main_Event_Loop
No_Sp_Msg:
        JNB MSG,No_Msg
        LCALL Do_Msg
        JB MSG,Main_Event_Loop
No_Msg:
        JNB RUNNINGBIT,No_Runnig
        LCALL Do_Runnig
No_Runnig:
        JB Sp_MSG,Main_Event_Loop
        JB MSG,Main_Event_Loop

        RET


Do_Msg: CLR MSG
        PUSH_ALL
        LCALL READ_MESSAGE
        LCALL Dispatch_Msg
        POP_ALL
        RET

Do_Sp_Msg:
        CLR Sp_MSG
        PUSH ACC
        MOV A,Sp_MSG_Buffer
SM_START: JNB START_BIT,SM_NOTAUS       ; Special- Message Fkt.
        LCALL GLOBAL_START              ; aufrufen
        POP ACC
        RET
SM_NOTAUS: JNB STOP_BIT,SM_RESET
        LCALL GLOBAL_NOTAUS
        POP ACC
        RET
SM_RESET: JNB RESET_BIT,SM_PAUSE
        LCALL GLOBAL_RESET
        POP ACC
        RET
SM_PAUSE: JNB PAUSE_BIT,SM_AUX1
        LCALL GLOBAL_PAUSE
        POP ACC
        RET
SM_AUX1: JNB AUX1_BIT,SM_AUX2
        LCALL GLOBAL_AUX1
        POP ACC
        RET
SM_AUX2: JNB AUX2_BIT,SM_ENDE
        LCALL GLOBAL_AUX2
        POP ACC
        RET
SM_ENDE: POP ACC
        RET

Do_Runnig:
        JB Drilling,Do_Drilling
        JB PAUSE,Do_Waiting
        JB Sync_Waiting,Do_Waiting
        JB Ready_Waiting,Do_Waiting
        LCALL RUN_MODUL
Do_Waiting:
        RET

Do_Drilling:
        JNB FrsWarning,No_FrsWarning            ; Queue- Warnung von Frs
        PUSH_ALL
        post_message2 #Frs,#GibReady,#MemFrs,#GetFrsReady,#0
        POP_ALL
        CLR FrsWarning
        SETB READY_WAITING
No_FrsWarning:
        RET

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

