--- /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