;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)