Subversion Repositories pentevo

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

  1. ;Program:               TEACH-IN EINHEIT
  2. ;
  3. ;Autor:                 Laurent Savary
  4. ;
  5. ;Datum:                 9.5.94
  6. ;
  7. ;letze Aenderung:       23.6.94
  8. ;
  9. ;
  10. ;Dateiname: TEACHIN.ASM
  11. ;
  12. ;------------------------------------------------------------------------------
  13.  
  14. Init_Vektor     macro Vektor,Routine
  15.  
  16. ;        mov Vektor+0,#(Routine/256)             ;der Interruptvektor wird
  17. ;        mov Vektor+1,#(Routine#256)             ;ins interne RAM geladen
  18.  
  19.         push acc
  20.         push dph
  21.         push dpl
  22.         mov dptr,#Vektor
  23.         mov a,#00000010b                ; LJMP
  24.         movx @dptr,a
  25.         inc dptr
  26.         mov a,#(Routine/256)
  27.         movx @dptr,a
  28.         inc dptr
  29.         mov a,#(Routine#256)
  30.         movx @dptr,a
  31.         pop dpl
  32.         pop dph
  33.         pop acc
  34.  
  35.                 endm
  36.  
  37. DEC_DPTR        MACRO
  38.                 INC DPL
  39.                 DJNZ DPL,DEC_DPTR1
  40.                 DEC DPH
  41. DEC_DPTR1:      DEC DPL
  42.                 ENDM
  43.  
  44.  
  45. INC_R0R1        MACRO
  46.                 INC     R0
  47.                 INC     R0
  48.                 DJNZ R0,INC_R0R1_End
  49.                 INC     R1
  50. INC_R0R1_End:
  51.                 ENDM
  52.  
  53.  
  54. DEC_R0R1:       MACRO
  55.                 INC R0
  56.                 DJNZ R0,DEC_R0R1_End
  57.                 DEC R1
  58. DEC_R0R1_End:   DEC R0
  59.                 ENDM
  60.  
  61. ;---------------------------------------------------------------------
  62.  
  63. post_Message macro
  64.         push acc
  65. SEND_NET1: LCALL READ_STATUS
  66.         JB ACC.1,SEND_NET1
  67.         pop acc
  68.         LCALL SEND_MESSAGE
  69.         endm
  70.  
  71. Take_Message macro
  72.         push acc
  73. RECEIVE_NET1: LCALL READ_STATUS
  74.         JNB ACC.0,RECEIVE_NET1
  75.         pop acc
  76.         LCALL READ_MESSAGE
  77.         endm
  78.  
  79. ;------------------------------------------------------------------------------
  80.  
  81.         cpu 80515
  82.         include stddef51.inc
  83.         include net_lcd.inc
  84.         include defint.inc
  85.         include defgequ.inc
  86.         include defmacro.inc
  87.  
  88.         USING   0
  89.  
  90. ;------------------------ Konstanten ------------------------------------------
  91.  
  92. Ass_Keyboard_Only       EQU     False           ; Wenn True, TI-Einheit lauft nur mit
  93.                                                 ; der Tastatur (kein Tastenfeld)
  94.  
  95. Last_Code       EQU     0FFFFh  ; Endeadressen
  96. Last_Bit_Data   EQU     07Fh    ; der Speicher-
  97. Last_Data       EQU     07Fh    ; bereiche
  98. Last_IData      EQU     0FFh    ; bestimmen
  99. Last_XData      EQU     0FFFFh
  100.  
  101. Kb_Max_Length   EQU     40                      ; Hoechstlaenge der anzuzeigenden Strings
  102. TI_Sample_Valid_Time    EQU     30              ; Gueltige Druckdauer in ms
  103.  
  104. ASCII_Space     EQU     32                      ;
  105. ASCII_Left      EQU     19                      ;
  106. ASCII_Right     EQU     4                       ;
  107. ASCII_Up        EQU     5                       ;
  108. ASCII_Down      EQU     24                      ; ASCII-Code fuer die
  109. ASCII_CR        EQU     13                      ; Tastatur
  110. ASCII_Esc       EQU     27                      ;
  111. ASCII_DEL       EQU     127                     ;
  112. ASCII_BkSpc     EQU     8                       ;
  113. ASCII_LWord     EQU     1                       ;
  114. ASCII_RWord     EQU     6                       ;
  115. ASCII_Search    EQU     12                      ;
  116.  
  117. KSS_Off         EQU     0
  118. KSS_Mod         EQU     1
  119. KSS_Mod_Top     EQU     2
  120. KSS_Mod_Bot     EQU     3
  121. KSS_Msg         EQU     4
  122. KSS_Msg_Top     EQU     5
  123. KSS_Msg_Bot     EQU     6
  124. KSS_Inc_Mod     EQU     7
  125. KSS_No_Choice   EQU     8
  126.  
  127. R0_Bk1          EQU     08h
  128. R1_Bk1          EQU     09h
  129. R2_Bk1          EQU     0Ah
  130. R3_Bk1          EQU     0Bh
  131. R4_Bk1          EQU     0Ch
  132. R5_Bk1          EQU     0Dh
  133. R6_Bk1          EQU     0Eh
  134. R7_Bk1          EQU     0Fh
  135.  
  136. ;------------------------------------------------------------------------------
  137.  
  138.         segment data
  139.         org Data_Start
  140.  
  141. Save_P4         DB      ?               ;
  142. Save_P5         DB      ?               ;
  143. Old_P4          DB      ?               ;
  144. Old_P5          DB      ?               ;
  145. Temp_P4         DB      ?               ; benoetigte Variablen fuer
  146. Temp_P5         DB      ?               ; Teach_In_Sampler
  147. TI_On_P4        DB      ?               ;
  148. TI_Off_P4       DB      ?               ;
  149. TI_On_P5        DB      ?               ;
  150. TI_Off_P5       DB      ?               ;
  151. TI_Sample_Counter DB    ?               ;
  152.  
  153. Text_Dec_Status DB      ?
  154. Kb_Char_Buffer  DB      ?
  155. Kb_Str_Pointer  DB      ?
  156. Kb_Cursor       DB      ?
  157. ASCII_Low_Byte  DB      ?
  158. ASCII_High_Byte DB      ?
  159. Rcv_Msg_Length  DB      ?
  160. My_Slave_Adr    DB      ?               ; Physikalische Adresse dieses Moduls
  161.  
  162. Kb_Search_Status DB     ?               ;
  163. Kb_Search_DPL   DB      ?               ;
  164. Kb_Search_DPH   DB      ?               ; Benoetigte Variablen fuer
  165. KS_Actual_Word  DB      ?               ; Keyboard Search
  166. KS_Actual_Module DB     ?               ;
  167. KS_Cursor       DB      ?               ;
  168.  
  169. Stat_Code       DB      ?               ;
  170. Stat_Address    DB      ?               ;
  171. Stat_Num_Param  DB      ?               ; Benoetigte Variablen fuer
  172. Stat_Picture    DB      ?               ; Text_Decoder
  173. Stat_Module     DB      ?               ;
  174. Stat_Length     DB      ?               ;
  175.  
  176.                 if $ > Last_Data
  177.                   then fatal "Data-Bereichgrenze ueberschritten"
  178.                 endif
  179.  
  180.  
  181. ;------------------------------------------------------------------------------
  182.  
  183.         segment xdata
  184.         org X_Data_Start
  185.  
  186. Kb_Str_Buffer   DB      Kb_Max_Length dup (?)   ; Text Buffer (fuer die Tastatur)
  187. Token_Str       DB      Kb_Max_Length dup (?)   ; Ergebnis von Get_Token
  188. Net_Rcv_Str     DB      Kb_Max_Length dup (?)   ; Empfangene Message vom Teach-In Modul
  189.  
  190.                  if $ > Last_XData
  191.                   then fatal "XData-Bereichgrenze ueberschritten"
  192.                 endif
  193.  
  194. ;------------------------------------------------------------------------------
  195.  
  196.         segment idata
  197.         org I_Data_Start
  198.  
  199. Msg_Registers   DB      8  dup (?)      ; Register-Buffer fur die zu sendenden Messages
  200.  
  201.                  if $ > Last_IData
  202.                   then fatal "IData-Bereichgrenze ueberschritten"
  203.                 endif
  204.  
  205.  
  206. ;------------------------------------------------------------------------------
  207.  
  208.         segment bitdata
  209.         org Bit_Data_Start
  210.  
  211. Kb_Str_Ready    DB      ?               ; -> Text_Decoder
  212. Kb_Char_Ready   DB      ?               ; -> Keyb_Controller
  213. TI_Sample_Chg_Flg DB    ?               ; -> TeachIn_Decoder
  214. TD_Status_Ready DB      ?               ; -> LCD_Controller
  215. TD_Send_Ready   DB      ?               ; -> Send_Manager
  216. Receive_Ready   DB      ?               ; -> Receive_Manager
  217. TD_Next_Flg     DB      ?               ; -> Kb_Controller
  218. KS_Status_Ready DB      ?               ; -> LCD_Controller
  219. KS_Active_Flg   DB      ?               ; -> KB_Search_Up / _Down
  220. Kb_Dsp_Ready    DB      ?               ; -> LCD_Controller
  221. Ext_Dsp_Ready   DB      ?               ; -> LCD_Controller
  222. System_Error    DB      ?
  223. Sys_Robot_Mode  DB      ?
  224. Sys_Keyboard_Mode DB    ?
  225. TID_Done_Flg    DB      ?               ; -> TeachIn_Sampler
  226.  
  227.                 if $ > Last_Bit_Data
  228.                   then fatal "Bit_Data-Bereichgrenze ueberschritten"
  229.                 endif
  230.  
  231.  
  232. ;------------------------------------------------------------------------------
  233.  
  234.         segment code
  235.         org Code_Start
  236.  
  237. ;====================== H A U P T P R O G R A M M =============================
  238.  
  239.         segment code
  240.  
  241. Main_Prog:      CLR     EAL                     ;alle Interrupts sperren
  242.                 MOV     SP,#Stack-1             ;Stackpointer setzen
  243.  
  244.                 LCALL   Init_Data
  245.                 LCALL   Init_IData
  246.                 LCALL   Init_BitData
  247.                 LCALL   Init_XData
  248.                 LCALL   Init_Timer
  249.                 LCALL   Init_Mode
  250. Main_Error:     JB      System_Error,Main_Error
  251.  
  252.                 LCALL   Init_Net
  253.                 LCALL   LCD_Clear
  254.                 MOV     A,#1
  255.                 LCALL   LCD_Curser_OnOff
  256.                 LCALL   Init_Int
  257.                 SETB    EAL
  258.  
  259.                 CLR TESTBIT
  260.                 CLR MSG
  261.                 MOV Sp_MSG_Buffer,#0
  262.                 CLR Sp_MSG
  263.                 LCALL INIT_TEACH
  264.                 LCALL INIT_RUN
  265.                 LCALL RESET_TEACH
  266.                 LCALL INIT_FRS
  267.  
  268. Main_Loop:      LCALL   Main_Manager
  269.                 LCALL   Main_Event_Loop
  270.                 SJMP    Main_Loop
  271.  
  272.  
  273. ;------------------------------------------------------------------------------
  274.  
  275. Adr_Table:      Create_IncTab       ModulNetAdr, "defModul.inc"
  276. Module_Table:   Create_IncOffsTab   ModulStr,    "defModul.inc"
  277. Symbol_Table:   Create_IncOffsTab   ParamStr,    "defParam.inc"
  278. Stat_Table:     Create_IncOffsTab   MsgStr,      "defMsg.inc"
  279.  
  280. KOn_P4_Rob:     Create_IncKeyTab       On,  P4, TeachRob, "defKey.inc"
  281. KOff_P4_Rob:    Create_IncKeyTab       Off, P4, TeachRob, "defKey.inc"
  282. KOn_P5_Rob:     Create_IncKeyTab       On,  P5, TeachRob, "defKey.inc"
  283. KOff_P5_Rob:    Create_IncKeyTab       Off, P5, TeachRob, "defKey.inc"
  284. KOn_P4_Frs:     Create_IncKeyTab       On,  P4, TeachFrs, "defKey.inc"
  285. KOff_P4_Frs:    Create_IncKeyTab       Off, P4, TeachFrs, "defKey.inc"
  286. KOn_P5_Frs:     Create_IncKeyTab       On,  P5, TeachFrs, "defKey.inc"
  287. KOff_P5_Frs:    Create_IncKeyTab       Off, P5, TeachFrs, "defKey.inc"
  288.  
  289. ;--------------------------------------------------------------------------
  290.         include t_mod1.asm              ;
  291. ;------------------------------------------------------------------------------
  292.  
  293. Main_Manager:   JNB     Kb_Char_Ready,MM_Txt_Dec
  294.                 LCALL   Keyb_Controller
  295.  
  296. MM_Txt_Dec:     JNB     Kb_Str_Ready,MM_TI_Dec
  297.                 LCALL   Text_Decoder
  298.  
  299. MM_TI_Dec:      JNB     TI_Sample_Chg_Flg,MM_Send_Mng
  300.                 LCALL   TeachIn_Decoder
  301.  
  302. MM_Send_Mng:    JNB     TD_Send_Ready,MM_Receive_Mng
  303.                 LCALL   Send_Manager
  304.  
  305. MM_Receive_Mng: JNB     Receive_Ready,MM_LCD_Ctrl
  306.                 LCALL   Receive_Manager
  307.  
  308. MM_LCD_Ctrl:    JB      Ext_Dsp_Ready,MM_LCD_Ctrl2
  309.                 JB      Kb_Dsp_Ready,MM_LCD_Ctrl2
  310.                 JB      TD_Status_Ready,MM_LCD_Ctrl2
  311.                 JB      KS_Status_Ready,MM_LCD_Ctrl2
  312.                 SJMP    MM_End
  313. MM_LCD_Ctrl2:   LCALL   LCD_Controller
  314.  
  315. MM_End:         RET
  316.  
  317. ;--------------------------------------------------------------------------
  318.  
  319. Init_Data:
  320.                 MOV     Save_P4,#0FFh
  321.                 MOV     Save_P5,#0FFh
  322.                 MOV     Old_P4,#0FFh
  323.                 MOV     Old_P5,#0FFh
  324.                 MOV     Temp_P4,#0FFh
  325.                 MOV     Temp_P5,#0FFh
  326.                 MOV     TI_On_P4,#00
  327.                 MOV     TI_Off_P4,#00
  328.                 MOV     TI_On_P5,#00
  329.                 MOV     TI_Off_P5,#00
  330.                 MOV     TI_Sample_Counter,#00
  331.                 MOV     Rcv_Msg_Length,#00
  332.                 MOV     My_Slave_Adr,#00
  333.  
  334.                 MOV     Text_Dec_Status,#00
  335.                 MOV     Kb_Char_Buffer,#00
  336.                 MOV     Kb_Str_Pointer,#00
  337.                 MOV     Kb_Cursor,#00
  338.                 MOV     ASCII_Low_Byte,#00
  339.                 MOV     ASCII_High_Byte,#00
  340.  
  341.                 MOV     Kb_Search_DPL,#00
  342.                 MOV     Kb_Search_DPH,#00
  343.                 MOV     KS_Actual_Word,#00
  344.                 MOV     KS_Actual_Module,#00
  345.                 MOV     KS_Cursor,#00
  346.                 MOV     Kb_Search_Status,#00
  347.  
  348.                 MOV     Stat_Code,#00
  349.                 MOV     Stat_Address,#00
  350.                 MOV     Stat_Num_Param,#00
  351.                 MOV     Stat_Picture,#00
  352.                 MOV     Stat_Module,#00
  353.                 MOV     Stat_Length,#00
  354.                 RET
  355.  
  356.  
  357. Init_IData:     LCALL   Clr_Msg_Buffer
  358.                 RET
  359.  
  360.  
  361. Init_XData:     PUSH    DPL
  362.                 PUSH    DPH
  363.                 PUSH    Acc
  364.  
  365.                 MOV     DPTR,#Kb_Str_Buffer
  366.                 MOV     A,#ASCII_Space
  367.                 LCALL   Clear_Str
  368.                 MOV     DPTR,#Token_Str
  369.                 MOV     A,#StringEnde
  370.                 LCALL   Clear_Str
  371.  
  372.                 POP     Acc
  373.                 POP     DPH
  374.                 POP     DPL
  375.                 RET
  376.  
  377.  
  378. Init_BitData:   CLR     Kb_Str_Ready
  379.                 CLR     Kb_Char_Ready
  380.                 CLR     TI_Sample_Chg_Flg
  381.                 CLR     TD_Status_Ready
  382.                 CLR     TD_Send_Ready
  383.                 CLR     Receive_Ready
  384.                 SETB    TD_Next_Flg
  385.                 CLR     KS_Active_Flg
  386.                 CLR     KS_Status_Ready
  387.                 CLR     Kb_Dsp_Ready
  388.                 CLR     Ext_Dsp_Ready
  389.                 CLR     System_Error
  390.                 CLR     Sys_Robot_Mode
  391.                 CLR     Sys_Keyboard_Mode
  392.                 CLR     TID_Done_Flg
  393.                 RET
  394.  
  395. ;--------------------------------------------------------------------------
  396. ; Routine            : Init_Mode
  397. ; Parameter          : -
  398. ; Rueckgabeparameter : Sys_Robot_Mode, Sys_Keyboard_Mode,System_Error
  399. ;
  400. ; entscheidet, ob das Programm im TI-Roboter, TI-Fraese oder TI-Tastatur
  401. ; laufen muss.                    (SRM /SKM)  (/SRM /SKM)    (SKM)
  402.  
  403.  
  404. Init_Mode:      PUSH    PSW
  405.                 PUSH    DPL
  406.                 PUSH    DPH
  407.  
  408.                 CLR     System_Error
  409.  
  410.         if Ass_Keyboard_Only
  411.                 SJMP    IM_Keyboard
  412.         elseif
  413.                 CLR     Sys_Robot_Mode
  414.                 CLR     Sys_Keyboard_Mode
  415.                 LCALL   LCD_Clear
  416.                 MOV     DPTR,#Screen_Title
  417.                 LCALL   LCD_Write_String
  418.                 JNB     P3.5,IM_Robot
  419.                 JB      P3.4,IM_Error
  420.                 MOV     DPTR,#Screen_Drill
  421.                 SJMP    IM_End
  422.         endif
  423.  
  424. IM_Robot:       JNB     P3.4,IM_Keyboard
  425.                 SETB    Sys_Robot_Mode
  426.                 MOV     DPTR,#Screen_Robot
  427.                 SJMP    IM_End
  428.  
  429. IM_Keyboard:    SETB    Sys_Keyboard_Mode
  430.                 MOV     DPTR,#Screen_Key
  431.                 SJMP    IM_End
  432.  
  433. IM_Error:       SETB    System_Error
  434.                 MOV     DPTR,#Screen_Error
  435.  
  436. IM_End:         LCALL   LCD_Write_String
  437.                 LCALL   Wait_2s
  438.  
  439.                 POP     DPH
  440.                 POP     DPL
  441.                 POP     PSW
  442.                 RET
  443.  
  444. Screen_Title:   DB      "****       TEACH-IN UNIT v1.0       ****",00
  445. Screen_Drill:   DB      "               Drill mode",00
  446. Screen_Robot:   DB      "               Robot mode",00
  447. Screen_Key:     DB      "             Keyboard  mode",00
  448. Screen_Error:   DB      "   ERROR : Incorrect micro-controller",00
  449.  
  450. ;--------------------------------------------------------------------------
  451.  
  452. Init_Int:       Init_Vektor     INT0_VEKTOR,Keyb_Sampler
  453.                 Init_Interrupt  INT0_VEKTOR,Falling_Edge,Param_On
  454.                 Init_Vektor     ICT0_VEKTOR,TeachIn_Sampler
  455.                 Init_Interrupt  ICT0_VEKTOR,Nope,Param_On
  456.                 RET
  457.  
  458. ;--------------------------------------------------------------------------
  459.  
  460.  
  461. Init_Net:       PUSH    Acc
  462.                 PUSH    DPL
  463.                 PUSH    DPH
  464.  
  465.                 MOV     DPTR,#MESSAGE_INTERRUPT         ;Receive_Sampler
  466.                 LCALL   Set_CallBack_Adress
  467.                 MOV     DPTR,#Adr_Table
  468.                 JB      Sys_Keyboard_Mode,Init_Net_Key
  469.                 JNB     Sys_Robot_Mode,Init_Net_Frs
  470.  
  471. Init_Net_Rob:   MOV     A,#TeachRob
  472.                 SJMP    Init_Net_End
  473.  
  474. Init_Net_Frs:   MOV     A,#TeachFrs
  475.                 SJMP    Init_Net_End
  476.  
  477. Init_Net_Key:   MOV     A,#TeachKey
  478.  
  479. Init_Net_End:   MOVC    A,@A+DPTR
  480.                 MOV     My_Slave_Adr,A
  481.                 LCALL   Set_My_Adress
  482.  
  483.                 POP     DPH
  484.                 POP     DPL
  485.                 POP     Acc
  486.                 RET
  487.  
  488. ;--------------------------------------------------------------------------
  489.  
  490. Init_Timer:     MOV     TH0,#00
  491.                 MOV     TL0,#00
  492.                 MOV     TMOD,#00110001b         ; T1 : Off, T0 : 16 Bit Timer
  493.                 SETB    TR0                     ; T0 einschalten
  494.                 RET
  495.  
  496. ;--------------------------------------------------------------------------
  497. ; Routine            : LCD_Controller
  498. ; Parameter          : Ext_Dsp_Ready   -> DPTR
  499. ;                      TD_Status_Ready -> Text_Dec_Status
  500. ;                      KS_Status_Ready -> Kb_Search_Status
  501. ; Rueckgabeparameter : -
  502. ; wenn Ext_Dsp_Ready gesetzt wird, zeigt den mit DPTR gezeigten String
  503. ; auf den Bildschirm an.
  504. ; wenn TD_Status_Ready (bzw KS_Status_Ready) gesetzt wird, zeigt die
  505. ; entsprechende Meldung von Text_Dec_Status (bzw Kb_Search_Status)
  506. ;
  507.  
  508. LCD_Controller: PUSH    PSW
  509.                 PUSH    Acc
  510.                 PUSH    AR0
  511.                 PUSH    AR1
  512.                 PUSH    DPL
  513.                 PUSH    DPH
  514.                 LCALL   LCD_Home
  515.  
  516.                 JNB     Ext_Dsp_Ready,LCD_Str_Buffer
  517.                 CLR     Ext_Dsp_Ready
  518.                 MOV     A,#40h
  519.                 LCALL   LCD_Set_DD_RAM_Address
  520.                 MOV     R1,#Kb_Max_Length
  521.  
  522. LCD_Ext_Loop:   MOVX    A,@DPTR
  523.                 LCALL   LCD_Write_Char
  524.                 INC     DPTR
  525.                 DJNZ    R1,LCD_Ext_Loop
  526.                 LCALL   LCD_Home
  527.  
  528. LCD_Str_Buffer: JNB     Kb_Dsp_Ready,LCD_TD_Status
  529.                 CLR     Kb_Dsp_Ready
  530.                 MOV     DPTR,#Kb_Str_Buffer
  531.                 MOV     R1,#Kb_Max_Length
  532.  
  533. LCD_Str_Loop:   MOVX    A,@DPTR
  534.                 LCALL   LCD_Write_Char
  535.                 INC     DPTR
  536.                 DJNZ    R1,LCD_Str_Loop
  537.  
  538. LCD_TD_Status:  JNB     TD_Status_Ready,LCD_KS_Status
  539.                 CLR     TD_Status_Ready
  540.  
  541.                 MOV     A,#40
  542.                 LCALL   LCD_Set_DD_RAM_Address
  543.                 MOV     DPTR,#LCD_TD_Table
  544.                 MOV     R0,Text_Dec_Status
  545.                 CJNE    R0,#00,LCD_TD_Loop
  546.                 SJMP    LCD_TD_Cont
  547.  
  548. LCD_TD_Loop:    MOV     A,#41
  549.                 ADD     A,DPL
  550.                 MOV     DPL,A
  551.                 MOV     A,DPH
  552.                 ADDC    A,#00
  553.                 MOV     DPH,A
  554.                 DJNZ    R0,LCD_TD_Loop
  555.  
  556. LCD_TD_Cont:    LCALL   LCD_Write_String
  557.  
  558. LCD_KS_Status:  JNB     KS_Status_Ready,LCD_End
  559.                 CLR     KS_Status_Ready
  560.  
  561.                 MOV     A,#40
  562.                 LCALL   LCD_Set_DD_RAM_Address
  563.                 MOV     DPTR,#LCD_KS_Table
  564.                 MOV     R0,Kb_Search_Status
  565.                 CJNE    R0,#00,LCD_KS_Loop
  566.                 SJMP    LCD_KS_Cont
  567.  
  568. LCD_KS_Loop:    MOV     A,#41
  569.                 ADD     A,DPL
  570.                 MOV     DPL,A
  571.                 MOV     A,DPH
  572.                 ADDC    A,#00
  573.                 MOV     DPH,A
  574.                 DJNZ    R0,LCD_KS_Loop
  575.  
  576. LCD_KS_Cont:    LCALL   LCD_Write_String
  577.  
  578. LCD_End:        MOV     A,Kb_Cursor
  579.                 LCALL   LCD_Set_DD_RAM_Address
  580.  
  581.                 POP     DPH
  582.                 POP     DPL
  583.                 POP     AR1
  584.                 POP     AR0
  585.                 POP     Acc
  586.                 POP     PSW
  587.                 RET
  588.  
  589. LCD_TD_Table:   DB      "Edit OK : Sending                       ",00
  590.                 DB      "Edit ERROR : message waited             ",00
  591.                 DB      "Edit ERROR : incorrect message          ",00
  592.                 DB      "Edit ERROR : more parameters waited     ",00
  593.                 DB      "Edit ERROR : parameter range            ",00
  594.                 DB      "Edit ERROR : module name waited         ",00
  595.                 DB      "Edit ERROR : incorrect module name      ",00
  596.                 DB      "Edit WARNING : too many parameters      ",00
  597.  
  598. LCD_KS_Table:   DB      "Text editing                            ",00
  599.                 DB      "Search : Choose a module                ",00
  600.                 DB      "Search : Choose a module, reached TOP   ",00
  601.                 DB      "Search : Choose a module, reached BOTT. ",00
  602.                 DB      "Search : Choose a message               ",00
  603.                 DB      "Search : Choose a message, reached TOP  ",00
  604.                 DB      "Search : Choose a message, reached BOTT.",00
  605.                 DB      "Search : Incorrect module               ",00
  606.                 DB      "Search : No choice available            ",00
  607.  
  608. ;--------------------------------------------------------------------------
  609.  
  610. Keyb_Sampler:
  611.                 MOV     Kb_Char_Buffer,P1
  612.                 SETB    Kb_Char_Ready
  613.                 RETI
  614.  
  615. ;--------------------------------------------------------------------------
  616. ; Routine            : Keyb_Controller
  617. ; Parameter          : Kb_Char_Ready            ; (Buchstabe im Buffer)
  618. ;                      Kb_Char_Buffer           ; (zu verarbeitender Buchstabe)
  619. ;                      Kb_Cursor                ; (Cursorposition auf LCD)
  620. ;                      KS_Active_Flg            ; (Keyb. Search Modus)
  621. ;                      Kb_Str_Buffer            ; (Text Buffer f. Tastatur)
  622. ;                      TD_Next_Flg              ; Text_Decoder ist fertig
  623. ; Rueckgabeparameter : Kb_Cursor
  624. ;                      KS_Active_Flg
  625. ;                      Kb_Str_Buffer
  626. ;                      Kb_Str_Ready             ; (->Text_Decoder : String verarbeiten)
  627. ;                      Kb_Search_Status         ; (Keyb. Search Zustand)
  628. ;                      KS_Status_Ready          ; (-> LCD : Zustand anzeigen)
  629. ;
  630. ; Verwaltet Kb_Str_Buffer nach der Tastatur-Eingaben
  631.  
  632.  
  633. Keyb_Controller:
  634.                 PUSH    Acc
  635.                 PUSH    PSW
  636.                 PUSH    DPL
  637.                 PUSH    DPH
  638.  
  639.                 CLR     Kb_Char_Ready
  640.                 MOV     A,Kb_Char_Buffer
  641.  
  642.                 JNB     TD_Next_Flg,Kb_Ctrl_UP
  643.                 CLR     TD_Next_Flg
  644. Kb_Ctrl_Test1:  CJNE    A,#ASCII_Left,Kb_Ctrl_Test2
  645.                 SJMP    Kb_Ctrl_Old
  646. Kb_Ctrl_Test2:  CJNE    A,#ASCII_Right,Kb_Ctrl_Test3
  647.                 SJMP    Kb_Ctrl_Old
  648. Kb_Ctrl_Test3:  CJNE    A,#ASCII_BkSpc,Kb_Ctrl_Test4
  649.                 SJMP    Kb_Ctrl_Old
  650. Kb_Ctrl_Test4:  CJNE    A,#ASCII_CR,Kb_Ctrl_New
  651.  
  652.  
  653. Kb_Ctrl_Old:    MOV     Kb_Search_Status,#KSS_Off
  654.                 SETB    KS_Status_Ready
  655.                 LJMP    Kb_Ctrl_Up
  656.  
  657. Kb_Ctrl_New:    PUSH    Acc
  658.                 MOV     A,#ASCII_Space
  659.                 MOV     DPTR,#Kb_Str_Buffer
  660.                 LCALL   Clear_Str
  661.                 MOV     Kb_Cursor,#00
  662.                 MOV     Kb_Search_Status,#KSS_Off
  663.                 SETB    KS_Status_Ready
  664.                 POP     Acc
  665.  
  666. Kb_Ctrl_UP:     CJNE    A,#ASCII_Up,Kb_Ctrl_DOWN
  667.                 LCALL   Kb_Search_Up
  668.                 LJMP    Kb_Ctrl_End
  669.  
  670. Kb_Ctrl_DOWN:   CJNE    A,#ASCII_Down,Kb_Ctrl_RET
  671.                 LCALL   Kb_Search_Down
  672.                 LJMP    Kb_Ctrl_End
  673.  
  674. Kb_Ctrl_RET:    CLR     KS_Active_Flg
  675.                 CJNE    A,#ASCII_CR,Kb_Ctrl_LEFT
  676.                 SETB    Kb_Str_Ready
  677.                 LJMP    Kb_Ctrl_End
  678.  
  679. Kb_Ctrl_LEFT:   CJNE    A,#ASCII_Left,Kb_Ctrl_RIGHT
  680.                 LCALL   Exe_LEFT
  681.                 LJMP    Kb_Ctrl_End
  682.  
  683. Kb_Ctrl_RIGHT:  CJNE    A,#ASCII_Right,Kb_Ctrl_DEL
  684.                 LCALL   Exe_RIGHT
  685.                 LJMP    Kb_Ctrl_End
  686.  
  687. Kb_Ctrl_DEL:    CJNE    A,#ASCII_Del,Kb_Ctrl_BKSPC
  688.                 LCALL   Exe_DEL
  689.                 LJMP    Kb_Ctrl_End
  690.  
  691. Kb_Ctrl_BKSPC:  CJNE    A,#ASCII_BkSpc,Kb_Ctrl_ESC
  692.                 LCALL   Exe_LEFT
  693.                 LCALL   Exe_DEL
  694.                 LJMP    Kb_Ctrl_End
  695.  
  696. Kb_Ctrl_ESC:    CJNE    A,#ASCII_Esc,Kb_Ctrl_Alpha
  697.                 MOV     DPTR,#Kb_Str_Buffer
  698.                 MOV     A,#ASCII_Space
  699.                 LCALL   Clear_Str
  700.                 MOV     Kb_Cursor,#00
  701.                 LJMP    Kb_Ctrl_End
  702.  
  703. Kb_Ctrl_Alpha:  LCALL   Exe_Set_Actual_Letter
  704.                 MOV     A,Kb_Char_Buffer
  705.                 MOVX    @DPTR,A
  706.                 LCALL   Exe_RIGHT
  707.  
  708. Kb_Ctrl_End:    SETB    Kb_Dsp_Ready
  709.                 POP     DPH
  710.                 POP     DPL
  711.                 POP     PSW
  712.                 POP     Acc
  713.                 RET
  714.  
  715. ;--------------------------------------------------------------------------
  716.  
  717. Exe_Set_Actual_Letter:                          ; laedt in DPTR die externale Adresse
  718.                 PUSH    Acc                     ; des vom Kb_Cursor gezeigten Zeichens
  719.                 PUSH    PSW
  720.                 MOV     A,Kb_Cursor
  721.                 MOV     DPTR,#Kb_Str_Buffer
  722.                 ADD     A,DPL
  723.                 MOV     DPL,A
  724.                 JNC     ESAL_End
  725.                 INC     DPH
  726. ESAL_End:       POP     PSW
  727.                 POP     Acc
  728.                 RET
  729.  
  730. Exe_LEFT:       PUSH    AR1                     ; dekr. Kb_Cursor
  731.                 DEC     Kb_Cursor
  732.                 MOV     R1,Kb_Cursor
  733.                 CJNE    R1,#0FFh,Exe_LEFT_End
  734.                 MOV     Kb_Cursor,#00
  735. Exe_LEFT_End:   POP     AR1
  736.                 RET
  737.  
  738. Exe_RIGHT:      PUSH    Acc                     ; inkr. Kb_Cursor
  739.                 PUSH    PSW
  740.                 INC     Kb_Cursor
  741.                 CLR     C
  742.                 MOV     A,#Kb_Max_Length-1
  743.                 SUBB    A,Kb_Cursor
  744.                 JNC     Exe_RIGHT_End
  745.                 MOV     Kb_Cursor,#Kb_Max_Length-1
  746. Exe_RIGHT_End:  POP     PSW
  747.                 POP     Acc
  748.                 RET
  749.  
  750. Exe_DEL:        PUSH    Acc                     ; loescht aktuelles Zeichen
  751.                 LCALL   Exe_Set_Actual_Letter
  752.                 MOV     A,#ASCII_Space
  753.                 MOVX    @DPTR,A
  754.                 POP     Acc
  755.                 RET
  756.  
  757. ;--------------------------------------------------------------------------
  758. ; Routine            : Kb_Init_Search
  759. ; Parameter          : Kb_Str_Buffer
  760. ;                      Kb_Cursor
  761. ; Rueckgabeparameter : KS_Status_Ready
  762. ;                      Kb_Search_Status
  763. ;                      KS_Active_Flg
  764. ;                      KS_Actual_Module
  765. ;                      Kb_Search_DPL
  766. ;                      Kb_Search_DPH
  767. ;                      KS_Cursor
  768. ;
  769. ; Sucht, auf welchem Wort der Cursor sich befindet und zeigt das erste ent-
  770. ; sprechende Element aus der Search-Menu-Tabelle (zB : wenn Cursor auf Message,
  771. ; sucht die erste Message fuer das schon eingetragene Modul).
  772.  
  773.  
  774. Kb_Init_Search: PUSH    Acc
  775.                 PUSH    B
  776.                 PUSH    PSW
  777.                 PUSH    DPL
  778.                 PUSH    DPH
  779.  
  780.                 LCALL   Kb_Valid_Word
  781.                 MOV     A,KS_Actual_Word
  782.                 CJNE    A,#1,KIS_Msg                    ; Cursor auf 1. Wort -> Modul
  783.  
  784.                 MOV     Kb_Search_DPL,#(Module_Table # 256)
  785.                 MOV     Kb_Search_DPH,#(Module_Table / 256)
  786.                 LCALL   Search_Next_Module
  787.                 JC      KIS_No_Choice                   ; springt wenn noch kein Modul in der Tabelle
  788.                 MOV     DPTR,#Kb_Str_Buffer             ;
  789.                 MOV     A,#ASCII_Space                  ; loescht Kb_Str_Buffer
  790.                 LCALL   Clear_Str                       ;
  791.                 MOV     Kb_Cursor,#00                   ;
  792.                 MOV     DPL,Kb_Search_DPL
  793.                 MOV     DPH,Kb_Search_DPH
  794.                 INC     DPTR
  795.                 INC     DPTR
  796.                 MOV     Kb_Search_Status,#KSS_Mod
  797.                 SJMP    KIS_Found
  798.  
  799. KIS_Msg:        CJNE    A,#2,KIS_No_Choice
  800.                 MOV     Kb_Str_Pointer,#00              ; Cursor auf 2. Wort -> Message
  801.                 LCALL   Get_Token
  802.                 LCALL   Is_Token_Module
  803.                 JNC     KIS_Mod_Corr
  804.                 MOV     Kb_Search_Status,#KSS_Inc_Mod   ; erstes Wort kein Korrektes Modul
  805.                 SJMP    KIS_End
  806.  
  807. KIS_Mod_Corr:   MOV     Kb_Cursor,Kb_Str_Pointer
  808.                 LCALL   Exe_Right                       ; ein Leerzeichen nach dem 1. Wort lassen
  809.                 MOV     KS_Actual_Module,A              ; Modulnummer abspeichern
  810.                 MOV     Kb_Search_DPL,#(Stat_Table # 256)
  811.                 MOV     Kb_Search_DPH,#(Stat_Table / 256)
  812.                 LCALL   Search_Next_Msg
  813.                 JC      KIS_No_Choice                   ; existiert Message fuer dieses Modul ?
  814.                 MOV     DPTR,#Kb_Str_Buffer             ; Ja -> Mess. in Textbuffer kopieren
  815.                 MOV     A,#ASCII_Space
  816.                 MOV     B,Kb_Cursor
  817.                 LCALL   Clear_Pos_Str                   ; Kb_Str_Buffer ab der Cursorposition loeschen
  818.                 MOV     DPL,Kb_Search_DPL
  819.                 MOV     DPH,Kb_Search_DPH
  820.                 INC     DPTR
  821.                 INC     DPTR
  822.                 INC     DPTR
  823.                 MOV     Kb_Search_Status,#KSS_Msg
  824.                 SJMP    KIS_Found
  825.  
  826. KIS_No_Choice:  MOV     Kb_Search_Status,#KSS_No_Choice ; Nein -> Fehlermeldung
  827.                 SJMP    KIS_End
  828.  
  829. KIS_Found:      MOV     KS_Cursor,Kb_Cursor             ; kopiert das gefundene Element
  830.                 LCALL   Copy_Pos_Buffer                 ; in Kb_Str_Buffer ab KS_Cursor
  831.                 SETB    KS_Active_Flg                   ;
  832.  
  833. KIS_End:        SETB    KS_Status_Ready
  834.                 POP     DPH
  835.                 POP     DPL
  836.                 POP     PSW
  837.                 POP     B
  838.                 POP     Acc
  839.                 RET
  840.  
  841. ;--------------------------------------------------------------------------
  842. ; Routine            : Kb_Valid_Word
  843. ; Parameter          : Kb_Str_Buffer
  844. ;                      Kb_Cursor
  845. ; Rueckgabeparameter : KS_Actual_Word
  846. ;
  847. ; Sucht auf welchem Wort der Cursor sich befindet
  848.  
  849.  
  850. Kb_Valid_Word:  PUSH    Acc
  851.                 PUSH    PSW
  852.                 PUSH    DPL
  853.                 PUSH    DPH
  854.  
  855.                 MOV     DPTR,#Kb_Str_Buffer
  856.                 MOV     Kb_Str_Pointer,#00
  857.                 MOV     KS_Actual_Word,#00
  858.  
  859. KVW_Loop:       LCALL   Get_Token
  860.                 INC     KS_Actual_Word
  861.                 CLR     C
  862.                 MOV     A,Kb_Str_Pointer
  863.                 SUBB    A,Kb_Cursor             ; wenn Kb_Str_Pointer > Kb_Cursor
  864.                 JC      KVW_Loop                ; hat man das richtige Wort gefunden
  865.  
  866.                 POP     DPH
  867.                 POP     DPL
  868.                 POP     PSW
  869.                 POP     Acc
  870.                 RET
  871.  
  872. ;--------------------------------------------------------------------------
  873. ; Routine            : Kb_Search_Up
  874. ; Parameter          : KS_Active_Flg
  875. ;                      Kb_Search_DPL
  876. ;                      Kb_Search_DPH
  877. ;                      KS_Cursor
  878. ; Rueckgabeparameter : KS_Active_Flg
  879. ;                      Kb_Search_DPL
  880. ;                      Kb_Search_DPH
  881. ;
  882. ; Legt fest, ob die Search-Routinen initialisiert werden muessen, ob das vorhergehende
  883. ; Modul, oder Message, abgeholt werden muss.
  884.  
  885.  
  886. Kb_Search_Up:   PUSH    Acc
  887.                 PUSH    PSW
  888.                 PUSH    DPL
  889.                 PUSH    DPH
  890.  
  891.                 JB      KS_Active_Flg,KSU_Choose        ; Schon im Search-Modus ?
  892.                 LCALL   Kb_Init_Search                  ; Nein -> Initialisierung
  893.                 SJMP    KSU_End
  894.  
  895. KSU_Choose:     MOV     A,KS_Actual_Word                ; Ja -> auf welchem Wort liegt der Cursor ?
  896.                 CJNE    A,#1,KSU_Msg
  897.                 LCALL   Search_Prev_Module              ; 1. Wort -> sucht Modul
  898.                 JC      KSU_Mod_Top                     ; gefunden ?
  899.                 MOV     Kb_Search_Status,#KSS_Mod       ; Ja -> DPTR retten
  900.                 MOV     DPL,Kb_Search_DPL
  901.                 MOV     DPH,Kb_Search_DPH
  902.                 INC     DPTR
  903.                 INC     DPTR
  904.                 SJMP    KSU_Show
  905.  
  906. KSU_Mod_Top:    MOV     Kb_Search_Status,#KSS_Mod_Top   ; Nein -> Top of list
  907.                 SJMP    KSU_End
  908.  
  909. KSU_Msg:        LCALL   Search_Prev_Msg                 ; 2. Wort -> sucht Message
  910.                 JC      KSU_Msg_Top                     ; gefunden ?
  911.                 MOV     Kb_Search_Status,#KSS_Msg       ; Ja -> DPTR retten
  912.                 MOV     DPL,Kb_Search_DPL
  913.                 MOV     DPH,Kb_Search_DPH
  914.                 INC     DPTR
  915.                 INC     DPTR
  916.                 INC     DPTR
  917.                 SJMP    KSU_Show
  918.  
  919. KSU_Msg_Top:    MOV     Kb_Search_Status,#KSS_Msg_Top   ; Nein -> Top of list
  920.                 SJMP    KSU_End
  921.  
  922. KSU_Show:       MOV     Kb_Cursor,KS_Cursor             ; gefundenes Wort in Textbuffer
  923.                 PUSH    DPL                             ; kopieren
  924.                 PUSH    DPH
  925.                 MOV     DPTR,#Kb_Str_Buffer
  926.                 MOV     A,#ASCII_Space
  927.                 MOV     B,Kb_Cursor
  928.                 LCALL   Clear_Pos_Str
  929.                 POP     DPH
  930.                 POP     DPL
  931.                 LCALL   Copy_Pos_Buffer
  932.  
  933. KSU_End:        SETB    KS_Status_Ready
  934.                 POP     DPH
  935.                 POP     DPL
  936.                 POP     PSW
  937.                 POP     Acc
  938.                 RET
  939.  
  940. ;--------------------------------------------------------------------------
  941. ; Routine            : Kb_Search_Down
  942. ; Parameter          : KS_Active_Flg
  943. ;                      Kb_Search_DPL
  944. ;                      Kb_Search_DPH
  945. ;                      KS_Cursor
  946. ; Rueckgabeparameter : KS_Active_Flg
  947. ;                      Kb_Search_DPL
  948. ;                      Kb_Search_DPH
  949. ;
  950. ; Legt fest, ob die Search-Routinen initialisiert werden muessen, ob das naechste
  951. ; Modul, oder Message, abgeholt werden muss.
  952.  
  953.  
  954. Kb_Search_Down: PUSH    Acc
  955.                 PUSH    PSW
  956.                 PUSH    DPL
  957.                 PUSH    DPH
  958.  
  959.                 JB      KS_Active_Flg,KSD_Choose        ; schon im Search Modus ?
  960.                 LCALL   Kb_Init_Search                  ; Nein -> Initialisierung
  961.                 SJMP    KSD_End
  962.  
  963. KSD_Choose:     MOV     A,KS_Actual_Word                ; Ja -> welches Wort ?
  964.                 CJNE    A,#1,KSD_Msg
  965.                 LCALL   Search_Next_Module              ; 1. Wort -> sucht naechstes Modul
  966.                 JC      KSD_Mod_Bot                     ; gefunden ?
  967.                 MOV     Kb_Search_Status,#KSS_Mod       ; Ja -> DPTR retten
  968.                 MOV     DPL,Kb_Search_DPL
  969.                 MOV     DPH,Kb_Search_DPH
  970.                 INC     DPTR
  971.                 INC     DPTR
  972.                 SJMP    KSD_Show
  973.  
  974. KSD_Mod_Bot:    MOV     Kb_Search_Status,#KSS_Mod_Bot   ; Nein -> bottom of list
  975.                 SJMP    KSD_End
  976.  
  977. KSD_Msg:        LCALL   Search_Next_Msg                 ; 2. Wort -> sucht naechste Message
  978.                 JC      KSD_Msg_Bot                     ; gefunden ?
  979.                 MOV     Kb_Search_Status,#KSS_Msg       ; Ja -> DPTR retten
  980.                 MOV     DPL,Kb_Search_DPL
  981.                 MOV     DPH,Kb_Search_DPH
  982.                 INC     DPTR
  983.                 INC     DPTR
  984.                 INC     DPTR
  985.                 SJMP    KSD_Show
  986.  
  987. KSD_Msg_Bot:    MOV     Kb_Search_Status,#KSS_Msg_Bot   ; Nein -> bottom of list
  988.                 SJMP    KSD_End
  989.  
  990. KSD_Show:       MOV     Kb_Cursor,KS_Cursor             ; gefundenes Wort in Textbuffer
  991.                 PUSH    DPL                             ; kopieren
  992.                 PUSH    DPH
  993.                 MOV     DPTR,#Kb_Str_Buffer
  994.                 MOV     A,#ASCII_Space
  995.                 MOV     B,Kb_Cursor
  996.                 LCALL   Clear_Pos_Str
  997.                 POP     DPH
  998.                 POP     DPL
  999.                 LCALL   Copy_Pos_Buffer
  1000.  
  1001. KSD_End:        SETB    KS_Status_Ready
  1002.                 POP     DPH
  1003.                 POP     DPL
  1004.                 POP     PSW
  1005.                 POP     Acc
  1006.                 RET
  1007.  
  1008. ;--------------------------------------------------------------------------
  1009. ; Routine            : Search_Next_Module
  1010. ; Parameter          : Kb_Search_DPL
  1011. ;                      Kb_Search_DPH
  1012. ; Rueckgabeparameter : C  (gesetzt -> nicht gefunden)
  1013. ;                      Kb_Search_DPL
  1014. ;                      Kb_Search_DPH
  1015. ;
  1016. ; Sucht naechstes Modul ab aktueller Position in der Tabelle (durch KB_Search_DPL
  1017. ; (DPH) gespeichert)
  1018.  
  1019.  
  1020. Search_Next_Module:
  1021.                 PUSH    Acc
  1022.                 PUSH    DPL
  1023.                 PUSH    DPH
  1024.  
  1025.                 MOV     DPL,Kb_Search_DPL       ; aktuelle Pos. in DPTR laden
  1026.                 MOV     DPH,Kb_Search_DPH
  1027.                 MOV     A,#1
  1028.                 MOVC    A,@A+DPTR
  1029.                 ADD     A,DPL                   ; DPTR mit Offset addieren
  1030.                 MOV     DPL,A
  1031.                 JNC     SNMod_Cont
  1032.                 INC     DPH
  1033. SNMod_Cont:     CLR     C
  1034.                 CLR     A
  1035.                 MOVC    A,@A+DPTR
  1036.                 XRL     A,#TableEnd
  1037.                 JZ      SNMod_End               ; Ende der Tabelle ?
  1038.                 MOV     Kb_Search_DPL,DPL       ; Nein -> DPTR retten
  1039.                 MOV     Kb_Search_DPH,DPH
  1040.                 CPL     C
  1041.  
  1042. SNMod_End:      CPL     C                       ; Ja -> nicht gefunden
  1043.                 POP     DPH
  1044.                 POP     DPL
  1045.                 POP     Acc
  1046.                 RET
  1047.  
  1048. ;--------------------------------------------------------------------------
  1049. ; Routine            : Search_Prev_Module
  1050. ; Parameter          : Kb_Search_DPL
  1051. ;                      Kb_Search_DPH
  1052. ; Rueckgabeparameter : C  (gesetzt -> nicht gefunden)
  1053. ;                      Kb_Search_DPL
  1054. ;                      Kb_Search_DPH
  1055. ;
  1056. ; Sucht vorhergehendes Modul ab aktueller Position in der Tabelle (durch KB_Search_DPL
  1057. ; (DPH) gespeichert). Analog zu Search_Next_Module
  1058.  
  1059.  
  1060. Search_Prev_Module:
  1061.                 PUSH    Acc
  1062.                 PUSH    AR1
  1063.                 PUSH    DPL
  1064.                 PUSH    DPH
  1065.  
  1066.                 MOV     DPL,Kb_Search_DPL
  1067.                 MOV     DPH,Kb_Search_DPH
  1068.                 DEC_DPTR
  1069.                 CLR     A
  1070.                 MOVC    A,@A+DPTR
  1071.                 INC     DPTR
  1072.                 CLR     C
  1073.                 MOV     R1,A
  1074.                 MOV     A,DPL
  1075.                 SUBB    A,R1
  1076.                 MOV     DPL,A
  1077.                 JNC     SPMod_Cont
  1078.                 DEC     DPH
  1079. SPMod_Cont:     CLR     C
  1080.                 CLR     A
  1081.                 MOVC    A,@A+DPTR
  1082.                 XRL     A,#TableAnf
  1083.                 JZ      SPMod_End
  1084.                 MOV     Kb_Search_DPL,DPL
  1085.                 MOV     Kb_Search_DPH,DPH
  1086.                 CPL     C
  1087.  
  1088. SPMod_End:      CPL     C
  1089.                 POP     DPH
  1090.                 POP     DPL
  1091.                 POP     AR1
  1092.                 POP     Acc
  1093.                 RET
  1094.  
  1095. ;--------------------------------------------------------------------------
  1096. ; Routine            : Search_Next_Msg
  1097. ; Parameter          : Kb_Search_DPL
  1098. ;                      Kb_Search_DPH
  1099. ;                      KS_Actual_Module
  1100. ; Rueckgabeparameter : C  (gesetzt -> nicht gefunden)
  1101. ;                      Kb_Search_DPL
  1102. ;                      Kb_Search_DPH
  1103. ;
  1104. ; Sucht naechste Message ab aktueller Position in der Tabelle (durch KB_Search_DPL
  1105. ; (DPH) gespeichert), die KS_Actual_Module entspricht
  1106.  
  1107.  
  1108. Search_Next_Msg:
  1109.                 PUSH    Acc
  1110.                 PUSH    DPL
  1111.                 PUSH    DPH
  1112.  
  1113.                 MOV     DPL,Kb_Search_DPL       ; aktuelle Pos. in DPTR laden
  1114.                 MOV     DPH,Kb_Search_DPH
  1115.  
  1116. SNMsg_Loop:     MOV     A,#1
  1117.                 MOVC    A,@A+DPTR
  1118.                 ADD     A,DPL                   ; DPTR und Offset addieren
  1119.                 MOV     DPL,A
  1120.                 JNC     SNMsg_Cont
  1121.                 INC     DPH
  1122. SNMsg_Cont:     CLR     C
  1123.                 CLR     A
  1124.                 MOVC    A,@A+DPTR
  1125.                 CJNE    A,#TableEnd,SNMsg_Mod   ; Ende der Tabelle ?
  1126.                 SETB    C                       ; Ja -> nicht gefunden
  1127.                 SJMP    SNMsg_End
  1128. SNMsg_Mod:      CJNE    A,KS_Actual_Module,SNMsg_Loop ; Nein -> Modulnummer korrekt ?
  1129.                                                       ;         Nein -> sucht weiter
  1130.                 MOV     Kb_Search_DPL,DPL             ;         Ja -> DPTR retten
  1131.                 MOV     Kb_Search_DPH,DPH
  1132.                 CLR     C
  1133.  
  1134. SNMsg_End:      POP     DPH
  1135.                 POP     DPL
  1136.                 POP     Acc
  1137.                 RET
  1138.  
  1139. ;--------------------------------------------------------------------------
  1140. ; Routine            : Search_Prev_Msg
  1141. ; Parameter          : Kb_Search_DPL
  1142. ;                      Kb_Search_DPH
  1143. ;                      KS_Actual_Module
  1144. ; Rueckgabeparameter : C  (gesetzt -> nicht gefunden)
  1145. ;                      Kb_Search_DPL
  1146. ;                      Kb_Search_DPH
  1147. ;
  1148. ; Sucht vorhergehende Message ab aktueller Position in der Tabelle (durch KB_Search_DPL
  1149. ; (DPH) gespeichert), die KS_Actual_Module entspricht. Analog zu Search_Next_Msg
  1150.  
  1151.  
  1152. Search_Prev_Msg:
  1153.                 PUSH    Acc
  1154.                 PUSH    DPL
  1155.                 PUSH    DPH
  1156.                 PUSH    AR1
  1157.  
  1158.                 MOV     DPL,Kb_Search_DPL
  1159.                 MOV     DPH,Kb_Search_DPH
  1160.  
  1161. SPMsg_Loop:     DEC_DPTR
  1162.                 CLR     A
  1163.                 MOVC    A,@A+DPTR
  1164.                 INC     DPTR
  1165.                 CLR     C
  1166.                 MOV     R1,A
  1167.                 MOV     A,DPL
  1168.                 SUBB    A,R1
  1169.                 MOV     DPL,A
  1170.                 JNC     SPMsg_Cont
  1171.                 DEC     DPH
  1172. SPMsg_Cont:     CLR     C
  1173.                 CLR     A
  1174.                 MOVC    A,@A+DPTR
  1175.                 CJNE    A,#TableAnf,SPMsg_Mod
  1176.                 SETB    C
  1177.                 SJMP    SPMsg_End
  1178. SPMsg_Mod:      CJNE    A,KS_Actual_Module,SPMsg_Loop
  1179.                 MOV     Kb_Search_DPL,DPL
  1180.                 MOV     Kb_Search_DPH,DPH
  1181.                 CLR     C
  1182.  
  1183. SPMsg_End:      POP     AR1
  1184.                 POP     DPH
  1185.                 POP     DPL
  1186.                 POP     Acc
  1187.                 RET
  1188.  
  1189. ;--------------------------------------------------------------------------
  1190. ; Routine            : Text_Decoder
  1191. ; Parameter          : Kb_Str_Buffer
  1192. ; Rueckgabeparameter : Msg_Registers
  1193. ;                      Text_Dec_Status
  1194. ;                      TD_Status_Ready
  1195. ;                      TD_Send_Ready
  1196. ;                      Stat_Module
  1197. ;                      Stat_Num_Param
  1198. ;                      Stat_Picture
  1199. ;                      Stat_Length
  1200. ;                      Stat_Code
  1201. ;
  1202. ; Interpretiert den im Kb_Str_Buffer liegenden Text und legt die entsprechenden
  1203. ; Werte in Msg_Registers und Stat_ Variablen ab. Wenn korrekter Text, setzt das
  1204. ; TD_Send_Ready-Flag (ready to send).
  1205.  
  1206.  
  1207. Text_Decoder:   PUSH    AR0
  1208.                 PUSH    AR1
  1209.                 PUSH    AR2
  1210.                 PUSH    Acc
  1211.                 PUSH    PSW
  1212.                 PUSH    DPL
  1213.                 PUSH    DPH
  1214.  
  1215.                 LCALL   Clr_Msg_Buffer
  1216.                 MOV     Stat_Length,#02
  1217.  
  1218.                 CLR     Kb_Str_Ready
  1219.                 MOV     Kb_Str_Pointer,#00
  1220.                 LCALL   Get_Token               ; sucht 1. Wort
  1221.                 JNC     TD_Module               ; gefunden ?
  1222.                 MOV     Text_Dec_Status,#5      ; Nein -> Fehler (fehlendes Modul)
  1223.                 LJMP    TD_End
  1224.  
  1225. TD_Module:      LCALL   Is_Token_Module         ; Ja -> ist das Modul korrekt ?
  1226.                 JNC     TD_Statement
  1227.                 MOV     Text_Dec_Status,#6      ; Nein -> Fehler (inkorrektes Modul)
  1228.                 LJMP    TD_End
  1229.  
  1230. TD_Statement:   MOV     Stat_Module,A           ; Ja -> Modulnummer abspeichern
  1231.                 LCALL   Get_Token               ; sucht 2. Wort
  1232.                 JNC     TD_Stat_Cont            ; gefunden ?
  1233.                 MOV     Text_Dec_Status,#1      ; Nein -> Fehler (fehlende Message)
  1234.                 LJMP    TD_End
  1235.  
  1236. TD_Stat_Cont:   MOV     R0,#(Token_Str # 256)   ; Ja -> sucht Message in der Tabelle
  1237.                 MOV     R1,#(Token_Str / 256)
  1238.                 MOV     DPTR,#Stat_Table
  1239.  
  1240. TD_Stat_Loop:   CLR     A                       ;
  1241.                 MOVC    A,@A+DPTR               ;
  1242.                 CJNE    A,#TableEnd,TD_Stat_Cont2
  1243.                 MOV     Text_Dec_Status,#2      ; nur die Messages der Tabelle, die
  1244.                 LJMP    TD_End                  ; das aktuelle Modul entsprechen, muessen
  1245.                                                 ; betrachtet werden
  1246. TD_Stat_Cont2:  XRL     A,Stat_Module           ;
  1247.                 JZ      TD_Stat_Check           ;
  1248.  
  1249. TD_Stat_Next:   MOV     A,#01                   ;
  1250.                 MOVC    A,@A+DPTR               ;
  1251.                 ADD     A,DPL                   ; sucht naechste Message in der
  1252.                 MOV     DPL,A                   ; Tabelle
  1253.                 JNC     TD_Stat_Loop            ;
  1254.                 INC     DPH                     ;
  1255.                 SJMP    TD_Stat_Loop            ;
  1256.  
  1257. TD_Stat_Check:  INC     DPTR
  1258.                 INC     DPTR
  1259.                 CLR     A
  1260.                 MOVC    A,@A+DPTR
  1261.                 MOV     Stat_Code,A
  1262.                 INC     DPTR
  1263.  
  1264.                 LCALL   Compare_Str             ; Text und Message in der Tabelle
  1265.                 JNC     TD_Parameters           ; vergleichen
  1266.                 DEC_DPTR
  1267.                 DEC_DPTR
  1268.                 DEC_DPTR
  1269.                 SJMP    TD_Stat_Next            ; nicht gleich -> next one !
  1270.  
  1271. TD_Parameters:  LCALL   Jump_Blank_Str          ; gleich -> Parameter dekodieren
  1272.                 MOV     R0,#Msg_Registers
  1273.                 MOV     @R0,Stat_Module
  1274.  
  1275.                 INC     R0
  1276.                 MOV     @R0,Stat_Code
  1277.  
  1278.                 INC     DPTR
  1279.                 CLR     A
  1280.                 MOVC    A,@A+DPTR
  1281.                 MOV     Stat_Num_Param,A
  1282.                 MOV     R1,A
  1283.                 JZ      TD_Send
  1284.  
  1285.                 INC     DPTR
  1286.                 CLR     A
  1287.                 MOVC    A,@A+DPTR
  1288.                 MOV     Stat_Picture,A
  1289.                 INC     R0
  1290.  
  1291. TD_Par_Loop:    LCALL   Get_Token
  1292.                 JNC     TD_Par_Symbol
  1293.                 MOV     Text_Dec_Status,#3
  1294.                 LJMP    TD_End
  1295.  
  1296. TD_Par_Symbol:  CLR     C
  1297.                 LCALL   Is_Token_Symbol
  1298.                 JC      TD_Par_Digit
  1299.                 MOV     ASCII_Low_Byte,A
  1300.                 MOV     ASCII_High_Byte,#00
  1301.                 SJMP    TD_Par_Load
  1302.  
  1303. TD_Par_Digit:   CLR     C
  1304.                 LCALL   ASCII_To_Bin
  1305.                 JNC     TD_Par_Load
  1306.                 MOV     Text_Dec_Status,#4
  1307.                 SJMP    TD_End
  1308.  
  1309. TD_Par_Load:    MOV     A,Stat_Picture
  1310.                 JB      Acc.0,TD_Par_Single
  1311.                 MOV     @R0,ASCII_High_Byte
  1312.                 MOV     ASCII_High_Byte,#00
  1313.                 INC     R0
  1314.                 INC     Stat_Length
  1315.  
  1316. TD_Par_Single:  MOV     R2,ASCII_High_Byte
  1317.                 CJNE    R2,#00,TD_Par_Error
  1318.                 MOV     @R0,ASCII_Low_Byte
  1319.                 INC     R0
  1320.                 INC     Stat_Length
  1321.                 RR      A
  1322.                 MOV     Stat_Picture,A
  1323.                 DJNZ    R1,TD_Par_Loop
  1324.  
  1325. TD_Send:        MOV     Text_Dec_Status,#0
  1326.                 SETB    TD_Send_Ready
  1327.                 LCALL   Get_Token
  1328.                 JC      TD_End
  1329.                 MOV     Text_Dec_Status,#7
  1330.                 SJMP    TD_End
  1331.  
  1332. TD_Par_Error:   MOV     Text_Dec_Status,#4
  1333.  
  1334. TD_End:         SETB    TD_Status_Ready
  1335.                 SETB    TD_Next_Flg
  1336.                 POP     DPH
  1337.                 POP     DPL
  1338.                 POP     PSW
  1339.                 POP     Acc
  1340.                 POP     AR2
  1341.                 POP     AR1
  1342.                 POP     AR0
  1343.                 RET
  1344.  
  1345. ;--------------------------------------------------------------------------
  1346.  
  1347. Get_Token:      PUSH    Acc
  1348.                 PUSH    P2
  1349.                 PUSH    DPL
  1350.                 PUSH    DPH
  1351.                 PUSH    AR0
  1352.                 PUSH    AR1
  1353.                 PUSH    AR2
  1354.  
  1355.                 MOV     DPTR,#Token_Str
  1356.                 CLR     A
  1357.                 LCALL   Clear_Str
  1358.                 MOV     DPTR,#Kb_Str_Buffer
  1359.                 MOV     A,#Kb_Max_Length        ;
  1360.                 CLR     C                       ;
  1361.                 SUBB    A,Kb_Str_Pointer        ;
  1362.                 JNZ     GT_Cont                 ; R2 = Anzahl der noch
  1363.                 SETB    C                       ; zuverarbeitenden
  1364.                 SJMP    GT_End                  ; Buchstaben
  1365.                                                 ;
  1366. GT_Cont:        MOV     R2,A                    ;
  1367.                 MOV     A,DPL
  1368.                 ADD     A,Kb_Str_Pointer
  1369.                 MOV     DPL,A
  1370.                 JNC     GT_Blank_Loop
  1371.                 INC     DPH
  1372.  
  1373. GT_Blank_Loop:  MOVX    A,@DPTR
  1374.                 CJNE    A,#ASCII_Space,GT_Text
  1375.                 INC     DPTR
  1376.                 INC     Kb_Str_Pointer
  1377.                 DJNZ    R2,GT_Blank_Loop
  1378.                 SETB    C
  1379.                 SJMP    GT_End
  1380.  
  1381. GT_Text:        MOV     R0,#(Token_Str # 256)
  1382.                 MOV     R1,#(Token_Str / 256)
  1383.  
  1384. GT_Text_Loop:   MOVX    A,@DPTR
  1385.                 CJNE    A,#ASCII_Space,GT_Text_Add
  1386.                 CLR     C
  1387.                 SJMP    GT_End
  1388.  
  1389. GT_Text_Add:    LCALL   UpCase
  1390.                 MOV     P2,R1
  1391.                 MOVX    @R0,A
  1392.                 INC     Kb_Str_Pointer
  1393.                 INC_R0R1
  1394.                 INC     DPTR
  1395.                 DJNZ    R2,GT_Text_Loop
  1396.                 CLR     C
  1397.  
  1398. GT_End:         POP     AR2
  1399.                 POP     AR1
  1400.                 POP     AR0
  1401.                 POP     DPH
  1402.                 POP     DPL
  1403.                 POP     P2
  1404.                 POP     Acc
  1405.                 RET
  1406.  
  1407. ;--------------------------------------------------------------------------
  1408.  
  1409. Compare_Str:    IRP     Source,Acc,P2,DPL,DPH,AR0,AR1,AR2,AR3
  1410.                 PUSH    Source
  1411.                 ENDM
  1412.  
  1413.                 CLR     C
  1414.                 MOV     R2,#Kb_Max_Length
  1415.  
  1416.                 CLR     A
  1417.                 MOVC    A,@A+DPTR
  1418.                 CJNE    A,#StringEnde,Comp_Loop
  1419.                 SJMP    Comp_False
  1420.  
  1421. Comp_Loop:      MOV     R3,A
  1422.                 MOV     P2,R1
  1423.                 MOVX    A,@R0
  1424.                 XRL     A,R3
  1425.                 JNZ     Comp_False
  1426.                 MOV     A,R3
  1427.                 JZ      Comp_End
  1428.                 INC     DPTR
  1429.                 INC_R0R1
  1430.                 CLR     A
  1431.                 MOVC    A,@A+DPTR
  1432.                 DJNZ    R2,Comp_Loop
  1433.                 CPL     C
  1434.  
  1435. Comp_False:     CPL     C
  1436.  
  1437. Comp_End:       IRP     Target,AR3,AR2,AR1,AR0,DPH,DPL,P2,Acc
  1438.                 POP     Target
  1439.                 ENDM
  1440.                 RET
  1441.  
  1442. ;--------------------------------------------------------------------------
  1443. TeachIn_Sampler:
  1444.                 PUSH    Acc
  1445.                 PUSH    PSW
  1446.                 PUSH    AR1
  1447.                 MOV     TH0,#0FCh
  1448.  
  1449.                 MOV     Temp_P4,P4
  1450.                 MOV     Temp_P5,P5
  1451.                 MOV     A,Temp_P4
  1452.                 XRL     A,Save_P4
  1453.                 JNZ     TI_Smp_Edge
  1454.                 MOV     A,Temp_P5
  1455.                 XRL     A,Save_P5
  1456.                 JZ      TI_Smp_Inc
  1457.  
  1458. TI_Smp_Edge:    MOV     TI_Sample_Counter,#00
  1459.                 MOV     Save_P4,Temp_P4
  1460.                 MOV     Save_P5,Temp_P5
  1461.                 SJMP    TI_Smp_End
  1462.  
  1463. TI_Smp_Inc:     INC     TI_Sample_Counter
  1464.                 MOV     A,TI_Sample_Counter
  1465.                 CJNE    A,#TI_Sample_Valid_Time,TI_Smp_End
  1466.                 MOV     TI_Sample_Counter,#00
  1467.                 MOV     A,Old_P4
  1468.                 XRL     A,Save_P4
  1469.                 JNZ     TI_Smp_Change
  1470.                 MOV     A,Old_P5
  1471.                 XRL     A,Save_P5
  1472.                 JZ      TI_Smp_End
  1473.  
  1474. TI_Smp_Change:  SETB    TI_Sample_Chg_Flg
  1475.                 JNB     TID_Done_Flg,TISC_No_Init
  1476.                 CLR     TID_Done_Flg
  1477.                 MOV     TI_On_P4,#00
  1478.                 MOV     TI_Off_P4,#00
  1479.                 MOV     TI_On_P5,#00
  1480.                 MOV     TI_Off_P5,#00
  1481.  
  1482. TISC_No_Init:   MOV     A,Old_P4
  1483.                 XRL     A,Save_P4
  1484.                 MOV     R1,A                    ; R1 = Save_P4
  1485.                 MOV     A,Save_P4
  1486.                 CPL     A
  1487.                 ANL     A,R1
  1488.                 ORL     A,TI_On_P4
  1489.                 MOV     TI_On_P4,A
  1490.  
  1491.                 MOV     A,Save_P4
  1492.                 ANL     A,R1
  1493.                 MOV     TI_Off_P4,A
  1494.                 MOV     A,Old_P5
  1495.                 XRL     A,Save_P5
  1496.                 MOV     R1,A
  1497.                 MOV     A,Save_P5
  1498.                 CPL     A
  1499.                 ANL     A,R1
  1500.                 MOV     TI_On_P5,A
  1501.                 MOV     A,Save_P5
  1502.                 ANL     A,R1
  1503.                 MOV     TI_Off_P5,A
  1504.  
  1505.                 MOV     Old_P4,Save_P4
  1506.                 MOV     Old_P5,Save_P5
  1507.  
  1508. TI_Smp_End:     POP     AR1
  1509.                 POP     PSW
  1510.                 POP     Acc
  1511.                 RETI
  1512.  
  1513. ;--------------------------------------------------------------------------
  1514.  
  1515. TeachIn_Decoder:
  1516.                 PUSH    Acc
  1517.                 PUSH    DPL
  1518.                 PUSH    DPH
  1519.  
  1520.                 CLR     TI_Sample_Chg_Flg
  1521.                 MOV     A,TI_On_P4
  1522.                 JZ      TID_Table2
  1523.                 JB      Sys_Robot_Mode,TID_T1_Rob
  1524.                 MOV     DPTR,#KOn_P4_Frs
  1525.                 LCALL   TID_Main
  1526.                 SJMP    TID_Table2
  1527.  
  1528. TID_T1_Rob:     MOV     DPTR,#KOn_P4_Rob
  1529.                 LCALL   TID_Main
  1530.  
  1531. TID_Table2:     MOV     A,TI_Off_P4
  1532.                 JZ      TID_Table3
  1533.                 JB      Sys_Robot_Mode,TID_T2_Rob
  1534.                 MOV     DPTR,#KOff_P4_Frs
  1535.                 LCALL   TID_Main
  1536.                 SJMP    TID_Table3
  1537.  
  1538. TID_T2_Rob:     MOV     DPTR,#KOff_P4_Rob
  1539.                 LCALL   TID_Main
  1540.  
  1541. TID_Table3:     MOV     A,TI_On_P5
  1542.                 JZ      TID_Table4
  1543.                 JB      Sys_Robot_Mode,TID_T3_Rob
  1544.                 MOV     DPTR,#KOn_P5_Frs
  1545.                 LCALL   TID_Main
  1546.                 SJMP    TID_Table4
  1547.  
  1548. TID_T3_Rob:     MOV     DPTR,#KOn_P5_Rob
  1549.                 LCALL   TID_Main
  1550.  
  1551. TID_Table4:     MOV     A,TI_Off_P5
  1552.                 JZ      TID_End
  1553.                 JB      Sys_Robot_Mode,TID_T4_Rob
  1554.                 MOV     DPTR,#KOff_P5_Frs
  1555.                 LCALL   TID_Main
  1556.                 SJMP    TID_End
  1557.  
  1558. TID_T4_Rob:     MOV     DPTR,#KOff_P5_Rob
  1559.                 LCALL   TID_Main
  1560.  
  1561. TID_End:        SETB    TID_Done_Flg
  1562.  
  1563.                 POP     DPH
  1564.                 POP     DPL
  1565.                 POP     Acc
  1566.                 RET
  1567.  
  1568. ;--------------------------------------------------------------------------
  1569.  
  1570. TID_Main:       PUSH    Acc
  1571.                 PUSH    PSW
  1572.                 PUSH    DPL
  1573.                 PUSH    DPH
  1574.                 PUSH    AR0
  1575.                 PUSH    AR1
  1576.  
  1577.                 MOV     R1,#8
  1578. TID_Main_Loop:  CLR     C
  1579.                 RRC     A
  1580.                 JNC     TID_Main_Next
  1581.  
  1582.                 PUSH    Acc
  1583.                 MOV     A,#1
  1584.                 MOVC    A,@A+DPTR
  1585.                 MOV     R0,A
  1586.                 POP     Acc
  1587.                 CJNE    R0,#StringEnde,TID_Main_Msg
  1588.                 SJMP    TID_Main_Next
  1589.  
  1590. TID_Main_Msg:   PUSH    DPL
  1591.                 PUSH    DPH
  1592.                 PUSH    Acc
  1593.                 MOV     DPTR,#Kb_Str_Buffer
  1594.                 MOV     A,#ASCII_Space
  1595.                 LCALL   Clear_Str
  1596.                 POP     Acc
  1597.                 POP     DPH
  1598.                 POP     DPL
  1599.  
  1600.                 INC     DPTR
  1601.                 MOV     Kb_Cursor,#00
  1602.                 LCALL   Copy_Pos_Buffer
  1603.                 SETB    Kb_Str_Ready
  1604.                 SETB    Kb_Dsp_Ready
  1605.                 CLR     KS_Active_Flg
  1606.                 DEC_DPTR
  1607.                 LCALL   Main_Manager
  1608.  
  1609. TID_Main_Next:  PUSH    Acc
  1610.                 CLR     A
  1611.                 MOVC    A,@A+DPTR
  1612.                 ADD     A,DPL
  1613.                 MOV     DPL,A
  1614.                 JNC     TIDM_Next_Cont
  1615.                 INC     DPH
  1616.  
  1617. TIDM_Next_Cont: POP     Acc
  1618.                 DJNZ    R1,TID_Main_Loop
  1619.  
  1620.                 POP     AR1
  1621.                 POP     AR0
  1622.                 POP     DPH
  1623.                 POP     DPL
  1624.                 POP     PSW
  1625.                 POP     Acc
  1626.                 RET
  1627.  
  1628. ;--------------------------------------------------------------------------
  1629.  
  1630. Send_Manager:   PUSH    Acc
  1631.                 PUSH    B
  1632.                 PUSH    DPL
  1633.                 PUSH    DPH
  1634.                 PUSH    AR0
  1635.                 PUSH    PSW
  1636.  
  1637.                 CLR     TD_Send_Ready
  1638.  
  1639. Send_Mng_Load:  MOV     R0,#Msg_Registers
  1640.                 MOV     R0_Bk1,@R0
  1641.                 MOV     A,@R0                   ; logische Adresse
  1642.                 INC     R0
  1643.                 MOV     R1_Bk1,@R0
  1644.                 INC     R0
  1645.                 MOV     R2_Bk1,@R0
  1646.                 INC     R0
  1647.                 MOV     R3_Bk1,@R0
  1648.                 INC     R0
  1649.                 MOV     R4_Bk1,@R0
  1650.                 INC     R0
  1651.                 MOV     R5_Bk1,@R0
  1652.                 INC     R0
  1653.                 MOV     R6_Bk1,@R0
  1654.                 INC     R0
  1655.                 MOV     R7_Bk1,@R0
  1656.  
  1657.                 MOV     DPTR,#Adr_Table
  1658.                 MOVC    A,@A+DPTR
  1659.                 MOV     B,Stat_Length
  1660.                 SETB    RS0
  1661.                 CLR     RS1
  1662.  
  1663.                 Post_Message
  1664.  
  1665.                 POP     PSW
  1666.                 POP     AR0
  1667.                 POP     DPH
  1668.                 POP     DPL
  1669.                 POP     B
  1670.                 POP     Acc
  1671.                 RET
  1672. ;--------------------------------------------------------------------------
  1673.  
  1674. Receive_Sampler:
  1675.                 lcall MESSAGE_INTERRUPT
  1676. ;                SETB    Receive_Ready
  1677.                 RET
  1678.  
  1679.  
  1680. Receive_Manager:
  1681.                 PUSH    Acc
  1682.                 PUSH    B
  1683.                 PUSH    PSW
  1684.  
  1685.                 CLR     Receive_Ready
  1686.                 SETB    RS0
  1687.                 CLR     RS1
  1688.  
  1689.                 Take_Message
  1690.                 CLR     RS0
  1691.                 MOV     Rcv_Msg_Length,A
  1692.                 MOV     DPTR,#Net_Rcv_Str
  1693.                 MOV     A,#ASCII_Space
  1694.                 LCALL   Clear_Str
  1695.  
  1696.                 MOV     A,R1_Bk1
  1697.                 LCALL   Bin_To_ASCII
  1698.                 MOVX    @DPTR,A
  1699.                 INC     DPTR
  1700.                 MOV     A,B
  1701.                 MOVX    @DPTR,A
  1702.                 INC     DPTR
  1703.                 MOV     A,#ASCII_Space
  1704.                 MOVX    @DPTR,A
  1705.                 INC     DPTR
  1706.  
  1707.                 MOV     A,R2_Bk1
  1708.                 LCALL   Bin_To_ASCII
  1709.                 MOVX    @DPTR,A
  1710.                 INC     DPTR
  1711.                 MOV     A,B
  1712.                 MOVX    @DPTR,A
  1713.                 INC     DPTR
  1714.                 MOV     A,#ASCII_Space
  1715.                 MOVX    @DPTR,A
  1716.                 INC     DPTR
  1717.  
  1718.                 MOV     A,R3_Bk1
  1719.                 LCALL   Bin_To_ASCII
  1720.                 MOVX    @DPTR,A
  1721.                 INC     DPTR
  1722.                 MOV     A,B
  1723.                 MOVX    @DPTR,A
  1724.                 INC     DPTR
  1725.                 MOV     A,#ASCII_Space
  1726.                 MOVX    @DPTR,A
  1727.                 INC     DPTR
  1728.  
  1729.                 MOV     A,R4_Bk1
  1730.                 LCALL   Bin_To_ASCII
  1731.                 MOVX    @DPTR,A
  1732.                 INC     DPTR
  1733.                 MOV     A,B
  1734.                 MOVX    @DPTR,A
  1735.                 INC     DPTR
  1736.                 MOV     A,#ASCII_Space
  1737.                 MOVX    @DPTR,A
  1738.                 INC     DPTR
  1739.  
  1740.                 MOV     A,R5_Bk1
  1741.                 LCALL   Bin_To_ASCII
  1742.                 MOVX    @DPTR,A
  1743.                 INC     DPTR
  1744.                 MOV     A,B
  1745.                 MOVX    @DPTR,A
  1746.                 INC     DPTR
  1747.                 MOV     A,#ASCII_Space
  1748.                 MOVX    @DPTR,A
  1749.                 INC     DPTR
  1750.  
  1751.                 MOV     A,R6_Bk1
  1752.                 LCALL   Bin_To_ASCII
  1753.                 MOVX    @DPTR,A
  1754.                 INC     DPTR
  1755.                 MOV     A,B
  1756.                 MOVX    @DPTR,A
  1757.                 INC     DPTR
  1758.                 MOV     A,#ASCII_Space
  1759.                 MOVX    @DPTR,A
  1760.                 INC     DPTR
  1761.  
  1762.                 MOV     A,R7_Bk1
  1763.                 LCALL   Bin_To_ASCII
  1764.                 MOVX    @DPTR,A
  1765.                 INC     DPTR
  1766.                 MOV     A,B
  1767.                 MOVX    @DPTR,A
  1768.                 INC     DPTR
  1769.                 MOV     A,#ASCII_Space
  1770.                 MOVX    @DPTR,A
  1771.  
  1772.                 MOV     DPTR,#Net_Rcv_Str
  1773.                 SETB    Ext_Dsp_Ready
  1774.  
  1775.                 POP     PSW
  1776.                 POP     B
  1777.                 POP     Acc
  1778.                 RET
  1779.  
  1780. ;=============================== Tools ====================================
  1781.  
  1782. Is_Token_Symbol:
  1783.                 PUSH    AR0
  1784.                 PUSH    AR1
  1785.                 PUSH    AR2
  1786.                 PUSH    AR3
  1787.                 PUSH    DPL
  1788.                 PUSH    DPH
  1789.  
  1790.                 CLR     C
  1791.                 MOV     DPTR,#Symbol_Table
  1792.                 MOV     R0,#(Token_Str # 256)
  1793.                 MOV     R1,#(Token_Str / 256)
  1794.  
  1795. Is_Symb_Loop:   CLR     A
  1796.                 MOVC    A,@A+DPTR
  1797.                 MOV     R3,A            ; Symbolwert
  1798.                 XRL     A,#TableEnd
  1799.                 JZ      Is_Symb_Not_Found
  1800.  
  1801.                 INC     DPTR
  1802.                 CLR     A
  1803.                 MOVC    A,@A+DPTR
  1804.                 MOV     R2,A            ; Offset
  1805.  
  1806.                 INC     DPTR
  1807.                 LCALL   Compare_Str
  1808.                 JNC     Is_Symb_Found
  1809.  
  1810.                 DEC_DPTR
  1811.                 DEC_DPTR
  1812.                 MOV     A,DPL
  1813.                 ADD     A,R2
  1814.                 MOV     DPL,A
  1815.                 JNC     Is_Symb_Loop
  1816.                 INC     DPH
  1817.                 SJMP    Is_Symb_Loop
  1818.  
  1819. Is_Symb_Found:  MOV     A,R3
  1820.                 CLR     C
  1821.                 SJMP    Is_Symb_End
  1822.  
  1823. Is_Symb_Not_Found:
  1824.                 SETB    C
  1825.  
  1826. Is_Symb_End:    POP     DPH
  1827.                 POP     DPL
  1828.                 POP     AR3
  1829.                 POP     AR2
  1830.                 POP     AR1
  1831.                 POP     AR0
  1832.                 RET
  1833.  
  1834. ;--------------------------------------------------------------------------
  1835.  
  1836. Is_Token_Module:
  1837.                 PUSH    AR0
  1838.                 PUSH    AR1
  1839.                 PUSH    AR2
  1840.                 PUSH    AR3
  1841.                 PUSH    DPL
  1842.                 PUSH    DPH
  1843.  
  1844.                 CLR     C
  1845.                 MOV     DPTR,#Module_Table
  1846.                 MOV     R0,#(Token_Str # 256)
  1847.                 MOV     R1,#(Token_Str / 256)
  1848.  
  1849. Is_Mod_Loop:    CLR     A
  1850.                 MOVC    A,@A+DPTR
  1851.                 MOV     R3,A            ; Modulname
  1852.                 XRL     A,#TableEnd
  1853.                 JZ      Is_Mod_Not_Found
  1854.  
  1855.                 INC     DPTR
  1856.                 CLR     A
  1857.                 MOVC    A,@A+DPTR
  1858.                 MOV     R2,A            ; Offset
  1859.  
  1860.                 INC     DPTR
  1861.                 LCALL   Compare_Str
  1862.                 JNC     Is_Mod_Found
  1863.  
  1864.                 DEC_DPTR
  1865.                 DEC_DPTR
  1866.                 MOV     A,DPL
  1867.                 ADD     A,R2
  1868.                 MOV     DPL,A
  1869.                 JNC     Is_Mod_Loop
  1870.                 INC     DPH
  1871.                 SJMP    Is_Mod_Loop
  1872.  
  1873. Is_Mod_Found:   MOV     A,R3
  1874.                 CLR     C
  1875.                 SJMP    Is_Mod_End
  1876.  
  1877. Is_Mod_Not_Found:
  1878.                 SETB    C
  1879.  
  1880. Is_Mod_End:     POP     DPH
  1881.                 POP     DPL
  1882.                 POP     AR3
  1883.                 POP     AR2
  1884.                 POP     AR1
  1885.                 POP     AR0
  1886.                 RET
  1887.  
  1888. ;--------------------------------------------------------------------------
  1889.  
  1890. Bin_To_ASCII:   PUSH    AR0
  1891.                 PUSH    DPL
  1892.                 PUSH    DPH
  1893.  
  1894.                 MOV     DPTR,#BTA_Table
  1895.                 MOV     B,#16
  1896.                 DIV     AB
  1897.                 MOVC    A,@A+DPTR
  1898.                 MOV     R0,A
  1899.                 MOV     A,B
  1900.                 MOVC    A,@A+DPTR
  1901.                 MOV     B,A
  1902.                 MOV     A,R0
  1903.  
  1904.                 POP     DPH
  1905.                 POP     DPL
  1906.                 POP     AR0
  1907.                 RET
  1908.  
  1909. BTA_Table:      DB      "0123456789ABCDEF"
  1910.  
  1911. ;--------------------------------------------------------------------------
  1912.  
  1913. ASCII_To_Bin:   IRP     Source,Acc,P2,DPL,DPH,AR0,AR1,AR2,AR3
  1914.                 PUSH    Source
  1915.                 ENDM
  1916.  
  1917.                 MOV     R0,#(Token_Str # 256)
  1918.                 MOV     R1,#(Token_Str / 256)
  1919.                 MOV     DPTR,#ATB_Table
  1920.                 MOV     ASCII_Low_Byte,#00
  1921.                 MOV     ASCII_High_Byte,#00
  1922.                 MOV     R2,#00
  1923.  
  1924. ATB_Search:     INC_R0R1
  1925.                 INC     R2
  1926.                 MOV     P2,R1
  1927.                 MOVX    A,@R0
  1928.                 JNZ     ATB_Search
  1929.  
  1930.                 DEC_R0R1
  1931.  
  1932. ATB_Loop:       CLR     C
  1933.                 MOV     P2,R1
  1934.                 MOVX    A,@R0
  1935.                 LCALL   Is_Digit
  1936.                 JC      ATB_Not_Digit
  1937.                 MOV     R3,A
  1938.                 JZ      ATB_Next
  1939.  
  1940. ATB_Add_Loop:   CLR     A
  1941.                 MOVC    A,@A+DPTR
  1942.                 CJNE    A,#0FFh,ATB_Add_Cont
  1943.                 SJMP    ATB_False
  1944. ATB_Add_Cont:   ADD     A,ASCII_Low_Byte
  1945.                 MOV     ASCII_Low_Byte,A
  1946.                 MOV     A,#01
  1947.                 MOVC    A,@A+DPTR
  1948.                 ADDC    A,ASCII_High_Byte
  1949.                 JC      ATB_End
  1950.                 MOV     ASCII_High_Byte,A
  1951.                 DJNZ    R3,ATB_Add_Loop
  1952.  
  1953. ATB_Next:       INC     DPTR
  1954.                 INC     DPTR
  1955.                 DEC_R0R1
  1956.                 DJNZ    R2,ATB_Loop
  1957.  
  1958.                 CLR     C                               ;
  1959.                 MOV     A,ASCII_High_Byte               ; Overflow (+) ?
  1960.                 MOV     C,Acc.7                         ;
  1961.                 SJMP    ATB_End                         ;
  1962.  
  1963. ATB_Not_Digit:  CJNE    A,#45,ATB_False
  1964.                 CJNE    R2,#1,ATB_False
  1965.                 CLR     C
  1966.                 CLR     A
  1967.                 SUBB    A,ASCII_Low_Byte
  1968.                 MOV     ASCII_Low_Byte,A
  1969.                 CLR     A
  1970.                 SUBB    A,ASCII_High_Byte
  1971.                 MOV     ASCII_High_Byte,A
  1972.  
  1973.                 CLR     C                               ;
  1974.                 MOV     A,ASCII_High_Byte               ;
  1975.                 MOV     C,Acc.7                         ; Overflow (-) ?
  1976.                 CPL     C                               ;
  1977.                 SJMP    ATB_End                         ;
  1978.  
  1979. ATB_False:      SETB    C
  1980.  
  1981. ATB_End:        IRP     Target,AR3,AR2,AR1,AR0,DPH,DPL,P2,Acc
  1982.                 POP     Target
  1983.                 ENDM
  1984.                 RET
  1985.  
  1986. ATB_Table:      DB      001h,000h
  1987.                 DB      00Ah,000h
  1988.                 DB      064h,000h
  1989.                 DB      0E8h,003h
  1990.                 DB      010h,027h
  1991.                 DB      0FFh
  1992.  
  1993. ;--------------------------------------------------------------------------
  1994.  
  1995. Jump_Blank_Str:
  1996.                 PUSH    Acc
  1997.  
  1998. JB_Loop:        MOV     A,#00
  1999.                 MOVC    A,@A+DPTR
  2000.                 JZ      JB_End
  2001.                 INC     DPTR
  2002.                 SJMP    JB_Loop
  2003.  
  2004. JB_End:         POP     Acc
  2005.                 RET
  2006.  
  2007. ;--------------------------------------------------------------------------
  2008. ;Routine :      Clear_Str
  2009. ;Parameter:     A (Loeschzeichen)
  2010. ;               DPTR (zu loeschender String)
  2011.  
  2012. Clear_Str:      PUSH    DPL
  2013.                 PUSH    DPH
  2014.                 PUSH    AR1
  2015.                 MOV     R1,#Kb_Max_Length
  2016. Clear_Str_Loop: MOVX    @DPTR,A
  2017.                 INC     DPTR
  2018.                 DJNZ    R1,Clear_Str_Loop
  2019.                 POP     AR1
  2020.                 POP     DPH
  2021.                 POP     DPL
  2022.                 RET
  2023.  
  2024. ;--------------------------------------------------------------------------
  2025. ;Routine :      Clear_Pos_Str  (loescht einen String von Startposition bis Ende)
  2026. ;Parameter:     DPTR    (zu loeschender String)
  2027. ;               A       (Loeschzeichen)
  2028. ;               B       (Startposition)
  2029.  
  2030.  
  2031. Clear_Pos_Str:  PUSH    Acc
  2032.                 PUSH    PSW
  2033.                 PUSH    DPL
  2034.                 PUSH    DPH
  2035.                 PUSH    AR1
  2036.  
  2037.                 MOV     R1,B
  2038.                 CJNE    R1,#Kb_Max_Length,CPS_Cont
  2039.                 SJMP    CPS_End
  2040. CPS_Cont:       PUSH    Acc
  2041.                 MOV     A,B
  2042.                 ADD     A,DPL
  2043.                 MOV     DPL,A
  2044.                 JNC     CPS_Cont2
  2045.                 INC     DPH
  2046.  
  2047. CPS_Cont2:      CLR     C
  2048.                 MOV     A,#Kb_Max_Length
  2049.                 SUBB    A,B
  2050.                 MOV     R1,A
  2051.                 POP     Acc
  2052.                 JC      CPS_End
  2053. CPS_Loop:       MOVX    @DPTR,A
  2054.                 INC     DPTR
  2055.                 DJNZ    R1,CPS_Loop
  2056.  
  2057. CPS_End:        POP     AR1
  2058.                 POP     DPH
  2059.                 POP     DPL
  2060.                 POP     PSW
  2061.                 POP     Acc
  2062.                 RET
  2063.  
  2064. ;--------------------------------------------------------------------------
  2065. ; Routine :     Copy_Pos_Buffer  (kopiert einen String in Kb_Str_Buffer
  2066. ;                                 ab Kb_Cursor; dieser zeigt dann nach
  2067. ;                                 dem letzten Zeichen des Strings)
  2068. ; Parameter:    DPTR (zu kopierender String)
  2069.  
  2070.  
  2071. Copy_Pos_Buffer:
  2072.                 PUSH    Acc
  2073.                 PUSH    PSW
  2074.                 PUSH    P2
  2075.                 PUSH    DPL
  2076.                 PUSH    DPH
  2077.                 PUSH    AR0
  2078.                 PUSH    AR1
  2079.  
  2080.                 MOV     R0,#(Kb_Str_Buffer # 256)
  2081.                 MOV     R1,#(Kb_Str_Buffer / 256)
  2082.                 MOV     A,R0
  2083.                 ADD     A,Kb_Cursor
  2084.                 MOV     R0,A
  2085.                 JNC     CPB_Loop
  2086.                 INC     R1
  2087.  
  2088. CPB_Loop:       MOV     A,Kb_Cursor
  2089.                 CJNE    A,#Kb_Max_Length,CPB_Loop_Cont
  2090.                 DEC     Kb_Cursor
  2091.                 SJMP    CPB_End
  2092.  
  2093. CPB_Loop_Cont:  CLR     A
  2094.                 MOVC    A,@A+DPTR
  2095.                 JZ      CPB_End
  2096.                 MOV     P2,R1
  2097.                 MOVX    @R0,A
  2098.                 INC     DPTR
  2099.                 INC     Kb_Cursor
  2100.                 INC_R0R1
  2101.                 SJMP    CPB_Loop
  2102.  
  2103. CPB_End:        POP     AR1
  2104.                 POP     AR0
  2105.                 POP     DPH
  2106.                 POP     DPL
  2107.                 POP     P2
  2108.                 POP     PSW
  2109.                 POP     Acc
  2110.                 RET
  2111.  
  2112. ;--------------------------------------------------------------------------
  2113.  
  2114. UpCase:         PUSH    PSW
  2115.                 PUSH    AR0
  2116.  
  2117.                 MOV     R0,A
  2118.                 CLR     C
  2119.                 SUBB    A,#97
  2120.                 JC      UpCase_Rest
  2121.                 MOV     A,#122
  2122.                 SUBB    A,R0
  2123.                 JC      UpCase_Rest
  2124.                 MOV     A,R0
  2125.                 SUBB    A,#32
  2126.                 SJMP    UpCase_End
  2127. UpCase_Rest:    MOV     A,R0
  2128.  
  2129. UpCase_End:     POP     AR0
  2130.                 POP     PSW
  2131.                 RET
  2132.  
  2133. ;--------------------------------------------------------------------------
  2134.  
  2135. Is_Digit:       PUSH    AR0
  2136.  
  2137.                 CLR     C
  2138.                 MOV     R0,A
  2139.                 SUBB    A,#48
  2140.                 JC      Is_Digit_Rest
  2141.                 MOV     A,#57
  2142.                 SUBB    A,R0
  2143.                 JC      Is_Digit_Rest
  2144.                 MOV     A,R0
  2145.                 SUBB    A,#48
  2146.                 SJMP    Is_Digit_End
  2147.  
  2148. Is_Digit_Rest:  MOV     A,R0
  2149.  
  2150. Is_Digit_End:   POP     AR0
  2151.                 RET
  2152.  
  2153. ;--------------------------------------------------------------------------
  2154.  
  2155. Wait_2s:        PUSH    AR0
  2156.                 PUSH    AR1
  2157.                 PUSH    AR2
  2158.  
  2159.                 MOV     R2,#12
  2160. Wait_Loop2:     MOV     R1,#250
  2161. Wait_Loop1:     MOV     R0,#250
  2162. Wait_Loop0:     DJNZ    R0,Wait_Loop0
  2163.                 DJNZ    R1,Wait_Loop1
  2164.                 DJNZ    R2,Wait_Loop2
  2165.  
  2166.                 POP     AR2
  2167.                 POP     AR1
  2168.                 POP     AR0
  2169.                 RET
  2170.  
  2171. ;--------------------------------------------------------------------------
  2172.  
  2173. Clr_Msg_Buffer: PUSH    AR0
  2174.                 PUSH    AR1
  2175.  
  2176.                 MOV     R1,#8
  2177.                 MOV     R0,#Msg_Registers
  2178. Clr_Msg_Loop:   MOV     @R0,#00
  2179.                 INC     R0
  2180.                 DJNZ    R1,Clr_Msg_Loop
  2181.  
  2182.                 POP     AR1
  2183.                 POP     AR0
  2184.                 RET
  2185.  
  2186. ;------------------------------------------------------------------------------
  2187.  
  2188. ;Stackarea in idata nach oben nur durch Prozessorram begrenzt!!
  2189. ;Dieses Segment muс IMMER als letztes stehen!!!
  2190.  
  2191.         segment idata
  2192.  
  2193. Stack:          db ?                    ;ab hier liegt der Stack
  2194.  
  2195. ;------------------------------------------------------------------------------
  2196.  
  2197.                 end
  2198.