;Alto->8086 small-c compiler rev 2.0
C←CODE SEGMENT
$INCLUDE(8086LIB.D)
$INCLUDE(RingBuffer.DEC)
ASSUME CS:C←CODE, DS:C←DATA
; #include "env.h"
; struct CBuf {
; char *buf;
; int len, rp, wp;
; };
; InitRingBuffer(p, buffer, length)
←InitRingBuffer:
; struct CBuf *p;
; char *buffer;
; int length;
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX
; {
; p->buf = buffer;
; BX ← ←p
MOV BX,[BP+4]
; CX ← ←buffer
MOV CX,[BP-2]
MOV [BX],CX
; p->len = length;
; BX ← ←p
MOV BX,[BP+4]
; CX ← ←length
POP CX
PUSH CX
MOV [BX+2],CX
; p->wp = p->rp = 0;
; BX ← ←p
MOV BX,[BP+4]
; CX ← ←p
MOV CX,[BP+4]
XCHG BX,CX
MOV WORD PTR [BX+4],0
MOV BX,CX
MOV WORD PTR [BX+6],0
; };
MOV SP,BP
POP BP
RET;
; int RingBufferEmpty(p)
←RingBufferEmpty:
; struct CBuf *p;
PUSH BP
MOV BP,SP
PUSH BX
; {
; if (p->wp == p->rp) return(true);
; BX ← ←p
POP BX
PUSH BX
MOV CX,[BX+6]
; BX ← ←p
POP BX
PUSH BX
MOV AX,[BX+4]
CMP CX,AX
JNZ X1
MOV BX,0FFFFX
MOV SP,BP
POP BP
RET;
; else return(false);
X1:
XOR BX,BX
MOV SP,BP
POP BP
RET;
; };
; int RingBufferFull(p)
←RingBufferFull:
; struct CBuf *p;
PUSH BP
MOV BP,SP
PUSH BX
; {
; int np;
PUSH DX
; np = p->wp + 1;
; BX ← ←p
MOV BX,[BP-2]
MOV CX,[BX+6]
INC CX
; ←np ← CX
POP DX
PUSH CX
; if (np >= p->len) np = 0;
; BX ← ←p
MOV BX,[BP-2]
MOV CX,[BX+2]
; BX ← ←np
POP BX
PUSH BX
CMP BX,CX
JL X2
MOV WORD PTR [BP-4],0
X2:
; if (np == p->rp) return(true);
; BX ← ←p
MOV BX,[BP-2]
MOV CX,[BX+4]
; BX ← ←np
POP BX
PUSH BX
CMP BX,CX
JNZ X3
MOV BX,0FFFFX
MOV SP,BP
POP BP
RET;
; else return(false);
X3:
XOR BX,BX
MOV SP,BP
POP BP
RET;
; };
; int WriteRingBuffer(p, c)
←WriteRingBuffer:
; struct CBuf *p;
; char c;
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX
; {
; int np;
; if (RingBufferFull(p)) return(false);
PUSH DX
; BX ← ←p
MOV BX,[BP-2]
CALL ←RingBufferFull
OR BX,BX
JZ X4
XOR BX,BX
MOV SP,BP
POP BP
RET;
X4:
; IWDC();
CALL ←IWDC
; np = p->wp + 1;
; BX ← ←p
MOV BX,[BP-2]
MOV CX,[BX+6]
INC CX
; ←np ← CX
POP DX
PUSH CX
; if (np >= p->len) np = 0;
; BX ← ←p
MOV BX,[BP-2]
MOV CX,[BX+2]
; BX ← ←np
POP BX
PUSH BX
CMP BX,CX
JL X5
MOV WORD PTR [BP-6],0
X5:
; p->buf[np] = c;
; DI ← ←p
MOV DI,[BP-2]
MOV BX,[DI]
; CX ← ←np
POP CX
PUSH CX
ADD BX,CX
; AL ← ←c
MOV AL,[BP-4]
MOV [BX],AL
; p->wp = np;
; BX ← ←p
MOV BX,[BP-2]
; CX ← ←np
POP CX
PUSH CX
MOV [BX+6],CX
; DWDC();
CALL ←DWDC
; return(true);
MOV BX,0FFFFX
MOV SP,BP
POP BP
RET;
; };
; int ReadRingBuffer(p)
←ReadRingBuffer:
; struct CBuf *p;
PUSH BP
MOV BP,SP
PUSH BX
; {
; int np, c;
; if (RingBufferEmpty(p)) return(-1);
ADD SP,0FFFCX
; BX ← ←p
MOV BX,[BP-2]
CALL ←RingBufferEmpty
OR BX,BX
JZ X6
MOV BX,0FFFFX
MOV SP,BP
POP BP
RET;
X6:
; IWDC();
CALL ←IWDC
; np = p->rp + 1;
; BX ← ←p
MOV BX,[BP-2]
MOV CX,[BX+4]
INC CX
; ←np ← CX
MOV [BP-4],CX
; if (np >= p->len) np = 0;
; BX ← ←p
MOV BX,[BP-2]
MOV CX,[BX+2]
; BX ← ←np
MOV BX,[BP-4]
CMP BX,CX
JL X7
MOV WORD PTR [BP-4],0
X7:
; c = p->buf[np];
; DI ← ←p
MOV DI,[BP-2]
MOV BX,[DI]
; CX ← ←np
MOV CX,[BP-4]
ADD BX,CX
MOV AL,[BX]
XOR AH,AH
; ←c ← AX
POP DX
PUSH AX
; p->rp = np;
; BX ← ←p
MOV BX,[BP-2]
; CX ← ←np
MOV CX,[BP-4]
MOV [BX+4],CX
; DWDC();
CALL ←DWDC
; return(c & 0377);
; BX ← ←c
POP BX
PUSH BX
AND BX,0FFX
MOV SP,BP
POP BP
RET;
; };
; Externals Declared Here
PUBLIC ←InitRingBuffer
PUBLIC ←RingBufferEmpty
PUBLIC ←RingBufferFull
PUBLIC ←WriteRingBuffer
PUBLIC ←ReadRingBuffer
C←CODE ENDS
; Number of Bytes of Code = 0134X, (308)