CSa32/Data.S
changeset 0 5c129dd80d4f
equal deleted inserted replaced
-1:000000000000 0:5c129dd80d4f
       
     1 	.include "DS.S"
       
     2 	.text
       
     3 #-----------------------------------------------
       
     4 #	C O N S T R U C T O R
       
     5 #-----------------------------------------------
       
     6 	ARGS
       
     7 	DS	thisP				# -->Data inst
       
     8 	DS	callerDeP			# -->originator's Debug
       
     9 	PROLOC
       
    10 	DL	deP				# -->Debug
       
    11 	EPILOC
       
    12 #-----------------------------------------------
       
    13 	.global Data
       
    14 Data:
       
    15 	PROLOG
       
    16 	mov	thisP(bp), b			# -->Data inst
       
    17 	lea	Da.debug(b), a			# -->Debug
       
    18 	mov	a, deP(bp)			# init local -->Debug
       
    19 # construct debug ID from originator debID
       
    20 	mov	callerDeP(bp), a		# -->caller's Debug
       
    21 	lea	D.id(a), a
       
    22 	push	a				# -->caller's DebugId
       
    23 	DEBID	"%s DATA", 1
       
    24 # calculate container size
       
    25 	mov	C.csP,a
       
    26 	push	C.txtP(a)
       
    27 	call	strlen
       
    28 	addl	$HeaderL, a
       
    29 	addl	$PayloadL, a
       
    30 	inc	a
       
    31 	mov	thisP(bp), b			# -->Data inst
       
    32 	mov	a, Da.datalen(b)		# save container length
       
    33 # allocate container
       
    34 	push	a
       
    35 	call	malloc
       
    36 	test	a, a
       
    37 	jnz	0f
       
    38 	SYSERR	"malloc"
       
    39 0:
       
    40 	mov	thisP(bp), b			# -->Data inst
       
    41 	mov	a, Da.contP(b)	 		# save -->container
       
    42 # initialize container
       
    43 	mov	Da.contP(b), c			# -->Container
       
    44 	lea	Co.hdr(c), a			# -->Header
       
    45 	movl	$0, H.ttl(a)
       
    46 	movl	$0, H.ts(a)
       
    47 	push	$0f
       
    48 	lea	Co.payl(c), a			# -->Payload
       
    49 	lea	Pa.text(a), a
       
    50 	push	a
       
    51 	call	strcpy				# init Payload.text
       
    52 	LOG	5, "Data instance established"
       
    53 	EPILOG
       
    54 0:	.asciz	"EMPTY"
       
    55 #-----------------------------------------------
       
    56 #	L O A D   P A Y L O A D
       
    57 #-----------------------------------------------
       
    58 # returns 	-->data container
       
    59 	M_ARGS
       
    60 	DS	ttl
       
    61 	DS	loadP				# -->text to be sent
       
    62 	M_LOCAL
       
    63 	DL	t, timevalL			# timestamp buf
       
    64 	M_PROLOG Da, load
       
    65 	LOG	5, "loading..."
       
    66 	mov	Da.contP(b), c			# -->Container
       
    67 # fill header
       
    68 	lea	Co.hdr(c), d			# -->containner header
       
    69 	mov	ttl(bp), a
       
    70 	mov	a, H.ttl(d)			# init TTL in header
       
    71 # get timestamp
       
    72 	call	D.getTs				# get timestamp
       
    73 	mov	a, H.ts(d)			# timestamp to header
       
    74 # init payload
       
    75 	push	loadP(bp)			# -->loaded text
       
    76 	lea	Co.payl(c), a			# -->Payload
       
    77 	lea	Pa.text(a), a
       
    78 	push	a
       
    79 	call	strcpy				# copy text to payload
       
    80 # return -->Data
       
    81 	push	Da.datalen(b)
       
    82 	LOG	5, "payload loaded to container, len=%u"
       
    83 	mov	Da.contP(b), a			# return -->container
       
    84 	EPILOG_R
       
    85 #-----------------------------------------------
       
    86 #	G E T   D A T A   C O N T A I N E R   L E N G T H
       
    87 #-----------------------------------------------
       
    88 # returns	length of container filled with data
       
    89 	M_ARGS
       
    90 	M_LOCAL
       
    91 	M_PROLOG Da, getDataLen
       
    92 	mov	Da.datalen(b), a
       
    93 	EPILOG_R
       
    94 #-----------------------------------------------
       
    95 #	G E T   D A T A   C O N T A I N E R   P O I N T E R
       
    96 #-----------------------------------------------
       
    97 	M_ARGS
       
    98 	M_LOCAL
       
    99 	M_PROLOG Da, getContP
       
   100 	mov	Da.contP(b), a
       
   101 	EPILOG_R
       
   102 #-----------------------------------------------
       
   103 #	C H E C K   P A Y L O A D
       
   104 #-----------------------------------------------
       
   105 # returns	boolean: original text == received text
       
   106 	M_ARGS
       
   107 	M_LOCAL
       
   108 	M_PROLOG Da, chk
       
   109 # get original payload
       
   110 	mov	C.csP, c			# -->CS
       
   111 	pushl	C.txtP(c)			# -->orig text
       
   112 # get payload from container
       
   113 	mov	Da.contP(b), a			# -->Container
       
   114 	lea	Co.payl(a), a			# -->Payload
       
   115 	lea	Pa.text(a), a			# -->payload text
       
   116 	push	a
       
   117 	call	strcmp
       
   118 	xor	c, c
       
   119 	test	a, a				# 0 = texts are equal
       
   120 	setz	%cl
       
   121 	mov	c, a
       
   122 	EPILOG_R
       
   123 #-----------------------------------------------
       
   124 #	U N L O A D   P A Y L O A D
       
   125 #-----------------------------------------------
       
   126 # returns	-->payload text
       
   127 	M_ARGS
       
   128 	M_LOCAL
       
   129 	M_PROLOG Da, unl
       
   130 	mov	thisP(bp), b			# -->Data inst
       
   131 	lea	Da.debug(b), a
       
   132 	mov	a, deP(bp)
       
   133 # get payload from container
       
   134 	mov	Da.contP(b), a			# -->Container
       
   135 	lea	Co.payl(a), a			# -->Payload
       
   136 	lea	Pa.text(a), a			# -->Payload.text
       
   137 	EPILOG_R
       
   138 #-----------------------------------------------
       
   139 #	D E C R E M E N T   T T L
       
   140 #-----------------------------------------------
       
   141 # decrement TTL in data container header, save it and return it
       
   142 	M_ARGS
       
   143 	M_LOCAL
       
   144 	M_PROLOG Da, dttl
       
   145 	mov	Da.contP(b), a			# -->Container
       
   146 	lea	Co.hdr(a), a			# -->container header
       
   147 	decl	H.ttl(a)			# TTL--
       
   148 	mov	H.ttl(a), a			# return TTL
       
   149 	EPILOG_R
       
   150 #-----------------------------------------------
       
   151 #	G E T   T T L
       
   152 #-----------------------------------------------
       
   153 	M_ARGS
       
   154 	M_LOCAL
       
   155 	M_PROLOG Da, ttl
       
   156 	mov	Da.contP(b), a			# -->Container
       
   157 	lea	Co.hdr(a), a			# -->container header
       
   158 	mov	H.ttl(a), a			# return TTL
       
   159 	EPILOG_R
       
   160 #-----------------------------------------------
       
   161 #	P U T   l I S T E N   P O R T   T O   H E A D E R
       
   162 #-----------------------------------------------
       
   163 	ARGS
       
   164 	DS	thisP				# -->Data inst
       
   165 	DS	port
       
   166 # returns	port value
       
   167 	PROLOC
       
   168 	DL	deP				# -->Debug
       
   169 	EPILOC
       
   170 #-----------------------------------------------
       
   171 	.global Da.putPort
       
   172 Da.putPort:
       
   173 	PROLOG
       
   174 	mov	thisP(bp), b			# -->Data inst
       
   175 	lea	Da.debug(b), a
       
   176 	mov	a, deP(bp)			# -->Debug
       
   177 
       
   178 	mov	Da.contP(b), c			# -->Container
       
   179 	lea	Co.hdr(a), c			# -->container header
       
   180 	mov	port(bp), a
       
   181 	mov	a, H.lport(c)
       
   182 	EPILOG_R
       
   183 #-----------------------------------------------
       
   184 #	G E T   l I S T E N   P O R T   F R O M   H E A D E R
       
   185 #-----------------------------------------------
       
   186 	M_ARGS
       
   187 	M_LOCAL
       
   188 	M_PROLOG Da, getPort
       
   189 	mov	Da.contP(b), c			# -->Container
       
   190 	lea	Co.hdr(c), c			# -->container header
       
   191 	mov	H.lport(c), a
       
   192 	EPILOG_R
       
   193 #-----------------------------------------------
       
   194 #	G E T   T I M E S T A M P   F R O M   H E A D E R
       
   195 #-----------------------------------------------
       
   196 	M_ARGS
       
   197 	M_LOCAL
       
   198 	M_PROLOG Da, getTs
       
   199 	mov	Da.contP(b), a			# -->Container
       
   200 	lea	Co.hdr(a), a			# -->container header
       
   201 	mov	H.ts(a), a			# return timestamp
       
   202 	EPILOG_R
       
   203 #-----------------------------------------------
       
   204 #	S A B O T A G E   T E X T
       
   205 #-----------------------------------------------
       
   206 	ARGS
       
   207 	DS	thisP				# -->Data inst
       
   208 	PROLOC
       
   209 	DL	deP				# -->Debug
       
   210 	EPILOC
       
   211 #-----------------------------------------------
       
   212 	.global Da.sabotage
       
   213 Da.sabotage:
       
   214 	PROLOG
       
   215 	lea	Da.contP(b), a			# -->Container
       
   216 	lea	Co.payl(a), a			# -->Payload
       
   217 	lea	Pa.text(a), a			# -->Payload.text
       
   218 	movl	$'?', (a)
       
   219 	EPILOG
       
   220 #-----------------------------------------------
       
   221 #	C R E A T E   D I G E S T   F R O M   T E X T
       
   222 #-----------------------------------------------
       
   223 # returns	-->24 chars payload text digest
       
   224 	M_ARGS
       
   225 	DS	digestP				# -->text digest buffer
       
   226 	M_LOCAL
       
   227 	DL	textP
       
   228 	M_PROLOG Da, digest24
       
   229 # check length of payload text
       
   230 	mov	Da.contP(b), a			# -->Container
       
   231 	lea	Co.payl(a), a			# -->Payload
       
   232 	lea	Pa.text(a), a			# -->Payload.text
       
   233 	mov	a, textP(bp)
       
   234 	push	a
       
   235 	call	strlen
       
   236 	cmp	$24, a				# payload text length < 24 ?
       
   237 	jl	Da.digest24Direct		# yes, direct copy
       
   238 # create digest	from longer text
       
   239 	push	$8
       
   240 	push	textP(bp)
       
   241 	push	digestP(bp)
       
   242 	call	strncpy				# copy beg. of text
       
   243 	push	$0f
       
   244 	mov	digestP(bp), a			# -->digest
       
   245 	add	$8, a
       
   246 	push	a				# -->digest+8
       
   247 	call	strcpy
       
   248 	jmp	1f
       
   249 0:	.asciz	"-------"
       
   250 1:	push	textP(bp)
       
   251 	call	strlen
       
   252 	mov	textP(bp), c
       
   253 	add	a, c
       
   254 	lea	-8(c), c			# -->end of text - 8
       
   255 	push	c
       
   256 	mov	digestP(bp), a
       
   257 	lea	15(a), a			# -->digest+15
       
   258 	push	a
       
   259 	call	strcpy
       
   260 	jmp	Da.digest24Ex
       
   261 # directly copy shorter text
       
   262 Da.digest24Direct:
       
   263 	push	textP(bp)
       
   264 	push	digestP(bp)
       
   265 	call	strcpy
       
   266 Da.digest24Ex:
       
   267 	mov	digestP(bp), a			# -->digest
       
   268 	EPILOG_R
       
   269 #-----------------------------------------------
       
   270 	.end