-$NOMOD51\r
-;********************************************************************\r
-;* *\r
-;* uLan Communication - version for generic MSC51 core based MCU *\r
-;* *\r
-;* ulan.asm - low level assembly implementation of uLAN *\r
-;* protocol implementation for MCS51 *\r
-;* *\r
-;* *\r
-;* Copyright holders and originators: *\r
-;* (C) 1991-2003 by Pavel Pisa pisa@cmp.felk.cvut.cz *\r
-;* (C) 1992-2003 by PiSOFT Praha *\r
-;* (C) 1994-2003 by PiKRON Ltd. http://www.pikron.com *\r
-;* *\r
-;* The more uLan related information can be foud at next sites *\r
-;* http://cmp.felk.cvut.cz/~pisa/ulan/ *\r
-;* http://www.pikron.com/en/chromul_over.html *\r
-;* *\r
-;* The uLan for small embedded devices can be used, modified *\r
-;* and redistributed if at least conditions of one of the *\r
-;* following licenses are met *\r
-;* - GPL - General Public License *\r
-;* - LGPL - Lesser General Public License *\r
-;* - MPL - Mozilla Public License *\r
-;* - other license conditions assigned by originators *\r
-;* *\r
-;* If significant code contributor disagrees with some of above *\r
-;* licenses, he or she can delete such line/s, but if he deletes *\r
-;* all lines, he is not allowed redistribute code in any binary *\r
-;* or source form. *\r
-;********************************************************************\r
-\r
-$INCLUDE(cf_ulan.inc)\r
-\r
-%IF (%TGT_MSC1210)THEN(\r
-R_USEC EQU 10 ; (CPU_SYS_HZ / 1000000)-1\r
-R_MSECL EQU 50 ; ((CPU_SYS_HZ / 1000) - 1) mod 256\r
-R_MSECH EQU 43 ; ((CPU_SYS_HZ / 1000) - 1) / 256\r
+$NOMOD51
+;********************************************************************
+;* *
+;* uLan Communication - version for generic MSC51 core based MCU *
+;* *
+;* ulan.asm - low level assembly implementation of uLAN *
+;* protocol implementation for MCS51 *
+;* *
+;* *
+;* Copyright holders and originators: *
+;* (C) 1991-2003 by Pavel Pisa pisa@cmp.felk.cvut.cz *
+;* (C) 1992-2003 by PiSOFT Praha *
+;* (C) 1994-2003 by PiKRON Ltd. http://www.pikron.com *
+;* *
+;* The more uLan related information can be foud at next sites *
+;* http://cmp.felk.cvut.cz/~pisa/ulan/ *
+;* http://www.pikron.com/en/chromul_over.html *
+;* *
+;* The uLan for small embedded devices can be used, modified *
+;* and redistributed if at least conditions of one of the *
+;* following licenses are met *
+;* - GPL - General Public License *
+;* - LGPL - Lesser General Public License *
+;* - MPL - Mozilla Public License *
+;* - other license conditions assigned by originators *
+;* *
+;* If significant code contributor disagrees with some of above *
+;* licenses, he or she can delete such line/s, but if he deletes *
+;* all lines, he is not allowed redistribute code in any binary *
+;* or source form. *
+;********************************************************************
+
+$INCLUDE(cf_ulan.inc)
+
+%IF (%TGT_MSC1210)THEN(
+R_USEC EQU 10 ; (CPU_SYS_HZ / 1000000)-1
+R_MSECL EQU 50 ; ((CPU_SYS_HZ / 1000) - 1) mod 256
+R_MSECH EQU 43 ; ((CPU_SYS_HZ / 1000) - 1) / 256
MSC_WRITE_FLASH EQU 0FFD9H ; DPTR = address, acc = data
-)FI\r
-\r
-%IF(NOT %SPN)THEN(\r
-; Standardni seriovy port 8051\r
-PCON DATA 087H\r
-SBUF_U DATA SBUF\r
-SCON_U DATA SCON\r
-SM2_U BIT SM2\r
-REN_U BIT REN\r
-TB8_U BIT TB8\r
-RB8_U BIT RB8\r
-TI_U BIT TI\r
-PCON_U DATA PCON ; SMOD bit\r
-RI_U BIT RI\r
-ES_U BIT ES\r
-RXD_U BIT RXD\r
-TXD_U BIT TXD\r
-SINT_U CODE SINT\r
-)ELSE(\r
-; Port 1 mikrokontroleru TI MSC1210\r
-$INCLUDE(reg1210.inc)\r
-SBUF_U DATA SBUF1\r
-SCON_U DATA SCON1\r
-SM2_U BIT SM21\r
-REN_U BIT REN1\r
-TB8_U BIT TB81\r
-RB8_U BIT RB81\r
-TI_U BIT TI1\r
-RI_U BIT RI1\r
-PCON_U DATA EICON ; SMOD bit\r
-ES_U BIT ES1\r
-RXD_U BIT RXD1\r
-TXD_U BIT TXD1\r
-SINT_U CODE SINT1\r
-)FI\r
-\r\r
-%IF (%FOR_SDCC) THEN (\r
-SINT CODE 00023H ; SDCC nema hodnotu definovanu\r
-)FI\r
-\r
-%IF (%VECTOR_FL) THEN (\r
- EXTRN CODE(VEC_SET)\r
- V_uL_ADD EQU 1EH\r
- V_uL_FNC EQU 26H\r
-)ELSE(\r
-; EXTRN CODE(uL_R_BU,uL_R_CO)\r
-)FI\r
-\r
-EXTRN CODE(uL_IDB,uL_IDE) ; Jmeno modulu\r
-\r
-PUBLIC uL_IB_L,uL_OB_L\r
-PUBLIC uL_FNC,_uL_FNCC,uL_INIT\r
-PUBLIC _uL_STR,uL_STR,uL_ERR,uLF_ERR,uLF_INE,uLF_KMP,uLF_TRP\r
-PUBLIC uL_FLG,uL_FLH\r
-PUBLIC S_INT,SER_STACK_B\r
-\r
-PUBLIC uL_O_OP,uL_O_NEW,uL_WR,uL_O_CL,uL_WRB,uL_WRB0,uL_O_LN,uL_WRc,uL_O_ABRT\r
-PUBLIC uL_I_OP,uL_RD,uL_I_CL,uL_RDB,uL_I_LN,uL_I_L,uL_I_NE\r
-\r
-%IF (%DY_ADDR) THEN (\r
-PUBLIC uL_FLD,uLD_RQA,UD_DYSA,UD_STAD,UD_STLN,SER_NUM\r
-)FI\r
-\r
-; Funkce volane z rutin zpracovani prikazu\r
-PUBLIC ACK_CMD,SND_BEB,SND_CHC,SND_END,S_WAITD,NAK_CMD\r
-PUBLIC REC_BEG,REC_CHR,REC_END,REC_CME\r
-PUBLIC REC_Bi, SND_Bi, REC_Bx, SND_Bx, SND_Bc, S_R0FB, S_EQP\r
-; Data\r
-PUBLIC uL_ADR,uL_SA,uL_DA,uL_CMD,uL_ST\r
-PUBLIC uL_ISAD,uL_IDAD,uL_ICOM,uL_IST,uL_ISTA\r
-PUBLIC uLF_RS,uLF_NB,uLF_NA\r
-\r
-%IF(%TGT_T89C51RD2)THEN(\r
-FCON DATA 0D1H\r
-SADDR DATA 0A9H\r
-)FI\r
-\r
-SER___C SEGMENT CODE\r
-SER___X SEGMENT XDATA\r
-SER___B SEGMENT DATA BITADDRESSABLE\r
-SER_STACK SEGMENT DATA\r
-\r
-%IF (NOT %VECTOR_FL)THEN(\r
-CSEG AT SINT_U\r
- JMP S_INT\r
- JMP uL_FNC\r
-\r
-;CSEG AT TIMER1\r
-; JMP S_INT\r
-)FI\r
-\r
-RSEG SER___X\r
-\r
-;********************************************************************\r
-; Datova oblast site uLAN\r
-\r
-; Jen pro debugging, jinak zakomentovat\r
-PUBLIC uL_HBIB,uL_SPD,uL_STA\r
-PUBLIC P_NDB,H_BIB,H_EIB,P_NPD,P_AID,P_EID\r
-PUBLIC P_AOB,H_BOB,H_EOB,P_NOB,P_AOD\r
-\r
-%IF(%DY_ADDR)THEN(\r
-UD_SFN: DS 1 ; prave ctena subfunkce\r
-UD_DYSA:DS 1 ; adresa serveru adres\r
-UD_STAD:DS 2 ; ukazatel na buffer statusu\r
-UD_STLN:DS 1 ; delka bufferu\r
-SER_NUM:DS 4 ; serial number\r
-)FI\r
-\r
-uL_HBIB:DS 1 ; Vyssi cast adresy zacatku IB\r
-uL_IB_L:DS 1 ; Delka IB v 256\r
-uL_OB_L:DS 1 ; Delka OB v 256\r
-uL_SPD: DS 1 ; Delitel frekvence 57.6 kHz\r
-uL_ADR: DS 1 ; Vlastni adresa\r
-uL_CMD: DS 1 ; Prave prenaseny prikaz (IRQ)\r
-uL_SA: DS 1 ; Adresa vysilace (IRQ)\r
-uL_DA: DS 1 ; Adresa prijimace (IRQ)\r
-uL_ST: DS 1 ; Status zpravy (IRQ)\r
-uL_STA: DS 1 ; Stamp zpravy (IRQ)\r
-uL_FRLN:DS 2 ; Maximalni delka ramce\r
-\r
-; Prijem dat\r
-\r
-P_NDB: DS 2 ;R23 Ukazatel na pocatek prijimaneho bloku (IRQ)\r
-H_BIB: DS 1 ;R4 Pocatek vstupniho buferu\r
-H_EIB: DS 1 ;R5 Konec vstupniho buferu\r
-P_NPD: DS 2 ;R67 Ukazatel na pocatek 1. nezprac. bloku (FNC)\r
-P_AID: DS 2 ; Ukazatel na zpracovavana data (FNC)\r
-\r
-; Vysilani dat\r
-\r
-P_AOB: DS 2 ;R23 Ukazatel na vysilany blok (IRQ)\r
-H_BOB: DS 1 ;R4 Pocatek vystupniho buferu\r
-H_EOB: DS 1 ;R5 Konec vystupniho buferu\r
-P_NOB: DS 2 ;R67 Ukazatel na zapisovany blok (FNC)\r
-P_AOD: DS 2 ; Ukazatel na zapisovana data (FNC)\r
-%IF(%WITH_TAILS)THEN(\r
-P_AOT: DS 2 ; Ukazuje na prvni blok tailovane skupiny (FNC)\r
-P_TO: DS 2 ; Pomocny ukazatel do OB pro taily (IRQ)\r
-P_TI: DS 2 ; Pomocny ukazatel do IB pro taily (IRQ)\r
-)FI\r
-\r
-P_EID: DS 2 ; Zjisteny konec vstupnich dat\r
-uL_ISAD:DS 1 ; Promiskuitni SAdr zpracovavaneho bloku\r
-uL_IDAD:DS 1 ; DA zpracovavaneho bloku\r
-uL_ICOM:DS 1 ; Command zpracovavaneho bloku\r
-uL_IST: DS 1 ; Status zpracovavaneho bloku\r
-uL_ISTA:DS 1 ; Stamp - jedinecne cislo zpravy\r
-\r
-PROC_BUF:DS 17 ; Buffer prikazu proceed\r
-PROC_BUFE:\r
-\r\r
-RSEG SER___B\r
-\r
-uL_FLG: DS 1\r
-uLF_ER0 BIT uL_FLG.0 ; Chyba pri vysilani\r
-uLF_ER1 BIT uL_FLG.1 ; Chyba pri vysilani\r
-uLF_ERR BIT uL_FLG.2 ; Chyba pri vysilani\r
-uLF_SN BIT uL_FLG.3 ; uLan vysila - master mode\r
-uLF_RS BIT uL_FLG.4 ; Potreba vysilat\r
-uLF_NB BIT uL_FLG.5 ; Zbernice neobsazena\r
-uLF_NA BIT uL_FLG.6 ; Mazano kazdou akci\r
-uLF_TRP BIT uL_FLG.7 ; Jiny duvod preruseni\r
-\r
-uL_FLH: DS 1\r
-uLF_INE BIT uL_FLH.0 ; Zprava presunuta do vstupni fronty\r
-uLF_KMP BIT uL_FLH.1 ; Keyboard macro in progress\r
-uLF_REC BIT uL_FLH.2 ; Zprava urcena pro tuto stanici\r
-uLF_ARC BIT uL_FLH.3 ; Prijimat vsechny zpravy na sbernici\r
-%IF(%WITH_TAILS)THEN(\r
-uLF_OWT BIT uL_FLH.4 ; Pripravuje se vystupni zprava s tailem\r
-uLF_TPF BIT uL_FLH.5 ; Zpracovava se tailovani pod prerusenim\r
-uLF_TMP BIT uL_FLH.6 ; Pomocny\r
-)FI\r
-\r
-%IF(%DY_ADDR)THEN(\r
-uL_FLD:DS 1\r
-uLD_RQA BIT uL_FLD.2 ; Pozadavek na pripojeni do site\r
-uLD_SSIP BIT uL_FLD.3 ; Send status in progress\r
-uLD_SCIP BIT uL_FLD.4 ; Status is changed\r
-)FI\r
-\r
-RSEG SER_STACK\r
-SER_STACK_B:\r
- DS 8\r
-\r
-XSEG AT END_RAM-256*LENG_IB-256*LENG_OB\r
-\r
-BEG_IB: DS 100H*LENG_IB\r
-END_IB:\r
-BEG_OB: DS 100H*LENG_OB\r
-END_OB:\r
-\r
-; Rizeni linky - prikazy\r
-uL_ERRI EQU 0FFH ; Ignoruj vse doslo k chybe\r
-uL_ERR EQU 07FH ; Chyba v datech\r
-uL_END EQU 07CH ; Konec dat\r
-uL_ARQ EQU 07AH ; Konec dat - vysli ACK\r
-uL_PRQ EQU 079H ; Konec dat - proved prikaz\r
-uL_AAP EQU 076H ; ARQ + PRQ\r
-uL_BEG EQU 075H ; Zacatek dat\r
-\r
-; Potvrzovaci zpravy\r
-uL_ACK EQU 019H ; Potvrzeni\r
-uL_NAK EQU 07FH ; Doslo k chybe\r
-uL_WAK EQU 025H ; Ted nemohu splnit\r
-\r
-; Prikazy posilane linkou\r
-; 00H .. 3FH uloz do bufferu\r
-; 40H .. 7FH uloz do bufferu bez ACK\r
-; 80H .. 9FH okamzite proved a konci\r
-; A0H .. BFH proved a prijimej\r
-; C0H .. FFH proved a vysilej\r
-\r
-uL_RES EQU 080H ; Znovu inicializuj RS485\r
-uL_SFT EQU 081H ; Otestuj velikost volne pameti\r
-uL_SID EQU 0F0H ; Predstav se\r
-uL_SFI EQU 0F1H ; Vysli velikost volne pameti v IB\r
-uL_TF0 EQU 098H ; Konec krokovani\r
-uL_TF1 EQU 099H ; Pocatek krokovani\r
-uL_STP EQU 09AH ; Krok\r
-uL_DEB EQU 09BH ; Dalsi prikazy pro debug\r
-uL_SPC EQU 0DAH ; Vysle PCL PCH PSW ACC\r
-\r
-uL_GST EQU 0C1H ; Fast module get status\r
-\r
-uL_RDM EQU 0F8H ; Cte pamet typu T T B B L L\r
-uL_WRM EQU 0B8H ; Zapise do pameti T T B B L L\r
-uL_ERM EQU 088H ; Vymaze pamet T T B B L L\r
-\r
-; Status zprav\r
-uLBF_NORE EQU 040H ; Do not try to repeat if error occurs\r
-uLBF_NOREb EQU 6\r
-uLBF_TAIL EQU 020H ; Message has tail frame\r
-uLBF_TAILb EQU 5\r
-uLBF_REC EQU 010H ; Request receiption of block\r
-uLBF_RECb EQU 4\r
-uLBF_FAIL EQU 008H ; Message cannot be send - error\r
-uLBF_PROC EQU 004H ; Message succesfull send\r
-uLBF_AAP EQU 003H ; Request imediate proccessing of frame by receiver station with acknowledge\r
-uLBF_PRQ EQU 002H ; Request imediate proccessing of frame by receiver station\r
-uLBF_ARQ EQU 001H ; Request imediate acknowledge by receiving station\r
-uLBF_END EQU 000H ; No acknowledge or processing request\r
-\r
-RSEG SER___C\r
-\r
-USING 1\r
-\r
-; Cekani na znak R0 - 1 znaku jinak S_ERR\r
-WTF_CHR:DJNZ R0,SND_SPC\r
-V2_ERR: JMP S_ERR\r
-\r
-; Cekani po dobu 1 znaku\r
-SND_SPT:CLR TI_U\r
- JNB TXD_U,S_RET\r
- CLR AC\r
- RET\r
-\r
-; Cekani po dobu 1 znaku\r
-SND_SPC:CLR SM2_U\r
- SETB REN_U\r
-SND_SP1:\r
-%IF (%NEG_DR_EO) THEN (\r
- CLR DR_EO ; *** Ceka 1 znak\r
-)ELSE(\r
- SETB DR_EO ; *** Ceka 1 znak\r
-)FI\r
- CLR A\r
- SJMP SND_CH2\r
-\r
-SND_CTR:SETB C ; *** Send control character\r
- SJMP SND_CH1\r
-SND_CHC:XRL AR1,A ; *** Send data + add chk sum\r
- INC R1\r
-SND_CHR:CLR C ; *** Send data character\r
-SND_CH1:MOV TB8_U,C ; ACC .. character\r
- CLR REN_U\r
- %IF (%NEG_DR_EO) THEN (\r
- SETB DR_EO\r
-)ELSE(\r
- CLR DR_EO\r
-)FI\r
-SND_CH2:MOV SBUF_U,A\r
- CLR TI_U\r
- SJMP S_RET\r
-\r
-REC_CTR:SETB C ; *** Receive control character\r
- DB 74H ; MOV A,#d8\r
-REC_CHR:CLR C ; *** Receive character\r
-REC_CH1:MOV SM2_U,C ; ACC .. rec. char\r
- %IF (%NEG_DR_EO) THEN (\r
- CLR DR_EO ; CY .. RB8_U\r
-)ELSE(\r
- SETB DR_EO ; CY .. RB8_U\r
-)FI\r
- SETB REN_U\r
- CLR TI_U\r
-\r
-RS232:\r
-S_RET: JB uLF_TRP,S_INT_T\r
-S_RETI: MOV A,SP\r
- XCH A,SER_STACK\r
- MOV SP,A\r
- POP DPH\r
- POP DPL\r
- POP ACC\r
- POP PSW\r
- RETI\r
-\r
-; *************************************\r
-; Interupt TI_U nebo RI_U\r
-; *************************************\r
-\r
-S_INT :PUSH PSW\r
- PUSH ACC\r
- PUSH DPL\r
+)FI
+
+%IF(NOT %SPN)THEN(
+; Standardni seriovy port 8051
+PCON DATA 087H
+SBUF_U DATA SBUF
+SCON_U DATA SCON
+SM2_U BIT SM2
+REN_U BIT REN
+TB8_U BIT TB8
+RB8_U BIT RB8
+TI_U BIT TI
+PCON_U DATA PCON ; SMOD bit
+RI_U BIT RI
+ES_U BIT ES
+RXD_U BIT RXD
+TXD_U BIT TXD
+SINT_U CODE SINT
+)ELSE(
+; Port 1 mikrokontroleru TI MSC1210
+$INCLUDE(reg1210.inc)
+SBUF_U DATA SBUF1
+SCON_U DATA SCON1
+SM2_U BIT SM21
+REN_U BIT REN1
+TB8_U BIT TB81
+RB8_U BIT RB81
+TI_U BIT TI1
+RI_U BIT RI1
+PCON_U DATA EICON ; SMOD bit
+ES_U BIT ES1
+RXD_U BIT RXD1
+TXD_U BIT TXD1
+SINT_U CODE SINT1
+)FI
+
+%IF (%FOR_SDCC) THEN (
+SINT CODE 00023H ; SDCC nema hodnotu definovanu
+)FI
+
+%IF (%VECTOR_FL) THEN (
+ EXTRN CODE(VEC_SET)
+ V_uL_ADD EQU 1EH
+ V_uL_FNC EQU 26H
+)ELSE(
+; EXTRN CODE(uL_R_BU,uL_R_CO)
+)FI
+
+EXTRN CODE(uL_IDB,uL_IDE) ; Jmeno modulu
+
+PUBLIC uL_IB_L,uL_OB_L
+PUBLIC uL_FNC,_uL_FNCC,uL_INIT
+PUBLIC _uL_STR,uL_STR,uL_ERR,uLF_ERR,uLF_INE,uLF_KMP,uLF_TRP
+PUBLIC uL_FLG,uL_FLH
+PUBLIC S_INT,SER_STACK_B
+
+PUBLIC uL_O_OP,uL_O_NEW,uL_WR,uL_O_CL,uL_WRB,uL_WRB0,uL_O_LN,uL_WRc,uL_O_ABRT
+PUBLIC uL_I_OP,uL_RD,uL_I_CL,uL_RDB,uL_I_LN,uL_I_L,uL_I_NE
+
+%IF (%DY_ADDR) THEN (
+PUBLIC uL_FLD,uLD_RQA,UD_DYSA,UD_STAD,UD_STLN,SER_NUM
+)FI
+
+; Funkce volane z rutin zpracovani prikazu
+PUBLIC ACK_CMD,SND_BEB,SND_CHC,SND_END,S_WAITD,NAK_CMD
+PUBLIC REC_BEG,REC_CHR,REC_END,REC_CME
+PUBLIC REC_Bi, SND_Bi, REC_Bx, SND_Bx, SND_Bc, S_R0FB, S_EQP
+; Data
+PUBLIC uL_ADR,uL_SA,uL_DA,uL_CMD,uL_ST
+PUBLIC uL_ISAD,uL_IDAD,uL_ICOM,uL_IST,uL_ISTA
+PUBLIC uLF_RS,uLF_NB,uLF_NA
+
+%IF(%TGT_T89C51RD2)THEN(
+FCON DATA 0D1H
+SADDR DATA 0A9H
+)FI
+
+SER___C SEGMENT CODE
+SER___X SEGMENT XDATA
+SER___B SEGMENT DATA BITADDRESSABLE
+SER_STACK SEGMENT DATA
+
+%IF (NOT %VECTOR_FL)THEN(
+CSEG AT SINT_U
+ JMP S_INT
+ JMP uL_FNC
+
+;CSEG AT TIMER1
+; JMP S_INT
+)FI
+
+RSEG SER___X
+
+;********************************************************************
+; Datova oblast site uLAN
+
+; Jen pro debugging, jinak zakomentovat
+PUBLIC uL_HBIB,uL_SPD,uL_STA
+PUBLIC P_NDB,H_BIB,H_EIB,P_NPD,P_AID,P_EID
+PUBLIC P_AOB,H_BOB,H_EOB,P_NOB,P_AOD
+
+%IF(%DY_ADDR)THEN(
+UD_SFN: DS 1 ; prave ctena subfunkce
+UD_DYSA:DS 1 ; adresa serveru adres
+UD_STAD:DS 2 ; ukazatel na buffer statusu
+UD_STLN:DS 1 ; delka bufferu
+SER_NUM:DS 4 ; serial number
+)FI
+
+uL_HBIB:DS 1 ; Vyssi cast adresy zacatku IB
+uL_IB_L:DS 1 ; Delka IB v 256
+uL_OB_L:DS 1 ; Delka OB v 256
+uL_SPD: DS 1 ; Delitel frekvence 57.6 kHz
+uL_ADR: DS 1 ; Vlastni adresa
+uL_CMD: DS 1 ; Prave prenaseny prikaz (IRQ)
+uL_SA: DS 1 ; Adresa vysilace (IRQ)
+uL_DA: DS 1 ; Adresa prijimace (IRQ)
+uL_ST: DS 1 ; Status zpravy (IRQ)
+uL_STA: DS 1 ; Stamp zpravy (IRQ)
+uL_FRLN:DS 2 ; Maximalni delka ramce
+
+; Prijem dat
+
+P_NDB: DS 2 ;R23 Ukazatel na pocatek prijimaneho bloku (IRQ)
+H_BIB: DS 1 ;R4 Pocatek vstupniho buferu
+H_EIB: DS 1 ;R5 Konec vstupniho buferu
+P_NPD: DS 2 ;R67 Ukazatel na pocatek 1. nezprac. bloku (FNC)
+P_AID: DS 2 ; Ukazatel na zpracovavana data (FNC)
+
+; Vysilani dat
+
+P_AOB: DS 2 ;R23 Ukazatel na vysilany blok (IRQ)
+H_BOB: DS 1 ;R4 Pocatek vystupniho buferu
+H_EOB: DS 1 ;R5 Konec vystupniho buferu
+P_NOB: DS 2 ;R67 Ukazatel na zapisovany blok (FNC)
+P_AOD: DS 2 ; Ukazatel na zapisovana data (FNC)
+%IF(%WITH_TAILS)THEN(
+P_AOT: DS 2 ; Ukazuje na prvni blok tailovane skupiny (FNC)
+P_TO: DS 2 ; Pomocny ukazatel do OB pro taily (IRQ)
+P_TI: DS 2 ; Pomocny ukazatel do IB pro taily (IRQ)
+)FI
+
+P_EID: DS 2 ; Zjisteny konec vstupnich dat
+uL_ISAD:DS 1 ; Promiskuitni SAdr zpracovavaneho bloku
+uL_IDAD:DS 1 ; DA zpracovavaneho bloku
+uL_ICOM:DS 1 ; Command zpracovavaneho bloku
+uL_IST: DS 1 ; Status zpracovavaneho bloku
+uL_ISTA:DS 1 ; Stamp - jedinecne cislo zpravy
+
+PROC_BUF:DS 17 ; Buffer prikazu proceed
+PROC_BUFE:
+
+RSEG SER___B
+
+uL_FLG: DS 1
+uLF_ER0 BIT uL_FLG.0 ; Chyba pri vysilani
+uLF_ER1 BIT uL_FLG.1 ; Chyba pri vysilani
+uLF_ERR BIT uL_FLG.2 ; Chyba pri vysilani
+uLF_SN BIT uL_FLG.3 ; uLan vysila - master mode
+uLF_RS BIT uL_FLG.4 ; Potreba vysilat
+uLF_NB BIT uL_FLG.5 ; Zbernice neobsazena
+uLF_NA BIT uL_FLG.6 ; Mazano kazdou akci
+uLF_TRP BIT uL_FLG.7 ; Jiny duvod preruseni
+
+uL_FLH: DS 1
+uLF_INE BIT uL_FLH.0 ; Zprava presunuta do vstupni fronty
+uLF_KMP BIT uL_FLH.1 ; Keyboard macro in progress
+uLF_REC BIT uL_FLH.2 ; Zprava urcena pro tuto stanici
+uLF_ARC BIT uL_FLH.3 ; Prijimat vsechny zpravy na sbernici
+%IF(%WITH_TAILS)THEN(
+uLF_OWT BIT uL_FLH.4 ; Pripravuje se vystupni zprava s tailem
+uLF_TPF BIT uL_FLH.5 ; Zpracovava se tailovani pod prerusenim
+uLF_TMP BIT uL_FLH.6 ; Pomocny
+)FI
+
+%IF(%DY_ADDR)THEN(
+uL_FLD:DS 1
+uLD_RQA BIT uL_FLD.2 ; Pozadavek na pripojeni do site
+uLD_SSIP BIT uL_FLD.3 ; Send status in progress
+uLD_SCIP BIT uL_FLD.4 ; Status is changed
+)FI
+
+RSEG SER_STACK
+SER_STACK_B:
+ DS 8
+
+XSEG AT END_RAM-256*LENG_IB-256*LENG_OB
+
+BEG_IB: DS 100H*LENG_IB
+END_IB:
+BEG_OB: DS 100H*LENG_OB
+END_OB:
+
+; Rizeni linky - prikazy
+uL_ERRI EQU 0FFH ; Ignoruj vse doslo k chybe
+uL_ERR EQU 07FH ; Chyba v datech
+uL_END EQU 07CH ; Konec dat
+uL_ARQ EQU 07AH ; Konec dat - vysli ACK
+uL_PRQ EQU 079H ; Konec dat - proved prikaz
+uL_AAP EQU 076H ; ARQ + PRQ
+uL_BEG EQU 075H ; Zacatek dat
+
+; Potvrzovaci zpravy
+uL_ACK EQU 019H ; Potvrzeni
+uL_NAK EQU 07FH ; Doslo k chybe
+uL_WAK EQU 025H ; Ted nemohu splnit
+
+; Prikazy posilane linkou
+; 00H .. 3FH uloz do bufferu
+; 40H .. 7FH uloz do bufferu bez ACK
+; 80H .. 9FH okamzite proved a konci
+; A0H .. BFH proved a prijimej
+; C0H .. FFH proved a vysilej
+
+uL_RES EQU 080H ; Znovu inicializuj RS485
+uL_SFT EQU 081H ; Otestuj velikost volne pameti
+uL_SID EQU 0F0H ; Predstav se
+uL_SFI EQU 0F1H ; Vysli velikost volne pameti v IB
+uL_TF0 EQU 098H ; Konec krokovani
+uL_TF1 EQU 099H ; Pocatek krokovani
+uL_STP EQU 09AH ; Krok
+uL_DEB EQU 09BH ; Dalsi prikazy pro debug
+uL_SPC EQU 0DAH ; Vysle PCL PCH PSW ACC
+
+uL_GST EQU 0C1H ; Fast module get status
+
+uL_RDM EQU 0F8H ; Cte pamet typu T T B B L L
+uL_WRM EQU 0B8H ; Zapise do pameti T T B B L L
+uL_ERM EQU 088H ; Vymaze pamet T T B B L L
+
+; Status zprav
+uLBF_NORE EQU 040H ; Do not try to repeat if error occurs
+uLBF_NOREb EQU 6
+uLBF_TAIL EQU 020H ; Message has tail frame
+uLBF_TAILb EQU 5
+uLBF_REC EQU 010H ; Request receiption of block
+uLBF_RECb EQU 4
+uLBF_FAIL EQU 008H ; Message cannot be send - error
+uLBF_PROC EQU 004H ; Message succesfull send
+uLBF_AAP EQU 003H ; Request imediate proccessing of frame by receiver station with acknowledge
+uLBF_PRQ EQU 002H ; Request imediate proccessing of frame by receiver station
+uLBF_ARQ EQU 001H ; Request imediate acknowledge by receiving station
+uLBF_END EQU 000H ; No acknowledge or processing request
+
+RSEG SER___C
+
+USING 1
+
+; Cekani na znak R0 - 1 znaku jinak S_ERR
+WTF_CHR:DJNZ R0,SND_SPC
+V2_ERR: JMP S_ERR
+
+; Cekani po dobu 1 znaku
+SND_SPT:CLR TI_U
+ JNB TXD_U,S_RET
+ CLR AC
+ RET
+
+; Cekani po dobu 1 znaku
+SND_SPC:CLR SM2_U
+ SETB REN_U
+SND_SP1:
+%IF (%NEG_DR_EO) THEN (
+ CLR DR_EO ; *** Ceka 1 znak
+)ELSE(
+ SETB DR_EO ; *** Ceka 1 znak
+)FI
+ CLR A
+ SJMP SND_CH2
+
+SND_CTR:SETB C ; *** Send control character
+ SJMP SND_CH1
+SND_CHC:XRL AR1,A ; *** Send data + add chk sum
+ INC R1
+SND_CHR:CLR C ; *** Send data character
+SND_CH1:MOV TB8_U,C ; ACC .. character
+ CLR REN_U
+ %IF (%NEG_DR_EO) THEN (
+ SETB DR_EO
+)ELSE(
+ CLR DR_EO
+)FI
+SND_CH2:MOV SBUF_U,A
+ CLR TI_U
+ SJMP S_RET
+
+REC_CTR:SETB C ; *** Receive control character
+ DB 74H ; MOV A,#d8
+REC_CHR:CLR C ; *** Receive character
+REC_CH1:MOV SM2_U,C ; ACC .. rec. char
+ %IF (%NEG_DR_EO) THEN (
+ CLR DR_EO ; CY .. RB8_U
+)ELSE(
+ SETB DR_EO ; CY .. RB8_U
+)FI
+ SETB REN_U
+ CLR TI_U
+
+RS232:
+S_RET: JB uLF_TRP,S_INT_T
+S_RETI: MOV A,SP
+ XCH A,SER_STACK
+ MOV SP,A
+ POP DPH
+ POP DPL
+ POP ACC
+ POP PSW
+ RETI
+
+; *************************************
+; Interupt TI_U nebo RI_U
+; *************************************
+
+S_INT :PUSH PSW
+ PUSH ACC
+ PUSH DPL
PUSH DPH
- MOV A,SP\r
- XCH A,SER_STACK\r
- JZ S_ERROR\r
- MOV SP,A\r
-\r
-S_INT_T:MOV PSW,#AR0; Banka1\r
-; JB DR_EI,RS232\r
- MOV C,RB8_U ; errata 89c51rd2, point 6 !!!!!!\r
- CLR RB8_U ; nutno dodrzet !!!!!!!!!!!!!!!!!\r
- JBC RI_U,S_INT_2\r
- JNB TI_U,S_RET\r
-S_INT_1:CLR uLF_NA\r
- RET\r
-S_INT_2:JB REN_U,S_INT_3 ; errata 89c51rd2, point 8\r
- SJMP S_RETI\r
-S_INT_3:SETB AC ; Preruseni od RI_U => AC=1\r
- CLR uLF_NB\r
- MOV A,SBUF_U\r
- JNC S_INT_1\r
- JNB ACC.7,S_INT_1\r
- SETB uLF_NB\r
- CJNE A,#uL_ERRI,S_INT_1\r
-S_ERROR:MOV PSW,#AR0; Banka1\r
- CLR uLF_SN\r
- JMP S_ERR\r
-\r
-; Prijem bloku do XDATA\r
-\r
-REC_Bx: CLR SM2_U ; R23 .. where\r
- SETB REN_U ; R45 .. buffer bot/top\r
-%IF (%NEG_DR_EO) THEN (\r
- CLR DR_EO ; R67 .. end of buffer\r
-)ELSE(\r
- SETB DR_EO ; R67 .. end of buffer\r
-)FI\r
- CLR TI_U ; R1 = check sum\r
-REC_Bx1:CALL S_RET ; CY = 1 when ended by CTR\r
- JB AC,REC_Bx2\r
- CLR TI_U\r
- SJMP REC_Bx1\r
-REC_Bx2:JC REC_BxR\r
- CALL S_RCTB1\r
- JNZ REC_Bx1\r
- CLR C\r
-REC_BxR:RET\r
-\r
-; Prijem bloku do CDATA (t89c51rd2)\r
-%IF(%TGT_T89C51RD2 OR %TGT_MSC1210)THEN(\r
-REC_Bc: CLR SM2_U ; R23 .. where\r
- SETB REN_U ; R45 .. buffer bot/top\r
-%IF (%NEG_DR_EO) THEN (\r
- CLR DR_EO ; R67 .. end of buffer\r
-)ELSE(\r
- SETB DR_EO ; R67 .. end of buffer\r
-)FI\r
- CLR TI_U ; R1 = check sum\r
-REC_Bc1:CALL S_RET ; CY = 1 when ended by CTR\r
- JB AC,REC_Bc2\r
- CLR TI_U\r
- SJMP REC_Bc1\r
-REC_Bc2:JC REC_BcR\r
+ MOV A,SP
+ XCH A,SER_STACK
+ JZ S_ERROR
+ MOV SP,A
+
+S_INT_T:MOV PSW,#AR0; Banka1
+; JB DR_EI,RS232
+ MOV C,RB8_U ; errata 89c51rd2, point 6 !!!!!!
+ CLR RB8_U ; nutno dodrzet !!!!!!!!!!!!!!!!!
+ JBC RI_U,S_INT_2
+ JNB TI_U,S_RET
+S_INT_1:CLR uLF_NA
+ RET
+S_INT_2:JB REN_U,S_INT_3 ; errata 89c51rd2, point 8
+ SJMP S_RETI
+S_INT_3:SETB AC ; Preruseni od RI_U => AC=1
+ CLR uLF_NB
+ MOV A,SBUF_U
+ JNC S_INT_1
+ JNB ACC.7,S_INT_1
+ SETB uLF_NB
+ CJNE A,#uL_ERRI,S_INT_1
+S_ERROR:MOV PSW,#AR0; Banka1
+ CLR uLF_SN
+ JMP S_ERR
+
+; Prijem bloku do XDATA
+
+REC_Bx: CLR SM2_U ; R23 .. where
+ SETB REN_U ; R45 .. buffer bot/top
+%IF (%NEG_DR_EO) THEN (
+ CLR DR_EO ; R67 .. end of buffer
+)ELSE(
+ SETB DR_EO ; R67 .. end of buffer
+)FI
+ CLR TI_U ; R1 = check sum
+REC_Bx1:CALL S_RET ; CY = 1 when ended by CTR
+ JB AC,REC_Bx2
+ CLR TI_U
+ SJMP REC_Bx1
+REC_Bx2:JC REC_BxR
+ CALL S_RCTB1
+ JNZ REC_Bx1
+ CLR C
+REC_BxR:RET
+
+; Prijem bloku do CDATA (t89c51rd2)
+%IF(%TGT_T89C51RD2 OR %TGT_MSC1210)THEN(
+REC_Bc: CLR SM2_U ; R23 .. where
+ SETB REN_U ; R45 .. buffer bot/top
+%IF (%NEG_DR_EO) THEN (
+ CLR DR_EO ; R67 .. end of buffer
+)ELSE(
+ SETB DR_EO ; R67 .. end of buffer
+)FI
+ CLR TI_U ; R1 = check sum
+REC_Bc1:CALL S_RET ; CY = 1 when ended by CTR
+ JB AC,REC_Bc2
+ CLR TI_U
+ SJMP REC_Bc1
+REC_Bc2:JC REC_BcR
CLR EA
-%IF(%TGT_T89C51RD2) THEN (\r
- MOV FCON,#08H ; zapis do programove pameti\r
+%IF(%TGT_T89C51RD2) THEN (
+ MOV FCON,#08H ; zapis do programove pameti
CALL S_RCTB1 ; zapis hodnotu z komunikace
)FI
%IF(%TGT_MSC1210) THEN (
CALL S_RCTBF ; zapis hodnotu z komunikace
)FI
-%IF(%TGT_T89C51RD2) THEN (\r
- MOV FCON,#00H ; vypni zapis do programove pameti\r
+%IF(%TGT_T89C51RD2) THEN (
+ MOV FCON,#00H ; vypni zapis do programove pameti
)FI
SETB EA
- JNZ REC_Bc1\r
- CLR C\r
-REC_BcR:RET\r
-)ELSE(\r
-REC_Bc CODE REC_Bx\r
-)FI\r
-\r
-; Vyslani bloku z XDATA\r
-\r
-SND_Bx: CALL SND_SPC ; R23 .. where\r
-SND_BX0:CLR REN_U ; R45 .. buffer bot/top\r
-%IF (%NEG_DR_EO) THEN (\r
- SETB DR_EO ; R67 .. end of buffer\r
-)ELSE(\r
- CLR DR_EO ; R67 .. end of buffer\r
-)FI\r
- CLR RI_U ; R1 = check sum\r
- CLR TB8_U\r
-SND_Bx1:CALL S_SNFB\r
- CLR TI_U\r
- JZ SND_BxR\r
-SND_Bx2:CALL S_RET\r
- JB AC,SND_Bx2\r
- SJMP SND_Bx1\r
-SND_BxR:CALL S_RET\r
- CLR TI_U\r
- RET\r
-\r
-%IF (%CX_MERGED_FL) THEN (\r
-SND_Bc CODE SND_Bx\r
-)ELSE(\r
-; Vyslani bloku z CODE\r
-SND_Bc: CALL SND_SPC ; R23 .. where\r
-SND_Bc0:CLR REN_U ; R45 .. buffer bot/top\r
-%IF (%NEG_DR_EO) THEN ( ; R67 .. end of buffer\r
- SETB DR_EO ; R1 = check sum\r
-)ELSE(\r
- CLR DR_EO\r
-)FI\r
- CLR RI_U\r
- CLR TB8_U\r
-SND_Bc1:CALL S_SNFC\r
- CLR TI_U\r
- JZ SND_BcR\r
-SND_Bc2:CALL S_RET\r
- JB AC,SND_Bc2\r
- SJMP SND_Bc1\r
-SND_BcR:CALL S_RET\r
- CLR TI_U\r
- RET\r
-)FI\r
-\r
-; Prijem bloku do IDATA\r
-\r
-REC_Bi: CLR SM2_U ; R2 .. where\r
- SETB REN_U ; X R45 .. buffer bot/top\r
-%IF (%NEG_DR_EO) THEN (\r
- CLR DR_EO ; R6 .. end of buffer\r
-)ELSE(\r
- SETB DR_EO ; R6 .. end of buffer\r
-)FI\r
- CLR TI_U ; R1 = check sum\r
-REC_Bi1:CALL S_RET ; CY = 1 when ended by CTR\r
- JB AC,REC_Bi2\r
- CLR TI_U\r
- SJMP REC_Bi1\r
-REC_Bi2:JC REC_BiR\r
- PUSH AR1\r
- MOV R1,AR2\r
- MOV @R1,A\r
- POP AR1\r
- XRL AR1,A\r
- INC R1\r
- INC R2\r
- MOV A,R2\r
- XRL A,R6\r
- JNZ REC_Bi1\r
- CLR C\r
-REC_BiR:RET\r
-\r
-; Vyslani bloku z IDATA\r
-\r
-SND_Bi: CALL SND_SPC ; R2 .. where\r
-SND_Bi0:CLR REN_U ; X R45 .. buffer bot/top\r
-%IF (%NEG_DR_EO) THEN (\r
- SETB DR_EO ; R6 .. end of buffer\r
-)ELSE(\r
- CLR DR_EO ; R6 .. end of buffer\r
-)FI\r
- CLR RI_U ; R1 = check sum\r
- CLR TB8_U\r
-SND_Bi1:PUSH AR1\r
- MOV R1,AR2\r
- MOV A,@R1\r
- MOV SBUF_U,A\r
- POP AR1\r
- XRL AR1,A\r
- INC R1\r
- INC R2\r
- MOV A,R2\r
- XRL A,R6\r
- CLR TI_U\r
- JZ SND_BiR\r
-SND_Bi2:CALL S_RET\r
- JB AC,SND_Bi2\r
- SJMP SND_Bi1\r
-SND_BiR:CALL S_RET\r
- CLR TI_U\r
- RET\r
-\r
-; Vyslani bloku z SDATA\r
-\r
-SND_Bs: CALL SND_SPC ; R2 .. where\r
-SND_Bs0:CLR REN_U ; X R45 .. buffer bot/top\r
-%IF (%NEG_DR_EO) THEN (\r
- SETB DR_EO ; R6 .. end of buffer\r
-)ELSE(\r
- CLR DR_EO ; R6 .. end of buffer\r
-)FI\r
- CLR RI_U ; R1 = check sum\r
- CLR TB8_U\r
-SND_Bs1:MOV DPTR,#PROC_BUF\r
- MOV A,#0E5H ; MOV A,dir\r
- MOVX @DPTR,A\r
- INC DPTR\r
- MOV A,R2 ; adresa\r
- MOVX @DPTR,A\r
- INC DPTR\r
- MOV A,#022H ; RET\r
- MOVX @DPTR,A\r
- INC DPTR\r
- DB 12H ; CALL PROC_BUF\r
- DW PROC_BUF\r
- MOV SBUF_U,A\r
- XRL AR1,A\r
- INC R1\r
- INC R2\r
- MOV A,R2\r
- XRL A,R6\r
- CLR TI_U\r
- JZ SND_BsR\r
-SND_Bs2:CALL S_RET\r
- JB AC,SND_Bs2\r
- SJMP SND_Bs1\r
-SND_BsR:CALL S_RET\r
- CLR TI_U\r
- RET\r
-\r
-; Prijem bloku do SDATA\r
-\r
-REC_Bs: CLR SM2_U ; R2 .. where\r
- SETB REN_U ; X R45 .. buffer bot/top\r
-%IF (%NEG_DR_EO) THEN (\r
- CLR DR_EO ; R6 .. end of buffer\r
-)ELSE(\r
- SETB DR_EO ; R6 .. end of buffer\r
-)FI\r
- CLR TI_U ; R1 = check sum\r
-REC_Bs1:CALL S_RET ; CY = 1 when ended by CTR\r
- JB AC,REC_Bs2\r
- CLR TI_U\r
- SJMP REC_Bs1\r
-REC_Bs2:JC REC_BsR\r
- XRL AR1,A\r
- INC R1\r
- MOV R3,A\r
- MOV DPTR,#PROC_BUF\r
- MOV A,#08BH ; MOV dir,R3\r
- MOVX @DPTR,A\r
- INC DPTR\r
- MOV A,R2 ; adresa\r
- MOVX @DPTR,A\r
- INC DPTR\r
- MOV A,#022H ; RET\r
- MOVX @DPTR,A\r
- INC DPTR\r
- DB 12H ; CALL PROC_BUF\r
- DW PROC_BUF\r
- INC R2\r
- MOV A,R2\r
- XRL A,R6\r
- JNZ REC_Bs1\r
- CLR C\r
-REC_BsR:RET\r
-\r
-; Vyslani konce ramce\r
-; se zakoncenim pro odpoved uL_END\r
-\r
-SND_END:MOV A,#uL_END\r
- SJMP SND_EN1\r
-\r
-; Vyslani konce ramce\r
-; podle CMD vysle uL_ARQ, uL_AAP nebo uL_END\r
-\r
-SND_ENDST:\r
- MOV DPTR,#uL_ST ; Status zpravy\r
- MOVX A,@DPTR\r
- ;JNB ACC.uLBF_NOREb,SND_EN0\r
- JNB ACC.6,SND_EN0 ; !!!! ASX8051 is broken\r
- ORL uL_FLG,#003H ; uz neopakovat vysilani\r
-SND_EN0:MOVX A,@DPTR\r
- ANL A,#3\r
- ADD A,#SND_ENt-SND_EN1\r
- MOVC A,@A+PC ; uL_END,uL_ARQ,uL_PRQ,uL_AAP\r
-SND_EN1:MOV R0,A\r
- XRL AR1,A\r
- INC R1\r
- CALL SND_CTR ; Vyslani zakonceni\r
- MOV A,R1\r
- CALL SND_CHR ; Vyslani checksum\r
- CJNE R0,#uL_END,SND_EN3\r
- RET\r
-SND_EN3:CJNE R0,#uL_PRQ,SND_EN4\r
- RET\r
-SND_EN4:MOV R0,#5\r
-SND_EN5:CALL WTF_CHR\r
- JNB AC,SND_EN5 ; Prijeti uL_ACK\r
- JC SND_EN6\r
- CJNE A,#uL_ACK,SND_EN6\r
- RET\r
-SND_EN6:JMP V3_ERR\r
-\r
-SND_ENt:DB uL_END,uL_ARQ,uL_PRQ,uL_AAP\r
-\r
-; Vyslani uL_NAK pri chybe v nektere z rutin zpracovani prikazu\r
-REC_ERR:CALL REC_CTR\r
- JNB AC,REC_ERR\r
-REC_ER2:CALL CMP_END ; Vstup s prijatym znakem v ACC a CY\r
- JC V3_ERR\r
- MOV R1,AR0\r
- MOV R0,#5\r
-REC_ER3:CALL WTF_CHR ; Prijem checksum\r
- JNB AC,REC_EN3\r
- MOV R0,AR1\r
- MOV R1,#uL_NAK\r
- SJMP REC_EN4\r
-\r
-; Potvrzeni prikazu\r
-ACK_CMD:MOV R1,#uL_ACK\r
- SJMP REC_EN4\r
-\r
-; Nacteni konce ramce\r
-; ret: ACC = CMP_END\r
-\r
-REC_END:MOV R0,#5\r
-REC_EN1:CALL WTF_CHR ; Prijem zakonceni ramce\r
- JNB AC,REC_EN1\r
-REC_EN2:XRL AR1,A ; Vstup s prijatym znakem v ACC a CY\r
- INC R1\r
- CALL CMP_END ; Nastaveni R0 dle zpravy (0-3)\r
- JC V3_ERR\r
- MOV DPTR,#uL_ST ; Nastav status zpravy\r
- MOV A,R0\r
- MOVX @DPTR,A\r
- CALL SND_SPC ; Prijem checksum\r
- JB AC,REC_EN3\r
- CALL SND_SPC\r
- JB AC,REC_EN3\r
- CALL SND_SPC\r
- JB AC,REC_EN3\r
- CALL SND_SPC\r
- JB AC,REC_EN3\r
-REC_E3N:CALL SND_SPC\r
- JB AC,REC_EN3\r
- SJMP V3_ERR\r
-REC_EN3:JC V3_ERR\r
- XRL A,R1\r
- JB uLF_REC,REC_EN7 ; Zprava urcena pro tuto stanici\r
- MOV R0,#0 ; Nastav ukonceni na END (neodpovidat)\r
-REC_EN7:MOV R1,#uL_NAK\r
- JNZ REC_EN4 ; Pri chybe a ARQ nebo AAP vysle NAK\r
- MOV R1,#uL_ACK ; Pri OK a ARQ vysle ACK\r
- MOV A,R0 ; Pri OK a AAP je R1=ACK ale vysle\r
- JB ACC.1,REC_EN5 ; az prooceed rutina\r
-REC_EN4:MOV A,R0\r
- JNB ACC.0,REC_EN5\r
- CLR ACC.0\r
- MOV R0,A\r
- SETB REN_U\r
- CALL SND_SPT\r
- CALL SND_SPC\r
- MOV A,R1\r
- CALL SND_CHR\r
-REC_EN5:CJNE R1,#uL_NAK,REC_EN6\r
-V3_ERR: JMP S_ERR\r
-REC_EN6:MOV A,R0\r
- RET\r
-\r
-; Pocatek ramce bez urceni Destignation Address\r
-\r
-SND_BEB:MOV DPTR,#uL_CMD ; Vysilany prikaz\r
- MOVX A,@DPTR\r
- ANL A,#7FH\r
- MOV R0,A\r
- MOV A,#uL_BEG\r
-\r
-; Vyslani zacatku ramce\r
-; call: ACC Destignation Address\r
-; R0 CoMmanD\r
-\r
-SND_BEG:ANL A,#07FH\r
- MOV R1,A\r
- CALL SND_SPT\r
- CALL SND_SPC\r
- MOV A,R1\r
- INC R1\r
- CALL SND_CTR ; Destignation Address nebo uL_BEG\r
- MOV DPTR,#uL_SA ; SA adresa\r
- MOVX A,@DPTR\r
- XRL AR1,A\r
- INC R1\r
- CALL SND_CHR\r
- MOV A,R0\r
- XRL AR1,A\r
- INC R1\r
- JMP SND_CHR\r
-\r
-\r
-; Nacteni zacatku ramce\r
-; ret: ACC Source Address\r
-; R0 CoMmanD\r
-\r
-REC_BEG:MOV R1,#uL_BEG ; Cekani ze SWAIT\r
- MOV R0,#9\r
-REC_BE1:CALL WTF_CHR\r
- JNB AC,REC_BE1\r
-REC_BE2:MOV R0,A\r
- MOV DPTR,#uL_STA ; Nuluj stamp\r
- CLR A\r
- MOVX @DPTR,A\r
-REC_BET:JNC V4_ERR\r
- JB uLF_NB,V3_ERR ; Cekani z PWAIT s R1=0\r
- MOV A,R0\r
- MOV DPTR,#uL_DA ; Uloz DA\r
- MOVX @DPTR,A\r
- SETB uLF_REC ; Zprava urcena pro tuto stanici\r
- JZ REC_BE3 ; Vseobecna adresa\r
- MOV DPTR,#uL_ADR ; Porovnej s vlastni adresou\r
- MOVX A,@DPTR\r
- XRL A,R0\r
- JZ REC_BE3 ; Shoda adresy\r
- CLR uLF_REC\r
- JNB uLF_ARC,REC_BEU ; Neprijimat vsechny zpravy\r
- CJNE R1,#uL_BEG,REC_BE3\r
- CJNE R0,#uL_BEG,REC_BE3\r
-REC_BEU:CJNE R1,#uL_BEG,S_ERR\r
- CJNE R0,#uL_BEG,S_EWAIT ; S_BEG a SWAIT\r
- SETB uLF_REC ; Zprava urcena pro tuto stanici\r
-REC_BE3:MOV AR1,R0 ; **********************\r
- INC R1 ; V R1 se bude pocitat chksum\r
- MOV R0,#5\r
-REC_BE4:CALL WTF_CHR ; Prijem SA\r
- JNB AC,REC_BE4\r
- JC S_ERR\r
- XRL AR1,A\r
- INC R1\r
- MOV R0,A ; R0=SA\r
-REC_BE5:CALL REC_CHR\r
- JNB AC,REC_BE5 ; Cekani na CMD - prikaz\r
- JC S_ERR\r
- XRL AR1,A\r
- INC R1\r
- MOV DPTR,#uL_CMD\r
- MOVX @DPTR,A ; Zapis CMD\r
- MOV DPTR,#uL_SA\r
- XCH A,R0\r
- MOVX @DPTR,A ; Zapis SA\r
- JMP S_POPDP\r
-\r
-; Cekani na konec bloku pri REC_BEG a SWAIT\r
-S_EWAIT:CALL REC_CTR\r
- JNB AC,S_EWAIT\r
- CALL CMP_END\r
- JC S_ERR\r
- MOV A,R0\r
- JNB ACC.0,REC_BEG\r
- MOV R0,#5\r
-S_EWAI1:CALL WTF_CHR\r
- JNB AC,S_EWAI1\r
- JNC REC_BEG\r
-V4_ERR: JMP S_ERR\r
-\r
-; Vrati v R0 0..S_END,1..S_ARQ,2..S_PRQ,3..S_AAP,JINAK CY\r
-CMP_END:JNC CMP_EN4\r
-CMP_EN0:MOV R0,#0\r
- CJNE A,#uL_END,CMP_EN1\r
- RET\r
-CMP_EN1:INC R0\r
- CJNE A,#uL_ARQ,CMP_EN2\r
- RET\r
-CMP_EN2:INC R0\r
- CJNE A,#uL_PRQ,CMP_EN3\r
- RET\r
-CMP_EN3:INC R0\r
- CJNE A,#uL_AAP,CMP_EN4\r
- RET\r
-CMP_EN4:SETB C\r
- RET\r
-\r
-; Doslo k chybe pri prijmu nebo vysilani\r
-\r
-S_ERR: MOV SP,#SER_STACK\r
- JNB uLF_SN,S_WAITD\r
- MOV R0,#3 ; Pocet vyslani ERRI pri normalni chybe\r
- JNB F0,S_ERR_1\r
- MOV R0,#10 ; Pocet vyslani ERRI pri zavazne chybe\r
-S_ERR_1:MOV A,#uL_ERRI\r
- CALL SND_CTR\r
- DJNZ R0,S_ERR_1\r
-S_ERR_2:INC uL_FLG\r
- MOV A,uL_FLG\r
- ANL A,#3\r
- JNZ S_END\r
- DEC uL_FLG\r
-S_ERR_3:SETB uLF_ERR\r
- CALL GET_OBA ; otevreni vystupni zpravy a naplneni promenych\r
- CALL GET_NXT ; uL_SA,uL_DA, ...\r
- MOV DPTR,#uL_ST ; priznak neplatneho doruceni zpravy\r
- MOVX A,@DPTR\r
- ORL A,#uLBF_FAIL\r
- MOVX @DPTR,A\r
- CALL GET_IBA ; otevreni vstupni zpravy\r
- CALL IB_BEGR\r
- JZ S_ERR_4 ; IBfull\r
- CALL IB_ENDR ; zapis zpravy o nulove delce s prametry uL_SA, ...\r
-S_ERR_4:SETB uLF_INE ; zprava ve vstupni fronte\r
- MOV R0,#0FFH\r
- SJMP S_ENDTE\r
-\r
-; Rutina maze posledni zpravu\r
-\r
-S_ENDT: MOV R0,#0\r
-S_ENDTE:MOV SP,#SER_STACK\r
- ANL uL_FLG,#0FCH\r
-%IF (%NEG_DR_EO) THEN (\r
- CLR DR_EO\r
-)ELSE(\r
- SETB DR_EO\r
-)FI\r
- CALL GET_OBA\r
-S_ENDT1:CALL GET_NXT\r
- JNB ACC.7,S_ENDT3 ; Neexistuje\r
- CALL SET_NXT\r
- %IF(%WITH_TAILS)THEN(\r
- JC S_ENDT1 ; Preskocit na konec tailovane skupiny\r
- )FI\r
- CALL GET_NXT\r
- JB ACC.7,S_END ; Je dalsi zprava\r
-S_ENDT3:CLR uLF_RS ; Neni dalsi zprava\r
-\r
-; Konec vysilani nebo prijmu\r
-\r
-S_END: MOV SP,#SER_STACK\r
- JNB uLF_SN,S_WAITD\r
- JB uLF_NB,S_WAITD\r
- CALL SND_SPT\r
- JB AC,S_WAITD\r
- CALL SND_SPC\r
- JB AC,S_WAITD\r
- CALL G_MADR\r
- ORL A,#80H\r
- CALL SND_CTR\r
- SETB uLF_NB\r
-\r
-; Cekani na komunikaci\r
-\r
-S_WAITD:MOV SP,#SER_STACK\r
- CLR TI_U\r
- SETB F0\r
- SETB REN_U\r
- SETB TXD_U\r
-\r
-; Cekani na vlastni adresu nebo pozadavek k vysilani\r
-\r
-S_WAIT: CLR uLF_SN\r
- JNB uLF_NB,S_WAIT1 ; Nelze vysilat\r
- JNB uLF_RS,S_WAIT1 ; Neni potreba vysilat\r
-\r
- SETB uLF_SN\r
- CALL G_MADR\r
- MOV R0,A ; Vlastni adresa\r
- SETB C\r
- SUBB A,R1 ; - Posledni vysilajici\r
- ANL A,#00FH ; Token pasing delay\r
- ADD A,#4 ; min 4\r
- JNB F0,S_CONN1\r
- ADD A,#010H ; Prodlouzit - byla chyba\r
-S_CONN1:MOV R1,A\r
-S_CONN2:CALL SND_SPC ; Cekani token pasing delay\r
- JB AC,S_WAIT2\r
- DJNZ R1,S_CONN2\r
- CALL S_ARB ; Arbitrace pristupu\r
- JB F0,S_WAIT1\r
-SND_OB: CALL GET_OBA ; R23 R4 R5 do OB\r
- %IF(%WITH_TAILS)THEN(\r
- CLR uLF_TPF\r
- )FI\r
-SND_OB0:CALL GET_NXT ; R67 pristi zprava\r
- JB ACC.7,SND_OBV ; Neexistuje\r
- JMP S_ENDT\r
-SND_OBV:JMP SND_OB1 ; Vysli blok\r
-\r
-S_WAIT1:MOV C,uLF_NB\r
- CPL C\r
- CALL REC_CH1 ; Ceka se na znak\r
-S_WAIT2:CLR uLF_SN\r
- JNB AC,S_WAITD ; Vybuzovaci TI_U\r
- MOV R1,A\r
- JNC S_WAITD ; Neni ridici\r
- JB ACC.7,S_WAIT ; Ukonceni vysilani\r
- MOV R1,#0\r
- CALL REC_BE2 ; Cekani na prikaz v R0\r
- SJMP REC_CM1\r
-\r
-REC_CMD:CALL REC_BEG ; Cekani na prikaz v R0\r
-REC_CM1:MOV A,R0\r
- JB ACC.7,REC_CM2\r
- CALL GET_IBA ; Prijem do IB\r
- CALL IB_BEGR\r
- JZ REC_CMEV\r
- CALL REC_Bx\r
- JNC REC_CMEV\r
- CALL REC_EN2\r
- MOV R1,A\r
- CALL IB_ENDR ; Prepisuje vse krome R1\r
- MOV A,R1 ; v R0 vraci CMD\r
- SETB uLF_INE\r
- JB ACC.1,REC_CM3 ; PRQ nebo AAP\r
-%IF (%VECTOR_FL) THEN (\r
- MOV A,#8 ; Priznak IB do R0.3\r
-REC_CM3:XCH A,R0\r
- JMP REC_CM8 ; Pro skok na uzivatelsky vektor\r
-)ELSE(\r
- XCH A,R0\r
-; CALL uL_R_BU ; Pro zpracovani zprav aplikaci\r
-\r
-)FI\r
-V1_WAIT:JMP S_WAITD\r
-\r
-%IF (NOT %VECTOR_FL) THEN (\r
-REC_CM3:XCH A,R0\r
- JMP REC_CM8\r
-)FI\r
-\r
-REC_CMEV:JMP REC_CME\r
-\r
-REC_CM2:CALL GET_PRB ; Prijem do PROC_BUF\r
- JZ REC_CMEV\r
- CALL REC_Bx\r
- JNC REC_CMEV\r
- CALL REC_EN2\r
-%IF (NOT %VECTOR_FL)THEN(\r
- JNB ACC.1,V1_WAIT\r
-)FI\r
- MOV A,R2\r
- MOV R6,A\r
- MOV A,R3\r
- MOV R7,A\r
- CALL GET_PR1\r
-REC_CM7:CALL G_CMD\r
-REC_CM8: ; Prikaz v ACC, zakonceni v R0\r
-%IF (%VECTOR_FL)THEN(\r
-; JMP V_uL_ADD ; Moznost rozsirit funkce uzivatelem\r
-\r
-uL_EADD:XCH A,R0\r
- JB ACC.3,V1_WAIT\r
- JNB ACC.1,V1_WAIT\r
- XCH A,R0\r
-)ELSE( ; Pro zpracovani prikazu aplikaci\r
-; CALL uL_R_CO\r
-)FI ; Pocatek provadeni internich prikazu\r
-\r
- CJNE A,#uL_SID,PR_CM20\r
-; Vysle svoji identifikaci\r
- CALL ACK_CMD\r
- CALL SND_BEB\r
- MOV R2,#LOW uL_IDB; ; Vysle svoji identifikaci\r
- MOV R3,#HIGH uL_IDB\r
- MOV R6,#LOW uL_IDE\r
- MOV R7,#HIGH uL_IDE\r
-PR_CM12:MOV R5,AR4\r
- CALL SND_Bc ; SND_Bx\r
-PR_CM19:CALL SND_END ; Vysli zakonceni uL_END\r
- SJMP V1_WAIT\r
-\r
-; Test volne pameti\r
-PR_CM20:CJNE A,#uL_SFT,PR_CM30\r
- MOV A,R0\r
- JNB ACC.0,V1_WAIT\r
- CALL GET_IBA\r
- CALL LEN_DAT\r
- MOV AR4,R0\r
- CALL GET_PRB\r
- CALL S_R0FB\r
- MOV A,R4\r
- CLR C\r
- SUBB A,#6\r
- JNC PR_CM22\r
- INC R1\r
-PR_CM22:CLR C\r
- SUBB A,R0\r
- PUSH PSW\r
- CALL SND_SPC\r
- CALL S_R0FB\r
- POP PSW\r
- MOV A,R1\r
- SUBB A,R0\r
- MOV A,#uL_NAK\r
- JC PR_CM24\r
- MOV A,#uL_ACK\r
-PR_CM24:CALL SND_CHR\r
- JMP S_WAITD\r
-\r
-; Krokovani pocatek\r
-PR_CM30:CJNE A,#uL_TF0,PR_CM32\r
- CLR uLF_TRP ; Ukonci krokovani\r
-PR_CM31:CALL ACK_CMD\r
- JMP S_WAITD\r
-PR_CM32:CJNE A,#uL_TF1,PR_CM33\r
- SETB uLF_TRP ; Zacne krokovani\r
- SJMP PR_CM31\r
-PR_CM33:CJNE A,#uL_STP,PR_CM36\r
- SETB TI_U ; Provede jednu instrukci\r
- CALL S_RETI\r
- CLR TI_U\r
- CLR A\r
- SJMP PR_CM31\r
-PR_CM36:CJNE A,#uL_SPC,PR_CM40\r
- CALL ACK_CMD\r
- CALL SND_BEB\r
- MOV A,SER_STACK ; Vysle PCL PCH PSW ACC\r
- INC A\r
- MOV R6,A\r
- ADD A,#-6\r
- MOV R2,A\r
- CALL SND_Bi\r
- JMP PR_CM19\r
-\r
-PR_CM40:CJNE A,#uL_RDM,PR_CM50\r
-; Vyslani pameti\r
- CALL ACK_CMD\r
- CALL SND_BEB\r
- CALL S_PRPMM\r
- CJNE R4,#1,S_RDM1\r
- CALL SND_Bi\r
-S_RDM1: CJNE R4,#2,S_RDM2\r
- CALL SND_Bx\r
-S_RDM2: CJNE R4,#4,S_RDM3\r
- CALL SND_Bs\r
-S_RDM3: CJNE R4,#5,S_RDM4\r
- CALL SND_Bc\r
-S_RDM4: JMP PR_CM19\r
-\r
-PR_CM50:CJNE A,#uL_WRM,PR_CM60\r
-; Prijem do pameti\r
- CALL ACK_CMD\r
- CALL REC_BEG\r
- CJNE R0,#uL_WRM AND 7FH,REC_CMEV1\r
-S_WRM0: CALL S_PRPMM\r
- MOV A,#1\r
- CJNE R4,#1,S_WRM1\r
- CALL REC_Bi\r
-S_WRM1: CJNE R4,#2,S_WRM2\r
- CALL REC_Bx\r
-S_WRM2: CJNE R4,#4,S_WRM3\r
- CALL REC_Bs\r
-S_WRM3: CJNE R4,#5,S_WRM4 ; zapis do code 89c51rd2?\r
- CALL REC_Bc\r
- JNZ REC_CME\r
- CALL REC_END\r
-%IF(%TGT_T89C51RD2)THEN(\r
-S_WRM31:\r
- MOV A,FCON ; cekej na dozapsani\r
- ANL A,#01H\r
- JNZ S_WRM31\r
- MOV FCON,#050H ; zapisovaci sequence\r
- MOV FCON,#0A0H ; zapisovaci sequence\r
-)FI \r
- JMP S_WAITD\r
-S_WRM4: JNZ REC_CME\r
- CALL REC_END\r
- JMP S_WAITD\r
-REC_CMEV1:JMP REC_CME\r
-\r
-PR_CM60:CJNE A,#uL_ERM,PR_CM70\r
-; mazani pameti\r
- CALL ACK_CMD\r
- CALL S_PRPMM\r
- CJNE R4,#5,S_ERM3\r
-%IF(%TGT_MSC1210) THEN (\r
- MOV MSECL,#R_MSECL\r
- MOV MSECH,#R_MSECH\r
- CLR EA\r
-S_ERM1: CLR C\r
- MOV A,R2\r
- SUBB A,R6\r
- MOV A,R3\r
- SUBB A,R7\r
- JNC S_ERM2 ; R23>=R67\r
- MOV A,#0FFH ; value to write\r
- ORL FMCON,#040h\r
- CALL S_ACCTBF\r
- ANL FMCON,#0BFh\r
- MOV A,#127 ; R23+128, page length is 128 \r
- ADD A,R2 ; a increment is made in S_ACCTB\r
- MOV R2,A\r
- JNC S_ERM1\r
- INC R3\r
- JMP S_ERM1\r
-S_ERM2: SETB EA\r
-)FI\r
-S_ERM3:\r
- JMP S_WAITD\r
-\r
-PR_CM70:CJNE A,#uL_DEB,PR_CM80\r
-\r
-; Ladici prikazy\r
-S_DEB: CALL S_EQP\r
- JZ NAK_CMD\r
- CALL ACK_CMD\r
- MOV DPTR,#PROC_BUF\r
- MOVX A,@DPTR\r
- INC DPTR\r
- CJNE A,#10H,S_DEB98\r
- INC DPTR ; Prikaz GO xxxx\r
- INC DPTR\r
- MOV A,SER_STACK ; Zapise PCL PCH\r
- ADD A,#-5\r
- MOV R1,A\r
- MOVX A,@DPTR\r
- MOV @R1,A\r
- INC DPTR\r
- INC R1\r
- MOVX A,@DPTR\r
- MOV @R1,A\r
- %IF(%TGT_T89C51RD2)THEN(\r
- MOV DPTR,#uL_ADR ; zalohuj s vlastni adresou pro presmerovani\r
- MOVX A,@DPTR ; na bootloader\r
- MOV SADDR,A\r
- )FI\r
-S_DEB98:JMP S_WAITD\r
-\r
-PR_CM80:\r
-%IF (%DY_ADDR)THEN(\r
- CJNE A,#uL_GST,NAK_CMD\r
- JMP UD_SNST ; Cteni statusu a podpora dynamicke adresace\r
-)FI\r
-\r
-NAK_CMD:MOV R1,#uL_NAK\r
- JMP REC_EN4\r
-\r
-WAK_CMD:MOV R1,#uL_WAK\r
- JMP REC_EN4\r
-\r
-REC_CME:CALL REC_ERR\r
- JMP REC_CMD\r
-\r
-SND_OB1:CJNE R1,#0,SND_OB2\r
- CALL SND_BEG\r
- SJMP SND_OB3\r
-SND_OB2:CALL SND_BEG\r
- CALL SND_Bx\r
-SND_OB3:CALL SND_ENDST ; Vysli zakonceni podle uL_ST\r
- MOV DPTR,#uL_DA ; oprav adresu DA\r
- MOVX A,@DPTR\r
- ANL A,#07FH\r
- MOVX @DPTR,A\r
- MOV DPTR,#uL_ST ; Status zpravy z predchoziho GET_NXT\r
- MOVX A,@DPTR\r
- ORL A,#uLBF_PROC ; nastavit priznak doruceni zpravy\r
- MOVX @DPTR,A\r
- %IF(%WITH_TAILS)THEN(\r
- ;MOV C,ACC.uLBF_TAILb\r
- MOV C,ACC.5 ; !!!! ASX8051 is broken\r
- MOV uLF_TMP,C\r
- JB uLF_TPF,SND_OB5\r
- JC SND_OB4\r
- )FI\r
- CALL GET_IBA ; otevreni vstupni zpravy\r
- CALL IB_BEGR\r
- JZ SND_OBE ; IBfull\r
- CALL IB_ENDR ; zapis zpravy o nulove delce s vysilanymi parametry\r
-SND_OBE:SETB uLF_INE ; zprava ve vstupni fronte\r
- JMP S_ENDT\r
-\r
-%IF(%WITH_TAILS)THEN(\r
-SND_OB4:MOV DPTR,#P_NDB\r
- MOVX A,@DPTR\r
- MOV R0,A\r
- INC DPTR\r
- MOVX A,@DPTR\r
- XCH A,R0\r
- MOV DPTR,#P_TI\r
- MOVX @DPTR,A\r
- INC DPTR\r
- MOV A,R0\r
- MOVX @DPTR,A\r
-SND_OB5:SETB REN_U\r
- %IF (%NEG_DR_EO) THEN (\r
- CLR DR_EO ; Prepnout na prijem\r
- )ELSE(\r
- SETB DR_EO ; Prepnout na prijem\r
- )FI\r
- MOV DPTR,#P_TO\r
- MOV A,R2\r
- MOVX @DPTR,A ; Zapamatovat si pozici v OB\r
- INC DPTR\r
- MOV A,R3\r
- MOVX @DPTR,A\r
- CALL GET_IBA ; otevreni vstupni zpravy\r
- MOV DPTR,#P_TI\r
- MOVX A,@DPTR\r
- MOV R2,A\r
- INC DPTR\r
- MOVX A,@DPTR\r
- MOV R3,A\r
- CALL IB_BEGR\r
- JZ SND_OBF\r
- MOV C,uLF_TPF\r
- CALL IB_ENDRT ; zapis zpravy o nulove delce s vysilanymi parametry\r
-SND_OBF:SETB uLF_TPF\r
-SND_OB6:JB uLF_TMP,SND_OB7\r
-\r
- MOV DPTR,#P_TI\r
- MOVX A,@DPTR\r
- MOV R2,A\r
- INC DPTR\r
- MOVX A,@DPTR\r
- MOV R3,A\r
- MOV DPTR,#P_NDB\r
- MOVX A,@DPTR\r
- XCH A,R2\r
- MOVX @DPTR,A\r
- INC DPTR\r
- MOVX A,@DPTR\r
- XCH A,R3\r
- MOVX @DPTR,A\r
- MOV DPL,R2\r
- MOV DPH,R3\r
- MOVX A,@DPTR\r
- ORL A,#80H ; Onacit platnost vstupnich dat\r
- MOVX @DPTR,A\r
- SETB uLF_INE ; zprava ve vstupni fronte\r
- JMP S_ENDT\r
- \r
-SND_OB7:\r
- MOV DPTR,#P_TO\r
- MOVX A,@DPTR\r
- MOV R2,A\r
- INC DPTR\r
- MOVX A,@DPTR\r
- MOV R3,A\r
- MOV DPTR,#H_BOB\r
- MOVX A,@DPTR\r
- MOV R4,A\r
- INC DPTR\r
- MOVX A,@DPTR\r
- MOV R5,A\r
- \r
- CALL GET_NXT ; Dalsi ramec, AC=uLBF_RECb\r
- JNB ACC.7,V5_ERR\r
- JB AC,REC_TA1\r
- JMP SND_OB1\r
- \r
-REC_TA1:MOV uLF_TMP,C ; Pokracuje dalsim ramcem \r
- MOV DPTR,#P_TO\r
- MOV A,R6\r
- MOVX @DPTR,A ; Zapamatovat si pozici v OB\r
- INC DPTR\r
- MOV A,R7\r
- MOVX @DPTR,A\r
-\r
- MOV R1,#uL_BEG ; Cekani ze SWAIT\r
- MOV R0,#9\r
-REC_TA3:CALL WTF_CHR\r
- JNB AC,REC_TA3\r
- MOV R0,A\r
- CALL REC_BET ; prijem tailu\r
- CALL GET_IBA ; Prijem do IB\r
- MOV DPTR,#P_TI\r
- MOVX A,@DPTR\r
- MOV R2,A\r
- INC DPTR\r
- MOVX A,@DPTR\r
- MOV R3,A\r
- CALL IB_BEGR\r
- JZ REC_TAER\r
- CALL REC_Bx\r
- JNC REC_TAER\r
- CALL REC_EN2\r
- MOV DPTR,#uL_ST ; priznak doruceni zpravy\r
- MOV A,#(uLBF_REC OR uLBF_PROC)\r
- MOV C,uLF_TMP\r
- ;MOV ACC.uLBF_TAILb,C\r
- MOV ACC.5,C ; !!!! ASX8051 is broken\r
- MOVX @DPTR,A\r
- SETB C\r
- CALL IB_ENDRT ; Prepisuje vse krome R1\r
- JMP SND_OB6\r
-\r
-REC_TAER:CALL REC_ERR\r
-V5_ERR: JMP S_ERR\r
-)FI\r
-\r
-\r
-; Priprava pro cteni a zapis pameti\r
-\r
-S_PRPMM:MOV DPTR,#PROC_BUF\r
- MOV R0,#AR2\r
-S_PRPM1:MOVX A,@DPTR\r
- MOV @R0,A\r
- INC R0\r
- INC DPTR\r
- CJNE R0,#AR7+1,S_PRPM1\r
- MOV A,R4\r
- XCH A,R2\r
- MOV R4,A\r
- MOV A,R5\r
- XCH A,R3\r
- MOV R0,A\r
- CJNE R4,#9,S_PRPM2\r
- MOV A,#SER_STACK\r
- SJMP S_PRPM4\r
-S_PRPM2:CJNE R4,#8,S_PRPM3\r
- MOV A,SER_STACK\r
- INC A\r
- SJMP S_PRPM4\r
-S_PRPM3:CJNE R4,#7,S_PRPM5\r
- MOV R0,SER_STACK\r
- DEC R0\r
- MOV A,@R0\r
- ANL A,#18H\r
-S_PRPM4:ADD A,R2\r
- MOV R2,A\r
- MOV R4,#1\r
-S_PRPM5:MOV AR5,R4\r
-\r
-; Pricte k R67 R23\r
-\r
-AR67R23:MOV A,R6\r
- ADD A,R2\r
- MOV R6,A\r
- MOV A,R7\r
- ADDC A,R3\r
- MOV R7,A\r
- CLR C\r
- SUBB A,R5\r
- JC AR67R6R\r
- ADD A,R4\r
- MOV R7,A\r
-AR67R6R:RET\r
-\r
-; Priprav IB pro prijem dat\r
-\r
-IB_BEGR:MOV R0,#7\r
-IB_BEG1:CLR A\r
- CALL S_ACCTB\r
- JZ IB_BEGG\r
- DJNZ R0,IB_BEG1\r
-IB_BEGG:RET\r
-\r
-; Zakonceni prijmu do IB\r
-; call: [R23] konec dat\r
-; uL_SA adresa vysilace\r
-; uL_DA adresa prijemce\r
-; Nastavi P_NDB a ukazatel na dalsi blok\r
-; ret: [R23] zacatek dat\r
-; [R67] za konec dat\r
-; R0 prikaz CMD\r
-; nesmi mazat R1\r
-\r
-IB_ENDR:SETB C ; Zprava ma byt oznacena za platnou\r
- MOV DPL,R2 ; Oznacit za prazdny\r
- MOV DPH,R3 ; blok za prijatou zpravou\r
- CLR A\r
- MOVX @DPTR,A\r
- MOV DPTR,#P_NDB\r
-IB_END1:MOVX A,@DPTR ; Posunout ukazatel na pristi\r
- XCH A,R2 ; prijimany blok za zpravu\r
- MOV R6,A\r
- MOVX @DPTR,A\r
- INC DPTR\r
- MOVX A,@DPTR\r
- XCH A,R3 ; R23 na zacatek bloku\r
- MOV R7,A ; R67 za konec bloku\r
- MOVX @DPTR,A\r
- MOV DPTR,#uL_SA\r
- MOVX A,@DPTR\r
- MOV ACC.7,C ; Ulozit SA or 80H a tim\r
- CALL S_ACCTB ; oznacit zpravu za platnou\r
- MOV DPTR,#uL_DA\r
- MOVX A,@DPTR\r
- CALL S_ACCTB ; Ulozit DA\r
- MOV A,R6\r
- CALL S_ACCTB ; Ulozit ukazatel za zpravu\r
- MOV A,R7 ; na pristi blok\r
- CALL S_ACCTB\r
- MOV DPTR,#uL_CMD\r
- MOVX A,@DPTR\r
- CALL S_ACCTB ; Ulozit CMD zpravy\r
- MOV DPTR,#uL_ST\r
- MOVX A,@DPTR\r
- CALL S_ACCTB ; Ulozit status zpravy\r
- MOV DPTR,#uL_STA\r
- MOVX A,@DPTR\r
- CALL S_ACCTB ; Ulozit stamp zpravy\r
- RET\r
-%IF(%WITH_TAILS)THEN(\r
-; Verze IB_ENDR pro tailovani pracuje proti P_TI\r
-; vstup CY informuje o stavu oznaceni zpravy za dokoncenou\r
-IB_ENDRT:\r
- MOV DPL,R2 ; Oznacit za prazdny\r
- MOV DPH,R3 ; blok za prijatou zpravou\r
- CLR A\r
- MOVX @DPTR,A\r
- MOV DPTR,#P_TI\r
- SJMP IB_END1\r
-)FI\r
-\r
-; Naplni registry pointry do PROC_BUF\r
-GET_PRB:MOV R6,#LOW PROC_BUFE ; Prijem do PROC_BUF\r
- MOV R7,#HIGH PROC_BUFE\r
-GET_PR1:MOV R2,#LOW PROC_BUF\r
- MOV R3,#HIGH PROC_BUF\r
- MOV AR5,R4\r
- RET\r
-\r
-; R67 naplni ukazately na pristi blok\r
-; uL_DA,uL_SA,uL_ST,uL_CMD\r
-; ret: ACC .. DA\r
-; R0 .. command\r
-; R1 .. 0 pri nulove delce dat\r
-; CY=1 .. zprava s tailem\r
-; AC=1 .. zprava typu REC\r
-\r
-GET_NXT:CALL S_R0FB ; DAdr\r
- MOV A,R0\r
- CLR C\r
- JNB ACC.7,GET_NX4\r
- MOV DPTR,#uL_DA\r
- MOVX @DPTR,A\r
- CALL S_R0FB ; SAdr\r
- MOV A,R0\r
- MOV DPTR,#uL_SA\r
- MOVX @DPTR,A\r
- CALL S_R0FB ; Nacist ukazatel za zpravu\r
- MOV A,R0\r
- MOV R6,A\r
- CALL S_R0FB \r
- MOV A,R0\r
- MOV R7,A\r
- CALL S_R0FB ; CMD\r
- MOV A,R0\r
- MOV R1,A\r
- MOV DPTR,#uL_CMD \r
- MOVX @DPTR,A\r
- CALL S_R0FB ; ST\r
- MOV A,R0\r
- MOV DPTR,#uL_ST\r
- MOVX @DPTR,A\r
- ;MOV C,ACC.uLBF_RECb\r
- MOV C,ACC.4 ; !!!! ASX8051 is broken\r
- MOV AC,C\r
- ;MOV C,ACC.uLBF_TAILb\r
- MOV C,ACC.5 ; !!!! ASX8051 is broken\r
- PUSH PSW ; Nemelo by byt potreba\r
- CALL S_R0FB ; ACC - 0 pri nulove delce dat\r
- XCH A,R1 ; presun do R1, CMD do A\r
- XCH A,R0 ; CMD konecne do R0\r
- MOV DPTR,#uL_STA ; Stamp\r
- MOVX @DPTR,A\r
- MOV DPTR,#uL_DA ; DAdr\r
- MOVX A,@DPTR\r
- POP PSW ; Nemelo by byt potreba\r
-GET_NX4:RET\r
-\r
-; Posune ukazatel za aktualni vystupni zpravu\r
-; Nesmi menit R0, R1, CY\r
-SET_NXT:MOV DPTR,#P_AOB\r
- MOV A,R6\r
- MOV R2,A\r
- MOVX @DPTR,A\r
- INC DPTR\r
- MOV A,R7\r
- MOV R3,A\r
- MOVX @DPTR,A\r
- SJMP S_POPDP\r
-\r
-; Naplni registry pointry do OB\r
-\r
-GET_OBA:MOV DPTR,#P_AOB\r
- JMP GET_BA1\r
-\r
-; Naplni registry pointry do IB\r
-\r
-GET_IBA:MOV DPTR,#P_NDB\r
-GET_BA1:MOV R0,#AR2\r
-GET_BA2:MOVX A,@DPTR\r
- INC DPTR\r
- MOV @R0,A\r
- INC R0\r
- CJNE R0,#AR7+1,GET_BA2\r
- SJMP S_POPDP\r
-\r
-; Nacte prikaz CMD\r
-G_CMD: MOV DPTR,#uL_CMD ; Prikaz\r
- SJMP G_MADR2\r
-\r
-; Nacte SA\r
-G_SA: MOV DPTR,#uL_SA ; Vlastni SA\r
- SJMP G_MADR2\r
-\r
-; Nacte vlastni adresu\r
-G_MADR: MOV DPTR,#uL_ADR ; Vlastni adresa\r
-G_MADR2:MOVX A,@DPTR\r
-S_POPDP:RET\r
-\r
-; Pripojeni mastera ke sbernici\r
-; vstup vlastni adresy v R0\r
-\r
-S_ARB: MOV R1,#3+1 ; 3x2 bitu arbitrace\r
- CLR uLF_NB\r
-S_ARB1:\r
-%IF (%NEG_DR_EO) THEN (\r
- CLR DR_EO\r
-)ELSE(\r
- SETB DR_EO\r
-)FI\r
- JNB RXD_U,S_ARBE\r
- JB AC,S_ARBE\r
- CLR TXD_U\r
- CALL SND_CH1\r
- SETB TXD_U\r
-%IF (%NEG_DR_EO) THEN (\r
- CLR DR_EO\r
-)ELSE(\r
- SETB DR_EO\r
-)FI\r
-S_ARB2: CALL SND_CH2\r
- JB AC,S_ARB2\r
- MOV A,R0 ; Rotace adresy\r
- RR A\r
- RR A\r
- XCH A,R0\r
- ANL A,#3 ; Nejnizsi 2 bity\r
- INC A\r
- MOV R2,A ; Pocet cekani\r
- DJNZ R1,S_ARB4\r
- RET\r
-S_ARB3: JB AC,S_ARBE\r
- CALL SND_SPC\r
-S_ARB4: DJNZ R2,S_ARB3\r
- SJMP S_ARB1\r
-\r
-S_ARBE: SETB F0\r
- RET\r
-\r
-\r
-LEN_DAT:CLR C ; Delka dat = R67-R23\r
- MOV A,R6 ; Kdyz je vetsi nez 127 bytu\r
- SUBB A,R2 ; A = 80h+Delka/256\r
- MOV R0,A ; Jinak A = Delka\r
- MOV A,R7\r
- SUBB A,R3\r
- JNC LEN_DA1\r
- CLR C\r
- SUBB A,R4\r
- ADD A,R5\r
-LEN_DA1:MOV R1,A\r
- JNZ LEN_DA2\r
- MOV A,R0\r
- JNB ACC.7,LEN_DA3\r
- CLR A\r
-LEN_DA2:ORL A,#080H\r
-LEN_DA3:RET\r
-\r
-S_CHKSA:XCH A,R1 ; Check sum\r
- XRL A,R1\r
- INC A\r
- XCH A,R1\r
- RET\r
-\r
-%IF (NOT %CX_MERGED_FL) THEN (\r
-S_SNFC: MOV DPH,R3 ; Vyslani znaku z CODE\r
- MOV DPL,R2\r
- CLR A\r
- MOVC A,@A+DPTR\r
- SJMP S_SNFB1\r
-)FI\r
-\r
-S_SNFB: MOV DPH,R3 ; Vyslani znaku z bufferu\r
- MOV DPL,R2\r
- MOVX A,@DPTR\r
-S_SNFB1:MOV SBUF_U,A\r
- XCH A,R1 ; Check sum\r
- XRL A,R1\r
- INC A\r
- XCH A,R1\r
- SJMP S_ACCT1\r
-\r
-S_R0FB: MOV DPH,R3 ; Naplneni R0 z bufferu\r
- MOV DPL,R2\r
- MOVX A,@DPTR\r
- MOV R0,A\r
- SJMP S_ACCT1\r
-\r
-S_RCTB: MOV A,SBUF_U ; Prijem znaku do bufferu\r
-S_RCTB1:XCH A,R1 ; Check sum\r
- XRL A,R1\r
- INC A\r
- XCH A,R1\r
-S_ACCTB:MOV DPH,R3\r
- MOV DPL,R2\r
- MOVX @DPTR,A\r
-S_ACCT1:\r
-S_INCP: INC R2 ; Pripraveni nasledujici adresy\r
- MOV A,R2\r
- JNZ S_INCP1\r
- INC R3\r
-S_INCP1:MOV A,R5\r
- XRL A,R3\r
- JNZ S_EQP\r
- MOV A,R4\r
- MOV R3,A\r
-S_EQP: MOV A,R2 ; Kontrola prostoru pro data\r
- XRL A,R6 ; ACC=0 => konec dat nebo preteceni IB\r
- JNZ S_EQP1\r
- MOV A,R3\r
- XRL A,R7\r
-S_EQP1: RET\r
-\r
-%IF(%TGT_MSC1210) THEN (\r
-S_RCTBF:XCH A,R1 ; Check sum\r
- XRL A,R1\r
- INC A\r
- XCH A,R1\r
-S_ACCTBF:MOV DPH,R3\r
+ JNZ REC_Bc1
+ CLR C
+REC_BcR:RET
+)ELSE(
+REC_Bc CODE REC_Bx
+)FI
+
+; Vyslani bloku z XDATA
+
+SND_Bx: CALL SND_SPC ; R23 .. where
+SND_BX0:CLR REN_U ; R45 .. buffer bot/top
+%IF (%NEG_DR_EO) THEN (
+ SETB DR_EO ; R67 .. end of buffer
+)ELSE(
+ CLR DR_EO ; R67 .. end of buffer
+)FI
+ CLR RI_U ; R1 = check sum
+ CLR TB8_U
+SND_Bx1:CALL S_SNFB
+ CLR TI_U
+ JZ SND_BxR
+SND_Bx2:CALL S_RET
+ JB AC,SND_Bx2
+ SJMP SND_Bx1
+SND_BxR:CALL S_RET
+ CLR TI_U
+ RET
+
+%IF (%CX_MERGED_FL) THEN (
+SND_Bc CODE SND_Bx
+)ELSE(
+; Vyslani bloku z CODE
+SND_Bc: CALL SND_SPC ; R23 .. where
+SND_Bc0:CLR REN_U ; R45 .. buffer bot/top
+%IF (%NEG_DR_EO) THEN ( ; R67 .. end of buffer
+ SETB DR_EO ; R1 = check sum
+)ELSE(
+ CLR DR_EO
+)FI
+ CLR RI_U
+ CLR TB8_U
+SND_Bc1:CALL S_SNFC
+ CLR TI_U
+ JZ SND_BcR
+SND_Bc2:CALL S_RET
+ JB AC,SND_Bc2
+ SJMP SND_Bc1
+SND_BcR:CALL S_RET
+ CLR TI_U
+ RET
+)FI
+
+; Prijem bloku do IDATA
+
+REC_Bi: CLR SM2_U ; R2 .. where
+ SETB REN_U ; X R45 .. buffer bot/top
+%IF (%NEG_DR_EO) THEN (
+ CLR DR_EO ; R6 .. end of buffer
+)ELSE(
+ SETB DR_EO ; R6 .. end of buffer
+)FI
+ CLR TI_U ; R1 = check sum
+REC_Bi1:CALL S_RET ; CY = 1 when ended by CTR
+ JB AC,REC_Bi2
+ CLR TI_U
+ SJMP REC_Bi1
+REC_Bi2:JC REC_BiR
+ PUSH AR1
+ MOV R1,AR2
+ MOV @R1,A
+ POP AR1
+ XRL AR1,A
+ INC R1
+ INC R2
+ MOV A,R2
+ XRL A,R6
+ JNZ REC_Bi1
+ CLR C
+REC_BiR:RET
+
+; Vyslani bloku z IDATA
+
+SND_Bi: CALL SND_SPC ; R2 .. where
+SND_Bi0:CLR REN_U ; X R45 .. buffer bot/top
+%IF (%NEG_DR_EO) THEN (
+ SETB DR_EO ; R6 .. end of buffer
+)ELSE(
+ CLR DR_EO ; R6 .. end of buffer
+)FI
+ CLR RI_U ; R1 = check sum
+ CLR TB8_U
+SND_Bi1:PUSH AR1
+ MOV R1,AR2
+ MOV A,@R1
+ MOV SBUF_U,A
+ POP AR1
+ XRL AR1,A
+ INC R1
+ INC R2
+ MOV A,R2
+ XRL A,R6
+ CLR TI_U
+ JZ SND_BiR
+SND_Bi2:CALL S_RET
+ JB AC,SND_Bi2
+ SJMP SND_Bi1
+SND_BiR:CALL S_RET
+ CLR TI_U
+ RET
+
+; Vyslani bloku z SDATA
+
+SND_Bs: CALL SND_SPC ; R2 .. where
+SND_Bs0:CLR REN_U ; X R45 .. buffer bot/top
+%IF (%NEG_DR_EO) THEN (
+ SETB DR_EO ; R6 .. end of buffer
+)ELSE(
+ CLR DR_EO ; R6 .. end of buffer
+)FI
+ CLR RI_U ; R1 = check sum
+ CLR TB8_U
+SND_Bs1:MOV DPTR,#PROC_BUF
+ MOV A,#0E5H ; MOV A,dir
+ MOVX @DPTR,A
+ INC DPTR
+ MOV A,R2 ; adresa
+ MOVX @DPTR,A
+ INC DPTR
+ MOV A,#022H ; RET
+ MOVX @DPTR,A
+ INC DPTR
+ DB 12H ; CALL PROC_BUF
+ DW PROC_BUF
+ MOV SBUF_U,A
+ XRL AR1,A
+ INC R1
+ INC R2
+ MOV A,R2
+ XRL A,R6
+ CLR TI_U
+ JZ SND_BsR
+SND_Bs2:CALL S_RET
+ JB AC,SND_Bs2
+ SJMP SND_Bs1
+SND_BsR:CALL S_RET
+ CLR TI_U
+ RET
+
+; Prijem bloku do SDATA
+
+REC_Bs: CLR SM2_U ; R2 .. where
+ SETB REN_U ; X R45 .. buffer bot/top
+%IF (%NEG_DR_EO) THEN (
+ CLR DR_EO ; R6 .. end of buffer
+)ELSE(
+ SETB DR_EO ; R6 .. end of buffer
+)FI
+ CLR TI_U ; R1 = check sum
+REC_Bs1:CALL S_RET ; CY = 1 when ended by CTR
+ JB AC,REC_Bs2
+ CLR TI_U
+ SJMP REC_Bs1
+REC_Bs2:JC REC_BsR
+ XRL AR1,A
+ INC R1
+ MOV R3,A
+ MOV DPTR,#PROC_BUF
+ MOV A,#08BH ; MOV dir,R3
+ MOVX @DPTR,A
+ INC DPTR
+ MOV A,R2 ; adresa
+ MOVX @DPTR,A
+ INC DPTR
+ MOV A,#022H ; RET
+ MOVX @DPTR,A
+ INC DPTR
+ DB 12H ; CALL PROC_BUF
+ DW PROC_BUF
+ INC R2
+ MOV A,R2
+ XRL A,R6
+ JNZ REC_Bs1
+ CLR C
+REC_BsR:RET
+
+; Vyslani konce ramce
+; se zakoncenim pro odpoved uL_END
+
+SND_END:MOV A,#uL_END
+ SJMP SND_EN1
+
+; Vyslani konce ramce
+; podle CMD vysle uL_ARQ, uL_AAP nebo uL_END
+
+SND_ENDST:
+ MOV DPTR,#uL_ST ; Status zpravy
+ MOVX A,@DPTR
+ ;JNB ACC.uLBF_NOREb,SND_EN0
+ JNB ACC.6,SND_EN0 ; !!!! ASX8051 is broken
+ ORL uL_FLG,#003H ; uz neopakovat vysilani
+SND_EN0:MOVX A,@DPTR
+ ANL A,#3
+ ADD A,#SND_ENt-SND_EN1
+ MOVC A,@A+PC ; uL_END,uL_ARQ,uL_PRQ,uL_AAP
+SND_EN1:MOV R0,A
+ XRL AR1,A
+ INC R1
+ CALL SND_CTR ; Vyslani zakonceni
+ MOV A,R1
+ CALL SND_CHR ; Vyslani checksum
+ CJNE R0,#uL_END,SND_EN3
+ RET
+SND_EN3:CJNE R0,#uL_PRQ,SND_EN4
+ RET
+SND_EN4:MOV R0,#5
+SND_EN5:CALL WTF_CHR
+ JNB AC,SND_EN5 ; Prijeti uL_ACK
+ JC SND_EN6
+ CJNE A,#uL_ACK,SND_EN6
+ RET
+SND_EN6:JMP V3_ERR
+
+SND_ENt:DB uL_END,uL_ARQ,uL_PRQ,uL_AAP
+
+; Vyslani uL_NAK pri chybe v nektere z rutin zpracovani prikazu
+REC_ERR:CALL REC_CTR
+ JNB AC,REC_ERR
+REC_ER2:CALL CMP_END ; Vstup s prijatym znakem v ACC a CY
+ JC V3_ERR
+ MOV R1,AR0
+ MOV R0,#5
+REC_ER3:CALL WTF_CHR ; Prijem checksum
+ JNB AC,REC_EN3
+ MOV R0,AR1
+ MOV R1,#uL_NAK
+ SJMP REC_EN4
+
+; Potvrzeni prikazu
+ACK_CMD:MOV R1,#uL_ACK
+ SJMP REC_EN4
+
+; Nacteni konce ramce
+; ret: ACC = CMP_END
+
+REC_END:MOV R0,#5
+REC_EN1:CALL WTF_CHR ; Prijem zakonceni ramce
+ JNB AC,REC_EN1
+REC_EN2:XRL AR1,A ; Vstup s prijatym znakem v ACC a CY
+ INC R1
+ CALL CMP_END ; Nastaveni R0 dle zpravy (0-3)
+ JC V3_ERR
+ MOV DPTR,#uL_ST ; Nastav status zpravy
+ MOV A,R0
+ MOVX @DPTR,A
+ CALL SND_SPC ; Prijem checksum
+ JB AC,REC_EN3
+ CALL SND_SPC
+ JB AC,REC_EN3
+ CALL SND_SPC
+ JB AC,REC_EN3
+ CALL SND_SPC
+ JB AC,REC_EN3
+REC_E3N:CALL SND_SPC
+ JB AC,REC_EN3
+ SJMP V3_ERR
+REC_EN3:JC V3_ERR
+ XRL A,R1
+ JB uLF_REC,REC_EN7 ; Zprava urcena pro tuto stanici
+ MOV R0,#0 ; Nastav ukonceni na END (neodpovidat)
+REC_EN7:MOV R1,#uL_NAK
+ JNZ REC_EN4 ; Pri chybe a ARQ nebo AAP vysle NAK
+ MOV R1,#uL_ACK ; Pri OK a ARQ vysle ACK
+ MOV A,R0 ; Pri OK a AAP je R1=ACK ale vysle
+ JB ACC.1,REC_EN5 ; az prooceed rutina
+REC_EN4:MOV A,R0
+ JNB ACC.0,REC_EN5
+ CLR ACC.0
+ MOV R0,A
+ SETB REN_U
+ CALL SND_SPT
+ CALL SND_SPC
+ MOV A,R1
+ CALL SND_CHR
+REC_EN5:CJNE R1,#uL_NAK,REC_EN6
+V3_ERR: JMP S_ERR
+REC_EN6:MOV A,R0
+ RET
+
+; Pocatek ramce bez urceni Destignation Address
+
+SND_BEB:MOV DPTR,#uL_CMD ; Vysilany prikaz
+ MOVX A,@DPTR
+ ANL A,#7FH
+ MOV R0,A
+ MOV A,#uL_BEG
+
+; Vyslani zacatku ramce
+; call: ACC Destignation Address
+; R0 CoMmanD
+
+SND_BEG:ANL A,#07FH
+ MOV R1,A
+ CALL SND_SPT
+ CALL SND_SPC
+ MOV A,R1
+ INC R1
+ CALL SND_CTR ; Destignation Address nebo uL_BEG
+ MOV DPTR,#uL_SA ; SA adresa
+ MOVX A,@DPTR
+ XRL AR1,A
+ INC R1
+ CALL SND_CHR
+ MOV A,R0
+ XRL AR1,A
+ INC R1
+ JMP SND_CHR
+
+
+; Nacteni zacatku ramce
+; ret: ACC Source Address
+; R0 CoMmanD
+
+REC_BEG:MOV R1,#uL_BEG ; Cekani ze SWAIT
+ MOV R0,#9
+REC_BE1:CALL WTF_CHR
+ JNB AC,REC_BE1
+REC_BE2:MOV R0,A
+ MOV DPTR,#uL_STA ; Nuluj stamp
+ CLR A
+ MOVX @DPTR,A
+REC_BET:JNC V4_ERR
+ JB uLF_NB,V3_ERR ; Cekani z PWAIT s R1=0
+ MOV A,R0
+ MOV DPTR,#uL_DA ; Uloz DA
+ MOVX @DPTR,A
+ SETB uLF_REC ; Zprava urcena pro tuto stanici
+ JZ REC_BE3 ; Vseobecna adresa
+ MOV DPTR,#uL_ADR ; Porovnej s vlastni adresou
+ MOVX A,@DPTR
+ XRL A,R0
+ JZ REC_BE3 ; Shoda adresy
+ CLR uLF_REC
+ JNB uLF_ARC,REC_BEU ; Neprijimat vsechny zpravy
+ CJNE R1,#uL_BEG,REC_BE3
+ CJNE R0,#uL_BEG,REC_BE3
+REC_BEU:CJNE R1,#uL_BEG,S_ERR
+ CJNE R0,#uL_BEG,S_EWAIT ; S_BEG a SWAIT
+ SETB uLF_REC ; Zprava urcena pro tuto stanici
+REC_BE3:MOV AR1,R0 ; **********************
+ INC R1 ; V R1 se bude pocitat chksum
+ MOV R0,#5
+REC_BE4:CALL WTF_CHR ; Prijem SA
+ JNB AC,REC_BE4
+ JC S_ERR
+ XRL AR1,A
+ INC R1
+ MOV R0,A ; R0=SA
+REC_BE5:CALL REC_CHR
+ JNB AC,REC_BE5 ; Cekani na CMD - prikaz
+ JC S_ERR
+ XRL AR1,A
+ INC R1
+ MOV DPTR,#uL_CMD
+ MOVX @DPTR,A ; Zapis CMD
+ MOV DPTR,#uL_SA
+ XCH A,R0
+ MOVX @DPTR,A ; Zapis SA
+ JMP S_POPDP
+
+; Cekani na konec bloku pri REC_BEG a SWAIT
+S_EWAIT:CALL REC_CTR
+ JNB AC,S_EWAIT
+ CALL CMP_END
+ JC S_ERR
+ MOV A,R0
+ JNB ACC.0,REC_BEG
+ MOV R0,#5
+S_EWAI1:CALL WTF_CHR
+ JNB AC,S_EWAI1
+ JNC REC_BEG
+V4_ERR: JMP S_ERR
+
+; Vrati v R0 0..S_END,1..S_ARQ,2..S_PRQ,3..S_AAP,JINAK CY
+CMP_END:JNC CMP_EN4
+CMP_EN0:MOV R0,#0
+ CJNE A,#uL_END,CMP_EN1
+ RET
+CMP_EN1:INC R0
+ CJNE A,#uL_ARQ,CMP_EN2
+ RET
+CMP_EN2:INC R0
+ CJNE A,#uL_PRQ,CMP_EN3
+ RET
+CMP_EN3:INC R0
+ CJNE A,#uL_AAP,CMP_EN4
+ RET
+CMP_EN4:SETB C
+ RET
+
+; Doslo k chybe pri prijmu nebo vysilani
+
+S_ERR: MOV SP,#SER_STACK
+ JNB uLF_SN,S_WAITD
+ MOV R0,#3 ; Pocet vyslani ERRI pri normalni chybe
+ JNB F0,S_ERR_1
+ MOV R0,#10 ; Pocet vyslani ERRI pri zavazne chybe
+S_ERR_1:MOV A,#uL_ERRI
+ CALL SND_CTR
+ DJNZ R0,S_ERR_1
+S_ERR_2:INC uL_FLG
+ MOV A,uL_FLG
+ ANL A,#3
+ JNZ S_END
+ DEC uL_FLG
+S_ERR_3:SETB uLF_ERR
+ CALL GET_OBA ; otevreni vystupni zpravy a naplneni promenych
+ CALL GET_NXT ; uL_SA,uL_DA, ...
+ MOV DPTR,#uL_ST ; priznak neplatneho doruceni zpravy
+ MOVX A,@DPTR
+ ORL A,#uLBF_FAIL
+ MOVX @DPTR,A
+ CALL GET_IBA ; otevreni vstupni zpravy
+ CALL IB_BEGR
+ JZ S_ERR_4 ; IBfull
+ CALL IB_ENDR ; zapis zpravy o nulove delce s prametry uL_SA, ...
+S_ERR_4:SETB uLF_INE ; zprava ve vstupni fronte
+ MOV R0,#0FFH
+ SJMP S_ENDTE
+
+; Rutina maze posledni zpravu
+
+S_ENDT: MOV R0,#0
+S_ENDTE:MOV SP,#SER_STACK
+ ANL uL_FLG,#0FCH
+%IF (%NEG_DR_EO) THEN (
+ CLR DR_EO
+)ELSE(
+ SETB DR_EO
+)FI
+ CALL GET_OBA
+S_ENDT1:CALL GET_NXT
+ JNB ACC.7,S_ENDT3 ; Neexistuje
+ CALL SET_NXT
+ %IF(%WITH_TAILS)THEN(
+ JC S_ENDT1 ; Preskocit na konec tailovane skupiny
+ )FI
+ CALL GET_NXT
+ JB ACC.7,S_END ; Je dalsi zprava
+S_ENDT3:CLR uLF_RS ; Neni dalsi zprava
+
+; Konec vysilani nebo prijmu
+
+S_END: MOV SP,#SER_STACK
+ JNB uLF_SN,S_WAITD
+ JB uLF_NB,S_WAITD
+ CALL SND_SPT
+ JB AC,S_WAITD
+ CALL SND_SPC
+ JB AC,S_WAITD
+ CALL G_MADR
+ ORL A,#80H
+ CALL SND_CTR
+ SETB uLF_NB
+
+; Cekani na komunikaci
+
+S_WAITD:MOV SP,#SER_STACK
+ CLR TI_U
+ SETB F0
+ SETB REN_U
+ SETB TXD_U
+
+; Cekani na vlastni adresu nebo pozadavek k vysilani
+
+S_WAIT: CLR uLF_SN
+ JNB uLF_NB,S_WAIT1 ; Nelze vysilat
+ JNB uLF_RS,S_WAIT1 ; Neni potreba vysilat
+
+ SETB uLF_SN
+ CALL G_MADR
+ MOV R0,A ; Vlastni adresa
+ SETB C
+ SUBB A,R1 ; - Posledni vysilajici
+ ANL A,#00FH ; Token pasing delay
+ ADD A,#4 ; min 4
+ JNB F0,S_CONN1
+ ADD A,#010H ; Prodlouzit - byla chyba
+S_CONN1:MOV R1,A
+S_CONN2:CALL SND_SPC ; Cekani token pasing delay
+ JB AC,S_WAIT2
+ DJNZ R1,S_CONN2
+ CALL S_ARB ; Arbitrace pristupu
+ JB F0,S_WAIT1
+SND_OB: CALL GET_OBA ; R23 R4 R5 do OB
+ %IF(%WITH_TAILS)THEN(
+ CLR uLF_TPF
+ )FI
+SND_OB0:CALL GET_NXT ; R67 pristi zprava
+ JB ACC.7,SND_OBV ; Neexistuje
+ JMP S_ENDT
+SND_OBV:JMP SND_OB1 ; Vysli blok
+
+S_WAIT1:MOV C,uLF_NB
+ CPL C
+ CALL REC_CH1 ; Ceka se na znak
+S_WAIT2:CLR uLF_SN
+ JNB AC,S_WAITD ; Vybuzovaci TI_U
+ MOV R1,A
+ JNC S_WAITD ; Neni ridici
+ JB ACC.7,S_WAIT ; Ukonceni vysilani
+ MOV R1,#0
+ CALL REC_BE2 ; Cekani na prikaz v R0
+ SJMP REC_CM1
+
+REC_CMD:CALL REC_BEG ; Cekani na prikaz v R0
+REC_CM1:MOV A,R0
+ JB ACC.7,REC_CM2
+ CALL GET_IBA ; Prijem do IB
+ CALL IB_BEGR
+ JZ REC_CMEV
+ CALL REC_Bx
+ JNC REC_CMEV
+ CALL REC_EN2
+ MOV R1,A
+ CALL IB_ENDR ; Prepisuje vse krome R1
+ MOV A,R1 ; v R0 vraci CMD
+ SETB uLF_INE
+ JB ACC.1,REC_CM3 ; PRQ nebo AAP
+%IF (%VECTOR_FL) THEN (
+ MOV A,#8 ; Priznak IB do R0.3
+REC_CM3:XCH A,R0
+ JMP REC_CM8 ; Pro skok na uzivatelsky vektor
+)ELSE(
+ XCH A,R0
+; CALL uL_R_BU ; Pro zpracovani zprav aplikaci
+
+)FI
+V1_WAIT:JMP S_WAITD
+
+%IF (NOT %VECTOR_FL) THEN (
+REC_CM3:XCH A,R0
+ JMP REC_CM8
+)FI
+
+REC_CMEV:JMP REC_CME
+
+REC_CM2:CALL GET_PRB ; Prijem do PROC_BUF
+ JZ REC_CMEV
+ CALL REC_Bx
+ JNC REC_CMEV
+ CALL REC_EN2
+%IF (NOT %VECTOR_FL)THEN(
+ JNB ACC.1,V1_WAIT
+)FI
+ MOV A,R2
+ MOV R6,A
+ MOV A,R3
+ MOV R7,A
+ CALL GET_PR1
+REC_CM7:CALL G_CMD
+REC_CM8: ; Prikaz v ACC, zakonceni v R0
+%IF (%VECTOR_FL)THEN(
+; JMP V_uL_ADD ; Moznost rozsirit funkce uzivatelem
+
+uL_EADD:XCH A,R0
+ JB ACC.3,V1_WAIT
+ JNB ACC.1,V1_WAIT
+ XCH A,R0
+)ELSE( ; Pro zpracovani prikazu aplikaci
+; CALL uL_R_CO
+)FI ; Pocatek provadeni internich prikazu
+
+ CJNE A,#uL_SID,PR_CM20
+; Vysle svoji identifikaci
+ CALL ACK_CMD
+ CALL SND_BEB
+ MOV R2,#LOW uL_IDB; ; Vysle svoji identifikaci
+ MOV R3,#HIGH uL_IDB
+ MOV R6,#LOW uL_IDE
+ MOV R7,#HIGH uL_IDE
+PR_CM12:MOV R5,AR4
+ CALL SND_Bc ; SND_Bx
+PR_CM19:CALL SND_END ; Vysli zakonceni uL_END
+ SJMP V1_WAIT
+
+; Test volne pameti
+PR_CM20:CJNE A,#uL_SFT,PR_CM30
+ MOV A,R0
+ JNB ACC.0,V1_WAIT
+ CALL GET_IBA
+ CALL LEN_DAT
+ MOV AR4,R0
+ CALL GET_PRB
+ CALL S_R0FB
+ MOV A,R4
+ CLR C
+ SUBB A,#6
+ JNC PR_CM22
+ INC R1
+PR_CM22:CLR C
+ SUBB A,R0
+ PUSH PSW
+ CALL SND_SPC
+ CALL S_R0FB
+ POP PSW
+ MOV A,R1
+ SUBB A,R0
+ MOV A,#uL_NAK
+ JC PR_CM24
+ MOV A,#uL_ACK
+PR_CM24:CALL SND_CHR
+ JMP S_WAITD
+
+; Krokovani pocatek
+PR_CM30:CJNE A,#uL_TF0,PR_CM32
+ CLR uLF_TRP ; Ukonci krokovani
+PR_CM31:CALL ACK_CMD
+ JMP S_WAITD
+PR_CM32:CJNE A,#uL_TF1,PR_CM33
+ SETB uLF_TRP ; Zacne krokovani
+ SJMP PR_CM31
+PR_CM33:CJNE A,#uL_STP,PR_CM36
+ SETB TI_U ; Provede jednu instrukci
+ CALL S_RETI
+ CLR TI_U
+ CLR A
+ SJMP PR_CM31
+PR_CM36:CJNE A,#uL_SPC,PR_CM40
+ CALL ACK_CMD
+ CALL SND_BEB
+ MOV A,SER_STACK ; Vysle PCL PCH PSW ACC
+ INC A
+ MOV R6,A
+ ADD A,#-6
+ MOV R2,A
+ CALL SND_Bi
+ JMP PR_CM19
+
+PR_CM40:CJNE A,#uL_RDM,PR_CM50
+; Vyslani pameti
+ CALL ACK_CMD
+ CALL SND_BEB
+ CALL S_PRPMM
+ CJNE R4,#1,S_RDM1
+ CALL SND_Bi
+S_RDM1: CJNE R4,#2,S_RDM2
+ CALL SND_Bx
+S_RDM2: CJNE R4,#4,S_RDM3
+ CALL SND_Bs
+S_RDM3: CJNE R4,#5,S_RDM4
+ CALL SND_Bc
+S_RDM4: JMP PR_CM19
+
+PR_CM50:CJNE A,#uL_WRM,PR_CM60
+; Prijem do pameti
+ CALL ACK_CMD
+ CALL REC_BEG
+ CJNE R0,#uL_WRM AND 7FH,REC_CMEV1
+S_WRM0: CALL S_PRPMM
+ MOV A,#1
+ CJNE R4,#1,S_WRM1
+ CALL REC_Bi
+S_WRM1: CJNE R4,#2,S_WRM2
+ CALL REC_Bx
+S_WRM2: CJNE R4,#4,S_WRM3
+ CALL REC_Bs
+S_WRM3: CJNE R4,#5,S_WRM4 ; zapis do code 89c51rd2?
+ CALL REC_Bc
+ JNZ REC_CME
+ CALL REC_END
+%IF(%TGT_T89C51RD2)THEN(
+S_WRM31:
+ MOV A,FCON ; cekej na dozapsani
+ ANL A,#01H
+ JNZ S_WRM31
+ MOV FCON,#050H ; zapisovaci sequence
+ MOV FCON,#0A0H ; zapisovaci sequence
+)FI
+ JMP S_WAITD
+S_WRM4: JNZ REC_CME
+ CALL REC_END
+ JMP S_WAITD
+REC_CMEV1:JMP REC_CME
+
+PR_CM60:CJNE A,#uL_ERM,PR_CM70
+; mazani pameti
+ CALL ACK_CMD
+ CALL S_PRPMM
+ CJNE R4,#5,S_ERM3
+%IF(%TGT_MSC1210) THEN (
+ MOV MSECL,#R_MSECL
+ MOV MSECH,#R_MSECH
+ CLR EA
+S_ERM1: CLR C
+ MOV A,R2
+ SUBB A,R6
+ MOV A,R3
+ SUBB A,R7
+ JNC S_ERM2 ; R23>=R67
+ MOV A,#0FFH ; value to write
+ ORL FMCON,#040h
+ CALL S_ACCTBF
+ ANL FMCON,#0BFh
+ MOV A,#127 ; R23+128, page length is 128
+ ADD A,R2 ; a increment is made in S_ACCTB
+ MOV R2,A
+ JNC S_ERM1
+ INC R3
+ JMP S_ERM1
+S_ERM2: SETB EA
+)FI
+S_ERM3:
+ JMP S_WAITD
+
+PR_CM70:CJNE A,#uL_DEB,PR_CM80
+
+; Ladici prikazy
+S_DEB: CALL S_EQP
+ JZ NAK_CMD
+ CALL ACK_CMD
+ MOV DPTR,#PROC_BUF
+ MOVX A,@DPTR
+ INC DPTR
+ CJNE A,#10H,S_DEB98
+ INC DPTR ; Prikaz GO xxxx
+ INC DPTR
+ MOV A,SER_STACK ; Zapise PCL PCH
+ ADD A,#-5
+ MOV R1,A
+ MOVX A,@DPTR
+ MOV @R1,A
+ INC DPTR
+ INC R1
+ MOVX A,@DPTR
+ MOV @R1,A
+ %IF(%TGT_T89C51RD2)THEN(
+ MOV DPTR,#uL_ADR ; zalohuj s vlastni adresou pro presmerovani
+ MOVX A,@DPTR ; na bootloader
+ MOV SADDR,A
+ )FI
+S_DEB98:JMP S_WAITD
+
+PR_CM80:
+%IF (%DY_ADDR)THEN(
+ CJNE A,#uL_GST,NAK_CMD
+ JMP UD_SNST ; Cteni statusu a podpora dynamicke adresace
+)FI
+
+NAK_CMD:MOV R1,#uL_NAK
+ JMP REC_EN4
+
+WAK_CMD:MOV R1,#uL_WAK
+ JMP REC_EN4
+
+REC_CME:CALL REC_ERR
+ JMP REC_CMD
+
+SND_OB1:CJNE R1,#0,SND_OB2
+ CALL SND_BEG
+ SJMP SND_OB3
+SND_OB2:CALL SND_BEG
+ CALL SND_Bx
+SND_OB3:CALL SND_ENDST ; Vysli zakonceni podle uL_ST
+ MOV DPTR,#uL_DA ; oprav adresu DA
+ MOVX A,@DPTR
+ ANL A,#07FH
+ MOVX @DPTR,A
+ MOV DPTR,#uL_ST ; Status zpravy z predchoziho GET_NXT
+ MOVX A,@DPTR
+ ORL A,#uLBF_PROC ; nastavit priznak doruceni zpravy
+ MOVX @DPTR,A
+ %IF(%WITH_TAILS)THEN(
+ ;MOV C,ACC.uLBF_TAILb
+ MOV C,ACC.5 ; !!!! ASX8051 is broken
+ MOV uLF_TMP,C
+ JB uLF_TPF,SND_OB5
+ JC SND_OB4
+ )FI
+ CALL GET_IBA ; otevreni vstupni zpravy
+ CALL IB_BEGR
+ JZ SND_OBE ; IBfull
+ CALL IB_ENDR ; zapis zpravy o nulove delce s vysilanymi parametry
+SND_OBE:SETB uLF_INE ; zprava ve vstupni fronte
+ JMP S_ENDT
+
+%IF(%WITH_TAILS)THEN(
+SND_OB4:MOV DPTR,#P_NDB
+ MOVX A,@DPTR
+ MOV R0,A
+ INC DPTR
+ MOVX A,@DPTR
+ XCH A,R0
+ MOV DPTR,#P_TI
+ MOVX @DPTR,A
+ INC DPTR
+ MOV A,R0
+ MOVX @DPTR,A
+SND_OB5:SETB REN_U
+ %IF (%NEG_DR_EO) THEN (
+ CLR DR_EO ; Prepnout na prijem
+ )ELSE(
+ SETB DR_EO ; Prepnout na prijem
+ )FI
+ MOV DPTR,#P_TO
+ MOV A,R2
+ MOVX @DPTR,A ; Zapamatovat si pozici v OB
+ INC DPTR
+ MOV A,R3
+ MOVX @DPTR,A
+ CALL GET_IBA ; otevreni vstupni zpravy
+ MOV DPTR,#P_TI
+ MOVX A,@DPTR
+ MOV R2,A
+ INC DPTR
+ MOVX A,@DPTR
+ MOV R3,A
+ CALL IB_BEGR
+ JZ SND_OBF
+ MOV C,uLF_TPF
+ CALL IB_ENDRT ; zapis zpravy o nulove delce s vysilanymi parametry
+SND_OBF:SETB uLF_TPF
+SND_OB6:JB uLF_TMP,SND_OB7
+
+ MOV DPTR,#P_TI
+ MOVX A,@DPTR
+ MOV R2,A
+ INC DPTR
+ MOVX A,@DPTR
+ MOV R3,A
+ MOV DPTR,#P_NDB
+ MOVX A,@DPTR
+ XCH A,R2
+ MOVX @DPTR,A
+ INC DPTR
+ MOVX A,@DPTR
+ XCH A,R3
+ MOVX @DPTR,A
+ MOV DPL,R2
+ MOV DPH,R3
+ MOVX A,@DPTR
+ ORL A,#80H ; Onacit platnost vstupnich dat
+ MOVX @DPTR,A
+ SETB uLF_INE ; zprava ve vstupni fronte
+ JMP S_ENDT
+
+SND_OB7:
+ MOV DPTR,#P_TO
+ MOVX A,@DPTR
+ MOV R2,A
+ INC DPTR
+ MOVX A,@DPTR
+ MOV R3,A
+ MOV DPTR,#H_BOB
+ MOVX A,@DPTR
+ MOV R4,A
+ INC DPTR
+ MOVX A,@DPTR
+ MOV R5,A
+
+ CALL GET_NXT ; Dalsi ramec, AC=uLBF_RECb
+ JNB ACC.7,V5_ERR
+ JB AC,REC_TA1
+ JMP SND_OB1
+
+REC_TA1:MOV uLF_TMP,C ; Pokracuje dalsim ramcem
+ MOV DPTR,#P_TO
+ MOV A,R6
+ MOVX @DPTR,A ; Zapamatovat si pozici v OB
+ INC DPTR
+ MOV A,R7
+ MOVX @DPTR,A
+
+ MOV R1,#uL_BEG ; Cekani ze SWAIT
+ MOV R0,#9
+REC_TA3:CALL WTF_CHR
+ JNB AC,REC_TA3
+ MOV R0,A
+ CALL REC_BET ; prijem tailu
+ CALL GET_IBA ; Prijem do IB
+ MOV DPTR,#P_TI
+ MOVX A,@DPTR
+ MOV R2,A
+ INC DPTR
+ MOVX A,@DPTR
+ MOV R3,A
+ CALL IB_BEGR
+ JZ REC_TAER
+ CALL REC_Bx
+ JNC REC_TAER
+ CALL REC_EN2
+ MOV DPTR,#uL_ST ; priznak doruceni zpravy
+ MOV A,#(uLBF_REC OR uLBF_PROC)
+ MOV C,uLF_TMP
+ ;MOV ACC.uLBF_TAILb,C
+ MOV ACC.5,C ; !!!! ASX8051 is broken
+ MOVX @DPTR,A
+ SETB C
+ CALL IB_ENDRT ; Prepisuje vse krome R1
+ JMP SND_OB6
+
+REC_TAER:CALL REC_ERR
+V5_ERR: JMP S_ERR
+)FI
+
+
+; Priprava pro cteni a zapis pameti
+
+S_PRPMM:MOV DPTR,#PROC_BUF
+ MOV R0,#AR2
+S_PRPM1:MOVX A,@DPTR
+ MOV @R0,A
+ INC R0
+ INC DPTR
+ CJNE R0,#AR7+1,S_PRPM1
+ MOV A,R4
+ XCH A,R2
+ MOV R4,A
+ MOV A,R5
+ XCH A,R3
+ MOV R0,A
+ CJNE R4,#9,S_PRPM2
+ MOV A,#SER_STACK
+ SJMP S_PRPM4
+S_PRPM2:CJNE R4,#8,S_PRPM3
+ MOV A,SER_STACK
+ INC A
+ SJMP S_PRPM4
+S_PRPM3:CJNE R4,#7,S_PRPM5
+ MOV R0,SER_STACK
+ DEC R0
+ MOV A,@R0
+ ANL A,#18H
+S_PRPM4:ADD A,R2
+ MOV R2,A
+ MOV R4,#1
+S_PRPM5:MOV AR5,R4
+
+; Pricte k R67 R23
+
+AR67R23:MOV A,R6
+ ADD A,R2
+ MOV R6,A
+ MOV A,R7
+ ADDC A,R3
+ MOV R7,A
+ CLR C
+ SUBB A,R5
+ JC AR67R6R
+ ADD A,R4
+ MOV R7,A
+AR67R6R:RET
+
+; Priprav IB pro prijem dat
+
+IB_BEGR:MOV R0,#7
+IB_BEG1:CLR A
+ CALL S_ACCTB
+ JZ IB_BEGG
+ DJNZ R0,IB_BEG1
+IB_BEGG:RET
+
+; Zakonceni prijmu do IB
+; call: [R23] konec dat
+; uL_SA adresa vysilace
+; uL_DA adresa prijemce
+; Nastavi P_NDB a ukazatel na dalsi blok
+; ret: [R23] zacatek dat
+; [R67] za konec dat
+; R0 prikaz CMD
+; nesmi mazat R1
+
+IB_ENDR:SETB C ; Zprava ma byt oznacena za platnou
+ MOV DPL,R2 ; Oznacit za prazdny
+ MOV DPH,R3 ; blok za prijatou zpravou
+ CLR A
+ MOVX @DPTR,A
+ MOV DPTR,#P_NDB
+IB_END1:MOVX A,@DPTR ; Posunout ukazatel na pristi
+ XCH A,R2 ; prijimany blok za zpravu
+ MOV R6,A
+ MOVX @DPTR,A
+ INC DPTR
+ MOVX A,@DPTR
+ XCH A,R3 ; R23 na zacatek bloku
+ MOV R7,A ; R67 za konec bloku
+ MOVX @DPTR,A
+ MOV DPTR,#uL_SA
+ MOVX A,@DPTR
+ MOV ACC.7,C ; Ulozit SA or 80H a tim
+ CALL S_ACCTB ; oznacit zpravu za platnou
+ MOV DPTR,#uL_DA
+ MOVX A,@DPTR
+ CALL S_ACCTB ; Ulozit DA
+ MOV A,R6
+ CALL S_ACCTB ; Ulozit ukazatel za zpravu
+ MOV A,R7 ; na pristi blok
+ CALL S_ACCTB
+ MOV DPTR,#uL_CMD
+ MOVX A,@DPTR
+ CALL S_ACCTB ; Ulozit CMD zpravy
+ MOV DPTR,#uL_ST
+ MOVX A,@DPTR
+ CALL S_ACCTB ; Ulozit status zpravy
+ MOV DPTR,#uL_STA
+ MOVX A,@DPTR
+ CALL S_ACCTB ; Ulozit stamp zpravy
+ RET
+%IF(%WITH_TAILS)THEN(
+; Verze IB_ENDR pro tailovani pracuje proti P_TI
+; vstup CY informuje o stavu oznaceni zpravy za dokoncenou
+IB_ENDRT:
+ MOV DPL,R2 ; Oznacit za prazdny
+ MOV DPH,R3 ; blok za prijatou zpravou
+ CLR A
+ MOVX @DPTR,A
+ MOV DPTR,#P_TI
+ SJMP IB_END1
+)FI
+
+; Naplni registry pointry do PROC_BUF
+GET_PRB:MOV R6,#LOW PROC_BUFE ; Prijem do PROC_BUF
+ MOV R7,#HIGH PROC_BUFE
+GET_PR1:MOV R2,#LOW PROC_BUF
+ MOV R3,#HIGH PROC_BUF
+ MOV AR5,R4
+ RET
+
+; R67 naplni ukazately na pristi blok
+; uL_DA,uL_SA,uL_ST,uL_CMD
+; ret: ACC .. DA
+; R0 .. command
+; R1 .. 0 pri nulove delce dat
+; CY=1 .. zprava s tailem
+; AC=1 .. zprava typu REC
+
+GET_NXT:CALL S_R0FB ; DAdr
+ MOV A,R0
+ CLR C
+ JNB ACC.7,GET_NX4
+ MOV DPTR,#uL_DA
+ MOVX @DPTR,A
+ CALL S_R0FB ; SAdr
+ MOV A,R0
+ MOV DPTR,#uL_SA
+ MOVX @DPTR,A
+ CALL S_R0FB ; Nacist ukazatel za zpravu
+ MOV A,R0
+ MOV R6,A
+ CALL S_R0FB
+ MOV A,R0
+ MOV R7,A
+ CALL S_R0FB ; CMD
+ MOV A,R0
+ MOV R1,A
+ MOV DPTR,#uL_CMD
+ MOVX @DPTR,A
+ CALL S_R0FB ; ST
+ MOV A,R0
+ MOV DPTR,#uL_ST
+ MOVX @DPTR,A
+ ;MOV C,ACC.uLBF_RECb
+ MOV C,ACC.4 ; !!!! ASX8051 is broken
+ MOV AC,C
+ ;MOV C,ACC.uLBF_TAILb
+ MOV C,ACC.5 ; !!!! ASX8051 is broken
+ PUSH PSW ; Nemelo by byt potreba
+ CALL S_R0FB ; ACC - 0 pri nulove delce dat
+ XCH A,R1 ; presun do R1, CMD do A
+ XCH A,R0 ; CMD konecne do R0
+ MOV DPTR,#uL_STA ; Stamp
+ MOVX @DPTR,A
+ MOV DPTR,#uL_DA ; DAdr
+ MOVX A,@DPTR
+ POP PSW ; Nemelo by byt potreba
+GET_NX4:RET
+
+; Posune ukazatel za aktualni vystupni zpravu
+; Nesmi menit R0, R1, CY
+SET_NXT:MOV DPTR,#P_AOB
+ MOV A,R6
+ MOV R2,A
+ MOVX @DPTR,A
+ INC DPTR
+ MOV A,R7
+ MOV R3,A
+ MOVX @DPTR,A
+ SJMP S_POPDP
+
+; Naplni registry pointry do OB
+
+GET_OBA:MOV DPTR,#P_AOB
+ JMP GET_BA1
+
+; Naplni registry pointry do IB
+
+GET_IBA:MOV DPTR,#P_NDB
+GET_BA1:MOV R0,#AR2
+GET_BA2:MOVX A,@DPTR
+ INC DPTR
+ MOV @R0,A
+ INC R0
+ CJNE R0,#AR7+1,GET_BA2
+ SJMP S_POPDP
+
+; Nacte prikaz CMD
+G_CMD: MOV DPTR,#uL_CMD ; Prikaz
+ SJMP G_MADR2
+
+; Nacte SA
+G_SA: MOV DPTR,#uL_SA ; Vlastni SA
+ SJMP G_MADR2
+
+; Nacte vlastni adresu
+G_MADR: MOV DPTR,#uL_ADR ; Vlastni adresa
+G_MADR2:MOVX A,@DPTR
+S_POPDP:RET
+
+; Pripojeni mastera ke sbernici
+; vstup vlastni adresy v R0
+
+S_ARB: MOV R1,#3+1 ; 3x2 bitu arbitrace
+ CLR uLF_NB
+S_ARB1:
+%IF (%NEG_DR_EO) THEN (
+ CLR DR_EO
+)ELSE(
+ SETB DR_EO
+)FI
+ JNB RXD_U,S_ARBE
+ JB AC,S_ARBE
+ CLR TXD_U
+ CALL SND_CH1
+ SETB TXD_U
+%IF (%NEG_DR_EO) THEN (
+ CLR DR_EO
+)ELSE(
+ SETB DR_EO
+)FI
+S_ARB2: CALL SND_CH2
+ JB AC,S_ARB2
+ MOV A,R0 ; Rotace adresy
+ RR A
+ RR A
+ XCH A,R0
+ ANL A,#3 ; Nejnizsi 2 bity
+ INC A
+ MOV R2,A ; Pocet cekani
+ DJNZ R1,S_ARB4
+ RET
+S_ARB3: JB AC,S_ARBE
+ CALL SND_SPC
+S_ARB4: DJNZ R2,S_ARB3
+ SJMP S_ARB1
+
+S_ARBE: SETB F0
+ RET
+
+
+LEN_DAT:CLR C ; Delka dat = R67-R23
+ MOV A,R6 ; Kdyz je vetsi nez 127 bytu
+ SUBB A,R2 ; A = 80h+Delka/256
+ MOV R0,A ; Jinak A = Delka
+ MOV A,R7
+ SUBB A,R3
+ JNC LEN_DA1
+ CLR C
+ SUBB A,R4
+ ADD A,R5
+LEN_DA1:MOV R1,A
+ JNZ LEN_DA2
+ MOV A,R0
+ JNB ACC.7,LEN_DA3
+ CLR A
+LEN_DA2:ORL A,#080H
+LEN_DA3:RET
+
+S_CHKSA:XCH A,R1 ; Check sum
+ XRL A,R1
+ INC A
+ XCH A,R1
+ RET
+
+%IF (NOT %CX_MERGED_FL) THEN (
+S_SNFC: MOV DPH,R3 ; Vyslani znaku z CODE
+ MOV DPL,R2
+ CLR A
+ MOVC A,@A+DPTR
+ SJMP S_SNFB1
+)FI
+
+S_SNFB: MOV DPH,R3 ; Vyslani znaku z bufferu
+ MOV DPL,R2
+ MOVX A,@DPTR
+S_SNFB1:MOV SBUF_U,A
+ XCH A,R1 ; Check sum
+ XRL A,R1
+ INC A
+ XCH A,R1
+ SJMP S_ACCT1
+
+S_R0FB: MOV DPH,R3 ; Naplneni R0 z bufferu
+ MOV DPL,R2
+ MOVX A,@DPTR
+ MOV R0,A
+ SJMP S_ACCT1
+
+S_RCTB: MOV A,SBUF_U ; Prijem znaku do bufferu
+S_RCTB1:XCH A,R1 ; Check sum
+ XRL A,R1
+ INC A
+ XCH A,R1
+S_ACCTB:MOV DPH,R3
+ MOV DPL,R2
+ MOVX @DPTR,A
+S_ACCT1:
+S_INCP: INC R2 ; Pripraveni nasledujici adresy
+ MOV A,R2
+ JNZ S_INCP1
+ INC R3
+S_INCP1:MOV A,R5
+ XRL A,R3
+ JNZ S_EQP
+ MOV A,R4
+ MOV R3,A
+S_EQP: MOV A,R2 ; Kontrola prostoru pro data
+ XRL A,R6 ; ACC=0 => konec dat nebo preteceni IB
+ JNZ S_EQP1
+ MOV A,R3
+ XRL A,R7
+S_EQP1: RET
+
+%IF(%TGT_MSC1210) THEN (
+S_RCTBF:XCH A,R1 ; Check sum
+ XRL A,R1
+ INC A
+ XCH A,R1
+S_ACCTBF:MOV DPH,R3
MOV DPL,R2
MOV USEC,#R_USEC
- MOV C,EAI\r
+ MOV C,EAI
CLR EAI
- MOV MWS,#01h ; zapisuj do flash\r
+ MOV MWS,#01h ; zapisuj do flash
CALL MSC_WRITE_FLASH
- MOV MWS,#00h ; konec zapisu\r
- MOV EAI,C\r
- JMP S_ACCT1\r
-)FI\r
-\r\r
-\r
-%IF (%DY_ADDR)THEN(\r
-; *************************************\r
-; Rutina vysilani statusu CMD=0C1H\r
-UD_SNST:MOV A,R0\r
- MOV C,ACC.0\r
- MOV F0,C\r
- CALL S_EQP\r
- JZ SNSTA04\r
- CALL S_R0FB\r
- MOV A,R0\r
- ANL A,#0FCH ; Funkce 0-3, start of cycle \r
- JNZ SNSTA10\r
- JB uLD_RQA,SNSTA04 ; Snaha o zviditelneni\r
- INC uL_FLD\r
- JNB uLD_RQA,SNSTA04\r
-SNSTA02:; ORL uL_FLD,#7\r
- MOV DPTR,#uL_SA\r
- MOVX A,@DPTR\r
- MOV DPTR,#UD_DYSA ; Server dynamickych adres\r
- MOVX @DPTR,A\r
- MOV A,R0\r
- JNZ SNSTA03 ; Nastavi vlastni adresu\r
- MOV DPTR,#uL_ADR ; na nulu pri spatnem SN\r
- MOVX @DPTR,A ; v dotazu nebo funkci 0\r
-SNSTA03:\r
-SNSTA04:JMP SNSTAR\r
-\r
-SNSTA10:ANL A,#0F0H\r
- CJNE A,#010H,SNSTA04\r
- MOV A,R0 ; Prikaz cteni udaju\r
- MOV DPTR,#UD_SFN\r
- MOVX @DPTR,A\r
- MOV DPTR,#SER_NUM ; Kontrola serioveho cisla\r
- MOV R1,#4\r
-SNSTA11:CALL S_EQP\r
- JZ SNSTA12\r
- CALL S_R0FB\r
- MOVX A,@DPTR\r
- XRL A,R0\r
- JNZ SNSTA12\r
- INC DPTR\r
- DJNZ R1,SNSTA11\r
-SNSTA12:MOV R0,#0\r
- JNZ SNSTA02 ; Nesouhlasi cislo\r
-SNSTA13:MOV C,F0\r
- MOV ACC.0,C\r
- MOV R0,A\r
- CALL ACK_CMD\r
- ANL uL_FLD,#NOT 7\r
-SNSTA20:CALL SND_BEB\r
- MOV R2,#LOW SER_NUM; ; Vysle SER_NUM\r
- MOV R3,#HIGH SER_NUM\r
- MOV R6,#LOW (SER_NUM+4)\r
- MOV R7,#HIGH (SER_NUM+4)\r
- MOV R5,AR4\r
- CALL SND_Bx \r
- JB uLD_SCIP,SNSTA50\r
- SETB uLD_SSIP\r
- MOV DPTR,#UD_STAD ; ukazatel na buffer stavu\r
- MOVX A,@DPTR ; do R23 a delka do R6\r
- MOV R2,A\r
- INC DPTR\r
- MOVX A,@DPTR\r
- MOV R3,A\r
- INC DPTR\r
- MOVX A,@DPTR\r
- MOV R6,A\r
- MOV DPTR,#UD_SFN ; stavova subfunkce\r
- MOVX A,@DPTR\r
- CJNE A,#010H,SNSTA30\r
- MOV A,R4 ; Vyslani zakladnich udaju\r
- MOV R5,A ; no buff wrap\r
- MOV A,R6\r
- JZ SNSTA50\r
- CJNE A,#2,SNSTA28\r
-SNSTA27:CALL S_R0FB ; vysle 2 byte z UD_STAD\r
- MOV A,R0\r
- MOV R6,A\r
- CALL S_R0FB\r
- MOV A,R6\r
- CALL SND_CHC ; mod\r
- MOV A,R0\r
- CALL SND_CHC ; chyby\r
- SJMP SNSTA50\r
-SNSTA28:ADD A,R2\r
- MOV R6,A\r
- CLR A ; vysle UD_STLN byte z UD_STAD\r
- ADDC A,R3\r
- MOV R7,A\r
- CALL SND_Bx\r
- SJMP SNSTA50\r
-SNSTA30:CJNE A,#011H,SNSTA50\r
- ; Vyslani servisnich udaju\r
-\r
-SNSTA50:CALL SND_END\r
- CLR uLD_SSIP\r
-SNSTAR: JMP S_WAITD\r
-; JMP NAK_CMD\r
-)FI\r
-\r
-VS_FNC1:JMP S_FNC1\r
-; *************************************\r
-; Inicializace a sluzby RS-485\r
-; *************************************\r
-_uL_FNCC:XCH A,R7 ; V R7 je cislo funkce\r
- MOV R0,A\r
- XCH A,R7 ; ACC nazpet\r
- SJMP uL_FNC\r
-uL_INIT:MOV R0,#0\r
- MOV R2,#0\r
-uL_FNC: CJNE R0,#0,VS_FNC1\r
-S_FN0: CLR ES_U ; Po nastaveni ryclosti a adresy se\r
- CLR ET1 ; touto funkci spusti RS485\r
-%IF (%NEG_DR_EO) THEN (\r
- CLR DR_EO\r
-)ELSE(\r
- SETB DR_EO\r
-)FI\r
-; CLR DR_EI\r
- CLR PT1\r
- ANL TMOD,#00FH\r
- ORL TMOD,#020H\r
- SETB TR1\r
- MOV DPTR,#uL_SPD\r
- MOVX A,@DPTR\r
- JNZ S_FN0_0\r
- CALL S_FN1_0\r
-S_FN0_0:MOV TH1,A\r
-S_FN6_0:MOV SCON_U,#11010000B\r
- ORL PCON_U,#10000000B ; Bd = OSC/12/16/(256-TH1)\r
- SETB PS\r
- CLR A ; Vstupni bod pro uzivatelsky baud gen\r
- MOV DPTR,#uL_CMD\r
- MOV R1,#PROC_BUFE-uL_CMD\r
-S_FN0_1:MOVX @DPTR,A\r
- INC DPTR\r
- DJNZ R1,S_FN0_1\r
- MOV A,R2 ; Zazalohovani autoinicializace\r
- PUSH ACC\r
- MOV DPTR,#uL_HBIB\r
- MOV R1,#3\r
- CALL LDRFDP\r
- POP ACC\r
- JNZ S_FN0_2 ; Autoinicializace ? \r
- CALL S_FN3_0\r
- MOV A,R2\r
-S_FN0_2:MOV DPTR,#P_NDB+1\r
- MOVX @DPTR,A ; P_NDB=BEG_IB\r
- INC DPTR\r
- MOVX @DPTR,A ; H_BIB=BEG_IB\r
- MOV DPTR,#P_NPD+1\r
- MOVX @DPTR,A ; P_NPD=BEG_IB\r
- INC DPTR\r
- INC DPTR\r
- MOVX @DPTR,A ; P_AID=BEG_IB\r
- MOV DPH,A\r
- CLR A\r
- MOV DPL,A\r
- MOVX @DPTR,A\r
- MOV DPTR,#H_EIB\r
- MOV A,R2\r
- ADD A,R3\r
- MOVX @DPTR,A ; H_EIB=END_IB\r
- MOV DPTR,#P_AOB+1\r
- MOVX @DPTR,A ; P_AOB=BEG_OB\r
- INC DPTR\r
- MOVX @DPTR,A ; H_BOB=BEG_OB\r
- MOV DPTR,#P_NOB+1\r
- MOVX @DPTR,A ; P_NOB=BEG_OB\r
- INC DPTR\r
- INC DPTR\r
- MOVX @DPTR,A ; P_AOD=BEG_OB\r
- MOV DPH,A\r
- CLR A\r
- MOV DPL,A\r
- MOVX @DPTR,A\r
- MOV A,R2\r
- ADD A,R3\r
- ADD A,R4\r
- MOV DPTR,#H_EOB ; H_EOB=END_OB\r
- MOVX @DPTR,A\r
- MOV A,R2\r
- MOV DPTR,#P_EID+1\r
- MOVX @DPTR,A ; P_EID=BEG_IB\r
- MOV DPTR,#uL_FRLN\r
- MOV A,#LOW S_FRLN\r
- MOVX @DPTR,A\r
- INC DPTR\r
- MOV A,#HIGH S_FRLN\r
- MOVX @DPTR,A\r
- %IF(%WITH_TAILS)THEN(\r
- CLR uLF_OWT\r
- )FI\r
-S_FN0_6:CLR A ; Spusteni uLan communication\r
- MOV SER_STACK,A\r
- MOV uL_FLG,A\r
- MOV uL_FLH,A\r
-%IF (%VECTOR_FL)THEN(\r
- MOV R4,#SINT_U\r
- MOV DPTR,#S_INT\r
- CALL VEC_SET\r
- MOV R4,#V_uL_FNC\r
- MOV DPTR,#uL_FNC\r
- CALL VEC_SET\r
- MOV R4,#V_uL_ADD\r
- MOV DPTR,#uL_EADD\r
- CALL VEC_SET\r
-)ELSE(\r
-%IF (0)THEN( ; Test systemu bez slouceneho\r
-V_uL_ADD EQU 1EH ; CODE a XDATA na systemu se sloucenim\r
-V_uL_FNC EQU 26H\r
-EXTRN CODE(VEC_SET)\r
- MOV R4,#SINT_U\r
- MOV DPTR,#S_INT\r
- CALL VEC_SET\r
- MOV R4,#V_uL_FNC\r
- MOV DPTR,#uL_FNC\r
- CALL VEC_SET\r
-)FI)FI\r
-%IF(%DY_ADDR)THEN(\r
- MOV uL_FLD,#3 ; uLD_RQA\r
+ MOV MWS,#00h ; konec zapisu
+ MOV EAI,C
+ JMP S_ACCT1
+)FI
+
+
+%IF (%DY_ADDR)THEN(
+; *************************************
+; Rutina vysilani statusu CMD=0C1H
+UD_SNST:MOV A,R0
+ MOV C,ACC.0
+ MOV F0,C
+ CALL S_EQP
+ JZ SNSTA04
+ CALL S_R0FB
+ MOV A,R0
+ ANL A,#0FCH ; Funkce 0-3, start of cycle
+ JNZ SNSTA10
+ JB uLD_RQA,SNSTA04 ; Snaha o zviditelneni
+ INC uL_FLD
+ JNB uLD_RQA,SNSTA04
+SNSTA02:; ORL uL_FLD,#7
+ MOV DPTR,#uL_SA
+ MOVX A,@DPTR
+ MOV DPTR,#UD_DYSA ; Server dynamickych adres
+ MOVX @DPTR,A
+ MOV A,R0
+ JNZ SNSTA03 ; Nastavi vlastni adresu
+ MOV DPTR,#uL_ADR ; na nulu pri spatnem SN
+ MOVX @DPTR,A ; v dotazu nebo funkci 0
+SNSTA03:
+SNSTA04:JMP SNSTAR
+
+SNSTA10:ANL A,#0F0H
+ CJNE A,#010H,SNSTA04
+ MOV A,R0 ; Prikaz cteni udaju
+ MOV DPTR,#UD_SFN
+ MOVX @DPTR,A
+ MOV DPTR,#SER_NUM ; Kontrola serioveho cisla
+ MOV R1,#4
+SNSTA11:CALL S_EQP
+ JZ SNSTA12
+ CALL S_R0FB
+ MOVX A,@DPTR
+ XRL A,R0
+ JNZ SNSTA12
+ INC DPTR
+ DJNZ R1,SNSTA11
+SNSTA12:MOV R0,#0
+ JNZ SNSTA02 ; Nesouhlasi cislo
+SNSTA13:MOV C,F0
+ MOV ACC.0,C
+ MOV R0,A
+ CALL ACK_CMD
+ ANL uL_FLD,#NOT 7
+SNSTA20:CALL SND_BEB
+ MOV R2,#LOW SER_NUM; ; Vysle SER_NUM
+ MOV R3,#HIGH SER_NUM
+ MOV R6,#LOW (SER_NUM+4)
+ MOV R7,#HIGH (SER_NUM+4)
+ MOV R5,AR4
+ CALL SND_Bx
+ JB uLD_SCIP,SNSTA50
+ SETB uLD_SSIP
+ MOV DPTR,#UD_STAD ; ukazatel na buffer stavu
+ MOVX A,@DPTR ; do R23 a delka do R6
+ MOV R2,A
+ INC DPTR
+ MOVX A,@DPTR
+ MOV R3,A
+ INC DPTR
+ MOVX A,@DPTR
+ MOV R6,A
+ MOV DPTR,#UD_SFN ; stavova subfunkce
+ MOVX A,@DPTR
+ CJNE A,#010H,SNSTA30
+ MOV A,R4 ; Vyslani zakladnich udaju
+ MOV R5,A ; no buff wrap
+ MOV A,R6
+ JZ SNSTA50
+ CJNE A,#2,SNSTA28
+SNSTA27:CALL S_R0FB ; vysle 2 byte z UD_STAD
+ MOV A,R0
+ MOV R6,A
+ CALL S_R0FB
+ MOV A,R6
+ CALL SND_CHC ; mod
+ MOV A,R0
+ CALL SND_CHC ; chyby
+ SJMP SNSTA50
+SNSTA28:ADD A,R2
+ MOV R6,A
+ CLR A ; vysle UD_STLN byte z UD_STAD
+ ADDC A,R3
+ MOV R7,A
+ CALL SND_Bx
+ SJMP SNSTA50
+SNSTA30:CJNE A,#011H,SNSTA50
+ ; Vyslani servisnich udaju
+
+SNSTA50:CALL SND_END
+ CLR uLD_SSIP
+SNSTAR: JMP S_WAITD
+; JMP NAK_CMD
+)FI
+
+VS_FNC1:JMP S_FNC1
+; *************************************
+; Inicializace a sluzby RS-485
+; *************************************
+_uL_FNCC:XCH A,R7 ; V R7 je cislo funkce
+ MOV R0,A
+ XCH A,R7 ; ACC nazpet
+ SJMP uL_FNC
+uL_INIT:MOV R0,#0
+ MOV R2,#0
+uL_FNC: CJNE R0,#0,VS_FNC1
+S_FN0: CLR ES_U ; Po nastaveni ryclosti a adresy se
+ CLR ET1 ; touto funkci spusti RS485
+%IF (%NEG_DR_EO) THEN (
+ CLR DR_EO
+)ELSE(
+ SETB DR_EO
+)FI
+; CLR DR_EI
+ CLR PT1
+ ANL TMOD,#00FH
+ ORL TMOD,#020H
+ SETB TR1
+ MOV DPTR,#uL_SPD
+ MOVX A,@DPTR
+ JNZ S_FN0_0
+ CALL S_FN1_0
+S_FN0_0:MOV TH1,A
+S_FN6_0:MOV SCON_U,#11010000B
+ ORL PCON_U,#10000000B ; Bd = OSC/12/16/(256-TH1)
+ SETB PS
+ CLR A ; Vstupni bod pro uzivatelsky baud gen
+ MOV DPTR,#uL_CMD
+ MOV R1,#PROC_BUFE-uL_CMD
+S_FN0_1:MOVX @DPTR,A
+ INC DPTR
+ DJNZ R1,S_FN0_1
+ MOV A,R2 ; Zazalohovani autoinicializace
+ PUSH ACC
+ MOV DPTR,#uL_HBIB
+ MOV R1,#3
+ CALL LDRFDP
+ POP ACC
+ JNZ S_FN0_2 ; Autoinicializace ?
+ CALL S_FN3_0
+ MOV A,R2
+S_FN0_2:MOV DPTR,#P_NDB+1
+ MOVX @DPTR,A ; P_NDB=BEG_IB
+ INC DPTR
+ MOVX @DPTR,A ; H_BIB=BEG_IB
+ MOV DPTR,#P_NPD+1
+ MOVX @DPTR,A ; P_NPD=BEG_IB
+ INC DPTR
+ INC DPTR
+ MOVX @DPTR,A ; P_AID=BEG_IB
+ MOV DPH,A
+ CLR A
+ MOV DPL,A
+ MOVX @DPTR,A
+ MOV DPTR,#H_EIB
+ MOV A,R2
+ ADD A,R3
+ MOVX @DPTR,A ; H_EIB=END_IB
+ MOV DPTR,#P_AOB+1
+ MOVX @DPTR,A ; P_AOB=BEG_OB
+ INC DPTR
+ MOVX @DPTR,A ; H_BOB=BEG_OB
+ MOV DPTR,#P_NOB+1
+ MOVX @DPTR,A ; P_NOB=BEG_OB
+ INC DPTR
+ INC DPTR
+ MOVX @DPTR,A ; P_AOD=BEG_OB
+ MOV DPH,A
+ CLR A
+ MOV DPL,A
+ MOVX @DPTR,A
+ MOV A,R2
+ ADD A,R3
+ ADD A,R4
+ MOV DPTR,#H_EOB ; H_EOB=END_OB
+ MOVX @DPTR,A
+ MOV A,R2
+ MOV DPTR,#P_EID+1
+ MOVX @DPTR,A ; P_EID=BEG_IB
+ MOV DPTR,#uL_FRLN
+ MOV A,#LOW S_FRLN
+ MOVX @DPTR,A
+ INC DPTR
+ MOV A,#HIGH S_FRLN
+ MOVX @DPTR,A
+ %IF(%WITH_TAILS)THEN(
+ CLR uLF_OWT
+ )FI
+S_FN0_6:CLR A ; Spusteni uLan communication
+ MOV SER_STACK,A
+ MOV uL_FLG,A
+ MOV uL_FLH,A
+%IF (%VECTOR_FL)THEN(
+ MOV R4,#SINT_U
+ MOV DPTR,#S_INT
+ CALL VEC_SET
+ MOV R4,#V_uL_FNC
+ MOV DPTR,#uL_FNC
+ CALL VEC_SET
+ MOV R4,#V_uL_ADD
+ MOV DPTR,#uL_EADD
+ CALL VEC_SET
+)ELSE(
+%IF (0)THEN( ; Test systemu bez slouceneho
+V_uL_ADD EQU 1EH ; CODE a XDATA na systemu se sloucenim
+V_uL_FNC EQU 26H
+EXTRN CODE(VEC_SET)
+ MOV R4,#SINT_U
+ MOV DPTR,#S_INT
+ CALL VEC_SET
+ MOV R4,#V_uL_FNC
+ MOV DPTR,#uL_FNC
+ CALL VEC_SET
+)FI)FI
+%IF(%DY_ADDR)THEN(
+ MOV uL_FLD,#3 ; uLD_RQA
MOV DPTR,#UD_STLN
CLR A
MOVX @DPTR,A
-)FI\r
- SETB ES_U\r
- RET\r
-\r
-S_FNC1: CJNE R0,#1,S_FNC2 ; Nastavi ryclost 57.6 kBd/ACC\r
-S_FN1_0:MOV DPTR,#uL_SPD\r
- JNZ S_FN1_1\r
- MOV A,#S_SPEED\r
-S_FN1_1:CPL A\r
- INC A\r
- MOVX @DPTR,A\r
- MOV TH1,A\r
- RET\r
-\r
-S_FNC2: CJNE R0,#2,S_FNC3 ; Nastavuje adresu podle ACC\r
- MOV DPTR,#uL_ADR\r
- MOVX @DPTR,A\r
- RET\r
-\r
-S_FNC3: CJNE R0,#3,S_FNC4 ; Nastavi pocatek IB na R2\r
- CLR ES_U\r
- CLR A\r
- MOV SER_STACK,A\r
- CJNE R2,#0,S_FN3_1 ; delku IB na R3 a delku OB na R4\r
-S_FN3_0:MOV R2,#HIGH BEG_IB ; Kdyz je R2=0 provede se autoinicializace\r
- MOV R3,#LENG_IB\r
- MOV R4,#LENG_OB\r
-S_FN3_1:MOV DPTR,#uL_HBIB\r
- MOV R1,#3\r
- JMP SVRBDP\r
-\r
-S_FNC4:\r
-\r
-S_FNC5:\r
-\r
-S_FNC6: CJNE R0,#6,S_FNC7 ; Spusti komunikaci s baud generatorem\r
- CLR ES_U ; pripravenym uzivatelem\r
-%IF (%NEG_DR_EO) THEN (\r
- CLR DR_EO\r
-)ELSE(\r
- SETB DR_EO\r
-)FI\r
- JMP S_FN6_0\r
-\r
-S_FNC7: CJNE R0,#7,S_FNC8 ; Zapnuti/Vypnuti prijimani vsech zprav na sbernici\r
- CLR uLF_ARC\r
- JZ S_FNC71\r
- SETB uLF_ARC\r
-S_FNC71:RET\r
-\r
-S_FNC8:\r
-\r
-S_FNC10:CJNE R0,#10h,S_FNC11\r
-uL_O_OP:MOV A,R5 ; Otevre vystupni zpravu pro Dadr R4 s Com R5\r
- MOV R6,#uLBF_AAP\r
- JB ACC.7,uL_O_OP1\r
- MOV R6,#uLBF_ARQ\r
- JB ACC.6,uL_O_OP2\r
-uL_O_OP1:CJNE R4,#0,uL_O_OP3\r
-uL_O_OP2:DEC R6 ; No acknowledge uLBF_ACK\r
-uL_O_OP3:MOV R7,#0\r
-uL_O_NEW: ; Dalsi parametry Status R6, Stamp R7\r
- PUSH DPL ; pri promiskuitnim rezimu uLF_ARC\r
- PUSH DPH ; je SAdr nastaveno na uL_ISAD\r
- MOV DPTR,#P_NOB\r
- CALL S_GER23\r
- CALL S_PUR23\r
- MOV A,R4 ; DAdr\r
- ANL A,#7FH\r
- CALL uL_WRB0\r
- MOV DPTR,#uL_ADR ; Vlastni Adresa do SAdr\r
- JNB uLF_ARC,uL_O_OP6\r
- MOV DPTR,#uL_ISAD ; Promiskuitni adresa do SAdr\r
-uL_O_OP6:MOVX A,@DPTR\r
- CALL uL_WRB0\r
- CALL uL_WRB0 ; End pointer Low\r
- CALL uL_WRB0 ; End pointer High\r
- MOV A,R5 ; Command\r
- CALL uL_WRB0\r
- MOV A,R6 ; Status\r
- CALL uL_WRB0\r
- MOV A,R7 ; Stamp\r
- CALL uL_WRB0\r
- JNB F0,uL_O_OP8\r
-uL_O_ABRT1:\r
-uL_O_OP7:MOV DPTR,#P_NOB ; Blokovani uL_O_CL v pripade\r
- CALL S_GER23 ; nespravne otevrene zpravy\r
- CALL S_PUR23\r
-uL_O_OP8:POP DPH\r
- POP DPL\r
- RET\r
-\r
-S_GER23:MOVX A,@DPTR\r
- MOV R2,A\r
- INC DPTR\r
- MOVX A,@DPTR\r
- MOV R3,A\r
- INC DPTR\r
- RET\r
-\r
-S_PUR23:MOV A,R2\r
- MOVX @DPTR,A\r
- INC DPTR\r
- MOV A,R3\r
- MOVX @DPTR,A\r
- INC DPTR\r
- RET\r
-\r
-S_FNC11:CJNE R0,#11h,S_FNC12\r
-uL_WR: JB F0,uL_WRR ; Zapise R45 bytu z @DP - Rusi R012345\r
-uL_WR1: MOV A,R4\r
- ORL A,R5\r
- JZ uL_WRR\r
- CALL uL_WRB\r
- JB F0,uL_WRR\r
- DEC R4\r
- CJNE R4,#-1,uL_WR1\r
- DEC R5\r
- SJMP uL_WR1\r
-uL_WRR: RET\r
-\r
-uL_I23O:INC R2 ; Posouva ukazatel R23 ve vystupnim\r
- CJNE R2,#0,uL_I23R ; cyklickem bufferu a prepisuje ho\r
- INC R3 ; do DP\r
- MOV DPTR,#H_EOB\r
- MOVX A,@DPTR\r
- XRL A,R3\r
- JNZ uL_I23R\r
- MOV DPTR,#H_BOB\r
- MOVX A,@DPTR\r
- MOV R3,A\r
-uL_I23R:MOV DPL,R2\r
- MOV DPH,R3\r
-uL_O_CE:RET\r
-\r
-S_FNC12:CJNE R0,#12h,S_FNC13\r
-uL_O_CL:JB F0,uL_O_CE ; Uzavre vystupni zpravu\r
- MOV R6,DPL\r
- MOV R7,DPH\r
- MOV DPTR,#P_AOD\r
- MOVX A,@DPTR ; R45 ukazatel za konec dat\r
- MOV R4,A\r
- INC DPTR\r
- MOVX A,@DPTR\r
- MOV R5,A\r
- MOV DPL,R4\r
- MOV DPH,A\r
- CLR A\r
- MOVX @DPTR,A ; Nastavi DAdr pristiho bloku na 0\r
- MOV DPTR,#P_NOB ; Pristi blok bude zacinat na R45\r
- MOVX A,@DPTR\r
- MOV R2,A\r
- MOV R0,A\r
- MOV A,R4\r
- MOVX @DPTR,A\r
- INC DPTR\r
- MOVX A,@DPTR\r
- MOV R3,A\r
- MOV R1,A ; Zacatek aktualniho bloku do R01 a R23\r
- MOV A,R5\r
- MOVX @DPTR,A\r
- XRL A,R3\r
- JNZ uL_O_C1\r
- MOV A,R4 ; Vylouceni snahy o uL_O_CL\r
- XRL A,R2 ; bez predchoziho uL_O_OP\r
- JZ uL_O_C6\r
-uL_O_C1:CALL uL_I23O ;Preskocit DAdr\r
- CALL uL_I23O ;Preskocit SAdr\r
- MOV A,R4\r
- MOVX @DPTR,A ; Ulozi ukazatel na pristi blok\r
- CALL uL_I23O\r
- MOV A,R5\r
- MOVX @DPTR,A\r
- %IF(%WITH_TAILS)THEN(\r
- CALL uL_I23O\r
- CALL uL_I23O ; Preskocit Command\r
- MOVX A,@DPTR ; Status\r
- ;MOV C,ACC.uLBF_TAILb\r
- MOV C,ACC.5 ; !!!! ASX8051 is broken\r
- JNC uL_O_C5\r
- JB uLF_OWT,uL_O_C5\r
- MOV DPTR,#P_AOT ; Ulozit zacatek useku zprav\r
- MOV A,R0 ; spojenych tailovanim\r
- MOVX @DPTR,A\r
- INC DPTR\r
- MOV A,R1\r
- MOVX @DPTR,A\r
- SETB uLF_OWT\r
-uL_O_C4:MOV DPL,R6\r
- MOV DPH,R7\r
- RET\r
- )FI\r
-uL_O_C5:MOV DPL,R0 ; Pocatek bloku DP=R01\r
- MOV DPH,R1\r
- MOVX A,@DPTR\r
- MOV R4,A\r
- ORL A,#80H ; Nastavenim DAdr.8 oznaci\r
- MOVX @DPTR,A ; blok za pripraveny k odeslani\r
- %IF(%WITH_TAILS)THEN(\r
- JC uL_O_C4\r
- JNB uLF_OWT,uL_O_C6\r
- CLR uLF_OWT\r
- MOV DPTR,#P_AOT\r
- MOVX A,@DPTR\r
- MOV R0,A\r
- INC DPTR\r
- MOVX A,@DPTR\r
- MOV DPL,R0\r
- MOV DPH,A\r
- MOVX A,@DPTR\r
- ORL A,#80H ; Nastavi DAdr.8 prvniho bloku\r
- MOVX @DPTR,A ; tailovaneho useku a tim zpusti\r
- )FI ; jeho zpracovani\r
-uL_O_C6:MOV DPL,R6\r
- MOV DPH,R7\r
- SJMP uL_O_ST\r
-\r
-S_FNC13:CJNE R0,#13h,S_FNC14\r
-uL_WRB: MOVX A,@DPTR ; Zapise byte z @DP - Rusi R0123\r
-uL_WRB0:MOV R3,A\r
- MOV R0,DPL\r
- MOV R1,DPH\r
- JB F0,uL_WRBE\r
- MOV DPTR,#P_AOD\r
- MOVX A,@DPTR\r
- MOV R2,A\r
- INC DPTR\r
- MOVX A,@DPTR\r
- MOV DPH,A\r
- XCH A,R3\r
- MOV DPL,R2\r
- MOVX @DPTR,A\r
- INC R2\r
- CJNE R2,#0,uL_WRB1\r
- INC R3\r
- MOV DPTR,#H_EOB\r
- MOVX A,@DPTR\r
- XRL A,R3\r
- JNZ uL_WRB1\r
- MOV DPTR,#H_BOB\r
- MOVX A,@DPTR\r
- MOV R3,A\r
-uL_WRB1:MOV DPTR,#P_AOB+1\r
- MOVX A,@DPTR\r
- XRL A,R3\r
- JNZ uL_WRB3\r
- MOV DPTR,#P_AOB\r
- MOVX A,@DPTR\r
- XRL A,R2\r
- JNZ uL_WRB3\r
- INC DPTR\r
- MOVX A,@DPTR\r
- XRL A,R3\r
- JNZ uL_WRB3\r
-uL_WRBE:SETB F0\r
- MOV DPL,R0\r
- MOV DPH,R1\r
- RET\r
-\r
-uL_WRB3:MOV DPTR,#P_AOD\r
-uL_WRB4:MOV A,R2\r
- MOVX @DPTR,A\r
- INC DPTR\r
- MOV A,R3\r
- MOVX @DPTR,A\r
- MOV DPL,R0\r
- MOV DPH,R1\r
- MOVX A,@DPTR\r
- INC DPTR\r
- RET\r
-\r
-uL_O_ST:SETB uLF_RS\r
- CLR ES_U\r
- JNB uLF_NB,uL_O_SU\r
- JB uLF_SN,uL_O_SU\r
- SETB TI_U\r
-uL_O_SU:SETB ES_U\r
- RET\r
-\r
-S_FNC14:CJNE R0,#14h,S_FNC15\r
-uL_O_LN:MOV R0,DPL\r
- MOV R1,DPH\r
- MOV DPTR,#P_AOD\r
- MOVX A,@DPTR\r
- MOV R2,A\r
- INC DPTR\r
- MOVX A,@DPTR\r
- MOV R3,A\r
- MOV DPTR,#P_AOB\r
- SETB C\r
- MOVX A,@DPTR\r
- SUBB A,R2\r
- MOV R2,A\r
- INC DPTR\r
- MOVX A,@DPTR\r
- INC DPTR\r
- JMP uL_O_L1\r
-\r
-S_FNC15:CJNE R0,#15h,S_FNC16\r
-%IF (%VECTOR_FL) THEN (\r
-uL_WRc: JMP uL_WR\r
-)ELSE(\r
-uL_WRc: JB F0,uL_WRcR ; Zapise R45 bytu z CODE @DP\r
-uL_WRc1:MOV A,R4 ; Rusi R012345\r
- ORL A,R5\r
- JZ uL_WRcR\r
- CLR A\r
- MOVC A,@A+DPTR\r
- CALL uL_WRB0\r
- JB F0,uL_WRcR\r
- DEC R4\r
- CJNE R4,#-1,uL_WRc1\r
- DEC R5\r
- SJMP uL_WRc1\r
-uL_WRcR:RET\r
-)FI\r
-\r
-S_FNC16:CJNE R0,#16h,S_FNC17 ; abors msg\r
-uL_O_ABRT:PUSH DPL\r
- PUSH DPH\r
- JMP uL_O_ABRT1\r
-\r
-S_FNC17:\r
-\r
-S_FNC23:CJNE R0,#23h,S_FNC20\r
-uL_RDB: MOV R0,DPL ; Nacte byte na @DP - Rusi R0123\r
- MOV R1,DPH\r
- JB F0,uL_WRBE\r
- MOV DPTR,#P_AID\r
- MOVX A,@DPTR\r
- MOV R2,A\r
- INC DPTR\r
- MOVX A,@DPTR\r
- MOV R3,A\r
- MOV DPTR,#P_EID\r
- MOVX A,@DPTR\r
- XRL A,R2\r
- JNZ uL_RDB1\r
- INC DPTR\r
- MOVX A,@DPTR\r
- XRL A,R3\r
- JNZ uL_RDB1\r
- JMP uL_WRBE\r
-uL_RDB1:MOV DPL,R2\r
- MOV DPH,R3\r
- MOVX A,@DPTR\r
- MOV DPL,R0\r
- MOV DPH,R1\r
- MOVX @DPTR,A\r
- INC R2\r
- CJNE R2,#0,uL_RDB2\r
- INC R3\r
- MOV DPTR,#H_EIB\r
- MOVX A,@DPTR\r
- XRL A,R3\r
- JNZ uL_RDB2\r
- MOV DPTR,#H_BIB\r
- MOVX A,@DPTR\r
- MOV R3,A\r
-uL_RDB2:MOV DPTR,#P_AID\r
- JMP uL_WRB4\r
-\r
-S_FNC20:CJNE R0,#20h,S_FNC21\r
-uL_I_OP:PUSH DPL ; Otevre vstupni zpravu : vyplni\r
- PUSH DPH ; uL_ISAD,uL_IDAD,uL_ICOM,uL_IST,uL_ISTA\r
- JB F0,uL_I_OR\r
- MOV DPTR,#P_NPD\r
- CALL S_GER23\r
- CALL S_PUR23\r
- INC R3\r
- MOV DPTR,#P_EID\r
- CALL S_PUR23\r
- MOV DPTR,#uL_ISAD\r
- CALL uL_RDB ; SAdr\r
- MOV R4,A\r
- JNB ACC.7,uL_I_OE\r
- MOV DPTR,#uL_ISAD\r
- ANL A,#7FH ; Odmaskuj nejvyssi bit\r
- MOV R4,A ; Drive bylo se 7 bitem\r
- MOVX @DPTR,A\r
- MOV DPTR,#uL_IDAD ; DAdr\r
- CALL uL_RDB\r
- ANL A,#7FH ; Zrusit nejvyssi bit\r
- MOV R7,A\r
- MOV DPTR,#P_EID ; Konec dat\r
- CALL uL_RDB\r
- CALL uL_RDB\r
- MOV DPTR,#uL_ICOM ; Command\r
- CALL uL_RDB\r
- MOV R5,A\r
- MOV DPTR,#uL_IST ; Status\r
- CALL uL_RDB\r
- MOV R6,A\r
- MOV DPTR,#uL_ISTA ; Stamp\r
- CALL uL_RDB\r
- XCH A,R7\r
- MOV R3,A\r
-uL_I_OR:POP DPH\r
- POP DPL\r
- RET\r
-\r
-uL_I_OE:SETB F0\r
- MOV DPTR,#P_NPD\r
- CALL S_GER23\r
- MOV DPTR,#P_EID\r
- CALL S_PUR23\r
- SJMP uL_I_OR\r
-\r
-S_FNC21:CJNE R0,#21h,S_FNC22\r
-uL_RD: JB F0,uL_RDR ; Nacte R45 bytu na @DP - Rusi R012345\r
-uL_RD1: MOV A,R4\r
- ORL A,R5\r
- JZ uL_RDR\r
- CALL uL_RDB\r
- JB F0,uL_RDR\r
- DEC R4\r
- CJNE R4,#-1,uL_RD1\r
- DEC R5\r
- SJMP uL_RD1\r
-uL_RDR: RET\r
-\r
-S_FNC22:CJNE R0,#22h,S_FNC24\r
-uL_I_CL:MOV R6,DPL ; Uzavre vstupni zpravu\r
- MOV R7,DPH\r
- JB F0,uL_I_CR\r
- MOV DPTR,#P_EID\r
- CALL S_GER23\r
- MOV DPTR,#P_NPD\r
- CALL S_PUR23\r
-uL_I_CR:MOV DPL,R6\r
- MOV DPH,R7\r
- RET\r
-\r
-S_FNC24:CJNE R0,#24h,S_FNC25\r
-uL_I_LN:MOV R0,DPL\r
- MOV R1,DPH\r
- MOV DPTR,#P_AID\r
- MOVX A,@DPTR\r
- MOV R2,A\r
- INC DPTR\r
- MOVX A,@DPTR\r
- MOV R3,A\r
- MOV DPTR,#P_EID\r
- CLR C\r
- MOVX A,@DPTR\r
- SUBB A,R2\r
- MOV R2,A\r
- INC DPTR\r
- MOVX A,@DPTR\r
- MOV DPTR,#H_BIB\r
-uL_O_L1:SUBB A,R3\r
- MOV R3,A\r
- JNC uL_I_L1\r
- MOVX A,@DPTR\r
- XCH A,R3\r
- CLR C\r
- SUBB A,R4\r
- MOV R3,A\r
- INC DPTR\r
- MOVX A,@DPTR\r
- ADD A,R3\r
- MOV R3,A\r
-uL_I_L1:CLR C\r
- MOV A,R2\r
- SUBB A,R4\r
- MOV A,R3\r
- SUBB A,R5\r
- JNC uL_I_L3\r
-uL_I_L2:SETB F0\r
- MOV A,R2\r
- MOV R4,A\r
- MOV A,R3\r
- MOV R5,A\r
-uL_I_L3:CLR C\r
- MOV DPTR,#uL_FRLN\r
- MOVX A,@DPTR\r
- MOV R2,A\r
- SUBB A,R4\r
- INC DPTR\r
- MOVX A,@DPTR\r
- MOV R3,A\r
- SUBB A,R5\r
- JC uL_I_L2\r
- MOV DPL,R0\r
- MOV DPH,R1\r
- RET\r
-\r
-S_FNC25:CJNE R0,#25h,S_FNC26 ; pocet byte do konce zpravy (delka zpravy)\r
-uL_I_L: MOV R0,DPL\r
- MOV R1,DPH\r
- MOV DPTR,#P_AID\r
- MOVX A,@DPTR\r
- MOV R4,A\r
- INC DPTR\r
- MOVX A,@DPTR\r
- MOV R5,A\r
- MOV DPTR,#P_EID\r
- CLR C\r
- MOVX A,@DPTR\r
- SUBB A,R4\r
- MOV R4,A\r
- INC DPTR\r
- MOVX A,@DPTR\r
- SUBB A,R5\r
- MOV R5,A\r
- JNC uL_I_LL\r
- MOV DPTR,#H_BIB ; Nutna korekce cyklicnosti \r
- MOVX A,@DPTR ; R5=R5+(H_EIB-H_BIB)\r
- SUBB A,R5 ; R5=H_EIB-(H_BIB-R5-1)-1\r
- MOV R5,A\r
- INC DPTR\r
- MOVX A,@DPTR ; H_EIB\r
- SETB C\r
- SUBB A,R5\r
- MOV R5,A\r
-uL_I_LL:MOV DPL,R0\r
- MOV DPH,R1\r
- RET\r
-\r
-S_FNC26:CJNE R0,#26h,S_FNC27 ; je na vstupu zprava\r
-uL_I_NE:JBC uLF_INE,uL_I_N2\r
-uL_I_N1:CLR CY\r
- RET\r
-uL_I_N2:MOV DPTR,#P_NPD\r
- MOVX A,@DPTR\r
- MOV R0,A\r
- INC DPTR\r
- MOVX A,@DPTR\r
- MOV DPH,A\r
- MOV DPL,R0\r
- MOVX A,@DPTR\r
- JZ uL_I_N1\r
- SETB uLF_INE\r
- SETB CY\r
- RET\r
-\r
-S_FNC27:\r
- RET\r
-\r
-; Nacte od R2 pres DP R1 registru\r
-LDRFDP :MOV A,PSW\r
- ANL A,#018H\r
- MOV R0,A\r
- INC R0\r
-LDRFDP1:INC R0\r
- MOVX A,@DPTR\r
- MOV @R0,A\r
- INC DPTR\r
- DJNZ R1,LDRFDP1\r
- RET\r
-\r
-; Ulozi od R2 pres DP R1 registru\r
-SVRBDP :MOV A,PSW\r
- ANL A,#018H\r
- MOV R0,A\r
- INC R0\r
-S_FN3_2:INC R0\r
- MOV A,@R0\r
- MOVX @DPTR,A\r
- INC DPTR\r
- DJNZ R1,S_FN3_2\r
- RET\r
-
-_uL_STR:\r
-uL_STR: JBC ES_U,uL_STRG\r
- RET\r
-uL_STRG:JNB uLF_NA,uL_STRE\r
- JNB uLF_NB,uL_STRF\r
- JNB uLF_RS,uL_STRF\r
- SETB TI_U\r
-uL_STRF:SETB uLF_NB\r
-uL_STRE:SETB uLF_NA\r
- SETB ES_U\r
- RET\r
-\r
- END\r
+)FI
+ SETB ES_U
+ RET
+
+S_FNC1: CJNE R0,#1,S_FNC2 ; Nastavi ryclost 57.6 kBd/ACC
+S_FN1_0:MOV DPTR,#uL_SPD
+ JNZ S_FN1_1
+ MOV A,#S_SPEED
+S_FN1_1:CPL A
+ INC A
+ MOVX @DPTR,A
+ MOV TH1,A
+ RET
+
+S_FNC2: CJNE R0,#2,S_FNC3 ; Nastavuje adresu podle ACC
+ MOV DPTR,#uL_ADR
+ MOVX @DPTR,A
+ RET
+
+S_FNC3: CJNE R0,#3,S_FNC4 ; Nastavi pocatek IB na R2
+ CLR ES_U
+ CLR A
+ MOV SER_STACK,A
+ CJNE R2,#0,S_FN3_1 ; delku IB na R3 a delku OB na R4
+S_FN3_0:MOV R2,#HIGH BEG_IB ; Kdyz je R2=0 provede se autoinicializace
+ MOV R3,#LENG_IB
+ MOV R4,#LENG_OB
+S_FN3_1:MOV DPTR,#uL_HBIB
+ MOV R1,#3
+ JMP SVRBDP
+
+S_FNC4:
+
+S_FNC5:
+
+S_FNC6: CJNE R0,#6,S_FNC7 ; Spusti komunikaci s baud generatorem
+ CLR ES_U ; pripravenym uzivatelem
+%IF (%NEG_DR_EO) THEN (
+ CLR DR_EO
+)ELSE(
+ SETB DR_EO
+)FI
+ JMP S_FN6_0
+
+S_FNC7: CJNE R0,#7,S_FNC8 ; Zapnuti/Vypnuti prijimani vsech zprav na sbernici
+ CLR uLF_ARC
+ JZ S_FNC71
+ SETB uLF_ARC
+S_FNC71:RET
+
+S_FNC8:
+
+S_FNC10:CJNE R0,#10h,S_FNC11
+uL_O_OP:MOV A,R5 ; Otevre vystupni zpravu pro Dadr R4 s Com R5
+ MOV R6,#uLBF_AAP
+ JB ACC.7,uL_O_OP1
+ MOV R6,#uLBF_ARQ
+ JB ACC.6,uL_O_OP2
+uL_O_OP1:CJNE R4,#0,uL_O_OP3
+uL_O_OP2:DEC R6 ; No acknowledge uLBF_ACK
+uL_O_OP3:MOV R7,#0
+uL_O_NEW: ; Dalsi parametry Status R6, Stamp R7
+ PUSH DPL ; pri promiskuitnim rezimu uLF_ARC
+ PUSH DPH ; je SAdr nastaveno na uL_ISAD
+ MOV DPTR,#P_NOB
+ CALL S_GER23
+ CALL S_PUR23
+ MOV A,R4 ; DAdr
+ ANL A,#7FH
+ CALL uL_WRB0
+ MOV DPTR,#uL_ADR ; Vlastni Adresa do SAdr
+ JNB uLF_ARC,uL_O_OP6
+ MOV DPTR,#uL_ISAD ; Promiskuitni adresa do SAdr
+uL_O_OP6:MOVX A,@DPTR
+ CALL uL_WRB0
+ CALL uL_WRB0 ; End pointer Low
+ CALL uL_WRB0 ; End pointer High
+ MOV A,R5 ; Command
+ CALL uL_WRB0
+ MOV A,R6 ; Status
+ CALL uL_WRB0
+ MOV A,R7 ; Stamp
+ CALL uL_WRB0
+ JNB F0,uL_O_OP8
+uL_O_ABRT1:
+uL_O_OP7:MOV DPTR,#P_NOB ; Blokovani uL_O_CL v pripade
+ CALL S_GER23 ; nespravne otevrene zpravy
+ CALL S_PUR23
+uL_O_OP8:POP DPH
+ POP DPL
+ RET
+
+S_GER23:MOVX A,@DPTR
+ MOV R2,A
+ INC DPTR
+ MOVX A,@DPTR
+ MOV R3,A
+ INC DPTR
+ RET
+
+S_PUR23:MOV A,R2
+ MOVX @DPTR,A
+ INC DPTR
+ MOV A,R3
+ MOVX @DPTR,A
+ INC DPTR
+ RET
+
+S_FNC11:CJNE R0,#11h,S_FNC12
+uL_WR: JB F0,uL_WRR ; Zapise R45 bytu z @DP - Rusi R012345
+uL_WR1: MOV A,R4
+ ORL A,R5
+ JZ uL_WRR
+ CALL uL_WRB
+ JB F0,uL_WRR
+ DEC R4
+ CJNE R4,#-1,uL_WR1
+ DEC R5
+ SJMP uL_WR1
+uL_WRR: RET
+
+uL_I23O:INC R2 ; Posouva ukazatel R23 ve vystupnim
+ CJNE R2,#0,uL_I23R ; cyklickem bufferu a prepisuje ho
+ INC R3 ; do DP
+ MOV DPTR,#H_EOB
+ MOVX A,@DPTR
+ XRL A,R3
+ JNZ uL_I23R
+ MOV DPTR,#H_BOB
+ MOVX A,@DPTR
+ MOV R3,A
+uL_I23R:MOV DPL,R2
+ MOV DPH,R3
+uL_O_CE:RET
+
+S_FNC12:CJNE R0,#12h,S_FNC13
+uL_O_CL:JB F0,uL_O_CE ; Uzavre vystupni zpravu
+ MOV R6,DPL
+ MOV R7,DPH
+ MOV DPTR,#P_AOD
+ MOVX A,@DPTR ; R45 ukazatel za konec dat
+ MOV R4,A
+ INC DPTR
+ MOVX A,@DPTR
+ MOV R5,A
+ MOV DPL,R4
+ MOV DPH,A
+ CLR A
+ MOVX @DPTR,A ; Nastavi DAdr pristiho bloku na 0
+ MOV DPTR,#P_NOB ; Pristi blok bude zacinat na R45
+ MOVX A,@DPTR
+ MOV R2,A
+ MOV R0,A
+ MOV A,R4
+ MOVX @DPTR,A
+ INC DPTR
+ MOVX A,@DPTR
+ MOV R3,A
+ MOV R1,A ; Zacatek aktualniho bloku do R01 a R23
+ MOV A,R5
+ MOVX @DPTR,A
+ XRL A,R3
+ JNZ uL_O_C1
+ MOV A,R4 ; Vylouceni snahy o uL_O_CL
+ XRL A,R2 ; bez predchoziho uL_O_OP
+ JZ uL_O_C6
+uL_O_C1:CALL uL_I23O ;Preskocit DAdr
+ CALL uL_I23O ;Preskocit SAdr
+ MOV A,R4
+ MOVX @DPTR,A ; Ulozi ukazatel na pristi blok
+ CALL uL_I23O
+ MOV A,R5
+ MOVX @DPTR,A
+ %IF(%WITH_TAILS)THEN(
+ CALL uL_I23O
+ CALL uL_I23O ; Preskocit Command
+ MOVX A,@DPTR ; Status
+ ;MOV C,ACC.uLBF_TAILb
+ MOV C,ACC.5 ; !!!! ASX8051 is broken
+ JNC uL_O_C5
+ JB uLF_OWT,uL_O_C5
+ MOV DPTR,#P_AOT ; Ulozit zacatek useku zprav
+ MOV A,R0 ; spojenych tailovanim
+ MOVX @DPTR,A
+ INC DPTR
+ MOV A,R1
+ MOVX @DPTR,A
+ SETB uLF_OWT
+uL_O_C4:MOV DPL,R6
+ MOV DPH,R7
+ RET
+ )FI
+uL_O_C5:MOV DPL,R0 ; Pocatek bloku DP=R01
+ MOV DPH,R1
+ MOVX A,@DPTR
+ MOV R4,A
+ ORL A,#80H ; Nastavenim DAdr.8 oznaci
+ MOVX @DPTR,A ; blok za pripraveny k odeslani
+ %IF(%WITH_TAILS)THEN(
+ JC uL_O_C4
+ JNB uLF_OWT,uL_O_C6
+ CLR uLF_OWT
+ MOV DPTR,#P_AOT
+ MOVX A,@DPTR
+ MOV R0,A
+ INC DPTR
+ MOVX A,@DPTR
+ MOV DPL,R0
+ MOV DPH,A
+ MOVX A,@DPTR
+ ORL A,#80H ; Nastavi DAdr.8 prvniho bloku
+ MOVX @DPTR,A ; tailovaneho useku a tim zpusti
+ )FI ; jeho zpracovani
+uL_O_C6:MOV DPL,R6
+ MOV DPH,R7
+ SJMP uL_O_ST
+
+S_FNC13:CJNE R0,#13h,S_FNC14
+uL_WRB: MOVX A,@DPTR ; Zapise byte z @DP - Rusi R0123
+uL_WRB0:MOV R3,A
+ MOV R0,DPL
+ MOV R1,DPH
+ JB F0,uL_WRBE
+ MOV DPTR,#P_AOD
+ MOVX A,@DPTR
+ MOV R2,A
+ INC DPTR
+ MOVX A,@DPTR
+ MOV DPH,A
+ XCH A,R3
+ MOV DPL,R2
+ MOVX @DPTR,A
+ INC R2
+ CJNE R2,#0,uL_WRB1
+ INC R3
+ MOV DPTR,#H_EOB
+ MOVX A,@DPTR
+ XRL A,R3
+ JNZ uL_WRB1
+ MOV DPTR,#H_BOB
+ MOVX A,@DPTR
+ MOV R3,A
+uL_WRB1:MOV DPTR,#P_AOB+1
+ MOVX A,@DPTR
+ XRL A,R3
+ JNZ uL_WRB3
+ MOV DPTR,#P_AOB
+ MOVX A,@DPTR
+ XRL A,R2
+ JNZ uL_WRB3
+ INC DPTR
+ MOVX A,@DPTR
+ XRL A,R3
+ JNZ uL_WRB3
+uL_WRBE:SETB F0
+ MOV DPL,R0
+ MOV DPH,R1
+ RET
+
+uL_WRB3:MOV DPTR,#P_AOD
+uL_WRB4:MOV A,R2
+ MOVX @DPTR,A
+ INC DPTR
+ MOV A,R3
+ MOVX @DPTR,A
+ MOV DPL,R0
+ MOV DPH,R1
+ MOVX A,@DPTR
+ INC DPTR
+ RET
+
+uL_O_ST:SETB uLF_RS
+ CLR ES_U
+ JNB uLF_NB,uL_O_SU
+ JB uLF_SN,uL_O_SU
+ SETB TI_U
+uL_O_SU:SETB ES_U
+ RET
+
+S_FNC14:CJNE R0,#14h,S_FNC15
+uL_O_LN:MOV R0,DPL
+ MOV R1,DPH
+ MOV DPTR,#P_AOD
+ MOVX A,@DPTR
+ MOV R2,A
+ INC DPTR
+ MOVX A,@DPTR
+ MOV R3,A
+ MOV DPTR,#P_AOB
+ SETB C
+ MOVX A,@DPTR
+ SUBB A,R2
+ MOV R2,A
+ INC DPTR
+ MOVX A,@DPTR
+ INC DPTR
+ JMP uL_O_L1
+
+S_FNC15:CJNE R0,#15h,S_FNC16
+%IF (%VECTOR_FL) THEN (
+uL_WRc: JMP uL_WR
+)ELSE(
+uL_WRc: JB F0,uL_WRcR ; Zapise R45 bytu z CODE @DP
+uL_WRc1:MOV A,R4 ; Rusi R012345
+ ORL A,R5
+ JZ uL_WRcR
+ CLR A
+ MOVC A,@A+DPTR
+ CALL uL_WRB0
+ JB F0,uL_WRcR
+ DEC R4
+ CJNE R4,#-1,uL_WRc1
+ DEC R5
+ SJMP uL_WRc1
+uL_WRcR:RET
+)FI
+
+S_FNC16:CJNE R0,#16h,S_FNC17 ; abors msg
+uL_O_ABRT:PUSH DPL
+ PUSH DPH
+ JMP uL_O_ABRT1
+
+S_FNC17:
+
+S_FNC23:CJNE R0,#23h,S_FNC20
+uL_RDB: MOV R0,DPL ; Nacte byte na @DP - Rusi R0123
+ MOV R1,DPH
+ JB F0,uL_WRBE
+ MOV DPTR,#P_AID
+ MOVX A,@DPTR
+ MOV R2,A
+ INC DPTR
+ MOVX A,@DPTR
+ MOV R3,A
+ MOV DPTR,#P_EID
+ MOVX A,@DPTR
+ XRL A,R2
+ JNZ uL_RDB1
+ INC DPTR
+ MOVX A,@DPTR
+ XRL A,R3
+ JNZ uL_RDB1
+ JMP uL_WRBE
+uL_RDB1:MOV DPL,R2
+ MOV DPH,R3
+ MOVX A,@DPTR
+ MOV DPL,R0
+ MOV DPH,R1
+ MOVX @DPTR,A
+ INC R2
+ CJNE R2,#0,uL_RDB2
+ INC R3
+ MOV DPTR,#H_EIB
+ MOVX A,@DPTR
+ XRL A,R3
+ JNZ uL_RDB2
+ MOV DPTR,#H_BIB
+ MOVX A,@DPTR
+ MOV R3,A
+uL_RDB2:MOV DPTR,#P_AID
+ JMP uL_WRB4
+
+S_FNC20:CJNE R0,#20h,S_FNC21
+uL_I_OP:PUSH DPL ; Otevre vstupni zpravu : vyplni
+ PUSH DPH ; uL_ISAD,uL_IDAD,uL_ICOM,uL_IST,uL_ISTA
+ JB F0,uL_I_OR
+ MOV DPTR,#P_NPD
+ CALL S_GER23
+ CALL S_PUR23
+ INC R3
+ MOV DPTR,#P_EID
+ CALL S_PUR23
+ MOV DPTR,#uL_ISAD
+ CALL uL_RDB ; SAdr
+ MOV R4,A
+ JNB ACC.7,uL_I_OE
+ MOV DPTR,#uL_ISAD
+ ANL A,#7FH ; Odmaskuj nejvyssi bit
+ MOV R4,A ; Drive bylo se 7 bitem
+ MOVX @DPTR,A
+ MOV DPTR,#uL_IDAD ; DAdr
+ CALL uL_RDB
+ ANL A,#7FH ; Zrusit nejvyssi bit
+ MOV R7,A
+ MOV DPTR,#P_EID ; Konec dat
+ CALL uL_RDB
+ CALL uL_RDB
+ MOV DPTR,#uL_ICOM ; Command
+ CALL uL_RDB
+ MOV R5,A
+ MOV DPTR,#uL_IST ; Status
+ CALL uL_RDB
+ MOV R6,A
+ MOV DPTR,#uL_ISTA ; Stamp
+ CALL uL_RDB
+ XCH A,R7
+ MOV R3,A
+uL_I_OR:POP DPH
+ POP DPL
+ RET
+
+uL_I_OE:SETB F0
+ MOV DPTR,#P_NPD
+ CALL S_GER23
+ MOV DPTR,#P_EID
+ CALL S_PUR23
+ SJMP uL_I_OR
+
+S_FNC21:CJNE R0,#21h,S_FNC22
+uL_RD: JB F0,uL_RDR ; Nacte R45 bytu na @DP - Rusi R012345
+uL_RD1: MOV A,R4
+ ORL A,R5
+ JZ uL_RDR
+ CALL uL_RDB
+ JB F0,uL_RDR
+ DEC R4
+ CJNE R4,#-1,uL_RD1
+ DEC R5
+ SJMP uL_RD1
+uL_RDR: RET
+
+S_FNC22:CJNE R0,#22h,S_FNC24
+uL_I_CL:MOV R6,DPL ; Uzavre vstupni zpravu
+ MOV R7,DPH
+ JB F0,uL_I_CR
+ MOV DPTR,#P_EID
+ CALL S_GER23
+ MOV DPTR,#P_NPD
+ CALL S_PUR23
+uL_I_CR:MOV DPL,R6
+ MOV DPH,R7
+ RET
+
+S_FNC24:CJNE R0,#24h,S_FNC25
+uL_I_LN:MOV R0,DPL
+ MOV R1,DPH
+ MOV DPTR,#P_AID
+ MOVX A,@DPTR
+ MOV R2,A
+ INC DPTR
+ MOVX A,@DPTR
+ MOV R3,A
+ MOV DPTR,#P_EID
+ CLR C
+ MOVX A,@DPTR
+ SUBB A,R2
+ MOV R2,A
+ INC DPTR
+ MOVX A,@DPTR
+ MOV DPTR,#H_BIB
+uL_O_L1:SUBB A,R3
+ MOV R3,A
+ JNC uL_I_L1
+ MOVX A,@DPTR
+ XCH A,R3
+ CLR C
+ SUBB A,R4
+ MOV R3,A
+ INC DPTR
+ MOVX A,@DPTR
+ ADD A,R3
+ MOV R3,A
+uL_I_L1:CLR C
+ MOV A,R2
+ SUBB A,R4
+ MOV A,R3
+ SUBB A,R5
+ JNC uL_I_L3
+uL_I_L2:SETB F0
+ MOV A,R2
+ MOV R4,A
+ MOV A,R3
+ MOV R5,A
+uL_I_L3:CLR C
+ MOV DPTR,#uL_FRLN
+ MOVX A,@DPTR
+ MOV R2,A
+ SUBB A,R4
+ INC DPTR
+ MOVX A,@DPTR
+ MOV R3,A
+ SUBB A,R5
+ JC uL_I_L2
+ MOV DPL,R0
+ MOV DPH,R1
+ RET
+
+S_FNC25:CJNE R0,#25h,S_FNC26 ; pocet byte do konce zpravy (delka zpravy)
+uL_I_L: MOV R0,DPL
+ MOV R1,DPH
+ MOV DPTR,#P_AID
+ MOVX A,@DPTR
+ MOV R4,A
+ INC DPTR
+ MOVX A,@DPTR
+ MOV R5,A
+ MOV DPTR,#P_EID
+ CLR C
+ MOVX A,@DPTR
+ SUBB A,R4
+ MOV R4,A
+ INC DPTR
+ MOVX A,@DPTR
+ SUBB A,R5
+ MOV R5,A
+ JNC uL_I_LL
+ MOV DPTR,#H_BIB ; Nutna korekce cyklicnosti
+ MOVX A,@DPTR ; R5=R5+(H_EIB-H_BIB)
+ SUBB A,R5 ; R5=H_EIB-(H_BIB-R5-1)-1
+ MOV R5,A
+ INC DPTR
+ MOVX A,@DPTR ; H_EIB
+ SETB C
+ SUBB A,R5
+ MOV R5,A
+uL_I_LL:MOV DPL,R0
+ MOV DPH,R1
+ RET
+
+S_FNC26:CJNE R0,#26h,S_FNC27 ; je na vstupu zprava
+uL_I_NE:JBC uLF_INE,uL_I_N2
+uL_I_N1:CLR CY
+ RET
+uL_I_N2:MOV DPTR,#P_NPD
+ MOVX A,@DPTR
+ MOV R0,A
+ INC DPTR
+ MOVX A,@DPTR
+ MOV DPH,A
+ MOV DPL,R0
+ MOVX A,@DPTR
+ JZ uL_I_N1
+ SETB uLF_INE
+ SETB CY
+ RET
+
+S_FNC27:
+ RET
+
+; Nacte od R2 pres DP R1 registru
+LDRFDP :MOV A,PSW
+ ANL A,#018H
+ MOV R0,A
+ INC R0
+LDRFDP1:INC R0
+ MOVX A,@DPTR
+ MOV @R0,A
+ INC DPTR
+ DJNZ R1,LDRFDP1
+ RET
+
+; Ulozi od R2 pres DP R1 registru
+SVRBDP :MOV A,PSW
+ ANL A,#018H
+ MOV R0,A
+ INC R0
+S_FN3_2:INC R0
+ MOV A,@R0
+ MOVX @DPTR,A
+ INC DPTR
+ DJNZ R1,S_FN3_2
+ RET
+
+_uL_STR:
+uL_STR: JBC ES_U,uL_STRG
+ RET
+uL_STRG:JNB uLF_NA,uL_STRE
+ JNB uLF_NB,uL_STRF
+ JNB uLF_RS,uL_STRF
+ SETB TI_U
+uL_STRF:SETB uLF_NB
+uL_STRE:SETB uLF_NA
+ SETB ES_U
+ RET
+
+ END