Repository URL to install this package:
|
Version:
3.0.0 ▾
|
{
This file is part of the PTCPas framebuffer library
Copyright (C) 2001-2010 Nikolay Nikolov (nickysn@users.sourceforge.net)
Original C++ version by Glenn Fiedler (ptc@gaffer.org)
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version
with the following modification:
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent modules,and
to copy and distribute the resulting executable under terms of your choice,
provided that you also meet, for each linked independent module, the terms
and conditions of the license of that module. An independent module is a
module which is not derived from or based on this library. If you modify
this library, you may extend this exception to your version of the library,
but you are not obligated to do so. If you do not wish to do so, delete this
exception statement from your version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
}
{$MODE objfpc}
{$ASMMODE intel}
{$DEFINE X86_ASSEMBLER}
unit vga;
interface
const
{mode types}
FAKEMODE = 0;
RGB332 = 1;
INDEX8 = 2;
{fakemode types}
FAKEMODE1A = 0;
FAKEMODE1B = 1;
FAKEMODE1C = 2;
FAKEMODE2A = 3;
FAKEMODE2B = 4;
FAKEMODE2C = 5;
FAKEMODE3A = 6;
FAKEMODE3B = 7;
FAKEMODE3C = 8;
var
m_mode_type: Integer;
m_fake_type: Integer;
m_dispoffset: Integer;
procedure VGASetMode(xres, yres, modetype, faketype: Integer);
procedure fakemode_load(src: PByte; wvr: Boolean);
implementation
uses
go32fix;
var
RealRegs: TRealRegs;
procedure vgamode;
begin
RealRegs.ax := $13;
realintr($10, RealRegs);
end;
procedure biostextmode;
begin
RealRegs.ax := 3;
realintr($10, RealRegs);
end;
procedure wait_retrace;
begin
while (inportb($3DA) and 8) <> 0 do;
while (inportb($3DA) and 8) = 0 do;
end;
procedure clearmem(d: DWord); Assembler; Register;
Asm
cld
push es
mov edi, d
mov ax, fs
mov es, ax
mov ecx, 2048/4
xor eax, eax
rep stosd
pop es
end;
procedure clear_memory;
var
dest: DWord;
strip: Integer;
begin
wait_retrace;
dest := $A0000;
for strip := 0 to 31 do
begin
outportw($3C4, $102);
clearmem(dest);
outportw($3C4, $202);
clearmem(dest);
outportw($3C4, $402);
clearmem(dest);
outportw($3C4, $802);
clearmem(dest);
Inc(dest, 2048);
end;
end;
procedure palette(data: PDWord);
var
I: Integer;
C: DWord;
begin
outportb($3C8, 0);
for I := 0 to 255 do
begin
C := (data[I] shr 2) and $3F3F3F;
outportb($3C9, C shr 16);
outportb($3C9, C shr 8);
outportb($3C9, C);
end;
end;
procedure VGASetMode(xres, yres, modetype, faketype: Integer);
var
pal: array [0..255] of DWord;
I: Integer;
r, g, b: Integer;
z: Integer;
begin
m_mode_type := modetype;
{ set up display offset to centre image on display }
m_dispoffset := ((100 - (yres shr 1)) * 320) + (160 - (xres shr 1));
if (faketype < FAKEMODE1A) or (faketype > FAKEMODE2C) then
faketype := FAKEMODE2A;
m_fake_type := faketype;
vgamode;
if modetype = FAKEMODE then
begin
FillChar(pal, SizeOf(pal), 0);
palette(@pal);
m_dispoffset := 0;
wait_retrace;
if (faketype >= FAKEMODE1A) and (faketype <= FAKEMODE1C) then
begin
{FAKEMODE1x - 320x600}
outportb($3D4, $11);
outportb($3D5, inportb($3D5) and $7F);
outportb($3C2, $E7);
outportb($3D4, $00); outportb($3D5, $5F);
outportb($3D4, $01); outportb($3D5, $4F);
outportb($3D4, $02); outportb($3D5, $50);
outportb($3D4, $03); outportb($3D5, $82);
outportb($3D4, $04); outportb($3D5, $54);
outportb($3D4, $05); outportb($3D5, $80);
outportb($3D4, $06); outportb($3D5, $70);
outportb($3D4, $07); outportb($3D5, $F0);
outportb($3D4, $08); outportb($3D5, $00);
outportb($3D4, $09); outportb($3D5, $60);
outportb($3D4, $10); outportb($3D5, $5B);
outportb($3D4, $11); outportb($3D5, $8C);
outportb($3D4, $12); outportb($3D5, $57);
outportb($3D4, $13); outportb($3D5, $28);
outportb($3D4, $14); outportb($3D5, $00);
outportb($3D4, $15); outportb($3D5, $58);
outportb($3D4, $16); outportb($3D5, $70);
outportb($3D4, $17); outportb($3D5, $E3);
outportb($3C4, $01); outportb($3C5, $01);
outportb($3C4, $04); outportb($3C5, $06);
outportb($3CE, $05); outportb($3CF, $40);
outportb($3CE, $06); outportb($3CF, $05);
outportb($3CE, $06); outportb($3CF, $05);
end
else
begin
outportb($3D4, $11); outportb($3D5, inportb($3D5) and $7F);
outportb($3C2, $63);
outportb($3D4, $00); outportb($3D5, $5F);
outportb($3D4, $01); outportb($3D5, $4F);
outportb($3D4, $02); outportb($3D5, $50);
outportb($3D4, $03); outportb($3D5, $82);
outportb($3D4, $04); outportb($3D5, $54);
outportb($3D4, $05); outportb($3D5, $80);
outportb($3D4, $06); outportb($3D5, $BF);
outportb($3D4, $07); outportb($3D5, $1F);
outportb($3D4, $08); outportb($3D5, $00);
outportb($3D4, $09); outportb($3D5, $40);
outportb($3D4, $10); outportb($3D5, $9C);
outportb($3D4, $11); outportb($3D5, $8E);
outportb($3D4, $12); outportb($3D5, $8F);
outportb($3D4, $13); outportb($3D5, $28);
outportb($3D4, $14); outportb($3D5, $00);
outportb($3D4, $15); outportb($3D5, $96);
outportb($3D4, $16); outportb($3D5, $B9);
outportb($3D4, $17); outportb($3D5, $E3);
outportb($3C4, $01); outportb($3C5, $01);
outportb($3C4, $04); outportb($3C5, $06);
outportb($3CE, $05); outportb($3CF, $40);
outportb($3CE, $06); outportb($3CF, $05);
outportb($3CE, $06); outportb($3CF, $05);
end;
clear_memory;
if (faketype >= FAKEMODE2A) and (faketype <= FAKEMODE2C) then
begin
{FAKEMODE2 palette}
{taken from PTC 0.73}
for I := 0 to $7F do
begin
{bit 7 = 0 (top section)}
{red (4 bits)}
r := Round(((I shr 3) * 255) / 15);
{blue (3 bits)}
b := Round(((I and 7) * 255) / 7);
pal[I] := (r shl 16) or b;
end;
for I := $80 to $FF do
begin
{bit 7 = 1 (bottom section)}
{green}
g := Round(((I and $1F) * 255) / 31);
pal[I] := g shl 8;
end;
end
else
begin
for I := 0 to 63 do
begin
{FAKEMODE(1,3) palette}
z := Round((I * 255) / 63);
pal[I] := z shl 16;
pal[I + 64] := z shl 8;
pal[I + 128] := z;
pal[I + 192] := (z shl 16) or (z shl 8) or z;
end;
end;
palette(@pal);
end
else
if modetype = RGB332 then
begin
for I := 0 to 255 do
begin
r := Round(((I shr 5) * 255) / 7);
g := Round((((I and $1C) shr 2) * 255) / 7);
b := Round(((I and $03) * 255) / 3);
pal[I] := (r shl 16) or (g shl 8) or b;
end;
palette(@pal);
end;
end;
{$IFDEF X86_ASSEMBLER}
{
X86 fakemode routines for OpenPTC 1.0 C++ API implementation [DOS extension]
Copyright (c) 1998 Glenn Fiedler (ptc@gaffer.org)
Adapted for use in OpenPTC 1.0 C++ API by Jonathan Matthew (jmatthew@uq.net.au)
Converted to Free Pascal inline assembler by Nikolay Nikolov (nickysn@users.sourceforge.net)
This source code is licensed under the GNU LGPL
}
{
Parameters:
eax - source (moved to esi)
edx - dest (moved to edi)
ecx - # rows (moved to edx)
returns updated dest in eax
}
function PlaneBlt1_RGB(src: PByte; dest: DWord; rows: Integer): DWord; Assembler; Register;
Asm
push ebp
push esi
push edi
push ebx
mov esi, eax
mov edi, edx
mov edx, ecx
@L1: mov ebp, 20
push edx
@L2: mov cl, [esi] { ECX = greens (low 3 bits) }
mov ch, [esi+8]
shl ecx, 16
mov cl, [esi+8+8]
mov ch, [esi+8+8+8]
mov ebx, ecx { EBX = blues }
and ecx, 11100000111000001110000011100000b
ror ecx, 16+5
mov dl, [esi+1] { EDX = greens (high 3 bits) }
mov dh, [esi+8+1]
shl edx, 16
mov dl, [esi+8+8+1]
mov dh, [esi+8+8+8+1]
mov eax, edx { EAX = reds }
and edx, 00000111000001110000011100000111b
ror edx, 16-3
and ebx, 00011111000111110001111100011111b
ror ebx, 15
add ebx, 80808080h
and eax, 11111000111110001111100011111000b
ror eax, 16+2
add ecx, edx
add ecx, 40404040h
mov fs:[edi], eax
mov fs:[edi+80], ecx
mov fs:[edi+160], ebx
add edi, 4
add esi, 4*4*2
dec ebp
jnz @L2
pop edx
add edi, 160
dec edx
jnz @L1
@L3:
mov eax, edi
pop ebx
pop edi
pop esi
pop ebp
end;
function PlaneBlt1_RBG(src: PByte; dest: DWord; rows: Integer): DWord; Assembler; Register;
Asm
push ebp
push esi
push edi
push ebx
mov esi, eax
mov edi, edx
mov edx, ecx
@L1: mov ebp,20
push edx
@L2: mov cl,[esi] { ECX = greens (low 3 bits) }
mov ch,[esi+8]
shl ecx,16
mov cl,[esi+8+8]
mov ch,[esi+8+8+8]
mov ebx,ecx { setup blues in ebx }
and ecx,11100000111000001110000011100000b
ror ecx,16+5
mov dl,[esi+1] { EDX = greens (high 3 bits) }
mov dh,[esi+8+1]
shl edx,16
mov dl,[esi+8+8+1]
mov dh,[esi+8+8+8+1]
mov eax,edx { setup reds in eax }
and edx,00000111000001110000011100000111b
ror edx,16-3
and ebx,00011111000111110001111100011111b { EBX = blues }
ror ebx,15
add ebx,80808080h
and eax,11111000111110001111100011111000b { EAX = reds }
ror eax,16+2
add ecx,edx { ECX = green(lo)+green(hi) }
add ecx,40404040h
mov fs:[edi],eax
mov fs:[edi+160],ecx
mov fs:[edi+80],ebx
add edi,4
add esi,4*4*2
dec ebp
jnz @L2
pop edx
add edi,160
dec edx
jnz @L1
@L3:
mov eax, edi
pop ebx
pop edi
pop esi
pop ebp
end;
function PlaneBlt1_GRB(src: PByte; dest: DWord; rows: Integer): DWord; Assembler; Register;
Asm
push ebp
push esi
push edi
push ebx
mov esi, eax
mov edi, edx
mov edx, ecx
@L1: mov ebp,20
push edx
@L2: mov cl,[esi] { ECX = greens (low 3 bits) }
mov ch,[esi+8]
shl ecx,16
mov cl,[esi+8+8]
mov ch,[esi+8+8+8]
mov ebx,ecx { setup blues in ebx }
and ecx,11100000111000001110000011100000b
ror ecx,16+5
mov dl,[esi+1] { EDX = greens (high 3 bits) }
mov dh,[esi+8+1]
shl edx,16
mov dl,[esi+8+8+1]
mov dh,[esi+8+8+8+1]
mov eax,edx { setup reds in eax }
and edx,00000111000001110000011100000111b
ror edx,16-3
and ebx,00011111000111110001111100011111b { EBX = blues }
ror ebx,15
add ebx,80808080h
and eax,11111000111110001111100011111000b { EAX = reds }
ror eax,16+2
add ecx,edx { ECX = green(lo)+green(hi) }
add ecx,40404040h
mov fs:[edi+80],eax
mov fs:[edi],ecx
mov fs:[edi+160],ebx
add edi,4
add esi,4*4*2
dec ebp
jnz @L2
pop edx
add edi,160
dec edx
jnz @L1
@L3:
mov eax, edi
pop ebx
pop edi
pop esi
pop ebp
end;
function PlaneBlt2_RBG(src: PByte; dest: DWord; rows: Integer): DWord; Assembler; Register;
Asm
push ebp
push esi
push edi
push ebx
mov esi, eax
mov edi, edx
mov edx, ecx
@L1: mov ebp, 20
push edx
@L2: mov cl, [esi]
mov ch, [esi+8]
shl ecx, 16
mov cl, [esi+16]
mov ch, [esi+24] { low greens in ecx }
mov ebx, ecx { blues in ebx }
and ecx, 0c0c0c0c0h
ror ecx, 16+6
mov dl, [esi+1]
mov dh, [esi+9]
shl edx, 16
mov dl, [esi+17]
mov dh, [esi+25] { high greens in edx }
mov eax, edx { reds in eax }
and edx, 07070707h
ror edx, 16-2
and ebx, 1c1c1c1ch
ror ebx, 16+2
and eax, 0f0f0f0f0h
ror eax, 16+1
add eax, ebx { eax = red+blue }
add ecx, edx { ecx = green }
or ecx, 80808080h
mov fs:[edi], eax
mov fs:[edi+80], ecx
add esi, 4*4*2
add edi, 4
dec ebp
jnz @L2
pop edx
add edi, 80
dec edx
jnz @L1
@L3:
mov eax, edi
pop ebx
pop edi
pop esi
pop ebp
end;
function PlaneBlt2_GBR(src: PByte; dest: DWord; rows: Integer): DWord; Assembler; Register;
Asm
push ebp
push esi
push edi
push ebx
mov esi, eax
mov edi, edx
mov edx, ecx
@L1: mov ebp, 20
push edx
@L2: mov cl, [esi]
mov ch, [esi+8]
shl ecx, 16
mov cl, [esi+16]
mov ch, [esi+24] { low greens in ecx }
mov ebx, ecx { blues in ebx }
and ecx, 0c0c0c0c0h
ror ecx, 16+6
mov dl, [esi+1]
mov dh, [esi+9]
shl edx, 16
mov dl, [esi+17]
mov dh, [esi+25] { high greens in edx }
mov eax, edx { reds in eax }
and edx, 07070707h
ror edx, 16-2
and ebx, 1c1c1c1ch
ror ebx, 16+2
and eax, 0f0f0f0f0h
ror eax, 16+1
add eax, ebx { eax = red+blue }
add ecx, edx { ecx = green }
or ecx, 80808080h
mov fs:[edi], ecx
mov fs:[edi+80], eax
add esi, 4*4*2
add edi, 4
dec ebp
jnz @L2
pop edx
add edi, 80
dec edx
jnz @L1
@L3:
mov eax, edi
pop ebx
pop edi
pop esi
pop ebp
end;
function PlaneBlt3_RGBRGB(src: PByte; dest: DWord; rows: Integer): DWord; Assembler; Register;
Asm
push ebp
push esi
push edi
push ebx
mov esi, eax
mov edi, edx
mov edx, ecx
@L1: mov ebp,20
push edx
@L2: { 1st pixel [0r,0g,1b] }
mov cl,[esi] { ECX = greens (low 3 bits) }
mov ch,[esi+8]
shl ecx,16
mov cl,[esi+8+8]
mov ch,[esi+8+8+8]
and ecx,11100000111000001110000011100000b
ror ecx,16+5
mov dl,[esi+1] { EDX = greens (high 3 bits) }
mov dh,[esi+8+1]
shl edx,16
mov dl,[esi+8+8+1]
mov dh,[esi+8+8+8+1]
mov eax,edx { setup reds in eax }
and edx,00000111000001110000011100000111b
ror edx,16-3
mov bl,[esi+320*2] { EBX = blues }
mov bh,[esi+8+320*2]
shl ebx,16
mov bl,[esi+8+8+320*2]
mov bh,[esi+8+8+8+320*2]
and ebx,00011111000111110001111100011111b
ror ebx,15
add ebx,80808080h
and eax,11111000111110001111100011111000b { EAX = reds }
ror eax,16+2
add ecx,edx { ECX = green(lo)+green(hi) }
add ecx,40404040h
mov fs:[edi],eax
mov fs:[edi+80],ecx
mov fs:[edi+160],ebx
{ 2nd pixel [1r,2g,2b] }
mov al,[esi+1+320*2] { EAX = reds }
mov ah,[esi+8+1+320*2]
shl eax,16
mov al,[esi+8+8+1+320*2]
mov ah,[esi+8+8+8+1+320*2]
and eax,11111000111110001111100011111000b
ror eax,16+2
mov cl,[esi+640*2] { ECX = greens (low 3 bits) }
mov ch,[esi+8+640*2]
shl ecx,16
mov cl,[esi+8+8+640*2]
mov ch,[esi+8+8+8+640*2]
mov ebx,ecx { setup blues in ebx }
and ecx,11100000111000001110000011100000b
ror ecx,16+5
mov dl,[esi+1+640*2] { EDX = greens (high 3 bits) }
mov dh,[esi+8+1+640*2]
shl edx,16
mov dl,[esi+8+8+1+640*2]
mov dh,[esi+8+8+8+1+640*2]
and edx,00000111000001110000011100000111b
ror edx,16-3
and ebx,00011111000111110001111100011111b { EBX = blues }
ror ebx,15
add ebx,80808080h
add ecx,edx { ECX = green(lo)+green(hi) }
add ecx,40404040h
mov fs:[edi+240],eax
mov fs:[edi+240+80],ecx
mov fs:[edi+240+160],ebx
add edi,4
add esi,4*4*2
dec ebp
jz @L3
jmp @L2
@L3: pop edx
add edi,320+80
add esi,320*2*2
dec edx
jz @L4
jmp @L1
@L4:
mov eax, edi
pop ebx
pop edi
pop esi
pop ebp
end;
function PlaneBlt3_GRBGRB(src: PByte; dest: DWord; rows: Integer): DWord; Assembler; Register;
Asm
push ebp
push esi
push edi
push ebx
mov esi, eax
mov edi, edx
mov edx, ecx
@L1: mov ebp,20
push edx
@L2: { 1st pixel [0g,0r,1b] }
mov cl,[esi] { ECX = greens (low 3 bits) }
mov ch,[esi+8]
shl ecx,16
mov cl,[esi+8+8]
mov ch,[esi+8+8+8]
and ecx,11100000111000001110000011100000b
ror ecx,16+5
mov dl,[esi+1] { EDX = greens (high 3 bits) }
mov dh,[esi+8+1]
shl edx,16
mov dl,[esi+8+8+1]
mov dh,[esi+8+8+8+1]
mov eax,edx { setup reds in eax }
and edx,00000111000001110000011100000111b
ror edx,16-3
mov bl,[esi+320*2] { EBX = blues }
mov bh,[esi+8+320*2]
shl ebx,16
mov bl,[esi+8+8+320*2]
mov bh,[esi+8+8+8+320*2]
and ebx,00011111000111110001111100011111b
ror ebx,15
add ebx,80808080h
and eax,11111000111110001111100011111000b { EAX = reds }
ror eax,16+2
add ecx,edx { ECX = green(lo)+green(hi) }
add ecx,40404040h
mov fs:[edi],ecx { G0 }
mov fs:[edi+80],eax { R0 }
mov fs:[edi+160],ebx { B1 }
{ 2nd pixel [1g,2r,2b] }
mov al,[esi+1+640*2] { EAX = reds }
mov ah,[esi+8+1+640*2]
shl eax,16
mov al,[esi+8+8+1+640*2]
mov ah,[esi+8+8+8+1+640*2]
and eax,11111000111110001111100011111000b
ror eax,16+2
mov cl,[esi+320*2] { ECX = greens (low 3 bits) }
mov ch,[esi+8+320*2]
shl ecx,16
mov cl,[esi+8+8+320*2]
mov ch,[esi+8+8+8+320*2]
and ecx,11100000111000001110000011100000b
ror ecx,16+5
mov dl,[esi+1+320*2] { EDX = greens (high 3 bits) }
mov dh,[esi+8+1+320*2]
shl edx,16
mov dl,[esi+8+8+1+320*2]
mov dh,[esi+8+8+8+1+320*2]
and edx,00000111000001110000011100000111b
ror edx,16-3
mov bl,[esi+640*2] { EBX = blues }
mov bh,[esi+8+640*2]
shl ebx,16
mov bl,[esi+8+8+640*2]
mov bh,[esi+8+8+8+640*2]
and ebx,00011111000111110001111100011111b
ror ebx,15
add ebx,80808080h
add ecx,edx { ECX = green(lo)+green(hi) }
add ecx,40404040h
mov fs:[edi+240],ecx { G1 }
mov fs:[edi+240+80],eax { R2 }
mov fs:[edi+240+160],ebx { B2 }
add edi,4
add esi,4*4*2
dec ebp
jz @L3
jmp @L2
@L3: pop edx
add edi,320+80
add esi,320*2*2
dec edx
jz @L4
jmp @L1
@L4:
mov eax, edi
pop ebx
pop edi
pop esi
pop ebp
end;
function PlaneBlt3_RBGRBG(src: PByte; dest: DWord; rows: Integer): DWord; Assembler; Register;
Asm
push ebp
push esi
push edi
push ebx
mov esi, eax
mov edi, edx
mov edx, ecx
@L1: mov ebp,20
push edx
@L2: { 1st pixel [0r,0b,1g] }
mov bl,[esi] { EBX = blues }
mov bh,[esi+8]
shl ebx,16
mov bl,[esi+8+8]
mov bh,[esi+8+8+8]
and ebx,00011111000111110001111100011111b
ror ebx,15
add ebx,80808080h
mov al,[esi+1] { EAX = reds }
mov ah,[esi+8+1]
shl eax,16
mov al,[esi+8+8+1]
mov ah,[esi+8+8+8+1]
and eax,11111000111110001111100011111000b
ror eax,16+2
mov cl,[esi+320*2] { ECX = greens (low 3 bits) }
mov ch,[esi+8+320*2]
shl ecx,16
mov cl,[esi+8+8+320*2]
mov ch,[esi+8+8+8+320*2]
and ecx,11100000111000001110000011100000b
ror ecx,16+5
mov fs:[edi],eax { R0 }
mov dl,[esi+1+320*2] { EDX = greens (high 3 bits) }
mov dh,[esi+8+1+320*2]
shl edx,16
mov dl,[esi+8+8+1+320*2]
mov dh,[esi+8+8+8+1+320*2]
mov eax,edx { setup eax = r1 }
and edx,00000111000001110000011100000111b
ror edx,16-3
add ecx,edx { ECX = green(lo)+green(hi) }
add ecx,40404040h
mov fs:[edi+80],ebx { B0 }
mov fs:[edi+160],ecx { G1 }
{ 2nd pixel [1r,2b,2g] }
and eax,11111000111110001111100011111000b
ror eax,16+2
mov cl,[esi+640*2] { ECX = greens (low 3 bits) }
mov ch,[esi+8+640*2]
shl ecx,16
mov cl,[esi+8+8+640*2]
mov ch,[esi+8+8+8+640*2]
mov ebx,ecx { setup blues in ebx }
and ecx,11100000111000001110000011100000b
ror ecx,16+5
mov dl,[esi+1+640*2] { EDX = greens (high 3 bits) }
mov dh,[esi+8+1+640*2]
shl edx,16
mov dl,[esi+8+8+1+640*2]
mov dh,[esi+8+8+8+1+640*2]
and edx,00000111000001110000011100000111b
ror edx,16-3
and ebx,00011111000111110001111100011111b { EBX = blues }
ror ebx,15
add ebx,80808080h
add ecx,edx { ECX = green(lo)+green(hi) }
add ecx,40404040h
mov fs:[edi+240],eax { R1 }
mov fs:[edi+240+80],ebx { B2 }
mov fs:[edi+240+160],ecx { G2 }
add edi,4
add esi,4*4*2
dec ebp
jz @L3
jmp @L2
@L3: pop edx
add edi,320+80
add esi,320*2*2
dec edx
jz @L4
jmp @L1
@L4:
mov eax, edi
pop ebx
pop edi
pop esi
pop ebp
end;
function PlaneBlt3_GRBRBG(src: PByte; dest: DWord; rows: Integer): DWord; Assembler; Register;
Asm
push ebp
push esi
push edi
push ebx
mov esi, eax
mov edi, edx
mov edx, ecx
@L1: mov ebp,20
push edx
@L2: { 1st pixel [0g,0r,1b] }
mov cl,[esi] { ECX = greens (low 3 bits) }
mov ch,[esi+8]
shl ecx,16
mov cl,[esi+8+8]
mov ch,[esi+8+8+8]
and ecx,11100000111000001110000011100000b
ror ecx,16+5
mov dl,[esi+1] { EDX = greens (high 3 bits) }
mov dh,[esi+8+1]
shl edx,16
mov dl,[esi+8+8+1]
mov dh,[esi+8+8+8+1]
mov eax,edx { setup reds in eax }
and edx,00000111000001110000011100000111b
ror edx,16-3
mov bl,[esi+320*2] { EBX = blues }
mov bh,[esi+8+320*2]
shl ebx,16
mov bl,[esi+8+8+320*2]
mov bh,[esi+8+8+8+320*2]
and ebx,00011111000111110001111100011111b
ror ebx,15
add ebx,80808080h
and eax,11111000111110001111100011111000b { EAX = reds }
ror eax,16+2
add ecx,edx { ECX = green(lo)+green(hi) }
add ecx,40404040h
mov fs:[edi],ecx { G0 }
mov fs:[edi+80],eax { R0 }
mov fs:[edi+160],ebx { B1 }
{ 2nd pixel [1r,2b,2g] }
mov al,[esi+1+320*2] { EAX = reds }
mov ah,[esi+8+1+320*2]
shl eax,16
mov al,[esi+8+8+1+320*2]
mov ah,[esi+8+8+8+1+320*2]
and eax,11111000111110001111100011111000b
ror eax,16+2
mov cl,[esi+640*2] { ECX = greens (low 3 bits) }
mov ch,[esi+8+640*2]
shl ecx,16
mov cl,[esi+8+8+640*2]
mov ch,[esi+8+8+8+640*2]
mov ebx,ecx { setup ebx = blues }
and ecx,11100000111000001110000011100000b
ror ecx,16+5
mov dl,[esi+1+640*2] { EDX = greens (high 3 bits) }
mov dh,[esi+8+1+640*2]
shl edx,16
mov dl,[esi+8+8+1+640*2]
mov dh,[esi+8+8+8+1+640*2]
and edx,00000111000001110000011100000111b
ror edx,16-3
and ebx,00011111000111110001111100011111b { EBX = blues }
ror ebx,15
add ebx,80808080h
add ecx,edx { ECX = green(lo)+green(hi) }
add ecx,40404040h
mov fs:[edi+240],eax { R1 }
mov fs:[edi+240+80],ebx { B2 }
mov fs:[edi+240+160],ecx { G2 }
add edi,4
add esi,4*4*2
dec ebp
jz @L3
jmp @L2
@L3: pop edx
add edi,320+80
add esi,320*2*2
dec edx
jz @L4
jmp @L1
@L4:
mov eax, edi
pop ebx
pop edi
pop esi
pop ebp
end;
function PlaneBlt3_RBGGRB(src: PByte; dest: DWord; rows: Integer): DWord; Assembler; Register;
Asm
push ebp
push esi
push edi
push ebx
mov esi, eax
mov edi, edx
mov edx, ecx
@L1: mov ebp,20
push edx
@L2: { 1st pixel [0r,0b,1g] }
mov bl,[esi] { EBX = blues }
mov bh,[esi+8]
shl ebx,16
mov bl,[esi+8+8]
mov bh,[esi+8+8+8]
and ebx,00011111000111110001111100011111b
ror ebx,15
add ebx,80808080h
mov al,[esi+1] { EAX = reds }
mov ah,[esi+8+1]
shl eax,16
mov al,[esi+8+8+1]
mov ah,[esi+8+8+8+1]
and eax,11111000111110001111100011111000b
ror eax,16+2
mov fs:[edi+80],ebx { B0 }
mov dl,[esi+1+320*2] { EDX = greens (high 3 bits) }
mov dh,[esi+8+1+320*2]
shl edx,16
mov dl,[esi+8+8+1+320*2]
mov dh,[esi+8+8+8+1+320*2]
mov ebx,edx { setup ebx = g1 (hi) }
and edx,00000111000001110000011100000111b
ror edx,16-3
mov fs:[edi],eax { R0 }
mov cl,[esi+320*2] { ECX = greens (low 3 bits) }
mov ch,[esi+8+320*2]
shl ecx,16
mov cl,[esi+8+8+320*2]
mov ch,[esi+8+8+8+320*2]
mov eax,ecx { setup eax = g1 (lo) }
and ecx,11100000111000001110000011100000b
ror ecx,16+5
add ecx,edx { ECX = green(lo)+green(hi) }
add ecx,40404040h
mov fs:[edi+160],ecx { G1 }
{ 2nd pixel [1g,2r,2b] }
mov ecx,eax { ECX = greens (low 3 bits) }
and ecx,11100000111000001110000011100000b
ror ecx,16+5
mov edx,ebx { EDX = greens (hi 3 bits) }
and edx,00000111000001110000011100000111b
ror edx,16-3
mov al,[esi+1+640*2] { EAX = reds }
mov ah,[esi+8+1+640*2]
shl eax,16
mov al,[esi+8+8+1+640*2]
mov ah,[esi+8+8+8+1+640*2]
and eax,11111000111110001111100011111000b
ror eax,16+2
mov bl,[esi+640*2] { EBX = blues }
mov bh,[esi+8+640*2]
shl ebx,16
mov bl,[esi+8+8+640*2]
mov bh,[esi+8+8+8+640*2]
and ebx,00011111000111110001111100011111b
ror ebx,15
add ebx,80808080h
add ecx,edx { ECX = green(lo)+green(hi) }
add ecx,40404040h
mov fs:[edi+240],ecx { G1 }
mov fs:[edi+240+80],eax { R2 }
mov fs:[edi+240+160],ebx { B2 }
add edi,4
add esi,4*4*2
dec ebp
jz @L3
jmp @L2
@L3: pop edx
add edi,320+80
add esi,320*2*2
dec edx
jz @L4
jmp @L1
@L4:
mov eax, edi
pop ebx
pop edi
pop esi
pop ebp
end;
function PlaneBlt3_RGBR(src: PByte; dest: DWord; rows: Integer): DWord; Assembler; Register;
Asm
push ebp
push esi
push edi
push ebx
mov esi, eax
mov edi, edx
mov edx, ecx
mov ebp,20
@L1: mov cl,[esi] { ECX = greens (low 3 bits) }
mov ch,[esi+8]
shl ecx,16
mov cl,[esi+8+8]
mov ch,[esi+8+8+8]
and ecx,11100000111000001110000011100000b
ror ecx,16+5
mov dl,[esi+1] { EDX = greens (high 3 bits) }
mov dh,[esi+8+1]
shl edx,16
mov dl,[esi+8+8+1]
mov dh,[esi+8+8+8+1]
mov eax,edx { setup reds in eax }
and edx,00000111000001110000011100000111b
ror edx,16-3
mov bl,[esi+320*2] { EBX = blues }
mov bh,[esi+8+320*2]
shl ebx,16
mov bl,[esi+8+8+320*2]
mov bh,[esi+8+8+8+320*2]
and ebx,00011111000111110001111100011111b
ror ebx,15
add ebx,80808080h
and eax,11111000111110001111100011111000b { EAX = reds }
ror eax,16+2
add ecx,edx { ECX = green(lo)+green(hi) }
add ecx,40404040h
mov fs:[edi],eax
mov fs:[edi+80],ecx
mov fs:[edi+160],ebx
mov al,[esi+1+320*2] { EAX = reds }
mov ah,[esi+8+1+320*2]
shl eax,16
mov al,[esi+8+8+1+320*2]
mov ah,[esi+8+8+8+1+320*2]
and eax,11111000111110001111100011111000b
ror eax,16+2
mov fs:[edi+240],eax
add edi,4
add esi,4*4*2
dec ebp
jz @L2
jmp @L1
@L2:
mov eax, edi
pop ebx
pop edi
pop esi
pop ebp
end;
function PlaneBlt3_GRBG(src: PByte; dest: DWord; rows: Integer): DWord; Assembler; Register;
Asm
push ebp
push esi
push edi
push ebx
mov esi, eax
mov edi, edx
mov edx, ecx
mov ebp,20
@L1: mov cl,[esi] { ECX = greens (low 3 bits) }
mov ch,[esi+8]
shl ecx,16
mov cl,[esi+8+8]
mov ch,[esi+8+8+8]
and ecx,11100000111000001110000011100000b
ror ecx,16+5
mov dl,[esi+1] { EDX = greens (high 3 bits) }
mov dh,[esi+8+1]
shl edx,16
mov dl,[esi+8+8+1]
mov dh,[esi+8+8+8+1]
mov eax,edx { setup reds in eax }
and edx,00000111000001110000011100000111b
ror edx,16-3
mov bl,[esi+320*2] { EBX = blues }
mov bh,[esi+8+320*2]
shl ebx,16
mov bl,[esi+8+8+320*2]
mov bh,[esi+8+8+8+320*2]
and ebx,00011111000111110001111100011111b
ror ebx,15
add ebx,80808080h
and eax,11111000111110001111100011111000b { EAX = reds }
ror eax,16+2
add ecx,edx { ECX = green(lo)+green(hi) }
add ecx,40404040h
mov fs:[edi],ecx { G0 }
mov fs:[edi+80],eax { R0 }
mov fs:[edi+160],ebx { B1 }
mov cl,[esi+320*2] { ECX = greens (low 3 bits) }
mov ch,[esi+8+320*2]
shl ecx,16
mov cl,[esi+8+8+320*2]
mov ch,[esi+8+8+8+320*2]
and ecx,11100000111000001110000011100000b
ror ecx,16+5
mov dl,[esi+1+320*2] { EDX = greens (high 3 bits) }
mov dh,[esi+8+1+320*2]
shl edx,16
mov dl,[esi+8+8+1+320*2]
mov dh,[esi+8+8+8+1+320*2]
and edx,00000111000001110000011100000111b
ror edx,16-3
add ecx,edx { ECX = green(lo)+green(hi) }
add ecx,40404040h
mov fs:[edi+240],ecx { G1 }
add edi,4
add esi,4*4*2
dec ebp
jz @L2
jmp @L1
@L2:
mov eax, edi
pop ebx
pop edi
pop esi
pop ebp
end;
function PlaneBlt3_RBGR(src: PByte; dest: DWord; rows: Integer): DWord; Assembler; Register;
Asm
push ebp
push esi
push edi
push ebx
mov esi, eax
mov edi, edx
mov edx, ecx
mov ebp,20
@L1: mov bl,[esi] { EBX = blues }
mov bh,[esi+8]
shl ebx,16
mov bl,[esi+8+8]
mov bh,[esi+8+8+8]
and ebx,00011111000111110001111100011111b
ror ebx,15
add ebx,80808080h
mov al,[esi+1] { EAX = reds }
mov ah,[esi+8+1]
shl eax,16
mov al,[esi+8+8+1]
mov ah,[esi+8+8+8+1]
and eax,11111000111110001111100011111000b
ror eax,16+2
mov cl,[esi+320*2] { ECX = greens (low 3 bits) }
mov ch,[esi+8+320*2]
shl ecx,16
mov cl,[esi+8+8+320*2]
mov ch,[esi+8+8+8+320*2]
and ecx,11100000111000001110000011100000b
ror ecx,16+5
mov fs:[edi],eax { R0 }
mov dl,[esi+1+320*2] { EDX = greens (high 3 bits) }
mov dh,[esi+8+1+320*2]
shl edx,16
mov dl,[esi+8+8+1+320*2]
mov dh,[esi+8+8+8+1+320*2]
mov eax,edx { setup eax = r1 }
and edx,00000111000001110000011100000111b
ror edx,16-3
add ecx,edx { ECX = green(lo)+green(hi) }
add ecx,40404040h
mov fs:[edi+80],ebx { B0 }
mov fs:[edi+160],ecx { G1 }
and eax,11111000111110001111100011111000b
ror eax,16+2
mov fs:[edi+240],eax { R1 }
add edi,4
add esi,4*4*2
dec ebp
jz @L2
jmp @L1
@L2:
mov eax, edi
pop ebx
pop edi
pop esi
pop ebp
end;
function PlaneBlt3_GRBR(src: PByte; dest: DWord; rows: Integer): DWord; Assembler; Register;
Asm
push ebp
push esi
push edi
push ebx
mov esi, eax
mov edi, edx
mov edx, ecx
mov ebp,20
@L1: mov cl,[esi] { ECX = greens (low 3 bits) }
mov ch,[esi+8]
shl ecx,16
mov cl,[esi+8+8]
mov ch,[esi+8+8+8]
and ecx,11100000111000001110000011100000b
ror ecx,16+5
mov dl,[esi+1] { EDX = greens (high 3 bits) }
mov dh,[esi+8+1]
shl edx,16
mov dl,[esi+8+8+1]
mov dh,[esi+8+8+8+1]
mov eax,edx { setup reds in eax }
and edx,00000111000001110000011100000111b
ror edx,16-3
mov bl,[esi+320*2] { EBX = blues }
mov bh,[esi+8+320*2]
shl ebx,16
mov bl,[esi+8+8+320*2]
mov bh,[esi+8+8+8+320*2]
and ebx,00011111000111110001111100011111b
ror ebx,15
add ebx,80808080h
and eax,11111000111110001111100011111000b { EAX = reds }
ror eax,16+2
add ecx,edx { ECX = green(lo)+green(hi) }
add ecx,40404040h
mov fs:[edi],ecx { G0 }
mov fs:[edi+80],eax { R0 }
mov fs:[edi+160],ebx { B1 }
mov al,[esi+1+320*2] { EAX = reds }
mov ah,[esi+8+1+320*2]
shl eax,16
mov al,[esi+8+8+1+320*2]
mov ah,[esi+8+8+8+1+320*2]
and eax,11111000111110001111100011111000b
ror eax,16+2
mov fs:[edi+240],eax { R1 }
add edi,4
add esi,4*4*2
dec ebp
jz @L2
jmp @L1
@L2:
mov eax, edi
pop ebx
pop edi
pop esi
pop ebp
end;
function PlaneBlt3_RBGG(src: PByte; dest: DWord; rows: Integer): DWord; Assembler; Register;
Asm
push ebp
push esi
push edi
push ebx
mov esi, eax
mov edi, edx
mov edx, ecx
mov ebp,20
@L1: mov bl,[esi] { EBX = blues }
mov bh,[esi+8]
shl ebx,16
mov bl,[esi+8+8]
mov bh,[esi+8+8+8]
and ebx,00011111000111110001111100011111b
ror ebx,15
add ebx,80808080h
mov al,[esi+1] { EAX = reds }
mov ah,[esi+8+1]
shl eax,16
mov al,[esi+8+8+1]
mov ah,[esi+8+8+8+1]
and eax,11111000111110001111100011111000b
ror eax,16+2
mov fs:[edi+80],ebx { B0 }
mov dl,[esi+1+320*2] { EDX = greens (high 3 bits) }
mov dh,[esi+8+1+320*2]
shl edx,16
mov dl,[esi+8+8+1+320*2]
mov dh,[esi+8+8+8+1+320*2]
mov ebx,edx { setup ebx = g1 (hi) }
and edx,00000111000001110000011100000111b
ror edx,16-3
mov fs:[edi],eax { R0 }
mov cl,[esi+320*2] { ECX = greens (low 3 bits) }
mov ch,[esi+8+320*2]
shl ecx,16
mov cl,[esi+8+8+320*2]
mov ch,[esi+8+8+8+320*2]
mov eax,ecx { setup eax = g1 (lo) }
and ecx,11100000111000001110000011100000b
ror ecx,16+5
add ecx,edx { ECX = green(lo)+green(hi) }
add ecx,40404040h
mov fs:[edi+160],ecx { G1 }
mov ecx,eax { ECX = greens (low 3 bits) }
and ecx,11100000111000001110000011100000b
ror ecx,16+5
mov edx,ebx { EDX = greens (hi 3 bits) }
and edx,00000111000001110000011100000111b
ror edx,16-3
add ecx,edx { ECX = green(lo)+green(hi) }
add ecx,40404040h
mov fs:[edi+240],ecx { G1 }
add edi,4
add esi,4*4*2
dec ebp
jz @L2
jmp @L1
@L2:
mov eax, edi
pop ebx
pop edi
pop esi
pop ebp
end;
{$ELSE X86_ASSEMBLER}
function PlaneBlt1_RGB(src: PByte; dest: DWord; rows: Integer): DWord;
var
row, col: Integer;
r, gl, gh, b: DWord;
begin
for row := 1 to rows do
begin
for col := 0 to 19 do
begin
gl := ((src[ 0]) ) or ((src[ 8]) shl 8) or
((src[16]) shl 16) or ((src[24]) shl 24);
b := gl;
gl := gl and $E0E0E0E0;
gl := gl shr 5;
gh := ((src[ 1]) ) or ((src[ 9]) shl 8) or
((src[17]) shl 16) or ((src[25]) shl 24);
r := gh;
gh := gh and $07070707;
gh := gh shl 3;
b := b and $1F1F1F1F;
b := b shl 1;
b := b or $80808080;
r := r and $F8F8F8F8;
r := r shr 2;
Inc(gl, gh);
gl := gl or $40404040;
MemL[dest] := r;
MemL[dest + 20*4] := gl;
MemL[dest + 40*4] := b;
Inc(dest, 4);
Inc(src, 4 * 4 * 2);
end;
Inc(dest, 40 * 4);
end;
PlaneBlt1_RGB := dest;
end;
function PlaneBlt1_RBG(src: PByte; dest: DWord; rows: Integer): DWord;
var
row, col: Integer;
r, gl, gh, b: DWord;
begin
for row := 1 to rows do
begin
for col := 0 to 19 do
begin
gl := ((src[ 0]) ) or ((src[ 8]) shl 8) or
((src[16]) shl 16) or ((src[24]) shl 24);
b := gl;
gl := gl and $E0E0E0E0;
gl := gl shr 5;
gh := ((src[ 1]) ) or ((src[ 9]) shl 8) or
((src[17]) shl 16) or ((src[25]) shl 24);
r := gh;
gh := gh and $07070707;
gh := gh shl 3;
b := b and $1F1F1F1F;
b := b shl 1;
b := b or $80808080;
r := r and $F8F8F8F8;
r := r shr 2;
Inc(gl, gh);
gl := gl or $40404040;
MemL[dest] := r;
MemL[dest + 20*4] := b;
MemL[dest + 40*4] := gl;
Inc(dest, 4);
Inc(src, 4 * 4 * 2);
end;
Inc(dest, 40 * 4);
end;
PlaneBlt1_RBG := dest;
end;
function PlaneBlt1_GRB(src: PByte; dest: DWord; rows: Integer): DWord;
var
row, col: Integer;
r, gl, gh, b: DWord;
begin
for row := 1 to rows do
begin
for col := 0 to 19 do
begin
gl := ((src[ 0]) ) or ((src[ 8]) shl 8) or
((src[16]) shl 16) or ((src[24]) shl 24);
b := gl;
gl := gl and $E0E0E0E0;
gl := gl shr 5;
gh := ((src[ 1]) ) or ((src[ 9]) shl 8) or
((src[17]) shl 16) or ((src[25]) shl 24);
r := gh;
gh := gh and $07070707;
gh := gh shl 3;
b := b and $1F1F1F1F;
b := b shl 1;
b := b or $80808080;
r := r and $F8F8F8F8;
r := r shr 2;
Inc(gl, gh);
gl := gl or $40404040;
MemL[dest] := gl;
MemL[dest + 20*4] := r;
MemL[dest + 40*4] := b;
Inc(dest, 4);
Inc(src, 4 * 4 * 2);
end;
Inc(dest, 40 * 4);
end;
PlaneBlt1_GRB := dest;
end;
function PlaneBlt2_RBG(src: PByte; dest: DWord; rows: Integer): DWord;
var
row, col: Integer;
r, gl, gh, b: DWord;
begin
for row := 1 to rows do
begin
for col := 0 to 19 do
begin
gl := ((src[ 0]) ) or ((src[ 8]) shl 8) or
((src[16]) shl 16) or ((src[24]) shl 24);
b := gl;
gl := gl and $C0C0C0C0;
gl := gl shr 6;
gh := ((src[ 1]) ) or ((src[ 9]) shl 8) or
((src[17]) shl 16) or ((src[25]) shl 24);
r := gh;
gh := gh and $07070707;
gh := gh shl 2;
b := b and $1C1C1C1C;
b := b shr 2;
r := r and $F0F0F0F0;
r := r shr 1;
Inc(r, b);
Inc(gl, gh);
gl := gl or $80808080;
MemL[dest] := r;
MemL[dest + 20*4] := gl;
Inc(dest, 4);
Inc(src, 4 * 4 * 2);
end;
Inc(dest, 20 * 4);
end;
PlaneBlt2_RBG := dest;
end;
function PlaneBlt2_GBR(src: PByte; dest: DWord; rows: Integer): DWord;
var
row, col: Integer;
r, gl, gh, b: DWord;
begin
for row := 1 to rows do
begin
for col := 0 to 19 do
begin
gl := ((src[ 0]) ) or ((src[ 8]) shl 8) or
((src[16]) shl 16) or ((src[24]) shl 24);
b := gl;
gl := gl and $C0C0C0C0;
gl := gl shr 6;
gh := ((src[ 1]) ) or ((src[ 9]) shl 8) or
((src[17]) shl 16) or ((src[25]) shl 24);
r := gh;
gh := gh and $07070707;
gh := gh shl 2;
b := b and $1C1C1C1C;
b := b shr 2;
r := r and $F0F0F0F0;
r := r shr 1;
Inc(r, b);
Inc(gl, gh);
gl := gl or $80808080;
MemL[dest] := gl;
MemL[dest + 20*4] := r;
Inc(dest, 4);
Inc(src, 4 * 4 * 2);
end;
Inc(dest, 20 * 4);
end;
PlaneBlt2_GBR := dest;
end;
function PlaneBlt3_RGBRGB(src: PByte; dest: DWord; rows: Integer): DWord;
var
row, col: Integer;
r, gl, gh, b: DWord;
begin
for row := 1 to rows do
begin
for col := 0 to 19 do
begin
gl := ((src[ 0]) ) or ((src[ 8]) shl 8) or
((src[16]) shl 16) or ((src[24]) shl 24);
gl := gl and $E0E0E0E0;
gl := gl shr 5;
gh := ((src[ 1]) ) or ((src[ 9]) shl 8) or
((src[17]) shl 16) or ((src[25]) shl 24);
r := gh;
gh := gh and $07070707;
gh := gh shl 3;
b := ((src[ 0+(320*2)]) ) or ((src[ 8+(320*2)]) shl 8) or
((src[16+(320*2)]) shl 16) or ((src[24+(320*2)]) shl 24);
b := b and $1F1F1F1F;
b := b shl 1;
b := b or $80808080;
r := r and $F8F8F8F8;
r := r shr 2;
Inc(gl, gh);
gl := gl or $40404040;
MemL[dest] := r;
MemL[dest + 20*4] := gl;
MemL[dest + 40*4] := b;
r := ((src[ 1+(320*2)]) ) or ((src[ 9+(320*2)]) shl 8) or
((src[17+(320*2)]) shl 16) or ((src[25+(320*2)]) shl 24);
r := r and $F8F8F8F8;
r := r shr 2;
gl := ((src[ 0+(640*2)]) ) or ((src[ 8+(640*2)]) shl 8) or
((src[16+(640*2)]) shl 16) or ((src[24+(640*2)]) shl 24);
b := gl;
gl := gl and $E0E0E0E0;
gl := gl shr 5;
gh := ((src[ 1+(640*2)]) ) or ((src[ 9+(640*2)]) shl 8) or
((src[17+(640*2)]) shl 16) or ((src[25+(640*2)]) shl 24);
gh := gh and $07070707;
gh := gh shl 3;
b := b and $1F1F1F1F;
b := b shl 1;
b := b or $80808080;
Inc(gl, gh);
gl := gl or $40404040;
MemL[dest + 60*4] := r;
MemL[dest + 80*4] := gl;
MemL[dest + 100*4] := b;
Inc(dest, 4);
Inc(src, 4 * 4 * 2);
end;
Inc(dest, 100 * 4);
Inc(src, 320 * 2 * 2);
end;
PlaneBlt3_RGBRGB := dest;
end;
function PlaneBlt3_GRBGRB(src: PByte; dest: DWord; rows: Integer): DWord;
var
row, col: Integer;
r, gl, gh, b: DWord;
begin
for row := 1 to rows do
begin
for col := 0 to 19 do
begin
gl := ((src[ 0]) ) or ((src[ 8]) shl 8) or
((src[16]) shl 16) or ((src[24]) shl 24);
gl := gl and $E0E0E0E0;
gl := gl shr 5;
gh := ((src[ 1]) ) or ((src[ 9]) shl 8) or
((src[17]) shl 16) or ((src[25]) shl 24);
r := gh;
gh := gh and $07070707;
gh := gh shl 3;
b := ((src[ 0+(320*2)]) ) or ((src[ 8+(320*2)]) shl 8) or
((src[16+(320*2)]) shl 16) or ((src[24+(320*2)]) shl 24);
b := b and $1F1F1F1F;
b := b shl 1;
b := b or $80808080;
r := r and $F8F8F8F8;
r := r shr 2;
Inc(gl, gh);
gl := gl or $40404040;
MemL[dest] := gl;
MemL[dest + 20*4] := r;
MemL[dest + 40*4] := b;
r := ((src[ 1+(320*2)]) ) or ((src[ 9+(320*2)]) shl 8) or
((src[17+(320*2)]) shl 16) or ((src[25+(320*2)]) shl 24);
r := r and $F8F8F8F8;
r := r shr 2;
gl := ((src[ 0+(640*2)]) ) or ((src[ 8+(640*2)]) shl 8) or
((src[16+(640*2)]) shl 16) or ((src[24+(640*2)]) shl 24);
b := gl;
gl := gl and $E0E0E0E0;
gl := gl shr 5;
gh := ((src[ 1+(640*2)]) ) or ((src[ 9+(640*2)]) shl 8) or
((src[17+(640*2)]) shl 16) or ((src[25+(640*2)]) shl 24);
gh := gh and $07070707;
gh := gh shl 3;
b := b and $1F1F1F1F;
b := b shl 1;
b := b or $80808080;
Inc(gl, gh);
gl := gl or $40404040;
MemL[dest + 60*4] := gl;
MemL[dest + 80*4] := r;
MemL[dest + 100*4] := b;
Inc(dest, 4);
Inc(src, 4 * 4 * 2);
end;
Inc(dest, 100 * 4);
Inc(src, 320 * 2 * 2);
end;
PlaneBlt3_GRBGRB := dest;
end;
function PlaneBlt3_RBGRBG(src: PByte; dest: DWord; rows: Integer): DWord;
var
row, col: Integer;
r, gl, gh, b: DWord;
begin
for row := 1 to rows do
begin
for col := 0 to 19 do
begin
gl := ((src[ 0]) ) or ((src[ 8]) shl 8) or
((src[16]) shl 16) or ((src[24]) shl 24);
gl := gl and $E0E0E0E0;
gl := gl shr 5;
gh := ((src[ 1]) ) or ((src[ 9]) shl 8) or
((src[17]) shl 16) or ((src[25]) shl 24);
r := gh;
gh := gh and $07070707;
gh := gh shl 3;
b := ((src[ 0+(320*2)]) ) or ((src[ 8+(320*2)]) shl 8) or
((src[16+(320*2)]) shl 16) or ((src[24+(320*2)]) shl 24);
b := b and $1F1F1F1F;
b := b shl 1;
b := b or $80808080;
r := r and $F8F8F8F8;
r := r shr 2;
Inc(gl, gh);
gl := gl or $40404040;
MemL[dest] := r;
MemL[dest + 20*4] := b;
MemL[dest + 40*4] := gl;
r := ((src[ 1+(320*2)]) ) or ((src[ 9+(320*2)]) shl 8) or
((src[17+(320*2)]) shl 16) or ((src[25+(320*2)]) shl 24);
r := r and $F8F8F8F8;
r := r shr 2;
gl := ((src[ 0+(640*2)]) ) or ((src[ 8+(640*2)]) shl 8) or
((src[16+(640*2)]) shl 16) or ((src[24+(640*2)]) shl 24);
b := gl;
gl := gl and $E0E0E0E0;
gl := gl shr 5;
gh := ((src[ 1+(640*2)]) ) or ((src[ 9+(640*2)]) shl 8) or
((src[17+(640*2)]) shl 16) or ((src[25+(640*2)]) shl 24);
gh := gh and $07070707;
gh := gh shl 3;
b := b and $1F1F1F1F;
b := b shl 1;
b := b or $80808080;
Inc(gl, gh);
gl := gl or $40404040;
MemL[dest + 60*4] := r;
MemL[dest + 80*4] := b;
MemL[dest + 100*4] := gl;
Inc(dest, 4);
Inc(src, 4 * 4 * 2);
end;
Inc(dest, 100 * 4);
Inc(src, 320 * 2 * 2);
end;
PlaneBlt3_RBGRBG := dest;
end;
function PlaneBlt3_GRBRBG(src: PByte; dest: DWord; rows: Integer): DWord;
var
row, col: Integer;
r, gl, gh, b: DWord;
begin
for row := 1 to rows do
begin
for col := 0 to 19 do
begin
gl := ((src[ 0]) ) or ((src[ 8]) shl 8) or
((src[16]) shl 16) or ((src[24]) shl 24);
gl := gl and $E0E0E0E0;
gl := gl shr 5;
gh := ((src[ 1]) ) or ((src[ 9]) shl 8) or
((src[17]) shl 16) or ((src[25]) shl 24);
r := gh;
gh := gh and $07070707;
gh := gh shl 3;
b := ((src[ 0+(320*2)]) ) or ((src[ 8+(320*2)]) shl 8) or
((src[16+(320*2)]) shl 16) or ((src[24+(320*2)]) shl 24);
b := b and $1F1F1F1F;
b := b shl 1;
b := b or $80808080;
r := r and $F8F8F8F8;
r := r shr 2;
Inc(gl, gh);
gl := gl or $40404040;
MemL[dest] := gl;
MemL[dest + 20*4] := r;
MemL[dest + 40*4] := b;
r := ((src[ 1+(320*2)]) ) or ((src[ 9+(320*2)]) shl 8) or
((src[17+(320*2)]) shl 16) or ((src[25+(320*2)]) shl 24);
r := r and $F8F8F8F8;
r := r shr 2;
gl := ((src[ 0+(640*2)]) ) or ((src[ 8+(640*2)]) shl 8) or
((src[16+(640*2)]) shl 16) or ((src[24+(640*2)]) shl 24);
b := gl;
gl := gl and $E0E0E0E0;
gl := gl shr 5;
gh := ((src[ 1+(640*2)]) ) or ((src[ 9+(640*2)]) shl 8) or
((src[17+(640*2)]) shl 16) or ((src[25+(640*2)]) shl 24);
gh := gh and $07070707;
gh := gh shl 3;
b := b and $1F1F1F1F;
b := b shl 1;
b := b or $80808080;
Inc(gl, gh);
gl := gl or $40404040;
MemL[dest + 60*4] := r;
MemL[dest + 80*4] := b;
MemL[dest + 100*4] := gl;
Inc(dest, 4);
Inc(src, 4 * 4 * 2);
end;
Inc(dest, 100 * 4);
Inc(src, 320 * 2 * 2);
end;
PlaneBlt3_GRBRBG := dest;
end;
function PlaneBlt3_RBGGRB(src: PByte; dest: DWord; rows: Integer): DWord;
var
row, col: Integer;
r, gl, gh, b: DWord;
begin
for row := 1 to rows do
begin
for col := 0 to 19 do
begin
gl := ((src[ 0]) ) or ((src[ 8]) shl 8) or
((src[16]) shl 16) or ((src[24]) shl 24);
gl := gl and $E0E0E0E0;
gl := gl shr 5;
gh := ((src[ 1]) ) or ((src[ 9]) shl 8) or
((src[17]) shl 16) or ((src[25]) shl 24);
r := gh;
gh := gh and $07070707;
gh := gh shl 3;
b := ((src[ 0+(320*2)]) ) or ((src[ 8+(320*2)]) shl 8) or
((src[16+(320*2)]) shl 16) or ((src[24+(320*2)]) shl 24);
b := b and $1F1F1F1F;
b := b shl 1;
b := b or $80808080;
r := r and $F8F8F8F8;
r := r shr 2;
Inc(gl, gh);
gl := gl or $40404040;
MemL[dest] := r;
MemL[dest + 20*4] := b;
MemL[dest + 40*4] := gl;
r := ((src[ 1+(320*2)]) ) or ((src[ 9+(320*2)]) shl 8) or
((src[17+(320*2)]) shl 16) or ((src[25+(320*2)]) shl 24);
r := r and $F8F8F8F8;
r := r shr 2;
gl := ((src[ 0+(640*2)]) ) or ((src[ 8+(640*2)]) shl 8) or
((src[16+(640*2)]) shl 16) or ((src[24+(640*2)]) shl 24);
b := gl;
gl := gl and $E0E0E0E0;
gl := gl shr 5;
gh := ((src[ 1+(640*2)]) ) or ((src[ 9+(640*2)]) shl 8) or
((src[17+(640*2)]) shl 16) or ((src[25+(640*2)]) shl 24);
gh := gh and $07070707;
gh := gh shl 3;
b := b and $1F1F1F1F;
b := b shl 1;
b := b or $80808080;
Inc(gl, gh);
gl := gl or $40404040;
MemL[dest + 60*4] := gl;
MemL[dest + 80*4] := r;
MemL[dest + 100*4] := b;
Inc(dest, 4);
Inc(src, 4 * 4 * 2);
end;
Inc(dest, 100 * 4);
Inc(src, 320 * 2 * 2);
end;
PlaneBlt3_RBGGRB := dest;
end;
function PlaneBlt3_RGBR(src: PByte; dest: DWord; rows: Integer): DWord;
var
{row,} col: Integer;
r, gl, gh, b: DWord;
begin
for col := 0 to 19 do
begin
gl := ((src[ 0]) ) or ((src[ 8]) shl 8) or
((src[16]) shl 16) or ((src[24]) shl 24);
gl := gl and $E0E0E0E0;
gl := gl shr 5;
gh := ((src[ 1]) ) or ((src[ 9]) shl 8) or
((src[17]) shl 16) or ((src[25]) shl 24);
r := gh;
gh := gh and $07070707;
gh := gh shl 3;
b := ((src[ 0+320*2]) ) or ((src[ 8+320*2]) shl 8) or
((src[16+320*2]) shl 16) or ((src[24+320*2]) shl 24);
b := b and $1F1F1F1F;
b := b shl 1;
b := b or $80808080;
r := r and $F8F8F8F8;
r := r shr 2;
Inc(gl, gh);
gl := gl or $40404040;
MemL[dest] := r;
MemL[dest + 20*4] := gl;
MemL[dest + 40*4] := b;
r := ((src[ 1+320*2]) ) or ((src[ 9+320*2]) shl 8) or
((src[17+320*2]) shl 16) or ((src[25+320*2]) shl 24);
r := r or $F8F8F8F8;
r := r shr 2;
MemL[dest + 60*4] := r;
Inc(dest, 4);
Inc(src, 4 * 4 * 2);
end;
PlaneBlt3_RGBR := dest;
end;
function PlaneBlt3_GRBG(src: PByte; dest: DWord; rows: Integer): DWord;
var
{row,} col: Integer;
r, gl, gh, b: DWord;
begin
for col := 0 to 19 do
begin
gl := ((src[ 0]) ) or ((src[ 8]) shl 8) or
((src[16]) shl 16) or ((src[24]) shl 24);
gl := gl and $E0E0E0E0;
gl := gl shr 5;
gh := ((src[ 1]) ) or ((src[ 9]) shl 8) or
((src[17]) shl 16) or ((src[25]) shl 24);
r := gh;
gh := gh and $07070707;
gh := gh shl 3;
b := ((src[ 0+320*2]) ) or ((src[ 8+320*2]) shl 8) or
((src[16+320*2]) shl 16) or ((src[24+320*2]) shl 24);
b := b and $1F1F1F1F;
b := b shl 1;
b := b or $80808080;
r := r and $F8F8F8F8;
r := r shr 2;
Inc(gl, gh);
gl := gl or $40404040;
MemL[dest] := gl;
MemL[dest + 20*4] := r;
MemL[dest + 40*4] := b;
gl := ((src[ 0+640*2]) ) or ((src[ 8+640*2]) shl 8) or
((src[16+640*2]) shl 16) or ((src[24+640*2]) shl 24);
gl := gl and $E0E0E0E0;
gl := gl shr 5;
gh := ((src[ 1+640*2]) ) or ((src[ 9+640*2]) shl 8) or
((src[17+640*2]) shl 16) or ((src[25+640*2]) shl 24);
gh := gh and $07070707;
gh := gh shl 3;
Inc(gl, gh);
gl := gl or $40404040;
MemL[dest + 60*4] := gl;
Inc(dest, 4);
Inc(src, 4 * 4 * 2);
end;
PlaneBlt3_GRBG := dest;
end;
function PlaneBlt3_RBGR(src: PByte; dest: DWord; rows: Integer): DWord;
var
{row,} col: Integer;
r, gl, gh, b: DWord;
begin
for col := 0 to 19 do
begin
gl := ((src[ 0]) ) or ((src[ 8]) shl 8) or
((src[16]) shl 16) or ((src[24]) shl 24);
gl := gl and $E0E0E0E0;
gl := gl shr 5;
gh := ((src[ 1]) ) or ((src[ 9]) shl 8) or
((src[17]) shl 16) or ((src[25]) shl 24);
r := gh;
gh := gh and $07070707;
gh := gh shl 3;
b := ((src[ 0+320*2]) ) or ((src[ 8+320*2]) shl 8) or
((src[16+320*2]) shl 16) or ((src[24+320*2]) shl 24);
b := b and $1F1F1F1F;
b := b shl 1;
b := b or $80808080;
r := r and $F8F8F8F8;
r := r shr 2;
Inc(gl, gh);
gl := gl or $40404040;
MemL[dest] := r;
MemL[dest + 20*4] := b;
MemL[dest + 40*4] := gl;
r := ((src[ 1+320*2]) ) or ((src[ 9+320*2]) shl 8) or
((src[17+320*2]) shl 16) or ((src[25+320*2]) shl 24);
r := r or $F8F8F8F8;
r := r shr 2;
MemL[dest + 60*4] := r;
Inc(dest, 4);
Inc(src, 4 * 4 * 2);
end;
PlaneBlt3_RBGR := dest;
end;
function PlaneBlt3_GRBR(src: PByte; dest: DWord; rows: Integer): DWord;
var
{row,} col: Integer;
r, gl, gh, b: DWord;
begin
for col := 0 to 19 do
begin
gl := ((src[ 0]) ) or ((src[ 8]) shl 8) or
((src[16]) shl 16) or ((src[24]) shl 24);
gl := gl and $E0E0E0E0;
gl := gl shr 5;
gh := ((src[ 1]) ) or ((src[ 9]) shl 8) or
((src[17]) shl 16) or ((src[25]) shl 24);
r := gh;
gh := gh and $07070707;
gh := gh shl 3;
b := ((src[ 0+320*2]) ) or ((src[ 8+320*2]) shl 8) or
((src[16+320*2]) shl 16) or ((src[24+320*2]) shl 24);
b := b and $1F1F1F1F;
b := b shl 1;
b := b or $80808080;
r := r and $F8F8F8F8;
r := r shr 2;
Inc(gl, gh);
gl := gl or $40404040;
MemL[dest] := gl;
MemL[dest + 20*4] := r;
MemL[dest + 40*4] := b;
r := ((src[ 1+320*2]) ) or ((src[ 9+320*2]) shl 8) or
((src[17+320*2]) shl 16) or ((src[25+320*2]) shl 24);
r := r or $F8F8F8F8;
r := r shr 2;
MemL[dest + 60*4] := r;
Inc(dest, 4);
Inc(src, 4 * 4 * 2);
end;
PlaneBlt3_GRBR := dest;
end;
function PlaneBlt3_RBGG(src: PByte; dest: DWord; rows: Integer): DWord;
var
{row,} col: Integer;
r, gl, gh, b: DWord;
begin
for col := 0 to 19 do
begin
gl := ((src[ 0]) ) or ((src[ 8]) shl 8) or
((src[16]) shl 16) or ((src[24]) shl 24);
gl := gl and $E0E0E0E0;
gl := gl shr 5;
gh := ((src[ 1]) ) or ((src[ 9]) shl 8) or
((src[17]) shl 16) or ((src[25]) shl 24);
r := gh;
gh := gh and $07070707;
gh := gh shl 3;
b := ((src[ 0+320*2]) ) or ((src[ 8+320*2]) shl 8) or
((src[16+320*2]) shl 16) or ((src[24+320*2]) shl 24);
b := b and $1F1F1F1F;
b := b shl 1;
b := b or $80808080;
r := r and $F8F8F8F8;
r := r shr 2;
Inc(gl, gh);
gl := gl or $40404040;
MemL[dest] := r;
MemL[dest + 20*4] := b;
MemL[dest + 40*4] := gl;
gl := ((src[ 0+640*2]) ) or ((src[ 8+640*2]) shl 8) or
((src[16+640*2]) shl 16) or ((src[24+640*2]) shl 24);
gl := gl and $E0E0E0E0;
gl := gl shr 5;
gh := ((src[ 1+640*2]) ) or ((src[ 9+640*2]) shl 8) or
((src[17+640*2]) shl 16) or ((src[25+640*2]) shl 24);
gh := gh and $07070707;
gh := gh shl 3;
Inc(gl, gh);
gl := gl or $40404040;
MemL[dest + 60*4] := gl;
Inc(dest, 4);
Inc(src, 4 * 4 * 2);
end;
PlaneBlt3_RBGG := dest;
end;
{$ENDIF X86_ASSEMBLER}
procedure fakemode_load(src: PByte; wvr: Boolean);
var
dest, d: DWord;
w, s: Integer;
begin
dest := $A0000;
case m_fake_type of
FAKEMODE1A :
for w := 0 to 24 do
begin
{plane 0}
outportw($3C4, $102);
PlaneBlt1_RGB(src + 0, dest, 8);
{plane 1}
outportw($3C4, $202);
PlaneBlt1_RGB(src + 2, dest, 8);
{plane 2}
outportw($3C4, $402);
PlaneBlt1_RGB(src + 4, dest, 8);
{plane 3}
outportw($3C4, $802);
dest := PlaneBlt1_RGB(src + 6, dest, 8);
Inc(src, 320 * 4 * 4);
end;
FAKEMODE1B :
for w := 0 to 24 do
begin
{plane 0}
outportw($3C4, $102);
d := PlaneBlt1_RBG(src + (4*4*2*20*0), dest, 1);
d := PlaneBlt1_GRB(src + (4*4*2*20*1), d, 1);
d := PlaneBlt1_RBG(src + (4*4*2*20*2), d, 1);
d := PlaneBlt1_GRB(src + (4*4*2*20*3), d, 1);
d := PlaneBlt1_RBG(src + (4*4*2*20*4), d, 1);
d := PlaneBlt1_GRB(src + (4*4*2*20*5), d, 1);
d := PlaneBlt1_RBG(src + (4*4*2*20*6), d, 1);
d := PlaneBlt1_GRB(src + (4*4*2*20*7), d, 1);
{plane 1}
outportw($3C4, $202);
d := PlaneBlt1_GRB(src + 2 + (4*4*2*20*0), dest, 1);
d := PlaneBlt1_RBG(src + 2 + (4*4*2*20*1), d, 1);
d := PlaneBlt1_GRB(src + 2 + (4*4*2*20*2), d, 1);
d := PlaneBlt1_RBG(src + 2 + (4*4*2*20*3), d, 1);
d := PlaneBlt1_GRB(src + 2 + (4*4*2*20*4), d, 1);
d := PlaneBlt1_RBG(src + 2 + (4*4*2*20*5), d, 1);
d := PlaneBlt1_GRB(src + 2 + (4*4*2*20*6), d, 1);
d := PlaneBlt1_RBG(src + 2 + (4*4*2*20*7), d, 1);
{plane 2}
outportw($3C4, $402);
d := PlaneBlt1_RBG(src + 4 + (4*4*2*20*0), dest, 1);
d := PlaneBlt1_GRB(src + 4 + (4*4*2*20*1), d, 1);
d := PlaneBlt1_RBG(src + 4 + (4*4*2*20*2), d, 1);
d := PlaneBlt1_GRB(src + 4 + (4*4*2*20*3), d, 1);
d := PlaneBlt1_RBG(src + 4 + (4*4*2*20*4), d, 1);
d := PlaneBlt1_GRB(src + 4 + (4*4*2*20*5), d, 1);
d := PlaneBlt1_RBG(src + 4 + (4*4*2*20*6), d, 1);
d := PlaneBlt1_GRB(src + 4 + (4*4*2*20*7), d, 1);
{plane 3}
outportw($3C4, $802);
d := PlaneBlt1_GRB(src + 6 + (4*4*2*20*0), dest, 1);
d := PlaneBlt1_RBG(src + 6 + (4*4*2*20*1), d, 1);
d := PlaneBlt1_GRB(src + 6 + (4*4*2*20*2), d, 1);
d := PlaneBlt1_RBG(src + 6 + (4*4*2*20*3), d, 1);
d := PlaneBlt1_GRB(src + 6 + (4*4*2*20*4), d, 1);
d := PlaneBlt1_RBG(src + 6 + (4*4*2*20*5), d, 1);
d := PlaneBlt1_GRB(src + 6 + (4*4*2*20*6), d, 1);
dest := PlaneBlt1_RBG(src + 6 + (4*4*2*20*7), d, 1);
Inc(src, 320*4*4);
end;
FAKEMODE1C :
for w := 0 to 24 do
begin
{plane 0}
outportw($3C4, $102);
PlaneBlt1_RBG(src + 0, dest, 8);
{plane 1}
outportw($3C4, $202);
PlaneBlt1_GRB(src + 2, dest, 8);
{plane 2}
outportw($3C4, $402);
PlaneBlt1_RBG(src + 4, dest, 8);
{plane 3}
outportw($3C4, $802);
dest := PlaneBlt1_GRB(src + 6, dest, 8);
Inc(src, 320 * 4 * 4);
end;
FAKEMODE2A :
for w := 0 to 24 do
begin
{plane 0}
outportw($3C4, $102);
PlaneBlt2_RBG(src + 0, dest, 8);
{plane 1}
outportw($3C4, $202);
PlaneBlt2_RBG(src + 2, dest, 8);
{plane 2}
outportw($3C4, $402);
PlaneBlt2_RBG(src + 4, dest, 8);
{plane 3}
outportw($3C4, $802);
dest := PlaneBlt2_RBG(src + 6, dest, 8);
Inc(src, 320 * 4 * 4);
end;
FAKEMODE2B :
for w := 0 to 24 do
begin
{plane 0}
outportw($3C4, $102);
d := PlaneBlt2_RBG(src + (4*4*2*20*0), dest, 1);
d := PlaneBlt2_GBR(src + (4*4*2*20*1), d, 1);
d := PlaneBlt2_RBG(src + (4*4*2*20*2), d, 1);
d := PlaneBlt2_GBR(src + (4*4*2*20*3), d, 1);
d := PlaneBlt2_RBG(src + (4*4*2*20*4), d, 1);
d := PlaneBlt2_GBR(src + (4*4*2*20*5), d, 1);
d := PlaneBlt2_RBG(src + (4*4*2*20*6), d, 1);
d := PlaneBlt2_GBR(src + (4*4*2*20*7), d, 1);
{plane 1}
outportw($3C4, $202);
d := PlaneBlt2_GBR(src + 2 + (4*4*2*20*0), dest, 1);
d := PlaneBlt2_RBG(src + 2 + (4*4*2*20*1), d, 1);
d := PlaneBlt2_GBR(src + 2 + (4*4*2*20*2), d, 1);
d := PlaneBlt2_RBG(src + 2 + (4*4*2*20*3), d, 1);
d := PlaneBlt2_GBR(src + 2 + (4*4*2*20*4), d, 1);
d := PlaneBlt2_RBG(src + 2 + (4*4*2*20*5), d, 1);
d := PlaneBlt2_GBR(src + 2 + (4*4*2*20*6), d, 1);
d := PlaneBlt2_RBG(src + 2 + (4*4*2*20*7), d, 1);
{plane 2}
outportw($3C4, $402);
d := PlaneBlt2_RBG(src + 4 + (4*4*2*20*0), dest, 1);
d := PlaneBlt2_GBR(src + 4 + (4*4*2*20*1), d, 1);
d := PlaneBlt2_RBG(src + 4 + (4*4*2*20*2), d, 1);
d := PlaneBlt2_GBR(src + 4 + (4*4*2*20*3), d, 1);
d := PlaneBlt2_RBG(src + 4 + (4*4*2*20*4), d, 1);
d := PlaneBlt2_GBR(src + 4 + (4*4*2*20*5), d, 1);
d := PlaneBlt2_RBG(src + 4 + (4*4*2*20*6), d, 1);
d := PlaneBlt2_GBR(src + 4 + (4*4*2*20*7), d, 1);
{plane 3}
outportw($3C4, $802);
d := PlaneBlt2_GBR(src + 6 + (4*4*2*20*0), dest, 1);
d := PlaneBlt2_RBG(src + 6 + (4*4*2*20*1), d, 1);
d := PlaneBlt2_GBR(src + 6 + (4*4*2*20*2), d, 1);
d := PlaneBlt2_RBG(src + 6 + (4*4*2*20*3), d, 1);
d := PlaneBlt2_GBR(src + 6 + (4*4*2*20*4), d, 1);
d := PlaneBlt2_RBG(src + 6 + (4*4*2*20*5), d, 1);
d := PlaneBlt2_GBR(src + 6 + (4*4*2*20*6), d, 1);
dest := PlaneBlt2_RBG(src + 6 + (4*4*2*20*7), d, 1);
Inc(src, 320*4*4);
end;
FAKEMODE2C :
for w := 0 to 24 do
begin
{plane 0}
outportw($3C4, $102);
PlaneBlt2_RBG(src + 0, dest, 8);
{plane 1}
outportw($3C4, $202);
PlaneBlt2_GBR(src + 2, dest, 8);
{plane 2}
outportw($3C4, $402);
PlaneBlt2_RBG(src + 4, dest, 8);
{plane 3}
outportw($3C4, $802);
dest := PlaneBlt2_GBR(src + 6, dest, 8);
Inc(src, 320 * 4 * 4);
end;
FAKEMODE3A: begin
for w := 0 to 15 do
begin
{plane 0}
outportw($3C4, $102);
PlaneBlt3_RGBRGB(src + 0, dest, 4);
{plane 1}
outportw($3C4, $202);
PlaneBlt3_RGBRGB(src + 2, dest, 4);
{plane 2}
outportw($3C4, $402);
PlaneBlt3_RGBRGB(src + 4, dest, 4);
{plane 3}
outportw($3C4, $802);
dest := PlaneBlt3_RGBRGB(src + 6, dest, 4);
Inc(src, 320 * 4 * 2 * 3);
end;
s := (4*4*2*20) + (320*2*2*2);
outportw($3C4, $102);
d := PlaneBlt3_RGBRGB(src, dest, 2);
PlaneBlt3_RGBR(src + s, d, 1);
outportw($3C4, $202);
d := PlaneBlt3_RGBRGB(src + 2, dest, 2);
PlaneBlt3_RGBR(src + s + 2, d, 1);
outportw($3C4, $402);
d := PlaneBlt3_RGBRGB(src + 4, dest, 2);
PlaneBlt3_RGBR(src + s + 4, d, 1);
outportw($3C4, $802);
d := PlaneBlt3_RGBRGB(src + 6, dest, 2);
PlaneBlt3_RGBR(src + s + 6, d, 1);
end;
FAKEMODE3B: begin
for w := 0 to 15 do
begin
{plane 0}
outportw($3C4, $102);
PlaneBlt3_GRBRBG(src + 0, dest, 4);
{plane 1}
outportw($3C4, $202);
PlaneBlt3_RBGGRB(src + 2, dest, 4);
{plane 2}
outportw($3C4, $402);
PlaneBlt3_GRBRBG(src + 4, dest, 4);
{plane 3}
outportw($3C4, $802);
dest := PlaneBlt3_RBGGRB(src + 6, dest, 4);
Inc(src, 320 * 4 * 2 * 3);
end;
s := (4*4*2*20) + (320*2*2*2);
outportw($3C4, $102);
d := PlaneBlt3_GRBRBG(src, dest, 2);
PlaneBlt3_GRBR(src + s, d, 1);
outportw($3C4, $202);
d := PlaneBlt3_RBGGRB(src + 2, dest, 2);
PlaneBlt3_RBGG(src + s + 2, d, 1);
outportw($3C4, $402);
d := PlaneBlt3_GRBRBG(src + 4, dest, 2);
PlaneBlt3_GRBR(src + s + 4, d, 1);
outportw($3C4, $802);
d := PlaneBlt3_RBGGRB(src + 6, dest, 2);
PlaneBlt3_RBGG(src + s + 6, d, 1);
end;
FAKEMODE3C: begin
for w := 0 to 15 do
begin
{plane 0}
outportw($3C4, $102);
PlaneBlt3_GRBGRB(src + 0, dest, 4);
{plane 1}
outportw($3C4, $202);
PlaneBlt3_RBGRBG(src + 2, dest, 4);
{plane 2}
outportw($3C4, $402);
PlaneBlt3_GRBGRB(src + 4, dest, 4);
{plane 3}
outportw($3C4, $802);
dest := PlaneBlt3_RBGRBG(src + 6, dest, 4);
Inc(src, 320 * 4 * 2 * 3);
end;
s := (4*4*2*20) + (320*2*2*2);
outportw($3C4, $102);
d := PlaneBlt3_GRBGRB(src, dest, 2);
PlaneBlt3_GRBG(src + s, d, 1);
outportw($3C4, $202);
d := PlaneBlt3_RBGRBG(src + 2, dest, 2);
PlaneBlt3_RBGR(src + s + 2, d, 1);
outportw($3C4, $402);
d := PlaneBlt3_GRBGRB(src + 4, dest, 2);
PlaneBlt3_GRBG(src + s + 4, d, 1);
outportw($3C4, $802);
d := PlaneBlt3_RBGRBG(src + 6, dest, 2);
PlaneBlt3_RBGR(src + s + 6, d, 1);
end;
end;
if wvr then
wait_retrace;
end;
end.