📄 id_vl.c
字号:
*/
void VL_TestPaletteSet (void)
{
int i;
for (i=0;i<768;i++)
palette1[0][i] = i;
fastpalette = true;
VL_SetPalette (&palette1[0][0]);
VL_GetPalette (&palette2[0][0]);
if (_fmemcmp (&palette1[0][0],&palette2[0][0],768))
fastpalette = false;
}
/*
==================
=
= VL_ColorBorder
=
==================
*/
void VL_ColorBorder (int color)
{
_AH=0x10;
_AL=1;
_BH=color;
geninterrupt (0x10);
bordercolor = color;
}
/*
=============================================================================
PIXEL OPS
=============================================================================
*/
byte pixmasks[4] = {1,2,4,8};
byte leftmasks[4] = {15,14,12,8};
byte rightmasks[4] = {1,3,7,15};
/*
=================
=
= VL_Plot
=
=================
*/
void VL_Plot (int x, int y, int color)
{
byte mask;
mask = pixmasks[x&3];
VGAMAPMASK(mask);
*(byte far *)MK_FP(SCREENSEG,bufferofs+(ylookup[y]+(x>>2))) = color;
VGAMAPMASK(15);
}
/*
=================
=
= VL_Hlin
=
=================
*/
void VL_Hlin (unsigned x, unsigned y, unsigned width, unsigned color)
{
unsigned xbyte;
byte far *dest;
byte leftmask,rightmask;
int midbytes;
xbyte = x>>2;
leftmask = leftmasks[x&3];
rightmask = rightmasks[(x+width-1)&3];
midbytes = ((x+width+3)>>2) - xbyte - 2;
dest = MK_FP(SCREENSEG,bufferofs+ylookup[y]+xbyte);
if (midbytes<0)
{
// all in one byte
VGAMAPMASK(leftmask&rightmask);
*dest = color;
VGAMAPMASK(15);
return;
}
VGAMAPMASK(leftmask);
*dest++ = color;
VGAMAPMASK(15);
_fmemset (dest,color,midbytes);
dest+=midbytes;
VGAMAPMASK(rightmask);
*dest = color;
VGAMAPMASK(15);
}
/*
=================
=
= VL_Vlin
=
=================
*/
void VL_Vlin (int x, int y, int height, int color)
{
byte far *dest,mask;
mask = pixmasks[x&3];
VGAMAPMASK(mask);
dest = MK_FP(SCREENSEG,bufferofs+ylookup[y]+(x>>2));
while (height--)
{
*dest = color;
dest += linewidth;
}
VGAMAPMASK(15);
}
/*
=================
=
= VL_Bar
=
=================
*/
void VL_Bar (int x, int y, int width, int height, int color)
{
byte far *dest;
byte leftmask,rightmask;
int midbytes,linedelta;
leftmask = leftmasks[x&3];
rightmask = rightmasks[(x+width-1)&3];
midbytes = ((x+width+3)>>2) - (x>>2) - 2;
linedelta = linewidth-(midbytes+1);
dest = MK_FP(SCREENSEG,bufferofs+ylookup[y]+(x>>2));
if (midbytes<0)
{
// all in one byte
VGAMAPMASK(leftmask&rightmask);
while (height--)
{
*dest = color;
dest += linewidth;
}
VGAMAPMASK(15);
return;
}
while (height--)
{
VGAMAPMASK(leftmask);
*dest++ = color;
VGAMAPMASK(15);
_fmemset (dest,color,midbytes);
dest+=midbytes;
VGAMAPMASK(rightmask);
*dest = color;
dest+=linedelta;
}
VGAMAPMASK(15);
}
/*
============================================================================
MEMORY OPS
============================================================================
*/
/*
=================
=
= VL_MemToLatch
=
=================
*/
void VL_MemToLatch (byte far *source, int width, int height, unsigned dest)
{
unsigned count;
byte plane,mask;
count = ((width+3)/4)*height;
mask = 1;
for (plane = 0; plane<4 ; plane++)
{
VGAMAPMASK(mask);
mask <<= 1;
asm mov cx,count
asm mov ax,SCREENSEG
asm mov es,ax
asm mov di,[dest]
asm lds si,[source]
asm rep movsb
asm mov ax,ss
asm mov ds,ax
source+= count;
}
}
//===========================================================================
/*
=================
=
= VL_MemToScreen
=
= Draws a block of data to the screen.
=
=================
*/
void VL_MemToScreen (byte far *source, int width, int height, int x, int y)
{
byte far *screen,far *dest,mask;
int plane;
width>>=2;
dest = MK_FP(SCREENSEG,bufferofs+ylookup[y]+(x>>2) );
mask = 1 << (x&3);
for (plane = 0; plane<4; plane++)
{
VGAMAPMASK(mask);
mask <<= 1;
if (mask == 16)
mask = 1;
screen = dest;
for (y=0;y<height;y++,screen+=linewidth,source+=width)
_fmemcpy (screen,source,width);
}
}
//==========================================================================
/*
=================
=
= VL_MaskedToScreen
=
= Masks a block of main memory to the screen.
=
=================
*/
void VL_MaskedToScreen (byte far *source, int width, int height, int x, int y)
{
byte far *screen,far *dest,mask;
byte far *maskptr;
int plane;
width>>=2;
dest = MK_FP(SCREENSEG,bufferofs+ylookup[y]+(x>>2) );
// mask = 1 << (x&3);
// maskptr = source;
for (plane = 0; plane<4; plane++)
{
VGAMAPMASK(mask);
mask <<= 1;
if (mask == 16)
mask = 1;
screen = dest;
for (y=0;y<height;y++,screen+=linewidth,source+=width)
_fmemcpy (screen,source,width);
}
}
//==========================================================================
/*
=================
=
= VL_LatchToScreen
=
=================
*/
void VL_LatchToScreen (unsigned source, int width, int height, int x, int y)
{
VGAWRITEMODE(1);
VGAMAPMASK(15);
asm mov di,[y] // dest = bufferofs+ylookup[y]+(x>>2)
asm shl di,1
asm mov di,[WORD PTR ylookup+di]
asm add di,[bufferofs]
asm mov ax,[x]
asm shr ax,2
asm add di,ax
asm mov si,[source]
asm mov ax,[width]
asm mov bx,[linewidth]
asm sub bx,ax
asm mov dx,[height]
asm mov cx,SCREENSEG
asm mov ds,cx
asm mov es,cx
drawline:
asm mov cx,ax
asm rep movsb
asm add di,bx
asm dec dx
asm jnz drawline
asm mov ax,ss
asm mov ds,ax
VGAWRITEMODE(0);
}
//===========================================================================
#if 0
/*
=================
=
= VL_ScreenToScreen
=
=================
*/
void VL_ScreenToScreen (unsigned source, unsigned dest,int width, int height)
{
VGAWRITEMODE(1);
VGAMAPMASK(15);
asm mov si,[source]
asm mov di,[dest]
asm mov ax,[width]
asm mov bx,[linewidth]
asm sub bx,ax
asm mov dx,[height]
asm mov cx,SCREENSEG
asm mov ds,cx
asm mov es,cx
drawline:
asm mov cx,ax
asm rep movsb
asm add si,bx
asm add di,bx
asm dec dx
asm jnz drawline
asm mov ax,ss
asm mov ds,ax
VGAWRITEMODE(0);
}
#endif
/*
=============================================================================
STRING OUTPUT ROUTINES
=============================================================================
*/
/*
===================
=
= VL_DrawTile8String
=
===================
*/
void VL_DrawTile8String (char *str, char far *tile8ptr, int printx, int printy)
{
int i;
unsigned far *dest,far *screen,far *src;
dest = MK_FP(SCREENSEG,bufferofs+ylookup[printy]+(printx>>2));
while (*str)
{
src = (unsigned far *)(tile8ptr + (*str<<6));
// each character is 64 bytes
VGAMAPMASK(1);
screen = dest;
for (i=0;i<8;i++,screen+=linewidth)
*screen = *src++;
VGAMAPMASK(2);
screen = dest;
for (i=0;i<8;i++,screen+=linewidth)
*screen = *src++;
VGAMAPMASK(4);
screen = dest;
for (i=0;i<8;i++,screen+=linewidth)
*screen = *src++;
VGAMAPMASK(8);
screen = dest;
for (i=0;i<8;i++,screen+=linewidth)
*screen = *src++;
str++;
printx += 8;
dest+=2;
}
}
/*
===================
=
= VL_DrawLatch8String
=
===================
*/
void VL_DrawLatch8String (char *str, unsigned tile8ptr, int printx, int printy)
{
int i;
unsigned src,dest;
dest = bufferofs+ylookup[printy]+(printx>>2);
VGAWRITEMODE(1);
VGAMAPMASK(15);
while (*str)
{
src = tile8ptr + (*str<<4); // each character is 16 latch bytes
asm mov si,[src]
asm mov di,[dest]
asm mov dx,[linewidth]
asm mov ax,SCREENSEG
asm mov ds,ax
asm lodsw
asm mov [di],ax
asm add di,dx
asm lodsw
asm mov [di],ax
asm add di,dx
asm lodsw
asm mov [di],ax
asm add di,dx
asm lodsw
asm mov [di],ax
asm add di,dx
asm lodsw
asm mov [di],ax
asm add di,dx
asm lodsw
asm mov [di],ax
asm add di,dx
asm lodsw
asm mov [di],ax
asm add di,dx
asm lodsw
asm mov [di],ax
asm add di,dx
asm mov ax,ss
asm mov ds,ax
str++;
printx += 8;
dest+=2;
}
VGAWRITEMODE(0);
}
/*
===================
=
= VL_SizeTile8String
=
===================
*/
void VL_SizeTile8String (char *str, int *width, int *height)
{
*height = 8;
*width = 8*strlen(str);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -