;Alto->8086 small-c compiler rev 2.0
C←CODE SEGMENT

$INCLUDE(8086LIB.D)

$INCLUDE(alloc.DEC)

ASSUME CS:C←CODE, DS:C←DATA

; #include	"alloc.h"

; extern int end;	/* See endml.asm; end of static storage */

; extern Zero();

; extern Usc();

; extern CallSwat();

; extern UMax();

; extern ReturnLoc();

; extern MyFrame();

; struct ZN *GetAll() {
←GetAll:
PUSH BP
MOV BP,SP

;   char *z;

;   int len;

;   struct ZN *zn;
ADD SP,0FFFAX

;   z = (char *) (((int) &end+1)&(-2));
LEA BX,←end
INC BX
AND BX,0FFFEX

;	←z ← BX
MOV [BP-2],BX

;   len = zoneTop - ((int) z);

;	BX ← ←z
MOV BX,[BP-2]
MOV CX,0CFFEX
SUB CX,BX

;	←len ← CX
MOV [BP-4],CX

;   if (Usc(len, 0x7FFF) > 0) {
MOV BX,07FFFX

;	CX ← ←len
MOV CX,[BP-4]
CALL ←Usc
CMP BX,0
JLE X1

; 	zn = InitializeZone(z, 0x3FF0);
MOV BX,03FF0X

;	CX ← ←z
MOV CX,[BP-2]
CALL ←InitializeZone

;	←zn ← BX
POP DX
PUSH BX

; 	AddToZone(zn, z+0x7FF0, (len-0x7FF0)>>1);

;	BX ← ←zn
POP BX
PUSH BX
PUSH BX

;	BX ← ←z
MOV BX,[BP-2]
ADD BX,07FF0X

;	CX ← ←len
MOV CX,[BP-4]
ADD CX,08010X
SHR CX
XCHG BX,CX
CALL ←AddToZone
POP DX

;         };

;   else zn = InitializeZone(z, len>>1);
JR X2
X1:

;	BX ← ←len
MOV BX,[BP-4]
SHR BX

;	CX ← ←z
MOV CX,[BP-2]
CALL ←InitializeZone

;	←zn ← BX
POP DX
PUSH BX
X2:

;   return(zn);

;	BX ← ←zn
POP BX
PUSH BX
MOV SP,BP
POP BP
RET;

;   };

; struct ZN *InitializeZone(z, len)
←InitializeZone:

;   struct ZN *z;		/* first available address */

;   int len;		/* length in words */
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX

;   {

;   struct SB *firstfree;

;   struct ZN *tempznp;
ADD SP,0FFFCX

;   z->anchor.length = 0;

;	BX ← ←z
MOV BX,[BP-2]
MOV WORD PTR [BX],0

;   z->anchor.pSbPrevious = z->anchor.pSbNext = &z->anchor;

;	BX ← ←z
MOV BX,[BP-2]

;	CX ← ←z
MOV CX,[BP-2]
XCHG BX,CX

;	AX ← ←z
MOV AX,[BP-2]
MOV [BX+4],AX
MOV BX,CX
MOV [BX+6],AX

;   tempznp = z+1;  /* first address after header */

;	BX ← ←z
MOV BX,[BP-2]
ADD BX,0EX

;	←tempznp ← BX
POP DX
PUSH BX

;   firstfree = (struct SB *) tempznp;

;	BX ← ←tempznp
POP BX
PUSH BX

;	←firstfree ← BX
MOV [BP-6],BX

;   z->rover = firstfree;

;	BX ← ←z
MOV BX,[BP-2]

;	CX ← ←firstfree
MOV CX,[BP-6]
MOV [BX+8],CX

;   z->minAdr = (int *) firstfree;

;	BX ← ←z
MOV BX,[BP-2]

;	CX ← ←firstfree
MOV CX,[BP-6]
MOV [BX+10],CX

;   z->maxAdr = (int *) firstfree;

;	BX ← ←z
MOV BX,[BP-2]

;	CX ← ←firstfree
MOV CX,[BP-6]
MOV [BX+12],CX

;   AddToZone(z, firstfree, len-(lZn>>1));

;	BX ← ←z
MOV BX,[BP-2]
PUSH BX

;	BX ← ←len
MOV BX,[BP-4]
ADD BX,0FFF9X

;	CX ← ←firstfree
MOV CX,[BP-6]
CALL ←AddToZone
POP DX

;   return(z);

;	BX ← ←z
MOV BX,[BP-2]
MOV SP,BP
POP BP
RET;

;   };

