{ 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.