
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.

