;Alto->8086 small-c compiler rev 2.0
C←CODE SEGMENT
$INCLUDE(8086LIB.D)
$INCLUDE(wf.DEC)
ASSUME CS:C←CODE, DS:C←DATA
; #include <Env.h>
; extern PutChar();
; extern Block();
; extern IsDigit();
; extern Ugt();
; extern UDiv();
; extern URem();
; wf(fmt)
←wf:
; char *fmt;
CALL StkChk
PUSH BP
MOV BP,SP
PUSH BX
; {
; while (*fmt != 0) PutChar(*fmt++);
X1:
; DI ← ←fmt
POP DI
PUSH DI
MOV AL,[DI]
OR AL,AL
JZ X2
INC WORD PTR [BP-2]
; BX ← ←fmt
POP BX
PUSH BX
MOV AL,[BX-1]
CBW
MOV BX,AX
CALL ←PutChar
JR X1
X2:
; };
MOV SP,BP
POP BP
RET;
; wfcr()
←wfcr:
CALL StkChk
PUSH BP
MOV BP,SP
; {
; wf("\r");
MOV BX,"↑"
CALL ←wf
; };
MOV SP,BP
POP BP
RET;
; wf1(fmt, a1)
←wf1:
; char *fmt;
; int a1;
CALL StkChk
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX
; {
; pfary(fmt, &a1);
;&←a1
LEA BX,[BP-4]
; CX ← ←fmt
MOV CX,[BP-2]
CALL ←pfary
; };
MOV SP,BP
POP BP
RET;
; wf2(fmt, a1, a2)
←wf2:
; char *fmt;
; int a1, a2;
CALL StkChk
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX
; {
; int ary[2];
ADD SP,0FFFCX
; ary[0] = a1;
; BX ← ←a1
MOV BX,[BP-2]
; ←ary ← BX
POP DX
PUSH BX
; ary[1] = a2;
; BX ← ←a2
MOV BX,[BP-4]
; ←ary+2 ← BX
MOV [BP-6],BX
; pfary(fmt, ary);
;&←ary
LEA BX,[BP-8]
; CX ← ←fmt
MOV CX,[BP+4]
CALL ←pfary
; };
MOV SP,BP
POP BP
RET;
; wf3(fmt, a1, a2, a3)
←wf3:
; char *fmt;
; int a1, a2, a3;
CALL StkChk
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX
; {
; int ary[3];
ADD SP,0FFFAX
; ary[0] = a1;
; BX ← ←a1
MOV BX,[BP+4]
; ←ary ← BX
POP DX
PUSH BX
; ary[1] = a2;
; BX ← ←a2
MOV BX,[BP-2]
; ←ary+2 ← BX
MOV [BP-8],BX
; ary[2] = a3;
; BX ← ←a3
MOV BX,[BP-4]
; ←ary+4 ← BX
MOV [BP-6],BX
; pfary(fmt, ary);
;&←ary
LEA BX,[BP-10]
; CX ← ←fmt
MOV CX,[BP+6]
CALL ←pfary
; };
MOV SP,BP
POP BP
RET;
; wf4(fmt, a1, a2, a3, a4)
←wf4:
; char *fmt;
; int a1, a2, a3, a4;
CALL StkChk
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX
; {
; int ary[4];
ADD SP,0FFF8X
; ary[0] = a1;
; BX ← ←a1
MOV BX,[BP+6]
; ←ary ← BX
POP DX
PUSH BX
; ary[1] = a2;
; BX ← ←a2
MOV BX,[BP+4]
; ←ary+2 ← BX
MOV [BP-10],BX
; ary[2] = a3;
; BX ← ←a3
MOV BX,[BP-2]
; ←ary+4 ← BX
MOV [BP-8],BX
; ary[3] = a4;
; BX ← ←a4
MOV BX,[BP-4]
; ←ary+6 ← BX
MOV [BP-6],BX
; pfary(fmt, ary);
;&←ary
LEA BX,[BP-12]
; CX ← ←fmt
MOV CX,[BP+8]
CALL ←pfary
; };
MOV SP,BP
POP BP
RET;
; static pfary(fmt, ary)
←pfary:
; char *fmt;
; int *ary;
CALL StkChk
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX
; {
; char c;
; while ((c = *fmt++) != 0) {
PUSH DX
X3:
INC WORD PTR [BP-2]
; BX ← ←fmt
MOV BX,[BP-2]
MOV AL,[BX-1]
; ←c ← AL
POP DX
PUSH AX
OR AL,AL
JZ X4
; Block();
CALL ←Block
; if (c == '%') fmt = doone(fmt, *ary++);
; AL ← ←c
POP AX
PUSH AX
CMP AL,025X
JNZ X5
ADD WORD PTR [BP-4],2
; BX ← ←ary
MOV BX,[BP-4]
MOV CX,[BX-2]
MOV BX,CX
; CX ← ←fmt
MOV CX,[BP-2]
CALL ←doone
; ←fmt ← BX
MOV [BP-2],BX
; else PutChar(c);
JR X6
X5:
; AX ← ←c
POP AX
PUSH AX
CBW
MOV BX,AX
CALL ←PutChar
X6:
; };
JR X3
X4:
; };
MOV SP,BP
POP BP
RET;
; static char *doone(fmt, a1)
←doone:
; char *fmt;
; int a1;
CALL StkChk
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX
; {
; char c, fillchar, *last;
; char buf[20];
; int width, radix, i;
ADD SP,0FFE0X
; fillchar = ' ';
MOV BYTE PTR [BP-8],020X
; buf[0] = 0;
MOV BYTE PTR [BP-30],0
; width = 0;
MOV WORD PTR [BP-32],0
; if (*fmt == '0') fillchar = '0';
; DI ← ←fmt
MOV DI,[BP-2]
MOV AL,[DI]
CMP AL,030X
JNZ X7
MOV BYTE PTR [BP-8],030X
X7:
; while ((c = *fmt++) != 0) {
X8:
INC WORD PTR [BP-2]
; BX ← ←fmt
MOV BX,[BP-2]
MOV AL,[BX-1]
; ←c ← AL
MOV [BP-6],AL
OR AL,AL
JZ X9
; if (IsDigit(c)) width = (width * 10) + (c - '0');
; AX ← ←c
MOV AX,[BP-6]
CBW
MOV BX,AX
CALL ←IsDigit
OR BX,BX
JZ X10
; BX ← ←width
MOV BX,[BP-32]
MOV AX,BX
MOV BX,0AX
IMUL AX,BX
; CL ← ←c
MOV CL,[BP-6]
ADD CL,0D0X
XOR CH,CH
ADD AX,CX
; ←width ← AX
MOV [BP-32],AX
; else break;
JR X11
X10:
JR X9
X11:
; };
JR X8
X9:
; if (c == 'r') { ssw(a1); return(fmt); };
; AL ← ←c
MOV AL,[BP-6]
CMP AL,072X
JNZ X12
; BX ← ←a1
MOV BX,[BP-4]
CALL ←ssw
; BX ← ←fmt
MOV BX,[BP-2]
MOV SP,BP
POP BP
RET;
X12:
; if (c == 's') { wf(a1); return(fmt); };
; AL ← ←c
MOV AL,[BP-6]
CMP AL,073X
JNZ X13
; BX ← ←a1
MOV BX,[BP-4]
CALL ←wf
; BX ← ←fmt
MOV BX,[BP-2]
MOV SP,BP
POP BP
RET;
X13:
; if (c == 'c') { PutChar(a1); return(fmt); };
; AL ← ←c
MOV AL,[BP-6]
CMP AL,063X
JNZ X14
; BX ← ←a1
MOV BX,[BP-4]
CALL ←PutChar
; BX ← ←fmt
MOV BX,[BP-2]
MOV SP,BP
POP BP
RET;
X14:
; if (c == 'd') radix = -10;
; AL ← ←c
MOV AL,[BP-6]
CMP AL,064X
JNZ X15
MOV WORD PTR [BP-34],0FFF6X
X15:
; if (c == 'u') radix = 10;
; AL ← ←c
MOV AL,[BP-6]
CMP AL,075X
JNZ X16
MOV WORD PTR [BP-34],0AX
X16:
; if (c == 'x') radix = 16;
; AL ← ←c
MOV AL,[BP-6]
CMP AL,078X
JNZ X17
MOV WORD PTR [BP-34],010X
X17:
; if (c == 'o') radix = 8;
; AL ← ←c
MOV AL,[BP-6]
CMP AL,06FX
JNZ X18
MOV WORD PTR [BP-34],8
X18:
; if (radix==0) return(fmt);
; BX ← ←radix
MOV BX,[BP-34]
OR BX,BX
JNZ X19
; BX ← ←fmt
MOV BX,[BP-2]
MOV SP,BP
POP BP
RET;
X19:
; last = putfnum(buf, a1, radix);
;&←buf
LEA BX,[BP-30]
PUSH BX
; BX ← ←radix
MOV BX,[BP-34]
; CX ← ←a1
MOV CX,[BP-4]
CALL ←putfnum
POP DX
; ←last ← BX
MOV [BP-10],BX
; if (width>0) {
; BX ← ←width
MOV BX,[BP-32]
CMP BX,0
JLE X20
; width -= (last-buf);
;&←buf
LEA BX,[BP-30]
; CX ← ←last
MOV CX,[BP-10]
SUB CX,BX
SUB [BP-32],CX
; while (width > 0) {
X21:
; BX ← ←width
MOV BX,[BP-32]
CMP BX,0
JLE X22
; Block();
CALL ←Block
; PutChar(fillchar);
; AX ← ←fillchar
MOV AX,[BP-8]
CBW
MOV BX,AX
CALL ←PutChar
; width -= 1;
DEC WORD PTR [BP-32]
; };
JR X21
X22:
; };
X20:
; wf(buf);
;&←buf
LEA BX,[BP-30]
CALL ←wf
; return(fmt);
; BX ← ←fmt
MOV BX,[BP-2]
MOV SP,BP
POP BP
RET;
; };
; static ssw(s)
←ssw:
; struct ShortSTRING *s;
CALL StkChk
PUSH BP
MOV BP,SP
PUSH BX
; {
; int i;
; for (i = 0; i < s->length; i += 1) PutChar(s->text[i]);
PUSH DX
MOV WORD PTR [BP-4],0
X25:
; DI ← ←s
MOV DI,[BP-2]
MOV BX,[DI]
; CX ← ←i
POP CX
PUSH CX
CMP CX,BX
JGE X24
JR X23
X26:
INC WORD PTR [BP-4]
JR X25
X23:
; BX ← ←s
MOV BX,[BP-2]
ADD BX,4
; CX ← ←i
POP CX
PUSH CX
ADD BX,CX
MOV AL,[BX]
CBW
MOV BX,AX
CALL ←PutChar
JR X26
X24:
; };
MOV SP,BP
POP BP
RET;
; static char *putfnum(buf, a1, radix)
←putfnum:
; char *buf;
; int a1, radix;
CALL StkChk
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX
; {
; int digit;
; if (radix<0) {
PUSH DX
; BX ← ←radix
MOV BX,[BP-4]
CMP BX,0
JGE X27
; radix = -radix;
; BX ← ←radix
MOV BX,[BP-4]
NEG BX
; ←radix ← BX
MOV [BP-4],BX
; if (a1<0) {
; BX ← ←a1
MOV BX,[BP-2]
CMP BX,0
JGE X28
; a1 = -a1;
; BX ← ←a1
MOV BX,[BP-2]
NEG BX
; ←a1 ← BX
MOV [BP-2],BX
; *buf++ = '-';
INC WORD PTR [BP+4]
; BX ← ←buf
MOV BX,[BP+4]
MOV BYTE PTR [BX-1],02DX
; };
X28:
; };
X27:
; if (!Ugt(radix, a1)) buf = putfnum(buf, UDiv(a1, radix), radix);
; BX ← ←a1
MOV BX,[BP-2]
; CX ← ←radix
MOV CX,[BP-4]
CALL ←Ugt
OR BX,BX
JNZ X29
; BX ← ←buf
MOV BX,[BP+4]
PUSH BX
; BX ← ←radix
MOV BX,[BP-4]
; CX ← ←a1
MOV CX,[BP-2]
CALL ←UDiv
PUSH BX
; BX ← ←radix
MOV BX,[BP-4]
POP CX
CALL ←putfnum
POP DX
; ←buf ← BX
MOV [BP+4],BX
X29:
; digit = URem(a1, radix);
; BX ← ←radix
MOV BX,[BP-4]
; CX ← ←a1
MOV CX,[BP-2]
CALL ←URem
; ←digit ← BX
POP DX
PUSH BX
; if (digit>9) *buf++ = digit + 'A'-10;
; BX ← ←digit
POP BX
PUSH BX
CMP BX,9
JLE X30
INC WORD PTR [BP+4]
; BX ← ←buf
MOV BX,[BP+4]
; CX ← ←digit
POP CX
PUSH CX
ADD CX,037X
MOV [BX-1],CL
; else *buf++ = digit + '0';
JR X31
X30:
INC WORD PTR [BP+4]
; BX ← ←buf
MOV BX,[BP+4]
; CX ← ←digit
POP CX
PUSH CX
ADD CX,030X
MOV [BX-1],CL
X31:
; *buf = 0;
; BX ← ←buf
MOV BX,[BP+4]
MOV BYTE PTR [BX],0
; return(buf);
; BX ← ←buf
MOV BX,[BP+4]
MOV SP,BP
POP BP
RET;
; };
; Externals Declared Here
PUBLIC ←wf
PUBLIC ←wfcr
PUBLIC ←wf1
PUBLIC ←wf2
PUBLIC ←wf3
PUBLIC ←wf4
C←CODE ENDS
; Number of Bytes of Code = 02DBX, (731)