]> 4ch.mooo.com Git - 16.git/blob - 16/xw/mxcl.asm
16_ca needs huge amounts of work and I should remember what needs to be done soon...
[16.git] / 16 / xw / mxcl.asm
1 ;-----------------------------------------------------------\r
2 ;\r
3 ; MXCL.ASM - Bresenham circle\r
4 ; Copyright (c) 1993,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  mxCircle\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 a circle using the Bresenham algorithm.\r
26 ;\r
27 ; Input:\r
28 ;       XC, YC  = center coordinates\r
29 ;       Radius  = circle radius\r
30 ;       Color   = circle color\r
31 ; Output:\r
32 ;       none\r
33 ; Note:\r
34 ;       computes only points in the first octant, all other\r
35 ;       points are obtained by symmetry.\r
36 ;\r
37 mxCircle        PROC FAR\r
38         ARG     Color:BYTE:2,           \\r
39                 Radius:WORD,            \\r
40                 YC:WORD,                \\r
41                 XC:WORD                 = ARG_SIZE\r
42         LOCAL   Delta:WORD              = AUTO_SIZE\r
43         .enter  AUTO_SIZE\r
44         .push   ds, si, di\r
45 \r
46         xor     si, si                  ; X\r
47         mov     di, [Radius]            ; Y\r
48         mov     ax, 3\r
49         sub     ax, di\r
50         sub     ax, di\r
51         mov     [Delta], ax             ; Delta = 3-R*2\r
52 \r
53         mov     ds, [mx_VideoSegment]\r
54 \r
55 @@Loop:\r
56         cmp     si, di                  ;\r
57         jg      @@Done                  ; Exit when X > Y\r
58 ; Draw points\r
59         mov     ax, si\r
60         mov     bx, di\r
61         call    @@subPutPixel\r
62         mov     ax, si\r
63         neg     ax\r
64         mov     bx, di\r
65         call    @@subPutPixel\r
66         mov     ax, si\r
67         mov     bx, di\r
68         neg     bx\r
69         call    @@subPutPixel\r
70         mov     ax, si\r
71         neg     ax\r
72         mov     bx, di\r
73         neg     bx\r
74         call    @@subPutPixel\r
75         mov     ax, di\r
76         mov     bx, si\r
77         call    @@subPutPixel\r
78         mov     ax, di\r
79         neg     ax\r
80         mov     bx, si\r
81         call    @@subPutPixel\r
82         mov     ax, di\r
83         mov     bx, si\r
84         neg     bx\r
85         call    @@subPutPixel\r
86         mov     ax, di\r
87         neg     ax\r
88         mov     bx, si\r
89         neg     bx\r
90         call    @@subPutPixel\r
91 ; Moves coordinates to next point\r
92         mov     ax, [Delta]\r
93         test    ax, ax\r
94         jl      @@Next\r
95         mov     ax, di\r
96         .shl    ax, 2\r
97         sub     ax, 4\r
98         sub     [Delta], ax\r
99         dec     di\r
100 @@Next:\r
101         mov     ax, si\r
102         .shl    ax, 2\r
103         add     ax, 6\r
104         add     [Delta], ax\r
105         inc     si\r
106         jmp     @@Loop\r
107 \r
108 @@Done:\r
109         xor     ax, ax\r
110         .pop    ds, si, di\r
111         .leave  ARG_SIZE\r
112 \r
113 ;---------------------------------------\r
114 ; Put pixel function.\r
115 ; Input:\r
116 ;       BX      = X coordinate (relative to center)\r
117 ;       AX      = Y coordinate (relative to center)\r
118 ;       DS      = video segment\r
119 @@subPutPixel:\r
120         add     bx, [XC]                ; Get absolute coordinates\r
121         add     ax, [YC]\r
122 \r
123         cmp     bx, [mx_ClipX1]         ; Clip pixel\r
124         jl      @@subExit\r
125         cmp     bx, [mx_ClipX2]\r
126         jg      @@subExit\r
127         cmp     ax, [mx_ClipY1]\r
128         jl      @@subExit\r
129         cmp     ax, [mx_ClipY2]\r
130         jg      @@subExit\r
131 \r
132         mul     [mx_BytesPerLine]       ; Get pixel offset\r
133         mov     cx, bx                  ; Save X coordinate\r
134         .shr    bx, 2\r
135         add     bx, ax                  ; DS:BX = pixel offset\r
136 \r
137         and     cl, 3                   ; Set write plane\r
138         mov     ax, 0102h\r
139         shl     ah, cl\r
140         mov     dx, TS\r
141         out     dx, ax\r
142 \r
143         mov     al, [Color]             ; Write pixel\r
144         mov     ds:[bx], al\r
145 \r
146 @@subExit:\r
147         retn\r
148 mxCircle        ENDP\r
149 \r
150 MX_TEXT         ENDS\r
151 END\r