; AddToZone(z, s, len)
←AddToZone:

;   struct ZN *z;		/* zone itself */

;   struct SB *s;		/* first available address */

;   int len;		/* available length */
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX

;   {

;   int lSbFree, *sbLast;

;   char *cp;
ADD SP,0FFFAX

;   len = len << 1;

;	BX ← ←len
MOV BX,[BP-4]
SAL BX

;	←len ← BX
MOV [BP-4],BX

;   lSbFree = len-lSbOverhead;

;	BX ← ←len
MOV BX,[BP-4]
ADD BX,0FFFCX

;	←lSbFree ← BX
MOV [BP-6],BX

;   if ((lSbFree < minLSbFree) || (Usc(len, 077774) > 0)) CallSwat(ecAllocate+ 1);

;	BX ← ←lSbFree
MOV BX,[BP-6]
CMP BX,8
JL X5
MOV BX,07FFCX

;	CX ← ←len
MOV CX,[BP-4]
CALL ←Usc
CMP BX,0
JLE X4
X5:
MOV AL,1
JR X6
X4:
XOR AL,AL
X6:
OR AL,AL
JZ X3
MOV BX,01001X
CALL ←CallSwat
X3:

;   cp = (char *) s;

;	BX ← ←s
MOV BX,[BP-2]

;	←cp ← BX
POP DX
PUSH BX

;   cp = cp+lSbFree;

;	BX ← ←lSbFree
MOV BX,[BP-6]

;	CX ← ←cp
POP CX
ADD BX,CX

;	←cp ← BX
PUSH BX

;   sbLast = (int *) cp; /* address of the -1 */

;	BX ← ←cp
POP BX
PUSH BX

;	←sbLast ← BX
MOV [BP-8],BX

;   *sbLast = -1;	/* last word of free space */

;	BX ← ←sbLast
MOV BX,[BP-8]
MOV WORD PTR [BX],0FFFFX

;   {

;   int *min, *max, ti, tib;
ADD SP,0FFF8X

;   min = z->minAdr;

;	BX ← ←z
MOV BX,[BP+4]
MOV CX,[BX+10]

;	←min ← CX
MOV [BP-12],CX

;   if (Usc(s, min) < 0) {

;	BX ← ←min
MOV BX,[BP-12]

;	CX ← ←s
MOV CX,[BP-2]
CALL ←Usc
CMP BX,0
JGE X7

;     if (Usc(sbLast, min) >= 0) CallSwat(ecAllocate+2);

;	BX ← ←min
MOV BX,[BP-12]

;	CX ← ←sbLast
MOV CX,[BP-8]
CALL ←Usc
CMP BX,0
JL X8
MOV BX,01002X
CALL ←CallSwat
X8:

;     ti = (int) sbLast;

;	BX ← ←sbLast
MOV BX,[BP-8]

;	←ti ← BX
MOV [BP-16],BX

;     tib = (int) min;

;	BX ← ←min
MOV BX,[BP-12]

;	←tib ← BX
POP DX
PUSH BX

;     ti = ti - tib;

;	BX ← ←tib
POP BX
PUSH BX

;	CX ← ←ti
MOV CX,[BP-16]
SUB CX,BX

;	←ti ← CX
MOV [BP-16],CX

;     *sbLast = ti;

;	BX ← ←sbLast
MOV BX,[BP-8]

;	CX ← ←ti
MOV CX,[BP-16]
MOV [BX],CX

;     z->minAdr = (int *) s;

;	BX ← ←z
MOV BX,[BP+4]

;	CX ← ←s
MOV CX,[BP-2]
MOV [BX+10],CX

;     };

;   else {
JR X9
X7:

;     max = z->maxAdr;

;	BX ← ←z
MOV BX,[BP+4]
MOV CX,[BX+12]

;	←max ← CX
MOV [BP-14],CX

;     if (Usc(s, max) < 0) CallSwat(ecAllocate+3);

;	BX ← ←max
MOV BX,[BP-14]

;	CX ← ←s
MOV CX,[BP-2]
CALL ←Usc
CMP BX,0
JGE X10
MOV BX,01003X
CALL ←CallSwat
X10:

;     ti = (int) max;

;	BX ← ←max
MOV BX,[BP-14]

;	←ti ← BX
MOV [BP-16],BX

;     tib = (int) s;

;	BX ← ←s
MOV BX,[BP-2]

;	←tib ← BX
POP DX
PUSH BX

;     ti = ti - tib;

;	BX ← ←tib
POP BX
PUSH BX

;	CX ← ←ti
MOV CX,[BP-16]
SUB CX,BX

;	←ti ← CX
MOV [BP-16],CX

;     *max = ti;

;	BX ← ←max
MOV BX,[BP-14]

;	CX ← ←ti
MOV CX,[BP-16]
MOV [BX],CX

;     z->maxAdr = (int *) sbLast;

;	BX ← ←z
MOV BX,[BP+4]

;	CX ← ←sbLast
MOV CX,[BP-8]
MOV [BX+12],CX

;     };
X9:

;   };
ADD SP,8

;   s->length = -lSbFree;

;	BX ← ←lSbFree
MOV BX,[BP-6]
NEG BX
MOV CX,BX

;	BX ← ←s
MOV BX,[BP-2]
MOV [BX],CX

;   Free(z, &s->data);

;	BX ← ←s
MOV BX,[BP-2]
ADD BX,4

;	CX ← ←z
MOV CX,[BP+4]
CALL ←Free

;   };
MOV SP,BP
POP BP
RET;

