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