;Alto->8086 small-c compiler rev 2.0 C_CODE SEGMENT $INCLUDE(8086LIB.D) $INCLUDE(QueueImpl.DEC) ASSUME CS:C_CODE, DS:C_DATA ; #include "env.h" ; extern int CallDebugger(); ; extern int IWDC(); ; extern int DWDC(); ; extern int Zero(); ; InitQueue(q) _InitQueue: ; struct Queue *q; PUSH BP MOV BP,SP PUSH BX ; { ; Zero(q, lenQueue); MOV BX,2 ; CX _ _q POP CX PUSH CX CALL _Zero ; }; MOV SP,BP POP BP RET; ; struct Element *Dequeue(q) _Dequeue: ; struct Queue *q; PUSH BP MOV BP,SP PUSH BX ; { ; struct Element *item; PUSH DX ; IWDC(); CALL _IWDC ; item = q->head; ; DI _ _q MOV DI,[BP-2] MOV BX,[DI] ; _item _ BX POP DX PUSH BX ; if (item) q->head = item->next; ; BX _ _item POP BX PUSH BX OR BX,BX JZ X1 ; DI _ _item POP DI PUSH DI MOV BX,[DI] MOV CX,BX ; BX _ _q MOV BX,[BP-2] MOV [BX],CX X1: ; DWDC(); CALL _DWDC ; return (item); ; BX _ _item POP BX PUSH BX MOV SP,BP POP BP RET; ; }; ; Enqueue(q, item) _Enqueue: ; struct Queue *q; ; struct Element *item; PUSH BP MOV BP,SP PUSH CX PUSH BX ; { ; if (item == 0) CallDebugger(ecQueue+1); ; BX _ _item POP BX PUSH BX OR BX,BX JNZ X2 MOV BX,02001X CALL _CallDebugger X2: ; IWDC(); CALL _IWDC ; if (q->head) q->tail->next = item; ; DI _ _q MOV DI,[BP-2] MOV BX,[DI] OR BX,BX JZ X3 ; BX _ _q MOV BX,[BP-2] MOV CX,[BX+2] MOV BX,CX ; CX _ _item POP CX PUSH CX MOV [BX],CX ; else q->head = item; JR X4 X3: ; BX _ _q MOV BX,[BP-2] ; CX _ _item POP CX PUSH CX MOV [BX],CX X4: ; q->tail = item; ; BX _ _q MOV BX,[BP-2] ; CX _ _item POP CX PUSH CX MOV [BX+2],CX ; item->next = 0; ; BX _ _item POP BX PUSH BX MOV WORD PTR [BX],0 ; DWDC(); CALL _DWDC ; }; MOV SP,BP POP BP RET; ; int Unqueue(q, item) _Unqueue: ; struct Queue *q; ; struct Element *item; PUSH BP MOV BP,SP PUSH CX PUSH BX ; { ; struct Element *p, *lastp; ; if (item == 0) CallDebugger(ecQueue+2); ADD SP,0FFFCX ; BX _ _item MOV BX,[BP-4] OR BX,BX JNZ X5 MOV BX,02002X CALL _CallDebugger X5: ; IWDC(); CALL _IWDC ; p = q->head; ; DI _ _q MOV DI,[BP-2] MOV BX,[DI] ; _p _ BX MOV [BP-6],BX ; lastp = (struct Element *) q; ; BX _ _q MOV BX,[BP-2] ; _lastp _ BX POP DX PUSH BX ; while (p) { X6: ; BX _ _p MOV BX,[BP-6] OR BX,BX JZ X7 ; if (p==item) { ; BX _ _item MOV BX,[BP-4] ; CX _ _p MOV CX,[BP-6] CMP CX,BX JNZ X8 ; lastp->next = p->next; ; DI _ _p MOV DI,[BP-6] MOV BX,[DI] MOV CX,BX ; BX _ _lastp POP BX PUSH BX MOV [BX],CX ; if (p->next == 0) q->tail = lastp; /* item was the tail */ ; DI _ _p MOV DI,[BP-6] MOV BX,[DI] OR BX,BX JNZ X9 ; BX _ _q MOV BX,[BP-2] ; CX _ _lastp POP CX PUSH CX MOV [BX+2],CX X9: ; DWDC(); CALL _DWDC ; return(true); MOV BX,0FFFFX MOV SP,BP POP BP RET; ; }; X8: ; lastp = p; ; BX _ _p MOV BX,[BP-6] ; _lastp _ BX POP DX PUSH BX ; p = p->next; ; DI _ _p MOV DI,[BP-6] MOV BX,[DI] ; _p _ BX MOV [BP-6],BX ; }; JR X6 X7: ; DWDC(); CALL _DWDC ; return(false); XOR BX,BX MOV SP,BP POP BP RET; ; }; ; Externals Declared Here PUBLIC _InitQueue PUBLIC _Dequeue PUBLIC _Enqueue PUBLIC _Unqueue C_CODE ENDS ; Number of Bytes of Code = 0F6X, (246)