diff -r 000000000000 -r 5c129dd80d4f CSa32/Data.S --- /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