;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