]> 4ch.mooo.com Git - 16.git/blob - 16/x_/mxel.asm
16_ca needs huge amounts of work and I should remember what needs to be done soon...
[16.git] / 16 / x_ / mxel.asm
1 ;-----------------------------------------------------------\r
2 ;\r
3 ; MXEL.ASM - Mid-point ellipse\r
4 ; Copyright (c) 1994 by Alessandro Scotti\r
5 ;\r
6 ;-----------------------------------------------------------\r
7 WARN    PRO\r
8 NOWARN  RES\r
9 INCLUDE MODEX.DEF\r
10 \r
11 PUBLIC  mxEllipse\r
12 \r
13 MX_TEXT         SEGMENT USE16 PARA PUBLIC 'CODE'\r
14                 ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING\r
15 \r
16 EXTRN   mx_BytesPerLine : WORD\r
17 EXTRN   mx_VideoSegment : WORD\r
18 EXTRN   mx_ClipX1       : WORD\r
19 EXTRN   mx_ClipY1       : WORD\r
20 EXTRN   mx_ClipX2       : WORD\r
21 EXTRN   mx_ClipY2       : WORD\r
22 \r
23 ;-----------------------------------------------------------\r
24 ;\r
25 ; Draws an ellipse using the mid-point algorithm.\r
26 ;\r
27 ; Input:\r
28 ;       XC, YC  = center coordinates\r
29 ;       A       = horizontal radius\r
30 ;       B       = vertical radius\r
31 ;       Color   = ellipse color\r
32 ; Output:\r
33 ;       none\r
34 ; Note:\r
35 ;       computes only points in the first quadrant, all other\r
36 ;       points are obtained by symmetry.\r
37 ;\r
38 mxEllipse       PROC FAR\r
39         ARG     Color:BYTE:2,   \\r
40                 B:WORD,         \\r
41                 A:WORD,         \\r
42                 YC:WORD,        \\r
43                 XC:WORD         = ARG_SIZE\r
44         LOCAL   A2:DWORD,       \\r
45                 B2:DWORD,       \\r
46                 CC:DWORD,       \\r
47                 DD:DWORD,       \\r
48                 X:DWORD,        \\r
49                 Y:DWORD         = AUTO_SIZE\r
50         .enter  AUTO_SIZE\r
51         .push   ds, si, di\r
52 \r
53         .chk386 mxEllipse, @@Exit\r
54 \r
55 ; Initialize variables\r
56         xor     eax, eax\r
57         mov     [X], ax         ; X = 0\r
58         mov     ax, [A]\r
59         mul     eax             ; EAX = A*A\r
60         mov     [DD], eax       ; DD = A*A\r
61         shl     eax, 1\r
62         mov     [CC], eax       ; CC = 2*A*A\r
63         shl     eax, 1\r
64         mov     [A2], eax       ; A2 = 4*A*A\r
65         movzx   edx, [B]\r
66         mov     [Y], edx\r
67         mul     edx             ; EAX = 4*A*A*B\r
68         sub     [DD], eax       ; DD = A*A - 4*A*A*B\r
69         movzx   eax, [B]\r
70         mul     eax             ; EAX = B*B\r
71         shl     eax, 2          ; EAX = 4*B*B\r
72         mov     [B2], eax       ; B2 = 4*B*B\r
73         add     [CC], eax       ; CC = 2*A*A + 4*B*B\r
74         add     [D1], eax       ; DD = A*A - 4*A*A*B + 4*B*B\r
75 \r
76 ; Draw initial points\r
77         call    subPlot4\r
78 \r
79 ; First loop\r
80 @@Loop1:\r
81         mov     eax, [X]        ; Check slope\r
82         mul     [B2]\r
83         mov     ecx, eax\r
84         mov     eax, [Y]\r
85         mul     [A2]\r
86         sub     eax, ecx\r
87         sub     eax, [CC]       ; EAX = Y*A2 - X*B2 - CC\r
88         jle     @@Done1         ; Crossed critical point, jump to next loop\r
89 \r
90         mov     ecx, [DD]       ; Get error\r
91         test    ecx, ecx        ; Positive?\r
92         jl      @@Draw1         ; No, use default step\r
93 \r
94         mov     eax, 1\r
95         sub     eax, [Y]\r
96         mul     [A2]\r
97         shl     eax, 1\r
98         add     ecx, eax        ; Bump error\r
99         dec     WORD PTR [Y]    ; Decrement Y coordinate\r
100 \r
101 @@Draw1:\r
102         mov     eax, [X]\r
103         shl     eax, 1\r
104         add     eax, 3\r
105         mul     [B2]\r
106         add     ecx, eax        ; Bump error\r
107         mov     [DD], ecx       ; Save error\r
108         inc     WORD PTR [X]    ; Increment X coordinate\r
109 \r
110         call    subPlot4        ; Draw points\r
111         jmp     @@Loop1\r
112 @@Done1:\r
113 \r
114 ; Initialize variables\r
115         shr     [B2], 2\r
116         mov     eax, [X]\r
117         mul     eax\r
118         add     [X]\r
119         shl     eax, 2\r
120         inc     eax\r
121         mul     [B2]\r
122         mov     [DD], eax\r
123         mov     eax, [Y]\r
124         mul     eax\r
125         add     [Y]\r
126         dec     eax\r
127         add     [Y]\r
128         sub     eax, [B2]\r
129         add     [DD], eax\r
130         shl     [B2], 3\r
131         inc     WORD PTR [X]\r
132 \r
133 ; Second loop\r
134 @@Loop2:\r
135         cmp     WORD PTR [Y], 0\r
136         ja      @@Done2\r
137 \r
138         mov     ecx, [DD]\r
139         test    ecx, ecx\r
140         jge     @@Draw2\r
141 \r
142         mov     eax, [X]\r
143         inc     eax\r
144         mul     [B2]\r
145         add     ecx, eax\r
146         inc     WORD PTR [X]\r
147 \r
148 @@Draw2:\r
149         mov     eax, [Y]\r
150         shl     eax, 1\r
151         sub     eax, 3\r
152         neg     eax\r
153         imul    [A2]\r
154         add     ecx, eax\r
155         dec     WORD PTR [Y]\r
156 \r
157         call    subPlot4\r
158         jmp     @@Loop2\r
159 @@Done2:\r
160 \r
161 @@Exit:\r
162         xor     ax, ax\r
163         .leave  ARG_SIZE\r
164 mxEllipse       ENDP\r
165 \r
166 MX_TEXT         ENDS\r
167 END\r