home *** CD-ROM | disk | FTP | other *** search
-
- program multicolourtextscroll;
- uses crt;
- const sseg : word = $b800; hi = 16; wideness = 1;
- txt : string = 'Multicoloured smooth text scroller! ';
- maxcols = 17; cols : array[0..maxcols] of byte =
- (8, 8, 8, 7, 8, 7, 7, 15, 7, 15, 15, 15, 7, 15, 7, 7, 8, 7);
- var idx : word; i, cur, line, bitpos : byte;
- ccol : byte; colw : byte; ch : char;
-
- 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 movecharsleft(startingrow : word); assembler;
- asm
- push ds;
- mov ax,$b800;
- mov ds,ax;
- mov di,2
- @@MoveByte:
- add di,startingrow;
- mov al,[ds:di];
- sub di,2
- mov [ds:di],al;
- sub di,startingrow;
- add di,4
- cmp di,160
- jl @@MoveByte;
- pop ds
- end;
-
- procedure movecolsright(startingrow : word); assembler;
- asm
- push ds
- mov ax,$b800
- mov ds,ax
- mov di,161
- @@MoveByte:
- add di,startingrow
- sub di,4
- mov al,[ds:di]
- add di,2
- mov [ds:di],al
- sub di,startingrow
- cmp di,0001
- ja @@MoveByte
- pop ds
- end;
-
-
- begin
- textattr := 7; clrscr; ccol := 1; idx := 1; colw := 0;
- repeat
- inc(colw);
- retrace;
- mem[$b800:hi*160+158] := ord(txt[idx]);
- movecharsleft(hi*160);
- if (colw > 1) then begin
- colw := 0; inc(ccol);
- mem[$b800:hi*160+1] := cols[ccol mod (maxcols+1)];
- movecolsright(hi*160);
- end;
- if not keypressed then idx := 1 + idx mod length(txt);
- until keypressed;
- while keypressed do ch := readkey; textattr := 7; clrscr;
- end.
-
- The push/pop ds might be superfluous... I don't know if you need them or not...
- I'm just starting assembly, you know. :^)
- It's kinda like the one you made, but it doesn't lock up on my computer -- you
- can't check port[$60] on XTs. :^)
- And in this, the colours move one way, and the text, the other. It's kinda
- distracting when you're trying to read the scroll, but oh well...
- C-YA.
-