]> github.com/historicalsource and other repositories - DRGNSRC.git/blob - DDRECT.ASM
Fixed README extension
[DRGNSRC.git] / DDRECT.ASM
1 cseg            segment public 'code'\r
2 \r
3 assume          cs: cseg, ds: dseg\r
4 \r
5 public          draw_rect, undraw_rect, rect_offscrn\r
6 \r
7 include         ddeqfile\r
8 \r
9 draw_rectega:\r
10 ;put a black block onto the screen and buffer the background\r
11         push    ds\r
12         push    es\r
13         mov     ax,seg rect_x\r
14         mov     ds,ax\r
15         mov     es,ax\r
16                 mov     si, offset rect_x       ; assume initial values for\r
17                 mov     di, offset bled_rect_x  ; bled coords and sizes\r
18                 movsw\r
19                 movsw\r
20                 movsw\r
21                 movsw\r
22                 mov     di, offset rect_save_area\r
23         mov     bx,rect_x\r
24         cmp     bx,60\r
25         ja      offscr\r
26         add     bx,6\r
27         js      offscr\r
28 ;my simple left and right checking !\r
29         shr     bx,1    ;no shift or silly things like that !\r
30         \r
31         mov     cx,rect_y\r
32         cmp     cx,160  ;if below bottom offscreen !\r
33         jge     offscr  ;changed from ae ?to take care of sign ?\r
34         add     cx,rect_rows    ;bottom of thing where is it\r
35         cmp     cx,0\r
36         jl      offscr\r
37         jmp     ok1\r
38 offscr:\r
39         pop     es\r
40         pop     ds\r
41         mov     rect_bkgd_ptr,48000     ;dummy OFFSCREEN value !\r
42         jmp     rect_offscrn\r
43         ret\r
44 ok1:\r
45         mov     bx,rect_x\r
46         shr     bx,1\r
47         mov     ax,rect_y\r
48         shl     ax,1\r
49         shl     ax,1\r
50         mov     cx,ax   ;*36 =*32+*4\r
51         shl     ax,1    ;*8\r
52         shl     ax,1    ;*16\r
53         shl     ax,1    ;*32\r
54         add     ax,cx   ;ax=y*36\r
55         add     ax,bx\r
56 ;now rect_cols/2 wide rect_rows downwards !\r
57 \r
58         mov     bp,rect_rows\r
59         mov     si, window_topleft\r
60         sub     si,offset dummy_scrn    \r
61         shr     si,1\r
62         add     si,ax   ;scrn top_left + posn of object\r
63         and     si,8191\r
64         mov     rect_bkgd_ptr,si\r
65         mov     ax,seg rect_save_area\r
66         mov     es,ax\r
67         mov     di,offset rect_save_area\r
68         mov     dx,rect_cols\r
69         shr     dx,1\r
70         jnz     no_rt\r
71         pop     es\r
72         pop     ds\r
73         mov     rect_bkgd_ptr,48000\r
74         ret\r
75 no_rt:\r
76         mov     rbw_rect,dx\r
77         mov     raw_rect,bp\r
78         lds     bx,dum_ptr\r
79 sqloop:\r
80         push    si\r
81         mov     cx,dx   ;reload rect cols\r
82 bloop:\r
83         mov     al,[si]\r
84         mov     ah,[si+8192]\r
85         stosw   ;buffer\r
86         mov     al,[si+16384]\r
87         mov     ah,[si+24576]\r
88         stosw   ;buffer\r
89         mov     byte ptr [si],0 ;black !\r
90         mov     byte ptr [si+8192],0    ;black !\r
91         mov     byte ptr [si+16384],0   ;black !\r
92         mov     byte ptr [si+24576],0   ;black !\r
93         inc     si\r
94         and     si,8191\r
95         loop    bloop\r
96 \r
97         pop     si\r
98         add     si,36\r
99         and     si,8191\r
100         dec     bp\r
101         jge     sqloop\r
102         pop     es\r
103         pop     ds\r
104         ret\r
105 \r
106         ret\r
107 \r
108 draw_recttan:\r
109 ;put a black block onto the screen and buffer the background\r
110         push    ds\r
111         push    es\r
112                 mov     si, offset rect_x       ; assume initial values for\r
113                 mov     di, offset bled_rect_x  ; bled coords and sizes\r
114                 movsw\r
115                 movsw\r
116                 movsw\r
117                 movsw\r
118                 mov     di, offset rect_save_area\r
119         mov     bx,rect_x\r
120         cmp     bx,60\r
121         ja      offscrt\r
122         add     bx,6\r
123         js      offscrt\r
124 ;my simple left and right checking !\r
125         shr     bx,1    ;no shift or silly things like that !\r
126         \r
127         mov     cx,rect_y\r
128         cmp     cx,160  ;if below bottom offscreen !\r
129         jge     offscrt\r
130         add     cx,rect_rows    ;bottom of thing where is it\r
131         cmp     cx,0\r
132         jl      offscrt\r
133         jmp     ok2\r
134 offscrt:\r
135         pop     es\r
136         pop     ds\r
137         mov     rect_bkgd_ptr,48000     ;dummy OFFSCREEN value !\r
138         jmp     rect_offscrn\r
139         ret\r
140 ok2:\r
141         mov     bx,rect_x\r
142         add     bx,bx   ;*2 !\r
143         mov     ax,rect_y\r
144         shl     ax,1\r
145         shl     ax,1\r
146         mov     cx,ax   ;*36 =*32+*4\r
147         shl     ax,1    ;*8\r
148         shl     ax,1    ;*16\r
149         shl     ax,1    ;*32\r
150         add     ax,cx   ;ax=y*36\r
151         shl     ax,1\r
152         shl     ax,1    ;*144\r
153         add     ax,bx   ;offset within screen\r
154 ;now rect_cols/2 wide rect_rows downwards !\r
155         mov     bp,rect_rows\r
156         mov     si, window_topleft\r
157         sub     si,offset dummy_scrn    \r
158         add     si,si\r
159         add     si,ax   ;scrn top_left + posn of object\r
160         and     si,32767        ;always an even address folks !\r
161         mov     rect_bkgd_ptr,si\r
162         mov     ax,seg rect_save_area\r
163         mov     es,ax\r
164         mov     di,offset rect_save_area\r
165         mov     dx,rect_cols\r
166 ;add    dx,dx   ;*2 from cga to Tandy Nibbles !\r
167         or      dx,dx\r
168         jnz     no_rt2\r
169         pop     es\r
170         pop     ds\r
171         mov     rect_bkgd_ptr,48000\r
172         ret\r
173 no_rt2:\r
174         mov     rbw_rect,dx\r
175         mov     raw_rect,bp\r
176         lds     bx,dum_ptr\r
177 sqloopt:\r
178         push    si\r
179         mov     cx,dx   ;reload rect cols\r
180 bloopt:\r
181         movsw           ;buffer the screen\r
182         mov     word ptr [si-2],0       ;put the black\r
183         and     si,32767        ;or 6?\r
184         loop    bloopt\r
185         pop     si\r
186         add     si,144\r
187         and     si,32767\r
188         dec     bp\r
189         jge     sqloopt\r
190         pop     es\r
191         pop     ds\r
192         ret\r
193 \r
194 draw_rect:      \r
195         mov     ax,seg rect_x\r
196         mov     ds,ax\r
197         mov     es,ax\r
198                 cmp     [sixteencol],1\r
199                 jne     ndr_rect\r
200                 jmp     draw_recttan\r
201 ndr_rect:\r
202                 cmp     [sixteencol],2\r
203                 jne     ndr_rect2\r
204                 jmp     draw_rectega\r
205 ndr_rect2:\r
206                 cmp     [sixteencol],3\r
207                 jne     ndr_rect3\r
208                 jmp     draw_rectega\r
209 ndr_rect3:\r
210                 call    setup_rect\r
211                 mov     dx, rbw_rect\r
212                 call    rect_main               ; draw main part before wrap\r
213                 mov     cx, cbw_rect\r
214                 call    rect_wrap               ; draw wrap-line part 1\r
215                 sub     si, 9600                ; wraparound in dummy scrn\r
216                 mov     cx, caw_rect\r
217                 call    rect_wrap               ; draw wrap-line part 2\r
218                 mov     ax, cbw_rect            ; if wrap-line has been drawn\r
219                 or      ax, caw_rect            ; then update bkgd ptr\r
220                 jz      over_dr\r
221                 sub     si, bled_rect_cols\r
222                 add     si, 60\r
223 over_dr:        mov     dx, raw_rect\r
224                 call    rect_main               ; draw main part after wrap\r
225                 ret\r
226 \r
227 rect_wrap:      jcxz    exit_rw\r
228 next_byte_rw:   xor     al, al\r
229                 xchg    al, [si]\r
230                 inc     si\r
231                 stosb\r
232                 loop    next_byte_rw\r
233 exit_rw:        ret\r
234 \r
235 rect_main:      and     dx, dx\r
236                 jz      exit_rm\r
237 next_row_rm:    mov     cx, bled_rect_cols\r
238 next_col_rm:    xor     al, al\r
239                 xchg    [si], al\r
240                 inc     si\r
241                 stosb\r
242                 loop    next_col_rm\r
243                 sub     si, bled_rect_cols\r
244                 add     si, 60\r
245                 dec     dx\r
246                 jnz     next_row_rm\r
247 exit_rm:        ret\r
248 \r
249 undraw_rectega:\r
250 ;take a block of data from the buffer and put to the dummy screen\r
251         mov     di,rect_bkgd_ptr        ;dummy OFFSCREEN value !\r
252         cmp     di,48000\r
253         jne     no_ret_ele\r
254 squit:\r
255         jmp     rect_offscrn\r
256         ret\r
257 no_ret_ele:\r
258 ;mov    bp,bled_rect_rows\r
259 ;add    bp,bp\r
260         mov     bp,raw_rect\r
261         mov     dx,rbw_rect     ;bled_rect_cols\r
262 ;shr    dx,1\r
263         or      dx,dx\r
264         jz      squit\r
265         push    ds\r
266         push    es\r
267         les     bx,dum_ptr\r
268         mov     ax,seg rect_save_area\r
269         mov     ds,ax\r
270         mov     si,offset rect_save_area\r
271         and     di,8191 ;in case a crap value has slipped thru'\r
272 ublll:  push    di\r
273         mov     cx,dx\r
274 ubloop: lodsw\r
275         mov     es:[di],al\r
276         mov     es:[di+8192],ah\r
277         lodsw\r
278         mov     es:[di+16384],al\r
279         mov     es:[di+24576],ah\r
280         inc     di\r
281         and     di,8191\r
282         loop    ubloop\r
283         pop     di\r
284         add     di,36\r
285         and     di,8191\r
286         dec     bp\r
287         jge     ublll\r
288         pop     es\r
289         pop     ds\r
290         ret\r
291 \r
292 undraw_recttan:\r
293 ;take a block of data from the buffer and put to the dummy screen\r
294         mov     di,rect_bkgd_ptr        ;dummy OFFSCREEN value !\r
295         cmp     di,48000\r
296         jne     no_ret_elez\r
297 squitz:\r
298         jmp     rect_offscrn\r
299         ret\r
300 no_ret_elez:\r
301         mov     bp,raw_rect\r
302         mov     dx,rbw_rect     ;bled_rect_cols\r
303         or      dx,dx\r
304         jz      squitz\r
305         push    ds\r
306         push    es\r
307         les     bx,dum_ptr\r
308         mov     ax,seg rect_save_area\r
309         mov     ds,ax\r
310         mov     si,offset rect_save_area\r
311         and     di,32767        ;in case a crap value has slipped thru'\r
312 ublllt: push    di\r
313         mov     cx,dx\r
314 ubloopt:        \r
315         movsw   ;buffer a row ?\r
316         and     di,32767\r
317         loop    ubloopt\r
318         pop     di\r
319         add     di,144\r
320         and     di,32767\r
321         dec     bp\r
322         jge     ublllt\r
323         pop     es\r
324         pop     ds\r
325         ret\r
326 \r
327 undraw_rect:    \r
328         mov     ax,seg rect_x\r
329         mov     ds,ax\r
330         mov     es,ax\r
331                 cmp     [sixteencol],1\r
332                 jne     undr_rect\r
333                 jmp     undraw_recttan\r
334 undr_rect:\r
335                 cmp     [sixteencol],2\r
336                 jne     undr_rect2\r
337                 jmp     undraw_rectega\r
338 undr_rect2:\r
339                 cmp     [sixteencol],3\r
340                 jne     undr_rect3\r
341                 jmp     undraw_rectega\r
342 undr_rect3:\r
343                 mov     si, offset rect_save_area\r
344                 mov     di, rect_bkgd_ptr\r
345                 mov     dx, rbw_rect\r
346                 call    unrect_main             ; undraw main part before wrap\r
347                 mov     cx, cbw_rect\r
348                 rep     movsb                   ; undraw wrap-line part 1\r
349                 sub     di, 9600                ; wraparound in dummy scrn\r
350                 mov     cx, caw_rect\r
351                 rep     movsb                   ; undraw wrap-line part 2\r
352                 mov     ax, cbw_rect            ; if wrap-line has been drawn\r
353                 or      ax, caw_rect            ; then update bkgd ptr\r
354                 jz      over_ur\r
355                 sub     di, bled_rect_cols\r
356                 add     di, 60\r
357 over_ur:        mov     dx, raw_rect\r
358                 call    unrect_main             ; undraw main part after wrap\r
359 exit_ur:        ret\r
360 \r
361 unrect_main:    and     dx, dx\r
362                 jz      exit_um\r
363 next_row_um:    mov     cx, bled_rect_cols\r
364                 rep     movsb\r
365                 sub     di, bled_rect_cols\r
366                 add     di, 60\r
367                 dec     dx\r
368                 jnz     next_row_um\r
369 exit_um:        ret\r
370 \r
371 setup_rect:\r
372                 mov     si, offset rect_x       ; assume initial values for\r
373                 mov     di, offset bled_rect_x  ; bled coords and sizes\r
374                 movsw\r
375                 movsw\r
376                 movsw\r
377                 movsw\r
378                 mov     si, window_topleft\r
379                 mov     di, offset rect_save_area\r
380 \r
381 test_above:     mov     ax, rect_y\r
382                 cmp     ax, 0                   ; all or part above scrn ?\r
383                 jge     over_sr2                ; - no\r
384                 add     bled_rect_rows, ax      ; - yes\r
385                 jg      over_sr1                ; all above scrn ?\r
386                 jmp     rect_offscrn            ; - yes\r
387 over_sr1:       mov     bled_rect_y, 0          ; - no, bled rect at scrn top\r
388                 neg     ax\r
389                 mul     rect_cols\r
390                 shl     ax, 1\r
391                 jmp     test_left\r
392 over_sr2:       mov     dh, al\r
393                 xor     dl, dl\r
394                 shr     dx, 1\r
395                 shr     dx, 1\r
396                 shl     ax, 1\r
397                 shl     ax, 1\r
398                 add     si, dx                  ; top onscrn, update bkgd ptr\r
399                 sub     si, ax\r
400 \r
401 test_below:     mov     ax, 160\r
402                 sub     ax, rect_y              ; all below scrn ?\r
403                 jg      over_sr3                ; - no\r
404                 jmp     rect_offscrn            ; - yes\r
405 over_sr3:       cmp     ax, rect_rows           ; part below scrn ?\r
406                 jge     test_left               ; - no\r
407                 mov     bled_rect_rows, ax      ; - yes\r
408 test_left:      mov     ax, rect_x\r
409                 cmp     ax, 0                   ; all or part left of scrn ?\r
410                 jge     over_sr5                ; - no\r
411                 add     bled_rect_cols, ax      ; - yes\r
412                 jg      over_sr4                ; all left of scrn ?\r
413                 jmp     rect_offscrn            ; - yes\r
414 over_sr4:       mov     bled_rect_x, 0          ; - no, bled rect at scrn left\r
415                 shl     ax, 1\r
416                 jmp     ptrs_bled\r
417 over_sr5:       add     si, ax                  ; left onscrn, update bkgd ptr\r
418 test_right:     mov     ax, 60\r
419                 sub     ax, rect_x              ; all right of scrn ?\r
420                 jg      over_sr6                ; - no\r
421                 jmp     rect_offscrn            ; - yes\r
422 over_sr6:       cmp     ax, rect_cols           ; part right of scrn ?\r
423                 jge     ptrs_bled               ; - no\r
424                 mov     bled_rect_cols, ax              ; - yes\r
425 ptrs_bled:      mov     rect_bkgd_ptr, si       ; store, for undrawing\r
426                 mov     ax, 60                  ; eval cols before wrap\r
427                 sub     ax, window_left\r
428                 sub     ax, bled_rect_x\r
429                 jge     over_sr7\r
430                 xor     ax, ax\r
431 over_sr7:       cmp     ax, bled_rect_cols\r
432                 jle     over_sr8\r
433                 mov     ax, bled_rect_cols\r
434 over_sr8:       mov     cbw_rect, ax\r
435                 neg     ax                      ; eval cols atfer wrap\r
436                 add     ax, bled_rect_cols\r
437                 mov     caw_rect, ax\r
438                 mov     ax, 159                 ; eval rows before wrap\r
439                 sub     ax, window_top\r
440                 sub     ax, bled_rect_y\r
441                 jge     over_sr9\r
442                 xor     ax, ax\r
443 over_sr9:       cmp     ax, bled_rect_rows\r
444                 jl      over_sr10\r
445                 mov     ax, bled_rect_rows\r
446                 mov     cbw_rect, 0             ; if whole rect is one main\r
447                 mov     caw_rect, 0             ; part then no wrap-line\r
448 over_sr10:      mov     rbw_rect, ax\r
449                 mov     ax, window_top          ; eval rows after wrap\r
450                 add     ax, bled_rect_y\r
451                 add     ax, bled_rect_rows\r
452                 sub     ax, 160\r
453                 jge     over_sr11\r
454                 xor     ax, ax\r
455 over_sr11:      cmp     ax, bled_rect_rows\r
456                 jl      over_sr12\r
457                 mov     ax, bled_rect_rows\r
458                 mov     cbw_rect, 0             ; if whole rect is one main\r
459                 mov     caw_rect, 0             ; part then no wrap-line\r
460 over_sr12:      mov     raw_rect, ax\r
461                 ret\r
462 \r
463 rect_offscrn:\r
464                 mov     ax,seg dseg\r
465                 mov     ds,ax\r
466                 xor     ax, ax\r
467                 mov     bled_rect_rows, 0\r
468                 mov     rbw_rect, ax\r
469                 mov     raw_rect, ax\r
470                 mov     cbw_rect, ax\r
471                 mov     caw_rect, ax\r
472                 ret\r
473 \r
474 cseg            ends\r
475 \r
476 dseg            segment public 'data'\r
477 public          rect_x, rect_y, rect_cols, rect_rows\r
478 extrn           window_topleft:word, window_top:word, window_left:word\r
479 extrn           sixteencol:byte\r
480 extrn           dum_ptr:dword,dummy_scrn:word\r
481 \r
482 rect_x          dw      ?\r
483 rect_y          dw      ?\r
484 rect_cols       dw      0\r
485 rect_rows       dw      74\r
486 \r
487 bled_rect_x     dw      ?\r
488 bled_rect_y     dw      ?\r
489 bled_rect_cols  dw      ?\r
490 bled_rect_rows  dw      ?\r
491 cbw_rect        dw      ?\r
492 caw_rect        dw      ?\r
493 rbw_rect        dw      ?\r
494 raw_rect        dw      ?\r
495 rect_bkgd_ptr   dw      ?\r
496 \r
497 res_mem         rect_save_area,4096,2048\r
498 \r
499 dseg            ends\r
500 \r
501 end\r
502 \1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a