Skip to content

Instantly share code, notes, and snippets.

@specht
Created October 22, 2018 21:12
Show Gist options
  • Save specht/51c55f9cd3558378cef5a31de7e35822 to your computer and use it in GitHub Desktop.
Save specht/51c55f9cd3558378cef5a31de7e35822 to your computer and use it in GitHub Desktop.
uses Crt, Dos, VGA;
var phi, rho, tau, scale, x, y: Real;
ix, iy: Integer;
tx, ty, sx, sy, i: Integer;
u, v, ul, vl: LongInt;
ut, vt: LongInt;
dxu, dyu, dxv, dyv: LongInt;
offset: Word;
color: Integer;
texture: Pointer;
texseg: Word;
{ This is a rotozoomer. The procedure calc_uv returns u and v texture
coordinates for a given screen space pixel x, y, using three angles
phi, rho and tau. }
procedure calc_uv(x, y: Integer; phi, rho, tau: Real; var u, v: LongInt);
var ru, rv, tu, tv: Real;
scale: Real;
begin
{ transform to center of screen }
ru := x - 160;
rv := y - 100;
{ moving center }
{ move the center around}
ru := ru - cos(tau) * 40;
rv := rv - sin(tau) * 40;
{ scale }
{ scale according to some sine function value }
scale := (((sin(rho) + 1.0) * 0.5) * 0.7 + 1.3);
ru := ru / scale;
rv := rv / scale;
{ rotate }
{ rotate by -phi }
tu := ru; tv := rv;
ru := tu * cos(-phi) - tv * sin(-phi);
rv := tv * cos(-phi) + tu * sin(-phi);
{ convert to fixed point }
{ up to here, we have dealt with real numbers, let's convert them
to fixed point (15.16)! }
u := Trunc(ru * 65536);
v := Trunc(rv * 65536);
end;
{ This procedure loads a PCX file. }
procedure LoadPCX(filename: String);
var f: File;
header: array[0..127] of Byte;
count, i: Byte;
color: array[0..2] of Byte;
offset: LongInt;
begin
Assign(f, filename);
Reset(f, 1);
BlockRead(f, header, 128);
{ Basically we just skip the 128 header bytes and read the pixel
values. }
repeat
{ Read a pixel. }
BlockRead(f, i, 1);
{ RLE compression: if the value is >= 192 (bits 6 and 7 are set),
this is not a single pixel, but a span of pixels. To obtain the
span length, subtract 192 (clear bits 6 and 7) and read the next
byte in the file to obtain the pixel color. }
if i >= 192 then begin
count := i - 192;
BlockRead(f, i, 1);
{ Draw the pixel count times. }
while count > 0 do begin
Mem[texseg:offset] := i;
Inc(offset);
Dec(count);
end;
end else begin
{ Not a span, just a plain old pixel. }
Mem[texseg:offset] := i;
Inc(offset);
end;
{ We know our image is 128 x 128 pixels big. }
until offset > 128 * 128;
{ Finally, read the palette. }
Seek(f, FileSize(f) - 768);
for i := 0 to 255 do begin
BlockRead(f, color, 3);
{ RGB values are encoded with 8 bits in the PCX file, but
our VGA mode requires 6 bits (0..63 only), so we shift
values right by 2. }
SetPalette(i, color[0] shr 2, color[1] shr 2, color[2] shr 2);
end;
Close(f);
end;
begin
SetMode($13);
{ Allocate 16k of Heap memory }
GetMem(texture, 128 * 128);
texseg := Seg(texture^);
{ Load the texture. }
LoadPCX('tex1.pcx');
{ Initialize angles to zero. }
phi := 0; rho := 0; tau := 0;
repeat
{ Calculate u and v for the pixel in the upper left screen corner
at 0, 0. }
calc_uv(0, 0, phi, rho, tau, ul, vl);
{ Now we calculate the rate of change for u and v in regard to
a step of one pixel to the right (dxu and dxv). To get the value,
we calculate u and v for the pixel at 1, 0 and subtract the
u and v values. }
calc_uv(1, 0, phi, rho, tau, ut, vt);
dxu := ut - ul;
dxv := vt - vl;
{ Do the same for y increase: dyu, dyv. }
calc_uv(0, 1, phi, rho, tau, ut, vt);
dyu := ut - ul;
dyv := vt - vl;
offset := 0;
{ Wait for v blank! }
WaitSync;
{ Now iterate through every screen line... }
for sy := 0 to 199 do begin
{ Reset u and v to the values we calculated initially
(they will later be increased by dyu and dyv). }
u := ul; v := vl;
{ Iterate through every pixel in the screen line... }
for sx := 0 to 319 do begin
{ Increase u and v. }
u := u + dxu; v := v + dxv;
{ Calculate texture coordinates from u and v by shifting
right by 16 (remember we had 16 bits decimal precision)
and clamping the result to the texture range of 0..127.
AND 0x7F means zero out all bits except the lowest 7. }
tx := (u shr 16) and $7f;
ty := (v shr 16) and $7f;
{ Fetch the color from the texture. }
color := Mem[texseg:(ty shl 7 or tx)];
{ Draw the pixel to the screen. }
Mem[$A000:offset] := color;
offset := offset + 1;
end;
{ Advance ul and vl by one step in the y direction. }
ul := ul + dyu; vl := vl + dyv;
end;
{ Advance the angles. }
phi := phi + (sin(rho + tau * 0.1) + 0.2) * 0.02;
rho := rho + 0.0134;
tau := tau + 0.03;
until KeyPressed;
SetMode(3);
FreeMem(texture, 128 * 128);
{ That's all folks! }
{ Now let's try this thing out... :-) }
end.
unit VGA;
Interface
procedure SetMode(mode: Integer);
procedure Clear;
procedure SetPixel(x, y: Integer; color: Byte);
function GetPixel(x, y: Integer): Byte;
procedure SetPalette(num,r,g,b: Byte);
procedure GetPalette(num: Byte; var r,g,b: Byte);
procedure WaitSync;
procedure DrawLine(x1,y1,x2,y2: Integer; col: Byte);
Implementation
procedure SetMode(mode: Integer); Assembler;
asm
mov ax, mode
int 10h
end;
procedure Clear; Assembler;
asm
push 0A000h
pop es
xor di, di
mov cx, 16000
db 66h
xor ax, ax
db 66h
rep stosw
end;
procedure SetPixel(x, y: Integer; color: Byte); Assembler;
asm
mov di, y
mov bx, di
shl di, 6
shl bx, 8
add di, bx
add di, x
mov al, color
push 0A000h
pop es
stosb
end;
function GetPixel(x, y: Integer): Byte; Assembler;
asm
mov di, y
mov bx, di
shl di, 6
shl bx, 8
add di, bx
add di, x
push 0A000h
pop es
mov al, es:[di]
end;
procedure SetPalette(num,r,g,b: Byte); Assembler;
asm
mov dx,3C8h
mov al,num
out dx,al
cli
mov dx,3C9h
mov al,r
out dx,al
mov al,g
out dx,al
mov al,b
out dx,al
sti
end;
procedure GetPalette(num: Byte; var r,g,b: Byte); Assembler;
asm
mov dx,3C7h
mov al,num
out dx,al
cli
mov dx,3C9h
in al,dx
les bx,r
mov es:[bx],al
in al,dx
les bx,g
mov es:[bx],al
in al,dx
les bx,b
mov es:[bx],al
sti
end;
procedure WaitSync; Assembler;
asm
mov dx,3DAh
@l1:
in al,dx
test al,1
jnz @l1
@l2:
in al,dx
test al,8
jz @l2
end;
procedure Swap(var x, y: Integer);
var t: Integer;
begin
t := x;
x := y;
y := t;
end;
procedure DrawLine(x1, y1, x2, y2: Integer; col: Byte);
var dx, dy, dab, inca, incb, x, y, h1, h2: Integer;
begin
if (x1 = x2) and (y1 = y2) then SetPixel(x1, y1, col) else begin
if x1 > x2 then begin
Swap(x1, x2);
Swap(y1, y2);
end;
dx := x2 - x1;
dy := y2 - y1;
h1 := dx;
h2 := dy;
if (dx < -dy) and (dy < 0) then begin
y1 := -y1;
y2 := -y2;
Swap(x1, y1);
Swap(x2, y2);
end;
if (dx >= -dy) and (dy < 0) then begin
y1 := -y1;
y2 := -y2;
end;
if (dx <= dy) and (dy > 0) then begin
Swap(x1, y1);
Swap(x2, y2);
end;
dx := x2 - x1;
dy := y2 - y1;
dab := 2 * dy - dx;
inca:=2 * (dy - dx);
incb:=2 * dy;
x := x1;
y := y1;
if (h1 < -h2) and (h2 < 0) then SetPixel(y, -x, col);
if (h1 >= -h2) and (h2 < 0) then SetPixel(x, -y, col);
if (h1 > h2) and (h2 >= 0) then SetPixel(x, y, col);
if (h1 <= h2) and (h2 > 0) then SetPixel(y, x, col);
for x:=x1 + 1 to x2 do begin
if dab < 0 then Inc(dab, incb) else begin
Inc(dab, inca);
Inc(y);
end;
if (h1 < -h2) and (h2 < 0) then SetPixel(y, -x, col);
if (h1 >= -h2) and (h2 < 0) then SetPixel(x, -y, col);
if (h1 > h2) and (h2 >= 0) then SetPixel(x, y, col);
if (h1 <= h2) and (h2 > 0) then SetPixel(y, x, col);
end;
end;
end;
end.
@specht
Copy link
Author

specht commented Oct 22, 2018

Create texture with:

echo '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
H5J/oky/ZhXUdLl/Hv8OfLqSZ8gqaNwNB/JE4sy1dmVSf7JoYPvxD0cIvVvAY3ks7VPq0rE1ayO5
OEhvJTWXjsTrjoR5nSF9uLSO1TeiqyKLXRWqvoJwDy9rSw9wM/dVVCsl5b54lKq3VSkSJEjSy9TJ
tWNetahjPzG0f5Bf4b+GhDEPCfPeX33aD7RpYpp6B4yLg61N4OmVT61aY+/mAU/basgZSRjqay4+
RogR6HbmQ7kYEy6dvpOC0zKvskDmvXVCZMQ+HbnXhxRXVTqCzFJB75qAB8RG8ddbWtiu3hDsyC2r
01bTZWroba3OQv3MKhsoym4e8kBR/Y6zhQCNv+PU/5d/0DoNEdKgbRiDQjpvC8h+15ReAeCME9A7
VjNqUHC0Q9DtS2ZH9rRWdcFJton5hzyJitSoqevW08L6ObzaI3K3whyT3mndiMZYVawpheJnV6xY
brtihflzz3Jsn3OysbZfZ7l+/brNts++6OTk4vSCu5O924sbPZ0tN2/a5LbJSfiSpf/fnYI83Hd6
/I33d3eep//fvbl+Xi95eftuD/IJeDloe9DLYUEvhbzCjQj0fmVbcOjLvvsDNuziBwW/yhe+GrRz
F1/+quPu0J0RwlcFuwWRoZHJIR5xobx44U7h65GxYS/H7g77R3iEKDxsX9hr4a/HvrF7b+w/BBGi
f0SJhG/EHDgQuycuNjJ63xux+/bE7Q3bty9y3964YzHbM2N3pMfuVoj5sv279x1QHN3nJxfvVeyP
LNgXKIvbeyAhKTE+Lj5BIk2IksXJ4g/GHTy4ryDBv/INX6k8USpLV8ikqbKEg0npSUkJKbIjickK
leT1fNmriuTUt+V7M5IOH5cLUxVvHEmOO5okzUrZm5ssOqKUpRx+MzNVmZKWkZYmS01Tvn0kKfvI
sYLMtLePHM7IPlZw5FB2duqR7KwjR/PT3szLOXqkLiu8PnN/yVHFhxnhdUcSq7IPlGdL3z26t/bN
vbnHSgqP5RW8k/xO3tvl7yTn5WUX56a/k1uWn3u8/O1jb+aXFudmF+a+k5N//HhJeZGqpqo4r67o
eF3xsQpVsaq0uKw0v6ykoue49MOi9HaVVKOKbyk50lymbCo7WldaU1txtL1UWV35TmlFa2tl0rtV
qqqayprq+qrq92trSpqrCj6oLGuorqx/74OOd1Xvv1fT0dDxftMHLU2N9e91v/t+44mmmg/eL3n3
vY7Wps6Bd/OHGnO6muq0TWWD7x3pez+n872Wxg/0XR8c72xr7TihbulQt3W0dZ94T91R09be29Ku
056o6Wzr7+h4b1RT0t+l6ek5oetq13b3dfV2dfb29/e+191zcqyraai3Zrjng56+T0591D380cDg
YPdHgwPDgyf0uqH+k0O6wdFPT42MfHxuaPST06MfjX386anRUx+fHv9sVDN+WgdwygAXz8DEZ+PG
MxPdYPzn5LmLFz83TJ6bn8J8YUo3M3Xhq/MXzl+Ynp86Mzu3cOuLCwuXZ65evTw//82DB//+PxHS
Sc67UgAA' | base64 -d | gzip -d > tex1.pcx

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment