1 .386P
2 .model FLAT
3;
4; surf8.s
5; x86 assembly-language 8 bpp surface block drawing code.
6;
7
8include qasm.inc
9
10if	id386
11
12_DATA SEGMENT
13
14sb_v dd 0
15
16_DATA ENDS
17_TEXT SEGMENT
18
19 align 4
20 public _R_Surf8Start
21_R_Surf8Start:
22
23;----------------------------------------------------------------------
24; Surface block drawer for mip level 0
25;----------------------------------------------------------------------
26
27 align 4
28 public _R_DrawSurfaceBlock8_mip0
29_R_DrawSurfaceBlock8_mip0:
30 push ebp	; preserve caller's stack frame
31 push edi
32 push esi	; preserve register variables
33 push ebx
34
35;		for (v=0 ; v<numvblocks ; v++)
36;		{
37 mov ebx,ds:dword ptr[_r_lightptr]
38 mov eax,ds:dword ptr[_r_numvblocks]
39
40 mov ds:dword ptr[sb_v],eax
41 mov edi,ds:dword ptr[_prowdestbase]
42
43 mov esi,ds:dword ptr[_pbasesource]
44
45Lv_loop_mip0:
46
47;			lightleft = lightptr[0];
48;			lightright = lightptr[1];
49;			lightdelta = (lightleft - lightright) & 0xFFFFF;
50 mov eax,ds:dword ptr[ebx]	; lightleft
51 mov edx,ds:dword ptr[4+ebx]	; lightright
52
53 mov ebp,eax
54 mov ecx,ds:dword ptr[_r_lightwidth]
55
56 mov ds:dword ptr[_lightright],edx
57 sub ebp,edx
58
59 and ebp,0FFFFFh
60 lea ebx,ds:dword ptr[ebx+ecx*4]
61
62;			lightptr += lightwidth;
63 mov ds:dword ptr[_r_lightptr],ebx
64
65;			lightleftstep = (lightptr[0] - lightleft) >> blockdivshift;
66;			lightrightstep = (lightptr[1] - lightright) >> blockdivshift;
67;			lightdeltastep = ((lightleftstep - lightrightstep) & 0xFFFFF) |
68;					0xF0000000;
69 mov ecx,ds:dword ptr[4+ebx]	; lightptr[1]
70 mov ebx,ds:dword ptr[ebx]	; lightptr[0]
71
72 sub ebx,eax
73 sub ecx,edx
74
75 sar ecx,4
76 or ebp,0F0000000h
77
78 sar ebx,4
79 mov ds:dword ptr[_lightrightstep],ecx
80
81 sub ebx,ecx
82 and ebx,0FFFFFh
83
84 or ebx,0F0000000h
85 sub ecx,ecx	; high word must be 0 in loop for addressing
86
87 mov ds:dword ptr[_lightdeltastep],ebx
88 sub ebx,ebx	; high word must be 0 in loop for addressing
89
90Lblockloop8_mip0:
91 mov ds:dword ptr[_lightdelta],ebp
92 mov cl,ds:byte ptr[14+esi]
93
94 sar ebp,4
95 mov bh,dh
96
97 mov bl,ds:byte ptr[15+esi]
98 add edx,ebp
99
100 mov ch,dh
101 add edx,ebp
102
103 mov ah,ds:byte ptr[12345678h+ebx]
104LBPatch0:
105 mov bl,ds:byte ptr[13+esi]
106
107 mov al,ds:byte ptr[12345678h+ecx]
108LBPatch1:
109 mov cl,ds:byte ptr[12+esi]
110
111 mov bh,dh
112 add edx,ebp
113
114 ror eax,16
115 mov ch,dh
116
117 add edx,ebp
118 mov ah,ds:byte ptr[12345678h+ebx]
119LBPatch2:
120
121 mov bl,ds:byte ptr[11+esi]
122 mov al,ds:byte ptr[12345678h+ecx]
123LBPatch3:
124
125 mov cl,ds:byte ptr[10+esi]
126 mov ds:dword ptr[12+edi],eax
127
128 mov bh,dh
129 add edx,ebp
130
131 mov ch,dh
132 add edx,ebp
133
134 mov ah,ds:byte ptr[12345678h+ebx]
135LBPatch4:
136 mov bl,ds:byte ptr[9+esi]
137
138 mov al,ds:byte ptr[12345678h+ecx]
139LBPatch5:
140 mov cl,ds:byte ptr[8+esi]
141
142 mov bh,dh
143 add edx,ebp
144
145 ror eax,16
146 mov ch,dh
147
148 add edx,ebp
149 mov ah,ds:byte ptr[12345678h+ebx]
150LBPatch6:
151
152 mov bl,ds:byte ptr[7+esi]
153 mov al,ds:byte ptr[12345678h+ecx]
154LBPatch7:
155
156 mov cl,ds:byte ptr[6+esi]
157 mov ds:dword ptr[8+edi],eax
158
159 mov bh,dh
160 add edx,ebp
161
162 mov ch,dh
163 add edx,ebp
164
165 mov ah,ds:byte ptr[12345678h+ebx]
166LBPatch8:
167 mov bl,ds:byte ptr[5+esi]
168
169 mov al,ds:byte ptr[12345678h+ecx]
170LBPatch9:
171 mov cl,ds:byte ptr[4+esi]
172
173 mov bh,dh
174 add edx,ebp
175
176 ror eax,16
177 mov ch,dh
178
179 add edx,ebp
180 mov ah,ds:byte ptr[12345678h+ebx]
181LBPatch10:
182
183 mov bl,ds:byte ptr[3+esi]
184 mov al,ds:byte ptr[12345678h+ecx]
185LBPatch11:
186
187 mov cl,ds:byte ptr[2+esi]
188 mov ds:dword ptr[4+edi],eax
189
190 mov bh,dh
191 add edx,ebp
192
193 mov ch,dh
194 add edx,ebp
195
196 mov ah,ds:byte ptr[12345678h+ebx]
197LBPatch12:
198 mov bl,ds:byte ptr[1+esi]
199
200 mov al,ds:byte ptr[12345678h+ecx]
201LBPatch13:
202 mov cl,ds:byte ptr[esi]
203
204 mov bh,dh
205 add edx,ebp
206
207 ror eax,16
208 mov ch,dh
209
210 mov ah,ds:byte ptr[12345678h+ebx]
211LBPatch14:
212 mov edx,ds:dword ptr[_lightright]
213
214 mov al,ds:byte ptr[12345678h+ecx]
215LBPatch15:
216 mov ebp,ds:dword ptr[_lightdelta]
217
218 mov ds:dword ptr[edi],eax
219
220 add esi,ds:dword ptr[_sourcetstep]
221 add edi,ds:dword ptr[_surfrowbytes]
222
223 add edx,ds:dword ptr[_lightrightstep]
224 add ebp,ds:dword ptr[_lightdeltastep]
225
226 mov ds:dword ptr[_lightright],edx
227 jc Lblockloop8_mip0
228
229;			if (pbasesource >= r_sourcemax)
230;				pbasesource -= stepback;
231
232 cmp esi,ds:dword ptr[_r_sourcemax]
233 jb LSkip_mip0
234 sub esi,ds:dword ptr[_r_stepback]
235LSkip_mip0:
236
237 mov ebx,ds:dword ptr[_r_lightptr]
238 dec ds:dword ptr[sb_v]
239
240 jnz Lv_loop_mip0
241
242 pop ebx	; restore register variables
243 pop esi
244 pop edi
245 pop ebp	; restore the caller's stack frame
246 ret
247
248
249;----------------------------------------------------------------------
250; Surface block drawer for mip level 1
251;----------------------------------------------------------------------
252
253 align 4
254 public _R_DrawSurfaceBlock8_mip1
255_R_DrawSurfaceBlock8_mip1:
256 push ebp	; preserve caller's stack frame
257 push edi
258 push esi	; preserve register variables
259 push ebx
260
261;		for (v=0 ; v<numvblocks ; v++)
262;		{
263 mov ebx,ds:dword ptr[_r_lightptr]
264 mov eax,ds:dword ptr[_r_numvblocks]
265
266 mov ds:dword ptr[sb_v],eax
267 mov edi,ds:dword ptr[_prowdestbase]
268
269 mov esi,ds:dword ptr[_pbasesource]
270
271Lv_loop_mip1:
272
273;			lightleft = lightptr[0];
274;			lightright = lightptr[1];
275;			lightdelta = (lightleft - lightright) & 0xFFFFF;
276 mov eax,ds:dword ptr[ebx]	; lightleft
277 mov edx,ds:dword ptr[4+ebx]	; lightright
278
279 mov ebp,eax
280 mov ecx,ds:dword ptr[_r_lightwidth]
281
282 mov ds:dword ptr[_lightright],edx
283 sub ebp,edx
284
285 and ebp,0FFFFFh
286 lea ebx,ds:dword ptr[ebx+ecx*4]
287
288;			lightptr += lightwidth;
289 mov ds:dword ptr[_r_lightptr],ebx
290
291;			lightleftstep = (lightptr[0] - lightleft) >> blockdivshift;
292;			lightrightstep = (lightptr[1] - lightright) >> blockdivshift;
293;			lightdeltastep = ((lightleftstep - lightrightstep) & 0xFFFFF) |
294;					0xF0000000;
295 mov ecx,ds:dword ptr[4+ebx]	; lightptr[1]
296 mov ebx,ds:dword ptr[ebx]	; lightptr[0]
297
298 sub ebx,eax
299 sub ecx,edx
300
301 sar ecx,3
302 or ebp,070000000h
303
304 sar ebx,3
305 mov ds:dword ptr[_lightrightstep],ecx
306
307 sub ebx,ecx
308 and ebx,0FFFFFh
309
310 or ebx,0F0000000h
311 sub ecx,ecx	; high word must be 0 in loop for addressing
312
313 mov ds:dword ptr[_lightdeltastep],ebx
314 sub ebx,ebx	; high word must be 0 in loop for addressing
315
316Lblockloop8_mip1:
317 mov ds:dword ptr[_lightdelta],ebp
318 mov cl,ds:byte ptr[6+esi]
319
320 sar ebp,3
321 mov bh,dh
322
323 mov bl,ds:byte ptr[7+esi]
324 add edx,ebp
325
326 mov ch,dh
327 add edx,ebp
328
329 mov ah,ds:byte ptr[12345678h+ebx]
330LBPatch22:
331 mov bl,ds:byte ptr[5+esi]
332
333 mov al,ds:byte ptr[12345678h+ecx]
334LBPatch23:
335 mov cl,ds:byte ptr[4+esi]
336
337 mov bh,dh
338 add edx,ebp
339
340 ror eax,16
341 mov ch,dh
342
343 add edx,ebp
344 mov ah,ds:byte ptr[12345678h+ebx]
345LBPatch24:
346
347 mov bl,ds:byte ptr[3+esi]
348 mov al,ds:byte ptr[12345678h+ecx]
349LBPatch25:
350
351 mov cl,ds:byte ptr[2+esi]
352 mov ds:dword ptr[4+edi],eax
353
354 mov bh,dh
355 add edx,ebp
356
357 mov ch,dh
358 add edx,ebp
359
360 mov ah,ds:byte ptr[12345678h+ebx]
361LBPatch26:
362 mov bl,ds:byte ptr[1+esi]
363
364 mov al,ds:byte ptr[12345678h+ecx]
365LBPatch27:
366 mov cl,ds:byte ptr[esi]
367
368 mov bh,dh
369 add edx,ebp
370
371 ror eax,16
372 mov ch,dh
373
374 mov ah,ds:byte ptr[12345678h+ebx]
375LBPatch28:
376 mov edx,ds:dword ptr[_lightright]
377
378 mov al,ds:byte ptr[12345678h+ecx]
379LBPatch29:
380 mov ebp,ds:dword ptr[_lightdelta]
381
382 mov ds:dword ptr[edi],eax
383 mov eax,ds:dword ptr[_sourcetstep]
384
385 add esi,eax
386 mov eax,ds:dword ptr[_surfrowbytes]
387
388 add edi,eax
389 mov eax,ds:dword ptr[_lightrightstep]
390
391 add edx,eax
392 mov eax,ds:dword ptr[_lightdeltastep]
393
394 add ebp,eax
395 mov ds:dword ptr[_lightright],edx
396
397 jc Lblockloop8_mip1
398
399;			if (pbasesource >= r_sourcemax)
400;				pbasesource -= stepback;
401
402 cmp esi,ds:dword ptr[_r_sourcemax]
403 jb LSkip_mip1
404 sub esi,ds:dword ptr[_r_stepback]
405LSkip_mip1:
406
407 mov ebx,ds:dword ptr[_r_lightptr]
408 dec ds:dword ptr[sb_v]
409
410 jnz Lv_loop_mip1
411
412 pop ebx	; restore register variables
413 pop esi
414 pop edi
415 pop ebp	; restore the caller's stack frame
416 ret
417
418
419;----------------------------------------------------------------------
420; Surface block drawer for mip level 2
421;----------------------------------------------------------------------
422
423 align 4
424 public _R_DrawSurfaceBlock8_mip2
425_R_DrawSurfaceBlock8_mip2:
426 push ebp	; preserve caller's stack frame
427 push edi
428 push esi	; preserve register variables
429 push ebx
430
431;		for (v=0 ; v<numvblocks ; v++)
432;		{
433 mov ebx,ds:dword ptr[_r_lightptr]
434 mov eax,ds:dword ptr[_r_numvblocks]
435
436 mov ds:dword ptr[sb_v],eax
437 mov edi,ds:dword ptr[_prowdestbase]
438
439 mov esi,ds:dword ptr[_pbasesource]
440
441Lv_loop_mip2:
442
443;			lightleft = lightptr[0];
444;			lightright = lightptr[1];
445;			lightdelta = (lightleft - lightright) & 0xFFFFF;
446 mov eax,ds:dword ptr[ebx]	; lightleft
447 mov edx,ds:dword ptr[4+ebx]	; lightright
448
449 mov ebp,eax
450 mov ecx,ds:dword ptr[_r_lightwidth]
451
452 mov ds:dword ptr[_lightright],edx
453 sub ebp,edx
454
455 and ebp,0FFFFFh
456 lea ebx,ds:dword ptr[ebx+ecx*4]
457
458;			lightptr += lightwidth;
459 mov ds:dword ptr[_r_lightptr],ebx
460
461;			lightleftstep = (lightptr[0] - lightleft) >> blockdivshift;
462;			lightrightstep = (lightptr[1] - lightright) >> blockdivshift;
463;			lightdeltastep = ((lightleftstep - lightrightstep) & 0xFFFFF) |
464;					0xF0000000;
465 mov ecx,ds:dword ptr[4+ebx]	; lightptr[1]
466 mov ebx,ds:dword ptr[ebx]	; lightptr[0]
467
468 sub ebx,eax
469 sub ecx,edx
470
471 sar ecx,2
472 or ebp,030000000h
473
474 sar ebx,2
475 mov ds:dword ptr[_lightrightstep],ecx
476
477 sub ebx,ecx
478
479 and ebx,0FFFFFh
480
481 or ebx,0F0000000h
482 sub ecx,ecx	; high word must be 0 in loop for addressing
483
484 mov ds:dword ptr[_lightdeltastep],ebx
485 sub ebx,ebx	; high word must be 0 in loop for addressing
486
487Lblockloop8_mip2:
488 mov ds:dword ptr[_lightdelta],ebp
489 mov cl,ds:byte ptr[2+esi]
490
491 sar ebp,2
492 mov bh,dh
493
494 mov bl,ds:byte ptr[3+esi]
495 add edx,ebp
496
497 mov ch,dh
498 add edx,ebp
499
500 mov ah,ds:byte ptr[12345678h+ebx]
501LBPatch18:
502 mov bl,ds:byte ptr[1+esi]
503
504 mov al,ds:byte ptr[12345678h+ecx]
505LBPatch19:
506 mov cl,ds:byte ptr[esi]
507
508 mov bh,dh
509 add edx,ebp
510
511 ror eax,16
512 mov ch,dh
513
514 mov ah,ds:byte ptr[12345678h+ebx]
515LBPatch20:
516 mov edx,ds:dword ptr[_lightright]
517
518 mov al,ds:byte ptr[12345678h+ecx]
519LBPatch21:
520 mov ebp,ds:dword ptr[_lightdelta]
521
522 mov ds:dword ptr[edi],eax
523 mov eax,ds:dword ptr[_sourcetstep]
524
525 add esi,eax
526 mov eax,ds:dword ptr[_surfrowbytes]
527
528 add edi,eax
529 mov eax,ds:dword ptr[_lightrightstep]
530
531 add edx,eax
532 mov eax,ds:dword ptr[_lightdeltastep]
533
534 add ebp,eax
535 mov ds:dword ptr[_lightright],edx
536
537 jc Lblockloop8_mip2
538
539;			if (pbasesource >= r_sourcemax)
540;				pbasesource -= stepback;
541
542 cmp esi,ds:dword ptr[_r_sourcemax]
543 jb LSkip_mip2
544 sub esi,ds:dword ptr[_r_stepback]
545LSkip_mip2:
546
547 mov ebx,ds:dword ptr[_r_lightptr]
548 dec ds:dword ptr[sb_v]
549
550 jnz Lv_loop_mip2
551
552 pop ebx	; restore register variables
553 pop esi
554 pop edi
555 pop ebp	; restore the caller's stack frame
556 ret
557
558
559;----------------------------------------------------------------------
560; Surface block drawer for mip level 3
561;----------------------------------------------------------------------
562
563 align 4
564 public _R_DrawSurfaceBlock8_mip3
565_R_DrawSurfaceBlock8_mip3:
566 push ebp	; preserve caller's stack frame
567 push edi
568 push esi	; preserve register variables
569 push ebx
570
571;		for (v=0 ; v<numvblocks ; v++)
572;		{
573 mov ebx,ds:dword ptr[_r_lightptr]
574 mov eax,ds:dword ptr[_r_numvblocks]
575
576 mov ds:dword ptr[sb_v],eax
577 mov edi,ds:dword ptr[_prowdestbase]
578
579 mov esi,ds:dword ptr[_pbasesource]
580
581Lv_loop_mip3:
582
583;			lightleft = lightptr[0];
584;			lightright = lightptr[1];
585;			lightdelta = (lightleft - lightright) & 0xFFFFF;
586 mov eax,ds:dword ptr[ebx]	; lightleft
587 mov edx,ds:dword ptr[4+ebx]	; lightright
588
589 mov ebp,eax
590 mov ecx,ds:dword ptr[_r_lightwidth]
591
592 mov ds:dword ptr[_lightright],edx
593 sub ebp,edx
594
595 and ebp,0FFFFFh
596 lea ebx,ds:dword ptr[ebx+ecx*4]
597
598 mov ds:dword ptr[_lightdelta],ebp
599;			lightptr += lightwidth;
600 mov ds:dword ptr[_r_lightptr],ebx
601
602;			lightleftstep = (lightptr[0] - lightleft) >> blockdivshift;
603;			lightrightstep = (lightptr[1] - lightright) >> blockdivshift;
604;			lightdeltastep = ((lightleftstep - lightrightstep) & 0xFFFFF) |
605;					0xF0000000;
606 mov ecx,ds:dword ptr[4+ebx]	; lightptr[1]
607 mov ebx,ds:dword ptr[ebx]	; lightptr[0]
608
609 sub ebx,eax
610 sub ecx,edx
611
612 sar ecx,1
613
614 sar ebx,1
615 mov ds:dword ptr[_lightrightstep],ecx
616
617 sub ebx,ecx
618 and ebx,0FFFFFh
619
620 sar ebp,1
621 or ebx,0F0000000h
622
623 mov ds:dword ptr[_lightdeltastep],ebx
624 sub ebx,ebx	; high word must be 0 in loop for addressing
625
626 mov bl,ds:byte ptr[1+esi]
627 sub ecx,ecx	; high word must be 0 in loop for addressing
628
629 mov bh,dh
630 mov cl,ds:byte ptr[esi]
631
632 add edx,ebp
633 mov ch,dh
634
635 mov al,ds:byte ptr[12345678h+ebx]
636LBPatch16:
637 mov edx,ds:dword ptr[_lightright]
638
639 mov ds:byte ptr[1+edi],al
640 mov al,ds:byte ptr[12345678h+ecx]
641LBPatch17:
642
643 mov ds:byte ptr[edi],al
644 mov eax,ds:dword ptr[_sourcetstep]
645
646 add esi,eax
647 mov eax,ds:dword ptr[_surfrowbytes]
648
649 add edi,eax
650 mov eax,ds:dword ptr[_lightdeltastep]
651
652 mov ebp,ds:dword ptr[_lightdelta]
653 mov cl,ds:byte ptr[esi]
654
655 add ebp,eax
656 mov eax,ds:dword ptr[_lightrightstep]
657
658 sar ebp,1
659 add edx,eax
660
661 mov bh,dh
662 mov bl,ds:byte ptr[1+esi]
663
664 add edx,ebp
665 mov ch,dh
666
667 mov al,ds:byte ptr[12345678h+ebx]
668LBPatch30:
669 mov edx,ds:dword ptr[_sourcetstep]
670
671 mov ds:byte ptr[1+edi],al
672 mov al,ds:byte ptr[12345678h+ecx]
673LBPatch31:
674
675 mov ds:byte ptr[edi],al
676 mov ebp,ds:dword ptr[_surfrowbytes]
677
678 add esi,edx
679 add edi,ebp
680
681;			if (pbasesource >= r_sourcemax)
682;				pbasesource -= stepback;
683
684 cmp esi,ds:dword ptr[_r_sourcemax]
685 jb LSkip_mip3
686 sub esi,ds:dword ptr[_r_stepback]
687LSkip_mip3:
688
689 mov ebx,ds:dword ptr[_r_lightptr]
690 dec ds:dword ptr[sb_v]
691
692 jnz Lv_loop_mip3
693
694 pop ebx	; restore register variables
695 pop esi
696 pop edi
697 pop ebp	; restore the caller's stack frame
698 ret
699
700
701 public _R_Surf8End
702_R_Surf8End:
703
704;----------------------------------------------------------------------
705; Code patching routines
706;----------------------------------------------------------------------
707_TEXT ENDS
708_DATA SEGMENT
709
710 align 4
711LPatchTable8:
712 dd LBPatch0-4
713 dd LBPatch1-4
714 dd LBPatch2-4
715 dd LBPatch3-4
716 dd LBPatch4-4
717 dd LBPatch5-4
718 dd LBPatch6-4
719 dd LBPatch7-4
720 dd LBPatch8-4
721 dd LBPatch9-4
722 dd LBPatch10-4
723 dd LBPatch11-4
724 dd LBPatch12-4
725 dd LBPatch13-4
726 dd LBPatch14-4
727 dd LBPatch15-4
728 dd LBPatch16-4
729 dd LBPatch17-4
730 dd LBPatch18-4
731 dd LBPatch19-4
732 dd LBPatch20-4
733 dd LBPatch21-4
734 dd LBPatch22-4
735 dd LBPatch23-4
736 dd LBPatch24-4
737 dd LBPatch25-4
738 dd LBPatch26-4
739 dd LBPatch27-4
740 dd LBPatch28-4
741 dd LBPatch29-4
742 dd LBPatch30-4
743 dd LBPatch31-4
744
745_DATA ENDS
746_TEXT SEGMENT
747
748 align 4
749 public _R_Surf8Patch
750_R_Surf8Patch:
751 push ebx
752
753 mov eax,ds:dword ptr[_d_pcolormap]
754 mov ebx,offset LPatchTable8
755 mov ecx,32
756LPatchLoop8:
757 mov edx,ds:dword ptr[ebx]
758 add ebx,4
759 mov ds:dword ptr[edx],eax
760 dec ecx
761 jnz LPatchLoop8
762
763 pop ebx
764
765 ret
766
767_TEXT ENDS
768endif	;id386
769
770 END
771
772