[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]
{
SEAN PALMER
>Okay, I've got this small problem porting one of my assembler routines
>into pascal. It's a simple coppering routine (multiple setting of the
>same palette register for trippy effects :), and i can't seem to use it
>in my code.. I'll post the code here now (it's fairly short), and if
>someone could help me out here, i'd be most grateful - since my
>assembler/pascal stuff isn't too great..
I imported it, but couldn't get it to work (several problems in the
source) and in the process of getting it to work (for one thing I didn't
know what it was supposed to accomplish in the first place) I added a
few things to it and this probably isn't what you wanted it to look like
but it wouldn't be hard to do now that it's in TP-acceptable form.
I also added one other small palette flipper that's kind of neat.
}
{$G+}
uses
crt;
procedure copperBars(var colors; lines : word; regNum, count : byte); assembler;
var
c2 : byte;
asm
{
okay, Colors is a pointer to the variable array of
colours to use (6bit rgb values to pump to the dac)
Lines is the number of scanlines on the screen (for syncing)
RegNum is the colour register (DAC) to use.
valid values are 0-255. that should explain that one.
Count is the number of cycles updates to do before it exits.
}
push ds
mov ah, [RegNum]
mov dx, $3DA {vga status port}
mov bl, $C8 {reg for DAC}
cli
cld
@V1:
in al, dx
test al, 8
jz @V1 {vertical retrace}
@V2:
in al, dx
test al, 8
jnz @V2
mov c2, 1
mov di, [lines]
@UPDATER:
mov bh, c2
inc c2
lds si, [colors]
{now,just do it.}
@NIKE:
mov cx, 3
mov dl, $DA
@H1:
in al, dx
and al, 1
jz @H1 {horizontal retrace}
mov al, ah {color}
mov dl, bl
out dx, al
inc dx
rep outsb {186 instruction...}
mov dl, $DA
@H2:
in al, dx
and al, 1
jnz @H2;
dec di
jz @X
dec bh
jnz @NIKE
jmp @UPDATER
@X:
dec count
jnz @V1
sti {enable interrupts}
End;
procedure freakout0(lines : word; count : byte); assembler;
asm
mov dx, $3DA {vga status port}
cli
cld
@V1:
(* in al, dx
test al, 8
jz @V1 {vertical retrace}
@V2:
in al, dx
test al, 8
jnz @V2
*)
mov di,[lines]
@L:
mov dl, $C8
mov al, 0 {color}
out dx, al
inc dx
mov al, bh
out dx, al
add al, 20
out dx, al
out dx, al
add bh, 17
mov dl, $DA
in al, dx
test al, 1
jz @L; {until horizontal retrace}
dec di
jnz @L
mov dl, $DA
dec count
jnz @V1
sti {enable interrupts}
End;
const
pal : array [0..3 * 28 - 1] of byte =
(2,4,4,
4,8,8,
6,12,12,
8,16,16,
10,20,20,
12,24,24,
14,28,28,
16,32,32,
18,36,36,
20,40,40,
22,44,44,
24,48,48,
26,52,52,
26,52,52,
28,56,56,
28,56,56,
30,60,60,
30,60,60,
30,60,60,
33,63,63,
33,63,63,
33,63,63,
33,63,63,
33,63,63,
30,60,60,
28,56,56,
26,52,52,
24,48,48);
var
i : integer;
begin
asm
mov ax, $13
int $10
end;
for i := 50 to 149 do
fillchar(mem[$A000 : i * 320 + 50], 220, 1);
repeat
copperBars(pal, 398, 0, 8); {398 because of scan doubling}
until keypressed;
readkey;
repeat
freakout0(398, 8); {398 because of scan doubling}
until keypressed;
readkey;
asm
mov ax, 3
int $10
end;
end.
[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]