From 9ac1db7e103cc55ca05cecef18ef2fb2e348cb47 Mon Sep 17 00:00:00 2001 From: Frater Date: Fri, 22 Oct 2021 20:07:31 +0000 Subject: [PATCH] Upload New File --- GRAPHV2.PAS | 523 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 523 insertions(+) create mode 100644 GRAPHV2.PAS diff --git a/GRAPHV2.PAS b/GRAPHV2.PAS new file mode 100644 index 0000000..f4020f0 --- /dev/null +++ b/GRAPHV2.PAS @@ -0,0 +1,523 @@ +Unit GraphV2; +interface +Uses + CRT,DOS; +Const + NormEffect = 0; + FadeEffect = 1; + noViewEfct = 2; + GetMaxX = 319; + GetMaxY = 199; + CentreX = 160; + CentreY = 100; + VGA = $13; + On = True; + Off = False; + Screen : Pointer = Ptr($0000,$0000); +Type + RGB = Array[0..$300] of byte; +var + PageW : Pointer; + PageWS : Word; + PageWO : Word; + WriteS : Word; + +Procedure WaitVBL; + +Procedure GetRGB(Pal : Pointer); + +Procedure SetRGB(Pal : pointer); + +{ Assembler : } +Procedure InitGraph( Mode : Byte ); + +Procedure CloseGraph; + +Procedure PutPixel ( X,Y : Integer; + C : Byte); + +Function GetPixel ( X,Y : Integer) : Byte; + +Function GPixel ( X,Y : Integer) : Byte; + +Procedure ClearDevice(CColor : Byte); + +Procedure ViewPage; + +Procedure PaletteOff; + +{ Assembler } +Procedure FadeOut(First,Last : Word; Speed : Byte); + +Procedure FadeIn(first,Last : word; Pal: pointer; speed : Byte); + +Procedure FadeFromWhite(first,Last : word; Pal: pointer; Speed : Byte); + +Procedure FadeWhite(First,Last : Word; speed : Byte); + +Implementation +var + DirectV : Boolean; + + +Procedure WaitVBL; Assembler; +Asm + { Wait VBL } + push dx + push ax + Mov DX,$3DA +@W: in AL,DX + Test AL,$08 + Jne @W + +@X: in AL,DX + test AL,$08 + Je @X + pop ax + pop dx +end; + +Procedure GetRGB( Pal : pointer); Assembler; +Asm + Les DI,[Pal] + cld + Xor CX,CX +@Beg: + Mov DX,$3C8 + Mov AL,CL + Out DX,AL + Inc DX + In AL,DX + StosB + In AL,DX + StosB + In AL,DX + StosB + inc CX + cmp CX,$100 + jbe @beg + +End; + +Procedure SetRGB(Pal : pointer); Assembler; +Asm + Push DS + + Lds SI,[Pal] + cld + Xor CX,CX + Mov DX,$3C8 +@Beg: + Mov AL,CL + Out DX,AL + Inc DX + LodsB + Out DX,AL + Lodsb + Out DX,AL + Lodsb + Out DX,AL + inc CX + Dec DX + cmp CH,$00 + je @beg + + Pop DS +End; + +Procedure InitGraph( Mode : Byte ); +Begin + asm + Mov AH,$00 + Mov AL,&Mode + int $10 + End; + DirectV := False; + Getmem(pageW,$FFFF); + PageWS := Seg(PageW^); + WriteS := PageWS; + Screen := Ptr($A000,0000); + FillChar(PageW^,64000,0); +End; + +Procedure CloseGraph; +Begin + Asm + Mov AH,$00 + Mov AL,$03 + int $10 + End; + TextMode(CO80); + ClrScr; +End; + +Procedure PutPixel( X,Y : Integer; + C : Byte); Assembler; +asm + dec x + dec y + cmp X,319 { ; X > 320 Or x <0 } + ja @exit + cmp Y,199 { ; Y > 200 or Y < 0} + ja @exit + + mov ax,&WriteS + mov Es,ax + Imul ax,Y,$140 { Y*320 } + mov di,X + add di,ax { Bx := Bx+Ax } + mov al,c + stosb + +@exit: +End; + +Function GPixel( X,Y : Integer) : Byte; +Begin + GPixel := Mem[WriteS:(Y-1)*320+(X-1)]; +End; + +Function GetPixel ( X,Y : Integer) : Byte; +Begin + GetPixel := Mem[WriteS:(Y-1)*320+(X-1)] +End; + +Procedure ClearDevice(CColor : Byte); Assembler; +Asm + Mov CX,32000 + Mov AX,[WriteS] + Mov ES,AX + Xor DI,DI + Mov AH,[CColor] + Mov AL,AH + Rep StosW +End; + +Procedure ViewPage; Assembler; +Asm + Cmp &DirectV,0 + jne @exit + + Push DS + + Mov AX,$A000 + Mov ES,AX + Mov AX,&WriteS + Mov DS,AX + Mov CX,07D00h + Xor Si,Si + xor Di,Di + Rep MovsW + + Pop DS +@exit: +End; + +Procedure PaletteOff; +Var + INPal : RGB; +Begin + fillChar(InPal,sizeOf(RGB),0); + SetRGB(@InPal); +End; + +Procedure FadeOut(First,Last : Word; Speed : Byte); +Var + R,G,B : Byte; +Begin + Asm + PushA + mov bh,speed + cmp bh,0 + jne @ok + mov bh,1 +@ok: mov si,$40 +@Gb: + Mov cx,[First] + mov bl,bh + +@@wt:call waitvbl + dec bl + jnz @@wt + +@Rer: + { Get R,G,B } + Mov dx,$3C7 + Mov al,cl + Out dx,al + mov dx,$3C9 + + In al,dx + mov [r],Al + + In al,dx + mov [g],Al + + In al,dx + mov [b],Al + + { Decremente R,G,B } + cmp [r],0 + je @G1 + dec [R] + +@G1: cmp [g],0 + je @b1 + dec [g] + +@B1: cmp [B],0 + je @n1 + dec [B] + + { Write to DAC VGA } +@N1: Mov DX,$3C8 + mov al,cl + out dx,al + inc dx + + mov al,[r] + out dx,al + + mov al,[g] + out dx,al + + mov al,[b] + out dx,al + + inc cx + cmp cx,[Last] + jbe @rer + + dec Si + cmp si,-1 + jne @GB + PopA + End; +End; + +Procedure FadeIn(first,Last : word; Pal : pointer; Speed : Byte); +Var + R,G,B : Byte; +Begin + Asm + PushA + Push DS + mov bh,speed + cmp bh,0 + jne @ok + mov bh,1 +@ok: mov di,$40 +@Gb: + Mov cx,[first] + + mov bl,bh +@bcl:call WaitVbl + dec bl + jnz @bcl +@Rer: + { Get R,G,B } + Lds sI,[Pal] + mov dx,3 + mov ax,cx + mul dx + add si,ax + Mov dx,$3C7 + Mov al,cl + Out dx,al + mov dx,$3C9 + + In al,dx + mov [r],Al + + In al,dx + mov [g],Al + + In al,dx + mov [b],Al + + lodsb + { Decremente R,G,B } + cmp [r],al + je @G1 + inc [R] + +@G1: lodsb + cmp [g],al + je @b1 + inc [g] + +@B1: lodsb + cmp [B],al + je @n1 + inc [B] + + { Write to DAC VGA } +@N1: Mov DX,$3C8 + mov al,cl + out dx,al + inc dx + + mov al,[r] + out dx,al + + mov al,[g] + out dx,al + + mov al,[b] + out dx,al + + inc cx + cmp cx,[last] + jbe @rer + + dec di + cmp di,-1 + jne @GB + Pop dS + PopA + End; +End; + +Procedure FadeFromWhite(first,Last : word; Pal:pointer; Speed : Byte); +Var + R,G,B : Byte; +Begin + Asm + PushA + Push DS + mov bl,speed + mov di,$40 +@Gb: + Mov cx,[first] + call WaitVbl +@Rer: + { Get R,G,B } + LDs sI,Pal + mov dx,3 + mov ax,cx + mul dx + add si,ax + Mov dx,$3C7 + Mov al,cl + Out dx,al + mov dx,$3C9 + + In al,dx + mov [r],Al + + In al,dx + mov [g],Al + + In al,dx + mov [b],Al + + lodsb + { Decremente R,G,B } + cmp [r],al + je @G1 + sub [R],bl + +@G1: lodsb + cmp [g],al + je @b1 + sub [g],bl + +@B1: lodsb + cmp [B],al + je @n1 + sub [B],bl + + { Write to DAC VGA } +@N1: Mov DX,$3C8 + mov al,cl + out dx,al + inc dx + + mov al,[r] + out dx,al + + mov al,[g] + out dx,al + + mov al,[b] + out dx,al + + inc cx + cmp cx,[last] + jbe @rer + + dec di + cmp di,$FFFF + jne @GB + Pop DS + PopA + End; +End; + +Procedure FadeWhite(First,Last : Word; Speed : Byte); +Var + R,G,B : Byte; +Begin + Asm + mov bl,speed + mov BH,040h + sub bh,bl + mov si,40h +@Gb: + Mov cx,[First] + call WaitVbl +@Rer: + { Get R,G,B } + Mov dx,$3C7 + Mov al,cl + Out dx,al + mov dx,$3C9 + + In al,dx + mov [r],Al + + In al,dx + mov [g],Al + + In al,dx + mov [b],Al + + { Incremente R,G,B } + cmp r,bh + jnb @G1 + add R,bl + +@G1: cmp G,bh + jnb @b1 + add G,bl + +@B1: cmp B,bh + jnb @n1 + add B,bl + + { Write to DAC VGA } +@N1: Mov DX,$3C8 + mov al,cl + out dx,al + inc dx + + mov al,[r] + out dx,al + + mov al,[g] + out dx,al + + mov al,[b] + out dx,al + + inc cx + cmp cx,[Last] + jbe @rer + + dec si + cmp si,-1 + jne @GB + End; +End; + +End. \ No newline at end of file