⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pack.msa

📁 a51 令牌通讯
💻 MSA
📖 第 1 页 / 共 2 页
字号:
		MOV	R0,A
		MOV	A,#I_PACK_ST-1
		ADD	A,R0
		MOV	R0,A
		MOV	A,@R0
		ANL	A,#ACTIVE_MARK
		SETB	C
		JZ	PACK_T_RET		; error return
		MOV	A,@R0
		ANL	A,#PACK_MASK
		JNZ	PACK_T_RET		; error return
UNPACK_1:	CLR	C
PACK_T_RET:	POP	ACC
		RET

;============================== Subrouting defination =======================
;INSERT_F	insert a frame frame frame buffer into station stream buffer
;Input: 	NONE
;Output:	CY = 0 successfull, CY=1 failure

EMPT_FLAGE	=	80H

INSERT_F:	MOV	A,OLD_ST		; restore old ST_NUM
		MOV	R7,OLD_LEN		; restore old frame length
		MOV	TEMP1,A 		; save [FOF]
		JB	NO_SAVE,SAVE_OLD
		MOV	DPTR,#FRAME_BUF
		CALL	FRAME_READ
		JNC	NO_INSERT_RET
INSERT_RET1:	SETB	C			; error return
		JMP	INSERT_RET

NO_INSERT_RET:	MOV	TEMP1,A 		; save [FOF]
		ANL	A,#SOURCE
		JZ	INSERT_RET1
		CJNE	A,#0FH,INSERT_1
		JMP	INSERT_RET1

INSERT_1:	MOV	R0,#LAST_SQ-1
		ADD	A,R0
		MOV	R0,A			; R0 point to last sequence
		MOV	DPTR,#FRAME_BUF
		MOVX	A,@DPTR 		; get squence
		XRL	A,@R0
		JZ	INSERT_RET1		; same squence return
		XRL	A,@R0			; get squence
		MOV	@R0,A			; save last squence
		MOV	A,TEMP1
		CALL	PACK_TEST		; if packing not required CY=1
		JC	INSERT_RET1		; error return

SAVE_OLD:	MOV	R0,#TAIL
		MOV	A,TEMP1 		; restore [FOF]
		CALL	GET_POINTER		; get TAIL pointer in DPTR
		MOV	R5,DPH
		MOV	R4,DPL

		MOV	R0,#HEAD
		MOV	A,TEMP1 		; restore [FOF]
		CALL	GET_POINTER		; get HRAD pointer in DPTR
		MOV	R3,DPH
		MOV	R2,DPL

		CALL	SUB16			; R3.R2<=HEAD-TAIL
		JNC	NO_O_ROLLA
		CALL	CPL16
		JMP	BUF_ROLLB
NO_O_ROLLA:	MOV	A,R3
		MOV	R5,A
		MOV	A,R2
		MOV	R4,A
		MOV	R2,#LOW(STREAM_LEN)
		MOV	R3,#HIGH(STREAM_LEN)	; R3.R2 <= 1114
		CALL	SUB16			; rest length in R3.R2

BUF_ROLLB:	MOV	A,R7
		MOV	R4,A
		ADD	A,#2
		MOV	R5,#0			; R5.R4 <= frame length
		CALL	COMP16
		JNC	PBUF_USED1

		SETB	NO_SAVE 		; set no save mark
		MOV	OLD_ST,TEMP1		; restore old station [FOF]
		MOV	OLD_LEN,R7		; restore old frame length
		SETB	C
		JMP	INSERT_RET		; error return

PBUF_USED1:	MOV	A,TEMP1			; restore [FOF]
		MOVX	@DPTR,A 		; save [FOF]
		%INC_POINT ST_STREAM,STREAM_LEN,TEMP1
		MOV	A,R7
		MOVX	@DPTR,A 		; save frame length
		%INC_POINT ST_STREAM,STREAM_LEN,TEMP1

		MOV	R3,DPH
		MOV	R2,DPL
		MOV	DPH,#HIGH(FRAME_BUF)
		MOV	DPL,#LOW(FRAME_BUF)
		CALL	MOVE_XDATA		; length in R7
		MOV	A,TEMP1
		MOV	R0,#HEAD
		CALL	SAV_POINT

		MOV	R0,#STREAM_STATUS-1
		MOV	A,TEMP1 		; restore [FOF]
		ANL	A,#SOURCE
		ADD	A,R0
		MOV	R0,A			; point to STREAM_STATUS
		MOV	A,@R0			; get status
		ANL	A,#(0FFH AND NOT(EMPT_FLAGE))	; clear stream empty flage
		MOV	@R0,A
		CLR	NO_SAVE
		CLR	C			; for return

INSERT_RET:	RET