; extern int largest

; extern int totAv;

; #asm

;***  illegal symbol name ***

; #asm



←Allocate:


; int *Alloc(z, numWords)
←Alloc:

;   struct ZN *z;

;   int numWords;
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX

;   {

;   int lSbData, ia, ib, lSb, extra, siz, zeroRqst;

;   struct SB *s, *sbRover, *sbOriginalRover, *sbNext;
ADD SP,0FFEAX

;   largest = totAv = zeroRqst = 0;
MOV WORD PTR [BP-18],0
MOV ←totAv,0
MOV ←largest,0

;   if (numWords<0 && numWords>=-2000) { numWords = -numWords; zeroRqst=-1; };

;	BX ← ←numWords
MOV BX,[BP-4]
CMP BX,0
JGE X12

;	BX ← ←numWords
MOV BX,[BP-4]
CMP BX,0F830X
JL X12
MOV AL,1
JR X13
X12:
XOR AL,AL
X13:
OR AL,AL
JZ X11

;	BX ← ←numWords
MOV BX,[BP-4]
NEG BX

;	←numWords ← BX
MOV [BP-4],BX
MOV WORD PTR [BP-18],0FFFFX
X11:

;   lSbData = numWords << 1;

;	BX ← ←numWords
MOV BX,[BP-4]
SAL BX

;	←lSbData ← BX
MOV [BP-6],BX

;   if (numWords==0) lSbData = 0xFFF0; /* Testing largest avail. */

;	BX ← ←numWords
MOV BX,[BP-4]
OR BX,BX
JNZ X14
MOV WORD PTR [BP-6],0FFF0X
X14:

;   lSb = UMax(lSbData + lSbOverhead, minLSbFree)

;	BX ← ←lSbData
MOV BX,[BP-6]
ADD BX,4
PUSH BX
MOV BX,8
POP CX
CALL ←UMax

;	←lSb ← BX
MOV [BP-12],BX

;   sbOriginalRover = sbRover = z->rover;

;	BX ← ←z
MOV BX,[BP-2]
MOV CX,[BX+8]

;	←sbRover ← CX
MOV [BP-22],CX

;	←sbOriginalRover ← CX
MOV [BP-24],CX

;   for (;;)  {
X15:

;   for (;;) {
X17:

;     ia = (int) sbRover;

;	BX ← ←sbRover
MOV BX,[BP-22]

;	←ia ← BX
MOV [BP-8],BX

;     ia = ia + sbRover->length; 

;	DI ← ←sbRover
MOV DI,[BP-22]
MOV BX,[DI]

;	CX ← ←ia
MOV CX,[BP-8]
ADD CX,BX

;	←ia ← CX
MOV [BP-8],CX

;     sbNext = (struct SB *) ia;

;	BX ← ←ia
MOV BX,[BP-8]

;	←sbNext ← BX
POP DX
PUSH BX

;     if (sbNext->length <= 0) break;

;	DI ← ←sbNext
POP DI
PUSH DI
MOV BX,[DI]
CMP BX,0
JG X19
JR X18
X19:

;     if (sbNext == sbOriginalRover) sbOriginalRover = sbNext->pSbNext;

;	BX ← ←sbOriginalRover
MOV BX,[BP-24]

;	CX ← ←sbNext
POP CX
PUSH CX
CMP CX,BX
JNZ X20

;	BX ← ←sbNext
POP BX
PUSH BX
MOV CX,[BX+4]

;	←sbOriginalRover ← CX
MOV [BP-24],CX
X20:

;     sbNext->pSbNext->pSbPrevious = sbNext->pSbPrevious;

;	BX ← ←sbNext
POP BX
PUSH BX
MOV CX,[BX+4]

;	BX ← ←sbNext
POP BX
PUSH BX
MOV AX,[BX+6]
MOV BX,CX
MOV [BX+6],AX

;     sbNext->pSbPrevious->pSbNext = sbNext->pSbNext;

;	BX ← ←sbNext
POP BX
PUSH BX
MOV CX,[BX+6]

;	BX ← ←sbNext
POP BX
PUSH BX
MOV AX,[BX+4]
MOV BX,CX
MOV [BX+4],AX

;     sbRover->length += sbNext->length;

;	BX ← ←sbRover
MOV BX,[BP-22]

;	DI ← ←sbNext
POP DI
PUSH DI
MOV CX,[DI]
ADD [BX],CX

;     };
JR X17
X18:

;   ia = (int) sbNext;

;	BX ← ←sbNext
POP BX
PUSH BX

;	←ia ← BX
MOV [BP-8],BX

;   ia = ia - lSb;

;	BX ← ←lSb
MOV BX,[BP-12]

;	CX ← ←ia
MOV CX,[BP-8]
SUB CX,BX

;	←ia ← CX
MOV [BP-8],CX

;   s = (struct SB *) ia;

;	BX ← ←ia
MOV BX,[BP-8]

;	←s ← BX
MOV [BP-20],BX

;   ib = (int) sbRover;

;	BX ← ←sbRover
MOV BX,[BP-22]

;	←ib ← BX
MOV [BP-10],BX

;   extra = ia - ib;

;	BX ← ←ib
MOV BX,[BP-10]

;	CX ← ←ia
MOV CX,[BP-8]
SUB CX,BX

;	←extra ← CX
MOV [BP-14],CX

;   ia = (int) sbNext;

;	BX ← ←sbNext
POP BX
PUSH BX

;	←ia ← BX
MOV [BP-8],BX

;   siz = ia - ib; /* (int *) sbNext - (int *) sbRover */

;	BX ← ←ib
MOV BX,[BP-10]

;	CX ← ←ia
MOV CX,[BP-8]
SUB CX,BX

;	←siz ← CX
MOV [BP-16],CX

;   largest = UMax(siz, largest);
MOV BX,←largest

;	CX ← ←siz
MOV CX,[BP-16]
CALL ←UMax
MOV ←largest,BX

;   totAv += siz;

;	BX ← ←siz
MOV BX,[BP-16]
ADD ←totAv,BX

;   if ((extra < 0) || (lSb < 0)) {

;	BX ← ←extra
MOV BX,[BP-14]
CMP BX,0
JL X23

;	BX ← ←lSb
MOV BX,[BP-12]
CMP BX,0
X23:
X22:
JGE X21

;     sbRover = sbRover->pSbNext;

;	BX ← ←sbRover
MOV BX,[BP-22]
MOV CX,[BX+4]

;	←sbRover ← CX
MOV [BP-22],CX

;     if (sbRover == sbOriginalRover) break;

;	BX ← ←sbOriginalRover
MOV BX,[BP-24]

;	CX ← ←sbRover
MOV CX,[BP-22]
CMP CX,BX
JNZ X24
JR X16
X24:

;     continue;
JMP X15

;     };
X21:

;   if (extra >= minLSbFree) {

;	BX ← ←extra
MOV BX,[BP-14]
CMP BX,8
JL X25

;     sbRover->length = extra;

;	BX ← ←sbRover
MOV BX,[BP-22]

;	CX ← ←extra
MOV CX,[BP-14]
MOV [BX],CX

;     z->rover = sbRover;

;	BX ← ←z
MOV BX,[BP-2]

;	CX ← ←sbRover
MOV CX,[BP-22]
MOV [BX+8],CX

;     s->length = -lSb;

;	BX ← ←lSb
MOV BX,[BP-12]
NEG BX
MOV CX,BX

;	BX ← ←s
MOV BX,[BP-20]
MOV [BX],CX

;     };

;   else {
JR X26
X25:

;     sbRover->pSbNext->pSbPrevious = sbRover->pSbPrevious;

;	BX ← ←sbRover
MOV BX,[BP-22]
MOV CX,[BX+4]

;	BX ← ←sbRover
MOV BX,[BP-22]
MOV AX,[BX+6]
MOV BX,CX
MOV [BX+6],AX

;     sbRover->pSbPrevious->pSbNext = sbRover->pSbNext;

;	BX ← ←sbRover
MOV BX,[BP-22]
MOV CX,[BX+6]

;	BX ← ←sbRover
MOV BX,[BP-22]
MOV AX,[BX+4]
MOV BX,CX
MOV [BX+4],AX

;     z->rover = sbRover->pSbNext;

;	BX ← ←z
MOV BX,[BP-2]

;	CX ← ←sbRover
MOV CX,[BP-22]
MOV DI,CX
MOV CX,[DI+4]
MOV [BX+8],CX

;     s = sbRover;

;	BX ← ←sbRover
MOV BX,[BP-22]

;	←s ← BX
MOV [BP-20],BX

;     s->length = (-s->length);

;	DI ← ←s
MOV DI,[BP-20]
MOV BX,[DI]
NEG BX
MOV CX,BX

;	BX ← ←s
MOV BX,[BP-20]
MOV [BX],CX

;     };
X26:

;   s->user = ReturnLoc(MyFrame());   /* survey of callers of Alloc */

;	BX ← ←s
MOV BX,[BP-20]
JR $+5
X16:
JMP X27
PUSH BX
CALL ←MyFrame
CALL ←ReturnLoc
MOV CX,BX
POP BX
MOV [BX+2],CX

;   ia = ((int) s) + offsetSbData;

;	BX ← ←s
MOV BX,[BP-20]
ADD BX,4

;	←ia ← BX
MOV [BP-8],BX

;   Zero(ia, numWords);

;	BX ← ←numWords
MOV BX,[BP-4]

;	CX ← ←ia
MOV CX,[BP-8]
CALL ←Zero

;   return (ia);

;	BX ← ←ia
MOV BX,[BP-8]
MOV SP,BP
POP BP
RET;

;   }; /* didn't work:  while (sbRover != sbOriginalRover); */
X27:

;   z->rover = sbRover;

;	BX ← ←z
MOV BX,[BP-2]

;	CX ← ←sbRover
MOV CX,[BP-22]
MOV [BX+8],CX

;   if (numWords!=0) CallSwat(ecAllocate+5);

;	BX ← ←numWords
MOV BX,[BP-4]
OR BX,BX
JZ X28
MOV BX,01005X
CALL ←CallSwat
X28:

;   return 0;
XOR BX,BX
MOV SP,BP
POP BP
RET;

;   };

