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

📄 pack.msa

📁 a51 令牌通讯
💻 MSA
📖 第 1 页 / 共 2 页
字号:

$COMM51.INC

FRAME_SIZE	=	256
PACK_SIZE	=	256
READY		=	0000H
NO_READY	=	5AA5H
MY_ID		=	0A55AH
MAX_PACK	=	14			; MAX. number of stations per package
TRUTH		=	0
FALS		=	0FFH
BUF_START	=	30H
OBUF_LENGTH	=	7 * 1024
IBUF_LENGTH	=	1 * 1024 - BUF_START	; packing datas received

ACTIVE_MARK	=	80H
PACK_MASK	=	40H

NULL		=	00H			; no valid data or command
INSERT		=	33H			; insert a station
REMOVE		=	44H			; remove a station
PACK_SWITCH	=	55H			; flip_flop switch on package format
RESTART 	=	77H			; CPU restart
SYNCHRONIZE	=	99H			; synchronize system

;============================================================================

		RSEG	BIT(0)
NO_SAVE 	DS	1			; 1:means frame data not saved
PACK_FULL	DS	1			; 1:means package buffer full
UNPACK_MK	DS	1			; 1:means unpackage format


;============================================================================

		RSEG	IDATA(0)
CUR_ST		DS	1			; current station
CUR_F_LEN	DS	1			; current frame length
STATION 	DS	1
FRAME_LEN	DS	1
OLD_ST		DS	1			; save station num. if no saving
OLD_LEN 	DS	1			; save frame_legth if no saving
PACK_LEN	DS	1			; current package length
PACK_POINT	DS	2			; pointer for package buffer
TEMP1		DS	1
TEMPW1		DS	2
TEMPW2		DS	2
I_PACK_ST	DS	MAX_PACK		; copy PACK_ST into IRAM
LAST_SQ 	DS	MAX_PACK		; save last frame sequence
STREAM_STATUS	DS	MAX_PACK		; package buffer status
						; [ F E XXXXXX]
						; F=1: buffer full flage
						; E=1: buffer empty flage
						; XXXXXX: last 6-bit of sequence

		RSEG	INDEX(0)		; I_RAM index addressing
HEAD		DS	MAX_PACK * 2		; frame head pointers low byte
TAIL		DS	MAX_PACK * 2		; frame tail pointers low byte

;============================================================================

STREAM_LEN	=	1114
		RSEG	UDATA(0)
FRAME_BUF	DS	FRAME_SIZE
PACK_BUF	DS	PACK_SIZE
ST_STREAM	DS	STREAM_LEN * MAX_PACK	; for package buffer
						; FRAME_SIZE = 256 only !

;============================================================================

		RSEG	DP_RAM(0)		; dual-port XRAM
;					 Offset
DPRAM_START:
CARD_ID 	DS	2		; 00H	; always A55A

NET_STATUS	DS	2		; 02H	; Bit0 = 1: output buffer(51net) empty
						; Bit1 = 1: output buffer(51net) full
						; Bit2 = 1: input buffer(51net) empty
						; Bit3 = 1: input buffer(51net) full
						; Bit4 = 1: receiving out of time
						; Bit5 = 1: no destinatin station
						; Bit6 = 1: no data ACK
						; Bit7 = 1: net line failure
						; Bit8 ~ Bit15: Reserved

IN_BUF_INS	DS	2		; 04H	; input buffer insert pointer
IN_BUF_REM	DS	2		; 06H	; input buffer remove pointer
OUT_BUF_INS	DS	2		; 08H	; output buffer insert pointer
OUT_BUF_REM	DS	2		; 0AH	; output buffer remove pointer
IN_BUF_FULL	DS	1		; 0CH	; input buffer full flag (0:true)
IN_BUF_EMPT	DS	1		; 0DH	; input buffer empty flag (0:true)
OUT_BUF_FULL	DS	1		; 0EH	; output buffer full flag (0:true)
OUT_BUF_EMPT	DS	1		; 0FH	; output buffer empty flag (0:true)
IN_BUF_LENGTH	DS	2		; 10H	; input buffer length defination
OUT_BUF_LENGTH	DS	2		; 12H	; output buffer length defination
DPRAM_BASE_ADDR DS	2		; 14H	; dual-port RAM base address
PACK_ST 	DS	MAX_PACK	; 16H	; station address table for
NET_COMMAND	DS	2		; 24H	; net command from PC to 51net
						; Comm51_card ID (5AA5), When
						; PC initialized, the word will
						; be modified to (A55A) by PC

						; NULL=00H    No Order
						; INSERT=33H  insert a station
						; REMOVE=44H  remove a station
						; RESTART=77H CPU restart
						; high order is the parameter
						; 51 always write NULL(00) to
						; low byte of this word when
						; command is completed
						; PC write to the command only
						; when command byte is NULL(00)
					; 26H	; reserved