;============================== Subrouting defination =======================
;REMOVE_F	remove a frame from station stream into Package buffer
;Input: 	NONE
;Output:	CY = 0 successfull, CY=1 failure

REMOVE_RET1:	JMP	REMOVE_RET

REMOVE_F:	MOV	R0,#STREAM_STATUS-1
		MOV	A,CUR_ST
		SETB	C
		JZ	REMOVE_RET1		; no packaged station

		ADD	A,R0
		MOV	R0,A			; point to STREAM_STATUS on CUR_ST
		MOV	A,@R0			; get status
		ANL	A,#EMPT_FLAGE		; test STREAM empty flage
		SETB	C
		JNZ	REMOVE_RET1		; If empty jump

		MOV	R0,#HEAD
		MOV	A,CUR_ST
		CALL	GET_POINTER		; get TAIL pointer in DPTR
		MOV	R3,DPH
		MOV	R2,DPL

		MOV	R0,#TAIL
		MOV	A,CUR_ST
		CALL	GET_POINTER		; get TAIL pointer in DPTR
		MOV	R5,DPH
		MOV	R4,DPL
		CALL	COMP16			; R3.R2<=HEAD-TAIL
		JNZ	NOT_EMPTY

		MOV	R0,#STREAM_STATUS-1
		MOV	A,CUR_ST
		ADD	A,R0
		MOV	R0,A			; point to STREAM_STATUS on CUR_ST
		MOV	A,@R0			; get status
		ORL	A,#EMPT_FLAGE		; set STREAM empty flage
		MOV	@R0,A
		SETB	C
		JMP	REMOVE_RET

NOT_EMPTY:	PUSH	DPL
		PUSH	DPH
		%INC_POINT ST_STREAM,STREAM_LEN,CUR_ST ; DPTR point to frame length
		MOVX	A,@DPTR 		; get frame length
		ADD	A,#2
		MOV	R7,A
		POP	DPH
		POP	DPL
		MOV	R3,PACK_POINT+1
		MOV	R2,PACK_POINT+0
		CALL	MOVE_XDATA1
		MOV	A,R7
		ADD	A,PACK_LEN		; save current package length
		MOV	PACK_LEN,A
		MOV	PACK_POINT+1,R3 	; save current package pointer
		MOV	PACK_POINT+0,R2
		MOV	R3,DPH
		MOV	R2,DPL
		MOV	A,CUR_ST
		MOV	R0,#TAIL
		CALL	SAV_POINT		; save tail pointer

		CLR	C			; for return

REMOVE_RET:	RET

;============================== Subrouting defination =======================
;SAV_POINT	save 16-bit index pointer on station, 256 buffer length per ST.
;Input: 	R3.R2 = pointer to be saved
;		ACC= index num.(e.g ST_NUM)
;		R0 = base address of pointer table
;Output:	NONE

SAV_POINT:	ANL	A,#SOURCE
		DEC	A
		RL	A
		ADD	A,R0
		MOV	R0,A
		MOV	A,R2
		MOV	@R0,A
		INC	R0
		MOV	A,R3
		MOV	@R0,A
		RET

;============================== Subrouting defination =======================
;GET_POINTER	get 16-bit index pointer on station, 256 buffer length per ST.
;Input: 	ACC= index num.(e.g ST_NUM)
;		R0 = base address of pointer table
;Output:	DPTR = pointer

GET_POINTER:	ANL	A,#SOURCE
		DEC	A
		RL	A
		ADD	A,R0
		MOV	R0,A
		MOV	DPL,@R0
		INC	R0
		MOV	DPH,@R0
		RET

;============================== Subrouting defination =======================
;FIRST_ST	find first station in station table
;Input: 	NONE
;Output:	NONE

FIRST_ST:	MOV	R0,#I_PACK_ST
		MOV	R7,#MAX_ST
FIRST_LOOP:	MOV	A,@R0			; get station num. from table
		ANL	A,#SOURCE
		JZ	NEXT_ONE1
		MOV	A,@R0
		ANL	A,#ACTIVE_MARK
		JZ	NEXT_ONE1		; not active jump
		MOV	A,@R0
		JB	UNPACK_MK,NEXT_ONE2	; if no packing jump
		ANL	A,#PACK_MASK
		JZ	NEXT_ONE2		; find next station
NEXT_ONE1:	INC	R0			; no pacging station
		DJNZ	R7,FIRST_LOOP		; find	next one
		MOV	CUR_ST,#0		; no packaged station on net
		JMP	FIRST_RET

NEXT_ONE2:	MOV	A,@R0
		ANL	A,#SOURCE
		MOV	CUR_ST,A
		MOV	PACK_POINT+1,#HIGH(PACK_BUF+1)
		MOV	PACK_POINT+0,#LOW(PACK_BUF+1) ; reset package pointer