; Free(z, s)
←Free:

;   struct ZN *z;

;   int *s;
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX

;   {

;   struct SB *sbp, *sbAnchor, *sbT;

;   int ia;

;   if (s==0) return; /* God damn it! */
ADD SP,0FFF8X

;	BX ← ←s
MOV BX,[BP-4]
OR BX,BX
JNZ X29
MOV SP,BP
POP BP
RET;
X29:

;   ia = (int) s;

;	BX ← ←s
MOV BX,[BP-4]

;	←ia ← BX
POP DX
PUSH BX

;   ia = ia-offsetSbData;

;	BX ← ←ia
POP BX
ADD BX,0FFFCX

;	←ia ← BX
PUSH BX

;   sbp = (struct SB *) ia;

;	BX ← ←ia
POP BX
PUSH BX

;	←sbp ← BX
MOV [BP-6],BX

;   if (sbp->length >= 0) CallSwat(ecAllocate+6);

;	DI ← ←sbp
MOV DI,[BP-6]
MOV BX,[DI]
CMP BX,0
JL X30
MOV BX,01006X
CALL ←CallSwat
X30:

;   sbAnchor = &z->anchor;

;	BX ← ←z
MOV BX,[BP-2]

;	←sbAnchor ← BX
MOV [BP-8],BX

;   CheckZone(z, 0);
XOR BX,BX

;	CX ← ←z
MOV CX,[BP-2]
CALL ←CheckZone

;   sbp->length = -sbp->length;

;	DI ← ←sbp
MOV DI,[BP-6]
MOV BX,[DI]
NEG BX
MOV CX,BX

;	BX ← ←sbp
MOV BX,[BP-6]
MOV [BX],CX

;   CheckBounds(z, sbp);

;	BX ← ←sbp
MOV BX,[BP-6]

;	CX ← ←z
MOV CX,[BP-2]
CALL ←CheckBounds

;   CheckFreeNode(z, sbAnchor);

;	BX ← ←sbAnchor
MOV BX,[BP-8]

;	CX ← ←z
MOV CX,[BP-2]
CALL ←CheckFreeNode

;   sbT = sbAnchor->pSbNext;

;	BX ← ←sbAnchor
MOV BX,[BP-8]
MOV CX,[BX+4]

;	←sbT ← CX
MOV [BP-10],CX

;   sbp->pSbPrevious = sbAnchor;

;	BX ← ←sbp
MOV BX,[BP-6]

;	CX ← ←sbAnchor
MOV CX,[BP-8]
MOV [BX+6],CX

;   sbp->pSbNext = sbT;

;	BX ← ←sbp
MOV BX,[BP-6]

;	CX ← ←sbT
MOV CX,[BP-10]
MOV [BX+4],CX

;   sbAnchor->pSbNext = sbp;

;	BX ← ←sbAnchor
MOV BX,[BP-8]

;	CX ← ←sbp
MOV CX,[BP-6]
MOV [BX+4],CX

;   sbT->pSbPrevious = sbp;

;	BX ← ←sbT
MOV BX,[BP-10]

;	CX ← ←sbp
MOV CX,[BP-6]
MOV [BX+6],CX

;   };
MOV SP,BP
POP BP
RET;

