123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314 |
- {
- System independent low-level video interface for go32v2
- $Id$
- }
- {$ASMMODE ATT}
- uses
- mouse,
- go32;
- procedure TargetEntry;
- begin
- end;
- procedure TargetExit;
- begin
- end;
- 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;
- function BIOSGetScreenMode(var Cols,Rows: word; var Color: boolean): boolean;
- var r: trealregs;
- L: longint;
- LSel,LSeg: word;
- B: array[0..63] of byte;
- type TWord = word; PWord = ^TWord;
- var Size: word;
- OK: boolean;
- begin
- L:=global_dos_alloc(64);
- LSeg:=(L shr 16);
- LSel:=(L and $ffff);
- r.ah:=$1b; r.bx:=0;
- r.es:=LSeg; r.di:=0;
- realintr($10,r);
- OK:=(r.al=$1b);
- if OK then
- begin
- dpmi_dosmemget(LSeg,0,B,64);
- Cols:=PWord(@B[5])^; Rows:=B[$22];
- Color:=PWord(@B[$27])^<>0;
- end;
- global_dos_free(LSel);
- BIOSGetScreenMode:=OK;
- 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;
- BIOSGetScreenMode(ScreenWidth,ScreenHeight,ScreenColor);
- 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.4 2000-10-04 11:53:31 pierre
- Add TargetEntry and TargetExit (merged)
- Revision 1.3 2000/08/16 18:51:57 peter
- * Fixes from Gabor (merged)
- Revision 1.2 2000/07/13 11:32:24 michael
- + removed logs
- }
|