123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343 |
- {
- System independent low-level video interface for go32v2
- $Id$
- }
- {$ASMMODE ATT}
- uses
- mouse,
- go32;
- var
- OldVideoBuf : PVideoBuf;
- { used to know if LastCursorType is valid }
- const
- InitVideoCalled : boolean = false;
- LastCursorType : word = crUnderline;
- { allways set blink state again }
- procedure SetHighBitBlink;
- var
- regs : trealregs;
- begin
- regs.ax:=$1003;
- regs.bx:=$0001;
- realintr($10,regs);
- end;
- procedure InitVideo;
- var
- regs : trealregs;
- begin
- VideoSeg:=$b800;
- if (ScreenWidth=$ffff) or (ScreenHeight=$ffff) or
- (ScreenWidth=0) or (ScreenHeight=0) then
- begin
- ScreenColor:=true;
- regs.ah:=$0f;
- realintr($10,regs);
- if (regs.al and 1)=0 then
- ScreenColor:=false;
- if regs.al=7 then
- begin
- ScreenColor:=false;
- VideoSeg:=$b000;
- end
- else
- VideoSeg:=$b800;
- ScreenWidth:=regs.ah;
- regs.ax:=$1130;
- regs.bx:=0;
- realintr($10,regs);
- ScreenHeight:=regs.dl+1;
- end;
- regs.ah:=$03;
- regs.bh:=0;
- realintr($10,regs);
- CursorLines:=regs.cl;
- CursorX:=regs.dl;
- CursorY:=regs.dh;
- If InitVideoCalled then
- Begin
- FreeMem(VideoBuf,VideoBufSize);
- FreeMem(OldVideoBuf,VideoBufSize);
- End;
- { allocate pmode memory buffer }
- VideoBufSize:=ScreenWidth*ScreenHeight*2;
- GetMem(VideoBuf,VideoBufSize);
- GetMem(OldVideoBuf,VideoBufSize);
- InitVideoCalled:=true;
- SetHighBitBlink;
- SetCursorType(LastCursorType);
- { ClearScreen; removed here
- to be able to catch the content of the monitor }
- end;
- procedure DoneVideo;
- begin
- If InitVideoCalled then
- Begin
- LastCursorType:=GetCursorType;
- ClearScreen;
- SetCursorType(crUnderLine);
- SetCursorPos(0,0);
- FreeMem(VideoBuf,VideoBufSize);
- VideoBuf:=nil;
- FreeMem(OldVideoBuf,VideoBufSize);
- OldVideoBuf:=nil;
- InitVideoCalled:=false;
- VideoBufSize:=0;
- End;
- end;
- function GetCapabilities: Word;
- begin
- GetCapabilities := $3F;
- end;
- procedure SetCursorPos(NewCursorX, NewCursorY: Word);
- var
- regs : trealregs;
- begin
- regs.ah:=$02;
- regs.bh:=0;
- regs.dh:=NewCursorY;
- regs.dl:=NewCursorX;
- realintr($10,regs);
- CursorY:=regs.dh;
- CursorX:=regs.dl;
- end;
- { I don't know the maximum value for the scan line
- probably 7 or 15 depending on resolution !!
- }
- function GetCursorType: Word;
- var
- regs : trealregs;
- begin
- regs.ah:=$03;
- regs.bh:=0;
- realintr($10,regs);
- GetCursorType:=crHidden;
- if (regs.ch and $60)=0 then
- begin
- GetCursorType:=crBlock;
- if (regs.ch and $1f)<>0 then
- begin
- GetCursorType:=crHalfBlock;
- if regs.cl+1=(regs.ch and $1F) then
- GetCursorType:=crUnderline;
- end;
- end;
- end;
- procedure SetCursorType(NewType: Word);
- var
- regs : trealregs;
- const
- MaxCursorLines = 7;
- begin
- regs.ah:=$01;
- regs.bx:=NewType;
- case NewType of
- crHidden : regs.cx:=$2000;
- crHalfBlock : begin
- regs.ch:=MaxCursorLines shr 1;
- regs.cl:=MaxCursorLines;
- end;
- crBlock : begin
- regs.ch:=0;
- regs.cl:=MaxCursorLines;
- end;
- else begin
- regs.ch:=MaxCursorLines-1;
- regs.cl:=MaxCursorLines;
- end;
- end;
- realintr($10,regs);
- end;
- function DefaultVideoModeSelector(const VideoMode: TVideoMode; Params: Longint): Boolean;
- type
- wordrec=packed record
- lo,hi : word;
- end;
- var
- regs : trealregs;
- begin
- regs.ax:=wordrec(Params).lo;
- regs.bx:=wordrec(Params).hi;
- realintr($10,regs);
- defaultvideomodeselector:=true;
- DoCustomMouse(false);
- end;
- function VideoModeSelector8x8(const VideoMode: TVideoMode; Params: Longint): Boolean;
- type
- wordrec=packed record
- lo,hi : word;
- end;
- var
- regs : trealregs;
- begin
- regs.ax:=3;
- regs.bx:=0;
- realintr($10,regs);
- regs.ax:=$1112;
- regs.bx:=$0;
- realintr($10,regs);
- videomodeselector8x8:=true;
- ScreenColor:=true;
- ScreenWidth:=80;
- ScreenHeight:=50;
- DoCustomMouse(false);
- end;
- procedure ClearScreen;
- begin
- FillWord(VideoBuf^,VideoBufSize shr 1,$0720);
- UpdateScreen(true);
- end;
- procedure UpdateScreen(Force: Boolean);
- begin
- if LockUpdateScreen<>0 then
- exit;
- if not force then
- begin
- asm
- movl VideoBuf,%esi
- movl OldVideoBuf,%edi
- movl VideoBufSize,%ecx
- shrl $2,%ecx
- repe
- cmpsl
- orl %ecx,%ecx
- jz .Lno_update
- movb $1,force
- .Lno_update:
- end;
- end;
- if Force then
- begin
- { dosmemput(videoseg,0,videobuf^,VideoBufSize);}
- asm
- pushw %es
- pushl %edi
- pushl %esi
- xor %edi, %edi
- movw videoseg, %di
- shll $0x4, %edi
- movl videobuf, %esi
- movl videobufsize, %ecx
- movw %fs, %ax
- movw %ax, %es
- rep movsb
- popl %esi
- popl %edi
- popw %es
- end ['EAX','ECX'];
- move(videobuf^,oldvideobuf^,VideoBufSize);
- end;
- end;
- procedure RegisterVideoModes;
- begin
- RegisterVideoMode(40, 25, False,@DefaultVideoModeSelector, $00000000);
- RegisterVideoMode(40, 25, True, @DefaultVideoModeSelector, $00000001);
- RegisterVideoMode(80, 25, False,@DefaultVideoModeSelector, $00000002);
- RegisterVideoMode(80, 25, True, @DefaultVideoModeSelector, $00000003);
- RegisterVideoMode(80, 50, True, @VideoModeSelector8x8, 0);
- end;
- {
- $Log$
- Revision 1.3 2000-02-07 22:54:44 florian
- * custommouse define removed, i.e. code is always active
- * the xor value for the mouse cursor must be $7f instead of $ff
- Revision 1.2 2000/02/06 14:29:45 florian
- * mouse support for vesa resolutions under go32v2, needs currently the define
- custommouse
- Revision 1.1 2000/01/06 01:20:30 peter
- * moved out of packages/ back to topdir
- Revision 1.1 1999/11/24 23:36:38 peter
- * moved to packages dir
- Revision 1.14 1999/10/03 19:53:26 peter
- * changed screenheight detection
- Revision 1.13 1999/08/16 18:26:20 peter
- * asm updatescreen for speed reasons
- Revision 1.12 1999/06/02 11:22:10 pierre
- * @ needed for proc address
- Revision 1.11 1999/04/01 12:51:51 pierre
- * removed clearscreen in initvideo for capture
- Revision 1.10 1999/03/21 22:49:40 florian
- * correct screeneight in 80x50 mode
- Revision 1.9 1999/03/14 22:15:49 florian
- * my last changes doesn't work correctly, fixed more
- the screen height calculation works incorrect in 80x50 mode
- Revision 1.8 1999/03/14 17:43:03 florian
- + 80x50 mode support added
- * some bugs in VESA mode support removed
- Revision 1.7 1999/02/19 16:42:48 peter
- * fixed typo
- Revision 1.6 1999/02/19 12:29:52 pierre
- * several bugs related to Cursor fixed !
- I still don't know the maximum value for
- the scan line (depends on resolution used !)
- Revision 1.5 1999/02/08 17:53:17 pierre
- + added restoring of BlinkState in InitVideo, old mode not stored
- Revision 1.4 1998/12/15 17:17:17 peter
- + cursor at 1,1 at the end
- Revision 1.3 1998/12/12 19:13:01 peter
- * keyboard updates
- * make test target, make all only makes units
- Revision 1.2 1998/12/10 11:41:50 florian
- * cursor is properly restored in DoneVideo
- Revision 1.1 1998/12/04 12:48:27 peter
- * moved some dirs
- Revision 1.4 1998/11/01 20:29:11 peter
- + lockupdatescreen counter to not let updatescreen() update
- Revision 1.3 1998/10/28 21:18:26 peter
- * more fixes
- Revision 1.2 1998/10/28 00:02:08 peter
- + mouse
- + video.clearscreen, video.videobufsize
- Revision 1.1 1998/10/26 11:31:47 peter
- + inital include files
- }
|