]> 4ch.mooo.com Git - 16.git/blobdiff - 16/x_/mxel.asm
refresh wwww
[16.git] / 16 / x_ / mxel.asm
diff --git a/16/x_/mxel.asm b/16/x_/mxel.asm
new file mode 100755 (executable)
index 0000000..2c9dda2
--- /dev/null
@@ -0,0 +1,167 @@
+;-----------------------------------------------------------\r
+;\r
+; MXEL.ASM - Mid-point ellipse\r
+; Copyright (c) 1994 by Alessandro Scotti\r
+;\r
+;-----------------------------------------------------------\r
+WARN    PRO\r
+NOWARN  RES\r
+INCLUDE MODEX.DEF\r
+\r
+PUBLIC  mxEllipse\r
+\r
+MX_TEXT         SEGMENT USE16 PARA PUBLIC 'CODE'\r
+                ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING\r
+\r
+EXTRN   mx_BytesPerLine : WORD\r
+EXTRN   mx_VideoSegment : WORD\r
+EXTRN   mx_ClipX1       : WORD\r
+EXTRN   mx_ClipY1       : WORD\r
+EXTRN   mx_ClipX2       : WORD\r
+EXTRN   mx_ClipY2       : WORD\r
+\r
+;-----------------------------------------------------------\r
+;\r
+; Draws an ellipse using the mid-point algorithm.\r
+;\r
+; Input:\r
+;       XC, YC  = center coordinates\r
+;       A       = horizontal radius\r
+;       B       = vertical radius\r
+;       Color   = ellipse color\r
+; Output:\r
+;       none\r
+; Note:\r
+;       computes only points in the first quadrant, all other\r
+;       points are obtained by symmetry.\r
+;\r
+mxEllipse       PROC FAR\r
+        ARG     Color:BYTE:2,   \\r
+                B:WORD,         \\r
+                A:WORD,         \\r
+                YC:WORD,        \\r
+                XC:WORD         = ARG_SIZE\r
+        LOCAL   A2:DWORD,       \\r
+                B2:DWORD,       \\r
+                CC:DWORD,       \\r
+                DD:DWORD,       \\r
+                X:DWORD,        \\r
+                Y:DWORD         = AUTO_SIZE\r
+        .enter  AUTO_SIZE\r
+        .push   ds, si, di\r
+\r
+        .chk386 mxEllipse, @@Exit\r
+\r
+; Initialize variables\r
+        xor     eax, eax\r
+        mov     [X], ax         ; X = 0\r
+        mov     ax, [A]\r
+        mul     eax             ; EAX = A*A\r
+        mov     [DD], eax       ; DD = A*A\r
+        shl     eax, 1\r
+        mov     [CC], eax       ; CC = 2*A*A\r
+        shl     eax, 1\r
+        mov     [A2], eax       ; A2 = 4*A*A\r
+        movzx   edx, [B]\r
+        mov     [Y], edx\r
+        mul     edx             ; EAX = 4*A*A*B\r
+        sub     [DD], eax       ; DD = A*A - 4*A*A*B\r
+        movzx   eax, [B]\r
+        mul     eax             ; EAX = B*B\r
+        shl     eax, 2          ; EAX = 4*B*B\r
+        mov     [B2], eax       ; B2 = 4*B*B\r
+        add     [CC], eax       ; CC = 2*A*A + 4*B*B\r
+        add     [D1], eax       ; DD = A*A - 4*A*A*B + 4*B*B\r
+\r
+; Draw initial points\r
+        call    subPlot4\r
+\r
+; First loop\r
+@@Loop1:\r
+        mov     eax, [X]        ; Check slope\r
+        mul     [B2]\r
+        mov     ecx, eax\r
+        mov     eax, [Y]\r
+        mul     [A2]\r
+        sub     eax, ecx\r
+        sub     eax, [CC]       ; EAX = Y*A2 - X*B2 - CC\r
+        jle     @@Done1         ; Crossed critical point, jump to next loop\r
+\r
+        mov     ecx, [DD]       ; Get error\r
+        test    ecx, ecx        ; Positive?\r
+        jl      @@Draw1         ; No, use default step\r
+\r
+        mov     eax, 1\r
+        sub     eax, [Y]\r
+        mul     [A2]\r
+        shl     eax, 1\r
+        add     ecx, eax        ; Bump error\r
+        dec     WORD PTR [Y]    ; Decrement Y coordinate\r
+\r
+@@Draw1:\r
+        mov     eax, [X]\r
+        shl     eax, 1\r
+        add     eax, 3\r
+        mul     [B2]\r
+        add     ecx, eax        ; Bump error\r
+        mov     [DD], ecx       ; Save error\r
+        inc     WORD PTR [X]    ; Increment X coordinate\r
+\r
+        call    subPlot4        ; Draw points\r
+        jmp     @@Loop1\r
+@@Done1:\r
+\r
+; Initialize variables\r
+        shr     [B2], 2\r
+        mov     eax, [X]\r
+        mul     eax\r
+        add     [X]\r
+        shl     eax, 2\r
+        inc     eax\r
+        mul     [B2]\r
+        mov     [DD], eax\r
+        mov     eax, [Y]\r
+        mul     eax\r
+        add     [Y]\r
+        dec     eax\r
+        add     [Y]\r
+        sub     eax, [B2]\r
+        add     [DD], eax\r
+        shl     [B2], 3\r
+        inc     WORD PTR [X]\r
+\r
+; Second loop\r
+@@Loop2:\r
+        cmp     WORD PTR [Y], 0\r
+        ja      @@Done2\r
+\r
+        mov     ecx, [DD]\r
+        test    ecx, ecx\r
+        jge     @@Draw2\r
+\r
+        mov     eax, [X]\r
+        inc     eax\r
+        mul     [B2]\r
+        add     ecx, eax\r
+        inc     WORD PTR [X]\r
+\r
+@@Draw2:\r
+        mov     eax, [Y]\r
+        shl     eax, 1\r
+        sub     eax, 3\r
+        neg     eax\r
+        imul    [A2]\r
+        add     ecx, eax\r
+        dec     WORD PTR [Y]\r
+\r
+        call    subPlot4\r
+        jmp     @@Loop2\r
+@@Done2:\r
+\r
+@@Exit:\r
+        xor     ax, ax\r
+        .leave  ARG_SIZE\r
+mxEllipse       ENDP\r
+\r
+MX_TEXT         ENDS\r
+END\r