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