]> 4ch.mooo.com Git - 16.git/blob - 16/wf3d8086/id_vl.c
reference to the bbocg
[16.git] / 16 / wf3d8086 / id_vl.c
1 // ID_VL.C\r
2 \r
3 #include <dos.h>\r
4 #include <alloc.h>\r
5 #include <mem.h>\r
6 #include <string.h>\r
7 #include "ID_HEAD.H"\r
8 #include "ID_VL.H"\r
9 #pragma hdrstop\r
10 \r
11 //\r
12 // SC_INDEX is expected to stay at SC_MAPMASK for proper operation\r
13 //\r
14 \r
15 unsigned        bufferofs;\r
16 unsigned        displayofs,pelpan;\r
17 \r
18 unsigned        screenseg=SCREENSEG;            // set to 0xa000 for asm convenience\r
19 \r
20 unsigned        linewidth;\r
21 unsigned        ylookup[MAXSCANLINES];\r
22 \r
23 boolean         screenfaded;\r
24 unsigned        bordercolor;\r
25 \r
26 boolean         fastpalette;                            // if true, use outsb to set\r
27 \r
28 byte            far     palette1[256][3],far palette2[256][3];\r
29 \r
30 //===========================================================================\r
31 \r
32 // asm\r
33 \r
34 int      VL_VideoID (void);\r
35 void VL_SetCRTC (int crtc);\r
36 void VL_SetScreen (int crtc, int pelpan);\r
37 void VL_WaitVBL (int vbls);\r
38 \r
39 //===========================================================================\r
40 \r
41 \r
42 /*\r
43 =======================\r
44 =\r
45 = VL_Startup\r
46 =\r
47 =======================\r
48 */\r
49 \r
50 #if 0\r
51 void    VL_Startup (void)\r
52 {\r
53         if ( !MS_CheckParm ("HIDDENCARD") && VL_VideoID () != 5)\r
54                 MS_Quit ("You need a VGA graphics card to run this!");\r
55 \r
56         asm     cld;                            // all string instructions assume forward\r
57 }\r
58 \r
59 #endif\r
60 \r
61 /*\r
62 =======================\r
63 =\r
64 = VL_Startup    // WOLFENSTEIN HACK\r
65 =\r
66 =======================\r
67 */\r
68 \r
69 static  char *ParmStrings[] = {"HIDDENCARD",""};\r
70 \r
71 void    VL_Startup (void)\r
72 {\r
73         int i,videocard;\r
74 \r
75         asm     cld;\r
76 \r
77         videocard = VL_VideoID ();\r
78         for (i = 1;i < _argc;i++)\r
79                 if (US_CheckParm(_argv[i],ParmStrings) == 0)\r
80                 {\r
81                         videocard = 5;\r
82                         break;\r
83                 }\r
84 \r
85         if (videocard != 5)\r
86 Quit ("Improper video card!  If you really have a VGA card that I am not \n"\r
87           "detecting, use the -HIDDENCARD command line parameter!");\r
88 \r
89 }\r
90 \r
91 \r
92 \r
93 /*\r
94 =======================\r
95 =\r
96 = VL_Shutdown\r
97 =\r
98 =======================\r
99 */\r
100 \r
101 void    VL_Shutdown (void)\r
102 {\r
103         VL_SetTextMode ();\r
104 }\r
105 \r
106 \r
107 /*\r
108 =======================\r
109 =\r
110 = VL_SetVGAPlaneMode\r
111 =\r
112 =======================\r
113 */\r
114 \r
115 void    VL_SetVGAPlaneMode (void)\r
116 {\r
117 asm     mov     ax,0x13\r
118 asm     int     0x10\r
119         VL_DePlaneVGA ();\r
120         VGAMAPMASK(15);\r
121         VL_SetLineWidth (40);\r
122 }\r
123 \r
124 \r
125 /*\r
126 =======================\r
127 =\r
128 = VL_SetTextMode\r
129 =\r
130 =======================\r
131 */\r
132 \r
133 void    VL_SetTextMode (void)\r
134 {\r
135 asm     mov     ax,3\r
136 asm     int     0x10\r
137 }\r
138 \r
139 //===========================================================================\r
140 \r
141 /*\r
142 =================\r
143 =\r
144 = VL_ClearVideo\r
145 =\r
146 = Fill the entire video buffer with a given color\r
147 =\r
148 =================\r
149 */\r
150 \r
151 void VL_ClearVideo (byte color)\r
152 {\r
153 asm     mov     dx,GC_INDEX\r
154 asm     mov     al,GC_MODE\r
155 asm     out     dx,al\r
156 asm     inc     dx\r
157 asm     in      al,dx\r
158 asm     and     al,0xfc                         // write mode 0 to store directly to video\r
159 asm     out     dx,al\r
160 \r
161 asm     mov     dx,SC_INDEX\r
162 asm     mov     ax,SC_MAPMASK+15*256\r
163 asm     out     dx,ax                           // write through all four planes\r
164 \r
165 asm     mov     ax,SCREENSEG\r
166 asm     mov     es,ax\r
167 asm     mov     al,[color]\r
168 asm     mov     ah,al\r
169 asm     mov     cx,0x8000                       // 0x8000 words, clearing 8 video bytes/word\r
170 asm     xor     di,di\r
171 asm     rep     stosw\r
172 }\r
173 \r
174 \r
175 /*\r
176 =============================================================================\r
177 \r
178                         VGA REGISTER MANAGEMENT ROUTINES\r
179 \r
180 =============================================================================\r
181 */\r
182 \r
183 \r
184 /*\r
185 =================\r
186 =\r
187 = VL_DePlaneVGA\r
188 =\r
189 =================\r
190 */\r
191 \r
192 void VL_DePlaneVGA (void)\r
193 {\r
194 \r
195 //\r
196 // change CPU addressing to non linear mode\r
197 //\r
198 \r
199 //\r
200 // turn off chain 4 and odd/even\r
201 //\r
202         outportb (SC_INDEX,SC_MEMMODE);\r
203         outportb (SC_INDEX+1,(inportb(SC_INDEX+1)&~8)|4);\r
204 \r
205         outportb (SC_INDEX,SC_MAPMASK);         // leave this set throughought\r
206 \r
207 //\r
208 // turn off odd/even and set write mode 0\r
209 //\r
210         outportb (GC_INDEX,GC_MODE);\r
211         outportb (GC_INDEX+1,inportb(GC_INDEX+1)&~0x13);\r
212 \r
213 //\r
214 // turn off chain\r
215 //\r
216         outportb (GC_INDEX,GC_MISCELLANEOUS);\r
217         outportb (GC_INDEX+1,inportb(GC_INDEX+1)&~2);\r
218 \r
219 //\r
220 // clear the entire buffer space, because int 10h only did 16 k / plane\r
221 //\r
222         VL_ClearVideo (0);\r
223 \r
224 //\r
225 // change CRTC scanning from doubleword to byte mode, allowing >64k scans\r
226 //\r
227         outportb (CRTC_INDEX,CRTC_UNDERLINE);\r
228         outportb (CRTC_INDEX+1,inportb(CRTC_INDEX+1)&~0x40);\r
229 \r
230         outportb (CRTC_INDEX,CRTC_MODE);\r
231         outportb (CRTC_INDEX+1,inportb(CRTC_INDEX+1)|0x40);\r
232 }\r
233 \r
234 //===========================================================================\r
235 \r
236 /*\r
237 ====================\r
238 =\r
239 = VL_SetLineWidth\r
240 =\r
241 = Line witdh is in WORDS, 40 words is normal width for vgaplanegr\r
242 =\r
243 ====================\r
244 */\r
245 \r
246 void VL_SetLineWidth (unsigned width)\r
247 {\r
248         int i,offset;\r
249 \r
250 //\r
251 // set wide virtual screen\r
252 //\r
253         outport (CRTC_INDEX,CRTC_OFFSET+width*256);\r
254 \r
255 //\r
256 // set up lookup tables\r
257 //\r
258         linewidth = width*2;\r
259 \r
260         offset = 0;\r
261 \r
262         for (i=0;i<MAXSCANLINES;i++)\r
263         {\r
264                 ylookup[i]=offset;\r
265                 offset += linewidth;\r
266         }\r
267 }\r
268 \r
269 /*\r
270 ====================\r
271 =\r
272 = VL_SetSplitScreen\r
273 =\r
274 ====================\r
275 */\r
276 \r
277 void VL_SetSplitScreen (int linenum)\r
278 {\r
279         VL_WaitVBL (1);\r
280         linenum=linenum*2-1;\r
281         outportb (CRTC_INDEX,CRTC_LINECOMPARE);\r
282         outportb (CRTC_INDEX+1,linenum % 256);\r
283         outportb (CRTC_INDEX,CRTC_OVERFLOW);\r
284         outportb (CRTC_INDEX+1, 1+16*(linenum/256));\r
285         outportb (CRTC_INDEX,CRTC_MAXSCANLINE);\r
286         outportb (CRTC_INDEX+1,inportb(CRTC_INDEX+1) & (255-64));\r
287 }\r
288 \r
289 \r
290 /*\r
291 =============================================================================\r
292 \r
293                                                 PALETTE OPS\r
294 \r
295                 To avoid snow, do a WaitVBL BEFORE calling these\r
296 \r
297 =============================================================================\r
298 */\r
299 \r
300 \r
301 /*\r
302 =================\r
303 =\r
304 = VL_FillPalette\r
305 =\r
306 =================\r
307 */\r
308 \r
309 void VL_FillPalette (int red, int green, int blue)\r
310 {\r
311         int     i;\r
312 \r
313         outportb (PEL_WRITE_ADR,0);\r
314         for (i=0;i<256;i++)\r
315         {\r
316                 outportb (PEL_DATA,red);\r
317                 outportb (PEL_DATA,green);\r
318                 outportb (PEL_DATA,blue);\r
319         }\r
320 }\r
321 \r
322 //===========================================================================\r
323 \r
324 /*\r
325 =================\r
326 =\r
327 = VL_SetColor\r
328 =\r
329 =================\r
330 */\r
331 \r
332 void VL_SetColor        (int color, int red, int green, int blue)\r
333 {\r
334         outportb (PEL_WRITE_ADR,color);\r
335         outportb (PEL_DATA,red);\r
336         outportb (PEL_DATA,green);\r
337         outportb (PEL_DATA,blue);\r
338 }\r
339 \r
340 //===========================================================================\r
341 \r
342 /*\r
343 =================\r
344 =\r
345 = VL_GetColor\r
346 =\r
347 =================\r
348 */\r
349 \r
350 void VL_GetColor        (int color, int *red, int *green, int *blue)\r
351 {\r
352         outportb (PEL_READ_ADR,color);\r
353         *red = inportb (PEL_DATA);\r
354         *green = inportb (PEL_DATA);\r
355         *blue = inportb (PEL_DATA);\r
356 }\r
357 \r
358 //===========================================================================\r
359 \r
360 /*\r
361 =================\r
362 =\r
363 = VL_SetPalette\r
364 =\r
365 = If fast palette setting has been tested for, it is used\r
366 = (some cards don't like outsb palette setting)\r
367 =\r
368 =================\r
369 */\r
370 \r
371 void VL_SetPalette (byte far *palette)\r
372 {\r
373         int     i;\r
374 \r
375 //      outportb (PEL_WRITE_ADR,0);\r
376 //      for (i=0;i<768;i++)\r
377 //              outportb(PEL_DATA,*palette++);\r
378 \r
379         asm     mov     dx,PEL_WRITE_ADR\r
380         asm     mov     al,0\r
381         asm     out     dx,al\r
382         asm     mov     dx,PEL_DATA\r
383         asm     lds     si,[palette]\r
384 \r
385         asm     test    [ss:fastpalette],1\r
386         //asm   jz      slowset\r
387 //\r
388 // set palette fast for cards that can take it\r
389 //\r
390         //asm   mov     cx,768\r
391         //asm   rep outsb\r
392         //asm   jmp     done\r
393 \r
394 //\r
395 // set palette slowly for some video cards\r
396 //\r
397 slowset:\r
398         asm     mov     cx,256\r
399 setloop:\r
400         asm     lodsb\r
401         asm     out     dx,al\r
402         asm     lodsb\r
403         asm     out     dx,al\r
404         asm     lodsb\r
405         asm     out     dx,al\r
406         asm     loop    setloop\r
407 \r
408 done:\r
409         asm     mov     ax,ss\r
410         asm     mov     ds,ax\r
411 \r
412 }\r
413 \r
414 \r
415 //===========================================================================\r
416 \r
417 /*\r
418 =================\r
419 =\r
420 = VL_GetPalette\r
421 =\r
422 = This does not use the port string instructions,\r
423 = due to some incompatabilities\r
424 =\r
425 =================\r
426 */\r
427 \r
428 void VL_GetPalette (byte far *palette)\r
429 {\r
430         int     i;\r
431 \r
432         outportb (PEL_READ_ADR,0);\r
433         for (i=0;i<768;i++)\r
434                 *palette++ = inportb(PEL_DATA);\r
435 }\r
436 \r
437 \r
438 //===========================================================================\r
439 \r
440 /*\r
441 =================\r
442 =\r
443 = VL_FadeOut\r
444 =\r
445 = Fades the current palette to the given color in the given number of steps\r
446 =\r
447 =================\r
448 */\r
449 \r
450 void VL_FadeOut (int start, int end, int red, int green, int blue, int steps)\r
451 {\r
452         int             i,j,orig,delta;\r
453         byte    far *origptr, far *newptr;\r
454 \r
455         VL_WaitVBL(1);\r
456         VL_GetPalette (&palette1[0][0]);\r
457         _fmemcpy (palette2,palette1,768);\r
458 \r
459 //\r
460 // fade through intermediate frames\r
461 //\r
462         for (i=0;i<steps;i++)\r
463         {\r
464                 origptr = &palette1[start][0];\r
465                 newptr = &palette2[start][0];\r
466                 for (j=start;j<=end;j++)\r
467                 {\r
468                         orig = *origptr++;\r
469                         delta = red-orig;\r
470                         *newptr++ = orig + delta * i / steps;\r
471                         orig = *origptr++;\r
472                         delta = green-orig;\r
473                         *newptr++ = orig + delta * i / steps;\r
474                         orig = *origptr++;\r
475                         delta = blue-orig;\r
476                         *newptr++ = orig + delta * i / steps;\r
477                 }\r
478 \r
479                 VL_WaitVBL(1);\r
480                 VL_SetPalette (&palette2[0][0]);\r
481         }\r
482 \r
483 //\r
484 // final color\r
485 //\r
486         VL_FillPalette (red,green,blue);\r
487 \r
488         screenfaded = true;\r
489 }\r
490 \r
491 \r
492 /*\r
493 =================\r
494 =\r
495 = VL_FadeIn\r
496 =\r
497 =================\r
498 */\r
499 \r
500 void VL_FadeIn (int start, int end, byte far *palette, int steps)\r
501 {\r
502         int             i,j,delta;\r
503 \r
504         VL_WaitVBL(1);\r
505         VL_GetPalette (&palette1[0][0]);\r
506         _fmemcpy (&palette2[0][0],&palette1[0][0],sizeof(palette1));\r
507 \r
508         start *= 3;\r
509         end = end*3+2;\r
510 \r
511 //\r
512 // fade through intermediate frames\r
513 //\r
514         for (i=0;i<steps;i++)\r
515         {\r
516                 for (j=start;j<=end;j++)\r
517                 {\r
518                         delta = palette[j]-palette1[0][j];\r
519                         palette2[0][j] = palette1[0][j] + delta * i / steps;\r
520                 }\r
521 \r
522                 VL_WaitVBL(1);\r
523                 VL_SetPalette (&palette2[0][0]);\r
524         }\r
525 \r
526 //\r
527 // final color\r
528 //\r
529         VL_SetPalette (palette);\r
530         screenfaded = false;\r
531 }\r
532 \r
533 \r
534 \r
535 /*\r
536 =================\r
537 =\r
538 = VL_TestPaletteSet\r
539 =\r
540 = Sets the palette with outsb, then reads it in and compares\r
541 = If it compares ok, fastpalette is set to true.\r
542 =\r
543 =================\r
544 */\r
545 \r
546 void VL_TestPaletteSet (void)\r
547 {\r
548         int     i;\r
549 \r
550         for (i=0;i<768;i++)\r
551                 palette1[0][i] = i;\r
552 \r
553         fastpalette = true;\r
554         VL_SetPalette (&palette1[0][0]);\r
555         VL_GetPalette (&palette2[0][0]);\r
556         if (_fmemcmp (&palette1[0][0],&palette2[0][0],768))\r
557                 fastpalette = false;\r
558 }\r
559 \r
560 \r
561 /*\r
562 ==================\r
563 =\r
564 = VL_ColorBorder\r
565 =\r
566 ==================\r
567 */\r
568 \r
569 void VL_ColorBorder (int color)\r
570 {\r
571         _AH=0x10;\r
572         _AL=1;\r
573         _BH=color;\r
574         geninterrupt (0x10);\r
575         bordercolor = color;\r
576 }\r
577 \r
578 \r
579 \r
580 /*\r
581 =============================================================================\r
582 \r
583                                                         PIXEL OPS\r
584 \r
585 =============================================================================\r
586 */\r
587 \r
588 byte    pixmasks[4] = {1,2,4,8};\r
589 byte    leftmasks[4] = {15,14,12,8};\r
590 byte    rightmasks[4] = {1,3,7,15};\r
591 \r
592 \r
593 /*\r
594 =================\r
595 =\r
596 = VL_Plot\r
597 =\r
598 =================\r
599 */\r
600 \r
601 void VL_Plot (int x, int y, int color)\r
602 {\r
603         byte mask;\r
604 \r
605         mask = pixmasks[x&3];\r
606         VGAMAPMASK(mask);\r
607         *(byte far *)MK_FP(SCREENSEG,bufferofs+(ylookup[y]+(x>>2))) = color;\r
608         VGAMAPMASK(15);\r
609 }\r
610 \r
611 \r
612 /*\r
613 =================\r
614 =\r
615 = VL_Hlin\r
616 =\r
617 =================\r
618 */\r
619 \r
620 void VL_Hlin (unsigned x, unsigned y, unsigned width, unsigned color)\r
621 {\r
622         unsigned                xbyte;\r
623         byte                    far *dest;\r
624         byte                    leftmask,rightmask;\r
625         int                             midbytes;\r
626 \r
627         xbyte = x>>2;\r
628         leftmask = leftmasks[x&3];\r
629         rightmask = rightmasks[(x+width-1)&3];\r
630         midbytes = ((x+width+3)>>2) - xbyte - 2;\r
631 \r
632         dest = MK_FP(SCREENSEG,bufferofs+ylookup[y]+xbyte);\r
633 \r
634         if (midbytes<0)\r
635         {\r
636         // all in one byte\r
637                 VGAMAPMASK(leftmask&rightmask);\r
638                 *dest = color;\r
639                 VGAMAPMASK(15);\r
640                 return;\r
641         }\r
642 \r
643         VGAMAPMASK(leftmask);\r
644         *dest++ = color;\r
645 \r
646         VGAMAPMASK(15);\r
647         _fmemset (dest,color,midbytes);\r
648         dest+=midbytes;\r
649 \r
650         VGAMAPMASK(rightmask);\r
651         *dest = color;\r
652 \r
653         VGAMAPMASK(15);\r
654 }\r
655 \r
656 \r
657 /*\r
658 =================\r
659 =\r
660 = VL_Vlin\r
661 =\r
662 =================\r
663 */\r
664 \r
665 void VL_Vlin (int x, int y, int height, int color)\r
666 {\r
667         byte    far *dest,mask;\r
668 \r
669         mask = pixmasks[x&3];\r
670         VGAMAPMASK(mask);\r
671 \r
672         dest = MK_FP(SCREENSEG,bufferofs+ylookup[y]+(x>>2));\r
673 \r
674         while (height--)\r
675         {\r
676                 *dest = color;\r
677                 dest += linewidth;\r
678         }\r
679 \r
680         VGAMAPMASK(15);\r
681 }\r
682 \r
683 \r
684 /*\r
685 =================\r
686 =\r
687 = VL_Bar\r
688 =\r
689 =================\r
690 */\r
691 \r
692 void VL_Bar (int x, int y, int width, int height, int color)\r
693 {\r
694         byte    far *dest;\r
695         byte    leftmask,rightmask;\r
696         int             midbytes,linedelta;\r
697 \r
698         leftmask = leftmasks[x&3];\r
699         rightmask = rightmasks[(x+width-1)&3];\r
700         midbytes = ((x+width+3)>>2) - (x>>2) - 2;\r
701         linedelta = linewidth-(midbytes+1);\r
702 \r
703         dest = MK_FP(SCREENSEG,bufferofs+ylookup[y]+(x>>2));\r
704 \r
705         if (midbytes<0)\r
706         {\r
707         // all in one byte\r
708                 VGAMAPMASK(leftmask&rightmask);\r
709                 while (height--)\r
710                 {\r
711                         *dest = color;\r
712                         dest += linewidth;\r
713                 }\r
714                 VGAMAPMASK(15);\r
715                 return;\r
716         }\r
717 \r
718         while (height--)\r
719         {\r
720                 VGAMAPMASK(leftmask);\r
721                 *dest++ = color;\r
722 \r
723                 VGAMAPMASK(15);\r
724                 _fmemset (dest,color,midbytes);\r
725                 dest+=midbytes;\r
726 \r
727                 VGAMAPMASK(rightmask);\r
728                 *dest = color;\r
729 \r
730                 dest+=linedelta;\r
731         }\r
732 \r
733         VGAMAPMASK(15);\r
734 }\r
735 \r
736 /*\r
737 ============================================================================\r
738 \r
739                                                         MEMORY OPS\r
740 \r
741 ============================================================================\r
742 */\r
743 \r
744 /*\r
745 =================\r
746 =\r
747 = VL_MemToLatch\r
748 =\r
749 =================\r
750 */\r
751 \r
752 void VL_MemToLatch (byte far *source, int width, int height, unsigned dest)\r
753 {\r
754         unsigned        count;\r
755         byte    plane,mask;\r
756 \r
757         count = ((width+3)/4)*height;\r
758         mask = 1;\r
759         for (plane = 0; plane<4 ; plane++)\r
760         {\r
761                 VGAMAPMASK(mask);\r
762                 mask <<= 1;\r
763 \r
764 asm     mov     cx,count\r
765 asm mov ax,SCREENSEG\r
766 asm mov es,ax\r
767 asm     mov     di,[dest]\r
768 asm     lds     si,[source]\r
769 asm     rep movsb\r
770 asm mov ax,ss\r
771 asm     mov     ds,ax\r
772 \r
773                 source+= count;\r
774         }\r
775 }\r
776 \r
777 \r
778 //===========================================================================\r
779 \r
780 \r
781 /*\r
782 =================\r
783 =\r
784 = VL_MemToScreen\r
785 =\r
786 = Draws a block of data to the screen.\r
787 =\r
788 =================\r
789 */\r
790 \r
791 void VL_MemToScreen (byte far *source, int width, int height, int x, int y)\r
792 {\r
793         byte    far *screen,far *dest,mask;\r
794         int             plane;\r
795 \r
796         width>>=2;\r
797         dest = MK_FP(SCREENSEG,bufferofs+ylookup[y]+(x>>2) );\r
798         mask = 1 << (x&3);\r
799 \r
800         for (plane = 0; plane<4; plane++)\r
801         {\r
802                 VGAMAPMASK(mask);\r
803                 mask <<= 1;\r
804                 if (mask == 16)\r
805                         mask = 1;\r
806 \r
807                 screen = dest;\r
808                 for (y=0;y<height;y++,screen+=linewidth,source+=width)\r
809                         _fmemcpy (screen,source,width);\r
810         }\r
811 }\r
812 \r
813 //==========================================================================\r
814 \r
815 \r
816 /*\r
817 =================\r
818 =\r
819 = VL_MaskedToScreen\r
820 =\r
821 = Masks a block of main memory to the screen.\r
822 =\r
823 =================\r
824 */\r
825 \r
826 void VL_MaskedToScreen (byte far *source, int width, int height, int x, int y)\r
827 {\r
828         byte    far *screen,far *dest,mask;\r
829         byte    far *maskptr;\r
830         int             plane;\r
831 \r
832         width>>=2;\r
833         dest = MK_FP(SCREENSEG,bufferofs+ylookup[y]+(x>>2) );\r
834 //      mask = 1 << (x&3);\r
835 \r
836 //      maskptr = source;\r
837 \r
838         for (plane = 0; plane<4; plane++)\r
839         {\r
840                 VGAMAPMASK(mask);\r
841                 mask <<= 1;\r
842                 if (mask == 16)\r
843                         mask = 1;\r
844 \r
845                 screen = dest;\r
846                 for (y=0;y<height;y++,screen+=linewidth,source+=width)\r
847                         _fmemcpy (screen,source,width);\r
848         }\r
849 }\r
850 \r
851 //==========================================================================\r
852 \r
853 /*\r
854 =================\r
855 =\r
856 = VL_LatchToScreen\r
857 =\r
858 =================\r
859 */\r
860 \r
861 void VL_LatchToScreen (unsigned source, int width, int height, int x, int y)\r
862 {\r
863         VGAWRITEMODE(1);\r
864         VGAMAPMASK(15);\r
865 \r
866 asm     mov     di,[y]                          // dest = bufferofs+ylookup[y]+(x>>2)\r
867 asm     shl     di,1\r
868 asm     mov     di,[WORD PTR ylookup+di]\r
869 asm     add     di,[bufferofs]\r
870 asm     mov     ax,[x]\r
871 asm     shr     ax,1\r
872 asm     shr     ax,1\r
873 asm     add     di,ax\r
874 \r
875 asm     mov     si,[source]\r
876 asm     mov     ax,[width]\r
877 asm     mov     bx,[linewidth]\r
878 asm     sub     bx,ax\r
879 asm     mov     dx,[height]\r
880 asm     mov     cx,SCREENSEG\r
881 asm     mov     ds,cx\r
882 asm     mov     es,cx\r
883 \r
884 drawline:\r
885 asm     mov     cx,ax\r
886 asm     rep movsb\r
887 asm     add     di,bx\r
888 asm     dec     dx\r
889 asm     jnz     drawline\r
890 \r
891 asm     mov     ax,ss\r
892 asm     mov     ds,ax\r
893 \r
894         VGAWRITEMODE(0);\r
895 }\r
896 \r
897 \r
898 //===========================================================================\r
899 \r
900 #if 0\r
901 \r
902 /*\r
903 =================\r
904 =\r
905 = VL_ScreenToScreen\r
906 =\r
907 =================\r
908 */\r
909 \r
910 void VL_ScreenToScreen (unsigned source, unsigned dest,int width, int height)\r
911 {\r
912         VGAWRITEMODE(1);\r
913         VGAMAPMASK(15);\r
914 \r
915 asm     mov     si,[source]\r
916 asm     mov     di,[dest]\r
917 asm     mov     ax,[width]\r
918 asm     mov     bx,[linewidth]\r
919 asm     sub     bx,ax\r
920 asm     mov     dx,[height]\r
921 asm     mov     cx,SCREENSEG\r
922 asm     mov     ds,cx\r
923 asm     mov     es,cx\r
924 \r
925 drawline:\r
926 asm     mov     cx,ax\r
927 asm     rep movsb\r
928 asm     add     si,bx\r
929 asm     add     di,bx\r
930 asm     dec     dx\r
931 asm     jnz     drawline\r
932 \r
933 asm     mov     ax,ss\r
934 asm     mov     ds,ax\r
935 \r
936         VGAWRITEMODE(0);\r
937 }\r
938 \r
939 \r
940 #endif\r
941 \r
942 /*\r
943 =============================================================================\r
944 \r
945                                                 STRING OUTPUT ROUTINES\r
946 \r
947 =============================================================================\r
948 */\r
949 \r
950 \r
951 \r
952 \r
953 /*\r
954 ===================\r
955 =\r
956 = VL_DrawTile8String\r
957 =\r
958 ===================\r
959 */\r
960 \r
961 void VL_DrawTile8String (char *str, char far *tile8ptr, int printx, int printy)\r
962 {\r
963         int             i;\r
964         unsigned        far *dest,far *screen,far *src;\r
965 \r
966         dest = MK_FP(SCREENSEG,bufferofs+ylookup[printy]+(printx>>2));\r
967 \r
968         while (*str)\r
969         {\r
970                 src = (unsigned far *)(tile8ptr + (*str<<6));\r
971                 // each character is 64 bytes\r
972 \r
973                 VGAMAPMASK(1);\r
974                 screen = dest;\r
975                 for (i=0;i<8;i++,screen+=linewidth)\r
976                         *screen = *src++;\r
977                 VGAMAPMASK(2);\r
978                 screen = dest;\r
979                 for (i=0;i<8;i++,screen+=linewidth)\r
980                         *screen = *src++;\r
981                 VGAMAPMASK(4);\r
982                 screen = dest;\r
983                 for (i=0;i<8;i++,screen+=linewidth)\r
984                         *screen = *src++;\r
985                 VGAMAPMASK(8);\r
986                 screen = dest;\r
987                 for (i=0;i<8;i++,screen+=linewidth)\r
988                         *screen = *src++;\r
989 \r
990                 str++;\r
991                 printx += 8;\r
992                 dest+=2;\r
993         }\r
994 }\r
995 \r
996 \r
997 \r
998 /*\r
999 ===================\r
1000 =\r
1001 = VL_DrawLatch8String\r
1002 =\r
1003 ===================\r
1004 */\r
1005 \r
1006 void VL_DrawLatch8String (char *str, unsigned tile8ptr, int printx, int printy)\r
1007 {\r
1008         int             i;\r
1009         unsigned        src,dest;\r
1010 \r
1011         dest = bufferofs+ylookup[printy]+(printx>>2);\r
1012 \r
1013         VGAWRITEMODE(1);\r
1014         VGAMAPMASK(15);\r
1015 \r
1016         while (*str)\r
1017         {\r
1018                 src = tile8ptr + (*str<<4);             // each character is 16 latch bytes\r
1019 \r
1020 asm     mov     si,[src]\r
1021 asm     mov     di,[dest]\r
1022 asm     mov     dx,[linewidth]\r
1023 \r
1024 asm     mov     ax,SCREENSEG\r
1025 asm     mov     ds,ax\r
1026 \r
1027 asm     lodsw\r
1028 asm     mov     [di],ax\r
1029 asm     add     di,dx\r
1030 asm     lodsw\r
1031 asm     mov     [di],ax\r
1032 asm     add     di,dx\r
1033 asm     lodsw\r
1034 asm     mov     [di],ax\r
1035 asm     add     di,dx\r
1036 asm     lodsw\r
1037 asm     mov     [di],ax\r
1038 asm     add     di,dx\r
1039 asm     lodsw\r
1040 asm     mov     [di],ax\r
1041 asm     add     di,dx\r
1042 asm     lodsw\r
1043 asm     mov     [di],ax\r
1044 asm     add     di,dx\r
1045 asm     lodsw\r
1046 asm     mov     [di],ax\r
1047 asm     add     di,dx\r
1048 asm     lodsw\r
1049 asm     mov     [di],ax\r
1050 asm     add     di,dx\r
1051 \r
1052 asm     mov     ax,ss\r
1053 asm     mov     ds,ax\r
1054 \r
1055                 str++;\r
1056                 printx += 8;\r
1057                 dest+=2;\r
1058         }\r
1059 \r
1060         VGAWRITEMODE(0);\r
1061 }\r
1062 \r
1063 \r
1064 /*\r
1065 ===================\r
1066 =\r
1067 = VL_SizeTile8String\r
1068 =\r
1069 ===================\r
1070 */\r
1071 \r
1072 void VL_SizeTile8String (char *str, int *width, int *height)\r
1073 {\r
1074         *height = 8;\r
1075         *width = 8*strlen(str);\r
1076 }\r
1077 \r
1078 \r
1079 \r
1080 \r
1081 \r
1082 \r
1083 \r
1084 \r
1085 \r