;Alto->8086 small-c compiler rev 2.0 C←CODE SEGMENT $INCLUDE(8086LIB.D) $INCLUDE(rpcbonsai.DEC) ASSUME CS:C←CODE, DS:C←DATA ; #include <Signal.h> ; extern int Call(); ; extern int *mySoc; ; extern StartCall(); ; extern int RejectUnbound; ; extern struct PBI *GetPBI(); ; extern ReleasePBI(); ; extern DISABLE(); ; extern ENABLEWithFrame(); ; extern SIGNAL(); ; extern Call1(); ; extern CallersFrame(); ; extern MoveBlock(); ; extern MyFrame(); ; static UnwindPkt(sig, code, seal) ←UnwindPkt: ; int sig, code; ; struct Seal1 *seal; PUSH BP MOV BP,SP PUSH CX PUSH BX ; { ; ReleasePBI(seal->data[0]); ; BX ← ←seal POP BX PUSH BX ADD BX,4 MOV CX,[BX] MOV BX,CX CALL ←ReleasePBI ; DISABLE(seal); ; BX ← ←seal POP BX PUSH BX CALL ←DISABLE ; }; MOV SP,BP POP BP RET; ; static struct PBI ; *GetUnwindPkt(seal) ←GetUnwindPkt: ; struct Seal1 *seal; PUSH BP MOV BP,SP PUSH BX ; { ; struct PBI *pkt; PUSH DX ; pkt = GetPBI(mySoc); MOV BX,←mySoc CALL ←GetPBI ; ←pkt ← BX POP DX PUSH BX ; ENABLEWithFrame(UNWIND, &UnwindPkt, seal, CallersFrame(MyFrame())); MOV BX,1 PUSH BX MOV BX,OFFSET ←UnwindPkt PUSH BX CALL ←MyFrame CALL ←CallersFrame ; CX ← ←seal MOV CX,[BP-2] CALL ←ENABLEWithFrame ADD SP,4 ; seal->data[0] = (int) pkt; ; BX ← ←seal MOV BX,[BP-2] ADD BX,4 ; CX ← ←pkt POP CX PUSH CX MOV [BX],CX ; return (pkt); ; BX ← ←pkt POP BX PUSH BX MOV SP,BP POP BP RET; ; }; ; int *StartBonsai(interface, seal) ←StartBonsai: ; struct ImportInstance *interface; ; struct Seal1 *seal; PUSH BP MOV BP,SP PUSH CX PUSH BX ; { ; struct PBI *pkt; ; struct Header *hdr; ADD SP,0FFFCX ; pkt = GetUnwindPkt(seal); ; BX ← ←seal MOV BX,[BP-4] CALL ←GetUnwindPkt ; ←pkt ← BX MOV [BP-6],BX ; StartCall(pkt, interface, interface->currentConversation); ; BX ← ←pkt MOV BX,[BP-6] PUSH BX ; BX ← ←interface MOV BX,[BP-2] MOV CX,[BX+2] MOV BX,CX ; CX ← ←interface MOV CX,[BP-2] CALL ←StartCall POP DX ; hdr = pkt->pup; ; BX ← ←pkt MOV BX,[BP-6] MOV CX,[BX+6] ; ←hdr ← CX POP DX PUSH CX ; return(&hdr->callData.words[0]); ; BX ← ←hdr POP BX PUSH BX ADD BX,028X MOV SP,BP POP BP RET; ; }; ; CallBonsai(seal, arglen) ←CallBonsai: ; struct Seal1 *seal; ; int arglen; PUSH BP MOV BP,SP PUSH CX PUSH BX ; { ; Call(seal->data[0], arglen, maxDataLength); ; BX ← ←seal MOV BX,[BP-2] ADD BX,4 MOV CX,[BX] PUSH CX MOV BX,076X ; CX ← ←arglen MOV CX,[BP-4] CALL ←Call POP DX ; }; MOV SP,BP POP BP RET; ; CleanupCall(seal) ←CleanupCall: ; struct Seal1 *seal; PUSH BP MOV BP,SP PUSH BX ; { ; ReleasePBI(seal->data[0]); ; BX ← ←seal POP BX PUSH BX ADD BX,4 MOV CX,[BX] MOV BX,CX CALL ←ReleasePBI ; DISABLE(seal); ; BX ← ←seal POP BX PUSH BX CALL ←DISABLE ; }; MOV SP,BP POP BP RET; ; int BonsaiDispatcher(pkt, newLength, conversation, sSpecsT) ←BonsaiDispatcher: ; struct PBI *pkt; ; int newLength; ; int *conversation; ; struct SSpecsTable *sSpecsT; PUSH BP MOV BP,SP PUSH CX PUSH BX ; { ; int rout, argLen, *wp; ; int thisProc; ; struct Header *hdr; ADD SP,0FFF6X ; hdr = pkt->pup; ; BX ← ←pkt MOV BX,[BP+6] MOV CX,[BX+6] ; ←hdr ← CX POP DX PUSH CX ; wp = &hdr->callData.words[0]; ; BX ← ←hdr POP BX PUSH BX ADD BX,028X ; ←wp ← BX MOV [BP-10],BX ; rout = Swab(*wp); ; DI ← ←wp MOV DI,[BP-10] MOV BX,[DI] CALL ←Swab ; ←rout ← BX MOV [BP-6],BX ; if ((rout < lupineOffset) || (rout > sSpecsT->maxProcs)) SIGNAL(RejectUnbound); ; BX ← ←rout MOV BX,[BP-6] CMP BX,4 JL X3 ; DI ← ←sSpecsT MOV DI,[BP-4] MOV BX,[DI] ; CX ← ←rout MOV CX,[BP-6] CMP CX,BX JLE X2 X3: MOV AL,1 JR X4 X2: XOR AL,AL X4: OR AL,AL JZ X1 MOV BX,←RejectUnbound CALL ←SIGNAL X1: ; thisProc = sSpecsT->procs[rout]; ; BX ← ←sSpecsT MOV BX,[BP-4] INC BX INC BX ; CX ← ←rout MOV CX,[BP-6] SAL CX ADD BX,CX MOV CX,[BX] ; ←thisProc ← CX MOV [BP-12],CX ; if (thisProc == 0) SIGNAL(RejectUnbound); ; BX ← ←thisProc MOV BX,[BP-12] OR BX,BX JNZ X5 MOV BX,←RejectUnbound CALL ←SIGNAL X5: ; return (Call1(thisProc, wp)); ; BX ← ←wp MOV BX,[BP-10] ; CX ← ←thisProc MOV CX,[BP-12] CALL ←Call1 MOV SP,BP POP BP RET; ; }; ; int *StringToPkt(pp, s) ←StringToPkt: ; int *pp; ; struct ShortSTRING *s; PUSH BP MOV BP,SP PUSH CX PUSH BX ; { ; int len; ; if (s == 0) *pp++ = swapped1; /* isNil */ PUSH DX ; BX ← ←s MOV BX,[BP-4] OR BX,BX JNZ X6 ADD WORD PTR [BP-2],2 ; BX ← ←pp MOV BX,[BP-2] MOV WORD PTR [BX-2],0100X ; else { JR X7 X6: ; *pp++ = 0; /* isNil */ ADD WORD PTR [BP-2],2 ; BX ← ←pp MOV BX,[BP-2] MOV WORD PTR [BX-2],0 ; *pp++ = Swab(s->length); ADD WORD PTR [BP-2],2 ; BX ← ←pp MOV BX,[BP-2] PUSH BX ; DI ← ←s MOV DI,[BP-4] MOV BX,[DI] CALL ←Swab MOV CX,BX POP BX MOV [BX-2],CX ; len = (s->length+1) >> 1; /* text only */ ; DI ← ←s MOV DI,[BP-4] MOV BX,[DI] INC BX SHR BX ; ←len ← BX POP DX PUSH BX ; MoveBlock(pp, &s->text[0], len); ; BX ← ←pp MOV BX,[BP-2] PUSH BX ; BX ← ←s MOV BX,[BP-4] ADD BX,4 PUSH BX ; BX ← ←len MOV BX,[BP-6] POP CX CALL ←MoveBlock POP DX ; pp += len; ; BX ← ←len POP BX PUSH BX SAL BX ADD [BP-2],BX ; }; X7: ; return (pp); ; BX ← ←pp MOV BX,[BP-2] MOV SP,BP POP BP RET; ; }; ; struct ShortSTRING ; *AllocStringFromPkt(pp) ←AllocStringFromPkt: ; int **pp; PUSH BP MOV BP,SP PUSH BX ; { ; int len, *wp; ; struct ShortSTRING *s; ADD SP,0FFFAX ; wp = *pp; ; DI ← ←pp MOV DI,[BP-2] MOV BX,[DI] ; ←wp ← BX MOV [BP-6],BX ; if (*wp) { ; DI ← ←wp MOV DI,[BP-6] MOV BX,[DI] OR BX,BX JZ X8 ; *pp = wp+1; ; BX ← ←wp MOV BX,[BP-6] INC BX INC BX MOV CX,BX ; BX ← ←pp MOV BX,[BP-2] MOV [BX],CX ; return(0); XOR BX,BX MOV SP,BP POP BP RET; ; }; X8: ; len = (Swab(wp[1])+5)/2; ; BX ← ←wp MOV BX,[BP-6] MOV CX,[BX+2] MOV BX,CX CALL ←Swab ADD BX,5 SAR BX ; ←len ← BX MOV [BP-4],BX ; if (len > 100) CallSwat(ecLarkImpl + 22); ; BX ← ←len MOV BX,[BP-4] CMP BX,064X JLE X9 MOV BX,07016X CALL ←CallSwat X9: ; s = (struct ShortSTRING *) GetFixed(len); ; BX ← ←len MOV BX,[BP-4] CALL ←GetFixed ; ←s ← BX POP DX PUSH BX ; MoveBlock(s, wp, len); ; BX ← ←s POP BX PUSH BX PUSH BX ; BX ← ←len MOV BX,[BP-4] ; CX ← ←wp MOV CX,[BP-6] CALL ←MoveBlock POP DX ; s->maxLength = Swab(s->maxLength); ; BX ← ←s POP BX PUSH BX PUSH BX ; BX ← ←s MOV BX,[BP-8] MOV CX,[BX+2] MOV BX,CX CALL ←Swab MOV CX,BX POP BX MOV [BX+2],CX ; s->length = s->maxLength; ; BX ← ←s POP BX PUSH BX MOV CX,[BX+2] ; BX ← ←s POP BX PUSH BX MOV [BX],CX ; *pp = wp + len; ; BX ← ←len MOV BX,[BP-4] ; CX ← ←wp MOV CX,[BP-6] SAL BX ADD BX,CX MOV CX,BX ; BX ← ←pp MOV BX,[BP-2] MOV [BX],CX ; return(s); ; BX ← ←s POP BX PUSH BX MOV SP,BP POP BP RET; ; }; ; int *AllocWordsFromPkt(pp, swap) ←AllocWordsFromPkt: ; int **pp; ; int swap; /* boolean */ PUSH BP MOV BP,SP PUSH CX PUSH BX ; { ; int len, *wp; ; int *wseq; ADD SP,0FFFAX ; wp = *pp; ; DI ← ←pp MOV DI,[BP-2] MOV BX,[DI] ; ←wp ← BX MOV [BP-8],BX ; if (*wp) { ; DI ← ←wp MOV DI,[BP-8] MOV BX,[DI] OR BX,BX JZ X10 ; *pp = wp+1; ; BX ← ←wp MOV BX,[BP-8] INC BX INC BX MOV CX,BX ; BX ← ←pp MOV BX,[BP-2] MOV [BX],CX ; return(0); XOR BX,BX MOV SP,BP POP BP RET; ; }; X10: ; len = Swab(wp[1]); ; BX ← ←wp MOV BX,[BP-8] MOV CX,[BX+2] MOV BX,CX CALL ←Swab ; ←len ← BX MOV [BP-6],BX ; if (len > 100) CallSwat(ecLarkImpl + 22); ; BX ← ←len MOV BX,[BP-6] CMP BX,064X JLE X11 MOV BX,07016X CALL ←CallSwat X11: ; wseq = GetFixed(len+1); ; BX ← ←len MOV BX,[BP-6] INC BX CALL ←GetFixed ; ←wseq ← BX POP DX PUSH BX ; *wseq = Swab(wp[3]); ; BX ← ←wp MOV BX,[BP-8] MOV CX,[BX+6] MOV BX,CX CALL ←Swab MOV CX,BX ; BX ← ←wseq POP BX PUSH BX MOV [BX],CX ; Marshall(swap, wseq+1, &wp[4], len); ; BX ← ←swap MOV BX,[BP-4] PUSH BX ; BX ← ←wseq MOV BX,[BP-10] INC BX INC BX PUSH BX ; BX ← ←wp MOV BX,[BP-8] ADD BX,8 PUSH BX ; BX ← ←len MOV BX,[BP-6] POP CX CALL ←Marshall ADD SP,4 ; *pp = wp + len + 4; ; BX ← ←len MOV BX,[BP-6] ADD BX,4 ; CX ← ←wp MOV CX,[BP-8] SAL BX ADD BX,CX MOV CX,BX ; BX ← ←pp MOV BX,[BP-2] MOV [BX],CX ; return(wseq); ; BX ← ←wseq POP BX PUSH BX MOV SP,BP POP BP RET; ; }; ; SwabInPlace(addr, words) ←SwabInPlace: ; int *addr, words; PUSH BP MOV BP,SP PUSH CX PUSH BX ; { ; Marshall(true, addr, addr, words); MOV BX,0FFFFX PUSH BX ; BX ← ←addr MOV BX,[BP-2] PUSH BX ; BX ← ←words MOV BX,[BP-4] ; CX ← ←addr MOV CX,[BP-2] CALL ←Marshall ADD SP,4 ; }; MOV SP,BP POP BP RET; ; Externals Declared Here PUBLIC ←StartBonsai PUBLIC ←CallBonsai PUBLIC ←CleanupCall PUBLIC ←BonsaiDispatcher PUBLIC ←StringToPkt PUBLIC ←AllocStringFromPkt PUBLIC ←AllocWordsFromPkt PUBLIC ←SwabInPlace C←CODE ENDS ; Number of Bytes of Code = 02DDX, (733)