[Back to SCROLL SWAG index] [Back to Main SWAG index] [Original]
program heavily_tweaked_textscroll;
uses crt;
const sseg : word = $b800; hi = 16; grd = 3; wideness = 1;
grade : string = '.:|X#';
txt : string = 'This simple old text scroll is really getting tweaked!'
+ ' In fact, it''s not so simple anymore... ';
var fseg, fofs : word; idx : word; i, cur, line, bitpos : byte;
jcol : byte; ch : char; widecount : byte;
procedure getfont; assembler; asm
mov ax,1130h; mov bh,3; int 10h; mov fseg,es; mov fofs,bp; end;
procedure retrace; assembler; asm
mov dx,3dah;
@l1: in al,dx; test al,8; jnz @l1;
@l2: in al,dx; test al,8; jz @l2; end;
procedure moverowleft(startingrow : word); assembler;
asm { sorry, I had to smush it a bit }
push ds; push es { do I really need to save es? }
mov ax,$b800; mov es,ax; mov ds,ax; mov cx,0003
@@MoveByte:
add cx,startingrow; mov di,cx; mov al,[es:di]
sub cx,startingrow; sub cx,2; add cx,startingrow
mov si,cx; mov [ds:si],al; sub cx,startingrow
add cx,4; cmp cx,160
jl @@MoveByte
pop es; pop ds
end;
begin
getfont; textattr := 15; clrscr;
fillchar(mem[$b800:0],4000,0);
for idx := hi to (hi+7) do for jcol := 0 to length(grade)-1 do begin
for i := grd*jcol to 79-(grd*jcol) do
mem[sseg:idx*160+i*2] := Ord(grade[jcol+1]);
end;
idx := 1; jcol := 15;
repeat
cur := ord(txt[idx]);
inc(jcol); if (jcol > 15) then jcol := 1;
bitpos := 0;
repeat
for widecount := 1 to wideness do begin
for line := 0 to 7 do begin
(* jcol := random(14) + 1; *)
if ((mem[fseg:fofs+cur*8+line] shl bitpos) and 128) <> 0 then
mem[sseg:158+(line+hi)*160+1] := jcol
else
mem[sseg:158+(line+hi)*160+1] := 0;
end;
retrace;
for line := 0 to 7 do moverowleft((line+hi)*160);
end;
inc(bitpos);
until (bitpos > 7) or keypressed;
if not keypressed then idx := 1 + idx mod length(txt);
until keypressed;
while keypressed do ch := readkey;
textattr := 7; clrscr;
end.
[Back to SCROLL SWAG index] [Back to Main SWAG index] [Original]