RESERVED	DS	BUF_START-(18H+MAX_PACK)
OUTPUT_BUFFER	DS	OBUF_LENGTH	; 30H
INPUT_BUFFER	DS	IBUF_LENGTH	; 1C30H

;================================== User level program ======================

MY_ADDRESS	=	ST_NO0

;============================== Macro defination ============================

;Macro %MOVXB
		MACRO	%MOVXB
		PUSH	ACC
		PUSH	DPL
		PUSH	DPH
		MOV	DPTR,#\0
		MOV	A,#\1
		MOVX	@DPTR,A
		POP	DPH
		POP	DPL
		POP	ACC
		ENDMAC

;============================== Macro defination ============================

;Macro %MOVXW
		MACRO	%MOVXW
		PUSH	ACC
		PUSH	DPL
		PUSH	DPH
		MOV	DPTR,#\0
		MOV	A,#LOW(\1)
		MOVX	@DPTR,A
		INC	DPTR
		MOV	A,#HIGH(\1)
		MOVX	@DPTR,A
		POP	DPH
		POP	DPL
		POP	ACC
		ENDMAC

;============================== Macro defination ============================

;Macro %INC_POINT increace pointer in huge circul buffers
; base , length , index
		MACRO	%INC_POINT
		PUSH	ACC
		MOV	A,\2
		ANL	A,#SOURCE
		DEC	A
		MOV	B,#LOW(\1)
		MUL	AB
		MOV	TEMPW1+1,B
		MOV	TEMPW1+0,A

		MOV	A,\2
		ANL	A,#SOURCE
		DEC	A
		MOV	B,#HIGH(\1)
		MUL	AB
		ADD	A,TEMPW1+1
		MOV	TEMPW1+1,A

		MOV	A,#LOW(\0)
		ADD	A,TEMPW1+0
		MOV	TEMPW1+0,A
		MOV	A,#HIGH(\0)
		ADDC	A,TEMPW1+1
		MOV	TEMPW1+1,A

		MOV	A,#LOW(\1)
		ADD	A,TEMPW1+0
		MOV	TEMPW2+0,A
		MOV	A,#HIGH(\1)
		ADDC	A,TEMPW1+1
		MOV	TEMPW2+1,A

		INC	DPTR
		MOV	A,DPH
		CJNE	A,TEMPW2+1,NO_EQU\@
		MOV	A,DPL
		CJNE	A,TEMPW2+0,NO_EQU\.
		MOV	DPH,TEMPW1+1		; Modify pointer to start addr.
		MOV	DPL,TEMPW1+0
NO_EQU\<:	POP	ACC
		ENDMAC

;============================== Macro defination ============================

;Macro %INC_DPTR increace pointer in circul buffer
		MACRO	%INC_DPTR
		PUSH	ACC
		INC	DPTR
		MOV	A,DPH
		CJNE	A,#HIGH(\0+\1),NO_EQU\@
		MOV	A,DPL
		CJNE	A,#LOW(\0+\1),NO_EQU\.
		MOV	DPTR,#\0		; Modify pointer to start addr.
NO_EQU\<:	POP	ACC
		ENDMAC

;============================== Macro defination ============================

;Macro %TEST_FLAG test flag, if true CY=1 else CY=0
		MACRO	%TEST_FLAG
		PUSH	ACC
		PUSH	DPL
		PUSH	DPH
		MOV	DPTR,#\0
		MOVX	A,@DPTR
		SETB	C
		XRL	A,#TRUTH
		JZ	TEST_F_RET\@		; truth return
		CLR	C
TEST_F_RET\<:	POP	DPH
		POP	DPL
		POP	ACC
		ENDMAC

;============================================================================

		RSEG	CODE(0)

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

COPY_PACK_ST:	MOV	R0,#I_PACK_ST
		MOV	DPTR,#PACK_ST
		MOV	R7,#MAX_PACK
COPY_LOP:	MOVX	A,@DPTR
		MOV	@R0,A
		INC	R0
		INC	DPTR
		DJNZ	R7,COPY_LOP
		RET

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

INIT_PACK_ST:	MOV	R7,#MAX_PACK
		MOV	R0,#LAST_SQ
		MOV	DPTR,#PACK_ST