FIRST_RET:	RET

;============================== Subrouting defination =======================
;NEXT_ST	find source station on ACC low nibble
;Input: 	CUR_ST
;Output:	CY = 1 find: CUR_ST= current station;
;		CY=0 not find: CUR_ST = first station.

MAX_ST		=	0EH
NEXT_ST:	MOV	A,#MAX_ST
		MOV	R7,CUR_ST
		CLR	C
		SUBB	A,R7
		JNZ	PACK_NOT_END
FIND_FIRST:	CALL	FIRST_ST		; CUR_ST <= first station
UNPACK_RET:	CLR	C
		MOV	PACK_POINT+1,#HIGH(PACK_BUF+1)
		MOV	PACK_POINT+0,#LOW(PACK_BUF+1) ; reset package pointer
		JMP	NEXT_ST_RET

PACK_NOT_END:	MOV	R7,A			; rest stations
		MOV	A,CUR_ST

		MOV	R0,#I_PACK_ST-1+1
		ADD	A,R0
		MOV	R0,A
NEXT_LOOP:	MOV	A,@R0			; get station num. from table
		ANL	A,#SOURCE
		JZ	NO_NEXT
		MOV	A,@R0
		ANL	A,#ACTIVE_MARK
		JZ	NO_NEXT 		; not active jump
		JNB	UNPACK_MK,NEXT_PACK	; if packing jump
		CALL	NEXT_ONE
		JMP	UNPACK_RET

NEXT_PACK:	MOV	A,@R0
		ANL	A,#PACK_MASK
		JZ	NEXT_ONE		; find next station
NO_NEXT:	INC	R0			; no pacging station
		DJNZ	R7,NEXT_LOOP		; find	next one
		JMP	FIND_FIRST

NEXT_ONE:	MOV	A,@R0
		ANL	A,#SOURCE
		MOV	CUR_ST,A
		SETB	C
NEXT_ST_RET:	RET

;============================== Subrouting defination =====================

;FRAME_OUT:	send a frame from DP_RAM buffer into net buffer
;Input: 	none
;Output:	C=0 successfull , C=1 failure( no data in buffer )
;		Modify pointer IN_BUF_REM

FRAME_OUT:	%TEST_FLAG IN_BUF_EMPT
		JNC	FRAME_OUT1
		JMP	FRAME_OUT_RET

FRAME_OUT1:	MOV	DPTR,#IN_BUF_INS
		MOVX	A,@DPTR
		MOV	R2,A
		INC	DPTR
		MOVX	A,@DPTR
		MOV	R3,A			; R3.R2 <= input buffer insert pointer
		MOV	DPTR,#IN_BUF_INS
		MOVX	A,@DPTR
		MOV	R4,A
		INC	DPTR
		MOVX	A,@DPTR
		MOV	R5,A			; R5.R4 <= input buffer insert pointer
		CALL	COMP16
		JNZ	FRAME_OUT1

		MOV	DPTR,#IN_BUF_REM
		MOVX	A,@DPTR
		MOV	R2,A
		INC	DPTR
		MOVX	A,@DPTR
		MOV	R3,A			; R3.R2 <= input buffer remove pointer
		CALL	COMP16
		JNZ	FRAME_OUT2		; output buffer not empty
		%MOVXB	IN_BUF_EMPT,TRUTH
		JMP	FRAME_OUT_RET		; output buffer empty

FRAME_OUT2:	MOV	DPH,R3
		MOV	DPL,R2			; DPTR <= input buffer remove pointer
		MOVX	A,@DPTR 		; get [FOF]
		PUSH	ACC			; save [FOF]
		%INC_DPTR INPUT_BUFFER,IBUF_LENGTH
		MOVX	A,@DPTR 		; get length
		MOV	R7,A
		%INC_DPTR INPUT_BUFFER,IBUF_LENGTH
		POP	ACC			; restore [FOF]
		CALL	FRAME_WRITE
		JC	FRAME_OUT_RET		; if error jump

		MOV	R3,DPH
		MOV	R2,DPL			; modify the pointer
		MOV	DPTR,#IN_BUF_REM
		MOV	A,R2
		MOVX	@DPTR,A
		INC	DPTR
		MOV	A,R3
		MOVX	@DPTR,A 		; modify output buffer pointer

FRAME_OUT_RET:	%MOVXB	IN_BUF_FULL,FALS	; set input buffer not full
		%TEST_FLAG IN_BUF_EMPT		; testing output buffer full flag
		RET

;=================================== Main Program ===========================

MAIN:		CALL	CARD_INIT		; initialize card
		CALL	INIT_PACK_ST		; initialize package table

