📄 pack.msa
字号:
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 + -