home *** CD-ROM | disk | FTP | other *** search
/ 100 af Verdens Bedste Spil / 100Spil.iso / dos / wolf3d / source / wolfsrc.1 / ID_VL.C < prev    next >
C/C++ Source or Header  |  1993-02-04  |  18KB  |  1,085 lines

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