aboutsummaryrefslogtreecommitdiffstats
path: root/tests/t_mic51
diff options
context:
space:
mode:
Diffstat (limited to 'tests/t_mic51')
-rw-r--r--tests/t_mic51/DEBUG.ASM532
-rw-r--r--tests/t_mic51/MAKRO1.ASM542
-rw-r--r--tests/t_mic51/MEM1.ASM727
-rw-r--r--tests/t_mic51/RUN1.ASM773
-rw-r--r--tests/t_mic51/TAST1.ASM250
-rw-r--r--tests/t_mic51/TEACH1.ASM504
-rw-r--r--tests/t_mic51/asflags1
-rw-r--r--tests/t_mic51/defKey.inc83
-rw-r--r--tests/t_mic51/defModul.inc18
-rw-r--r--tests/t_mic51/defMsg.inc141
-rw-r--r--tests/t_mic51/defParam.inc46
-rw-r--r--tests/t_mic51/defgequ.inc48
-rw-r--r--tests/t_mic51/defint.inc234
-rw-r--r--tests/t_mic51/defmacro.inc175
-rw-r--r--tests/t_mic51/net_lcd.inc33
-rw-r--r--tests/t_mic51/t_mic51.asm2197
-rw-r--r--tests/t_mic51/t_mic51.doc6
-rw-r--r--tests/t_mic51/t_mic51.inc165
-rwxr-xr-xtests/t_mic51/t_mic51.oribin0 -> 17582 bytes
-rw-r--r--tests/t_mic51/t_mod1.asm487
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
new file mode 100755
index 0000000..e9ce88f
--- /dev/null
+++ b/tests/t_mic51/t_mic51.ori
Binary files differ
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
+;---------------------------------------------------------------------
+