INIT_P_LOP:	CLR	A
		MOVX	@DPTR,A
		INC	DPTR
		CPL	A
		MOV	@R0,A			; LAST_SQ <= 0FFH
		INC	R0
		DJNZ	R7,INIT_P_LOP
		MOV	DPTR,#PACK_ST+(ST_NOE AND SOURCE)-1
		MOV	A,#PACK_MASK
		MOVX	@DPTR,A

		MOV	R7,#MAX_PACK
		MOV	R0,#HEAD
		MOV	R1,#TAIL
		MOV	R3,#HIGH(ST_STREAM)
		MOV	R2,#LOW(ST_STREAM)
		MOV	R5,#HIGH(STREAM_LEN)
		MOV	R4,#LOW(STREAM_LEN)

INIT_ST_LOP1:	MOV	A,R2
		MOV	@R0,A
		MOV	@R1,A
		INC	R0
		INC	R1
		MOV	A,R3
		MOV	@R0,A
		MOV	@R1,A
		INC	R0
		INC	R1
		CALL	ADD16
		DJNZ	R7,INIT_ST_LOP1

		RET

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

REST_PACK_ST:	MOV	R0,#ALL_STATION+1	; skip station No0
		MOV	DPTR,#PACK_ST
		MOV	R7,#MAX_PACK

REST_LOP:	MOV	A,@R0
		MOV	B,A
		ANL	A,#ACTIVE_MARK
		JNZ	ST_ACTIVE
		MOV	B,A
ST_ACTIVE:	INC	R0
		MOVX	A,@DPTR
		ANL	A,#PACK_MASK		;*****
		ORL	A,B
		MOVX	@DPTR,A
		INC	DPTR
REST_LOP1:	DJNZ	R7,REST_LOP
		RET

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

CARD_INIT:	%MOVXW	NET_COMMAND,NO_READY    ;5aa5入双口24H(NET_COMMAND)
		%MOVXW	CARD_ID,MY_ID           ;A55A入双口00H(CARD_ID) 

		MOV	R7,#MAX_PACK		; initialize package table
		MOV	A,#0FFH 		; 0FFH means no station
		MOV	DPTR,#PACK_ST           ;双口PACK_ST 14字节为FF
FILL_P_TABLE:	MOVX	@DPTR,A
		INC	DPTR
		DJNZ	R7,FILL_P_TABLE

		%MOVXW	IN_BUF_INS,INPUT_BUFFER ; following initialize pointers
		%MOVXW	 IN_BUF_REM,INPUT_BUFFER

		%MOVXW	OUT_BUF_INS,OUTPUT_BUFFER
		%MOVXW	OUT_BUF_REM,OUTPUT_BUFFER

		%MOVXW	IN_BUF_LENGTH,IBUF_LENGTH ; initialize the input buffer length
		%MOVXW	OUT_BUF_LENGTH,OBUF_LENGTH; initialize the output buffer length

		%MOVXW	DPRAM_BASE_ADDR,DPRAM_START ; initialize the dual port RAM base address

		%MOVXB	IN_BUF_EMPT,TRUTH	; following initilaizing marks
		%MOVXB	OUT_BUF_EMPT,TRUTH
		%MOVXB	IN_BUF_FULL,FALS
		%MOVXB	OUT_BUF_FULL,FALS

		RET

;============================== Subrouting defination =======================
;MOVE_XDATA1	Move data from XRAM DPTR pointed to XRAM R3.R2 pointed
;Input: 	DPTR point to source, R3.R2 pointe to destnation
;		R7= data length
;Output:	none

MOVE_XDATA1:	MOV	A,R7
		PUSH	ACC
MOVE_XDATA_LP1:	MOVX	A,@DPTR
		%INC_POINT ST_STREAM,STREAM_LEN,CUR_ST
		XCH	A,DPH
		XCH	A,R3
		XCH	A,DPH
		XCH	A,DPL
		XCH	A,R2
		XCH	A,DPL			; DPTR <=> R3.R2 and keep ACC
		MOVX	@DPTR,A
		INC	DPTR
		XCH	A,DPH
		XCH	A,R3
		XCH	A,DPH
		XCH	A,DPL
		XCH	A,R2			; DPTR <=> R3.R2 destroy ACC
		XCH	A,DPL
		DJNZ	R7,MOVE_XDATA_LP1
		POP	ACC
		MOV	R7,A
		RET

;============================== Subrouting defination =======================
;MOVE_XDATA	Move data from XRAM DPTR pointed to XRAM R3.R2 pointed
;Input: 	DPTR point to source, R3.R2 pointe to destnation
;		R7= data length
;Output:	none

MOVE_XDATA:	MOV	A,R7
		PUSH	ACC
