;Alto->8086 small-c compiler rev 2.0 C←CODE SEGMENT $INCLUDE(8086LIB.D) $INCLUDE(pupimpl.DEC) ASSUME CS:C←CODE, DS:C←DATA ; #include <Env.h> ; extern int *GetFixed(); ; extern Zero(); ; extern MoveBlock(); ; extern Enqueue(); ; extern int *InitNContext(); ; extern Block(); ; extern int *Dequeue(); ; extern Unqueue(); ; extern InitQueue(); ; extern EtherHost(); ; extern InitEther(); ; extern RequestRoute(); ; extern CallSwat(); ; extern Swab(); ; extern MultEq(); ; extern ReadTmr(); ; extern Call1(); ; static struct Queue pbiIQ[1]; ; int lenPBI; ; int lenPup; ; int maxPupDataBytes; ; int localNet; /* 0173: known only 1.5MB network, for now. */ ; int localHost; ; int currentHost; ; int maxHops; ; static struct Queue pbiFreeQ[1]; ; static int *pupLevel1Ctx; ; struct SocketEntry pupSockets[maxPupSockets+1]; ; struct Route routingTable[maxNetworks]; ; static int ageNet; ; static struct Route *ageRoute; ; static PupLevel1() { ←PupLevel1: PUSH BP MOV BP,SP ; struct PBI *pbi; ; for (;;) { PUSH DX X1: ; if ((ReadTmr() & 3) == 0) { CALL ←ReadTmr AND BX,3 OR BX,BX JNZ X3 ; if (ageNet < 0) ageNet = 0; MOV BX,←ageNet CMP BX,0 JGE X4 MOV ←ageNet,0 X4: ; if (ageNet >= maxNetworks) ageNet = 0; MOV BX,←ageNet CMP BX,0100X JL X5 MOV ←ageNet,0 X5: ; ageRoute = &routingTable[ageNet]; MOV BX,←ageNet LEA CX,←routingTable ADD CX,BX ADD CX,BX ADD BX,CX MOV ←ageRoute,BX ; if (ageRoute->age & 0x0080) ageRoute->age = 0x00ff; MOV BX,←ageRoute MOV AL,[BX+2] AND AL,080X OR AL,AL JZ X6 MOV BX,←ageRoute MOV BYTE PTR [BX+2],0FFX ; else ageRoute->age += 1; JR X7 X6: MOV BX,←ageRoute INC BYTE PTR [BX+2] X7: ; ageNet += 1; INC ←ageNet ; }; X3: ; Block(); CALL ←Block ; pbi = (struct PBI *) Dequeue(pbiIQ); LEA BX,←pbiIQ CALL ←Dequeue ; ←pbi ← BX POP DX PUSH BX ; if (pbi) { ; BX ← ←pbi POP BX PUSH BX OR BX,BX JZ X8 ; if (CheckCheckSum(pbi->pup)) Call1(pbi->clientWord, pbi); ; BX ← ←pbi POP BX PUSH BX MOV CX,[BX+6] MOV BX,CX CALL ←CheckCheckSum OR BX,BX JZ X9 ; BX ← ←pbi POP BX PUSH BX MOV CX,[BX+4] ; BX ← ←pbi POP BX PUSH BX CALL ←Call1 ; else ReleasePBI(pbi); JR X10 X9: ; BX ← ←pbi POP BX PUSH BX CALL ←ReleasePBI X10: ; }; X8: ; PokeWDTD(); CALL ←PokeWDTD ; }; JMP X1 X2: ; }; MOV SP,BP POP BP RET; ; SendPup(pbi) ←SendPup: ; struct PBI *pbi; PUSH BP MOV BP,SP PUSH BX ; { ; int pdh; ; int *tmp; ; struct Pup *pup; ; struct EtherEncapsulation *enc; ADD SP,0FFF8X ; pup = pbi->pup; ; BX ← ←pbi MOV BX,[BP-2] MOV CX,[BX+6] ; ←pup ← CX MOV [BP-8],CX ; pup->transport = 0; ; BX ← ←pup MOV BX,[BP-8] MOV BYTE PTR [BX+2],0 ; pup->data.words[(Swab(pup->length)-pupOvBytes+1)>>1] = -1; ; BX ← ←pup MOV BX,[BP-8] ADD BX,014X PUSH BX ; DI ← ←pup MOV DI,[BP-8] MOV BX,[DI] CALL ←Swab ADD BX,0FFEAX INC BX SHR BX POP CX SAL BX ADD BX,CX MOV WORD PTR [BX],0FFFFX ; if ((pdh = RoutePup(pup)) < 0) Enqueue(pbi->queue, pbi); ; BX ← ←pup MOV BX,[BP-8] CALL ←RoutePup ; ←pdh ← BX MOV [BP-4],BX CMP BX,0 JGE X11 ; BX ← ←pbi MOV BX,[BP-2] MOV CX,[BX+2] ; BX ← ←pbi MOV BX,[BP-2] CALL ←Enqueue ; else { JR X12 X11: ; tmp = ((int *) pup) - lenEtherEncapsulation; ; BX ← ←pup MOV BX,[BP-8] ADD BX,0FFFCX ; ←tmp ← BX MOV [BP-6],BX ; enc = (struct EtherEncapsulation *) tmp; ; BX ← ←tmp MOV BX,[BP-6] ; ←enc ← BX POP DX PUSH BX ; enc->src = localHost; ; BX ← ←enc POP BX PUSH BX MOV AX,←localHost MOV [BX+1],AL ; enc->dst = pdh; ; BX ← ←enc POP BX PUSH BX ; AL ← ←pdh MOV AL,[BP-4] MOV [BX],AL ; enc->type = typePup; ; BX ← ←enc POP BX PUSH BX MOV WORD PTR [BX+2],2 ; TransmitPacket(pbi); ; BX ← ←pbi MOV BX,[BP-2] CALL ←TransmitPacket ; }; X12: ; }; MOV SP,BP POP BP RET; ; int WaitUntilSent(pbi) ←WaitUntilSent: ; struct PBI *pbi; PUSH BP MOV BP,SP PUSH BX ; { ; int i; PUSH DX ; i = ReadTmr(); CALL ←ReadTmr ; ←i ← BX POP DX PUSH BX ; while (Unqueue(pbi->queue, pbi) == 0) { X13: ; BX ← ←pbi MOV BX,[BP-2] MOV CX,[BX+2] ; BX ← ←pbi MOV BX,[BP-2] CALL ←Unqueue OR BX,BX JNZ X14 ; Block(); CALL ←Block ; }; JR X13 X14: ; return(ReadTmr()-i); CALL ←ReadTmr ; CX ← ←i POP CX PUSH CX SUB BX,CX MOV SP,BP POP BP RET; ; }; ; static int RoutePup(pup) ←RoutePup: ; struct Pup *pup; PUSH BP MOV BP,SP PUSH BX ; { ; int net; ; struct Route *route; ; if ((net = pup->dPort.net) == localNet) return pup->dPort.host; ADD SP,0FFFCX ; BX ← ←pup MOV BX,[BP-2] MOV AL,[BX+8] XOR AH,AH ; ←net ← AX MOV [BP-4],AX MOV BX,←localNet CMP AX,BX JNZ X15 ; BX ← ←pup MOV BX,[BP-2] MOV AL,[BX+9] XOR AH,AH MOV BX,AX MOV SP,BP POP BP RET; X15: ; route = &routingTable[net & 0x00ff]; ; BX ← ←net MOV BX,[BP-4] AND BX,0FFX LEA CX,←routingTable ADD CX,BX ADD CX,BX ADD BX,CX ; ←route ← BX POP DX PUSH BX ; if (route->hops < 100) return(route->host); ; BX ← ←route POP BX PUSH BX MOV AL,[BX+1] CMP AL,064X JGE X16 ; DI ← ←route POP DI PUSH DI MOV AL,[DI] XOR AH,AH MOV BX,AX MOV SP,BP POP BP RET; X16: ; RequestRoute(net); ; BX ← ←net MOV BX,[BP-4] CALL ←RequestRoute ; return(-1); MOV BX,0FFFFX MOV SP,BP POP BP RET; ; }; ; struct Route *LookupNet(net) ←LookupNet: ; int net; PUSH BP MOV BP,SP PUSH BX ; { ; struct Route *route; PUSH DX ; route = &routingTable[net & 0x00ff]; ; BX ← ←net MOV BX,[BP-2] AND BX,0FFX LEA CX,←routingTable ADD CX,BX ADD CX,BX ADD BX,CX ; ←route ← BX POP DX PUSH BX ; if (route->hops < 100) return(route); ; BX ← ←route POP BX PUSH BX MOV AL,[BX+1] CMP AL,064X JGE X17 ; BX ← ←route POP BX PUSH BX MOV SP,BP POP BP RET; ; else return(0); X17: XOR BX,BX MOV SP,BP POP BP RET; ; }; ; struct WhereAmI { ; int hops, index; ; }; ; GenerateNets(handle) ←GenerateNets: ; struct WhereAmI *handle; PUSH BP MOV BP,SP PUSH BX ; { ; handle->index = -1; ; BX ← ←handle POP BX PUSH BX MOV WORD PTR [BX+2],0FFFFX ; handle->hops = 0; ; BX ← ←handle POP BX PUSH BX MOV WORD PTR [BX],0 ; }; MOV SP,BP POP BP RET; ; int NextNet(handle) ←NextNet: ; struct WhereAmI *handle; PUSH BP MOV BP,SP PUSH BX ; { ; if (handle->hops == 0) { ; DI ← ←handle POP DI PUSH DI MOV BX,[DI] OR BX,BX JNZ X18 ; handle->index = -1; ; BX ← ←handle POP BX PUSH BX MOV WORD PTR [BX+2],0FFFFX ; handle->hops = 1; ; BX ← ←handle POP BX PUSH BX MOV WORD PTR [BX],1 ; return(localNet); MOV BX,←localNet MOV SP,BP POP BP RET; ; }; X18: ; for (;;) { X19: ; handle->index += 1; ; BX ← ←handle POP BX PUSH BX INC WORD PTR [BX+2] ; if (handle->index >= maxNetworks) { ; BX ← ←handle POP BX PUSH BX MOV CX,[BX+2] MOV BX,CX CMP BX,0100X JL X21 ; handle->index = 0; ; BX ← ←handle POP BX PUSH BX MOV WORD PTR [BX+2],0 ; handle->hops += 1; ; BX ← ←handle POP BX PUSH BX INC WORD PTR [BX] ; if (handle->hops >= maxHops) return(0); ; DI ← ←handle POP DI PUSH DI MOV BX,[DI] MOV CX,←maxHops CMP BX,CX JL X22 XOR BX,BX MOV SP,BP POP BP RET; X22: ; }; X21: ; if (routingTable[handle->index].hops == handle->hops) return(handle->index); ; BX ← ←handle POP BX PUSH BX MOV CX,[BX+2] LEA BX,←routingTable ADD BX,CX ADD BX,CX ADD BX,CX MOV AL,[BX+1] ; DI ← ←handle POP DI PUSH DI MOV BX,[DI] XOR AH,AH CMP AX,BX JNZ X23 ; BX ← ←handle POP BX PUSH BX MOV CX,[BX+2] MOV BX,CX MOV SP,BP POP BP RET; X23: ; }; JR X19 X20: ; }; MOV SP,BP POP BP RET; ; struct PBI *GetPBI(soc) ←GetPBI: ; int soc; PUSH BP MOV BP,SP PUSH BX ; { ; int pbiTimer; ; struct PBI *pbi; ADD SP,0FFFCX ; pbi = (struct PBI *) MaybeGetPBI(soc); ; BX ← ←soc MOV BX,[BP-2] CALL ←MaybeGetPBI ; ←pbi ← BX POP DX PUSH BX ; if (pbi != 0) goto gotOne; ; BX ← ←pbi POP BX PUSH BX OR BX,BX JZ X24 JMP ←gotOne X24: ; SetTmr(2000, &pbiTimer); ;&←pbiTimer LEA BX,[BP-4] MOV CX,07D0X CALL ←SetTmr ; for (;;) { X25: ; Block(); CALL ←Block ; pbi = (struct PBI *) MaybeGetPBI(soc); ; BX ← ←soc MOV BX,[BP-2] CALL ←MaybeGetPBI ; ←pbi ← BX POP DX PUSH BX ; if (pbi != 0) goto gotOne; ; BX ← ←pbi POP BX PUSH BX OR BX,BX JZ X27 JMP ←gotOne X27: ; if (TmrExp(&pbiTimer)) CallSwat(ecPup1+1); ;&←pbiTimer LEA BX,[BP-4] CALL ←TmrExp OR BX,BX JZ X28 MOV BX,04001X CALL ←CallSwat X28: ; }; JR X25 X26: ←gotOne: ; gotOne: ; pbi->clientWord = ReturnLoc(MyFrame()); ; BX ← ←pbi POP BX PUSH BX PUSH BX CALL ←MyFrame CALL ←ReturnLoc MOV CX,BX POP BX MOV [BX+4],CX ; return (pbi); ; BX ← ←pbi POP BX PUSH BX MOV SP,BP POP BP RET; ; }; ; struct PBI *MaybeGetPBI(soc) ←MaybeGetPBI: ; int soc; PUSH BP MOV BP,SP PUSH BX ; { ; struct PBI *pbi; PUSH DX ; pbi = (struct PBI *) Dequeue(pbiFreeQ); LEA BX,←pbiFreeQ CALL ←Dequeue ; ←pbi ← BX POP DX PUSH BX ; if (pbi != 0) { ; BX ← ←pbi POP BX PUSH BX OR BX,BX JZ X29 ; pbi->queue = pbiFreeQ; ; BX ← ←pbi POP BX PUSH BX LEA CX,←pbiFreeQ MOV [BX+2],CX ; Zero(pbi->pup, 10); ; BX ← ←pbi POP BX PUSH BX MOV CX,[BX+6] MOV BX,0AX CALL ←Zero ; }; X29: ; return (pbi); ; BX ← ←pbi POP BX PUSH BX MOV SP,BP POP BP RET; ; }; ; ReleasePBI(pbi) ←ReleasePBI: ; struct PBI *pbi; PUSH BP MOV BP,SP PUSH BX ; { ; Enqueue(pbiFreeQ, pbi); ; BX ← ←pbi POP BX PUSH BX LEA CX,←pbiFreeQ CALL ←Enqueue ; }; MOV SP,BP POP BP RET; ; AppendStringToPup(pbi, firstByte, string) ←AppendStringToPup: ; struct PBI *pbi; ; int firstByte; ; struct ShortSTRING *string; PUSH BP MOV BP,SP PUSH CX PUSH BX ; { ; int i; ; struct Pup *pup; ADD SP,0FFFCX ; pup = pbi->pup; ; BX ← ←pbi MOV BX,[BP+4] MOV CX,[BX+6] ; ←pup ← CX POP DX PUSH CX ; for (i = 0;i < string->length; ++i) pup->data.bytes[firstByte+i] = string->text[i]; MOV WORD PTR [BP-6],0 X32: ; DI ← ←string MOV DI,[BP-4] MOV BX,[DI] ; CX ← ←i MOV CX,[BP-6] CMP CX,BX JGE X31 JR X30 X33: INC WORD PTR [BP-6] JR X32 X30: ; BX ← ←pup POP BX PUSH BX ADD BX,014X ; CX ← ←i MOV CX,[BP-6] ; AX ← ←firstByte MOV AX,[BP-2] ADD AX,CX ADD BX,AX ; CX ← ←string MOV CX,[BP-4] ADD CX,4 ; AX ← ←i MOV AX,[BP-6] ADD AX,CX MOV DI,AX MOV AL,[DI] MOV [BX],AL JR X33 X31: ; pup->length = Swab(pupOvBytes + firstByte + string->length); ; DI ← ←string MOV DI,[BP-4] MOV BX,[DI] ; CX ← ←firstByte MOV CX,[BP-2] ADD CX,BX ADD CX,016X MOV BX,CX CALL ←Swab MOV CX,BX ; BX ← ←pup POP BX PUSH BX MOV [BX],CX ; }; MOV SP,BP POP BP RET; ; int GetPupHost() ←GetPupHost: PUSH BP MOV BP,SP ; { ; return ((EtherHost()<<8) + localNet); CALL ←EtherHost MOV CX,8 SAL BX,CX MOV CX,←localNet ADD BX,CX MOV SP,BP POP BP RET; ; }; ; InitPupLevel1(pctxQ, numPBI, pupDataBytes) ←InitPupLevel1: ; struct Queue *pctxQ; ; int numPBI, pupDataBytes; PUSH BP MOV BP,SP PUSH CX PUSH BX ; { ; int i, pbiAlloc; ; int len; ; struct PBI *pbi; ; struct EtherEncapsulation *enc; ; struct Pup *pup; ADD SP,0FFF4X ; maxHops = 2; MOV ←maxHops,2 ; if (pupDataBytes==0) pupDataBytes = defaultPupDataBytes; ; BX ← ←pupDataBytes MOV BX,[BP-4] OR BX,BX JNZ X34 MOV WORD PTR [BP-4],0E6X X34: ; maxPupDataBytes = pupDataBytes; ; BX ← ←pupDataBytes MOV BX,[BP-4] MOV ←maxPupDataBytes,BX ; lenPup = (pupOvBytes+pupDataBytes)/2; ; BX ← ←pupDataBytes MOV BX,[BP-4] ADD BX,016X SAR BX MOV ←lenPup,BX ; lenPBI = lenPBIOverhead; MOV ←lenPBI,4 ; InitQueue(pbiIQ); /* level 1 raw pup input queue */ LEA BX,←pbiIQ CALL ←InitQueue ; InitQueue(pbiFreeQ); /* empty pbi queue */ LEA BX,←pbiFreeQ CALL ←InitQueue ; Zero(pupSockets, ((maxPupSockets+1)*lenSocketEntry)); MOV BX,037X LEA CX,←pupSockets CALL ←Zero ; len = lenPup + lenEtherEncapsulation; MOV BX,←lenPup INC BX INC BX ; ←len ← BX MOV [BP-10],BX ; for (i = 1; i <= numPBI; ++i) { MOV WORD PTR [BP-6],1 X37: ; BX ← ←numPBI MOV BX,[BP-2] ; CX ← ←i MOV CX,[BP-6] CMP CX,BX JG X36 JR X35 X38: INC WORD PTR [BP-6] JR X37 X35: ; enc = (struct EtherEncapsulation *) GetFixed(len); ; BX ← ←len MOV BX,[BP-10] CALL ←GetFixed ; ←enc ← BX MOV [BP-14],BX ; Zero(enc, len); ; BX ← ←len MOV BX,[BP-10] ; CX ← ←enc MOV CX,[BP-14] CALL ←Zero ; enc->type = typePup; ; BX ← ←enc MOV BX,[BP-14] MOV WORD PTR [BX+2],2 ; pbi = (struct PBI *) GetFixed(lenPBI); MOV BX,←lenPBI CALL ←GetFixed ; ←pbi ← BX MOV [BP-12],BX ; Zero(pbi, lenPBI); MOV BX,←lenPBI ; CX ← ←pbi MOV CX,[BP-12] CALL ←Zero ; pbi->pup = &enc->pup; ; BX ← ←pbi MOV BX,[BP-12] ; CX ← ←enc MOV CX,[BP-14] ADD CX,4 MOV [BX+6],CX ; ReleasePBI(pbi); ; BX ← ←pbi MOV BX,[BP-12] CALL ←ReleasePBI ; }; JR X38 X36: ; ageNet = 0; MOV ←ageNet,0 ; localNet = 0; /* Router will fill in proper value */ MOV ←localNet,0 ; localHost = currentHost = EtherHost(); CALL ←EtherHost MOV ←currentHost,BX MOV ←localHost,BX ; InitEther(pctxQ, 0); XOR BX,BX ; CX ← ←pctxQ MOV CX,[BP+4] CALL ←InitEther ; pupLevel1Ctx = InitNContext("PupLevel1", GetFixed(175), 175, &PupLevel1); MOV BX,"PupLevel1" PUSH BX MOV BX,0AFX CALL ←GetFixed PUSH BX MOV BX,OFFSET ←PupLevel1 MOV CX,0AFX CALL ←InitNContext ADD SP,4 MOV ←pupLevel1Ctx,BX ; Enqueue(pctxQ, pupLevel1Ctx); MOV BX,←pupLevel1Ctx ; CX ← ←pctxQ MOV CX,[BP+4] CALL ←Enqueue ; for (i = 0; i < maxNetworks; i += 1) { MOV WORD PTR [BP-6],0 X41: ; BX ← ←i MOV BX,[BP-6] CMP BX,0100X JGE X40 JR X39 X42: INC WORD PTR [BP-6] JR X41 X39: ; routingTable[i].host = 0; ; BX ← ←i MOV BX,[BP-6] LEA CX,←routingTable ADD CX,BX ADD CX,BX ADD BX,CX MOV BYTE PTR [BX],0 ; routingTable[i].hops = 100; ; BX ← ←i MOV BX,[BP-6] LEA CX,←routingTable ADD CX,BX ADD CX,BX ADD BX,CX MOV BYTE PTR [BX+1],064X ; routingTable[i].age = 0x00ff; ; BX ← ←i MOV BX,[BP-6] LEA CX,←routingTable ADD CX,BX ADD CX,BX ADD BX,CX MOV BYTE PTR [BX+2],0FFX ; }; JR X42 X40: ; }; MOV SP,BP POP BP RET; ; int /*BOOL*/ OpenLevel1Socket(lclPort, PortProc, Q) ←OpenLevel1Socket: ; struct Port *lclPort; ; int *PortProc /* PROC[pbi: ->PBI] */; ; struct Queue *Q; /* if true, PortProc is a queue pointer */ PUSH BP MOV BP,SP PUSH CX PUSH BX ; { ; int i; ; struct SocketEntry *entry; ; if (lclPort->net == 0) lclPort->net = localNet; ADD SP,0FFFCX ; DI ← ←lclPort MOV DI,[BP+4] MOV AL,[DI] OR AL,AL JNZ X43 ; BX ← ←lclPort MOV BX,[BP+4] MOV AX,←localNet MOV [BX],AL X43: ; if (lclPort->host == 0) lclPort->host = localHost; ; BX ← ←lclPort MOV BX,[BP+4] MOV AL,[BX+1] OR AL,AL JNZ X44 ; BX ← ←lclPort MOV BX,[BP+4] MOV AX,←localHost MOV [BX+1],AL X44: ; for (i = 1; i <= maxPupSockets; i += 1) { MOV WORD PTR [BP-6],1 X47: ; BX ← ←i MOV BX,[BP-6] CMP BX,0AX JG X46 JR X45 X48: INC WORD PTR [BP-6] JR X47 X45: ; entry = &pupSockets[i]; ; BX ← ←i MOV BX,[BP-6] LEA CX,←pupSockets MOV AX,0AX IMUL AX,BX ADD AX,CX ; ←entry ← AX POP DX PUSH AX ; if (MultEq(lclPort, &entry->port, lenPort)) CallSwat(ecPup1+10); ; BX ← ←lclPort MOV BX,[BP+4] PUSH BX MOV BX,3 ; CX ← ←entry MOV CX,[BP-8] CALL ←MultEq POP DX OR BX,BX JZ X49 MOV BX,0400AX CALL ←CallSwat X49: ; if (entry->q == 0) { ; BX ← ←entry POP BX PUSH BX MOV CX,[BX+8] OR CX,CX JNZ X50 ; MoveBlock(&entry->port, lclPort, lenPort); ; BX ← ←entry POP BX PUSH BX PUSH BX MOV BX,3 ; CX ← ←lclPort MOV CX,[BP+4] CALL ←MoveBlock POP DX ; entry->PortProc = PortProc; ; BX ← ←entry POP BX PUSH BX ; CX ← ←PortProc MOV CX,[BP-2] MOV [BX+6],CX ; if (Q == 0) Q = pbiIQ; ; BX ← ←Q MOV BX,[BP-4] OR BX,BX JNZ X51 LEA BX,←pbiIQ ; ←Q ← BX MOV [BP-4],BX X51: ; entry->q = Q; ; BX ← ←entry POP BX PUSH BX ; CX ← ←Q MOV CX,[BP-4] MOV [BX+8],CX ; return(i); ; BX ← ←i MOV BX,[BP-6] MOV SP,BP POP BP RET; ; }; X50: ; }; JR X48 X46: ; CallSwat(ecPup1+11); MOV BX,0400BX CALL ←CallSwat ; return(false); /* Table full! */ XOR BX,BX MOV SP,BP POP BP RET; ; }; ; SetLocalNet(net) ←SetLocalNet: ; int net; PUSH BP MOV BP,SP PUSH BX ; { ; int i; PUSH DX ; localNet = net; ; BX ← ←net MOV BX,[BP-2] MOV ←localNet,BX ; for (i = 1; i <= maxPupSockets; ++i) { MOV WORD PTR [BP-4],1 X54: ; BX ← ←i POP BX PUSH BX CMP BX,0AX JG X53 JR X52 X55: INC WORD PTR [BP-4] JR X54 X52: ; pupSockets[i].port.net = net; ; BX ← ←i POP BX PUSH BX LEA CX,←pupSockets MOV AX,0AX IMUL AX,BX ADD AX,CX MOV BX,AX ; AL ← ←net MOV AL,[BP-2] MOV [BX],AL ; }; JR X55 X53: ; }; MOV SP,BP POP BP RET; ; CloseLevel1Socket(soc) ←CloseLevel1Socket: ; int soc; PUSH BP MOV BP,SP PUSH BX ; { ; Zero(&pupSockets[soc], lenSocketEntry); ; BX ← ←soc POP BX PUSH BX LEA CX,←pupSockets MOV AX,0AX IMUL AX,BX ADD AX,CX MOV BX,5 MOV CX,AX CALL ←Zero ; }; MOV SP,BP POP BP RET; ; Externals Declared Here PUBLIC ←lenPBI PUBLIC ←lenPup PUBLIC ←maxPupDataBytes PUBLIC ←localNet PUBLIC ←localHost PUBLIC ←currentHost PUBLIC ←maxHops PUBLIC ←pupSockets PUBLIC ←routingTable PUBLIC ←ReleasePBI PUBLIC ←SendPup PUBLIC ←WaitUntilSent PUBLIC ←LookupNet PUBLIC ←GenerateNets PUBLIC ←NextNet PUBLIC ←GetPBI PUBLIC ←MaybeGetPBI PUBLIC ←AppendStringToPup PUBLIC ←GetPupHost PUBLIC ←InitPupLevel1 PUBLIC ←OpenLevel1Socket PUBLIC ←SetLocalNet PUBLIC ←CloseLevel1Socket C←CODE ENDS ; Number of Bytes of Code = 05AEX, (1454)