ref: ddcaa37baf64e0fc44f8ebf051005a0b0a1fd29b
dir: /vl.c/
u16int bufferofs; u16int displayofs,pelpan; #define SC_INDEX 0x3C4 #define SC_RESET 0 #define SC_CLOCK 1 #define SC_MAPMASK 2 #define SC_CHARMAP 3 #define SC_MEMMODE 4 #define CRTC_INDEX 0x3D4 #define CRTC_H_TOTAL 0 #define CRTC_H_DISPEND 1 #define CRTC_H_BLANK 2 #define CRTC_H_ENDBLANK 3 #define CRTC_H_RETRACE 4 #define CRTC_H_ENDRETRACE 5 #define CRTC_V_TOTAL 6 #define CRTC_OVERFLOW 7 #define CRTC_ROWSCAN 8 #define CRTC_MAXSCANLINE 9 #define CRTC_CURSORSTART 10 #define CRTC_CURSOREND 11 #define CRTC_STARTHIGH 12 #define CRTC_STARTLOW 13 #define CRTC_CURSORHIGH 14 #define CRTC_CURSORLOW 15 #define CRTC_V_RETRACE 16 #define CRTC_V_ENDRETRACE 17 #define CRTC_V_DISPEND 18 #define CRTC_OFFSET 19 #define CRTC_UNDERLINE 20 #define CRTC_V_BLANK 21 #define CRTC_V_ENDBLANK 22 #define CRTC_MODE 23 #define CRTC_LINECOMPARE 24 #define GC_INDEX 0x3CE #define GC_SETRESET 0 #define GC_ENABLESETRESET 1 #define GC_COLORCOMPARE 2 #define GC_DATAROTATE 3 #define GC_READMAP 4 #define GC_MODE 5 #define GC_MISCELLANEOUS 6 #define GC_COLORDONTCARE 7 #define GC_BITMASK 8 #define ATR_INDEX 0x3c0 #define ATR_MODE 16 #define ATR_OVERSCAN 17 #define ATR_COLORPLANEENABLE 18 #define ATR_PELPAN 19 #define ATR_COLORSELECT 20 #define STATUS_REGISTER_1 0x3da #define PEL_WRITE_ADR 0x3c8 #define PEL_READ_ADR 0x3c7 #define PEL_DATA 0x3c9 #define SCREENSEG 0xa000 #define SCREENWIDTH 80 // default screen width in bytes #define MAXSCANLINES 200 // size of ylookup table #define TILEWIDTH 4 extern u16int bufferofs; // all drawing is reletive to this extern u16int displayofs,pelpan; // last setscreen coordinates extern u16int screenseg; // set to 0xa000 for asm convenience extern u16int linewidth; extern u16int ylookup[MAXSCANLINES]; extern int screenfaded; extern u16int bordercolor; #define VGAWRITEMODE(x) asm{\ cli;\ mov dx,GC_INDEX;\ mov al,GC_MODE;\ out dx,al;\ inc dx;\ in al,dx;\ and al,252;\ or al,x;\ out dx,al;\ sti;} #define VGAMAPMASK(x) asm{cli;mov dx,SC_INDEX;mov al,SC_MAPMASK;mov ah,x;out dx,ax;sti;} #define VGAREADMAP(x) asm{cli;mov dx,GC_INDEX;mov al,GC_READMAP;mov ah,x;out dx,ax;sti;} u16int screenseg=SCREENSEG; // set to 0xa000 for asm convenience u16int linewidth; u16int ylookup[MAXSCANLINES]; int screenfaded; u16int bordercolor; int fastpalette; // if true, use outsb to set u8int pixmasks[4] = {1,2,4,8}; u8int leftmasks[4] = {15,14,12,8}; u8int rightmasks[4] = {1,3,7,15}; void VL_Plot (s16int x, s16int y, s16int color) { u8int mask; mask = pixmasks[x&3]; VGAMAPMASK(mask); *(u8int far *)MK_FP(SCREENSEG,bufferofs+(ylookup[y]+(x>>2))) = color; VGAMAPMASK(15); } void VL_Vlin (s16int x, s16int y, s16int height, s16int color) { u8int 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); } void VL_MemToLatch (u8int far *source, s16int width, s16int height, u16int dest) { u16int count; u8int 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; } } void VL_MemToScreen (u8int far *source, s16int width, s16int height, s16int x, s16int y) { u8int far *screen,far *dest,mask; s16int 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); } } void VL_MaskedToScreen (u8int far *source, s16int width, s16int height, s16int x, s16int y) { u8int far *screen,far *dest,mask; u8int far *maskptr; s16int 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); } } void VL_LatchToScreen (u16int source, s16int width, s16int height, s16int x, s16int 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); }