diff options
Diffstat (limited to 'tests/t_mic51')
| -rw-r--r-- | tests/t_mic51/DEBUG.ASM | 532 | ||||
| -rw-r--r-- | tests/t_mic51/MAKRO1.ASM | 542 | ||||
| -rw-r--r-- | tests/t_mic51/MEM1.ASM | 727 | ||||
| -rw-r--r-- | tests/t_mic51/RUN1.ASM | 773 | ||||
| -rw-r--r-- | tests/t_mic51/TAST1.ASM | 250 | ||||
| -rw-r--r-- | tests/t_mic51/TEACH1.ASM | 504 | ||||
| -rw-r--r-- | tests/t_mic51/asflags | 1 | ||||
| -rw-r--r-- | tests/t_mic51/defKey.inc | 83 | ||||
| -rw-r--r-- | tests/t_mic51/defModul.inc | 18 | ||||
| -rw-r--r-- | tests/t_mic51/defMsg.inc | 141 | ||||
| -rw-r--r-- | tests/t_mic51/defParam.inc | 46 | ||||
| -rw-r--r-- | tests/t_mic51/defgequ.inc | 48 | ||||
| -rw-r--r-- | tests/t_mic51/defint.inc | 234 | ||||
| -rw-r--r-- | tests/t_mic51/defmacro.inc | 175 | ||||
| -rw-r--r-- | tests/t_mic51/net_lcd.inc | 33 | ||||
| -rw-r--r-- | tests/t_mic51/t_mic51.asm | 2197 | ||||
| -rw-r--r-- | tests/t_mic51/t_mic51.doc | 6 | ||||
| -rw-r--r-- | tests/t_mic51/t_mic51.inc | 165 | ||||
| -rwxr-xr-x | tests/t_mic51/t_mic51.ori | bin | 0 -> 17582 bytes | |||
| -rw-r--r-- | tests/t_mic51/t_mod1.asm | 487 | 
20 files changed, 6962 insertions, 0 deletions
diff --git a/tests/t_mic51/DEBUG.ASM b/tests/t_mic51/DEBUG.ASM new file mode 100644 index 0000000..7aff702 --- /dev/null +++ b/tests/t_mic51/DEBUG.ASM @@ -0,0 +1,532 @@ + +; Aufgabe Nr.: Speichermodul fuer uP- Praktikum II +; Autor: Joerg Vollandt  +; erstellt am : 30.06.1994 +; letzte Aenderung am : 01.07.1994 +; Bemerkung : Wird in das gegebene File "MAIN.ASM" includet. +; +; Dateiname : debug.asm +; + +;--------------------------------------------------------------------- +        SEGMENT CODE +;--------------------------------------------------------------------- +; Funktion : Dump ext. RAM. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +N_BYTES EQU     12 + + +DUMP:   PUSH PSW +        PUSH ACC +        PUSH B +        PUSH_DPTR +DUMP_ADR: LCALL LCD_CLEAR +        LCD 0h,"Start=" +        LCALL IN_DPTR +DUMP_LINE: LCALL LCD_CLEAR                      ; 1. Zeile +        LCALL DPTR_LCD +        MOV A,#':' +        LCALL LCD_WRITE_CHAR +        MOV B,#N_BYTES +DUMP_BYTE: MOVX A,@DPTR +        LCALL A_LCD +        INC DPTR +        MOV A,#' ' +        LCALL LCD_WRITE_CHAR +        DJNZ B,DUMP_BYTE + +        MOV A,#40h                              ; 2. Zeile +        LCALL LCD_SET_DD_RAM_ADDRESS +        LCALL DPTR_LCD +        MOV A,#':' +        LCALL LCD_WRITE_CHAR +        MOV B,#(N_BYTES-1) +DUMP_BYTE2: MOVX A,@DPTR +        LCALL A_LCD +        INC DPTR +        MOV A,#' ' +        LCALL LCD_WRITE_CHAR +        DJNZ B,DUMP_BYTE2 +        MOVX A,@DPTR +        LCALL A_LCD +        INC DPTR +         +        LCALL CHAR_ACC +        LCALL UPCASE +        IFMAKE 'D',LJMP DUMP_ADR +        IFMAKE 'X',SUBB_DPTR N_BYTES +        IFMAKE 'E',SUBB_DPTR (3*N_BYTES) +        IFMAKE 'Q',LJMP DUMP_ENDE + +        LJMP DUMP_LINE +DUMP_ENDE: +        POP_DPTR +        POP B +        POP ACC +        POP PSW +        RET + +;--------------------------------------------------------------------- +; Funktion : Ausgabe der Start- und Endadr. des definierten ext. Speichers. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +ADRESSEN: +        PUSH ACC +        PUSH_DPTR +        LCALL LCD_CLEAR +        LCD 0h,"Startadr.=" +        MOV DPTR,#MEM_ANF +        LCALL DPTR_LCD +        LCD 0Eh,";Endadr.=" +        MOV DPTR,#MEM_ENDE +        LCALL DPTR_LCD +        LCD 1bh,";Groesse=" +        MOV DPTR,#(MEM_ENDE-MEM_ANF) +        LCALL DPTR_LCD +        LCD 40h,"NEXT_FREE=" +        GET_16 NEXT_FREE +        LCALL DPTR_LCD +        LCD 4Eh,";RD_P=" +        GET_16 RD_POINTER +        LCALL DPTR_LCD +        LCALL CHECK_SUM +        LCD 5bh,";CHECK=" +        MOV DPL,CHECKSUMME +        MOV DPH,CHECKSUMME+1 +        LCALL DPTR_LCD +        LCALL WAIT_KEY +        POP_DPTR +        POP ACC +        RET + +;--------------------------------------------------------------------- +; Funktion : Ausgabe der Variablen fuer die Synchronisation +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +DEBUG_SYNC: +        PUSH ACC +        PUSH_DPTR +        LCALL LCD_CLEAR +        LCD 0h,"R_Sync-C.=" +        MOV a,R_Sync_Counter +        LCALL A_LCD +        jb runningbit,DESYNC1 +        LCD 0ch,"not " +DESYNC1: LCD 10h,"running" +        jb Sync_Waiting,DESYNC2 +        LCD 18h,"not " +DESYNC2: LCD 1ch,"Sync.waiting" +        LCD 0h,"T_Sync-C.=" +        MOV a,T_Sync_Counter +        LCALL A_LCD +        jb Ready_Waiting,DESYNC3 +        LCD 4ch,"not " +DESYNC3: LCD 50h,"Ready waiting" +        POP_DPTR +        POP ACC +        LCALL WAIT_KEY +        RET + +;--------------------------------------------------------------------- +; Funktion : Speicher fuellen. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +FUELLEN: +        PUSH PSW +        PUSH ACC +        PUSH B +        PUSH_DPTR +        LCALL LCD_CLEAR +        LCD 0h,"Fuellwert =" +        LCALL IN_ACC +        MOV B,A +        MOV DPTR,#MEM_ANF +FUELLEN1: MOV A,B +        MOVX @DPTR,A +        INC DPTR +        MOV A,DPH +        CJNE A,#(MEM_ENDE/256),FUELLEN1 +        MOV A,DPL +        CJNE A,#(MEM_ENDE#256),FUELLEN1 +        LCD 40h,"Speicher gefuellt." +        LCALL WAIT_KEY +        POP_DPTR +        POP B +        POP ACC +        POP PSW +        RET + +;--------------------------------------------------------------------- +; Funktion : Schreiben in Speicher +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +SCHREIBEN: +        PUSH PSW +        PUSH ACC +        PUSH B +        PUSH_DPTR +        LCALL LCD_CLEAR +        LCD 0h,"Schreibadr.=" +        LCALL IN_DPTR +        LCD 12h,"Schreibwert=" +        LCALL IN_ACC +        LCALL ACC_WR_MEM +        LCD 40h,"Wert geschrieben." +        LCALL WAIT_KEY +        POP_DPTR +        POP B +        POP ACC +        POP PSW +        RET + +;--------------------------------------------------------------------- +; Funktion : Lesen aus Speicher +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +LESEN: +        PUSH PSW +        PUSH ACC +        PUSH B +        PUSH_DPTR +        LCALL LCD_CLEAR +        LCD 0h,"Leseadr.=" +        LCALL IN_DPTR +        LCALL ACC_RD_MEM +        LCD 40h,"Wert    =" +        LCALL A_LCD +        LCALL WAIT_KEY +        POP_DPTR +        POP B +        POP ACC +        POP PSW +        RET + +;--------------------------------------------------------------------- +; Funktion : Speicher auf PC schreiben +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +WR_PC: +        LCALL LCD_CLEAR +        LCD 0h,"Speicher auf PC" +        LCALL WR_MEM_PC +        LCD 40h,"o.k." +        LCALL WAIT_KEY +        RET + +;--------------------------------------------------------------------- +; Funktion : Speicher initialisieren +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +SPEICHER_INIT: +        LCALL LCD_CLEAR +        LCD 0h,"Speicher initialisieren" +        LCALL INIT_MEM +        LCD 40h,"o.k." +        LCALL WAIT_KEY +        RET + +;--------------------------------------------------------------------- +; Funktion : Speicher zum lesen zuruecksetzen +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +RESET: +        LCALL LCD_CLEAR +        LCD 0h,"Speicher reset" +        LCALL RESET_MEM +        LCD 40h,"o.k." +        LCALL WAIT_KEY +        RET + +;--------------------------------------------------------------------- +; Funktion : Element aus Speicher lesen. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +GET: +        PUSH_DPTR +        LCALL LCD_CLEAR +        LCD 0h,"Element lesen von:" +        GET_16 RD_POINTER +        LCALL DPTR_LCD +        LCALL GET_ELEMENT_MEM +        JC GET_ERROR +        LCD 40h,"o.k. ACC=" +        LCALL A_LCD +        LCALL WAIT_KEY +        POP_DPTR +        RET + +GET_ERROR: +        LCD 40h,"Fehler." +        LCALL WAIT_KEY +        POP_DPTR +        RET + +;--------------------------------------------------------------------- +; Funktion : Element in den Speicher schreiben +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +PUT: +        PUSH_DPTR +        LCALL LCD_CLEAR +        LCD 0h,"Element schreiben ab:" +        GET_16 NEXT_FREE +        LCALL DPTR_LCD +        LCD 20h,"ACC=" +        LCALL IN_ACC + +        LCALL PUT_ELEMENT_MEM +        JC PUT_ERROR +        LCD 40h,"o.k." +        LCALL WAIT_KEY +        POP_DPTR +        RET + +PUT_ERROR: +        LCD 40h,"Fehler." +        LCALL WAIT_KEY +        POP_DPTR +        RET + +;--------------------------------------------------------------------- +; Funktion : Speicher von PC lesen +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +RD_PC: +        PUSH_DPTR +        LCALL LCD_CLEAR +        LCD 0h,"Speicher von PC" +        CLR READY +        LCALL RD_MEM_PC +RD_PC_LOOP: +        JNB MSG,$ +        LCALL MEM_SCHEDULER +        JNB READY,RD_PC_LOOP +        JB CRC,RD_PC_ERROR +        LCD 10h,"o.k." +        LCALL WAIT_KEY +        POP_DPTR +        RET + +RD_PC_ERROR: +        LCD 10h,"CRC- Fehler beim laden." +        LCALL WAIT_KEY +        POP_DPTR +        RET + +;--------------------------------------------------------------------- +; Funktion : Zeiger setzen +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +SET_NEXT_FREE: +        PUSH_DPTR +        LCALL LCD_CLEAR +        LCD 0h,"next_free=" +        lcall IN_DPTR +        SET_16 NEXT_FREE +        LCALL WAIT_KEY +        POP_DPTR +        RET + +SET_RD_POINTER: +        PUSH_DPTR +        LCALL LCD_CLEAR +        LCD 0h,"RD_POINTER=" +        lcall IN_DPTR +        SET_16 RD_POINTER +        LCALL WAIT_KEY +        POP_DPTR +        RET + +;--------------------------------------------------------------------- +; Funktion : Msg_Handler_Test +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; +; **************************************************************************** +; R0    Empf„nger (logische Adresse) +; R1    Message +; R2 - R7 Parameter +; **************************************************************************** + +Msg_Handler_Test: +        PUSH ACC +        PUSH AR0 +        PUSH AR1 +        LCALL LCD_CLEAR +        LCD 0h,"Msg_Handler_Test" +        LCD 16h,"R0=" +        LCALL IN_ACC +        MOV R0,A +        LCD 20h,"R1=" +        LCALL IN_ACC +        MOV R1,A +        LCALL Dispatch_Msg +        POP AR1 +        POP AR0 +        POP ACC +        ret + +;--------------------------------------------------------------------- +; Funktion : Testbit toggeln +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +T_TEST: +        LCALL LCD_CLEAR +        LCD 0h,"TEST" +        LCALL WAIT_KEY +        CPL TESTBIT +        ret + +;--------------------------------------------------------------------- +; Funktion : Test RUN- Manager +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +TEST_RUN: +        LCD 0h,"TEST RUN_ Manager" +        LCALL WAIT_KEY +        LCALL START_RUNNING +        LCALL LCD_CLEAR +        ret + +;--------------------------------------------------------------------- +; Funktion : Debuger fuer das Speichermodul +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +DEBUG_MEM: +        mov a,#1 +        lcall lcd_curser_onoff + +DEBUG_START: +        LCALL LCD_CLEAR +        LCD 0,"DEBUG SPEICHERMODUL " +DEBUG_LOOP: +        JNB KB_CHAR_READY,DEBUG3 +        LJMP DEBUG1 +DEBUG3: +        LJMP DEBUG_LOOP + +DEBUG1: CLR KB_CHAR_READY +        MOV A,KB_CHAR_BUFFER +        LCALL LCD_WRITE_CHAR +        LCALL UPCASE +        IFCALL 'A',ADRESSEN +        IFCALL 'B',LOAD_ROB +        IFCALL 'C',LOAD_FRAES +        IFCALL 'D',DUMP +        IFCALL 'E',Msg_Handler_Test +        IFCALL 'F',FUELLEN +        IFCALL 'G',GET +        IFCALL 'H',SAVE_ROB +        IFCALL 'I',SAVE_FRAES +        IFCALL 'J',SPEICHER_INIT +        IFCALL 'K',T_TEST +        IFCALL 'L',LESEN +        IFCALL 'M',STORE_ROB +        IFCALL 'O',RESET +        IFCALL 'P',PUT +        IFMAKE 'Q',LJMP DEBUG_ENDE +        IFCALL 'R',RD_PC +        IFCALL 'S',SCHREIBEN +        IFCALL 'T',TEST_RUN +        IFCALL 'U',SET_RD_POINTER +        IFCALL 'W',WR_PC +        IFCALL 'X',DEBUG_SYNC +        IFCALL 'Y',STORE_SYNC +        IFCALL 'Z',SET_NEXT_FREE + +        ljmp DEBUG_START + +DEBUG_ENDE: + +        LCALL LCD_CLEAR +        ret + +;===================================================================== +;        END +;--------------------------------------------------------------------- + + diff --git a/tests/t_mic51/MAKRO1.ASM b/tests/t_mic51/MAKRO1.ASM new file mode 100644 index 0000000..4d93adc --- /dev/null +++ b/tests/t_mic51/MAKRO1.ASM @@ -0,0 +1,542 @@ + +; Aufgabe Nr.: Speichermodul fuer uP- Praktikum II +; Autor: Joerg Vollandt  +; erstellt am : 21.05.1994 +; letzte Aenderung am : 01.08.1994 +; Bemerkung : Makros +; +; Dateiname : makro1.asm +; + +;---------------------------------------------------------------------   +; Funktion : Direkter Bitmove- Befehl +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : PSW +; Stackbedarf : +; Zeitbedarf : +; + +MOVB    MACRO   ZIEL,QUELLE + +        MOV C,QUELLE +        MOV ZIEL,C + +        ENDM + +;--------------------------------------------------------------------- +; Funktion : String auf LCD ausgaben. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +LCD     MACRO   POS,STRG + +        PUSH ACC +        PUSH DPH +        PUSH DPL +        MOV A,#POS +        LCALL LCD_SET_DD_RAM_ADDRESS +        MOV DPTR,#STR_ADR +        LCALL LCD_WRITE_STRING +        LJMP WEITER + +STR_ADR   DB    STRG,0 + +WEITER: POP DPL +        POP DPH +        POP ACC + +        ENDM + +;--------------------------------------------------------------------- +; Funktion : A, B, PSW, DPTR, R0 - R7 auf Stack retten +; Aufrufparameter : PUSH_ALL +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : 2 +; Zeitbedarf : +; + +PUSH_ALL        MACRO + +        PUSH ACC +        PUSH B +        PUSH PSW +        PUSH_DPTR +        PUSH AR0 +        PUSH AR1 +        PUSH AR2 +        PUSH AR3 +        PUSH AR4 +        PUSH AR5 +        PUSH AR6 +        PUSH AR7 + +        ENDM + +;--------------------------------------------------------------------- +; Funktion : A, B, PSW, DPTR, R0 - R7 von Stack holen +; Aufrufparameter : POP_ALL +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : 2 +; Zeitbedarf : +; + +POP_ALL        MACRO + +        POP AR7 +        POP AR6 +        POP AR5 +        POP AR4 +        POP AR3 +        POP AR2 +        POP AR1 +        POP AR0 +        POP_DPTR +        POP PSW +        POP B +        POP ACC + +        ENDM + +;--------------------------------------------------------------------- +; Funktion : DPTR pushen und popen. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +PUSH_DPTR       MACRO + +        PUSH DPL +        PUSH DPH + +        ENDM + +POP_DPTR        MACRO + +        POP DPH +        POP DPL + +        ENDM + +;--------------------------------------------------------------------- +; Funktion : DPTR decreminieren. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; +        ifdef joerg +DEC_DPTR       MACRO + +        INC DPL +        DJNZ DPL,DEC_DPTR1 +        DEC DPH +DEC_DPTR1: +        DEC DPL + +        ENDM + +        endif + +;--------------------------------------------------------------------- +; Funktion : Addieren und subtraieren mit DPTR. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +ADD_DPTR       MACRO    WERT + +        PUSH PSW +        PUSH ACC +        MOV A,#(WERT#256) +        ADD A,DPL +        MOV DPL,A +        MOV A,#(WERT/256) +        ADDC A,DPH +        MOV DPH,A +        POP ACC +        POP PSW + +        ENDM + + +SUBB_DPTR       MACRO    WERT + +        PUSH PSW +        PUSH ACC +        MOV A,DPL +        CLR C +        SUBB A,#(WERT#256) +        MOV DPL,A +        MOV A,DPH +        SUBB A,#(WERT/256) +        MOV DPH,A +        POP ACC +        POP PSW + +        ENDM + +;--------------------------------------------------------------------- +; Funktion : Rechnen mit 16- Bit- Werten im ext. RAM (L,H). +; Aufrufparameter : DPTR = Wert +; Ruechgabeparameter : DPTR = Wert +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +SET_16  MACRO   NAME + +        PUSH ACC +        PUSH_DPTR +        PUSH DPH +        PUSH DPL +        MOV DPTR,#NAME +        POP ACC +        MOVX @DPTR,A +        INC DPTR +        POP ACC +        MOVX @DPTR,A +        POP_DPTR +        POP ACC + +        ENDM + +GET_16  MACRO   NAME + +        PUSH ACC +        MOV DPTR,#NAME +        MOVX A,@DPTR +        PUSH ACC +        INC DPTR +        MOVX A,@DPTR +        MOV DPH,A +        POP DPL +        POP ACC + +        ENDM + +;--------------------------------------------------------------------- +; Funktion : Scheduler. +; Aufrufparameter : ACC = Zeichen +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +IFCALL  MACRO   CONST,ROUTINE + +        CJNE A,#CONST,IFCALL1 +        LCALL ROUTINE +IFCALL1: + +        ENDM + +IFMAKE  MACRO   CONST,CODE + +        CJNE A,#CONST,IFMAKE1 +        CODE +IFMAKE1: + +        ENDM + +;--------------------------------------------------------------------- +; Funktion : Warten bis Netzwerk freiund Message senden. +; Aufrufparameter : ACC = Zeichen +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +SEND_NET  MACRO + +        push acc +SEND_NET1: LCALL READ_STATUS +        JB ACC.1,SEND_NET1 +        pop acc +        LCALL SEND_MESSAGE + +        ENDM + +;--------------------------------------------------------------------- +; Funktion : Message senden. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +post_Message1 macro Modul,Msg + +;        if MY_SLAVE_ADR = uC_Modul +;          call ADR_Msg                   ; interne Message +;        elseif +        PUSH ACC +WAIT_NET: LCALL READ_STATUS +        JB ACC.1,WAIT_NET +        PUSH DPL +        PUSH DPH +        MOV DPTR,#ModulNetAdr_Tab +        MOV A,#Modul +        MOVC A,@A+DPTR +        POP DPH +        POP DPL +        MOV R0,#Modul +        MOV R1,#Msg +        LCALL SEND_MESSAGE              ; Message ins Netz +        POP ACC + +;        endif +        endm + +;--------------------------------------------------------------------- +; Funktion : Message senden, alle Parameter im Mkroaufruf, B automatisch. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : R0- R7 +; Stackbedarf : +; Zeitbedarf : +; + +post_Message2 macro Modul,Msg,PARA1,PARA2,PARA3,PARA4,PARA5,PARA6 + +Parameteranzahl SET     2                       ; min. Modulnr. und Msg.-Nr. + +        PUSH ACC +        PUSH B + +        IF "PARA1"<>"" +        MOV R2,PARA1 +Parameteranzahl SET     Parameteranzahl+1 +        ENDIF +        IF "PARA2"<>"" +        MOV R3,PARA2 +Parameteranzahl SET     Parameteranzahl+1 +        ENDIF +        IF "PARA3"<>"" +        MOV R4,PARA3 +Parameteranzahl SET     Parameteranzahl+1 +        ENDIF +        IF "PARA4"<>"" +        MOV R5,PARA4 +Parameteranzahl SET     Parameteranzahl+1 +        ENDIF +        IF "PARA5"<>"" +        MOV R6,PARA5 +Parameteranzahl SET     Parameteranzahl+1 +        ENDIF +        IF "PARA6"<>"" +        MOV R7,PARA6 +Parameteranzahl SET     Parameteranzahl+1 +        ENDIF + +        PUSH DPL +        PUSH DPH +        MOV DPTR,#ModulNetAdr_Tab +        MOV A,Modul +        MOVC A,@A+DPTR +        POP DPH +        POP DPL +        MOV R0,Modul +        MOV R1,Msg +        MOV B,#Parameteranzahl +        PUSH ACC +WAIT_NET: LCALL READ_STATUS +        JB ACC.1,WAIT_NET +        POP ACC +        LCALL SEND_MESSAGE              ; Message ins Netz + +        POP B +        POP ACC + +        endm +                                         +;--------------------------------------------------------------------- +; Funktion : Message ausgeben +; Aufrufparameter : wie definiert +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +TEST_MESSAGE_HEX    MACRO   POS + +        PUSH ACC +        MOV A,#POS +        LCALL LCD_SET_DD_RAM_ADDRESS +        POP ACC +        PUSH ACC +        LCALL A_LCD +        MOV A,#' ' +        LCALL LCD_WRITE_CHAR +        MOV A,B +        LCALL A_LCD +        MOV A,#' ' +        LCALL LCD_WRITE_CHAR +        MOV A,R0 +        LCALL A_LCD +        MOV A,#' ' +        LCALL LCD_WRITE_CHAR +        MOV A,R1 +        LCALL A_LCD +        MOV A,#' ' +        LCALL LCD_WRITE_CHAR +        MOV A,R2 +        LCALL A_LCD +        MOV A,#' ' +        LCALL LCD_WRITE_CHAR +        MOV A,R3 +        LCALL A_LCD +        MOV A,#' ' +        LCALL LCD_WRITE_CHAR +        MOV A,R4 +        LCALL A_LCD +        MOV A,#' ' +        LCALL LCD_WRITE_CHAR +        MOV A,R5 +        LCALL A_LCD +        MOV A,#' ' +        LCALL LCD_WRITE_CHAR +        MOV A,R6 +        LCALL A_LCD +        MOV A,#' ' +        LCALL LCD_WRITE_CHAR +        MOV A,R7 +        LCALL A_LCD +        POP ACC + +        ENDM + +;--------------------------------------------------------------------- +; Funktion : Fehlerbehandlung +; Aufrufparameter : Fehlernr. +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +ERROR   MACRO   NR + + +        ENDM + +;--------------------------------------------------------------------- + + + + + + + + + + +;--------------------------------------------------------------------- +TEST_MESSAGE    MACRO   POS,SCHALTER + +        IF SCHALTER<=TEST_LEVEL +          PUSH ACC +          MOV A,#POS +          LCALL LCD_SET_DD_RAM_ADDRESS +          MOV A,R0 +          LCALL LCD_WRITE_CHAR +          MOV A,R1 +          LCALL LCD_WRITE_CHAR +          MOV A,R2 +          LCALL LCD_WRITE_CHAR +          MOV A,R3 +          LCALL LCD_WRITE_CHAR +          MOV A,R4 +          LCALL LCD_WRITE_CHAR +          MOV A,R5 +          LCALL LCD_WRITE_CHAR +          MOV A,R6 +          LCALL LCD_WRITE_CHAR +          MOV A,R7 +          LCALL LCD_WRITE_CHAR +          POP ACC +        ENDIF +        ENDM +;--------------------------------------------------------------------- +MAKE_MESSAGE    MACRO   ADR,STRG + +        IF 0=0 +          MOV A,#0 +          MOV DPTR,#STR_ADR +          MOVC A,@A+DPTR +          MOV R0,A +          MOV A,#0 +          INC DPTR +          MOVC A,@A+DPTR +          MOV R1,A +          MOV A,#0 +          INC DPTR +          MOVC A,@A+DPTR +          MOV R2,A +          MOV A,#0 +          INC DPTR +          MOVC A,@A+DPTR +          MOV R3,A +          MOV A,#0 +          INC DPTR +          MOVC A,@A+DPTR +          MOV R4,A +          MOV A,#0 +          INC DPTR +          MOVC A,@A+DPTR +          MOV R5,A +          MOV A,#0 +          INC DPTR +          MOVC A,@A+DPTR +          MOV R6,A +          MOV A,#0 +          INC DPTR +          MOVC A,@A+DPTR +          MOV R7,A +          MOV A,#ADR +          MOV B,#8 +          LJMP WEITER + +STR_ADR   DB    STRG + +WEITER:   NOP +        ENDIF +        ENDM + +;--------------------------------------------------------------------- +MAKE_MESSAGE_HEX    MACRO   ADR,L,A0,A1,A2,A3,A4,A5,A6,A7 + +        IF 0=0 +          MOV R0,#A0 +          MOV R1,#A1 +          MOV R2,#A2 +          MOV R3,#A3 +          MOV R4,#A4 +          MOV R5,#A5 +          MOV R6,#A6 +          MOV R7,#A7 +          MOV A,#ADR +          MOV B,#L +        ENDIF +        ENDM + +;--------------------------------------------------------------------- + diff --git a/tests/t_mic51/MEM1.ASM b/tests/t_mic51/MEM1.ASM new file mode 100644 index 0000000..05fb409 --- /dev/null +++ b/tests/t_mic51/MEM1.ASM @@ -0,0 +1,727 @@ + +; Aufgabe Nr.: Speichermodul fuer uP- Praktikum II +; Autor: Joerg Vollandt  +; erstellt am : 21.05.1994 +; letzte Aenderung am : 02.08.1994 +; Bemerkung : Routinen fuer die Speicherverwaltung +; +; Dateiname : mem1.asm +; + +;===================================================================== +; Definitionen der Funktionen des Seichermoduls + +;INIT_MEM        Initialisieren des Speichermoduls +;DEINIT_MEM      Deinitialisieren des Speichermoduls +;CLEAR_MEM       Speicher loeschen +;RESET_MEM       Speicher zum lesen zuruecksetzen +;PUT_ELEMENT_MEM Element anf naechste freie Position schreiben +;GET_ELEMENT_MEM Element von akt. Position lesen +;WR_MEM_PC       Speicher auf dem PC speichern. +;RD_MEM_PC       Speicher vom PC laden. + +;------------------------------------------------------------------------------ + +;Messagedefinitionen + +;1.Dateityp (Bit 0 und Bit 1) +Msg_PC_To_Net           equ     00b             ;direkte Eingabe von Hex-Messages fr das Netz +Msg_Frs_Datei           equ     01b             ;Fr„stischdatei +Msg_Rob_Teach_Datei     equ     10b             ;Roboter-Teach-In-Datei +Msg_Frs_Teach_Datei     equ     11b             ;Fr„stisch-Teach-In-Datei + +;2.Aktion (Bit 2 und Bit 3) +Msg_PC_Get              equ     0000b           ;Rekordanfrage an PC +Msg_PC_Put              equ     0100b           ;Rekordspeichern Slave=>PC, Rekordausgabe PC=>Slave +Msg_PC_Reset            equ     1000b           ;PC Datei ”ffnen zum Lesen +Msg_PC_Rewrite          equ     1100b           ;PC Datei ”ffnen zum Schreiben + +;3.Slaveadresse Slave=>PC ; Msg_From_PC PC=>Slave +Msg_From_PC             equ     00000000b       ;Antwort auf Anfrage + +EOF_Record              equ     0ffffh          ; +PC_Slave_Adr            equ     0eh             ; + +;------------------------------------------------------------------------------ +; Speicherdefinitionen + + +        SEGMENT DATA + +CHECKSUMME      DW      ? + + +        SEGMENT XDATA + +POINTER         DW      ?               ; fuer Test +NEXT_FREE       DW      ? +RD_POINTER      DW      ? +BLOCKNR         DW      ? + +MEM_ANF         DB      1000 DUP (?)      ; Speichergroesse in Bytes +MEM_ENDE + +;---------------------------------------------------------------------   +        SEGMENT CODE +;--------------------------------------------------------------------- +; Funktion : Initialisieren des Speichermoduls +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +INIT_MEM: +        PUSH PSW +        PUSH_DPTR +        MOV DPTR,#MEM_ANF +        SET_16 NEXT_FREE +        SET_16 RD_POINTER +        MOV CHECKSUMME,#0 +        MOV CHECKSUMME+1,#0 +        CLR READY +        CLR CRC + +        POP_DPTR +        POP PSW +        RET + +;--------------------------------------------------------------------- +; Funktion : Deinitialisieren des Speichermoduls +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +DEINIT_MEM: + +        RET + +;--------------------------------------------------------------------- +; Funktion : Speicher loeschen +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +CLEAR_MEM: +        PUSH PSW +        PUSH_DPTR +        MOV DPTR,#MEM_ANF +        SET_16 NEXT_FREE +        SET_16 RD_POINTER +        MOV CHECKSUMME,#0 +        MOV CHECKSUMME+1,#0 +        CLR READY +        CLR CRC + +        POP_DPTR +        POP PSW +        RET + +;--------------------------------------------------------------------- +; Funktion : Speicher zum lesen zuruecksetzen +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +RESET_MEM: +        PUSH_DPTR +        MOV DPTR,#MEM_ANF +        SET_16 RD_POINTER + +        POP_DPTR +        RET + +;--------------------------------------------------------------------- +; Funktion : Speicher von MEM_ANF bis NEXT_FREE auf dem PC speichern. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +WR_MEM_PC: +        PUSH_ALL +        ; MOV A,#MSG_PC_REWRITE+MY_SLAVE_ADR1*16 +        MOV A,MY_SLAVE_ADR +        SWAP A                             ; *16 +        ADD A,#MSG_PC_REWRITE +        MOVB ACC.0,P3.5                    ; Datei fuer Roboter oder Fraese +        SETB ACC.1 +        MOV R0,A +        MOV A,#PC_Slave_Adr                       ; Datei oeffnen +        MOV B,#8 +        SEND_NET + +        ; MOV A,#MSG_PC_PUT+MY_SLAVE_ADR1*16 +        MOV A,MY_SLAVE_ADR +        SWAP A                             ; *16 +        ADD A,#MSG_PC_PUT +        MOVB ACC.0,P3.5                    ; Datei fuer Roboter oder Fraese +        SETB ACC.1 +        MOV R0,A +        MOV A,#PC_Slave_Adr                       ; Header zusammenstellen +        MOV B,#8 +        MOV DPTR,#0 +        SET_16 BLOCKNR                  ; Blocknr.=0 setzen +        MOV R1,DPL                      ; Blocknr. +        MOV R2,DPH +        GET_16 NEXT_FREE +        SUBB_DPTR MEM_ANF +        MOV R3,DPL                      ; Anzahl Bytes +        MOV R4,DPH +        LCALL CHECK_SUM +        MOV R5,CHECKSUMME               ; Pruefsumme +        MOV R6,CHECKSUMME+1 +        SEND_NET                        ; Header senden + +        MOV DPTR,#MEM_ANF +        SET_16 POINTER                  ; Zeiger auf MEM_ANF setzen + +WR_MEM_MSG: +        LCALL CHECK_RD_POINTER          ; Pointer in DPTR!!! +        JNC WR_MEM_MSG1 +        LJMP WR_MEM_CLOSE               ; keine Bytes mehr -> close datei +WR_MEM_MSG1: +        LCALL ACC_RD_MEM                ; Byte aus MEM lesen +        MOV R3,A                        ; Message aufbauen +        LCALL CHECK_RD_POINTER          ; Pointer in DPTR!!! +        JNC WR_MEM_MSG2 +        LJMP WR_MEM_REST                ; keine Bytes mehr -> Rest schreiben +WR_MEM_MSG2: +        LCALL ACC_RD_MEM                ; Byte aus MEM lesen +        MOV R4,A                        ; Message aufbauen +        LCALL CHECK_RD_POINTER          ; Pointer in DPTR!!! +        JNC WR_MEM_MSG3 +        LJMP WR_MEM_REST                ; keine Bytes mehr -> Rest schreiben +WR_MEM_MSG3: +        LCALL ACC_RD_MEM                ; Byte aus MEM lesen +        MOV R5,A                        ; Message aufbauen +        LCALL CHECK_RD_POINTER          ; Pointer in DPTR!!! +        JNC WR_MEM_MSG4 +        LJMP WR_MEM_REST                ; keine Bytes mehr -> Rest schreiben +WR_MEM_MSG4: +        LCALL ACC_RD_MEM                ; Byte aus MEM lesen +        MOV R6,A                        ; Message aufbauen +        LCALL CHECK_RD_POINTER          ; Pointer in DPTR!!! +        JNC WR_MEM_MSG5 +        LJMP WR_MEM_REST                ; keine Bytes mehr -> Rest schreiben +WR_MEM_MSG5: +        LCALL ACC_RD_MEM                ; Byte aus MEM lesen +        MOV R7,A                        ; Message aufbauen +        PUSH_DPTR +        GET_16 BLOCKNR +        INC DPTR +        SET_16 BLOCKNR                  ; Blocknr.=+1 setzen +        MOV R1,DPL                      ; Blocknr. +        MOV R2,DPH +        POP_DPTR +        ; MOV A,#MSG_PC_PUT+MY_SLAVE_ADR1*16 +        MOV A,MY_SLAVE_ADR +        SWAP A                             ; *16 +        ADD A,#MSG_PC_PUT +        MOVB ACC.0,P3.5                    ; Datei fuer Roboter oder Fraese +        SETB ACC.1 +        MOV R0,A +        MOV A,#PC_Slave_Adr +        MOV B,#8 +        SEND_NET                        ; Message senden +        LJMP WR_MEM_MSG                 ; naechste Message + +WR_MEM_REST: +        PUSH_DPTR                       ; nicht volle MSG schreiben +        GET_16 BLOCKNR +        INC DPTR +        SET_16 BLOCKNR                  ; Blocknr.=+1 setzen +        MOV R1,DPL                      ; Blocknr. +        MOV R2,DPH +        POP_DPTR +        ; MOV A,#MSG_PC_PUT+MY_SLAVE_ADR1*16 +        MOV A,MY_SLAVE_ADR +        SWAP A                             ; *16 +        ADD A,#MSG_PC_PUT +        MOVB ACC.0,P3.5                    ; Datei fuer Roboter oder Fraese +        SETB ACC.1 +        MOV R0,A +        MOV A,#PC_Slave_Adr +        MOV B,#8 +        SEND_NET                                ; Message senden + +WR_MEM_CLOSE: +        ; MOV A,#MSG_PC_PUT+MY_SLAVE_ADR1*16 +        MOV A,MY_SLAVE_ADR +        SWAP A                             ; *16 +        ADD A,#MSG_PC_PUT +        MOVB ACC.0,P3.5                    ; Datei fuer Roboter oder Fraese +        SETB ACC.1 +        MOV R0,A +        MOV         A,#PC_Slave_Adr            ; Datei schlieáen +        MOV         B,#8 +        MOV         R1,#(EOF_RECORD#256) +        MOV         R2,#(EOF_RECORD/256) +        SEND_NET +        POP_ALL +        RET + +;--------------------------------------------------------------------- +; Funktion : Speicher vom PC laden. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +RD_MEM_PC: +        PUSH_ALL +        ; MOV A,#MSG_PC_RESET+MY_SLAVE_ADR1*16 +        MOV A,MY_SLAVE_ADR +        SWAP A                             ; *16 +        ADD A,#MSG_PC_RESET +        MOVB ACC.0,P3.5                    ; Datei fuer Roboter oder Fraese +        SETB ACC.1 +        MOV R0,A +        MOV A,#PC_Slave_Adr                       ; Datei oeffnen +        MOV B,#8 +        SEND_NET +        ; MOV A,#MSG_PC_GET+MY_SLAVE_ADR1*16 +        MOV A,MY_SLAVE_ADR +        SWAP A                             ; *16 +        ADD A,#MSG_PC_GET +        MOVB ACC.0,P3.5                    ; Datei fuer Roboter oder Fraese +        SETB ACC.1 +        MOV R0,A +        MOV A,#PC_Slave_Adr                       ; Header laden +        MOV B,#8 +        MOV DPTR,#0 +        SET_16 BLOCKNR                          ; Blocknr.=0 setzen +        MOV R1,DPL                              ; Blocknr. +        MOV R2,DPH +        SEND_NET                                ; Header anfordern +        POP_ALL +        RET + + +GET_FROM_PC: +        PUSH_ALL +        CJNE R1,#0,GET_NO_HEADER1       ; wenn Blocknr.=0, dann +        CJNE R2,#0,GET_NO_HEADER1       ; Header +        LJMP GET_HEADER +GET_NO_HEADER1: +        LJMP GET_NO_HEADER +GET_HEADER: +        CJNE R3,#0,GET_NOT_EMPTY_JMP    ; testen ob 0 Bytes in Datei +        CJNE R4,#0,GET_NOT_EMPTY_JMP +        LJMP GET_EMPTY +GET_NOT_EMPTY_JMP: +        LJMP GET_NOT_EMPTY + +GET_EMPTY:                              ; Datei leer +        LCALL INIT_MEM                  ; Speicherreset +        ; MOV A,#MSG_PC_PUT+MY_SLAVE_ADR1*16 +        MOV A,MY_SLAVE_ADR +        SWAP A                          ; *16 +        ADD A,#MSG_PC_PUT +        MOVB ACC.0,P3.5                 ; Datei fuer Roboter oder Fraese +        SETB ACC.1 +        MOV R0,A +        MOV         A,#PC_Slave_Adr     ; und Datei schlieáen +        MOV         B,#8 +        MOV         R1,#(EOF_RECORD#256) +        MOV         R2,#(EOF_RECORD/256) +        SEND_NET +        POP_ALL +        SETB READY +        LCD 40H,"Teachin- Datei leer.                    " +        RET + +GET_NOT_EMPTY:                          ; Datei nicht leer +        MOV DPL,R3                      ; Groesse nach DPTR +        MOV DPH,R4 +        ADD_DPTR MEM_ANF +        SET_16 NEXT_FREE                ; neues Speicherende setzen +        MOV CHECKSUMME,R5               ; neue Checksumme laden +        MOV CHECKSUMME+1,R6 +        PUSH_DPTR +        GET_16 BLOCKNR +        INC DPTR +        SET_16 BLOCKNR                  ; Blocknr.=+1 setzen +        MOV R1,DPL                      ; Blocknr. +        MOV R2,DPH +        POP_DPTR +        ; MOV A,#MSG_PC_GET+MY_SLAVE_ADR1*16 +        MOV A,MY_SLAVE_ADR +        SWAP A                             ; *16 +        ADD A,#MSG_PC_GET +        MOVB ACC.0,P3.5                    ; Datei fuer Roboter oder Fraese +        SETB ACC.1 +        MOV R0,A +        MOV A,#PC_Slave_Adr +        MOV B,#8 +        SEND_NET                        ; 1. Block anfordern + +        MOV DPTR,#MEM_ANF +        SET_16 POINTER                  ; Zeiger auf MEM_ANF setzen + +        POP_ALL +        RET + +GET_NO_HEADER: +        GET_16 POINTER                  ; Schreibzeiger laden +        MOV A,R3 +        LCALL ACC_WR_MEM                ; in den Speicher schreiben +        LCALL CHECK_RD_POINTER          ; pruefen ob noch Bytes in der Datei +        JNC GET_MORE2 +        LJMP GET_CLOSE                  ; wenn nicht Datei schliessen +GET_MORE2: +        MOV A,R4 +        LCALL ACC_WR_MEM                ; in den Speicher schreiben +        LCALL CHECK_RD_POINTER          ; pruefen ob noch Bytes in der Datei +        JNC GET_MORE3 +        LJMP GET_CLOSE                  ; wenn nicht Datei schliessen +GET_MORE3: +        MOV A,R5 +        LCALL ACC_WR_MEM                ; in den Speicher schreiben +        LCALL CHECK_RD_POINTER          ; pruefen ob noch Bytes in der Datei +        JNC GET_MORE4 +        LJMP GET_CLOSE                  ; wenn nicht Datei schliessen +GET_MORE4: +        MOV A,R6 +        LCALL ACC_WR_MEM                ; in den Speicher schreiben +        LCALL CHECK_RD_POINTER          ; pruefen ob noch Bytes in der Datei +        JNC GET_MORE5 +        LJMP GET_CLOSE                  ; wenn nicht Datei schliessen +GET_MORE5: +        MOV A,R7 +        LCALL ACC_WR_MEM                ; in den Speicher schreiben +        LCALL CHECK_RD_POINTER          ; pruefen ob noch Bytes in der Datei +        JNC GET_MORE6 +        LJMP GET_CLOSE                  ; wenn nicht Datei schliessen +GET_MORE6: +        SET_16 POINTER +        GET_16 BLOCKNR +        INC DPTR +        SET_16 BLOCKNR                  ; Blocknr.=+1 setzen +        MOV R1,DPL                      ; Blocknr. +        MOV R2,DPH +        ; MOV A,#MSG_PC_GET+MY_SLAVE_ADR1*16 +        MOV A,MY_SLAVE_ADR +        SWAP A                             ; *16 +        ADD A,#MSG_PC_GET +        MOVB ACC.0,P3.5                    ; Datei fuer Roboter oder Fraese +        SETB ACC.1 +        MOV R0,A +        MOV A,#PC_Slave_Adr +        MOV B,#8 +        SEND_NET                        ; naechsten Block anfordern +        POP_ALL +        RET + + +GET_CLOSE: +        ; MOV A,#MSG_PC_PUT+MY_SLAVE_ADR1*16 +        MOV A,MY_SLAVE_ADR +        SWAP A                             ; *16 +        ADD A,#MSG_PC_PUT +        MOVB ACC.0,P3.5                      ; Datei fuer Roboter oder Fraese +        SETB ACC.1 +        MOV R0,A +        MOV         A,#PC_Slave_Adr               ; und Datei schlieáen +        MOV         B,#8 +        MOV         R1,#(EOF_RECORD#256) +        MOV         R2,#(EOF_RECORD/256) +        SEND_NET +        MOV R0,CHECKSUMME +        MOV A,CHECKSUMME+1 +        LCALL CHECK_SUM +        CJNE A,CHECKSUMME+1,GET_CRC_ERROR +        MOV A,R0 +        CJNE A,CHECKSUMME,GET_CRC_ERROR +        POP_ALL +        CLR CRC +        SETB READY +        LCD 40H,"Teachin- Datei fehlerfrei geladen.      " +        RET + +GET_CRC_ERROR: +        POP_ALL +        SETB CRC +        SETB READY +        LCD 40H,"FEHLER bei Laden der Teachin- Datei.    " +        RET + +;--------------------------------------------------------------------- +; Funktion : Testen ob DPTR zum LESEN auf belegten Speicher zeigt. +;               C=0 ==> MEM_ANF <= DPTR < NEXT_FREE +;               C=1 ==> sonst +; Aufrufparameter : DPTR = Pointer +; Ruechgabeparameter : - +; Veraenderte Register : PSW +; Stackbedarf : +; Zeitbedarf : +; + +CHECK_RD_POINTER: +        PUSH PSW +        PUSH ACC +        MOV A,#((MEM_ANF-1)/256) +        CJNE A,DPH,CH_RD1               ; Test ob Pointer >= MEM_ANF +CH_RD1: JC CH_RD_OK1 +        CJNE A,DPH,CH_RD_ERROR          ; +        MOV A,#((MEM_ANF-1)#256) +        CJNE A,DPL,CH_RD2 +CH_RD2: JC CH_RD_OK1 +        LJMP CH_RD_ERROR                ; +CH_RD_OK1: +        PUSH_DPTR +        MOV DPTR,#(NEXT_FREE+1) +        MOVX A,@DPTR +        POP_DPTR +        CJNE A,DPH,CH_RD3               ; Test ob Pointer < NEXT_FREE +CH_RD3: JC CH_RD_ERROR +        CJNE A,DPH,CH_RD_OK2            ; +        PUSH_DPTR +        MOV DPTR,#NEXT_FREE +        MOVX A,@DPTR +        POP_DPTR +        CJNE A,DPL,CH_RD4 +CH_RD4: JC CH_RD_ERROR +        CJNE A,DPL,CH_RD_OK2 +        LJMP CH_RD_ERROR                ; + +CH_RD_OK2: +        POP ACC +        POP PSW +        CLR C                           ; o.k. +        RET + +CH_RD_ERROR: +        POP ACC +        POP PSW +        SETB C                          ; Fehler +        RET + +;--------------------------------------------------------------------- +; Funktion : Testen ob DPTR zum SCHREIBEN auf belegten Speicher zeigt. +;               C=0 ==> MEM_ANF <= DPTR <= NEXT_FREE +;               C=1 ==> sonst +; Aufrufparameter : DPTR = Pointer +; Ruechgabeparameter : - +; Veraenderte Register : PSW +; Stackbedarf : +; Zeitbedarf : +; + +CHECK_WR_POINTER: +        PUSH PSW +        PUSH ACC +        MOV A,#((MEM_ANF-1)/256) +        CJNE A,DPH,CH_WR1               ; Test ob Pointer >= MEM_ANF +CH_WR1: JC CH_WR_OK1 +        CJNE A,DPH,CH_WR_ERROR          ; +        MOV A,#((MEM_ANF-1)#256) +        CJNE A,DPL,CH_WR2 +CH_WR2: JC CH_WR_OK1 +        LJMP CH_WR_ERROR                ; +CH_WR_OK1: +        PUSH_DPTR +        MOV DPTR,#(NEXT_FREE+1) +        MOVX A,@DPTR +        POP_DPTR +        CJNE A,DPH,CH_WR3               ; Test ob Pointer <= NEXT_FREE +CH_WR3: JC CH_WR_ERROR +        CJNE A,DPH,CH_WR_OK2            ; +        PUSH_DPTR +        MOV DPTR,#NEXT_FREE +        MOVX A,@DPTR +        POP_DPTR +        CJNE A,DPL,CH_WR4 +CH_WR4: JNC CH_WR_OK2 +        LJMP CH_WR_ERROR                ; + +CH_WR_OK2: +        POP ACC +        POP PSW +        CLR C                           ; o.k. +        RET + +CH_WR_ERROR: +        POP ACC +        POP PSW +        SETB C                          ; Fehler +        RET + +;--------------------------------------------------------------------- +; Funktion : Testen ob DPTR < MEM_ENDE. +;               C=0 ==> DPTR < MEM_ENDE +;               C=1 ==> sonst +; Aufrufparameter : DPTR = Pointer +; Ruechgabeparameter : - +; Veraenderte Register : PSW +; Stackbedarf : +; Zeitbedarf : +; + +CHECK_EOM_POINTER: +        PUSH PSW +        PUSH ACC +        MOV A,#(MEM_ENDE/256) +        CJNE A,DPH,CH_EOM3               ; Test ob Pointer < MEM_ENDE +CH_EOM3: JC CH_EOM_ERROR +        CJNE A,DPH,CH_EOM_OK2            ; +        MOV A,#(MEM_ENDE#256) +        CJNE A,DPL,CH_EOM4 +CH_EOM4: JC CH_EOM_ERROR +        CJNE A,DPL,CH_EOM_OK2 +        LJMP CH_EOM_ERROR                ; + +CH_EOM_OK2: +        POP ACC +        POP PSW +        CLR C                           ; o.k. +        RET + +CH_EOM_ERROR: +        POP ACC +        POP PSW +        SETB C                          ; Fehler +        RET + +;--------------------------------------------------------------------- +; Funktion : ACC in den Speicher schreiben, DPTR increminieren. +; Aufrufparameter : ACC = Wert, DPTR = Pointer +; Ruechgabeparameter : - +; Veraenderte Register : DPTR +; Stackbedarf : +; Zeitbedarf : +; + +ACC_WR_MEM: +        MOVX @DPTR,A +        INC DPTR +        RET + + +;--------------------------------------------------------------------- +; Funktion : ACC aus dem Speicher lesen, DPTR increminieren. +; Aufrufparameter : DPTR = Pointer +; Ruechgabeparameter : ACC = Wert +; Veraenderte Register : ACC, DPTR +; Stackbedarf : +; Zeitbedarf : +; + +ACC_RD_MEM: +        MOVX A,@DPTR +        INC DPTR +        RET + +;--------------------------------------------------------------------- +; Funktion : Pruefsumme ueber den Speicher bilden. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +CHECK_SUM: +        PUSH PSW +        PUSH ACC +        PUSH_DPTR +        MOV CHECKSUMME,#0 +        MOV CHECKSUMME+1,#0 +        MOV DPTR,#MEM_ANF               ; Pointer auf MEM_ANF setzen +CHECK_SUM1: +        LCALL CHECK_RD_POINTER          ; Pointer in DPTR!!! +        JC CHECK_SUM_ENDE +        LCALL ACC_RD_MEM                ; Byte aus MEM lesen +        ADD A,CHECKSUMME +        MOV CHECKSUMME,A +        MOV A,#0 +        ADDC A,CHECKSUMME+1 +        MOV CHECKSUMME+1,A +        LJMP CHECK_SUM1 + +CHECK_SUM_ENDE: +        POP_DPTR +        POP ACC +        POP PSW +        RET + +;--------------------------------------------------------------------- +; Funktion : Element in den Speicher auf die naechste frei Position schreiben. +; Aufrufparameter : ACC = Wert +; Ruechgabeparameter : C=0 ==> o.k., C=1 ==> Speicherueberlauf +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +PUT_ELEMENT_MEM: +        PUSH PSW +        GET_16 NEXT_FREE                 +        LCALL CHECK_EOM_POINTER         ; testen ob DPTR < MEM_ENDE +        JC GET_ELEMENT_ERROR            ; wenn nicht Fehler +        LCALL CHECK_WR_POINTER          ; testen ob MEM_ANF <= DPTR <= NEXT_FREE +        JC PUT_ELEMENT_ERROR            ; wenn nicht Fehler +        LCALL ACC_WR_MEM                ; Byte aus MEM lesen +        SET_16 NEXT_FREE + +PUT_EL_OK1: +        POP PSW +        CLR C +        RET + +PUT_ELEMENT_ERROR: +        POP PSW +        SETB C +        RET + +        RET + +;--------------------------------------------------------------------- +; Funktion : Element von der akt. Position aus dem Speicher lesen. +; Aufrufparameter : - +; Ruechgabeparameter : ACC = Wert +;                      C=0 ==> o.k., C=1 ==> Schreib- gleich Lesezeiger +;                      oder Lesezeiger ausserhalb des gueltigen Bereiches +; Veraenderte Register : ACC, PSW +; Stackbedarf : +; Zeitbedarf : +; + +GET_ELEMENT_MEM: +        PUSH PSW +        GET_16 RD_POINTER                +        LCALL CHECK_EOM_POINTER         ; testen ob DPTR < MEM_ENDE +        JC GET_ELEMENT_ERROR            ; wenn nicht Fehler +        LCALL CHECK_RD_POINTER          ; testen ob MEM_ANF <= DPTR < NEXT_FREE +        JC GET_ELEMENT_ERROR            ; wenn nicht Fehler +        LCALL ACC_RD_MEM                ; Byte aus MEM lesen +        SET_16 RD_POINTER + +GET_EL_OK1: +        POP PSW +        CLR C +        RET + +GET_ELEMENT_ERROR: +        POP PSW +        SETB C +        RET + +;===================================================================== +;        END +;--------------------------------------------------------------------- + diff --git a/tests/t_mic51/RUN1.ASM b/tests/t_mic51/RUN1.ASM new file mode 100644 index 0000000..690e68b --- /dev/null +++ b/tests/t_mic51/RUN1.ASM @@ -0,0 +1,773 @@ +; +; 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 +;--------------------------------------------------------------------- + + + diff --git a/tests/t_mic51/TAST1.ASM b/tests/t_mic51/TAST1.ASM new file mode 100644 index 0000000..0a34ecb --- /dev/null +++ b/tests/t_mic51/TAST1.ASM @@ -0,0 +1,250 @@ + +; Aufgabe Nr.: Speichermodul fuer uP- Praktikum II +; Autor: Joerg Vollandt  +; erstellt am : 21.05.1994 +; letzte Aenderung am : +; Bemerkung : Routinen fuer ASCII- Tastatur +; +; Dateiname : tast1.asm +; + +;---------------------------------------------------------------------	 +; Definitionen + +        SEGMENT DATA + +ZEICHEN         DB      ? + +        SEGMENT BITDATA + +STROB           DB      ? + +;--------------------------------------------------------------------- +        SEGMENT CODE +;===================================================================== +; Funktion : Tastaturinterrupt initialisieren +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +INIT_TASTATUR: +        Init_Vektor INT0_VEKTOR,TASTATUR_INT +        SETB IT0 +        CLR IE0 +        SETB EX0 +        RET + +;--------------------------------------------------------------------- +; Funktion : Interruptroutine fuer Tastatur, setzt bei Tastaturstrob +;            das Bit STROB und schreibt das Zeichen von der Tastatur +;            nach ZEICHEN. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +TASTATUR_INT: +        MOV ZEICHEN,P1 +        SETB STROB +        RETI + +;--------------------------------------------------------------------- +; Funktion : Klein- in Grossbuchstaben umwandeln. +; Aufrufparameter : ACC = Zeichen +; Ruechgabeparameter : ACC = Zeichen +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +        ifdef joerg + +UPCASE: PUSH PSW +        CJNE A,#'a',UPCASE1 +UPCASE1: JC UPCASE2 +        CJNE A,#07bh,UPCASE3 +UPCASE3: JNC UPCASE2 +        CLR C +        SUBB A,#32 +UPCASE2: POP PSW +        RET + +        endif + +;--------------------------------------------------------------------- +; Funktion : Warten bis Tastendruck und Zeichen verwerfen. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +WAIT_KEY: +        ifdef joerg +         +        JNB STROB,$ +        CLR STROB +        RET + +        elseif +         +        JNB KB_CHAR_READY,$ +        CLR KB_CHAR_READY +        RET + +        endif +;--------------------------------------------------------------------- +; Funktion : Warten bis Tastendruck und Zeichen nach ACC von der +;            Tastatur einlesen. +; Aufrufparameter : - +; Ruechgabeparameter : ACC = Zeichen +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +CHAR_ACC: +        ifdef joerg + +        JNB STROB,$ +        CLR STROB +        MOV A,ZEICHEN +        RET + +        elseif + +        JNB KB_CHAR_READY,$ +        CLR KB_CHAR_READY +        MOV A,KB_CHAR_BUFFER +        RET + +        endif + +;--------------------------------------------------------------------- +; Funktion : ACC in hex von der Tastatur einlesen. +; Aufrufparameter : - +; Ruechgabeparameter : ACC = Wert +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +IN_ACC: +        PUSH PSW +        PUSH B +        LCALL CHAR_ACC +        LCALL LCD_WRITE_CHAR +        LCALL UPCASE +        CJNE A,#'A',IN_ACC1 +IN_ACC1: JC IN_ACC2 +        CJNE A,#'G',IN_ACC3 +IN_ACC3: JNC IN_ACC2 +        CLR C +        SUBB A,#7 +IN_ACC2: CLR C +        SUBB A,#30h +        SWAP A +        MOV B,A +        LCALL CHAR_ACC +        LCALL LCD_WRITE_CHAR +        LCALL UPCASE +        CJNE A,#'A',IN_ACC11 +IN_ACC11: JC IN_ACC12 +        CJNE A,#'G',IN_ACC13 +IN_ACC13: JNC IN_ACC12 +        CLR C +        SUBB A,#7 +IN_ACC12: CLR C +        SUBB A,#30h +        ORL A,B +        POP B +        POP PSW +        RET + +;--------------------------------------------------------------------- +; Funktion : DPTR in hex von der Tastatur einlesen. +; Aufrufparameter : - +; Ruechgabeparameter : DPTR = Wert +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +IN_DPTR: +        PUSH ACC +        LCALL IN_ACC +        MOV DPH,A +        LCALL IN_ACC +        MOV DPL,A +        POP ACC +        RET + +;--------------------------------------------------------------------- +; Funktion : ACC in hex auf LCD ausgeben. +; Aufrufparameter : ACC = Wert +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +A_LCD:  PUSH ACC +        PUSH ACC +        SWAP A +        ANL A,#00001111B +        ADD A,#'0' +        CJNE A,#':',A_LCD1 +A_LCD1: JC A_LCD2 +        ADD A,#7 +A_LCD2: LCALL LCD_WRITE_CHAR +        POP ACC +        ANL A,#00001111B +        ADD A,#'0' +        CJNE A,#':',A_LCD3 +A_LCD3: JC A_LCD4 +        ADD A,#7 +A_LCD4: LCALL LCD_WRITE_CHAR +        POP ACC +        RET + +;--------------------------------------------------------------------- +; Funktion : DPTR in hex auf LCD ausgeben. +; Aufrufparameter : DPTR = Wert +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +DPTR_LCD: +        PUSH ACC +        MOV A,DPH +        LCALL A_LCD +        MOV A,DPL +        LCALL A_LCD +        POP ACC +        RET + +;--------------------------------------------------------------------- +; Funktion : Setzt LCD- Status neu +; Aufrufparameter : A = Status +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +LCD_SET_STATUS: + +        RET + +;===================================================================== +;        END +;--------------------------------------------------------------------- + diff --git a/tests/t_mic51/TEACH1.ASM b/tests/t_mic51/TEACH1.ASM new file mode 100644 index 0000000..3618062 --- /dev/null +++ b/tests/t_mic51/TEACH1.ASM @@ -0,0 +1,504 @@ + +; Aufgabe Nr.: Teach- In Einheit fuer uP- Praktikum II +; Autor: Joerg Vollandt  +; erstellt am : 31.05.1994 +; letzte Aenderung am : 14.07.1994 +; Bemerkung : +; +; Dateiname : teach1.asm +; + +;===================================================================== +; Definitionen der Funktionen der Teach- In Einheit + +;INIT_TEACH      Initialisieren der Teach- In Einheit +;DEINIT_TEACH    Deinitialisieren der Teach- In Einheit +;CLEAR_TEACH     Speicher loeschen +;RESET_TEACH     Speicher zum lesen zuruecksetzen +;STORE_ROB       Position Roboter speichern +;STORE_FRAES     Position Fraese speichern +;SYNC +;LOAD_ROB        Roboter Teach- In Datei von PC laden +;LOAD_FRAES      Fraese- Teach- In Datei von PC laden +;LOAD            Beide Teach- In Dateien von PC laden +;SAVE_ROB        Roboter Teach- In Datei auf PC speichern +;SAVE_FRAES      Fraese- Teach- In Datei auf PC speichern + +;------------------------------------------------------------------------------ +        SEGMENT CODE +;--------------------------------------------------------------------- +; Funktion : Initialisieren der Error- und Warningeinspruenge fuer die +;            Fraese. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +INIT_FRS: +        JB P3.5,INIT_FRAES_START +        LJMP INIT_FRAES_ENDE +INIT_FRAES_START: +        PUSH_ALL +;        MOV B,#5                                ; Msg. Frs +;        MOV AR2,#MemFrs                         ; meine Adr. +;        MOV AR3,#GetFrsError                    ; Fehlereinsprung +;        MOV AR4,#GetFrsWarning                  ; Warnungeinsprung +;        post_message1 Frs,SetMasterAdress       ; Ready-Anfordrung +        post_message2 #Frs,#SetMasterAdress,#MemFrs,#GetFrsError,#GetFrsWarning +        POP_ALL +INIT_FRAES_ENDE: +        RET + +;--------------------------------------------------------------------- +; Funktion : Initialisieren der Teach- In Einheit +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +INIT_TEACH: +        CLR READY +        CLR CRC +        LCALL INIT_MEM +        MOV T_Sync_Counter,#0 +        MOV Frs_Ref_x,#0 +        MOV Frs_Ref_x+1,#0 +        MOV Frs_Ref_y,#0 +        MOV Frs_Ref_y+1,#0 +        MOV Frs_Ref_z,#0 +        MOV Frs_Ref_z+1,#0 +        MOV Frs_Ref_Tiefe,#0 +        MOV Frs_Ref_Tiefe+1,#0 +        CLR Ref_Flag +        CLR Tiefe_Flag +        RET + +;--------------------------------------------------------------------- +; Funktion : Deinitialisieren der Teach- In Einheit +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +DEINIT_TEACH: +        CLR READY +        CLR CRC +        LCALL DEINIT_MEM + +        RET + +;--------------------------------------------------------------------- +; Funktion : Speicher der Teach- In Einheit loeschen +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +CLEAR_TEACH: + +        RET + +;--------------------------------------------------------------------- +; Funktion : Teach- In Einheit zuruecksetzen +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +RESET_TEACH: +        LCALL RESET_MEM +        SETB READY + +        RET + +;--------------------------------------------------------------------- +; Funktion : Roboter Teach- In Datei von PC laden +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +LOAD_ROB: +        JB P3.5,LOAD_ROB_ENDE +        CLR READY +        LCD 40H,"Roboter- Teachin- Datei wird geladen.   " +        LCALL RD_MEM_PC +LOAD_ROB_ENDE: +        RET + +;--------------------------------------------------------------------- +; Funktion : Fraese- Teach- In Datei von PC laden +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +LOAD_FRAES: +        JNB P3.5,LOAD_FRAES_ENDE +        CLR READY +        LCD 40H,"Fraese- Teachin- Datei wird geladen.    " +        LCALL RD_MEM_PC +LOAD_FRAES_ENDE: +        RET + +;--------------------------------------------------------------------- +; Funktion : Roboter Teach- In Datei auf PC speichern +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +SAVE_ROB: +        JB READY,SAVE_ROB_START +        JNB P3.5,SAVE_ROB_START +        LJMP SAVE_ROB_ENDE +SAVE_ROB_START: +        LCD 40H,"Roboter- Teachin- Datei wird gespeichert" +        LCALL WR_MEM_PC +        JNC SAVE_ROB_OK +        LCD 40H,"FEHLER bei Speichern.                   " +        RET + +SAVE_ROB_OK: +        LCD 40H,"Datei gespeichert.                      " +        RET + +SAVE_ROB_ENDE: +        RET + +;--------------------------------------------------------------------- +; Funktion : Fraese- Teach- In Datei auf PC speichern +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +SAVE_FRAES: +        JB READY,SAVE_FRAES_START +        JB P3.5,SAVE_FRAES_START +        LJMP SAVE_FRAES_ENDE +SAVE_FRAES_START: +        LCALL WR_MEM_PC +        JNC SAVE_FRAES_OK +        LCD 40H,"FEHLER bei Speichern.                   " +        RET + +SAVE_FRAES_OK: +        LCD 40H,"Datei gespeichert.                      " +        RET + +SAVE_FRAES_ENDE: +        RET + +;--------------------------------------------------------------------- +; Funktion : Position des Roboters speichern. 1. Teil: Msg- Header +;            in MEM speichern und ersten Teil der Position vom Roboter +;            anfordern. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +STORE_ROB: +        PUSH PSW +        PUSH ACC +        PUSH AR0 +        JNB READY,STORE_ROB_ENDE                ; Fertig und Roboter ? +        JB P3.5,STORE_ROB_ENDE + +        MOV B,#4                                ; Msg. an Roboter um Pos. +        MOV R2,#MemRob                          ; Empfaenger angeben +        MOV R3,#RobPos1                         ; Msg.-Nr. Empfaenger angeben +        post_message1 Rob,GibPos1                ; zu erfragen + +STORE_ROB_ENDE: +        CLR READY                               ; Teach- In nicht bereit +        POP AR0 +        POP ACC +        POP PSW +        RET + +;--------------------------------------------------------------------- +; Funktion : Position des Roboters speichern. 2. Teil: 1. Teil Position +;            in MEM speichern und zweiten Teil der Position vom Roboter +;            anfordern. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +FIRST_FROM_ROB: +        PUSH PSW +        PUSH ACC +        PUSH AR0 +        JB READY,FIRST_ROB_ENDE                 ; NICHT Fertig und Roboter ? +        JB P3.5,FIRST_ROB_ENDE +        MOV A,#8                                ; Msg- Header speichern +        LCALL PUT_ELEMENT_MEM                   ; (Msg.-Laenge) +        ERROR 0 +        MOV A,#Rob                              ; Msg- Header speichern +        LCALL PUT_ELEMENT_MEM                   ; (Modulnr.) +        ERROR 0 +        MOV A,#MoveAPos1                        ; Msg- Header speichern +        LCALL PUT_ELEMENT_MEM                   ; (Msg.- Nr.) +        ERROR 0 +        MOV A,R2                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 1 High) +        ERROR 0 +        MOV A,R3                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 1 Low) +        ERROR 0 +        MOV A,R4                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 2 High) +        ERROR 0 +        MOV A,R5                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 2 Low) +        ERROR 0 +        MOV A,R6                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 3 High) +        ERROR 0 +        MOV A,R7                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 3 Low) +        ERROR 0 + +        MOV B,#4                                ; Msg. an Roboter um Pos. +        MOV R2,#MemRob                          ; Empfaenger angeben +        MOV R3,#RobPos2                         ; Msg.-Nr. Empfaenger angeben +        post_message1 Rob,GibPos2               ; zu erfragen + +FIRST_ROB_ENDE: +        POP AR0 +        POP ACC +        POP PSW + +        RET + +;--------------------------------------------------------------------- +; Funktion : Position des Roboters speichern. 3. Teil: 2. Teil Position +;            in MEM speichern. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +SECOND_FROM_ROB: +        PUSH PSW +        PUSH ACC +        PUSH AR0 +        JB READY,SECOND_ROB_ENDE                ; NICHT Fertig und Roboter ? +        JB P3.5,SECOND_ROB_ENDE +        MOV A,#8                                ; Msg- Header speichern +        LCALL PUT_ELEMENT_MEM                   ; (Msg.-Laenge) +        ERROR 0 +        MOV A,#Rob                              ; Msg- Header speichern +        LCALL PUT_ELEMENT_MEM                   ; (Modulnr.) +        ERROR 0 +        MOV A,#MoveAPos2                        ; Msg- Header speichern +        LCALL PUT_ELEMENT_MEM                   ; (Msg.- Nr.) +        ERROR 0 +        MOV A,R2                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 1 High) +        ERROR 0 +        MOV A,R3                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 1 Low) +        ERROR 0 +        MOV A,R4                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 2 High) +        ERROR 0 +        MOV A,R5                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 2 Low) +        ERROR 0 +        MOV A,R6                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 3 High) +        ERROR 0 +        MOV A,R7                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 3 Low) +        ERROR 0 + +SECOND_ROB_ENDE: +        POP AR0 +        POP ACC +        POP PSW +        SETB READY                               ; Teach- In wieder bereit +        RET + +;--------------------------------------------------------------------- +; Funktion : Position der Fraese speichern. 1. Teil: Msg- Header +;            in MEM speichern und ersten Teil der Position von Fraese +;            anfordern. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +STORE_FRAES: +        PUSH PSW +        PUSH ACC +        PUSH AR0 +        JNB READY,STORE_FRS_ENDE                ; Fertig und Fraese? +        JNB P3.5,STORE_FRS_ENDE + +        MOV B,#4                                ; Msg. an Roboter um Pos. +        MOV R2,#MemFrs                          ; Empfaenger angeben +        MOV R3,#FrsPos1                         ; Msg.-Nr. Empfaenger angeben +        post_message1 Frs,GibFrsPos1            ; zu erfragen + +STORE_FRS_ENDE: +        CLR READY                               ; Teach- In nicht bereit +        POP AR0 +        POP ACC +        POP PSW +        RET + +;--------------------------------------------------------------------- +; Funktion : Position der Fraese speichern. 2. Teil: 1. Teil Position +;            in MEM speichern und zweiten Teil der Position von Fraese +;            anfordern. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +FIRST_FROM_FRS: +        PUSH PSW +        PUSH ACC +        PUSH AR0 +        JB READY,FIRST_FRS_ENDE                 ; NICHT Fertig und Roboter ? +        JNB P3.5,FIRST_FRS_ENDE +        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,#MoveAPos                         ; Msg- Header speichern +        LCALL PUT_ELEMENT_MEM                   ; (Msg.- Nr.) +        ERROR 0 +        MOV A,R2                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 1 High) +        ERROR 0 +        MOV A,R3                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 1 Low) +        ERROR 0 +        MOV A,R4                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 2 High) +        ERROR 0 +        MOV A,R5                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 2 Low) +        ERROR 0 +        MOV A,R6                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 3 High) +        ERROR 0 +        MOV A,R7                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 3 Low) +        ERROR 0 + +        MOV B,#4                                ; Msg. an Roboter um Pos. +        MOV R2,#MemFrs                          ; Empfaenger angeben +        MOV R3,#FrsPos2                         ; Msg.-Nr. Empfaenger angeben +        post_message1 Frs,GibFrsPos2            ; zu erfragen + +FIRST_FRS_ENDE: +        POP AR0 +        POP ACC +        POP PSW + +        RET + +;--------------------------------------------------------------------- +; Funktion : Position der Fraese speichern. 3. Teil: 2. Teil Position +;            in MEM speichern. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +SECOND_FROM_FRS: +        PUSH PSW +        PUSH ACC +        PUSH AR0 +        JB READY,SECOND_FRS_ENDE                ; NICHT Fertig und Roboter ? +        JNB P3.5,SECOND_FRS_ENDE + +        MOV A,#4                                ; 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,#MoveV                            ; Msg- Header speichern +        LCALL PUT_ELEMENT_MEM                   ; (Msg.- Nr.) +        ERROR 0 +        MOV A,R2                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 1 High) +        ERROR 0 +        MOV A,R3                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 1 Low) +        ERROR 0 + +        MOV A,#3                                ; 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,#Drill                            ; Msg- Header speichern +        LCALL PUT_ELEMENT_MEM                   ; (Msg.- Nr.) +        ERROR 0 +        MOV A,R4                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 2 High) +        ERROR 0 + +SECOND_FRS_ENDE: +        POP AR0 +        POP ACC +        POP PSW +        SETB READY                               ; Teach- In wieder bereit +        RET + +;--------------------------------------------------------------------- +; Funktion : +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + + +        RET + +;===================================================================== +;        END +;--------------------------------------------------------------------- + diff --git a/tests/t_mic51/asflags b/tests/t_mic51/asflags new file mode 100644 index 0000000..d0334c2 --- /dev/null +++ b/tests/t_mic51/asflags @@ -0,0 +1 @@ +-c -A 
\ No newline at end of file diff --git a/tests/t_mic51/defKey.inc b/tests/t_mic51/defKey.inc new file mode 100644 index 0000000..aac5ab1 --- /dev/null +++ b/tests/t_mic51/defKey.inc @@ -0,0 +1,83 @@ +; ***************************************************************************** +; Definition des Tastenfeldes der Teach-In Einheit +; Format: +;      DefKey {On,Off}, {P4,P5}, <Teach-In Modul>, <String> +; +;      Es muss genau 8 Elemente pro Kategorie eingetragen werden +;      Wenn leerer String, wird keine Message durch das Netz gesendet + + +        DefKey On, P4, TeachRob, "Rob MoveCHL"     ; Hand links +        DefKey On, P4, TeachRob, "Rob MoveCHR"     ; Hand rechts +        DefKey On, P4, TeachRob, "Rob MoveCHO"     ; Hand oeffnen +        DefKey On, P4, TeachRob, "Rob MoveCHC"     ; Hand schliessen +        DefKey On, P4, TeachRob, "MemRob StoreRobPos" ; STORE +        DefKey On, P4, TeachRob, "MemRob StoreRobReady"     ; AUX1 +        DefKey On, P4, TeachRob, "MemRob StoreRobSync"   ; AUX2 +        DefKey On, P4, TeachRob, "Rob RobVelocity Fast" ; FAST + +        DefKey Off, P4, TeachRob, "Rob StopCHT" +        DefKey Off, P4, TeachRob, "Rob StopCHT" +        DefKey Off, P4, TeachRob, "Rob StopCH" +        DefKey Off, P4, TeachRob, "Rob StopCH" +        DefKey Off, P4, TeachRob, "" +        DefKey Off, P4, TeachRob, "" +        DefKey Off, P4, TeachRob, "" +        DefKey Off, P4, TeachRob, "Rob RobVelocity Slow" + +        DefKey On, P5, TeachRob, "Rob MoveCBL"     ; Rumpf links +        DefKey On, P5, TeachRob, "Rob MoveCBR"     ; Rumpf rechts +        DefKey On, P5, TeachRob, "Rob MoveCSU"     ; Oberarm heben +        DefKey On, P5, TeachRob, "Rob MoveCSD"     ; Oberarm senken +        DefKey On, P5, TeachRob, "Rob MoveCEU"     ; Unterarm heben +        DefKey On, P5, TeachRob, "Rob MoveCED"     ; Unterarm senken +        DefKey On, P5, TeachRob, "Rob MoveCHU"     ; Hand heben +        DefKey On, P5, TeachRob, "Rob MoveCHD"     ; Hand senken + +        DefKey Off, P5, TeachRob, "Rob StopCB" +        DefKey Off, P5, TeachRob, "Rob StopCB" +        DefKey Off, P5, TeachRob, "Rob StopCS" +        DefKey Off, P5, TeachRob, "Rob StopCS" +        DefKey Off, P5, TeachRob, "Rob StopCE" +        DefKey Off, P5, TeachRob, "Rob StopCE" +        DefKey Off, P5, TeachRob, "Rob StopCHP" +        DefKey Off, P5, TeachRob, "Rob StopCHP" + +        DefKey On, P4, TeachFrs, "Frs Drill on"       ; Fraesmotor ein +        DefKey On, P4, TeachFrs, "Frs Drill off"      ; Fraesmotor aus +        DefKey On, P4, TeachFrs, "MemFrs StoreFrsPos" ; STORE +        DefKey On, P4, TeachFrs, "Frs FrsVelocity fast"     ; FAST +        DefKey On, P4, TeachFrs, "MemFrs StoreFrsReady"     ; AUX1 +        DefKey On, P4, TeachFrs, "MemFrs StoreFrsSync"      ; AUX2 +        DefKey On, P4, TeachFrs, "MemFrs StoreFrsDrill"     ; AUX3 +        DefKey On, P4, TeachFrs, ""     ; AUX4 + +        DefKey Off, P4, TeachFrs, "" +        DefKey Off, P4, TeachFrs, "" +        DefKey Off, P4, TeachFrs, "" +        DefKey Off, P4, TeachFrs, "Frs FrsVelocity slow" +        DefKey Off, P4, TeachFrs, "" +        DefKey Off, P4, TeachFrs, "" +        DefKey Off, P4, TeachFrs, "" +        DefKey Off, P4, TeachFrs, "" + +        DefKey On, P5, TeachFrs, "Frs MoveCX +"     ; X+ +        DefKey On, P5, TeachFrs, "Frs MoveCX -"     ; X- +        DefKey On, P5, TeachFrs, "Frs MoveCY +"     ; Y+ +        DefKey On, P5, TeachFrs, "Frs MoveCY -"     ; Y- +        DefKey On, P5, TeachFrs, "Frs MoveCZ +"     ; Z+ +        DefKey On, P5, TeachFrs, "Frs MoveCZ -"     ; Z- +        DefKey On, P5, TeachFrs, "Frs MoveCV +"     ; Schraubstock auf +        DefKey On, P5, TeachFrs, "Frs MoveCV -"     ; Schraubstock zu + +        DefKey Off, P5, TeachFrs, "Frs StopCX +" +        DefKey Off, P5, TeachFrs, "Frs StopCX -" +        DefKey Off, P5, TeachFrs, "Frs StopCY +" +        DefKey Off, P5, TeachFrs, "Frs StopCY -" +        DefKey Off, P5, TeachFrs, "Frs StopCZ +" +        DefKey Off, P5, TeachFrs, "Frs StopCZ -" +        DefKey Off, P5, TeachFrs, "Frs StopCV +" +        DefKey Off, P5, TeachFrs, "Frs StopCV -" + +; +; ***************************************************************************** diff --git a/tests/t_mic51/defModul.inc b/tests/t_mic51/defModul.inc new file mode 100644 index 0000000..98682ca --- /dev/null +++ b/tests/t_mic51/defModul.inc @@ -0,0 +1,18 @@ +; **************************************************************************** +; Definition der Modulnamen +; Format: +;      defModul <Modulname>, <Netzwerkadressse> +; +; Dem <Modulname> wird eine eindeutige Zahl zugeordnet. +; +       defModul  Rob,        uC_Rob +       defModul  Frs,        uC_Frs +       defModul  TeachRob,   uC_Teach_Rob +       defModul  TeachFrs,   uC_Teach_Frs +       defModul  TeachKey,   uC_Teach_Key +       defModul  MemRob,     uC_Teach_Rob +       defModul  MemFrs,     uC_Teach_Frs +       defModul  PC_SIO,     uC_PC_SIO + +; +; **************************************************************************** diff --git a/tests/t_mic51/defMsg.inc b/tests/t_mic51/defMsg.inc new file mode 100644 index 0000000..420c19e --- /dev/null +++ b/tests/t_mic51/defMsg.inc @@ -0,0 +1,141 @@ +; **************************************************************************** +; Definition der Parameter - Pattern +; +;NoParamSingle +;ParamSingle1 +;ParamSingle2 +;ParamSingle3 +;ParamSingle4 +;ParamSingle5 +;ParamSingle6 + +; +; **************************************************************************** +; Definition der Messages +; Format: +;      DefMsg <Modul>, <MsgName>, <Anzahl Parameter>, <Parameter - Pattern> +; +    DefMsg Rob, MoveAB          , 1, NoParamSingle +    DefMsg Rob, MoveAS          , 1, NoParamSingle +    DefMsg Rob, MoveAE          , 1, NoParamSingle +    DefMsg Rob, MoveARW         , 1, NoParamSingle +    DefMsg Rob, MoveALW         , 1, NoParamSingle +    DefMsg Rob, MoveAH          , 1, NoParamSingle +    DefMsg Rob, MoveAPos1       , 3, NoParamSingle +    DefMsg Rob, MoveAPos2       , 3, NoParamSingle +    DefMsg Rob, MoveRB          , 1, NoParamSingle +    DefMsg Rob, MoveRS          , 1, NoParamSingle +    DefMsg Rob, MoveRE          , 1, NoParamSingle +    DefMsg Rob, MoveRRW         , 1, NoParamSingle +    DefMsg Rob, MoveRLW         , 1, NoParamSingle +    DefMsg Rob, MoveRH          , 1, NoParamSingle +    DefMsg Rob, MoveRPos1       , 3, NoParamSingle +    DefMsg Rob, MoveRPos2       , 3, NoParamSingle +    DefMsg Rob, MoveCBL         , 0, NoParamSingle +    DefMsg Rob, MoveCBR         , 0, NoParamSingle +    DefMsg Rob, StopCB          , 0, NoParamSingle +    DefMsg Rob, MoveCSU         , 0, NoParamSingle +    DefMsg Rob, MoveCSD         , 0, NoParamSingle +    DefMsg Rob, StopCS          , 0, NoParamSingle +    DefMsg Rob, MoveCEU         , 0, NoParamSingle +    DefMsg Rob, MoveCED         , 0, NoParamSingle +    DefMsg Rob, StopCE          , 0, NoParamSingle +    DefMsg Rob, MoveCHU         , 0, NoParamSingle +    DefMsg Rob, MoveCHD         , 0, NoParamSingle +    DefMsg Rob, StopCHP         , 0, NoParamSingle +    DefMsg Rob, MoveCHL         , 0, NoParamSingle +    DefMsg Rob, MoveCHR         , 0, NoParamSingle +    DefMsg Rob, StopCHT         , 0, NoParamSingle +    DefMsg Rob, MoveCHO         , 0, NoParamSingle +    DefMsg Rob, MoveCHC         , 0, NoParamSingle +    DefMsg Rob, StopCH          , 0, NoParamSingle +    DefMsg Rob, RobVelocity     , 1, ParamSingle1 +    DefMsg Rob, RobGoHome       , 0, NoParamSingle +    DefMsg Rob, SetHome         , 0, NoParamSingle +    DefMsg Rob, GibPos1         , 2, ParamSingle1+ParamSingle2 +    DefMsg Rob, GibPos2         , 2, ParamSingle1+ParamSingle2 +    DefMsg Rob, RobGibReady     , 2, ParamSingle1+ParamSingle2 +    DefMsg Rob, RobInit         , 0, NoParamSingle +    DefMsg Rob, RobDeInit       , 0, NoParamSingle + +    DefMsg Frs, Init            , 0, NoParamSingle +    DefMsg Frs, DeInit          , 0, NoParamSingle +    DefMsg Frs, MoveCX          , 1, ParamSingle1 +    DefMsg Frs, MoveCY          , 1, ParamSingle1 +    DefMsg Frs, MoveCZ          , 1, ParamSingle1 +    DefMsg Frs, MoveCV          , 1, ParamSingle1 +    DefMsg Frs, StopCX          , 1, ParamSingle1 +    DefMsg Frs, StopCY          , 1, ParamSingle1 +    DefMsg Frs, StopCZ          , 1, ParamSingle1 +    DefMsg Frs, StopCV          , 1, ParamSingle1 +    DefMsg Frs, FrsVelocity     , 1, ParamSingle1 +    DefMsg Frs, FrsVelocityDraw , 1, ParamSingle1 +    DefMsg Frs, FrsGoHome       , 0, NoParamSingle +    DefMsg Frs, RefFahrt        , 0, NoParamSingle +    DefMsg Frs, SetDrillRef     , 0, NoParamSingle +    DefMsg Frs, SetPieceRef     , 3, NoParamSingle +    DefMsg Frs, MoveX           , 1, NoParamSingle +    DefMsg Frs, MoveY           , 1, NoParamSingle +    DefMsg Frs, MoveZ           , 1, NoParamSingle +    DefMsg Frs, MoveAPos        , 3, NoParamSingle +    DefMsg Frs, MoveRX          , 1, NoParamSingle +    DefMsg Frs, MoveRY          , 1, NoParamSingle +    DefMsg Frs, MoveRZ          , 1, NoParamSingle +    DefMsg Frs, MoveRV          , 1, NoParamSingle +    DefMsg Frs, MoveRPos        , 3, NoParamSingle +    DefMsg Frs, MoveVOpen       , 0, NoParamSingle +    DefMsg Frs, MoveVClose      , 0, NoParamSingle +    DefMsg Frs, MoveV           , 1, NoParamSingle +    DefMsg Frs, GoPieceRefPos   , 0, NoParamSingle +    DefMsg Frs, MovePR          , 3, NoParamSingle +    DefMsg Frs, Drill           , 1, ParamSingle1 +    DefMsg Frs, SetMasterAdress , 3, ParamSingle1+ParamSingle2+ParamSingle3 +    DefMsg Frs, GibFrsPos1      , 2, ParamSingle1+ParamSingle2 +    DefMsg Frs, GibFrsPos2      , 2, ParamSingle1+ParamSingle2 +    DefMsg Frs, GibPosP         , 2, ParamSingle1+ParamSingle2 +    DefMsg Frs, GibStatus       , 2, ParamSingle1+ParamSingle2 +    DefMsg Frs, GibReady        , 3, ParamSingle1+ParamSingle2+ParamSingle3 + +    DefMsg MemRob,LoadRob,0, NoParamSingle +    DefMsg MemRob,SaveRob,0, NoParamSingle +    DefMsg MemRob,StartRobRun,0, NoParamSingle +    DefMsg MemRob,StoreRobPos,0, NoParamSingle +    DefMsg MemRob,StoreRobSync,0, NoParamSingle +    DefMsg MemRob,StoreRobReady,0, NoParamSingle +    DefMsg MemRob,InitRobTeach,0, NoParamSingle +    DefMsg MemRob,DeinitRobTeach,0, NoParamSingle +    DefMsg MemRob,ClearRobTeach,0, NoParamSingle +    DefMsg MemRob,ResetRobTeach,0, NoParamSingle +    DefMsg MemRob,GetRobSync,1,ParamSingle1 +    DefMsg MemRob,GetRobReady,0, NoParamSingle +    DefMsg MemRob,RobPos1,3, NoParamSingle +    DefMsg MemRob,RobPos2,3, NoParamSingle +    DefMsg MemRob,DebugRob,0, NoParamSingle + +    DefMsg MemFrs,LoadFrs,0, NoParamSingle +    DefMsg MemFrs,SaveFrs,0, NoParamSingle +    DefMsg MemFrs,StartFrsRun,0, NoParamSingle +    DefMsg MemFrs,StoreFrsPos,0, NoParamSingle +    DefMsg MemFrs,StoreFrsSync,0, NoParamSingle +    DefMsg MemFrs,StoreFrsReady,0, NoParamSingle +    DefMsg MemFrs,StoreFrsPieceRef,0, NoParamSingle +    DefMsg MemFrs,StoreFrsTiefe,0, NoParamSingle +    DefMsg MemFrs,StoreFrsDrill,0, NoParamSingle +    DefMsg MemFrs,InitFrsTeach,0, NoParamSingle +    DefMsg MemFrs,DeinitFrsTeach,0, NoParamSingle +    DefMsg MemFrs,ClearFrsTeach,0, NoParamSingle +    DefMsg MemFrs,ResetFrsTeach,0, NoParamSingle +    DefMsg MemFrs,GetFrsSync,1,ParamSingle1 +    DefMsg MemFrs,GetFrsReady,0, NoParamSingle +    DefMsg MemFrs,FrsPos1,3, NoParamSingle +    DefMsg MemFrs,FrsPos2,3, NoParamSingle +    DefMsg MemFrs,FrsPieceRef,3, NoParamSingle +    DefMsg MemFrs,FrsTiefe,3, NoParamSingle +    DefMsg MemFrs,GetFrsError,1, ParamSingle1 +    DefMsg MemFrs,GetFrsWarning,1, ParamSingle1 +    DefMsg MemFrs,DebugFrs,0, NoParamSingle + +    DefMsg TeachFrs,Bug,0,NoParamSingle + +; +; **************************************************************************** diff --git a/tests/t_mic51/defParam.inc b/tests/t_mic51/defParam.inc new file mode 100644 index 0000000..8d7e9d5 --- /dev/null +++ b/tests/t_mic51/defParam.inc @@ -0,0 +1,46 @@ +; ***************************************************************************** +; Definition der Parameter +; Format: +;      DefParam <Parametername>, <Wert>, <String> +; soll der String gleichlautend wie der Parametername sein dann reicht "" +; + +       DefParam On,      001H, "" +       DefParam Off,     000H, "" +       DefParam Plus,    001H, "+" +       DefParam Minus,   000H, "-" +       DefParam Fast,    001H, "" +       DefParam Slow,    000H, "" +       DefParam Superslow, 002H, "" + +;      Hier kommen die Warning-Codes fr die Fr„se + +       DefParam Queue_Warning,             081H, "Queue Warning" + +;      Hier kommen die Error-Codes fr die Fr„se + +       DefParam Queue_Full,                061H, "Queue Full" +       DefParam Undef_Par,                 062H, "Undefined Parameter" +       DefParam Undef_Piece_Ref,           063H, "Undefined Piece Reference" +       DefParam Undef_Drill_Ref,           064H, "Undefined Drill Reference" +       DefParam Undef_Koord_Ref,           065H, "Undefined Koord Reference" +       DefParam Internal_Error,            066H, "Internal Error" + +       DefParam End_X_Plus,                067H, "Software End X+" +       DefParam End_Y_Plus,                068H, "Software End Y+" +       DefParam End_Z_Plus,                069H, "Software End Z+" +       DefParam End_V_Plus,                06AH, "Software End V+" +       DefParam End_X_Minus,               070H, "Software End X-" +       DefParam End_Y_Minus,               071H, "Software End Y-" +       DefParam End_Z_Minus,               072H, "Software End Z-" +       DefParam End_V_Minus,               073H, "Software End V-" + +       DefParam Hard_End_X_Plus,           074H, "Hardware End X+" +       DefParam Hard_End_Y_Plus,           075H, "Hardware End Y+" +       DefParam Hard_End_Z_Plus,           076H, "Hardware End Z+" +       DefParam Hard_End_V_Plus,           077H, "Hardware End V+" +       DefParam Hard_End_X_Minus,          078H, "Hardware End X-" +       DefParam Hard_End_Y_Minus,          079H, "Hardware End Y-" +       DefParam Hard_End_Z_Minus,          07AH, "Hardware End Z-" +       DefParam Hard_End_V_Minus,          07BH, "Hardware End V-" +; ***************************************************************************** diff --git a/tests/t_mic51/defgequ.inc b/tests/t_mic51/defgequ.inc new file mode 100644 index 0000000..c77f9b1 --- /dev/null +++ b/tests/t_mic51/defgequ.inc @@ -0,0 +1,48 @@ +; **************************************************************************** +; EQU - Anweisungen fuer alle Module +; **************************************************************************** + +        ifndef defgequ_inc +defgequ_inc             equ 000H + +; ---------------------------------------------------------------------------- +StringEnde              equ 000H +TableEnd                equ 0FFH +TableAnf                equ 0FEH +Rob_NextMsg             set 001H +Frs_NextMsg             set 001H +TeachRob_NextMsg        set 001H +TeachFrs_NextMsg        set 001H +MemRob_NextMsg          set 001H +MemFrs_NextMsg          set 001H +NextModul               set 010H        ; Modul < 10H : = Message from PC!! +                                        ; Doku beachten. +; ---------------------------------------------------------------------------- +; Definition der Netzwerkadressen +; +uC_Rob          equ       001H    ; Microcontroller des Roboters +uC_Frs          equ       002H    ; Microcontroller der Fraese +uC_Teach_Rob    equ       003H    ; Microcontroller Teach-In Roboter +uC_Teach_Frs    equ       004H    ; Microcontroller Teach-In Fraese +uC_Teach_Key    equ       005H    ; Microcontroller Teach-In Tastatur + +uC_PC_SIO       equ       00EH    ; Microcontroller PC + +; ---------------------------------------------------------------------------- + +          elseif +            fatal "Die Datei DEFGEQU.INC ist mehrmals eingebunden" +          endif + +; ---------------------------------------------------------------------------- + +NoParamSingle  equ 000H +ParamSingle1   equ 001H +ParamSingle2   equ 002H +ParamSingle3   equ 004H +ParamSingle4   equ 008H +ParamSingle5   equ 010H +ParamSingle6   equ 020H + +; +; **************************************************************************** diff --git a/tests/t_mic51/defint.inc b/tests/t_mic51/defint.inc new file mode 100644 index 0000000..2ea07c5 --- /dev/null +++ b/tests/t_mic51/defint.inc @@ -0,0 +1,234 @@ +;**************************************************************************** +; Definition der Interrupts und des Timers 2 +; + +Falling_Edge    EQU     True +Low_Level       EQU     False +Negative_Trans  EQU     False +Positive_Trans  EQU     True + +Param_On        EQU     True +Param_Off       EQU     False + +Nope            EQU     False + +Tm2_Off         EQU     0               ; +Tm2_Timer       EQU     1               ; Input selection +Tm2_Counter     EQU     2               ; +Tm2_Gated       EQU     3               ; + +Tm2_Reload_Off  EQU     0               ; +Tm2_Reload_Ov   EQU     2               ; Reload mode +Tm2_Reload_Ext  EQU     3               ; + +Tm2_Comp_Mode0  EQU     False           ; Compare mode +Tm2_Comp_Mode1  EQU     True            ; + +Tm2_Slow        EQU     True            ; Prescaler selection +Tm2_Normal      EQU     False           ; + +Tm2_CC_Off      EQU     0 +Tm2_CC_Capt_Ext EQU     1 +Tm2_CC_Comp_On  EQU     2 +Tm2_CC_Capt_CRCL EQU    3 + +;----------------------------------------------------------------------------- + +Init_Interrupt  MACRO   PInterrupt, PTrig, PState +                IFNDEF PInterrupt +                  FATAL "unbekannter Interrupt" +                ELSEIF + +                  SWITCH PInterrupt +                  CASE INT0_VEKTOR              ; INT0 +                  IF PTrig +                    SETB        IT0 +                  ELSEIF +                    CLR         IT0 +                  ENDIF + +                  CASE INT1_VEKTOR              ; INT1 +                  IF PTrig +                    SETB        IT1 +                  ELSEIF +                    CLR         IT1 +                  ENDIF + +                  CASE INT2_VEKTOR              ; INT2 +                  IF PTrig +                    SETB        I2FR +                  ELSEIF +                    CLR         I2FR +                  ENDIF + +                  CASE INT3_VEKTOR              ; INT3 +                  IF PTrig +                    SETB        I3FR +                  ELSEIF +                    CLR         I3FR +                  ENDIF + +                  ELSECASE +                  ENDCASE + +                  IF PState +                    Int_On      PInterrupt +                  ELSEIF +                    Int_Off     PInterrupt +                  ENDIF + +                ENDIF +                ENDM + + +;----------------------------------------------------------------------------- + +Int_On          MACRO   PInterrupt +                IFNDEF PInterrupt +                  FATAL "unbekannter Interrupt" +                ELSEIF +                  SWITCH PInterrupt +                  CASE INT0_VEKTOR +                    CLR         IE0 +                    SETB        EX0 +                  CASE ICT0_VEKTOR +                    CLR         TF0 +                    SETB        ET0 +                  CASE INT1_VEKTOR +                    CLR         IE1 +                    SETB        EX1 +                  CASE ICT1_VEKTOR +                    CLR         TF1 +                    SETB        ET1 +                  CASE ICT2_VEKTOR +                    CLR         TF2 +                    CLR         EXF2 +                    SETB        ET2 +                  CASE AD_I_VEKTOR +                    CLR         IADC +                    SETB        EADC +                  CASE INT2_VEKTOR +                    CLR         IEX2 +                    SETB        EX2 +                  CASE INT3_VEKTOR +                    CLR         IEX3 +                    SETB        EX3 +                  CASE INT4_VEKTOR +                    CLR         IEX4 +                    SETB        EX4 +                  CASE INT5_VEKTOR +                    CLR         IEX5 +                    SETB        EX5 +                  CASE INT6_VEKTOR +                    CLR         IEX6 +                    SETB        EX6 +                  ENDCASE +                ENDIF +                ENDM + +;----------------------------------------------------------------------------- + +Int_Off         MACRO   PInterrupt +                IFNDEF PInterrupt +                  FATAL "unbekannter Interrupt" +                ELSEIF +                  SWITCH PInterrupt +                  CASE INT0_VEKTOR +                    CLR         EX0 +                    CLR         IE0 +                  CASE ICT0_VEKTOR +                    CLR         ET0 +                    CLR         TF0 +                  CASE INT1_VEKTOR +                    CLR         EX1 +                    CLR         IE1 +                  CASE ICT1_VEKTOR +                    CLR         ET1 +                    CLR         TF1 +                  CASE ICT2_VEKTOR +                    CLR         ET2 +                    CLR         TF2 +                    CLR         EXF2 +                  CASE AD_I_VEKTOR +                    CLR         EADC +                    CLR         IADC +                  CASE INT2_VEKTOR +                    CLR         EX2 +                    CLR         IEX2 +                  CASE INT3_VEKTOR +                    CLR         EX3 +                    CLR         IEX3 +                  CASE INT4_VEKTOR +                    CLR         EX4 +                    CLR         IEX4 +                  CASE INT5_VEKTOR +                    CLR         EX5 +                    CLR         IEX5 +                  CASE INT6_VEKTOR +                    CLR         EX6 +                    CLR         IEX6 +                  ENDCASE +                ENDIF +                ENDM + +;----------------------------------------------------------------------------- + +Init_Timer2     MACRO   PInput, PReloadMode, PCompareMode, PPrescaler, PReloadValue + +                SWITCH  PInput +                CASE    Tm2_Off +                  CLR           T2I1 +                  CLR           T2I0 +                CASE    Tm2_Timer +                  CLR           T2I1 +                  SETB          T2I0 +                CASE    Tm2_Counter +                  SETB          T2I1 +                  CLR           T2I0 +                CASE    Tm2_Gated +                  SETB          T2I1 +                  SETB          T2I0 +                ENDCASE + +                SWITCH  PReloadMode +                CASE    Tm2_Reload_Off +                  CLR           T2R1 +                  CLR           T2R0 +                CASE    Tm2_Reload_Ov +                  SETB          T2R1 +                  CLR           T2R0 +                CASE    Tm2_Reload_Ext +                  SETB          T2R1 +                  SETB          T2R0 +                ENDCASE + +                IF      PCompareMode +                  SETB          T2CM +                ELSEIF +                  CLR           T2CM +                ENDIF + +                IF      PPrescaler +                  SETB          T2PS +                ELSEIF +                  CLR           T2PS +                ENDIF + +                MOV             CRCL, #(PReloadValue # 256) +                MOV             CRCH, #(PReloadValue / 256) + +                ENDM + + + +Init_Comp_Timer2  MACRO   PMode1, PMode2, PMode3, PValue1, PValue2, PValue3 + +                MOV     CCEN, #(PMode1*4+PMode2*16+PMode3*64) +                MOV     CCL1, #(PValue1 # 256) +                MOV     CCH1, #(PValue1 / 256) +                MOV     CCL2, #(PValue1 # 256) +                MOV     CCH2, #(PValue1 / 256) +                MOV     CCL3, #(PValue1 # 256) +                MOV     CCH3, #(PValue1 / 256) + +                ENDM diff --git a/tests/t_mic51/defmacro.inc b/tests/t_mic51/defmacro.inc new file mode 100644 index 0000000..f5b710d --- /dev/null +++ b/tests/t_mic51/defmacro.inc @@ -0,0 +1,175 @@ + +; *************************************************************************** +; Definition einer Tabelle aus den MSG - Includedateien + +Create_IncOffsTab macro TabName, IncDatei +TabName_Tab:  label   $ +FStr:         db      TableAnf +              db      FStrEnd - FStr, StringEnde, FStrEnd - FStr +FStrEnd: +              include IncDatei +TabName_Tend:  label   $ +              db      TableEnd +              endm + + +Create_IncTab macro TabName, IncDatei +TabName_Tab:  label   $ +              include IncDatei +TabName_Tend:  label   $ +              endm + + +Create_IncKeyTab macro State, Port, Modul, IncDatei +Key_Counter   set 0 +State_Port_Modul_Tab:  label   $ +             include IncDatei +State_Port_Modul_Tend:  label   $ +             if Key_Counter <> 8 +                fatal "Inkorrekte Anzahl von Elementen in Key-Tabelle" +             endif +           endm + + +Create_MsgJmpTab macro Modul, IncDatei +Modul_MsgCall_Tab:      label   $ +                 include IncDatei +Modul_MsgCall_Tend:     label   $ +                 db      TableEnd +                 endm + + + +; *************************************************************************** +; + +DefModul macro Modul, NetAdr + +   ifndef Modul +Modul     equ  NextModul +Net_Modul equ  NetAdr +NextModul set  NextModul + 1 + +     SHARED Modul,NetAdr + +   endif + +   ifdef ModulNetAdr_Tab +     ifndef ModulNetAdr_TEND +       if (ModulNetAdr_Tab + Modul - $) < 0 +           Fatal "NetAdr Tabelle inkonsistent" +         elseif +           org ModulNetAdr_Tab + Modul +         endif + +        db NetAdr +      endif +    endif + +; ------------------------- + +   ifdef ModulStr_Tab +     ifndef ModulStr_TEnd + +strdef:   db Modul, strdefnext - strdef, "MODUL", StringEnde, strdefnext - strdef +strdefnext: + +       endif +     endif + +   endm + +; +; *************************************************************************** +; + +DefParam macro Param, Wert, String + +   ifndef Param +Param     equ Wert + +     SHARED Param + +   endif + +   ifdef ParamStr_Tab +     ifndef ParamStr_TEnd +strdef:   db Wert +          db strdefnext - strdef +          if String = "" +              db "PARAM", StringEnde +            elseif +              db String,  StringEnde +            endif +strdefnext: +       endif +     endif + +   endm + +; +; *************************************************************************** +; + +DefKey macro Status, Port, Modul, String + +   ifdef Status_Port_Modul_Tab +     ifndef Status_Port_Modul_TEnd +strdef:   db strdefnext - strdef +          db String,StringEnde +strdefnext: +Key_Counter  set  Key_Counter + 1 +     endif +   endif + +   endm + +; +; *************************************************************************** +; + +DefMsg  macro Modul, MsgName, ParamCount, ParamPattern + +; --------------------------------------------------------------------------- +; Definition der Message-Nummern + +      ifndef MsgName +MsgName        equ  Modul_NextMsg +Modul_NextMsg  set  Modul_NextMsg + 1 + +        SHARED  MsgName + +      endif +; --------------------------------------------------------------------------- +; Aufbau der Tabelle fuer den Message-Handler + +  ifdef Modul_MsgCall_Tab +    ifndef Modul_MsgCall_Tend +      if (Modul_MsgCall_Tab + (2 * MsgName) - $) < 0 +          Fatal "Msg-Call Tabelle inkonsistent" +        elseif +          org Modul_MsgCall_Tab + (2 * MsgName) +        endif + +        db Adr_MsgName # 256 +        db Adr_MsgName / 256 +      endif +    endif + +; --------------------------------------------------------------------------- +; Aufbau der Stringtabelle + +  ifdef MsgStr_Tab +    ifndef MsgStr_TEnd + +strdef: db Modul, strdefnext - strdef, MsgName, "MSGNAME", StringEnde, ParamCount, ParamPattern +        db strdefnext - strdef +strdefnext: +      endif +    endif + +        endm +; +; *************************************************************************** + + diff --git a/tests/t_mic51/net_lcd.inc b/tests/t_mic51/net_lcd.inc new file mode 100644 index 0000000..6a0cabc --- /dev/null +++ b/tests/t_mic51/net_lcd.inc @@ -0,0 +1,33 @@ +; D:\USER\MEM\NET_LCD.ASM-Includefile fr Assembler-Programm +LCD_HOME equ 0108H +LCD_CR equ 0126H +LCD_LF equ 0172H +LCD_CLEAR equ 01C0H +LCD_WRITE_CHAR equ 01DEH +LCD_WRITE_STRING equ 01FAH +LCD_SET_DD_RAM_ADDRESS equ 022AH +LCD_STATUS equ 0248H +LCD_CURSER_ONOFF equ 025BH +SET_MY_ADRESS equ 061DH +SET_CALLBACK_ADRESS equ 0622H +READ_STATUS equ 0629H +READ_MESSAGE equ 063AH +READ_SPECIAL_MESSAGE equ 0662H +SEND_MESSAGE equ 0693H +INT0_VEKTOR equ 0FF00H +ICT0_VEKTOR equ 0FF03H +INT1_VEKTOR equ 0FF06H +ICT1_VEKTOR equ 0FF09H +ICT2_VEKTOR equ 0FF0CH +AD_I_VEKTOR equ 0FF0FH +INT2_VEKTOR equ 0FF12H +INT3_VEKTOR equ 0FF15H +INT4_VEKTOR equ 0FF18H +INT5_VEKTOR equ 0FF1BH +INT6_VEKTOR equ 0FF1EH +DATA_START equ 03CH +X_DATA_START equ 010H +I_DATA_START equ 080H +BIT_DATA_START equ 0BH +CODE_START equ 01000H +; Ende Includefile fr Assembler-Programm diff --git a/tests/t_mic51/t_mic51.asm b/tests/t_mic51/t_mic51.asm new file mode 100644 index 0000000..ce29ab1 --- /dev/null +++ b/tests/t_mic51/t_mic51.asm @@ -0,0 +1,2197 @@ +;Program:               TEACH-IN EINHEIT +; +;Autor:                 Laurent Savary +; +;Datum:                 9.5.94 +; +;letze Aenderung:       23.6.94 +; +; +;Dateiname: TEACHIN.ASM +; +;------------------------------------------------------------------------------ + +Init_Vektor     macro Vektor,Routine + +;        mov Vektor+0,#(Routine/256)             ;der Interruptvektor wird +;        mov Vektor+1,#(Routine#256)             ;ins interne RAM geladen + +        push acc +        push dph +        push dpl +        mov dptr,#Vektor +        mov a,#00000010b                ; LJMP +        movx @dptr,a +        inc dptr +        mov a,#(Routine/256) +        movx @dptr,a +        inc dptr +        mov a,#(Routine#256) +        movx @dptr,a +        pop dpl +        pop dph +        pop acc +  +                endm + +DEC_DPTR        MACRO +                INC DPL +                DJNZ DPL,DEC_DPTR1 +                DEC DPH +DEC_DPTR1:      DEC DPL +                ENDM + + +INC_R0R1        MACRO +                INC     R0 +                INC     R0 +                DJNZ R0,INC_R0R1_End +                INC     R1 +INC_R0R1_End: +                ENDM + + +DEC_R0R1:       MACRO +                INC R0 +                DJNZ R0,DEC_R0R1_End +                DEC R1 +DEC_R0R1_End:   DEC R0 +                ENDM + +;--------------------------------------------------------------------- + +post_Message macro +        push acc +SEND_NET1: LCALL READ_STATUS +        JB ACC.1,SEND_NET1 +        pop acc +        LCALL SEND_MESSAGE +        endm + +Take_Message macro +        push acc +RECEIVE_NET1: LCALL READ_STATUS +        JNB ACC.0,RECEIVE_NET1 +        pop acc +        LCALL READ_MESSAGE +        endm + +;------------------------------------------------------------------------------ + +        cpu 80515 +        include stddef51.inc +        include net_lcd.inc +        include defint.inc +        include defgequ.inc +        include defmacro.inc + +        USING   0 + +;------------------------ Konstanten ------------------------------------------ + +Ass_Keyboard_Only       EQU     False           ; Wenn True, TI-Einheit lauft nur mit +                                                ; der Tastatur (kein Tastenfeld) + +Last_Code       EQU     0FFFFh  ; Endeadressen +Last_Bit_Data   EQU     07Fh    ; der Speicher- +Last_Data       EQU     07Fh    ; bereiche +Last_IData      EQU     0FFh    ; bestimmen +Last_XData      EQU     0FFFFh + +Kb_Max_Length   EQU     40                      ; Hoechstlaenge der anzuzeigenden Strings +TI_Sample_Valid_Time    EQU     30              ; Gueltige Druckdauer in ms + +ASCII_Space     EQU     32                      ; +ASCII_Left      EQU     19                      ; +ASCII_Right     EQU     4                       ; +ASCII_Up        EQU     5                       ; +ASCII_Down      EQU     24                      ; ASCII-Code fuer die +ASCII_CR        EQU     13                      ; Tastatur +ASCII_Esc       EQU     27                      ; +ASCII_DEL       EQU     127                     ; +ASCII_BkSpc     EQU     8                       ; +ASCII_LWord     EQU     1                       ; +ASCII_RWord     EQU     6                       ; +ASCII_Search    EQU     12                      ; + +KSS_Off         EQU     0 +KSS_Mod         EQU     1 +KSS_Mod_Top     EQU     2 +KSS_Mod_Bot     EQU     3 +KSS_Msg         EQU     4 +KSS_Msg_Top     EQU     5 +KSS_Msg_Bot     EQU     6 +KSS_Inc_Mod     EQU     7 +KSS_No_Choice   EQU     8 + +R0_Bk1          EQU     08h +R1_Bk1          EQU     09h +R2_Bk1          EQU     0Ah +R3_Bk1          EQU     0Bh +R4_Bk1          EQU     0Ch +R5_Bk1          EQU     0Dh +R6_Bk1          EQU     0Eh +R7_Bk1          EQU     0Fh + +;------------------------------------------------------------------------------ + +        segment data +        org Data_Start + +Save_P4         DB      ?               ; +Save_P5         DB      ?               ; +Old_P4          DB      ?               ; +Old_P5          DB      ?               ; +Temp_P4         DB      ?               ; benoetigte Variablen fuer +Temp_P5         DB      ?               ; Teach_In_Sampler +TI_On_P4        DB      ?               ; +TI_Off_P4       DB      ?               ; +TI_On_P5        DB      ?               ; +TI_Off_P5       DB      ?               ; +TI_Sample_Counter DB    ?               ; + +Text_Dec_Status DB      ? +Kb_Char_Buffer  DB      ? +Kb_Str_Pointer  DB      ? +Kb_Cursor       DB      ? +ASCII_Low_Byte  DB      ? +ASCII_High_Byte DB      ? +Rcv_Msg_Length  DB      ? +My_Slave_Adr    DB      ?               ; Physikalische Adresse dieses Moduls + +Kb_Search_Status DB     ?               ; +Kb_Search_DPL   DB      ?               ; +Kb_Search_DPH   DB      ?               ; Benoetigte Variablen fuer +KS_Actual_Word  DB      ?               ; Keyboard Search +KS_Actual_Module DB     ?               ; +KS_Cursor       DB      ?               ; + +Stat_Code       DB      ?               ; +Stat_Address    DB      ?               ; +Stat_Num_Param  DB      ?               ; Benoetigte Variablen fuer +Stat_Picture    DB      ?               ; Text_Decoder +Stat_Module     DB      ?               ; +Stat_Length     DB      ?               ; + +                if $ > Last_Data +                  then fatal "Data-Bereichgrenze ueberschritten" +                endif + + +;------------------------------------------------------------------------------ + +        segment xdata +        org X_Data_Start + +Kb_Str_Buffer   DB      Kb_Max_Length dup (?)   ; Text Buffer (fuer die Tastatur) +Token_Str       DB      Kb_Max_Length dup (?)   ; Ergebnis von Get_Token +Net_Rcv_Str     DB      Kb_Max_Length dup (?)   ; Empfangene Message vom Teach-In Modul + +                 if $ > Last_XData +                  then fatal "XData-Bereichgrenze ueberschritten" +                endif + +;------------------------------------------------------------------------------ + +        segment idata +        org I_Data_Start + +Msg_Registers   DB      8  dup (?)      ; Register-Buffer fur die zu sendenden Messages + +                 if $ > Last_IData +                  then fatal "IData-Bereichgrenze ueberschritten" +                endif + + +;------------------------------------------------------------------------------ + +        segment bitdata +        org Bit_Data_Start + +Kb_Str_Ready    DB      ?               ; -> Text_Decoder +Kb_Char_Ready   DB      ?               ; -> Keyb_Controller +TI_Sample_Chg_Flg DB    ?               ; -> TeachIn_Decoder +TD_Status_Ready DB      ?               ; -> LCD_Controller +TD_Send_Ready   DB      ?               ; -> Send_Manager +Receive_Ready   DB      ?               ; -> Receive_Manager +TD_Next_Flg     DB      ?               ; -> Kb_Controller +KS_Status_Ready DB      ?               ; -> LCD_Controller +KS_Active_Flg   DB      ?               ; -> KB_Search_Up / _Down +Kb_Dsp_Ready    DB      ?               ; -> LCD_Controller +Ext_Dsp_Ready   DB      ?               ; -> LCD_Controller +System_Error    DB      ? +Sys_Robot_Mode  DB      ? +Sys_Keyboard_Mode DB    ? +TID_Done_Flg    DB      ?               ; -> TeachIn_Sampler + +                if $ > Last_Bit_Data +                  then fatal "Bit_Data-Bereichgrenze ueberschritten" +                endif + + +;------------------------------------------------------------------------------ + +        segment code +        org Code_Start + +;====================== H A U P T P R O G R A M M ============================= + +        segment code + +Main_Prog:      CLR     EAL                     ;alle Interrupts sperren +                MOV     SP,#Stack-1             ;Stackpointer setzen + +                LCALL   Init_Data +                LCALL   Init_IData +                LCALL   Init_BitData +                LCALL   Init_XData +                LCALL   Init_Timer +                LCALL   Init_Mode +Main_Error:     JB      System_Error,Main_Error + +                LCALL   Init_Net +                LCALL   LCD_Clear +                MOV     A,#1 +                LCALL   LCD_Curser_OnOff +                LCALL   Init_Int +                SETB    EAL + +                CLR TESTBIT +                CLR MSG +                MOV Sp_MSG_Buffer,#0 +                CLR Sp_MSG +                LCALL INIT_TEACH +                LCALL INIT_RUN +                LCALL RESET_TEACH +                LCALL INIT_FRS + +Main_Loop:      LCALL   Main_Manager +                LCALL   Main_Event_Loop +                SJMP    Main_Loop + + +;------------------------------------------------------------------------------ + +Adr_Table:      Create_IncTab       ModulNetAdr, "defModul.inc" +Module_Table:   Create_IncOffsTab   ModulStr,    "defModul.inc" +Symbol_Table:   Create_IncOffsTab   ParamStr,    "defParam.inc" +Stat_Table:     Create_IncOffsTab   MsgStr,      "defMsg.inc" + +KOn_P4_Rob:     Create_IncKeyTab       On,  P4, TeachRob, "defKey.inc" +KOff_P4_Rob:    Create_IncKeyTab       Off, P4, TeachRob, "defKey.inc" +KOn_P5_Rob:     Create_IncKeyTab       On,  P5, TeachRob, "defKey.inc" +KOff_P5_Rob:    Create_IncKeyTab       Off, P5, TeachRob, "defKey.inc" +KOn_P4_Frs:     Create_IncKeyTab       On,  P4, TeachFrs, "defKey.inc" +KOff_P4_Frs:    Create_IncKeyTab       Off, P4, TeachFrs, "defKey.inc" +KOn_P5_Frs:     Create_IncKeyTab       On,  P5, TeachFrs, "defKey.inc" +KOff_P5_Frs:    Create_IncKeyTab       Off, P5, TeachFrs, "defKey.inc" + +;-------------------------------------------------------------------------- +        include t_mod1.asm              ; +;------------------------------------------------------------------------------ + +Main_Manager:   JNB     Kb_Char_Ready,MM_Txt_Dec +                LCALL   Keyb_Controller + +MM_Txt_Dec:     JNB     Kb_Str_Ready,MM_TI_Dec +                LCALL   Text_Decoder + +MM_TI_Dec:      JNB     TI_Sample_Chg_Flg,MM_Send_Mng +                LCALL   TeachIn_Decoder + +MM_Send_Mng:    JNB     TD_Send_Ready,MM_Receive_Mng +                LCALL   Send_Manager + +MM_Receive_Mng: JNB     Receive_Ready,MM_LCD_Ctrl +                LCALL   Receive_Manager + +MM_LCD_Ctrl:    JB      Ext_Dsp_Ready,MM_LCD_Ctrl2 +                JB      Kb_Dsp_Ready,MM_LCD_Ctrl2 +                JB      TD_Status_Ready,MM_LCD_Ctrl2 +                JB      KS_Status_Ready,MM_LCD_Ctrl2 +                SJMP    MM_End +MM_LCD_Ctrl2:   LCALL   LCD_Controller + +MM_End:         RET + +;-------------------------------------------------------------------------- + +Init_Data: +                MOV     Save_P4,#0FFh +                MOV     Save_P5,#0FFh +                MOV     Old_P4,#0FFh +                MOV     Old_P5,#0FFh +                MOV     Temp_P4,#0FFh +                MOV     Temp_P5,#0FFh +                MOV     TI_On_P4,#00 +                MOV     TI_Off_P4,#00 +                MOV     TI_On_P5,#00 +                MOV     TI_Off_P5,#00 +                MOV     TI_Sample_Counter,#00 +                MOV     Rcv_Msg_Length,#00 +                MOV     My_Slave_Adr,#00 + +                MOV     Text_Dec_Status,#00 +                MOV     Kb_Char_Buffer,#00 +                MOV     Kb_Str_Pointer,#00 +                MOV     Kb_Cursor,#00 +                MOV     ASCII_Low_Byte,#00 +                MOV     ASCII_High_Byte,#00 + +                MOV     Kb_Search_DPL,#00 +                MOV     Kb_Search_DPH,#00 +                MOV     KS_Actual_Word,#00 +                MOV     KS_Actual_Module,#00 +                MOV     KS_Cursor,#00 +                MOV     Kb_Search_Status,#00 + +                MOV     Stat_Code,#00 +                MOV     Stat_Address,#00 +                MOV     Stat_Num_Param,#00 +                MOV     Stat_Picture,#00 +                MOV     Stat_Module,#00 +                MOV     Stat_Length,#00 +                RET + + +Init_IData:     LCALL   Clr_Msg_Buffer +                RET + + +Init_XData:     PUSH    DPL +                PUSH    DPH +                PUSH    Acc + +                MOV     DPTR,#Kb_Str_Buffer +                MOV     A,#ASCII_Space +                LCALL   Clear_Str +                MOV     DPTR,#Token_Str +                MOV     A,#StringEnde +                LCALL   Clear_Str + +                POP     Acc +                POP     DPH +                POP     DPL +                RET + + +Init_BitData:   CLR     Kb_Str_Ready +                CLR     Kb_Char_Ready +                CLR     TI_Sample_Chg_Flg +                CLR     TD_Status_Ready +                CLR     TD_Send_Ready +                CLR     Receive_Ready +                SETB    TD_Next_Flg +                CLR     KS_Active_Flg +                CLR     KS_Status_Ready +                CLR     Kb_Dsp_Ready +                CLR     Ext_Dsp_Ready +                CLR     System_Error +                CLR     Sys_Robot_Mode +                CLR     Sys_Keyboard_Mode +                CLR     TID_Done_Flg +                RET + +;-------------------------------------------------------------------------- +; Routine            : Init_Mode +; Parameter          : - +; Rueckgabeparameter : Sys_Robot_Mode, Sys_Keyboard_Mode,System_Error +; +; entscheidet, ob das Programm im TI-Roboter, TI-Fraese oder TI-Tastatur +; laufen muss.                    (SRM /SKM)  (/SRM /SKM)    (SKM) + + +Init_Mode:      PUSH    PSW +                PUSH    DPL +                PUSH    DPH + +                CLR     System_Error + +        if Ass_Keyboard_Only +                SJMP    IM_Keyboard +        elseif +                CLR     Sys_Robot_Mode +                CLR     Sys_Keyboard_Mode +                LCALL   LCD_Clear +                MOV     DPTR,#Screen_Title +                LCALL   LCD_Write_String +                JNB     P3.5,IM_Robot +                JB      P3.4,IM_Error +                MOV     DPTR,#Screen_Drill +                SJMP    IM_End +        endif + +IM_Robot:       JNB     P3.4,IM_Keyboard +                SETB    Sys_Robot_Mode +                MOV     DPTR,#Screen_Robot +                SJMP    IM_End + +IM_Keyboard:    SETB    Sys_Keyboard_Mode +                MOV     DPTR,#Screen_Key +                SJMP    IM_End + +IM_Error:       SETB    System_Error +                MOV     DPTR,#Screen_Error + +IM_End:         LCALL   LCD_Write_String +                LCALL   Wait_2s + +                POP     DPH +                POP     DPL +                POP     PSW +                RET + +Screen_Title:   DB      "****       TEACH-IN UNIT v1.0       ****",00 +Screen_Drill:   DB      "               Drill mode",00 +Screen_Robot:   DB      "               Robot mode",00 +Screen_Key:     DB      "             Keyboard  mode",00 +Screen_Error:   DB      "   ERROR : Incorrect micro-controller",00 + +;-------------------------------------------------------------------------- + +Init_Int:       Init_Vektor     INT0_VEKTOR,Keyb_Sampler +                Init_Interrupt  INT0_VEKTOR,Falling_Edge,Param_On +                Init_Vektor     ICT0_VEKTOR,TeachIn_Sampler +                Init_Interrupt  ICT0_VEKTOR,Nope,Param_On +                RET + +;-------------------------------------------------------------------------- + + +Init_Net:       PUSH    Acc +                PUSH    DPL +                PUSH    DPH + +                MOV     DPTR,#MESSAGE_INTERRUPT         ;Receive_Sampler +                LCALL   Set_CallBack_Adress +                MOV     DPTR,#Adr_Table +                JB      Sys_Keyboard_Mode,Init_Net_Key +                JNB     Sys_Robot_Mode,Init_Net_Frs + +Init_Net_Rob:   MOV     A,#TeachRob +                SJMP    Init_Net_End + +Init_Net_Frs:   MOV     A,#TeachFrs +                SJMP    Init_Net_End + +Init_Net_Key:   MOV     A,#TeachKey + +Init_Net_End:   MOVC    A,@A+DPTR +                MOV     My_Slave_Adr,A +                LCALL   Set_My_Adress + +                POP     DPH +                POP     DPL +                POP     Acc +                RET + +;-------------------------------------------------------------------------- + +Init_Timer:     MOV     TH0,#00 +                MOV     TL0,#00 +                MOV     TMOD,#00110001b         ; T1 : Off, T0 : 16 Bit Timer +                SETB    TR0                     ; T0 einschalten +                RET + +;-------------------------------------------------------------------------- +; Routine            : LCD_Controller +; Parameter          : Ext_Dsp_Ready   -> DPTR +;                      TD_Status_Ready -> Text_Dec_Status +;                      KS_Status_Ready -> Kb_Search_Status +; Rueckgabeparameter : - +; wenn Ext_Dsp_Ready gesetzt wird, zeigt den mit DPTR gezeigten String +; auf den Bildschirm an. +; wenn TD_Status_Ready (bzw KS_Status_Ready) gesetzt wird, zeigt die +; entsprechende Meldung von Text_Dec_Status (bzw Kb_Search_Status) +; + +LCD_Controller: PUSH    PSW +                PUSH    Acc +                PUSH    AR0 +                PUSH    AR1 +                PUSH    DPL +                PUSH    DPH +                LCALL   LCD_Home + +                JNB     Ext_Dsp_Ready,LCD_Str_Buffer +                CLR     Ext_Dsp_Ready +                MOV     A,#40h +                LCALL   LCD_Set_DD_RAM_Address +                MOV     R1,#Kb_Max_Length + +LCD_Ext_Loop:   MOVX    A,@DPTR +                LCALL   LCD_Write_Char +                INC     DPTR +                DJNZ    R1,LCD_Ext_Loop +                LCALL   LCD_Home + +LCD_Str_Buffer: JNB     Kb_Dsp_Ready,LCD_TD_Status +                CLR     Kb_Dsp_Ready +                MOV     DPTR,#Kb_Str_Buffer +                MOV     R1,#Kb_Max_Length + +LCD_Str_Loop:   MOVX    A,@DPTR +                LCALL   LCD_Write_Char +                INC     DPTR +                DJNZ    R1,LCD_Str_Loop + +LCD_TD_Status:  JNB     TD_Status_Ready,LCD_KS_Status +                CLR     TD_Status_Ready + +                MOV     A,#40 +                LCALL   LCD_Set_DD_RAM_Address +                MOV     DPTR,#LCD_TD_Table +                MOV     R0,Text_Dec_Status +                CJNE    R0,#00,LCD_TD_Loop +                SJMP    LCD_TD_Cont + +LCD_TD_Loop:    MOV     A,#41 +                ADD     A,DPL +                MOV     DPL,A +                MOV     A,DPH +                ADDC    A,#00 +                MOV     DPH,A +                DJNZ    R0,LCD_TD_Loop + +LCD_TD_Cont:    LCALL   LCD_Write_String + +LCD_KS_Status:  JNB     KS_Status_Ready,LCD_End +                CLR     KS_Status_Ready + +                MOV     A,#40 +                LCALL   LCD_Set_DD_RAM_Address +                MOV     DPTR,#LCD_KS_Table +                MOV     R0,Kb_Search_Status +                CJNE    R0,#00,LCD_KS_Loop +                SJMP    LCD_KS_Cont + +LCD_KS_Loop:    MOV     A,#41 +                ADD     A,DPL +                MOV     DPL,A +                MOV     A,DPH +                ADDC    A,#00 +                MOV     DPH,A +                DJNZ    R0,LCD_KS_Loop + +LCD_KS_Cont:    LCALL   LCD_Write_String + +LCD_End:        MOV     A,Kb_Cursor +                LCALL   LCD_Set_DD_RAM_Address + +                POP     DPH +                POP     DPL +                POP     AR1 +                POP     AR0 +                POP     Acc +                POP     PSW +                RET + +LCD_TD_Table:   DB      "Edit OK : Sending                       ",00 +                DB      "Edit ERROR : message waited             ",00 +                DB      "Edit ERROR : incorrect message          ",00 +                DB      "Edit ERROR : more parameters waited     ",00 +                DB      "Edit ERROR : parameter range            ",00 +                DB      "Edit ERROR : module name waited         ",00 +                DB      "Edit ERROR : incorrect module name      ",00 +                DB      "Edit WARNING : too many parameters      ",00 + +LCD_KS_Table:   DB      "Text editing                            ",00 +                DB      "Search : Choose a module                ",00 +                DB      "Search : Choose a module, reached TOP   ",00 +                DB      "Search : Choose a module, reached BOTT. ",00 +                DB      "Search : Choose a message               ",00 +                DB      "Search : Choose a message, reached TOP  ",00 +                DB      "Search : Choose a message, reached BOTT.",00 +                DB      "Search : Incorrect module               ",00 +                DB      "Search : No choice available            ",00 + +;-------------------------------------------------------------------------- + +Keyb_Sampler: +                MOV     Kb_Char_Buffer,P1 +                SETB    Kb_Char_Ready +                RETI + +;-------------------------------------------------------------------------- +; Routine            : Keyb_Controller +; Parameter          : Kb_Char_Ready            ; (Buchstabe im Buffer) +;                      Kb_Char_Buffer           ; (zu verarbeitender Buchstabe) +;                      Kb_Cursor                ; (Cursorposition auf LCD) +;                      KS_Active_Flg            ; (Keyb. Search Modus) +;                      Kb_Str_Buffer            ; (Text Buffer f. Tastatur) +;                      TD_Next_Flg              ; Text_Decoder ist fertig +; Rueckgabeparameter : Kb_Cursor +;                      KS_Active_Flg +;                      Kb_Str_Buffer +;                      Kb_Str_Ready             ; (->Text_Decoder : String verarbeiten) +;                      Kb_Search_Status         ; (Keyb. Search Zustand) +;                      KS_Status_Ready          ; (-> LCD : Zustand anzeigen) +; +; Verwaltet Kb_Str_Buffer nach der Tastatur-Eingaben + + +Keyb_Controller: +                PUSH    Acc +                PUSH    PSW +                PUSH    DPL +                PUSH    DPH + +                CLR     Kb_Char_Ready +                MOV     A,Kb_Char_Buffer + +                JNB     TD_Next_Flg,Kb_Ctrl_UP +                CLR     TD_Next_Flg +Kb_Ctrl_Test1:  CJNE    A,#ASCII_Left,Kb_Ctrl_Test2 +                SJMP    Kb_Ctrl_Old +Kb_Ctrl_Test2:  CJNE    A,#ASCII_Right,Kb_Ctrl_Test3 +                SJMP    Kb_Ctrl_Old +Kb_Ctrl_Test3:  CJNE    A,#ASCII_BkSpc,Kb_Ctrl_Test4 +                SJMP    Kb_Ctrl_Old +Kb_Ctrl_Test4:  CJNE    A,#ASCII_CR,Kb_Ctrl_New + + +Kb_Ctrl_Old:    MOV     Kb_Search_Status,#KSS_Off +                SETB    KS_Status_Ready +                LJMP    Kb_Ctrl_Up + +Kb_Ctrl_New:    PUSH    Acc +                MOV     A,#ASCII_Space +                MOV     DPTR,#Kb_Str_Buffer +                LCALL   Clear_Str +                MOV     Kb_Cursor,#00 +                MOV     Kb_Search_Status,#KSS_Off +                SETB    KS_Status_Ready +                POP     Acc + +Kb_Ctrl_UP:     CJNE    A,#ASCII_Up,Kb_Ctrl_DOWN +                LCALL   Kb_Search_Up +                LJMP    Kb_Ctrl_End + +Kb_Ctrl_DOWN:   CJNE    A,#ASCII_Down,Kb_Ctrl_RET +                LCALL   Kb_Search_Down +                LJMP    Kb_Ctrl_End + +Kb_Ctrl_RET:    CLR     KS_Active_Flg +                CJNE    A,#ASCII_CR,Kb_Ctrl_LEFT +                SETB    Kb_Str_Ready +                LJMP    Kb_Ctrl_End + +Kb_Ctrl_LEFT:   CJNE    A,#ASCII_Left,Kb_Ctrl_RIGHT +                LCALL   Exe_LEFT +                LJMP    Kb_Ctrl_End + +Kb_Ctrl_RIGHT:  CJNE    A,#ASCII_Right,Kb_Ctrl_DEL +                LCALL   Exe_RIGHT +                LJMP    Kb_Ctrl_End + +Kb_Ctrl_DEL:    CJNE    A,#ASCII_Del,Kb_Ctrl_BKSPC +                LCALL   Exe_DEL +                LJMP    Kb_Ctrl_End + +Kb_Ctrl_BKSPC:  CJNE    A,#ASCII_BkSpc,Kb_Ctrl_ESC +                LCALL   Exe_LEFT +                LCALL   Exe_DEL +                LJMP    Kb_Ctrl_End + +Kb_Ctrl_ESC:    CJNE    A,#ASCII_Esc,Kb_Ctrl_Alpha +                MOV     DPTR,#Kb_Str_Buffer +                MOV     A,#ASCII_Space +                LCALL   Clear_Str +                MOV     Kb_Cursor,#00 +                LJMP    Kb_Ctrl_End + +Kb_Ctrl_Alpha:  LCALL   Exe_Set_Actual_Letter +                MOV     A,Kb_Char_Buffer +                MOVX    @DPTR,A +                LCALL   Exe_RIGHT + +Kb_Ctrl_End:    SETB    Kb_Dsp_Ready +                POP     DPH +                POP     DPL +                POP     PSW +                POP     Acc +                RET + +;-------------------------------------------------------------------------- + +Exe_Set_Actual_Letter:                          ; laedt in DPTR die externale Adresse +                PUSH    Acc                     ; des vom Kb_Cursor gezeigten Zeichens +                PUSH    PSW +                MOV     A,Kb_Cursor +                MOV     DPTR,#Kb_Str_Buffer +                ADD     A,DPL +                MOV     DPL,A +                JNC     ESAL_End +                INC     DPH +ESAL_End:       POP     PSW +                POP     Acc +                RET + +Exe_LEFT:       PUSH    AR1                     ; dekr. Kb_Cursor +                DEC     Kb_Cursor +                MOV     R1,Kb_Cursor +                CJNE    R1,#0FFh,Exe_LEFT_End +                MOV     Kb_Cursor,#00 +Exe_LEFT_End:   POP     AR1 +                RET + +Exe_RIGHT:      PUSH    Acc                     ; inkr. Kb_Cursor +                PUSH    PSW +                INC     Kb_Cursor +                CLR     C +                MOV     A,#Kb_Max_Length-1 +                SUBB    A,Kb_Cursor +                JNC     Exe_RIGHT_End +                MOV     Kb_Cursor,#Kb_Max_Length-1 +Exe_RIGHT_End:  POP     PSW +                POP     Acc +                RET + +Exe_DEL:        PUSH    Acc                     ; loescht aktuelles Zeichen +                LCALL   Exe_Set_Actual_Letter +                MOV     A,#ASCII_Space +                MOVX    @DPTR,A +                POP     Acc +                RET + +;-------------------------------------------------------------------------- +; Routine            : Kb_Init_Search +; Parameter          : Kb_Str_Buffer +;                      Kb_Cursor +; Rueckgabeparameter : KS_Status_Ready +;                      Kb_Search_Status +;                      KS_Active_Flg +;                      KS_Actual_Module +;                      Kb_Search_DPL +;                      Kb_Search_DPH +;                      KS_Cursor +; +; Sucht, auf welchem Wort der Cursor sich befindet und zeigt das erste ent- +; sprechende Element aus der Search-Menu-Tabelle (zB : wenn Cursor auf Message, +; sucht die erste Message fuer das schon eingetragene Modul). + + +Kb_Init_Search: PUSH    Acc +                PUSH    B +                PUSH    PSW +                PUSH    DPL +                PUSH    DPH + +                LCALL   Kb_Valid_Word +                MOV     A,KS_Actual_Word +                CJNE    A,#1,KIS_Msg                    ; Cursor auf 1. Wort -> Modul + +                MOV     Kb_Search_DPL,#(Module_Table # 256) +                MOV     Kb_Search_DPH,#(Module_Table / 256) +                LCALL   Search_Next_Module +                JC      KIS_No_Choice                   ; springt wenn noch kein Modul in der Tabelle +                MOV     DPTR,#Kb_Str_Buffer             ; +                MOV     A,#ASCII_Space                  ; loescht Kb_Str_Buffer +                LCALL   Clear_Str                       ; +                MOV     Kb_Cursor,#00                   ; +                MOV     DPL,Kb_Search_DPL +                MOV     DPH,Kb_Search_DPH +                INC     DPTR +                INC     DPTR +                MOV     Kb_Search_Status,#KSS_Mod +                SJMP    KIS_Found + +KIS_Msg:        CJNE    A,#2,KIS_No_Choice +                MOV     Kb_Str_Pointer,#00              ; Cursor auf 2. Wort -> Message +                LCALL   Get_Token +                LCALL   Is_Token_Module +                JNC     KIS_Mod_Corr +                MOV     Kb_Search_Status,#KSS_Inc_Mod   ; erstes Wort kein Korrektes Modul +                SJMP    KIS_End + +KIS_Mod_Corr:   MOV     Kb_Cursor,Kb_Str_Pointer +                LCALL   Exe_Right                       ; ein Leerzeichen nach dem 1. Wort lassen +                MOV     KS_Actual_Module,A              ; Modulnummer abspeichern +                MOV     Kb_Search_DPL,#(Stat_Table # 256) +                MOV     Kb_Search_DPH,#(Stat_Table / 256) +                LCALL   Search_Next_Msg +                JC      KIS_No_Choice                   ; existiert Message fuer dieses Modul ? +                MOV     DPTR,#Kb_Str_Buffer             ; Ja -> Mess. in Textbuffer kopieren +                MOV     A,#ASCII_Space +                MOV     B,Kb_Cursor +                LCALL   Clear_Pos_Str                   ; Kb_Str_Buffer ab der Cursorposition loeschen +                MOV     DPL,Kb_Search_DPL +                MOV     DPH,Kb_Search_DPH +                INC     DPTR +                INC     DPTR +                INC     DPTR +                MOV     Kb_Search_Status,#KSS_Msg +                SJMP    KIS_Found + +KIS_No_Choice:  MOV     Kb_Search_Status,#KSS_No_Choice ; Nein -> Fehlermeldung +                SJMP    KIS_End + +KIS_Found:      MOV     KS_Cursor,Kb_Cursor             ; kopiert das gefundene Element +                LCALL   Copy_Pos_Buffer                 ; in Kb_Str_Buffer ab KS_Cursor +                SETB    KS_Active_Flg                   ; + +KIS_End:        SETB    KS_Status_Ready +                POP     DPH +                POP     DPL +                POP     PSW +                POP     B +                POP     Acc +                RET + +;-------------------------------------------------------------------------- +; Routine            : Kb_Valid_Word +; Parameter          : Kb_Str_Buffer +;                      Kb_Cursor +; Rueckgabeparameter : KS_Actual_Word +; +; Sucht auf welchem Wort der Cursor sich befindet + + +Kb_Valid_Word:  PUSH    Acc +                PUSH    PSW +                PUSH    DPL +                PUSH    DPH + +                MOV     DPTR,#Kb_Str_Buffer +                MOV     Kb_Str_Pointer,#00 +                MOV     KS_Actual_Word,#00 + +KVW_Loop:       LCALL   Get_Token +                INC     KS_Actual_Word +                CLR     C +                MOV     A,Kb_Str_Pointer +                SUBB    A,Kb_Cursor             ; wenn Kb_Str_Pointer > Kb_Cursor +                JC      KVW_Loop                ; hat man das richtige Wort gefunden + +                POP     DPH +                POP     DPL +                POP     PSW +                POP     Acc +                RET + +;-------------------------------------------------------------------------- +; Routine            : Kb_Search_Up +; Parameter          : KS_Active_Flg +;                      Kb_Search_DPL +;                      Kb_Search_DPH +;                      KS_Cursor +; Rueckgabeparameter : KS_Active_Flg +;                      Kb_Search_DPL +;                      Kb_Search_DPH +; +; Legt fest, ob die Search-Routinen initialisiert werden muessen, ob das vorhergehende +; Modul, oder Message, abgeholt werden muss. + + +Kb_Search_Up:   PUSH    Acc +                PUSH    PSW +                PUSH    DPL +                PUSH    DPH + +                JB      KS_Active_Flg,KSU_Choose        ; Schon im Search-Modus ? +                LCALL   Kb_Init_Search                  ; Nein -> Initialisierung +                SJMP    KSU_End + +KSU_Choose:     MOV     A,KS_Actual_Word                ; Ja -> auf welchem Wort liegt der Cursor ? +                CJNE    A,#1,KSU_Msg +                LCALL   Search_Prev_Module              ; 1. Wort -> sucht Modul +                JC      KSU_Mod_Top                     ; gefunden ? +                MOV     Kb_Search_Status,#KSS_Mod       ; Ja -> DPTR retten +                MOV     DPL,Kb_Search_DPL +                MOV     DPH,Kb_Search_DPH +                INC     DPTR +                INC     DPTR +                SJMP    KSU_Show + +KSU_Mod_Top:    MOV     Kb_Search_Status,#KSS_Mod_Top   ; Nein -> Top of list +                SJMP    KSU_End + +KSU_Msg:        LCALL   Search_Prev_Msg                 ; 2. Wort -> sucht Message +                JC      KSU_Msg_Top                     ; gefunden ? +                MOV     Kb_Search_Status,#KSS_Msg       ; Ja -> DPTR retten +                MOV     DPL,Kb_Search_DPL +                MOV     DPH,Kb_Search_DPH +                INC     DPTR +                INC     DPTR +                INC     DPTR +                SJMP    KSU_Show + +KSU_Msg_Top:    MOV     Kb_Search_Status,#KSS_Msg_Top   ; Nein -> Top of list +                SJMP    KSU_End + +KSU_Show:       MOV     Kb_Cursor,KS_Cursor             ; gefundenes Wort in Textbuffer +                PUSH    DPL                             ; kopieren +                PUSH    DPH +                MOV     DPTR,#Kb_Str_Buffer +                MOV     A,#ASCII_Space +                MOV     B,Kb_Cursor +                LCALL   Clear_Pos_Str +                POP     DPH +                POP     DPL +                LCALL   Copy_Pos_Buffer + +KSU_End:        SETB    KS_Status_Ready +                POP     DPH +                POP     DPL +                POP     PSW +                POP     Acc +                RET + +;-------------------------------------------------------------------------- +; Routine            : Kb_Search_Down +; Parameter          : KS_Active_Flg +;                      Kb_Search_DPL +;                      Kb_Search_DPH +;                      KS_Cursor +; Rueckgabeparameter : KS_Active_Flg +;                      Kb_Search_DPL +;                      Kb_Search_DPH +; +; Legt fest, ob die Search-Routinen initialisiert werden muessen, ob das naechste +; Modul, oder Message, abgeholt werden muss. + + +Kb_Search_Down: PUSH    Acc +                PUSH    PSW +                PUSH    DPL +                PUSH    DPH + +                JB      KS_Active_Flg,KSD_Choose        ; schon im Search Modus ? +                LCALL   Kb_Init_Search                  ; Nein -> Initialisierung +                SJMP    KSD_End + +KSD_Choose:     MOV     A,KS_Actual_Word                ; Ja -> welches Wort ? +                CJNE    A,#1,KSD_Msg +                LCALL   Search_Next_Module              ; 1. Wort -> sucht naechstes Modul +                JC      KSD_Mod_Bot                     ; gefunden ? +                MOV     Kb_Search_Status,#KSS_Mod       ; Ja -> DPTR retten +                MOV     DPL,Kb_Search_DPL +                MOV     DPH,Kb_Search_DPH +                INC     DPTR +                INC     DPTR +                SJMP    KSD_Show + +KSD_Mod_Bot:    MOV     Kb_Search_Status,#KSS_Mod_Bot   ; Nein -> bottom of list +                SJMP    KSD_End + +KSD_Msg:        LCALL   Search_Next_Msg                 ; 2. Wort -> sucht naechste Message +                JC      KSD_Msg_Bot                     ; gefunden ? +                MOV     Kb_Search_Status,#KSS_Msg       ; Ja -> DPTR retten +                MOV     DPL,Kb_Search_DPL +                MOV     DPH,Kb_Search_DPH +                INC     DPTR +                INC     DPTR +                INC     DPTR +                SJMP    KSD_Show + +KSD_Msg_Bot:    MOV     Kb_Search_Status,#KSS_Msg_Bot   ; Nein -> bottom of list +                SJMP    KSD_End + +KSD_Show:       MOV     Kb_Cursor,KS_Cursor             ; gefundenes Wort in Textbuffer +                PUSH    DPL                             ; kopieren +                PUSH    DPH +                MOV     DPTR,#Kb_Str_Buffer +                MOV     A,#ASCII_Space +                MOV     B,Kb_Cursor +                LCALL   Clear_Pos_Str +                POP     DPH +                POP     DPL +                LCALL   Copy_Pos_Buffer + +KSD_End:        SETB    KS_Status_Ready +                POP     DPH +                POP     DPL +                POP     PSW +                POP     Acc +                RET + +;-------------------------------------------------------------------------- +; Routine            : Search_Next_Module +; Parameter          : Kb_Search_DPL +;                      Kb_Search_DPH +; Rueckgabeparameter : C  (gesetzt -> nicht gefunden) +;                      Kb_Search_DPL +;                      Kb_Search_DPH +; +; Sucht naechstes Modul ab aktueller Position in der Tabelle (durch KB_Search_DPL +; (DPH) gespeichert) + + +Search_Next_Module: +                PUSH    Acc +                PUSH    DPL +                PUSH    DPH + +                MOV     DPL,Kb_Search_DPL       ; aktuelle Pos. in DPTR laden +                MOV     DPH,Kb_Search_DPH +                MOV     A,#1 +                MOVC    A,@A+DPTR +                ADD     A,DPL                   ; DPTR mit Offset addieren +                MOV     DPL,A +                JNC     SNMod_Cont +                INC     DPH +SNMod_Cont:     CLR     C +                CLR     A +                MOVC    A,@A+DPTR +                XRL     A,#TableEnd +                JZ      SNMod_End               ; Ende der Tabelle ? +                MOV     Kb_Search_DPL,DPL       ; Nein -> DPTR retten +                MOV     Kb_Search_DPH,DPH +                CPL     C + +SNMod_End:      CPL     C                       ; Ja -> nicht gefunden +                POP     DPH +                POP     DPL +                POP     Acc +                RET + +;-------------------------------------------------------------------------- +; Routine            : Search_Prev_Module +; Parameter          : Kb_Search_DPL +;                      Kb_Search_DPH +; Rueckgabeparameter : C  (gesetzt -> nicht gefunden) +;                      Kb_Search_DPL +;                      Kb_Search_DPH +; +; Sucht vorhergehendes Modul ab aktueller Position in der Tabelle (durch KB_Search_DPL +; (DPH) gespeichert). Analog zu Search_Next_Module + + +Search_Prev_Module: +                PUSH    Acc +                PUSH    AR1 +                PUSH    DPL +                PUSH    DPH + +                MOV     DPL,Kb_Search_DPL +                MOV     DPH,Kb_Search_DPH +                DEC_DPTR +                CLR     A +                MOVC    A,@A+DPTR +                INC     DPTR +                CLR     C +                MOV     R1,A +                MOV     A,DPL +                SUBB    A,R1 +                MOV     DPL,A +                JNC     SPMod_Cont +                DEC     DPH +SPMod_Cont:     CLR     C +                CLR     A +                MOVC    A,@A+DPTR +                XRL     A,#TableAnf +                JZ      SPMod_End +                MOV     Kb_Search_DPL,DPL +                MOV     Kb_Search_DPH,DPH +                CPL     C + +SPMod_End:      CPL     C +                POP     DPH +                POP     DPL +                POP     AR1 +                POP     Acc +                RET + +;-------------------------------------------------------------------------- +; Routine            : Search_Next_Msg +; Parameter          : Kb_Search_DPL +;                      Kb_Search_DPH +;                      KS_Actual_Module +; Rueckgabeparameter : C  (gesetzt -> nicht gefunden) +;                      Kb_Search_DPL +;                      Kb_Search_DPH +; +; Sucht naechste Message ab aktueller Position in der Tabelle (durch KB_Search_DPL +; (DPH) gespeichert), die KS_Actual_Module entspricht + + +Search_Next_Msg: +                PUSH    Acc +                PUSH    DPL +                PUSH    DPH + +                MOV     DPL,Kb_Search_DPL       ; aktuelle Pos. in DPTR laden +                MOV     DPH,Kb_Search_DPH + +SNMsg_Loop:     MOV     A,#1 +                MOVC    A,@A+DPTR +                ADD     A,DPL                   ; DPTR und Offset addieren +                MOV     DPL,A +                JNC     SNMsg_Cont +                INC     DPH +SNMsg_Cont:     CLR     C +                CLR     A +                MOVC    A,@A+DPTR +                CJNE    A,#TableEnd,SNMsg_Mod   ; Ende der Tabelle ? +                SETB    C                       ; Ja -> nicht gefunden +                SJMP    SNMsg_End +SNMsg_Mod:      CJNE    A,KS_Actual_Module,SNMsg_Loop ; Nein -> Modulnummer korrekt ? +                                                      ;         Nein -> sucht weiter +                MOV     Kb_Search_DPL,DPL             ;         Ja -> DPTR retten +                MOV     Kb_Search_DPH,DPH +                CLR     C + +SNMsg_End:      POP     DPH +                POP     DPL +                POP     Acc +                RET + +;-------------------------------------------------------------------------- +; Routine            : Search_Prev_Msg +; Parameter          : Kb_Search_DPL +;                      Kb_Search_DPH +;                      KS_Actual_Module +; Rueckgabeparameter : C  (gesetzt -> nicht gefunden) +;                      Kb_Search_DPL +;                      Kb_Search_DPH +; +; Sucht vorhergehende Message ab aktueller Position in der Tabelle (durch KB_Search_DPL +; (DPH) gespeichert), die KS_Actual_Module entspricht. Analog zu Search_Next_Msg + + +Search_Prev_Msg: +                PUSH    Acc +                PUSH    DPL +                PUSH    DPH +                PUSH    AR1 + +                MOV     DPL,Kb_Search_DPL +                MOV     DPH,Kb_Search_DPH + +SPMsg_Loop:     DEC_DPTR +                CLR     A +                MOVC    A,@A+DPTR +                INC     DPTR +                CLR     C +                MOV     R1,A +                MOV     A,DPL +                SUBB    A,R1 +                MOV     DPL,A +                JNC     SPMsg_Cont +                DEC     DPH +SPMsg_Cont:     CLR     C +                CLR     A +                MOVC    A,@A+DPTR +                CJNE    A,#TableAnf,SPMsg_Mod +                SETB    C +                SJMP    SPMsg_End +SPMsg_Mod:      CJNE    A,KS_Actual_Module,SPMsg_Loop +                MOV     Kb_Search_DPL,DPL +                MOV     Kb_Search_DPH,DPH +                CLR     C + +SPMsg_End:      POP     AR1 +                POP     DPH +                POP     DPL +                POP     Acc +                RET + +;-------------------------------------------------------------------------- +; Routine            : Text_Decoder +; Parameter          : Kb_Str_Buffer +; Rueckgabeparameter : Msg_Registers +;                      Text_Dec_Status +;                      TD_Status_Ready +;                      TD_Send_Ready +;                      Stat_Module +;                      Stat_Num_Param +;                      Stat_Picture +;                      Stat_Length +;                      Stat_Code +; +; Interpretiert den im Kb_Str_Buffer liegenden Text und legt die entsprechenden +; Werte in Msg_Registers und Stat_ Variablen ab. Wenn korrekter Text, setzt das +; TD_Send_Ready-Flag (ready to send). + + +Text_Decoder:   PUSH    AR0 +                PUSH    AR1 +                PUSH    AR2 +                PUSH    Acc +                PUSH    PSW +                PUSH    DPL +                PUSH    DPH + +                LCALL   Clr_Msg_Buffer +                MOV     Stat_Length,#02 + +                CLR     Kb_Str_Ready +                MOV     Kb_Str_Pointer,#00 +                LCALL   Get_Token               ; sucht 1. Wort +                JNC     TD_Module               ; gefunden ? +                MOV     Text_Dec_Status,#5      ; Nein -> Fehler (fehlendes Modul) +                LJMP    TD_End + +TD_Module:      LCALL   Is_Token_Module         ; Ja -> ist das Modul korrekt ? +                JNC     TD_Statement +                MOV     Text_Dec_Status,#6      ; Nein -> Fehler (inkorrektes Modul) +                LJMP    TD_End + +TD_Statement:   MOV     Stat_Module,A           ; Ja -> Modulnummer abspeichern +                LCALL   Get_Token               ; sucht 2. Wort +                JNC     TD_Stat_Cont            ; gefunden ? +                MOV     Text_Dec_Status,#1      ; Nein -> Fehler (fehlende Message) +                LJMP    TD_End + +TD_Stat_Cont:   MOV     R0,#(Token_Str # 256)   ; Ja -> sucht Message in der Tabelle +                MOV     R1,#(Token_Str / 256) +                MOV     DPTR,#Stat_Table + +TD_Stat_Loop:   CLR     A                       ; +                MOVC    A,@A+DPTR               ; +                CJNE    A,#TableEnd,TD_Stat_Cont2 +                MOV     Text_Dec_Status,#2      ; nur die Messages der Tabelle, die +                LJMP    TD_End                  ; das aktuelle Modul entsprechen, muessen +                                                ; betrachtet werden +TD_Stat_Cont2:  XRL     A,Stat_Module           ; +                JZ      TD_Stat_Check           ; + +TD_Stat_Next:   MOV     A,#01                   ; +                MOVC    A,@A+DPTR               ; +                ADD     A,DPL                   ; sucht naechste Message in der +                MOV     DPL,A                   ; Tabelle +                JNC     TD_Stat_Loop            ; +                INC     DPH                     ; +                SJMP    TD_Stat_Loop            ; + +TD_Stat_Check:  INC     DPTR +                INC     DPTR +                CLR     A +                MOVC    A,@A+DPTR +                MOV     Stat_Code,A +                INC     DPTR + +                LCALL   Compare_Str             ; Text und Message in der Tabelle +                JNC     TD_Parameters           ; vergleichen +                DEC_DPTR +                DEC_DPTR +                DEC_DPTR +                SJMP    TD_Stat_Next            ; nicht gleich -> next one ! + +TD_Parameters:  LCALL   Jump_Blank_Str          ; gleich -> Parameter dekodieren +                MOV     R0,#Msg_Registers +                MOV     @R0,Stat_Module + +                INC     R0 +                MOV     @R0,Stat_Code + +                INC     DPTR +                CLR     A +                MOVC    A,@A+DPTR +                MOV     Stat_Num_Param,A +                MOV     R1,A +                JZ      TD_Send + +                INC     DPTR +                CLR     A +                MOVC    A,@A+DPTR +                MOV     Stat_Picture,A +                INC     R0 + +TD_Par_Loop:    LCALL   Get_Token +                JNC     TD_Par_Symbol +                MOV     Text_Dec_Status,#3 +                LJMP    TD_End + +TD_Par_Symbol:  CLR     C +                LCALL   Is_Token_Symbol +                JC      TD_Par_Digit +                MOV     ASCII_Low_Byte,A +                MOV     ASCII_High_Byte,#00 +                SJMP    TD_Par_Load + +TD_Par_Digit:   CLR     C +                LCALL   ASCII_To_Bin +                JNC     TD_Par_Load +                MOV     Text_Dec_Status,#4 +                SJMP    TD_End + +TD_Par_Load:    MOV     A,Stat_Picture +                JB      Acc.0,TD_Par_Single +                MOV     @R0,ASCII_High_Byte +                MOV     ASCII_High_Byte,#00 +                INC     R0 +                INC     Stat_Length + +TD_Par_Single:  MOV     R2,ASCII_High_Byte +                CJNE    R2,#00,TD_Par_Error +                MOV     @R0,ASCII_Low_Byte +                INC     R0 +                INC     Stat_Length +                RR      A +                MOV     Stat_Picture,A +                DJNZ    R1,TD_Par_Loop + +TD_Send:        MOV     Text_Dec_Status,#0 +                SETB    TD_Send_Ready +                LCALL   Get_Token +                JC      TD_End +                MOV     Text_Dec_Status,#7 +                SJMP    TD_End + +TD_Par_Error:   MOV     Text_Dec_Status,#4 + +TD_End:         SETB    TD_Status_Ready +                SETB    TD_Next_Flg +                POP     DPH +                POP     DPL +                POP     PSW +                POP     Acc +                POP     AR2 +                POP     AR1 +                POP     AR0 +                RET + +;-------------------------------------------------------------------------- + +Get_Token:      PUSH    Acc +                PUSH    P2 +                PUSH    DPL +                PUSH    DPH +                PUSH    AR0 +                PUSH    AR1 +                PUSH    AR2 + +                MOV     DPTR,#Token_Str +                CLR     A +                LCALL   Clear_Str +                MOV     DPTR,#Kb_Str_Buffer +                MOV     A,#Kb_Max_Length        ; +                CLR     C                       ; +                SUBB    A,Kb_Str_Pointer        ; +                JNZ     GT_Cont                 ; R2 = Anzahl der noch +                SETB    C                       ; zuverarbeitenden +                SJMP    GT_End                  ; Buchstaben +                                                ; +GT_Cont:        MOV     R2,A                    ; +                MOV     A,DPL +                ADD     A,Kb_Str_Pointer +                MOV     DPL,A +                JNC     GT_Blank_Loop +                INC     DPH + +GT_Blank_Loop:  MOVX    A,@DPTR +                CJNE    A,#ASCII_Space,GT_Text +                INC     DPTR +                INC     Kb_Str_Pointer +                DJNZ    R2,GT_Blank_Loop +                SETB    C +                SJMP    GT_End + +GT_Text:        MOV     R0,#(Token_Str # 256) +                MOV     R1,#(Token_Str / 256) + +GT_Text_Loop:   MOVX    A,@DPTR +                CJNE    A,#ASCII_Space,GT_Text_Add +                CLR     C +                SJMP    GT_End + +GT_Text_Add:    LCALL   UpCase +                MOV     P2,R1 +                MOVX    @R0,A +                INC     Kb_Str_Pointer +                INC_R0R1 +                INC     DPTR +                DJNZ    R2,GT_Text_Loop +                CLR     C + +GT_End:         POP     AR2 +                POP     AR1 +                POP     AR0 +                POP     DPH +                POP     DPL +                POP     P2 +                POP     Acc +                RET + +;-------------------------------------------------------------------------- + +Compare_Str:    IRP     Source,Acc,P2,DPL,DPH,AR0,AR1,AR2,AR3 +                PUSH    Source +                ENDM + +                CLR     C +                MOV     R2,#Kb_Max_Length + +                CLR     A +                MOVC    A,@A+DPTR +                CJNE    A,#StringEnde,Comp_Loop +                SJMP    Comp_False + +Comp_Loop:      MOV     R3,A +                MOV     P2,R1 +                MOVX    A,@R0 +                XRL     A,R3 +                JNZ     Comp_False +                MOV     A,R3 +                JZ      Comp_End +                INC     DPTR +                INC_R0R1 +                CLR     A +                MOVC    A,@A+DPTR +                DJNZ    R2,Comp_Loop +                CPL     C + +Comp_False:     CPL     C + +Comp_End:       IRP     Target,AR3,AR2,AR1,AR0,DPH,DPL,P2,Acc +                POP     Target +                ENDM +                RET + +;-------------------------------------------------------------------------- +TeachIn_Sampler: +                PUSH    Acc +                PUSH    PSW +                PUSH    AR1 +                MOV     TH0,#0FCh + +                MOV     Temp_P4,P4 +                MOV     Temp_P5,P5 +                MOV     A,Temp_P4 +                XRL     A,Save_P4 +                JNZ     TI_Smp_Edge +                MOV     A,Temp_P5 +                XRL     A,Save_P5 +                JZ      TI_Smp_Inc + +TI_Smp_Edge:    MOV     TI_Sample_Counter,#00 +                MOV     Save_P4,Temp_P4 +                MOV     Save_P5,Temp_P5 +                SJMP    TI_Smp_End + +TI_Smp_Inc:     INC     TI_Sample_Counter +                MOV     A,TI_Sample_Counter +                CJNE    A,#TI_Sample_Valid_Time,TI_Smp_End +                MOV     TI_Sample_Counter,#00 +                MOV     A,Old_P4 +                XRL     A,Save_P4 +                JNZ     TI_Smp_Change +                MOV     A,Old_P5 +                XRL     A,Save_P5 +                JZ      TI_Smp_End + +TI_Smp_Change:  SETB    TI_Sample_Chg_Flg +                JNB     TID_Done_Flg,TISC_No_Init +                CLR     TID_Done_Flg +                MOV     TI_On_P4,#00 +                MOV     TI_Off_P4,#00 +                MOV     TI_On_P5,#00 +                MOV     TI_Off_P5,#00 + +TISC_No_Init:   MOV     A,Old_P4 +                XRL     A,Save_P4 +                MOV     R1,A                    ; R1 = Save_P4 +                MOV     A,Save_P4 +                CPL     A +                ANL     A,R1 +                ORL     A,TI_On_P4 +                MOV     TI_On_P4,A + +                MOV     A,Save_P4 +                ANL     A,R1 +                MOV     TI_Off_P4,A +                MOV     A,Old_P5 +                XRL     A,Save_P5 +                MOV     R1,A +                MOV     A,Save_P5 +                CPL     A +                ANL     A,R1 +                MOV     TI_On_P5,A +                MOV     A,Save_P5 +                ANL     A,R1 +                MOV     TI_Off_P5,A + +                MOV     Old_P4,Save_P4 +                MOV     Old_P5,Save_P5 + +TI_Smp_End:     POP     AR1 +                POP     PSW +                POP     Acc +                RETI + +;-------------------------------------------------------------------------- + +TeachIn_Decoder: +                PUSH    Acc +                PUSH    DPL +                PUSH    DPH + +                CLR     TI_Sample_Chg_Flg +                MOV     A,TI_On_P4 +                JZ      TID_Table2 +                JB      Sys_Robot_Mode,TID_T1_Rob +                MOV     DPTR,#KOn_P4_Frs +                LCALL   TID_Main +                SJMP    TID_Table2 + +TID_T1_Rob:     MOV     DPTR,#KOn_P4_Rob +                LCALL   TID_Main + +TID_Table2:     MOV     A,TI_Off_P4 +                JZ      TID_Table3 +                JB      Sys_Robot_Mode,TID_T2_Rob +                MOV     DPTR,#KOff_P4_Frs +                LCALL   TID_Main +                SJMP    TID_Table3 + +TID_T2_Rob:     MOV     DPTR,#KOff_P4_Rob +                LCALL   TID_Main + +TID_Table3:     MOV     A,TI_On_P5 +                JZ      TID_Table4 +                JB      Sys_Robot_Mode,TID_T3_Rob +                MOV     DPTR,#KOn_P5_Frs +                LCALL   TID_Main +                SJMP    TID_Table4 + +TID_T3_Rob:     MOV     DPTR,#KOn_P5_Rob +                LCALL   TID_Main + +TID_Table4:     MOV     A,TI_Off_P5 +                JZ      TID_End +                JB      Sys_Robot_Mode,TID_T4_Rob +                MOV     DPTR,#KOff_P5_Frs +                LCALL   TID_Main +                SJMP    TID_End + +TID_T4_Rob:     MOV     DPTR,#KOff_P5_Rob +                LCALL   TID_Main + +TID_End:        SETB    TID_Done_Flg + +                POP     DPH +                POP     DPL +                POP     Acc +                RET + +;-------------------------------------------------------------------------- + +TID_Main:       PUSH    Acc +                PUSH    PSW +                PUSH    DPL +                PUSH    DPH +                PUSH    AR0 +                PUSH    AR1 + +                MOV     R1,#8 +TID_Main_Loop:  CLR     C +                RRC     A +                JNC     TID_Main_Next + +                PUSH    Acc +                MOV     A,#1 +                MOVC    A,@A+DPTR +                MOV     R0,A +                POP     Acc +                CJNE    R0,#StringEnde,TID_Main_Msg +                SJMP    TID_Main_Next + +TID_Main_Msg:   PUSH    DPL +                PUSH    DPH +                PUSH    Acc +                MOV     DPTR,#Kb_Str_Buffer +                MOV     A,#ASCII_Space +                LCALL   Clear_Str +                POP     Acc +                POP     DPH +                POP     DPL + +                INC     DPTR +                MOV     Kb_Cursor,#00 +                LCALL   Copy_Pos_Buffer +                SETB    Kb_Str_Ready +                SETB    Kb_Dsp_Ready +                CLR     KS_Active_Flg +                DEC_DPTR +                LCALL   Main_Manager + +TID_Main_Next:  PUSH    Acc +                CLR     A +                MOVC    A,@A+DPTR +                ADD     A,DPL +                MOV     DPL,A +                JNC     TIDM_Next_Cont +                INC     DPH + +TIDM_Next_Cont: POP     Acc +                DJNZ    R1,TID_Main_Loop + +                POP     AR1 +                POP     AR0 +                POP     DPH +                POP     DPL +                POP     PSW +                POP     Acc +                RET + +;-------------------------------------------------------------------------- + +Send_Manager:   PUSH    Acc +                PUSH    B +                PUSH    DPL +                PUSH    DPH +                PUSH    AR0 +                PUSH    PSW + +                CLR     TD_Send_Ready + +Send_Mng_Load:  MOV     R0,#Msg_Registers +                MOV     R0_Bk1,@R0 +                MOV     A,@R0                   ; logische Adresse +                INC     R0 +                MOV     R1_Bk1,@R0 +                INC     R0 +                MOV     R2_Bk1,@R0 +                INC     R0 +                MOV     R3_Bk1,@R0 +                INC     R0 +                MOV     R4_Bk1,@R0 +                INC     R0 +                MOV     R5_Bk1,@R0 +                INC     R0 +                MOV     R6_Bk1,@R0 +                INC     R0 +                MOV     R7_Bk1,@R0 + +                MOV     DPTR,#Adr_Table +                MOVC    A,@A+DPTR +                MOV     B,Stat_Length +                SETB    RS0 +                CLR     RS1 + +                Post_Message + +                POP     PSW +                POP     AR0 +                POP     DPH +                POP     DPL +                POP     B +                POP     Acc +                RET         +;-------------------------------------------------------------------------- + +Receive_Sampler: +                lcall MESSAGE_INTERRUPT +;                SETB    Receive_Ready +                RET + + +Receive_Manager: +                PUSH    Acc +                PUSH    B +                PUSH    PSW + +                CLR     Receive_Ready +                SETB    RS0 +                CLR     RS1 + +                Take_Message +                CLR     RS0 +                MOV     Rcv_Msg_Length,A +                MOV     DPTR,#Net_Rcv_Str +                MOV     A,#ASCII_Space +                LCALL   Clear_Str + +                MOV     A,R1_Bk1 +                LCALL   Bin_To_ASCII +                MOVX    @DPTR,A +                INC     DPTR +                MOV     A,B +                MOVX    @DPTR,A +                INC     DPTR +                MOV     A,#ASCII_Space +                MOVX    @DPTR,A +                INC     DPTR + +                MOV     A,R2_Bk1 +                LCALL   Bin_To_ASCII +                MOVX    @DPTR,A +                INC     DPTR +                MOV     A,B +                MOVX    @DPTR,A +                INC     DPTR +                MOV     A,#ASCII_Space +                MOVX    @DPTR,A +                INC     DPTR + +                MOV     A,R3_Bk1 +                LCALL   Bin_To_ASCII +                MOVX    @DPTR,A +                INC     DPTR +                MOV     A,B +                MOVX    @DPTR,A +                INC     DPTR +                MOV     A,#ASCII_Space +                MOVX    @DPTR,A +                INC     DPTR + +                MOV     A,R4_Bk1 +                LCALL   Bin_To_ASCII +                MOVX    @DPTR,A +                INC     DPTR +                MOV     A,B +                MOVX    @DPTR,A +                INC     DPTR +                MOV     A,#ASCII_Space +                MOVX    @DPTR,A +                INC     DPTR + +                MOV     A,R5_Bk1 +                LCALL   Bin_To_ASCII +                MOVX    @DPTR,A +                INC     DPTR +                MOV     A,B +                MOVX    @DPTR,A +                INC     DPTR +                MOV     A,#ASCII_Space +                MOVX    @DPTR,A +                INC     DPTR + +                MOV     A,R6_Bk1 +                LCALL   Bin_To_ASCII +                MOVX    @DPTR,A +                INC     DPTR +                MOV     A,B +                MOVX    @DPTR,A +                INC     DPTR +                MOV     A,#ASCII_Space +                MOVX    @DPTR,A +                INC     DPTR + +                MOV     A,R7_Bk1 +                LCALL   Bin_To_ASCII +                MOVX    @DPTR,A +                INC     DPTR +                MOV     A,B +                MOVX    @DPTR,A +                INC     DPTR +                MOV     A,#ASCII_Space +                MOVX    @DPTR,A + +                MOV     DPTR,#Net_Rcv_Str +                SETB    Ext_Dsp_Ready + +                POP     PSW +                POP     B +                POP     Acc +                RET + +;=============================== Tools ==================================== + +Is_Token_Symbol: +                PUSH    AR0 +                PUSH    AR1 +                PUSH    AR2 +                PUSH    AR3 +                PUSH    DPL +                PUSH    DPH + +                CLR     C +                MOV     DPTR,#Symbol_Table +                MOV     R0,#(Token_Str # 256) +                MOV     R1,#(Token_Str / 256) + +Is_Symb_Loop:   CLR     A +                MOVC    A,@A+DPTR +                MOV     R3,A            ; Symbolwert +                XRL     A,#TableEnd +                JZ      Is_Symb_Not_Found + +                INC     DPTR +                CLR     A +                MOVC    A,@A+DPTR +                MOV     R2,A            ; Offset + +                INC     DPTR +                LCALL   Compare_Str +                JNC     Is_Symb_Found + +                DEC_DPTR +                DEC_DPTR +                MOV     A,DPL +                ADD     A,R2 +                MOV     DPL,A +                JNC     Is_Symb_Loop +                INC     DPH +                SJMP    Is_Symb_Loop + +Is_Symb_Found:  MOV     A,R3 +                CLR     C +                SJMP    Is_Symb_End + +Is_Symb_Not_Found: +                SETB    C + +Is_Symb_End:    POP     DPH +                POP     DPL +                POP     AR3 +                POP     AR2 +                POP     AR1 +                POP     AR0 +                RET + +;-------------------------------------------------------------------------- + +Is_Token_Module: +                PUSH    AR0 +                PUSH    AR1 +                PUSH    AR2 +                PUSH    AR3 +                PUSH    DPL +                PUSH    DPH + +                CLR     C +                MOV     DPTR,#Module_Table +                MOV     R0,#(Token_Str # 256) +                MOV     R1,#(Token_Str / 256) + +Is_Mod_Loop:    CLR     A +                MOVC    A,@A+DPTR +                MOV     R3,A            ; Modulname +                XRL     A,#TableEnd +                JZ      Is_Mod_Not_Found + +                INC     DPTR +                CLR     A +                MOVC    A,@A+DPTR +                MOV     R2,A            ; Offset + +                INC     DPTR +                LCALL   Compare_Str +                JNC     Is_Mod_Found + +                DEC_DPTR +                DEC_DPTR +                MOV     A,DPL +                ADD     A,R2 +                MOV     DPL,A +                JNC     Is_Mod_Loop +                INC     DPH +                SJMP    Is_Mod_Loop + +Is_Mod_Found:   MOV     A,R3 +                CLR     C +                SJMP    Is_Mod_End + +Is_Mod_Not_Found: +                SETB    C + +Is_Mod_End:     POP     DPH +                POP     DPL +                POP     AR3 +                POP     AR2 +                POP     AR1 +                POP     AR0 +                RET + +;-------------------------------------------------------------------------- + +Bin_To_ASCII:   PUSH    AR0 +                PUSH    DPL +                PUSH    DPH + +                MOV     DPTR,#BTA_Table +                MOV     B,#16 +                DIV     AB +                MOVC    A,@A+DPTR +                MOV     R0,A +                MOV     A,B +                MOVC    A,@A+DPTR +                MOV     B,A +                MOV     A,R0 + +                POP     DPH +                POP     DPL +                POP     AR0 +                RET + +BTA_Table:      DB      "0123456789ABCDEF" + +;-------------------------------------------------------------------------- + +ASCII_To_Bin:   IRP     Source,Acc,P2,DPL,DPH,AR0,AR1,AR2,AR3 +                PUSH    Source +                ENDM + +                MOV     R0,#(Token_Str # 256) +                MOV     R1,#(Token_Str / 256) +                MOV     DPTR,#ATB_Table +                MOV     ASCII_Low_Byte,#00 +                MOV     ASCII_High_Byte,#00 +                MOV     R2,#00 + +ATB_Search:     INC_R0R1 +                INC     R2 +                MOV     P2,R1 +                MOVX    A,@R0 +                JNZ     ATB_Search + +                DEC_R0R1 + +ATB_Loop:       CLR     C +                MOV     P2,R1 +                MOVX    A,@R0 +                LCALL   Is_Digit +                JC      ATB_Not_Digit +                MOV     R3,A +                JZ      ATB_Next + +ATB_Add_Loop:   CLR     A +                MOVC    A,@A+DPTR +                CJNE    A,#0FFh,ATB_Add_Cont +                SJMP    ATB_False +ATB_Add_Cont:   ADD     A,ASCII_Low_Byte +                MOV     ASCII_Low_Byte,A +                MOV     A,#01 +                MOVC    A,@A+DPTR +                ADDC    A,ASCII_High_Byte +                JC      ATB_End +                MOV     ASCII_High_Byte,A +                DJNZ    R3,ATB_Add_Loop + +ATB_Next:       INC     DPTR +                INC     DPTR +                DEC_R0R1 +                DJNZ    R2,ATB_Loop + +                CLR     C                               ; +                MOV     A,ASCII_High_Byte               ; Overflow (+) ? +                MOV     C,Acc.7                         ; +                SJMP    ATB_End                         ; + +ATB_Not_Digit:  CJNE    A,#45,ATB_False +                CJNE    R2,#1,ATB_False +                CLR     C +                CLR     A +                SUBB    A,ASCII_Low_Byte +                MOV     ASCII_Low_Byte,A +                CLR     A +                SUBB    A,ASCII_High_Byte +                MOV     ASCII_High_Byte,A + +                CLR     C                               ; +                MOV     A,ASCII_High_Byte               ; +                MOV     C,Acc.7                         ; Overflow (-) ? +                CPL     C                               ; +                SJMP    ATB_End                         ; + +ATB_False:      SETB    C + +ATB_End:        IRP     Target,AR3,AR2,AR1,AR0,DPH,DPL,P2,Acc +                POP     Target +                ENDM +                RET + +ATB_Table:      DB      001h,000h +                DB      00Ah,000h +                DB      064h,000h +                DB      0E8h,003h +                DB      010h,027h +                DB      0FFh + +;-------------------------------------------------------------------------- + +Jump_Blank_Str: +                PUSH    Acc + +JB_Loop:        MOV     A,#00 +                MOVC    A,@A+DPTR +                JZ      JB_End +                INC     DPTR +                SJMP    JB_Loop + +JB_End:         POP     Acc +                RET + +;-------------------------------------------------------------------------- +;Routine :      Clear_Str +;Parameter:     A (Loeschzeichen) +;               DPTR (zu loeschender String) + +Clear_Str:      PUSH    DPL +                PUSH    DPH +                PUSH    AR1 +                MOV     R1,#Kb_Max_Length +Clear_Str_Loop: MOVX    @DPTR,A +                INC     DPTR +                DJNZ    R1,Clear_Str_Loop +                POP     AR1 +                POP     DPH +                POP     DPL +                RET + +;-------------------------------------------------------------------------- +;Routine :      Clear_Pos_Str  (loescht einen String von Startposition bis Ende) +;Parameter:     DPTR    (zu loeschender String) +;               A       (Loeschzeichen) +;               B       (Startposition) + + +Clear_Pos_Str:  PUSH    Acc +                PUSH    PSW +                PUSH    DPL +                PUSH    DPH +                PUSH    AR1 + +                MOV     R1,B +                CJNE    R1,#Kb_Max_Length,CPS_Cont +                SJMP    CPS_End +CPS_Cont:       PUSH    Acc +                MOV     A,B +                ADD     A,DPL +                MOV     DPL,A +                JNC     CPS_Cont2 +                INC     DPH + +CPS_Cont2:      CLR     C +                MOV     A,#Kb_Max_Length +                SUBB    A,B +                MOV     R1,A +                POP     Acc +                JC      CPS_End +CPS_Loop:       MOVX    @DPTR,A +                INC     DPTR +                DJNZ    R1,CPS_Loop + +CPS_End:        POP     AR1 +                POP     DPH +                POP     DPL +                POP     PSW +                POP     Acc +                RET + +;-------------------------------------------------------------------------- +; Routine :     Copy_Pos_Buffer  (kopiert einen String in Kb_Str_Buffer +;                                 ab Kb_Cursor; dieser zeigt dann nach +;                                 dem letzten Zeichen des Strings) +; Parameter:    DPTR (zu kopierender String) + + +Copy_Pos_Buffer: +                PUSH    Acc +                PUSH    PSW +                PUSH    P2 +                PUSH    DPL +                PUSH    DPH +                PUSH    AR0 +                PUSH    AR1 + +                MOV     R0,#(Kb_Str_Buffer # 256) +                MOV     R1,#(Kb_Str_Buffer / 256) +                MOV     A,R0 +                ADD     A,Kb_Cursor +                MOV     R0,A +                JNC     CPB_Loop +                INC     R1 + +CPB_Loop:       MOV     A,Kb_Cursor +                CJNE    A,#Kb_Max_Length,CPB_Loop_Cont +                DEC     Kb_Cursor +                SJMP    CPB_End + +CPB_Loop_Cont:  CLR     A +                MOVC    A,@A+DPTR +                JZ      CPB_End +                MOV     P2,R1 +                MOVX    @R0,A +                INC     DPTR +                INC     Kb_Cursor +                INC_R0R1 +                SJMP    CPB_Loop + +CPB_End:        POP     AR1 +                POP     AR0 +                POP     DPH +                POP     DPL +                POP     P2 +                POP     PSW +                POP     Acc +                RET + +;-------------------------------------------------------------------------- + +UpCase:         PUSH    PSW +                PUSH    AR0 + +                MOV     R0,A +                CLR     C +                SUBB    A,#97 +                JC      UpCase_Rest +                MOV     A,#122 +                SUBB    A,R0 +                JC      UpCase_Rest +                MOV     A,R0 +                SUBB    A,#32 +                SJMP    UpCase_End +UpCase_Rest:    MOV     A,R0 + +UpCase_End:     POP     AR0 +                POP     PSW +                RET + +;-------------------------------------------------------------------------- + +Is_Digit:       PUSH    AR0 + +                CLR     C +                MOV     R0,A +                SUBB    A,#48 +                JC      Is_Digit_Rest +                MOV     A,#57 +                SUBB    A,R0 +                JC      Is_Digit_Rest +                MOV     A,R0 +                SUBB    A,#48 +                SJMP    Is_Digit_End + +Is_Digit_Rest:  MOV     A,R0 + +Is_Digit_End:   POP     AR0 +                RET + +;-------------------------------------------------------------------------- + +Wait_2s:        PUSH    AR0 +                PUSH    AR1 +                PUSH    AR2 + +                MOV     R2,#12 +Wait_Loop2:     MOV     R1,#250 +Wait_Loop1:     MOV     R0,#250 +Wait_Loop0:     DJNZ    R0,Wait_Loop0 +                DJNZ    R1,Wait_Loop1 +                DJNZ    R2,Wait_Loop2 + +                POP     AR2 +                POP     AR1 +                POP     AR0 +                RET + +;-------------------------------------------------------------------------- + +Clr_Msg_Buffer: PUSH    AR0 +                PUSH    AR1 + +                MOV     R1,#8 +                MOV     R0,#Msg_Registers +Clr_Msg_Loop:   MOV     @R0,#00 +                INC     R0 +                DJNZ    R1,Clr_Msg_Loop + +                POP     AR1 +                POP     AR0 +                RET + +;------------------------------------------------------------------------------ + +;Stackarea in idata nach oben nur durch Prozessorram begrenzt!! +;Dieses Segment muá IMMER als letztes stehen!!! + +        segment idata + +Stack:          db ?                    ;ab hier liegt der Stack + +;------------------------------------------------------------------------------ + +                end diff --git a/tests/t_mic51/t_mic51.doc b/tests/t_mic51/t_mic51.doc new file mode 100644 index 0000000..94ba34e --- /dev/null +++ b/tests/t_mic51/t_mic51.doc @@ -0,0 +1,6 @@ ++----------------------  Test Application MIC51  ----------------------------+ +|                                                                            | +|  This is a student's program from RWTH Aachen's microprocessor course.  It | +|  tests the MCS51 (not 251!) codegenerator and makes heavy use of macros.   | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_mic51/t_mic51.inc b/tests/t_mic51/t_mic51.inc new file mode 100644 index 0000000..27d4051 --- /dev/null +++ b/tests/t_mic51/t_mic51.inc @@ -0,0 +1,165 @@ +; t_mic51.asm-Includefile für Assembler-Programm +ROB equ 10H +UC_ROB equ 1H +FRS equ 11H +UC_FRS equ 2H +TEACHROB equ 12H +UC_TEACH_ROB equ 3H +TEACHFRS equ 13H +UC_TEACH_FRS equ 4H +TEACHKEY equ 14H +UC_TEACH_KEY equ 5H +MEMROB equ 15H +UC_TEACH_ROB equ 3H +MEMFRS equ 16H +UC_TEACH_FRS equ 4H +PC_SIO equ 17H +UC_PC_SIO equ 0EH +ON equ 1H +OFF equ 0H +PLUS equ 1H +MINUS equ 0H +FAST equ 1H +SLOW equ 0H +SUPERSLOW equ 2H +QUEUE_WARNING equ 81H +QUEUE_FULL equ 61H +UNDEF_PAR equ 62H +UNDEF_PIECE_REF equ 63H +UNDEF_DRILL_REF equ 64H +UNDEF_KOORD_REF equ 65H +INTERNAL_ERROR equ 66H +END_X_PLUS equ 67H +END_Y_PLUS equ 68H +END_Z_PLUS equ 69H +END_V_PLUS equ 6AH +END_X_MINUS equ 70H +END_Y_MINUS equ 71H +END_Z_MINUS equ 72H +END_V_MINUS equ 73H +HARD_END_X_PLUS equ 74H +HARD_END_Y_PLUS equ 75H +HARD_END_Z_PLUS equ 76H +HARD_END_V_PLUS equ 77H +HARD_END_X_MINUS equ 78H +HARD_END_Y_MINUS equ 79H +HARD_END_Z_MINUS equ 7AH +HARD_END_V_MINUS equ 7BH +MOVEAB equ 1H +MOVEAS equ 2H +MOVEAE equ 3H +MOVEARW equ 4H +MOVEALW equ 5H +MOVEAH equ 6H +MOVEAPOS1 equ 7H +MOVEAPOS2 equ 8H +MOVERB equ 9H +MOVERS equ 0AH +MOVERE equ 0BH +MOVERRW equ 0CH +MOVERLW equ 0DH +MOVERH equ 0EH +MOVERPOS1 equ 0FH +MOVERPOS2 equ 10H +MOVECBL equ 11H +MOVECBR equ 12H +STOPCB equ 13H +MOVECSU equ 14H +MOVECSD equ 15H +STOPCS equ 16H +MOVECEU equ 17H +MOVECED equ 18H +STOPCE equ 19H +MOVECHU equ 1AH +MOVECHD equ 1BH +STOPCHP equ 1CH +MOVECHL equ 1DH +MOVECHR equ 1EH +STOPCHT equ 1FH +MOVECHO equ 20H +MOVECHC equ 21H +STOPCH equ 22H +ROBVELOCITY equ 23H +ROBGOHOME equ 24H +SETHOME equ 25H +GIBPOS1 equ 26H +GIBPOS2 equ 27H +ROBGIBREADY equ 28H +ROBINIT equ 29H +ROBDEINIT equ 2AH +INIT equ 1H +DEINIT equ 2H +MOVECX equ 3H +MOVECY equ 4H +MOVECZ equ 5H +MOVECV equ 6H +STOPCX equ 7H +STOPCY equ 8H +STOPCZ equ 9H +STOPCV equ 0AH +FRSVELOCITY equ 0BH +FRSVELOCITYDRAW equ 0CH +FRSGOHOME equ 0DH +REFFAHRT equ 0EH +SETDRILLREF equ 0FH +SETPIECEREF equ 10H +MOVEX equ 11H +MOVEY equ 12H +MOVEZ equ 13H +MOVEAPOS equ 14H +MOVERX equ 15H +MOVERY equ 16H +MOVERZ equ 17H +MOVERV equ 18H +MOVERPOS equ 19H +MOVEVOPEN equ 1AH +MOVEVCLOSE equ 1BH +MOVEV equ 1CH +GOPIECEREFPOS equ 1DH +MOVEPR equ 1EH +DRILL equ 1FH +SETMASTERADRESS equ 20H +GIBFRSPOS1 equ 21H +GIBFRSPOS2 equ 22H +GIBPOSP equ 23H +GIBSTATUS equ 24H +GIBREADY equ 25H +LOADROB equ 1H +SAVEROB equ 2H +STARTROBRUN equ 3H +STOREROBPOS equ 4H +STOREROBSYNC equ 5H +STOREROBREADY equ 6H +INITROBTEACH equ 7H +DEINITROBTEACH equ 8H +CLEARROBTEACH equ 9H +RESETROBTEACH equ 0AH +GETROBSYNC equ 0BH +GETROBREADY equ 0CH +ROBPOS1 equ 0DH +ROBPOS2 equ 0EH +DEBUGROB equ 0FH +LOADFRS equ 1H +SAVEFRS equ 2H +STARTFRSRUN equ 3H +STOREFRSPOS equ 4H +STOREFRSSYNC equ 5H +STOREFRSREADY equ 6H +STOREFRSPIECEREF equ 7H +STOREFRSTIEFE equ 8H +STOREFRSDRILL equ 9H +INITFRSTEACH equ 0AH +DEINITFRSTEACH equ 0BH +CLEARFRSTEACH equ 0CH +RESETFRSTEACH equ 0DH +GETFRSSYNC equ 0EH +GETFRSREADY equ 0FH +FRSPOS1 equ 10H +FRSPOS2 equ 11H +FRSPIECEREF equ 12H +FRSTIEFE equ 13H +GETFRSERROR equ 14H +GETFRSWARNING equ 15H +DEBUGFRS equ 16H +BUG equ 1H +; Ende Includefile für Assembler-Programm diff --git a/tests/t_mic51/t_mic51.ori b/tests/t_mic51/t_mic51.ori Binary files differnew file mode 100755 index 0000000..e9ce88f --- /dev/null +++ b/tests/t_mic51/t_mic51.ori diff --git a/tests/t_mic51/t_mod1.asm b/tests/t_mic51/t_mod1.asm new file mode 100644 index 0000000..fb91ac8 --- /dev/null +++ b/tests/t_mic51/t_mod1.asm @@ -0,0 +1,487 @@ + +; 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 +;--------------------------------------------------------------------- +  | 