; CheckZone(z, p)
←CheckZone:

;   struct ZN *z;

;   int p;
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX

;   {

;   int freecount, addit, ia, cnt;

;   struct SB *s, *sbAnchor;

;   if (*z->maxAdr != -1) CallSwat(ecAllocate+7);
ADD SP,0FFF4X

;	BX ← ←z
MOV BX,[BP-2]
MOV CX,[BX+12]
MOV DI,CX
MOV BX,[DI]
CMP BX,0FFFFX
JZ X31
MOV BX,01007X
CALL ←CallSwat
X31:

;   freecount = 0;
MOV WORD PTR [BP-6],0

;   ia = (int) z->minAdr;

;	BX ← ←z
MOV BX,[BP-2]
MOV CX,[BX+10]

;	←ia ← CX
MOV [BP-10],CX

;   s = (struct SB *) ia;

;	BX ← ←ia
MOV BX,[BP-10]

;	←s ← BX
MOV [BP-14],BX

;   for (;;) {
X32:

;     if (Usc(z->maxAdr, s) <= 0) break;

;	BX ← ←z
MOV BX,[BP-2]
MOV CX,[BX+12]

;	BX ← ←s
MOV BX,[BP-14]
CALL ←Usc
CMP BX,0
JG X34
JR X33
X34:

;     addit = s->length;

;	DI ← ←s
MOV DI,[BP-14]
MOV BX,[DI]

;	←addit ← BX
MOV [BP-8],BX

;     if (addit >= 0) {

;	BX ← ←addit
MOV BX,[BP-8]
CMP BX,0
JL X35

;       CheckFreeNode(z, s);

;	BX ← ←s
MOV BX,[BP-14]

;	CX ← ←z
MOV CX,[BP-2]
CALL ←CheckFreeNode

;       freecount += 1;
INC WORD PTR [BP-6]

;       };

;     else {
JR X36
X35:

;       addit = (-addit);

;	BX ← ←addit
MOV BX,[BP-8]
NEG BX

;	←addit ← BX
MOV [BP-8],BX

;       };
X36:

;     ia = ia+addit;

;	BX ← ←addit
MOV BX,[BP-8]

;	CX ← ←ia
MOV CX,[BP-10]
ADD CX,BX

;	←ia ← CX
MOV [BP-10],CX

;     if (Usc(ia, s) <= 0) CallSwat(ecAllocate+8);

;	BX ← ←s
MOV BX,[BP-14]

;	CX ← ←ia
MOV CX,[BP-10]
CALL ←Usc
CMP BX,0
JG X37
MOV BX,01008X
CALL ←CallSwat
X37:

;     s = (struct SB *) ia;

;	BX ← ←ia
MOV BX,[BP-10]

;	←s ← BX
MOV [BP-14],BX

;     };
JR X32
X33:

;   if (((int *) s) != z->maxAdr) CallSwat(ecAllocate+9);

;	BX ← ←z
MOV BX,[BP-2]
MOV CX,[BX+12]

;	BX ← ←s
MOV BX,[BP-14]
CMP BX,CX
JZ X38
MOV BX,01009X
CALL ←CallSwat
X38:

;   cnt = -22000;
MOV WORD PTR [BP-12],0AA10X

;   sbAnchor = &z->anchor;

;	BX ← ←z
MOV BX,[BP-2]

;	←sbAnchor ← BX
POP DX
PUSH BX

;   s = sbAnchor->pSbNext;

;	BX ← ←sbAnchor
POP BX
PUSH BX
MOV CX,[BX+4]

;	←s ← CX
MOV [BP-14],CX

;   for (;;) {
X39:

;     if (s == sbAnchor) break;

;	BX ← ←sbAnchor
POP BX
PUSH BX

;	CX ← ←s
MOV CX,[BP-14]
CMP CX,BX
JNZ X41
JR X40
X41:

;     CheckFreeNode(z, s);

;	BX ← ←s
MOV BX,[BP-14]

;	CX ← ←z
MOV CX,[BP-2]
CALL ←CheckFreeNode

;     freecount -= 1;
DEC WORD PTR [BP-6]

;     cnt -= 1;
DEC WORD PTR [BP-12]

;     if (cnt == 0) CallSwat(ecAllocate+10);

;	BX ← ←cnt
MOV BX,[BP-12]
OR BX,BX
JNZ X42
MOV BX,0100AX
CALL ←CallSwat
X42:

;     s = s->pSbNext;

;	BX ← ←s
MOV BX,[BP-14]
MOV CX,[BX+4]

;	←s ← CX
MOV [BP-14],CX

;     };
JR X39
X40:

;   if (freecount != 0) CallSwat(ecAllocate+11);

;	BX ← ←freecount
MOV BX,[BP-6]
OR BX,BX
JZ X43
MOV BX,0100BX
CALL ←CallSwat
X43:

;   };
MOV SP,BP
POP BP
RET;

; CheckFreeNode(z, s)
←CheckFreeNode:

;   struct ZN *z;

;   struct SB *s;
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX

;   {

;   CheckBounds(z, s);

;	BX ← ←s
POP BX
PUSH BX

;	CX ← ←z
MOV CX,[BP-2]
CALL ←CheckBounds

;   CheckBounds(z, s->pSbNext);

;	BX ← ←s
POP BX
PUSH BX
MOV CX,[BX+4]
MOV BX,CX

;	CX ← ←z
MOV CX,[BP-2]
CALL ←CheckBounds

;   CheckBounds(z, s->pSbPrevious);

;	BX ← ←s
POP BX
PUSH BX
MOV CX,[BX+6]
MOV BX,CX

;	CX ← ←z
MOV CX,[BP-2]
CALL ←CheckBounds

;   if ((s != &z->anchor) && (s->length < minLSbFree)) CallSwat(ecAllocate+12);

;	BX ← ←z
MOV BX,[BP-2]

;	CX ← ←s
POP CX
PUSH CX
CMP CX,BX
JZ X45

;	DI ← ←s
POP DI
PUSH DI
MOV BX,[DI]
CMP BX,8
JGE X45
MOV AL,1
JR X46
X45:
XOR AL,AL
X46:
OR AL,AL
JZ X44
MOV BX,0100CX
CALL ←CallSwat
X44:

;   if (s->pSbNext->pSbPrevious != s) CallSwat(ecAllocate+13);

;	BX ← ←s
POP BX
PUSH BX
MOV CX,[BX+4]
MOV DI,CX
MOV BX,[DI+6]

;	CX ← ←s
POP CX
PUSH CX
CMP BX,CX
JZ X47
MOV BX,0100DX
CALL ←CallSwat
X47:

;   };
MOV SP,BP
POP BP
RET;

