;Alto->8086 small-c compiler rev 2.0
C←CODE SEGMENT
$INCLUDE(8086LIB.D)
$INCLUDE(runtime.DEC)
ASSUME CS:C←CODE, DS:C←DATA
; #include <Env.h>
; extern SetTmr();
; extern int TmrExp();
; extern int FetchW();
; extern CallDebugger();
; int EqStr(s1, s2)
←EqStr:
; char *s1, *s2;
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX
; {
; while (*s1 != 0) if (LC(*s1++) != LC(*s2++)) return(false);
X1:
; DI ← ←s1
MOV DI,[BP-2]
MOV AL,[DI]
OR AL,AL
JZ X2
INC WORD PTR [BP-2]
; BX ← ←s1
MOV BX,[BP-2]
MOV AL,[BX-1]
CBW
MOV BX,AX
CALL ←LC
PUSH BX
INC WORD PTR [BP-4]
; BX ← ←s2
MOV BX,[BP-4]
MOV AL,[BX-1]
CBW
MOV BX,AX
CALL ←LC
POP CX
CMP CX,BX
JZ X3
XOR BX,BX
MOV SP,BP
POP BP
RET;
X3:
JR X1
X2:
; if (*s2 != 0) return (false);
; DI ← ←s2
POP DI
PUSH DI
MOV AL,[DI]
OR AL,AL
JZ X4
XOR BX,BX
MOV SP,BP
POP BP
RET;
X4:
; return(true);
MOV BX,0FFFFX
MOV SP,BP
POP BP
RET;
; };
; int IsDigit(c)
←IsDigit:
; char c;
PUSH BP
MOV BP,SP
PUSH BX
; {
; if (c >= '0' && c <= '9') return(true);
; AL ← ←c
POP AX
PUSH AX
CMP AL,030X
JL X6
; AL ← ←c
POP AX
PUSH AX
CMP AL,039X
JG X6
MOV AL,1
JR X7
X6:
XOR AL,AL
X7:
OR AL,AL
JZ X5
MOV BX,0FFFFX
MOV SP,BP
POP BP
RET;
; else return(false);
X5:
XOR BX,BX
MOV SP,BP
POP BP
RET;
; };
; int LC(c)
←LC:
; char c;
PUSH BP
MOV BP,SP
PUSH BX
; {
; if (c >= 'A' && c <= 'Z') c = c - 'A' + 'a';
; AL ← ←c
POP AX
PUSH AX
CMP AL,041X
JL X9
; AL ← ←c
POP AX
PUSH AX
CMP AL,05AX
JG X9
MOV AL,1
JR X10
X9:
XOR AL,AL
X10:
OR AL,AL
JZ X8
; AL ← ←c
POP AX
ADD AL,0BFX
ADD AL,061X
; ←c ← AL
PUSH AX
X8:
; return (c);
; BX ← ←c
POP BX
PUSH BX
XOR BH,BH
MOV SP,BP
POP BP
RET;
; };
; int UC(c)
←UC:
; char c;
PUSH BP
MOV BP,SP
PUSH BX
; {
; if (c >= 'a' && c <= 'z') c = c - 'a' + 'A';
; AL ← ←c
POP AX
PUSH AX
CMP AL,061X
JL X12
; AL ← ←c
POP AX
PUSH AX
CMP AL,07AX
JG X12
MOV AL,1
JR X13
X12:
XOR AL,AL
X13:
OR AL,AL
JZ X11
; AL ← ←c
POP AX
ADD AL,09FX
ADD AL,041X
; ←c ← AL
PUSH AX
X11:
; return (c);
; BX ← ←c
POP BX
PUSH BX
XOR BH,BH
MOV SP,BP
POP BP
RET;
; };
; CallSwat(code)
←CallSwat:
; int code;
PUSH BP
MOV BP,SP
PUSH BX
; {
; CallDebugger(code);
; BX ← ←code
POP BX
PUSH BX
CALL ←CallDebugger
; };
MOV SP,BP
POP BP
RET;
; Timer(t)
←Timer:
; int t[];
PUSH BP
MOV BP,SP
PUSH BX
; {
; t[1] = FetchW(clkhi);
; BX ← ←t
POP BX
PUSH BX
PUSH BX
MOV BX,0DA20X
CALL ←FetchW
MOV CX,BX
POP BX
MOV [BX+2],CX
; t[0] = FetchW(clklo);
MOV BX,0DA1EX
CALL ←FetchW
MOV CX,BX
; BX ← ←t
POP BX
PUSH BX
MOV [BX],CX
; if (t[1] != FetchW(clkhi)) Timer(t);
; BX ← ←t
POP BX
PUSH BX
MOV CX,[BX+2]
PUSH CX
MOV BX,0DA20X
CALL ←FetchW
POP CX
CMP CX,BX
JZ X14
; BX ← ←t
POP BX
PUSH BX
CALL ←Timer
X14:
; };
MOV SP,BP
POP BP
RET;
; Dismiss(ms)
←Dismiss:
; int ms;
PUSH BP
MOV BP,SP
PUSH BX
; {
; int tmr;
PUSH DX
; SetTmr(ms, &tmr);
;&←tmr
LEA BX,[BP-4]
; CX ← ←ms
MOV CX,[BP-2]
CALL ←SetTmr
; while (!TmrExp(&tmr)) Block();
X15:
;&←tmr
LEA BX,[BP-4]
CALL ←TmrExp
OR BX,BX
JNZ X16
CALL ←Block
JR X15
X16:
; };
MOV SP,BP
POP BP
RET;
; Externals Declared Here
PUBLIC ←EqStr
PUBLIC ←LC
PUBLIC ←IsDigit
PUBLIC ←UC
PUBLIC ←CallSwat
PUBLIC ←Timer
PUBLIC ←Dismiss
C←CODE ENDS
; Number of Bytes of Code = 0130X, (304)