MOVE_XDATA_LP:	MOVX	A,@DPTR
		INC	DPTR
		XCH	A,DPH
		XCH	A,R3
		XCH	A,DPH
		XCH	A,DPL
		XCH	A,R2
		XCH	A,DPL			; DPTR <=> R3.R2 and keep ACC
		MOVX	@DPTR,A
		%INC_POINT ST_STREAM,STREAM_LEN,TEMP1
		XCH	A,DPH
		XCH	A,R3
		XCH	A,DPH
		XCH	A,DPL
		XCH	A,R2			; DPTR <=> R3.R2 destroy ACC
		XCH	A,DPL
		DJNZ	R7,MOVE_XDATA_LP
		POP	ACC
		MOV	R7,A
		RET

;============================== Subrouting defination =======================
;PACKAGE_DONE
;Input: 	none
;Output:	CY = 0 successful, CY=0 failure (buffer full)

PACK_DONE:	%TEST_FLAG OUT_BUF_FULL 	; testing output buffer full flag
		JNC	PACK_GO
		JMP	OUTBUF_FULL		; buffer full jump

PACK_GO:	MOV	SRC_POINT+1,#HIGH(PACK_BUF)
		MOV	SRC_POINT+0,#LOW(PACK_BUF) ; save source pointer
		MOV	DPTR,#OUT_BUF_INS
		MOVX	A,@DPTR
		MOV	DEST_POINT+0,A
		INC	DPTR
		MOVX	A,@DPTR
		MOV	DEST_POINT+1,A		; DEST_POINT <= OUT_BUF_INS

GET_REMOVE:	MOV	DPTR,#OUT_BUF_REM
		MOVX	A,@DPTR
		MOV	R4,A
		INC	DPTR
		MOVX	A,@DPTR
		MOV	R5,A			; R5.R4 <= remove pointer
		MOV	DPTR,#OUT_BUF_REM
		MOVX	A,@DPTR
		MOV	R2,A
		INC	DPTR
		MOVX	A,@DPTR
		MOV	R3,A			; R3.R2 <= remove pointer
		CALL	COMP16
		JNZ	GET_REMOVE
						; get remove pointer in R5.R4
		MOV	R3,DEST_POINT+1
		MOV	R2,DEST_POINT+0 	; R3.R2 <= insert pointer
		CALL	SUB16
		JNC	NO_O_ROLL
		CALL	CPL16
		JMP	BUF_ROLL1
NO_O_ROLL:	MOV	A,R3
		MOV	R5,A
		MOV	A,R2
		MOV	R4,A
		MOV	R3,#HIGH(OBUF_LENGTH)
		MOV	R2,#LOW(OBUF_LENGTH)
		CALL	SUB16
BUF_ROLL1:	MOV	A,R3
		JNZ	OUTBUF_USED
		%MOVXB	OUT_BUF_FULL,TRUTH
		JMP	OUTBUF_FULL

OUTBUF_USED:	MOV	DPL,SRC_POINT+0
		MOV	DPH,SRC_POINT+1 	; restore source pointer
		MOVX	A,@DPTR 		; ACC <= package length
		MOV	R7,A			; save package length
		INC	R7			; for length byte
		INC	DPTR
		MOV	SRC_POINT+0,DPL
		MOV	SRC_POINT+1,DPH 	; restore source pointer

F_WRITE_LOP:	MOV	DPL,DEST_POINT+0
		MOV	DPH,DEST_POINT+1	; save destination pointer
		MOVX	@DPTR,A
		%INC_DPTR OUTPUT_BUFFER,OBUF_LENGTH; Increace buffer pointer
		MOV	DEST_POINT+0,DPL
		MOV	DEST_POINT+1,DPH	; restore destination pointer
		MOV	DPL,SRC_POINT+0
		MOV	DPH,SRC_POINT+1 	; restore source pointer
		MOVX	A,@DPTR
		INC	DPTR
		MOV	SRC_POINT+0,DPL
		MOV	SRC_POINT+1,DPH 	; save source pointer
		DJNZ	R7,F_WRITE_LOP

		MOV	R2,DEST_POINT+0
		MOV	R3,DEST_POINT+1 	; save destination pointer
		MOV	DPTR,#OUT_BUF_INS
		MOV	A,R2
		MOVX	@DPTR,A
		INC	DPTR
		MOV	A,R3
		MOVX	@DPTR,A 		; modify output buffer pointer

OUTBUF_FULL:	%MOVXB	OUT_BUF_EMPT,FALS	; set output buffer not empty
		%TEST_FLAG OUT_BUF_FULL 	; testing output buffer full flag
		RET

;============================== Subrouting defination =======================
;PACK_TEST	testing [FOF] in ACC packing if require
;Input: 	ACC = [FOF]
;Output:	CY = 0 packing required, CY=1 not required

PACK_TEST:	PUSH	ACC
		JB	UNPACK_MK,UNPACK_1
		ANL	A,#SOURCE

⌨️ 快捷键说明

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