CSa32/Data.S
changeset 0 5c129dd80d4f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CSa32/Data.S	Thu Nov 21 14:55:10 2019 +0100
@@ -0,0 +1,270 @@
+	.include "DS.S"
+	.text
+#-----------------------------------------------
+#	C O N S T R U C T O R
+#-----------------------------------------------
+	ARGS
+	DS	thisP				# -->Data inst
+	DS	callerDeP			# -->originator's Debug
+	PROLOC
+	DL	deP				# -->Debug
+	EPILOC
+#-----------------------------------------------
+	.global Data
+Data:
+	PROLOG
+	mov	thisP(bp), b			# -->Data inst
+	lea	Da.debug(b), a			# -->Debug
+	mov	a, deP(bp)			# init local -->Debug
+# construct debug ID from originator debID
+	mov	callerDeP(bp), a		# -->caller's Debug
+	lea	D.id(a), a
+	push	a				# -->caller's DebugId
+	DEBID	"%s DATA", 1
+# calculate container size
+	mov	C.csP,a
+	push	C.txtP(a)
+	call	strlen
+	addl	$HeaderL, a
+	addl	$PayloadL, a
+	inc	a
+	mov	thisP(bp), b			# -->Data inst
+	mov	a, Da.datalen(b)		# save container length
+# allocate container
+	push	a
+	call	malloc
+	test	a, a
+	jnz	0f
+	SYSERR	"malloc"
+0:
+	mov	thisP(bp), b			# -->Data inst
+	mov	a, Da.contP(b)	 		# save -->container
+# initialize container
+	mov	Da.contP(b), c			# -->Container
+	lea	Co.hdr(c), a			# -->Header
+	movl	$0, H.ttl(a)
+	movl	$0, H.ts(a)
+	push	$0f
+	lea	Co.payl(c), a			# -->Payload
+	lea	Pa.text(a), a
+	push	a
+	call	strcpy				# init Payload.text
+	LOG	5, "Data instance established"
+	EPILOG
+0:	.asciz	"EMPTY"
+#-----------------------------------------------
+#	L O A D   P A Y L O A D
+#-----------------------------------------------
+# returns 	-->data container
+	M_ARGS
+	DS	ttl
+	DS	loadP				# -->text to be sent
+	M_LOCAL
+	DL	t, timevalL			# timestamp buf
+	M_PROLOG Da, load
+	LOG	5, "loading..."
+	mov	Da.contP(b), c			# -->Container
+# fill header
+	lea	Co.hdr(c), d			# -->containner header
+	mov	ttl(bp), a
+	mov	a, H.ttl(d)			# init TTL in header
+# get timestamp
+	call	D.getTs				# get timestamp
+	mov	a, H.ts(d)			# timestamp to header
+# init payload
+	push	loadP(bp)			# -->loaded text
+	lea	Co.payl(c), a			# -->Payload
+	lea	Pa.text(a), a
+	push	a
+	call	strcpy				# copy text to payload
+# return -->Data
+	push	Da.datalen(b)
+	LOG	5, "payload loaded to container, len=%u"
+	mov	Da.contP(b), a			# return -->container
+	EPILOG_R
+#-----------------------------------------------
+#	G E T   D A T A   C O N T A I N E R   L E N G T H
+#-----------------------------------------------
+# returns	length of container filled with data
+	M_ARGS
+	M_LOCAL
+	M_PROLOG Da, getDataLen
+	mov	Da.datalen(b), a
+	EPILOG_R
+#-----------------------------------------------
+#	G E T   D A T A   C O N T A I N E R   P O I N T E R
+#-----------------------------------------------
+	M_ARGS
+	M_LOCAL
+	M_PROLOG Da, getContP
+	mov	Da.contP(b), a
+	EPILOG_R
+#-----------------------------------------------
+#	C H E C K   P A Y L O A D
+#-----------------------------------------------
+# returns	boolean: original text == received text
+	M_ARGS
+	M_LOCAL
+	M_PROLOG Da, chk
+# get original payload
+	mov	C.csP, c			# -->CS
+	pushl	C.txtP(c)			# -->orig text
+# get payload from container
+	mov	Da.contP(b), a			# -->Container
+	lea	Co.payl(a), a			# -->Payload
+	lea	Pa.text(a), a			# -->payload text
+	push	a
+	call	strcmp
+	xor	c, c
+	test	a, a				# 0 = texts are equal
+	setz	%cl
+	mov	c, a
+	EPILOG_R
+#-----------------------------------------------
+#	U N L O A D   P A Y L O A D
+#-----------------------------------------------
+# returns	-->payload text
+	M_ARGS
+	M_LOCAL
+	M_PROLOG Da, unl
+	mov	thisP(bp), b			# -->Data inst
+	lea	Da.debug(b), a
+	mov	a, deP(bp)
+# get payload from container
+	mov	Da.contP(b), a			# -->Container
+	lea	Co.payl(a), a			# -->Payload
+	lea	Pa.text(a), a			# -->Payload.text
+	EPILOG_R
+#-----------------------------------------------
+#	D E C R E M E N T   T T L
+#-----------------------------------------------
+# decrement TTL in data container header, save it and return it
+	M_ARGS
+	M_LOCAL
+	M_PROLOG Da, dttl
+	mov	Da.contP(b), a			# -->Container
+	lea	Co.hdr(a), a			# -->container header
+	decl	H.ttl(a)			# TTL--
+	mov	H.ttl(a), a			# return TTL
+	EPILOG_R
+#-----------------------------------------------
+#	G E T   T T L
+#-----------------------------------------------
+	M_ARGS
+	M_LOCAL
+	M_PROLOG Da, ttl
+	mov	Da.contP(b), a			# -->Container
+	lea	Co.hdr(a), a			# -->container header
+	mov	H.ttl(a), a			# return TTL
+	EPILOG_R
+#-----------------------------------------------
+#	P U T   l I S T E N   P O R T   T O   H E A D E R
+#-----------------------------------------------
+	ARGS
+	DS	thisP				# -->Data inst
+	DS	port
+# returns	port value
+	PROLOC
+	DL	deP				# -->Debug
+	EPILOC
+#-----------------------------------------------
+	.global Da.putPort
+Da.putPort:
+	PROLOG
+	mov	thisP(bp), b			# -->Data inst
+	lea	Da.debug(b), a
+	mov	a, deP(bp)			# -->Debug
+
+	mov	Da.contP(b), c			# -->Container
+	lea	Co.hdr(a), c			# -->container header
+	mov	port(bp), a
+	mov	a, H.lport(c)
+	EPILOG_R
+#-----------------------------------------------
+#	G E T   l I S T E N   P O R T   F R O M   H E A D E R
+#-----------------------------------------------
+	M_ARGS
+	M_LOCAL
+	M_PROLOG Da, getPort
+	mov	Da.contP(b), c			# -->Container
+	lea	Co.hdr(c), c			# -->container header
+	mov	H.lport(c), a
+	EPILOG_R
+#-----------------------------------------------
+#	G E T   T I M E S T A M P   F R O M   H E A D E R
+#-----------------------------------------------
+	M_ARGS
+	M_LOCAL
+	M_PROLOG Da, getTs
+	mov	Da.contP(b), a			# -->Container
+	lea	Co.hdr(a), a			# -->container header
+	mov	H.ts(a), a			# return timestamp
+	EPILOG_R
+#-----------------------------------------------
+#	S A B O T A G E   T E X T
+#-----------------------------------------------
+	ARGS
+	DS	thisP				# -->Data inst
+	PROLOC
+	DL	deP				# -->Debug
+	EPILOC
+#-----------------------------------------------
+	.global Da.sabotage
+Da.sabotage:
+	PROLOG
+	lea	Da.contP(b), a			# -->Container
+	lea	Co.payl(a), a			# -->Payload
+	lea	Pa.text(a), a			# -->Payload.text
+	movl	$'?', (a)
+	EPILOG
+#-----------------------------------------------
+#	C R E A T E   D I G E S T   F R O M   T E X T
+#-----------------------------------------------
+# returns	-->24 chars payload text digest
+	M_ARGS
+	DS	digestP				# -->text digest buffer
+	M_LOCAL
+	DL	textP
+	M_PROLOG Da, digest24
+# check length of payload text
+	mov	Da.contP(b), a			# -->Container
+	lea	Co.payl(a), a			# -->Payload
+	lea	Pa.text(a), a			# -->Payload.text
+	mov	a, textP(bp)
+	push	a
+	call	strlen
+	cmp	$24, a				# payload text length < 24 ?
+	jl	Da.digest24Direct		# yes, direct copy
+# create digest	from longer text
+	push	$8
+	push	textP(bp)
+	push	digestP(bp)
+	call	strncpy				# copy beg. of text
+	push	$0f
+	mov	digestP(bp), a			# -->digest
+	add	$8, a
+	push	a				# -->digest+8
+	call	strcpy
+	jmp	1f
+0:	.asciz	"-------"
+1:	push	textP(bp)
+	call	strlen
+	mov	textP(bp), c
+	add	a, c
+	lea	-8(c), c			# -->end of text - 8
+	push	c
+	mov	digestP(bp), a
+	lea	15(a), a			# -->digest+15
+	push	a
+	call	strcpy
+	jmp	Da.digest24Ex
+# directly copy shorter text
+Da.digest24Direct:
+	push	textP(bp)
+	push	digestP(bp)
+	call	strcpy
+Da.digest24Ex:
+	mov	digestP(bp), a			# -->digest
+	EPILOG_R
+#-----------------------------------------------
+	.end