]> 4ch.mooo.com Git - 16.git/blob - 16/xw/mxcc.asm
wwww
[16.git] / 16 / xw / mxcc.asm
1 ;-----------------------------------------------------------\r
2 ;\r
3 ; MXCC.ASM - Fast clip line function\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  xsubClipLine\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 \r
19 EXTRN   mx_ClipX1       : WORD\r
20 EXTRN   mx_ClipY1       : WORD\r
21 EXTRN   mx_ClipX2       : WORD\r
22 EXTRN   mx_ClipY2       : WORD\r
23 \r
24 tblGroups       LABEL WORD\r
25         DW      10,     tbl00\r
26         DW      10,     tbl10\r
27         DW      9,      tbl20\r
28         DW      -1,     0\r
29         DW      10,     tbl40\r
30         DW      10,     tbl50\r
31         DW      9,      tbl60\r
32         DW      -1,     0\r
33         DW      6,      tbl80\r
34         DW      6,      tbl90\r
35         DW      5,      tblA0\r
36         DW      -1,     0\r
37         DW      -1,     0\r
38         DW      -1,     0\r
39         DW      -1,     0\r
40         DW      -1,     0\r
41 tbl00   DW cc00, cc01, cc02, ccFF, cc04, cc05, cc06, ccFF, cc08, cc09, cc0A\r
42 tbl10   DW cc10, ccFF, cc12, ccFF, cc14, ccFF, cc16, ccFF, cc18, ccFF, cc1A\r
43 tbl20   DW cc20, cc21, ccFF, ccFF, cc24, cc25, ccFF, ccFF, cc28, cc29\r
44 tbl40   DW cc40, cc41, cc42, ccFF, ccFF, ccFF, ccFF, ccFF, cc48, cc49, cc4A\r
45 tbl50   DW cc50, ccFF, cc52, ccFF, ccFF, ccFF, ccFF, ccFF, cc58, ccFF, cc5A\r
46 tbl60   DW cc60, cc61, ccFF, ccFF, ccFF, ccFF, ccFF, ccFF, cc68, cc69\r
47 tbl80   DW cc80, cc81, cc82, ccFF, cc84, cc85, cc86\r
48 tbl90   DW cc90, ccFF, cc92, ccFF, cc94, ccFF, cc96\r
49 tblA0   DW ccA0, ccA1, ccFF, ccFF, ccA4, ccA5\r
50 \r
51 ccTT:   clc\r
52         ret\r
53 ccFF:   stc\r
54         ret\r
55 \r
56 ; Group 00 -------------------------------------------------\r
57 ;\r
58 cc00:\r
59         clc\r
60         ret\r
61 cc01:\r
62         jmp     ClipQLeft\r
63 cc02:\r
64         jmp     ClipQRight\r
65 cc04:\r
66         jmp     ClipQTop\r
67 cc05:\r
68         call    ClipQLeft\r
69         cmp     si, [mx_ClipY1]\r
70         jge     ccTT\r
71         jmp     ClipQTop\r
72 cc06:\r
73         call    ClipQRight\r
74         cmp     si, [mx_ClipY1]\r
75         jge     ccTT\r
76         jmp     ClipQTop\r
77 cc08:\r
78         jmp     ClipQBottom\r
79 cc09:\r
80         call    ClipQLeft\r
81         cmp     si, [mx_ClipY2]\r
82         jle     ccTT\r
83         jmp     ClipQBottom\r
84 cc0A:\r
85         call    ClipQRight\r
86         cmp     si, [mx_ClipY2]\r
87         jle     ccTT\r
88         jmp     ClipQBottom\r
89 \r
90 ; Group 10 -------------------------------------------------\r
91 ;\r
92 cc10FF:\r
93         stc\r
94         ret\r
95 cc10TT:\r
96         clc\r
97         ret\r
98 cc10:\r
99         jmp     ClipPLeft\r
100 cc12:\r
101         call    ClipPLeft\r
102         jmp     ClipQRight\r
103 cc14:\r
104         call    ClipPLeft\r
105         cmp     bx, [mx_ClipY1]\r
106         jl      cc10FF\r
107         jmp     ClipQTop\r
108 cc16:\r
109         call    ClipPLeft\r
110         cmp     bx, [mx_ClipY1]\r
111         jl      cc10FF\r
112         call    ClipQTop\r
113         cmp     cx, [mx_ClipX2]\r
114         jle     cc10TT\r
115         jmp     ClipQRight\r
116 cc18:\r
117         call    ClipPLeft\r
118         cmp     bx, [mx_ClipY2]\r
119         jg      cc10FF\r
120         jmp     ClipQBottom\r
121 cc1A:\r
122         call    ClipPLeft\r
123         cmp     bx, [mx_ClipY2]\r
124         jg      cc10FF\r
125         call    ClipQBottom\r
126         cmp     cx, [mx_ClipX2]\r
127         jle     cc10TT\r
128         jmp     ClipQRight\r
129 \r
130 ; Group 20 -------------------------------------------------\r
131 ;\r
132 cc20TT:\r
133         clc\r
134         ret\r
135 cc20FF:\r
136         stc\r
137         ret\r
138 cc20:\r
139         jmp     ClipPRight\r
140 cc21:\r
141         call    ClipPRight\r
142         jmp     ClipQLeft\r
143 cc24:\r
144         call    ClipPRight\r
145         cmp     bx, [mx_ClipY1]\r
146         jl      cc20FF\r
147         jmp     ClipQTop\r
148 cc25:\r
149         call    ClipPRight\r
150         cmp     bx, [mx_ClipY1]\r
151         jl      cc20FF\r
152         call    ClipQTop\r
153         cmp     cx, [mx_ClipX1]\r
154         jge     cc20TT\r
155         jmp     ClipQLeft\r
156 cc28:\r
157         call    ClipPRight\r
158         cmp     bx, [mx_ClipY2]\r
159         jg      cc20FF\r
160         jmp     ClipQBottom\r
161 cc29:\r
162         call    ClipPRight\r
163         cmp     bx, [mx_ClipY2]\r
164         jg      cc20FF\r
165         call    ClipQBottom\r
166         cmp     cx, [mx_ClipX1]\r
167         jge     cc20TT\r
168         jmp     ClipQLeft\r
169 \r
170 ; Group 40 -------------------------------------------------\r
171 ;\r
172 cc40TT:\r
173         clc\r
174         ret\r
175 cc40FF:\r
176         stc\r
177         ret\r
178 cc40:\r
179         jmp     ClipPTop\r
180 cc41:\r
181         call    ClipPTop\r
182         cmp     di, [mx_ClipX1]\r
183         jl      cc40FF\r
184         call    ClipQLeft\r
185         cmp     si, [mx_ClipY1]\r
186         jge     cc40TT\r
187         jmp     ClipQTop\r
188 cc42:\r
189         call    ClipPTop\r
190         cmp     di, [mx_ClipX2]\r
191         jg      cc40FF\r
192         jmp     ClipQRight\r
193 cc48:\r
194         call    ClipPTop\r
195         jmp     ClipQBottom\r
196 cc49:\r
197         call    ClipPTop\r
198         cmp     di, [mx_ClipX1]\r
199         jl      cc40FF\r
200         call    ClipQLeft\r
201         cmp     si, [mx_ClipY2]\r
202         jle     cc40TT\r
203         jmp     ClipQBottom\r
204 cc4A:\r
205         call    ClipPTop\r
206         cmp     di, [mx_ClipX2]\r
207         jg      cc40FF\r
208         call    ClipQRight\r
209         cmp     si, [mx_ClipY2]\r
210         jle     cc40TT\r
211         jmp     ClipQBottom\r
212 \r
213 \r
214 ; Group 50 -------------------------------------------------\r
215 ;\r
216 cc50TT:\r
217         clc\r
218         ret\r
219 cc50FF:\r
220         stc\r
221         ret\r
222 cc50:\r
223         call    ClipPLeft\r
224         cmp     bx, [mx_ClipY1]\r
225         jge     cc50TT\r
226         jmp     ClipPTop\r
227 cc52:\r
228         call    ClipQRight\r
229         cmp     si, [mx_ClipY1]\r
230         jl      cc50FF\r
231         call    ClipPTop\r
232         cmp     di, [mx_ClipX1]\r
233         jge     cc50TT\r
234         jmp     ClipPLeft\r
235 cc58:\r
236         call    ClipQBottom\r
237         cmp     cx, [mx_ClipX1]\r
238         jl      cc50FF\r
239         call    ClipPTop\r
240         cmp     di, [mx_ClipX1]\r
241         jge     cc50TT\r
242         jmp     ClipPLeft\r
243 cc5A:\r
244         call    ClipPLeft\r
245         cmp     bx, [mx_ClipY2]\r
246         jg      cc50FF\r
247         call    ClipQRight\r
248         cmp     bx, [mx_ClipY1]\r
249         jl      cc50FF\r
250         cmp     si, [mx_ClipY2]\r
251         jle     cc50TT\r
252         jmp     ClipQBottom\r
253 \r
254 ; Group 60 -------------------------------------------------\r
255 ;\r
256 cc60TT:\r
257         clc\r
258         ret\r
259 cc60FF:\r
260         stc\r
261         ret\r
262 cc60:\r
263         call    ClipPRight\r
264         cmp     bx, [mx_ClipY1]\r
265         jge     cc60TT\r
266         jmp     ClipPTop\r
267 cc61:\r
268         call    ClipQLeft\r
269         cmp     si, [mx_ClipY2]\r
270         jl      cc60FF\r
271         call    ClipPTop\r
272         cmp     di, [mx_ClipX2]\r
273         jle     cc60TT\r
274         jmp     ClipPRight\r
275 cc68:\r
276         call    ClipQBottom\r
277         cmp     cx, [mx_ClipX2]\r
278         jg      cc60FF\r
279         call    ClipPRight\r
280         cmp     bx, [mx_ClipY1]\r
281         jge     cc60TT\r
282         jmp     ClipPTop\r
283 cc69:\r
284         call    ClipQLeft\r
285         cmp     si, [mx_ClipY1]\r
286         jl      cc60FF\r
287         call    ClipPRight\r
288         cmp     bx, [mx_ClipY2]\r
289         jg      cc60FF\r
290         cmp     si, [mx_ClipY2]\r
291         jle     cc69_1\r
292         call    ClipQBottom\r
293 cc69_1:\r
294         cmp     bx, [mx_ClipY1]\r
295         jge     cc60TT\r
296         jmp     ClipPTop\r
297 \r
298 ; Group 80 -------------------------------------------------\r
299 ;\r
300 cc80TT:\r
301         clc\r
302         ret\r
303 cc80FF:\r
304         stc\r
305         ret\r
306 cc80:\r
307         jmp     ClipPBottom\r
308 cc81:\r
309         call    ClipPBottom\r
310         cmp     di, [mx_ClipX1]\r
311         jl      cc80FF\r
312         jmp     ClipQLeft\r
313 cc82:\r
314         call    ClipPBottom\r
315         cmp     di, [mx_ClipX2]\r
316         jg      cc80FF\r
317         jmp     ClipQRight\r
318 cc84:\r
319         call    ClipPBottom\r
320         jmp     ClipQTop\r
321 cc85:\r
322         call    ClipPBottom\r
323         cmp     di, [mx_ClipX1]\r
324         jl      cc80FF\r
325         call    ClipQLeft\r
326         cmp     si, [mx_ClipY1]\r
327         jge     cc80FF\r
328         jmp     ClipQTop\r
329 cc86:\r
330         call    ClipPBottom\r
331         cmp     di, [mx_ClipX2]\r
332         jg      cc80FF\r
333         call    ClipQRight\r
334         cmp     si, [mx_ClipY1]\r
335         jge     cc80TT\r
336         jmp     ClipQTop\r
337 \r
338 ; Group 90 -------------------------------------------------\r
339 ;\r
340 cc90TT:\r
341         clc\r
342         ret\r
343 cc90FF:\r
344         stc\r
345         ret\r
346 cc90:\r
347         call    ClipPLeft\r
348         cmp     bx, [mx_ClipY2]\r
349         jle     cc90TT\r
350         jmp     ClipPBottom\r
351 cc92:\r
352         call    ClipQRight\r
353         cmp     si, [mx_ClipY2]\r
354         jg      cc90FF\r
355         call    ClipPBottom\r
356         cmp     di, [mx_ClipX1]\r
357         jge     cc90TT\r
358         jmp     ClipPLeft\r
359 cc94:\r
360         call    ClipQTop\r
361         cmp     cx, [mx_ClipX1]\r
362         jl      cc90FF\r
363         call    ClipPLeft\r
364         cmp     bx, [mx_ClipY2]\r
365         jle     cc90TT\r
366         jmp     ClipPBottom\r
367 cc96:\r
368         call    ClipPLeft\r
369         cmp     bx, [mx_ClipY1]\r
370         jl      cc90FF\r
371         call    ClipQRight\r
372         cmp     si, [mx_ClipY2]\r
373         jg      cc90FF\r
374         cmp     bx, [mx_ClipY2]\r
375         jle     cc96_1\r
376         call    ClipPBottom\r
377 cc96_1:\r
378         cmp     si, [mx_ClipY1]\r
379         jge     cc90TT\r
380         jmp     ClipQTop\r
381 \r
382 ; Group A0 -------------------------------------------------\r
383 ;\r
384 ccA0TT:\r
385         clc\r
386         ret\r
387 ccA0FF:\r
388         stc\r
389         ret\r
390 ccA0:\r
391         call    ClipPRight\r
392         cmp     bx, [mx_ClipY2]\r
393         jle     ccA0TT\r
394         jmp     ClipPBottom\r
395 ccA1:\r
396         call    ClipQLeft\r
397         cmp     si, [mx_ClipY2]\r
398         jg      ccA0FF\r
399         call    ClipPBottom\r
400         cmp     di, [mx_ClipX2]\r
401         jle     ccA0TT\r
402         jmp     ClipPRight\r
403 ccA4:\r
404         call    ClipQTop\r
405         cmp     cx, [mx_ClipX2]\r
406         jg      ccA0FF\r
407         call    ClipPRight\r
408         cmp     bx, [mx_ClipY2]\r
409         jle     ccA0TT\r
410         jmp     ClipPBottom\r
411 ccA5:\r
412         call    ClipQLeft\r
413         cmp     si, [mx_ClipY2]\r
414         jg      ccA0FF\r
415         call    ClipPRight\r
416         cmp     bx, [mx_ClipY1]\r
417         jl      ccA0FF\r
418         cmp     si, [mx_ClipY1]\r
419         jge     ccA5_1\r
420         call    ClipQTop\r
421 ccA5_1:\r
422         cmp     bx, [mx_ClipY2]\r
423         jle     ccA0TT\r
424         jmp     ClipPBottom\r
425 \r
426 ; Y1 = (Y2-Y1)*(mx_ClipX1-X1)/(X2-X1)+Y1 = (SI-BX)*(mx_ClipX1-DI)/(CX-DI)+BX\r
427 ; X1 = mx_ClipX1\r
428 ClipPLeft:\r
429         mov     ax, si\r
430         sub     ax, bx\r
431         mov     dx, [mx_ClipX1]\r
432         sub     dx, di\r
433         imul    dx\r
434         mov     bp, cx\r
435         sub     bp, di\r
436         idiv    bp\r
437         add     bx, ax\r
438         mov     di, [mx_ClipX1]\r
439         clc\r
440         ret\r
441 \r
442 ; Y1 = (Y2-Y1)*(mx_ClipX2-X1)/(X2-X1)+Y1 = (SI-BX)*(mx_ClipX2-DI)/(CX-DI)+BX\r
443 ; X1 = mx_ClipX2\r
444 ClipPRight:\r
445         mov     ax, si\r
446         sub     ax, bx\r
447         mov     dx, [mx_ClipX2]\r
448         sub     dx, di\r
449         imul    dx\r
450         mov     bp, cx\r
451         sub     bp, di\r
452         idiv    bp\r
453         add     bx, ax\r
454         mov     di, [mx_ClipX2]\r
455         clc\r
456         ret\r
457 \r
458 ; X1 = (X2-X1)*(mx_ClipY2-Y1)/(Y2-Y1)+X1 = (CX-DI)*(mx_ClipY2-BX)/(SI-BX)+DI\r
459 ; Y1 = mx_ClipY2\r
460 ClipPBottom:\r
461         mov     ax, cx\r
462         sub     ax, di\r
463         mov     dx, [mx_ClipY2]\r
464         sub     dx, bx\r
465         imul    dx\r
466         mov     bp, si\r
467         sub     bp, bx\r
468         idiv    bp\r
469         add     di, ax\r
470         mov     bx, [mx_ClipY2]\r
471         clc\r
472         ret\r
473 \r
474 ; X1 = (X2-X1)*(mx_ClipY1-Y1)/(Y2-Y1)+X1 = (CX-DI)*(mx_ClipY1-BX)/(SI-BX)+DI\r
475 ; Y1 = mx_ClipY1\r
476 ClipPTop:\r
477         mov     ax, cx\r
478         sub     ax, di\r
479         mov     dx, [mx_ClipY1]\r
480         sub     dx, bx\r
481         imul    dx\r
482         mov     bp, si\r
483         sub     bp, bx\r
484         idiv    bp\r
485         add     di, ax\r
486         mov     bx, [mx_ClipY1]\r
487         clc\r
488         ret\r
489 \r
490 ; Y2 = (Y1-Y2)*(mx_ClipX1-X2)/(X1-X2)+Y2 = (BX-SI)*(mx_ClipX1-CX)/(DI-CX)+SI\r
491 ; X2 = mx_ClipX1\r
492 ClipQLeft:\r
493         mov     ax, bx\r
494         sub     ax, si\r
495         mov     dx, [mx_ClipX1]\r
496         sub     dx, cx\r
497         imul    dx\r
498         mov     bp, di\r
499         sub     bp, cx\r
500         idiv    bp\r
501         add     si, ax\r
502         mov     cx, [mx_ClipX1]\r
503         clc\r
504         ret\r
505 \r
506 ; Y2 = (Y1-Y2)*(mx_ClipX2-X2)/(X1-X2)+Y2 = (BX-SI)*(mx_ClipX2-CX)/(DI-CX)+SI\r
507 ; X2 = mx_ClipX1\r
508 ClipQRight:\r
509         mov     ax, bx\r
510         sub     ax, si\r
511         mov     dx, [mx_ClipX2]\r
512         sub     dx, cx\r
513         imul    dx\r
514         mov     bp, di\r
515         sub     bp, cx\r
516         idiv    bp\r
517         add     si, ax\r
518         mov     cx, [mx_ClipX2]\r
519         clc\r
520         ret\r
521 \r
522 ; X2 = (X1-X2)*(mx_ClipY2-Y2)/(Y1-Y2)+X2 = (DI-CX)*(mx_ClipY2-SI)/(BX-SI)+CX\r
523 ; Y2 = mx_ClipY1\r
524 ClipQBottom:\r
525         mov     ax, di\r
526         sub     ax, cx\r
527         mov     dx, [mx_ClipY2]\r
528         sub     dx, si\r
529         imul    dx\r
530         mov     bp, bx\r
531         sub     bp, si\r
532         idiv    bp\r
533         add     cx, ax\r
534         mov     si, [mx_ClipY2]\r
535         clc\r
536         ret\r
537 \r
538 ; X2 = (X1-X2)*(mx_ClipY1-Y2)/(Y1-Y2)+X2 = (DI-CX)*(mx_ClipY1-SI)/(BX-SI)+CX\r
539 ; Y2 = mx_ClipY1\r
540 ClipQTop:\r
541         mov     ax, di\r
542         sub     ax, cx\r
543         mov     dx, [mx_ClipY1]\r
544         sub     dx, si\r
545         imul    dx\r
546         mov     bp, bx\r
547         sub     bp, si\r
548         idiv    bp\r
549         add     cx, ax\r
550         mov     si, [mx_ClipY1]\r
551         clc\r
552         ret\r
553 \r
554 ;-----------------------------------------------------------\r
555 ;\r
556 ; Checks the coordinates of a line against the active\r
557 ; clip region.\r
558 ; Uses the Sobkow-Pospisil-Yang (SPY) algorithm: this was\r
559 ; supposed to be twice as fast as Cohen-Sutherland, but my\r
560 ; tests show only a very small increase in speed and a noticeable\r
561 ; increase of the program size! Maybe this is caused by the\r
562 ; slow speed of VGA cards, so probably a better test should\r
563 ; be performed with lines drawn in RAM.\r
564 ;\r
565 ; Input:\r
566 ;       AX, BX  = X1, Y1\r
567 ;       CX, DX  = X2, Y2\r
568 ; Output:\r
569 ;       CF      = set if line is full clipped\r
570 ;       AX, BX  = clipped X1, Y1\r
571 ;       CX, DX  = clipped X2, Y2\r
572 ; Note:\r
573 ;       destroys SI, DI\r
574 ;\r
575 xsubClipLine     PROC    NEAR\r
576         push    bp\r
577         xor     si, si                  ; SPY code\r
578 \r
579         cmp     dx, [mx_ClipY2]\r
580         jle     @@1\r
581         or      si, 08h\r
582         jmp     @@2\r
583 @@1:\r
584         cmp     dx, [mx_ClipY1]\r
585         jge     @@2\r
586         or      si, 04h\r
587 @@2:\r
588 \r
589         cmp     cx, [mx_ClipX2]\r
590         jle     @@3\r
591         or      si, 02h\r
592         jmp     @@4\r
593 @@3:\r
594         cmp     cx, [mx_ClipX1]\r
595         jge     @@4\r
596         or      si, 01h\r
597 @@4:\r
598 \r
599         cmp     bx, [mx_ClipY2]\r
600         jle     @@5\r
601         or      si, 80h\r
602         jmp     @@6\r
603 @@5:\r
604         cmp     bx, [mx_ClipY1]\r
605         jge     @@6\r
606         or      si, 40h\r
607 @@6:\r
608 \r
609         cmp     ax, [mx_ClipX2]\r
610         jle     @@7\r
611         or      si, 20h\r
612         jmp     @@8\r
613 @@7:\r
614         cmp     ax, [mx_ClipX1]\r
615         jge     @@8\r
616         or      si, 10h\r
617 @@8:\r
618 \r
619         mov     di, si\r
620         and     di, 000Fh               ; Index of procedure\r
621         and     si, 00F0h\r
622         .shr    si, 2                   ; Index of group (times 4)\r
623         cmp     di, cs:tblGroups[si]    ; Is index within range?\r
624         jg      @@Exit                  ; No, line is full clipped\r
625         mov     si, cs:tblGroups[si+2]  ; Get offset of group table\r
626         shl     di, 1                   ; We must index word elements\r
627         add     si, di                  ; Make full offset\r
628         mov     di, ax                  ; Move X1 to DI and free AX\r
629         mov     si, cs:[si]             ; Get subroutine address\r
630         xchg    dx, si                  ; Move Y2 to SI and free DX\r
631         call    dx                      ; Call the proper subroutine\r
632         mov     ax, di                  ; Restore AX to X1\r
633         mov     dx, si                  ; Restore DX to Y2\r
634         pop     bp\r
635         ret\r
636 \r
637 @@Exit:\r
638         pop     bp\r
639         stc\r
640         ret\r
641 xsubClipLine     ENDP\r
642 \r
643 MX_TEXT         ENDS\r
644 END\r