;Alto->8086 small-c compiler rev 2.0 C←CODE SEGMENT $INCLUDE(8086LIB.D) $INCLUDE(FixedAlloc.DEC) ASSUME CS:C←CODE, DS:C←DATA ; #include "env.h" ; struct Pool { ; struct Queue freeList; ; int owner; ; int numItems; ; int lenItem; ; }; ; struct GFOb { ; int owner; ; int owner2; ; int length; ; int data[1]; ; }; ; extern int end; /* See endml.asm; end of static storage */ ; int *endFixed; ; int totAv; ; InitFA() ←InitFA: PUSH BP MOV BP,SP ; { ; int ans; PUSH DX ; ans = (int) &end; LEA BX,←end ; ←ans ← BX POP DX PUSH BX ; ans = (ans + 1) & -2; /* round up */ ; BX ← ←ans POP BX INC BX AND BX,0FFFEX ; ←ans ← BX PUSH BX ; endFixed = (int *) ans; ; BX ← ←ans POP BX PUSH BX MOV ←endFixed,BX ; Zero(endFixed, FixedLeft()); CALL ←FixedLeft MOV CX,←endFixed CALL ←Zero ; }; MOV SP,BP POP BP RET; ; int FixedLeft() ←FixedLeft: PUSH BP MOV BP,SP ; { ; int ans; PUSH DX ; ans = (int) endFixed; MOV BX,←endFixed ; ←ans ← BX POP DX PUSH BX ; totAv = (memTop - ans) >> 1; ; BX ← ←ans POP BX PUSH BX MOV CX,0CFFEX SUB CX,BX SHR CX MOV ←totAv,CX ; return (totAv); MOV BX,←totAv MOV SP,BP POP BP RET; ; }; ; int *GetFixed(nWords) ←GetFixed: ; int nWords; PUSH BP MOV BP,SP PUSH BX ; { ; struct GFOb *fp; ; if (Ugt(endFixed + nWords + lenGFOb + lenGFOb, memTop)) CallDebugger(ecAllocate+5); PUSH DX ; BX ← ←nWords MOV BX,[BP-2] ADD BX,6 MOV CX,←endFixed SAL BX ADD BX,CX PUSH BX MOV BX,0CFFEX POP CX CALL ←Ugt OR BX,BX JZ X1 MOV BX,01005X CALL ←CallDebugger X1: ; fp = (struct GFOb *) endFixed; MOV BX,←endFixed ; ←fp ← BX POP DX PUSH BX ; endFixed += lenGFOb; ADD ←endFixed,6 ; endFixed += nWords; ; BX ← ←nWords MOV BX,[BP-2] SAL BX ADD ←endFixed,BX ; Zero(fp, lenGFOb + nWords + lenGFOb); ; BX ← ←nWords MOV BX,[BP-2] ADD BX,3 ADD BX,3 ; CX ← ←fp POP CX PUSH CX CALL ←Zero ; fp->length = nWords; ; BX ← ←fp POP BX PUSH BX ; CX ← ←nWords MOV CX,[BP-2] MOV [BX+4],CX ; fp->owner = ReturnLoc(MyFrame()); CALL ←MyFrame CALL ←ReturnLoc MOV CX,BX ; BX ← ←fp POP BX PUSH BX MOV [BX],CX ; fp->owner2 = ReturnLoc(CallersFrame(MyFrame())); ; BX ← ←fp POP BX PUSH BX PUSH BX CALL ←MyFrame CALL ←CallersFrame CALL ←ReturnLoc MOV CX,BX POP BX MOV [BX+2],CX ; return(&fp->data[0]); ; BX ← ←fp POP BX PUSH BX ADD BX,6 MOV SP,BP POP BP RET; ; }; ; struct Pool *CreatePool(itemSize, nItems) ←CreatePool: ; int itemSize, nItems; PUSH BP MOV BP,SP PUSH CX PUSH BX ; { ; struct Pool *pool; ; int i; ADD SP,0FFFCX ; pool = (struct Pool *) GetFixed(lenPool); MOV BX,5 CALL ←GetFixed ; ←pool ← BX MOV [BP-6],BX ; InitQueue(&pool->freeList); ; BX ← ←pool MOV BX,[BP-6] CALL ←InitQueue ; pool->owner = ReturnLoc(MyFrame()); ; BX ← ←pool MOV BX,[BP-6] PUSH BX CALL ←MyFrame CALL ←ReturnLoc MOV CX,BX POP BX MOV [BX+4],CX ; pool->numItems = nItems; ; BX ← ←pool MOV BX,[BP-6] ; CX ← ←nItems MOV CX,[BP-4] MOV [BX+6],CX ; pool->lenItem = itemSize; ; BX ← ←pool MOV BX,[BP-6] ; CX ← ←itemSize MOV CX,[BP-2] MOV [BX+8],CX ; for (i = 0; i < nItems; i += 1) Enqueue(&pool->freeList, GetFixed(itemSize)); MOV WORD PTR [BP-8],0 X4: ; BX ← ←nItems MOV BX,[BP-4] ; CX ← ←i POP CX PUSH CX CMP CX,BX JGE X3 JR X2 X5: INC WORD PTR [BP-8] JR X4 X2: ; BX ← ←itemSize MOV BX,[BP-2] CALL ←GetFixed ; CX ← ←pool MOV CX,[BP-6] CALL ←Enqueue JR X5 X3: ; }; MOV SP,BP POP BP RET; ; int *GetItem(pool) ←GetItem: ; struct Pool *pool; PUSH BP MOV BP,SP PUSH BX ; { ; return(Dequeue(&pool->freeList)); ; BX ← ←pool POP BX PUSH BX CALL ←Dequeue MOV SP,BP POP BP RET; ; }; ; FreeItem(pool, item) ←FreeItem: ; struct Pool *pool; ; int *item; PUSH BP MOV BP,SP PUSH CX PUSH BX ; { ; Enqueue(&pool->freeList, item); ; BX ← ←item POP BX PUSH BX ; CX ← ←pool MOV CX,[BP-2] CALL ←Enqueue ; }; MOV SP,BP POP BP RET; ; Externals Declared Here PUBLIC ←endFixed PUBLIC ←totAv PUBLIC ←InitFA PUBLIC ←FixedLeft PUBLIC ←GetFixed PUBLIC ←CreatePool PUBLIC ←GetItem PUBLIC ←FreeItem C←CODE ENDS ; Number of Bytes of Code = 0138X, (312)