📄 sqcomm51.msa
字号:
RET
;============================== Subrouting defination ============================
;ST_INSERT: insert a station from net.
;Input ACC [XXXXssss] ssss is the address of station to be inserted
;Output none
ST_INSERT: MOV MODIFY_ADDR,A
ANL A,#SOURCE
MOV R0,#ALL_STATION
ADD A,R0
MOV R0,A
MOV A,@R0
ORL A,#80H ; active soource station
MOV @R0,A
SETB INSERT_MK
RET
;============================== Subrouting defination ============================
;SYS_SYNCHRO system to be synchronized
;Input ACC [XXXXssss] ssss is the address of station send command
;Output none
SYS_SYNCHRO: SETB SYNCHRO_MK
SETB USER_SYN
RET
;============================== Subrouting defination ============================
;ST_RESET: resett all station in net.
;Input ACC [XXXXssss] ssss is the address of station to be inserted
;Output none
ST_RESET: SETB RESET_MK
RET
;============================== Subrouting defination ============================
;NET_HELLO: first call from lowest address station
;Input none
;Output none
NET_HELLO: JNB TOKEN,NET_H_RET ; no token return
MOV A,#HELLO
CALL NET_COMMAND
NET_H_RET: RET
;============================== Subrouting defination ============================
;FIND_ACTIVE: Initial network
;Input none
;Output CY=0 find, CY=1 not find, ACC= first active station address
FIND_ACTIVE MOV R0,#ALL_STATION
MOV R7,#15
FIND_LOOP: MOV A,@R0
MOV C,ACC.7
ANL A,#SOURCE
JC FIND_RET
INC R0
DJNZ R7,FIND_LOOP
FIND_RET: RET
;============================== Subrouting defination ============================
;NET_INIT: Initial network
;Input none
;Output none
NET_INIT: SETB IN_BUF_EMPT
SETB OUT_BUF_EMPT ; tow buffers empty now
SETB TOKEN_ACK
SETB DATA_ACK
CALL MY_DELAY ; Station delay
JB FIRST_TOKEN,HELLOED ; if not first token station jump
POWER_ON_OK: CJNE A,#ST_NO0,NOT_ST0
SJMP HELLOED
NOT_ST0: SETB TOKEN ; Make token
CLR TOKEN_ACK ; set no token ACK mark
CALL NET_HELLO ; make first calling
CALL NET_HELLO ; once more
CALL NET_HELLO ; once more again
HELLOED: MOV A,ST_ADDR ; get my address
CALL NET_INSERT ; insert my station into network
MOV A,ST_ADDR ; get my address
CALL NET_INSERT ; insert my station once more
MOV A,ST_ADDR ; get my address
CALL NET_INSERT ; insert my station once more again
CALL MY_DELAY1 ; delay for hello
MOV A,ST_ADDR ; Get address in ACC
CALL NEXT_TOKEN ; find next station token to be passed
CALL MAKE_ACK_FRAME
CALL RESET_TIMER2
SETB TR2 ; Turn the timer2 on
SETB NET_GOOD ; net initialization completed
RET
;============================== Subrouting defination ============================
;NET_OUT_TEXT: counter the string length and write to nwtwork
;Input: DPTR point to start of string ( MAX. length is 253 )
; ending by 00H
; ACC=FOF [dest.0000] or [0000.dest] or [dest.dest]
;Output: C=0 successfull , C=1 failure( no data in buffer )
; Modify pointer INS_BO
;Invoke: FRAME_WRITE
NET_OUT_TEXT: PUSH DPH
PUSH DPL
PUSH ACC
MOV R7,#0 ; clear counter
TEXT_LOOP: CLR A
MOVC A,@A+DPTR
JZ END_TEXT
INC R7
INC DPTR
SJMP TEXT_LOOP
END_TEXT: POP ACC
POP DPL
POP DPH
CALL FRAME_WRITE
RET
;============================== Subrouting defination ============================
;GET_STATUS: return net ststua
;Input none
;Output ACC.7 = 1 : net line failure
; ACC.6 = 1 : no data ACK
; ACC.5 = 1 : no destinatin station
; ACC.4 = 1 : receiving out of time
; ACC.3 = 1 : input buffer full
; ACC.2 = 1 : input buffer empty
; ACC.1 = 1 : output buffer full
; ACC.0 = 1 : output buffer empty
GET_STATUS: MOV C,NET_LINE_ERR
MOV ACC.7,C
MOV C,DATA_ACK
MOV ACC.6,C
MOV C,NO_DEST_ST
MOV ACC.5,C
MOV C,R_OUT_TIME
MOV ACC.4,C
MOV C,IN_BUF_FULL
MOV ACC.3,C
MOV C,IN_BUF_EMPT
MOV ACC.2,C
MOV C,OUT_BUF_FULL
MOV ACC.1,C
MOV C,OUT_BUF_EMPT
MOV ACC.0,C
RET
;============================== Subrouting defination ============================
;NEXT_TOKEN: Find next station TOKEN to be passed
;Input: none
;Output: none
NEXT_TOKEN: MOV A,ST_ADDR
ANL A,#SOURCE
ADD A,#ALL_STATION
MOV R0,A
MOV R7,#15 ; other 15 stations
NEXT_FIND: INC R0 ; pointe to next station
MOV A,R0
CJNE A,#ALL_STATION+16,ADDR_OVER
MOV R0,#ALL_STATION
ADDR_OVER: MOV A,@R0
JB ACC.7,FIND_STATION ; if station active
DJNZ R7,NEXT_FIND
MOV A,ST_ADDR ; there is one station only
FIND_STATION: ANL A,#SOURCE
SWAP A
MOV NEXT_ADDR,A ; save next station token to be passed
CALL MAKE_TOKEN_F ; make token frame
RET
;============================== Interrupt sevice defination ============================
SERIAL: PUSH PSW
PUSH ACC
PUSH DPH
PUSH DPL
SETB RS0
CLR RS1 ; Use REG. bank 1
CALL SERIAL_READ ; Get a hardwire frame into buf.
JNC ADDRESS_OK ; address match jump
JNB NET_GOOD,SERIAL_RET2
JMP NORMAL_RET ; address not match jump
SERIAL_RET2: JNZ NORMAL_RET1
JB R_OUT_TIME,NORMAL_RET1
MOV A,R4
SWAP A
XRL A,R4
JNZ NORMAL_RET1
MOV A,R6 ; ACC <= FOF
ANL A,#SOURCE ; get sourcer address
MOV R6,A ; save source address
ADD A,#ALL_STATION
MOV R0,A
MOV A,R4
MOV R4,#0
CJNE A,#TOKEN_PASSING,NO_TOKEN1
SJMP ST_ACTIVE
NO_TOKEN1: CJNE A,#DATA,OT_TOKEN
ST_ACTIVE: MOV R4,#ACTIVE
OT_TOKEN: MOV A,R6 ; restore source address
ORL A,R4
MOV @R0,A ; save active station in table
NORMAL_RET1: JMP NORMAL_RET
ADDRESS_OK: JZ RECEIVE_RIGHT
SEND_RRJ: MOV A,R6
ANL A,#DEST
XRL A,#DEST
JNZ SEND_RRJ1
JMP NORMAL_RET ; if global address return
SEND_RRJ1: MOV DPTR,#FRAME_REJECT ; check sum bad
MOV A,R6
ANL A,#SOURCE
SWAP A
MOV R6,A
MOV A,ST_ADDR
ANL A,#SOURCE
ORL A,R6
MOVX @DPTR,A
JMP SERIAL_OUT ; for receiving retransmition
RECEIVE_RIGHT: MOV A,R4 ; ACC <= control byte
SWAP A
XRL A,R4
JNZ SEND_RRJ ; a ivalide control byte
MOV A,#SOURCE
ANL A,R4
MOV R4,A
ADD A,ACC
ADD A,R4 ; for index a long jump
MOV DPTR,#COMMAND_DECODE
JMP @A+DPTR
NO_DATA_F: JMP NORMAL_RET
DATA_F: CLR IN_BUF_EMPT ; Buffer id not empty (in used)
;@@ JB IN_BUF_FULL,SEND_RRJ
JB IN_BUF_FULL,RECEIVE_ACK
MOV R3,INS_BI+1
MOV R2,INS_BI+0
MOV R5,REM_BI+1
MOV R4,REM_BI+0
CALL SUB16 ; R3.R2 <= insert - remove
JNC NO_OVER_ROLL
CALL CPL16
JMP BUF_ROL2
NO_OVER_ROLL: MOV A,R3
MOV R5,A
MOV A,R2
MOV R4,A
MOV R3,#HIGH(BI_LENGTH*BIF_NUM)
MOV R2,#LOW(BI_LENGTH*BIF_NUM)
CALL SUB16
BUF_ROL2: MOV A,R3
JNZ RECEIVE_ACK ; for next frmae jump
SETB IN_BUF_FULL ; Buffer active room not enough
;@@ JMP SEND_RRJ
;@@ JMP NORMAL_RET
RECEIVE_ACK: MOV DPTR,#FRAME_RRDY ; receive ready
MOV A,R6
ANL A,#SOURCE
SWAP A
MOV R6,A
MOV A,ST_ADDR
ANL A,#SOURCE
ORL A,R6
MOVX @DPTR,A
JMP SERIAL_OUT
TOKEN_PASS_F: MOV SEND_TIMES,#0
SETB TOKEN
MOV A,R6
ANL A,#SOURCE
SWAP A
MOV R6,A
MOV A,ST_ADDR
ANL A,#SOURCE
ORL A,R6
MOV DPTR,#FRAME_T_ACK
MOVX @DPTR,A
CALL SERIAL_WRITE ; send receiving TOKEN ACK
CALL RESET_TIMER2
JBC REMOVE_MK,REMOVE_ONE
JBC INSERT_MK,INSERT_ONE
JBC RESET_MK,RESET_ONE
DATA_F_OUT: JBC SYNCHRO_MK,SYN_ALL
JB DATA_ACK,DATA_FRAME_O ; if there is ACK jump
JMP SENDING ; if there is no ACK. retry
SYN_ALL: MOV A,MODIFY_ADDR
CALL SYS_SYN
MOV A,MODIFY_ADDR
CALL SYS_SYN
JMP DATA_F_OUT
REMOVE_ONE: MOV A,MODIFY_ADDR ; other station address
CALL NET_REMOVE
MOV A,MODIFY_ADDR ; other station address
CALL NET_REMOVE
MOV A,MODIFY_ADDR ; other station address
CALL NET_REMOVE
JMP DATA_F_OUT
INSERT_ONE: MOV A,MODIFY_ADDR ; other station address
CALL NET_INSERT
MOV A,MODIFY_ADDR ; other station address
CALL NET_INSERT
MOV A,MODIFY_ADDR ; other station address
CALL NET_INSERT
JMP DATA_F_OUT
RESET_ONE: MOV A,#RESTART
CALL NET_COMMAND
MOV A,#RESTART
CALL NET_COMMAND
JMP RESTART_F
DATA_FRAME_O: INC SEND_TIMES
MOV A,SEND_TIMES
CJNE A,#MAX_SEND,SEND_DATA
DEC SEND_TIMES
SETB DATA_ACK
JMP TOKEN_PASSED
SEND_DATA: MOV A,ST_ADDR
ANL A,#SOURCE
ADD A,#ALL_STATION
MOV R0,A
MOV A,@R0 ; get my active mark adn address
JB ACC.7,ACTIVE_ONE ; if station active jump
JMP NORMAL_RET
ACTIVE_ONE: CALL FRAME_OUT ; read data frame from output buffer
; and write into frame buffer
JNC SENDING ; sending data
TOKEN_PASSED: CLR TOKEN
CLR TOKEN_ACK ; no token ACL mark
SETB TOKEN_RETRY_MK
JNB FIRST_TOKEN,NORMAL_RET ; if first station return
MOV DPTR,#FRAME_TOKEN ; token passing
SJMP SERIAL_OUT ; passing token only
REJECT_F: JNB DATA_ACK,SENDING
JNB TOKEN_ACK,TOKEN_PASSED
JMP NORMAL_RET
RRDY_F: SETB DATA_ACK
MOV RETRY_D,#0 ; clrear retry counter
JNB TOKEN,NORMAL_RET ; if no token jump
SJMP DATA_FRAME_O
INSERT_F: MOV A,R6 ; ACC <= FOF
ANL A,#SOURCE ; get sourcer address
MOV R7,A ; save source address
ADD A,#ALL_STATION
MOV R0,A
MOV A,R7 ; restore source address
ORL A,#ACTIVE
MOV @R0,A ; save active station in table
CALL NEXT_TOKEN ; modify next station addres
SJMP NORMAL_RET
REMOVE_F: MOV A,R6 ; ACC <= FOF
ANL A,#SOURCE ; get sourcer address
MOV R7,A ; save sourcer address
ADD A,#ALL_STATION
MOV R0,A
MOV A,R7 ; restore source address
MOV @R0,A ; save disactive station in table
CALL NEXT_TOKEN ; modify next station addres
SJMP NORMAL_RET
RESTART_F: CLR A ; disable interrupt all
MOV IE,A
MOV IP,A
MOV P1,#0FFH
MOV TMOD,A
MOV TCON,A
MOV T2CON,A
MOV SCON,A
MOV PCON,A
MOV PSW,A
;; MOV SP,#7
MOV DPTR,#RESTART1
PUSH DPL
PUSH DPH
RETI
RESTART1: MOV DPTR,#RESET
PUSH DPL
PUSH DPH
RETI
HELLO_F: JB NET_GOOD,NORMAL_RET
CLR TOKEN
SETB FIRST_TOKEN ; has been helloed
SJMP NORMAL_RET
TOKEN_RRDY_F: SETB TOKEN_ACK ; token passing ACK
MOV TOKEN_GENERATOR,#0
MOV RETRY_T,#0
JMP NORMAL_RET
TEST_BB_OUT_F JMP NORMAL_RET ; unknow command rejection
; ...
; ...
SENDING: MOV DPTR,#FRAME_BUFFER ; point to out buffer
CLR DATA_ACK
SERIAL_OUT: CALL SERIAL_WRITE ; Acknowledge rejection
NORMAL_RET: POP DPL
POP DPH
POP ACC
POP PSW
SERIAL_RET: RETI
COMMAND_DECODE: LJMP NO_DATA_F
LJMP RRDY_F
LJMP REJECT_F
LJMP INSERT_F
LJMP REMOVE_F
LJMP TOKEN_PASS_F
LJMP DATA_F
LJMP RESTART_F
LJMP HELLO_F
LJMP SYNCHRONIZE_F
LJMP TOKEN_RRDY_F
LJMP TEST_BB_OUT_F
LJMP NO_COMMAND2_F
LJMP NO_COMMAND3_F
LJMP NO_COMMAND4_F
LJMP NO_COMMAND5_F
SYNCHRONIZE_F: SETB USER_SYN ; set system synchronize mark
JMP NORMAL_RET
NO_COMMAND2_F:
NO_COMMAND3_F:
NO_COMMAND4_F:
NO_COMMAND5_F: JMP NORMAL_RET
;============================== Interrupt sevice defination ======================
TIMER_2: CLR TF2 ;reset timer2 interrupt
PUSH PSW
PUSH ACC
PUSH DPH
PUSH DPL
SETB RS0
SETB RS1 ; use REG. bank3
JBC REMOVE_MK,REMOVE_ONE1
JBC INSERT_MK,INSERT_ONE1
JBC RESET_MK,RESET_ONE1
JBC SYNCHRO_MK,SYN_ALL1
MOV A,ST_ADDR
ANL A,#SOURCE
ADD A,#ALL_STATION
MOV R0,A
MOV A,@R0 ; get my active mark adn address
JNB ACC.7,OUT_TIME_RET ; if station disactive return
JNB TOKEN_ACK,ONLY_PASS_T ; no token ACK pass token again
JNB DATA_ACK,ONLY_RRJ ; if no ACK return
ONLY_PASS_T: JB TOKEN_RETRY_MK,ONLY_PASS_T1
MOV A,ST_ADDR
ANL A,#SOURCE
ADD A,#2
INC TOKEN_GENERATOR
CJNE A,TOKEN_GENERATOR,OUT_TIME_RET
MOV TOKEN_GENERATOR,#0
; MOV A,#MAX_RETRY_T
; INC RETRY_T
; CJNE A,RETRY_T,ONLY_PASS_T
; MOV RETRY_T,#0
; MOV A,NEXT_ADDR ; get next station address
; SWAP A
; CALL NET_REMOVE ; remove the station token to be passed
; CLR TOKEN_RETRY_MK
ONLY_PASS_T1: JB FIRST_TOKEN,OUT_TIME_RET; if not first token jump
CLR TOKEN_RETRY_MK
MOV DPTR,#FRAME_TOKEN ; token passing
JMP OUT_TIME_SEND
SYN_ALL1: MOV A,MODIFY_ADDR
CALL SYS_SYN
MOV A,MODIFY_ADDR
CALL SYS_SYN
JMP OUT_TIME_RET
REMOVE_ONE1: MOV A,MODIFY_ADDR ; other station address
CALL NET_REMOVE
MOV A,MODIFY_ADDR ; other station address
CALL NET_REMOVE
MOV A,MODIFY_ADDR ; other station address
CALL NET_REMOVE
JMP OUT_TIME_RET
INSERT_ONE1: MOV A,MODIFY_ADDR ; other station address
CALL NET_INSERT
MOV A,MODIFY_ADDR ; other station address
CALL NET_INSERT
MOV A,MODIFY_ADDR ; other station address
CALL NET_INSERT
JMP OUT_TIME_RET
RESET_ONE1: MOV A,#RESTART
CALL NET_COMMAND
MOV A,#RESTART
CALL NET_COMMAND
JMP RESTART_F
ONLY_RRJ: INC RETRY_D ; increace retry times
MOV A,RETRY_D
CJNE A,#MAX_RETRY_D,RETRY_AGAIN
MOV RETRY_D,#0
SETB DATA_ACK ; set ACK ok
RETRY_AGAIN: MOV DPTR,#FRAME_BUFFER ; point to out buffer
OUT_TIME_SEND: CALL SERIAL_WRITE
OUT_TIME_RET: POP DPL
POP DPH
POP ACC
POP PSW
RETI
;================================= Main program ==================================
START: %DISABLE_TXD ; Disable bit bus output
MOV A,SP
XRL A,#07H
MOV R7,A ; save reset status
; R7 = 0 : hardware reset
; R7 <> 0: software reset
MOV SP,#Istack_begin ; From low to high addresses
; MOV R0,#STK_BOTTOM-1
MOV R0,#Istack_begin
CALL CLR_IRAM ; Clear the on-chip ram from 20 to stktop
CALL SYS_INIT ; Initialize MCS_51 for system
CALL NET_INIT ; Initialize network for system
JMP MAIN
FRAME_REJECT_K DB 0FFH
DB REJECT ; reject command byte
FRAME_RRDY_K DB 0FFH
DB RRDY ; receive ready command byte
FRAME_T_ACK_K DB 0FFH
DB TOKEN_RRDY ; token passing ACK
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -