home *** CD-ROM | disk | FTP | other *** search
- {
- RE: Re: Virtual Reality.
- BY: Bas van Gaalen to John Shipley on Fri Mar 25 1994 02:26 pm
-
- > John Shipley wrote in a message to Bas van Gaalen:
- >
- > > I posted it recently, so you must have seen it passing by...
- > JS> You did? I read just about every post you write, I didn't
- > JS> see any program by that name come by here.
- >
- > I suppose it got lost. You're the second... Anyway, I posted it again. Check
- > previous message... It should be there.
-
- Hello Bas!
-
- Yes, I got it today... basically the problem I saw with the code was lack of
- optimization and it also looked like you were trying to do too much. You
- didn't need all the asm. But it could be even faster if you included it. I'm
- sending back my modified version of your DYCP program. The "writecharasm"
- procedure was screwed up so I removed it and I will check it out at a later
- time. I modified the "writechar" procedure which you had commented out.
-
- -------8<---------Snip---------8<---------Snip---------8<--------Snip---------
-
- {$G+}
- PROGRAM different_y_char_position;
-
- (* Programmed by Bas van Gaalen, Holland, PD *)
- (* Modified by John Shipley, USA, PD 03/30/94 *)
-
- USES CRT;
-
- CONST vseg : WORD = $a000;
- txt : STRING = '**** Well... 38 chars, let''s see. ****';
- (* 12345678901234567890123456 78901234567890 *)
- txt1 : STRING = 'This is another Strng of 38 Characters';
- VAR stab : ARRAY[0..255] OF BYTE;
- fseg,fofs : WORD;
-
- PROCEDURE getfont; ASSEMBLER;
- ASM
- mov ax,1130h;
- mov bh,1;
- int 10h;
- mov fseg,es;
- mov fofs,bp;
- END;
-
- PROCEDURE csin;
- VAR i : BYTE;
- BEGIN
- for i := 0 to 255 do stab[i] := round(sin(6*i*pi/255)*25)+40;(*150*)
- END;
-
- PROCEDURE clear(x,y: WORD); ASSEMBLER;
- ASM
- mov es,vseg
- mov dx,0
- @lout:
- mov cx,0
- @lin:
- mov ax,y
- add ax,dx
- shl ax,6
- mov di,ax
- shl ax,2
- add di,ax
- add di,x
- add di,cx
- xor ax,ax
- mov [es:di],ax
- add cx,2
- cmp cx,8
- jne @lin
- inc dx
- cmp dx,2 (* Was 8 *)
- jne @lout
- END;
-
- PROCEDURE writechar(ch: CHAR; x,y: WORD; col: BYTE);
- VAR j,k : BYTE;
- pre : WORD;
- opt : WORD;
- BEGIN
- pre := BYTE(ch)*8; (* Opt *)
- clear(x,y-2); (* Key *)
- FOR j:=0 TO 7 DO
- FOR k:=0 TO 7 DO
- BEGIN
- opt := (y+j)*320+x+k; (* Opt *)
- IF ((MEM[fseg:fofs+pre+j] SHL k) AND 128)=0 THEN
- MEM[$a000:opt] := 0 (* Key *)
- ELSE
- MEM[$a000:opt] := col;
- END;
- INC(y,8); (* Opt *)
- clear(x,y); (* Key *)
- END;
-
- PROCEDURE dodycp;
- VAR sctr,i,l: BYTE;
- a,b,c : WORD;
- BEGIN
- sctr := 0;
- l := LENGTH(txt); (* Opt *)
- REPEAT
- WHILE (PORT[$3da] AND 8)<>0 DO;
- WHILE (PORT[$3da] AND 8)=0 DO;
- FOR i := 1 TO l DO
- BEGIN
- a := i*8;
- b := stab[(sctr+2*i) MOD 255];
- c := stab[sctr+i] MOD 64;
- INC(c,32);
- writechar(txt[i],a,b,c);
- INC(b,110);
- writechar(txt1[i],a,b,c);
- END;
- INC(sctr);
- UNTIL KEYPRESSED;
- END;
-
- BEGIN
- getfont;
- csin;
- ASM
- mov ax,13h;
- int 10h;
- END;
- dodycp;
- TEXTMODE(lastmode);
- END.