PACK_INIT:	CALL	REST_PACK_ST		; copy package staiton list
						; from COMM51 IRAM into DPRAM
		CALL	COPY_PACK_ST		; copy package staiton list
		%MOVXW	NET_COMMAND,READY	; card initialized OK
		CALL	FIRST_ST		; find first station

MAIN_LOOP:	CALL	INSERT_F		; insert a frame into stream
		JB	PACK_FULL,PACK_COMM
		CALL	REMOVE_F		; remove a frame from stream
						; into package buffer
		JC	NO_DATA 		; if no data decode PC command
		CALL	NEXT_ST 		; for packing next station
		JC	COMMAND_DECODE		; package not done

PACK_COMM:	MOV	DPTR,#PACK_BUF		; reset package pointer
		MOV	A,PACK_LEN
		MOVX	@DPTR,A 		; store package length
		SETB	PACK_FULL		; set package full mark
		CALL	PACK_DONE		; move package from pack-buff into DP_RAM
		MOV	PACK_FULL,C		; if success clear mark
		JC	COMMAND_DECODE
		MOV	PACK_LEN,#0		; reset package legnth

COMMAND_DECODE: MOV	DPTR,#NET_COMMAND
		MOVX	A,@DPTR 		; ACC <= command
		INC	DPTR			; point to parameter
		CJNE	A,#NULL,COMMAND_NEXT1
		JMP	MAIN_END

NO_DATA:	JNB	UNPACK_MK,COMMAND_DECODE
		CALL	NEXT_ST
		JMP	COMMAND_DECODE

COMMAND_NEXT1:	CJNE	A,#INSERT,COMMAND_NEXT2
		MOVX	A,@DPTR 		; get parameter
		PUSH	ACC
		MOV	B,A
		ANL	A,#0F0H
		JZ	INSERT_OLD
		ANL	A,#PACK_MASK
		CPL	A
		XCH	A,B
		ANL	A,#SOURCE
		MOV	DPTR,#PACK_ST
		DEC	A
		ADD	A,DPL
		MOV	DPL,A
		CLR	A
		ADDC	A,DPH
		MOV	DPH,A
		MOVX	A,@DPTR
		ANL	A,B
		MOVX	@DPTR,A

INSERT_OLD:	POP	ACC
		ANL	A,#SOURCE
		CALL	ST_INSERT

ST_INS_REM:	%MOVXW	NET_COMMAND,READY	; card initialized OK
		JMP	PACK_INIT

COMMAND_NEXT2:	CJNE	A,#RESTART,COMMAND_NEXT3
		CALL	ST_RESET
		JMP	MAIN_END

COMMAND_NEXT3:	CJNE	A,#PACK_SWITCH,COMMAND_NEXT4 ; no defination now
		CPL	UNPACK_MK
		%MOVXW	NET_COMMAND,READY	; card initialized OK
		JMP	PACK_INIT

COMMAND_NEXT4:	CJNE	A,#REMOVE,COMMAND_NEXT5
		MOVX	A,@DPTR 		; get parameter
		MOV	B,A
		ANL	A,#0F0H
		JZ	REMOVE_OLD
		ANL	A,#PACK_MASK
		XCH	A,B
		ANL	A,#SOURCE
		MOV	DPTR,#PACK_ST
		DEC	A
		ADD	A,DPL
		MOV	DPL,A
		CLR	A
		ADDC	A,DPH
		MOV	DPH,A
		MOVX	A,@DPTR
		ORL	A,B
		MOVX	@DPTR,A
		SJMP	ST_INS_REM

REMOVE_OLD:	XCH	A,B
		ANL	A,#SOURCE
		CALL	ST_REMOVE
		SJMP	ST_INS_REM

COMMAND_NEXT5:	MOV	B,A
		SWAP	A
		XRL	A,B
		JNZ	MAIN_END
		%MOVXW	NET_COMMAND,READY	; clear all command format word [C C]

MAIN_END:	CALL	FRAME_OUT		; if there is data in DP_RAM
						; send out
		CALL	GET_STATUS
		MOV	DPTR,#NET_STATUS+0
		MOVX	@DPTR,A 		; Output net status to DR_RAM
						; from IRAM into DPRAM
		%MOVXW	CARD_ID,MY_ID
		CALL	REST_PACK_ST		; copy package staiton list
		JMP	MAIN_LOOP

;============================== Interrupt sevice defination =================
E_INT0: 	NOP
		RETI
;============================== Interrupt sevice defination =================
E_INT1: 	NOP
		RETI
;============================== Interrupt sevice defination =================
TIMER_0:	NOP
		RETI
;============================== Interrupt sevice defination =================
TIMER_1:	NOP
		RETI

		END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -