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

$INCLUDE(8086LIB.D)

$INCLUDE(timerextras.DEC)

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

; struct Long {

;   int low, high;

;   };

; int ctxListTime[84];

; int ctxStartTime;

; int wdtFlagA, wdtFlagB, wdtFlagC;

; InitCtxStats()
←InitCtxStats:
PUSH BP
MOV BP,SP

;   {

;   Zero(ctxListTime, 84);
MOV BX,054X
LEA CX,←ctxListTime
CALL ←Zero

;   };
MOV SP,BP
POP BP
RET;

; CtxListStart()
←CtxListStart:
PUSH BP
MOV BP,SP

;   {

;   ctxStartTime = ReadTmr();
CALL ←ReadTmr
MOV ←ctxStartTime,BX

;   };
MOV SP,BP
POP BP
RET;

; CtxListEnd()
←CtxListEnd:
PUSH BP
MOV BP,SP

;   {

;   Histogram(ReadTmr() - ctxStartTime, ctxListTime);
CALL ←ReadTmr
MOV CX,←ctxStartTime
SUB BX,CX
PUSH BX
LEA BX,←ctxListTime
POP CX
CALL ←Histogram

;   };
MOV SP,BP
POP BP
RET;

; PokeWDTA()
←PokeWDTA:
PUSH BP
MOV BP,SP

;   {

;   wdtFlagA = 1234;
MOV ←wdtFlagA,04D2X

;   };
MOV SP,BP
POP BP
RET;

; PokeWDTB()
←PokeWDTB:
PUSH BP
MOV BP,SP

;   {

;   if (wdtFlagA == 1234) {
MOV BX,←wdtFlagA
CMP BX,04D2X
JNZ X1

;     wdtFlagA = 0;
MOV ←wdtFlagA,0

;     wdtFlagB = 5678;
MOV ←wdtFlagB,0162EX

;     };
X1:

;   };
MOV SP,BP
POP BP
RET;

; PokeWDTC()
←PokeWDTC:
PUSH BP
MOV BP,SP

;   {

;   if (wdtFlagB == 5678) {
MOV BX,←wdtFlagB
CMP BX,0162EX
JNZ X2

;     wdtFlagB = 0;
MOV ←wdtFlagB,0

;     wdtFlagC = 91011;
MOV ←wdtFlagC,06383X

;     };
X2:

;   };
MOV SP,BP
POP BP
RET;

; PokeWDTD()
←PokeWDTD:
PUSH BP
MOV BP,SP

;   {

;   if (wdtFlagC == 91011) {
MOV BX,←wdtFlagC
CMP BX,06383X
JNZ X3

;     wdtFlagC = 0;
MOV ←wdtFlagC,0

;     CheckWDT();
CALL ←CheckWDT

;     };
X3:

;   };
MOV SP,BP
POP BP
RET;

; Histogram(diff, histo)
←Histogram:

;   int diff;

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

;   {

;   if (diff < 0) {

;	BX ← ←diff
MOV BX,[BP-2]
CMP BX,0
JGE X4

;     DoubleIncrement(&histo[82], 1);

;	BX ← ←histo
POP BX
PUSH BX
ADD BX,0A4X
PUSH BX
MOV BX,1
POP CX
CALL ←DoubleIncrement

;     return;
MOV SP,BP
POP BP
RET;

;     };
X4:

;   if (diff >= 40) DoubleIncrement(&histo[80], 1);

;	BX ← ←diff
MOV BX,[BP-2]
CMP BX,028X
JL X5

;	BX ← ←histo
POP BX
PUSH BX
ADD BX,0A0X
PUSH BX
MOV BX,1
POP CX
CALL ←DoubleIncrement

;   else DoubleIncrement(&histo[diff << 1], 1);
JR X6
X5:

;	BX ← ←diff
MOV BX,[BP-2]
SAL BX

;	CX ← ←histo
POP CX
PUSH CX
SAL BX
ADD BX,CX
PUSH BX
MOV BX,1
POP CX
CALL ←DoubleIncrement
X6:

;   };
MOV SP,BP
POP BP
RET;

; Externals Declared Here
PUBLIC ←ctxListTime
PUBLIC ←ctxStartTime
PUBLIC ←wdtFlagA
PUBLIC ←wdtFlagB
PUBLIC ←wdtFlagC
PUBLIC ←InitCtxStats
PUBLIC ←CtxListStart
PUBLIC ←CtxListEnd
PUBLIC ←Histogram
PUBLIC ←PokeWDTA
PUBLIC ←PokeWDTB
PUBLIC ←PokeWDTC
PUBLIC ←PokeWDTD

C←CODE ENDS

; Number of Bytes of Code = 0E5X, (229)