+ DontClearGraphMemory added to be able to start a mode

without clearing everything (needed for IDE)
  * tried to clean assembler problems due to regcall
    conventions

git-svn-id: trunk@5696 -
This commit is contained in:
pierre 2006-12-24 01:30:10 +00:00
parent e0d9b9e307
commit c9c37f573b

View File

@ -52,6 +52,10 @@ const
UseLFB : boolean = false;
UseNoSelector : boolean = false;
LFBPointer : pointer = nil;
{ Helpful variable to get save/restore support in IDE PM }
const
DontClearGraphMemory : boolean = false;
implementation
@ -162,55 +166,65 @@ const
pop es
pop esi
pop edi
end ['ESI','EDI','ECX','EAX']
end ['ECX','EAX']
end;
{$endif tp}
Procedure CallInt10(val_ax : word); assembler;
asm
{$IFNDEF REGCALL}
mov ax,val_ax
{$ENDIF REGCALL}
{$ifdef fpc}
push ebp
push esi
push edi
push ebx
{$endif fpc}
int 10h
{$ifdef fpc}
pop ebx
pop edi
pop esi
pop ebp
{$endif fpc}
end;
{************************************************************************}
{* 4-bit planar VGA mode routines *}
{************************************************************************}
Procedure Init640x200x16; {$ifndef fpc}far;{$endif fpc} assembler;
{ must also clear the screen...}
asm
mov ax,000Eh
{$ifdef fpc}
push ebp
{$endif fpc}
int 10h
{$ifdef fpc}
pop ebp
{$endif fpc}
end;
Procedure Init640x350x16; {$ifndef fpc}far;{$endif fpc} assembler;
{ must also clear the screen...}
asm
mov ax,0010h
{$ifdef fpc}
push ebp
{$endif fpc}
int 10h
{$ifdef fpc}
pop ebp
{$endif fpc}
Procedure Init640x200x16; {$ifndef fpc}far;{$endif fpc}
begin
if DontClearGraphMemory then
CallInt10($8e)
else
CallInt10($e);
end;
procedure Init640x480x16; {$ifndef fpc}far;{$endif fpc} assembler;
{ must also clear the screen...}
asm
mov ax,0012h
{$ifdef fpc}
push ebp
{$endif fpc}
int 10h
{$ifdef fpc}
pop ebp
{$endif fpc}
Procedure Init640x350x16; {$ifndef fpc}far;{$endif fpc}
begin
if DontClearGraphMemory then
CallInt10($90)
else
CallInt10($10);
end;
Procedure Init640x480x16; {$ifndef fpc}far;{$endif fpc}
begin
if DontClearGraphMemory then
CallInt10($92)
else
CallInt10($12);
end;
Procedure PutPixel16(X,Y : smallint; Pixel: Word); {$ifndef fpc}far;{$endif fpc}
{$ifndef asmgraph}
var offset: word;
@ -313,9 +327,9 @@ const
{ restore enable set/reset register }
mov ax,0001h
out dx,ax
{$endif fpc}
pop edi
pop ebx
{$endif fpc}
end;
{$endif asmgraph}
end;
@ -345,9 +359,6 @@ const
{$else asmgraph}
asm
{$ifndef fpc}
push esi
push edi
push ebx
mov ax, [X] { Get X address }
push ax
shr ax, 3
@ -413,6 +424,9 @@ const
xor ah,ah
mov @Result, ax
{$else fpc}
push esi
push edi
push ebx
movzx eax, [X] { Get X address }
push eax
shr eax, 3
@ -660,9 +674,6 @@ End;
{$else asmgraph}
{ note: still needs xor/or/and/notput support !!!!! (JM) }
asm
push esi
push edi
push ebx
{$ifndef fpc}
mov es, [SegA000]
{ enable the set / reset function and load the color }
@ -708,6 +719,9 @@ End;
mov ax,0001h
out dx,ax
{$else fpc}
push esi
push edi
push ebx
{ enable the set / reset function and load the color }
mov dx, 3ceh
mov ax, 0f01h
@ -992,9 +1006,15 @@ End;
mov ah,05h
{$ifdef fpc}
push ebp
push esi
push edi
push ebx
{$endif fpc}
int 10h
{$ifdef fpc}
pop ebx
pop edi
pop esi
pop ebp
{$endif fpc}
@ -1033,9 +1053,15 @@ End;
mov ah,05h
{$ifdef fpc}
push ebp
push esi
push edi
push ebx
{$endif fpc}
int 10h
{$ifdef fpc}
pop ebx
pop edi
pop esi
pop ebp
{$endif fpc}
end;
@ -1060,17 +1086,15 @@ End;
{* 320x200x256c Routines *}
{************************************************************************}
Procedure Init320; {$ifndef fpc}far;{$endif fpc} assembler;
asm
mov ax,0013h
{$ifdef fpc}
push ebp
{$endif fpc}
int 10h
{$ifdef fpc}
pop ebp
{$endif fpc}
end;
Procedure Init320; {$ifndef fpc}far;{$endif fpc}
begin
if DontClearGraphMemory then
CallInt10($93)
else
CallInt10($13);
end;
Procedure PutPixel320(X,Y : smallint; Pixel: Word); {$ifndef fpc}far;{$endif fpc}
{ x,y -> must be in local coordinates. Clipping if required. }
@ -1277,6 +1301,11 @@ const CrtAddress: word = 0;
MOV CRTAddress,DX
MOV AX, 0013h
MOV BL, DontClearGraphMemory
OR BL,BL
JZ @L2
OR AX, 080h
@L2:
{$ifdef fpc}
push ebp
{$EndIf fpc}
@ -1333,7 +1362,7 @@ const CrtAddress: word = 0;
IN AL,DX
OR AL,40h {bit 6 := 1: memory access scheme=linear bit array }
OUT DX,AL
end;
end ['ESI','EDI','EBX','EAX'];
end;
@ -1376,6 +1405,7 @@ const CrtAddress: word = 0;
mov al, ES:[DI]
xor ah, ah
mov @Result, ax
end;
{$else fpc}
push edi
push ebx
@ -1403,8 +1433,8 @@ const CrtAddress: word = 0;
mov @Result, ax
pop ebx
pop edi
end ['ESI','EDI','EBX','EAX'];
{$endif fpc}
end;
{$endif asmgraph}
end;
@ -2003,6 +2033,11 @@ const CrtAddress: word = 0;
{ check if Hercules adapter supPorted ... }
{ check if EGA adapter supPorted... }
asm
{$ifdef fpc}
push esi
push edi
push ebx
{$endif fpc}
mov ah,12h
mov bx,0FF10h
{$ifdef fpc}
@ -2016,6 +2051,11 @@ const CrtAddress: word = 0;
jz @noega
mov [EGADetected],TRUE
@noega:
{$ifdef fpc}
pop ebx
pop edi
pop esi
{$endif fpc}
end;
{$ifdef logging}
LogLn('EGA detected: '+strf(Longint(EGADetected)));
@ -2024,6 +2064,11 @@ const CrtAddress: word = 0;
if EGADetected then
begin
asm
{$ifdef fpc}
push esi
push edi
push ebx
{$endif fpc}
mov ax,1a00h
{$ifdef fpc}
push ebp
@ -2038,17 +2083,16 @@ const CrtAddress: word = 0;
mov ax,1c00h { get state size for save... }
{ ... all imPortant data }
mov cx,07h
{$ifdef fpc}
push ebp
{$endif fpc}
int 10h
{$ifdef fpc}
pop ebp
{$endif fpc}
cmp al,1ch { success? }
jne @novga
mov [VGADetected],TRUE
@novga:
{$ifdef fpc}
pop ebx
pop edi
pop esi
{$endif fpc}
end;
end;
{$ifdef logging}
@ -2774,6 +2818,6 @@ begin
test ax,ax
sete al
mov inWindows,al
end;
end ['ESI','EDI','EBX','EAX'];
InitializeGraph;
end.