; CheckBounds(z, s)
←CheckBounds:

;   struct ZN *z;

;   struct SB *s;
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX

;   {

;   int tip;

;   if (s != &z->anchor) {
PUSH DX

;	BX ← ←z
MOV BX,[BP-2]

;	CX ← ←s
MOV CX,[BP-4]
CMP CX,BX
JZ X48

;     tip = (int) s;

;	BX ← ←s
MOV BX,[BP-4]

;	←tip ← BX
POP DX
PUSH BX

;     if ((Usc(tip+s->length, z->maxAdr) > 0) || (Usc(s, z->minAdr) < 0)) CallSwat(ecAllocate+14);

;	DI ← ←s
MOV DI,[BP-4]
MOV BX,[DI]

;	CX ← ←tip
POP CX
PUSH CX
ADD CX,BX

;	BX ← ←z
MOV BX,[BP-2]
MOV AX,[BX+12]
MOV BX,AX
CALL ←Usc
CMP BX,0
JG X51

;	BX ← ←z
MOV BX,[BP-2]
MOV CX,[BX+10]
MOV BX,CX

;	CX ← ←s
MOV CX,[BP-4]
CALL ←Usc
CMP BX,0
JGE X50
X51:
MOV AL,1
JR X52
X50:
XOR AL,AL
X52:
OR AL,AL
JZ X49
MOV BX,0100EX
CALL ←CallSwat
X49:

;     };
X48:

;   };
MOV SP,BP
POP BP
RET;

; #asm



PUBLIC ←Allocate


; Externals Declared Here
PUBLIC ←GetAll
PUBLIC ←InitializeZone
PUBLIC ←AddToZone
PUBLIC ←Free
PUBLIC ←Alloc
PUBLIC ←CheckZone
PUBLIC ←CheckBounds
PUBLIC ←CheckFreeNode

C←CODE ENDS

; Number of Bytes of Code = 061EX, (1566)