home *** CD-ROM | disk | FTP | other *** search
- { }
- { D E M O V G A U N I T }
- { }
- { LearnWare Code by <rom / Spanish Lords }
- { ■e-mail: crom@sol.parser.es ■FIDO: 2:342/6.9 }
- { }
- Unit DemoVGA;
-
- INTERFACE
- CONST
- LogicalWide = 320;
- LogicalHeight = 200;
-
- PROCEDURE McgaOn;
- PROCEDURE McgaOff;
- PROCEDURE VerticalRetrace;
- PROCEDURE PutColor (Color,R,G,B:Byte);
- PROCEDURE GetColor (Color:Byte;Var R,G,B:Byte);
- PROCEDURE CopyColor (Desde:Byte;Hasta:Byte);
- PROCEDURE RotaPal (Color1,Color2:Byte);
- PROCEDURE PutPalette (SegPal,OffPal:Word);
- PROCEDURE PutPixel (SegDes:Word;X,Y:Integer;Color:Byte);
- PROCEDURE DrawLineH (SegDes,X1,X2,Y1:Word; Color:Byte);
- PROCEDURE DrawLineV (SegDes,X1,Y1,Y2:Word; Color:Byte);
- PROCEDURE ReadRaw (Var DestinoPtr:Pointer;FileName:String);
- PROCEDURE Copy64K (SegOrg,SegDes:Word);
- PROCEDURE Fill64K (SegDes:Word;Data:Byte);
- FUNCTION Mcga2Off (X,Y:Word):Word;
- PROCEDURE PutSprite (SegOrg,OffOrg,SegDes,OffDes,XDim,YDim:Word);
- PROCEDURE CopySprite (SegOrg,OffOrg,SegDes,OffDes,XDim,YDim:Word);
- PROCEDURE PutSpriteClip (SegOrg,OffOrg,SegDes:Word;XDes,YDes:Integer;XDim,YDim,X1Clip,Y1Clip,X2Clip,Y2Clip:Word);
-
- IMPLEMENTATION
- Var
- OldMode : Byte;
- AuxPalette : Array [1..768] of Byte;
-
- PROCEDURE McgaOn;assembler;
- Asm
- mov ah,0Fh
- int 10h
- mov OldMode,al
- mov ax,13h
- int 10h
- End;
-
- PROCEDURE McgaOff;assembler;
- Asm
- mov al,[OldMode]
- xor ah,ah
- int 10h
- End;
-
- PROCEDURE VerticalRetrace;assembler;
- Asm
- mov dx,3DAh
- @@1:
- in al,dx
- test al,8
- jnz @@1
- @@2:
- in al,dx
- test al,8
- jz @@2
- End;
-
- PROCEDURE PutColor (Color,R,G,B:Byte);assembler;
- Asm
- mov dx,03C8h
- mov al,Color
- cli
- out dx,al
- inc dx
- mov al,R
- out dx,al
- mov al,G
- out dx,al
- mov al,B
- out dx,al
- sti
- End;
-
- PROCEDURE GetColor2 (Color:Byte;Var R,G,B:Byte);assembler;
- Asm
- mov dx,03C7h
- mov al,Color
- cli
- out dx,al
- mov dx,03C9h
- in al,dx
- mov BYTE PTR R,al
- in al,dx
- mov BYTE PTR G,al
- in al,dx
- sti
- mov BYTE PTR B,al
- End;
-
- PROCEDURE GetColor(Color:Byte; VAR R,G,B:Byte);
- Begin
- Port[$3C7]:=Color;
- R:=Port[$3C9];
- G:=Port[$3C9];
- B:=Port[$3C9];
- End;
-
- PROCEDURE CopyColor (Desde:Byte;Hasta:Byte);
- Var
- R,G,B : Byte;
- Begin
- GetColor (Desde,R,G,B);
- PutColor (Hasta,R,G,B);
- End;
-
-
- PROCEDURE PutPalette (SegPal,OffPal:Word);assembler;
- Asm
- cli
- mov dx,03C8h
- xor al,al
- out dx,al
- sti
- mov ax,SegPal
- mov es,ax
- mov si,OffPal
- xor cx,cx
- @@Loop:
- cli
- mov al,cl
- out dx,al
- inc dx
- mov al,es:[si]
- out dx,al
- inc si
- mov al,es:[si]
- out dx,al
- inc si
- mov al,es:[si]
- out dx,al
- inc si
- sti
- dec dx
- inc cl
- jnz @@Loop
- End;
- { Rota la Paleta de colores desde un color dado hasta otro.}
- { Compruebo cual es mayor para rotar a un lado o otro. }
- Procedure RotaPal (Color1,Color2:Byte);
- Var
- Cnt : Byte;
-
- CAux1R : Byte;
- CAux1G : Byte;
- CAux1B : Byte;
-
- CAux2R : Byte;
- CAux2G : Byte;
- CAux2B : Byte;
- Begin
- If Color2>Color1 then
- Begin
- GetColor (Color1,CAux1R,CAux1G,CAux1B);
- For Cnt:=Color1+1 to Color2 do
- Begin
- GetColor (Cnt,CAux2R,CAux2G,CAux2B);
- PutColor (Cnt-1,CAux2R,CAux2G,CAux2B);
- End;
- PutColor (Color2,CAux1R,CAux1G,CAux1B);
- End
- else
- Begin
- GetColor (Color1,CAux1R,CAux1G,CAux1B);
- For Cnt:=Color1-1 downto Color2 do
- Begin
- GetColor (Cnt,CAux2R,CAux2G,CAux2B);
- PutColor (Cnt+1,CAux2R,CAux2G,CAux2B);
- End;
- PutColor (Color2,CAux1R,CAux1G,CAux1B);
- End;
- End;
- PROCEDURE PutPixel (SegDes:Word;X,Y:Integer;Color:byte);assembler;
- Asm
- cmp X,0
- jl @@End
- cmp Y,0
- jl @@End
- cmp X,319
- jg @@End
- cmp Y,199
- jg @@End
- mov ax,SegDes
- mov es,ax
- mov al,Color
- mov di,Y
- mov bx,X
- mov dx,di
- xchg dh,dl
- shl di,6
- add di,dx
- add di,bx
- mov es:[di],al
- @@End:
- End;
- PROCEDURE DrawLineH(SegDes,X1,X2,Y1:Word; Color:Byte);assembler;
- Asm
- mov ax,SegDes
- mov es,ax
- mov ax,y1
- mov di,ax
- shl di,1
- shl di,1
- add di,ax
- mov cl,6
- shl di,cl
- mov bx,x1
- mov dx,x2
- cmp bx,dx
- jl @@1
- xchg bx,dx
- @@1:
- inc dx
- add di,bx
- mov cx,dx
- sub cx,bx
- shr cx,1
- mov al,Color
- mov ah,al
- ror bx,1
- jnb @@2
- stosb
- ror dx,1
- jnb @@3
- dec cx
- @@3:
- rol dx,1
- @@2:
- rep stosw
- ror dx,1
- jnb @@4
- stosb
- @@4:
- End;
- PROCEDURE DrawLineV(SegDes,X1,Y1,Y2:Word; Color:Byte);assembler;
- Asm
- mov ax,x1
- mov bx,y1
- mov dx,y2
- cmp bx,dx
- jl @@1
- xchg bx,dx
- @@1:
- mov di,bx
- shl di,1
- shl di,1
- add di,bx
- mov cl,6
- shl di,cl
- add di,ax
- mov cx,SegDes
- mov es,cx
- mov cx,dx
- sub cx,bx
- inc cx
- mov al,Color
- mov bx,319
- @@2:
- stosb
- add di,bx
- loop @@2
- End;
- Procedure ReadRaw (Var DestinoPtr:Pointer;FileName:String);
- Var
- FFile : File;
- Begin
- Assign (FFile,FileName);
- Reset (FFile,1);
- BlockRead(FFile,DestinoPtr^,64768);
- Close (FFile);
- End;
- PROCEDURE Copy64K (SegOrg,SegDes:Word);assembler;
- Asm
- push ds
- mov ax,SegOrg
- mov ds,ax
- mov ax,SegDes
- mov es,ax
- xor di,di
- xor si,si
- mov cx,32000
- rep movsw { optimize it!! rep movsd }
- pop ds
- End;
- PROCEDURE Fill64K (SegDes:Word;Data:Byte);assembler;
- Asm
- mov ax,SegDes
- mov es,ax
- xor di,di
- mov al,Data
- mov ah,al
- mov cx,32000
- rep stosw { optimize it!! rep stosd }
- End;
-
- FUNCTION Mcga2Off (X,Y:Word):Word;assembler;
- Asm
- mov ax,Y
- mov bx,X
- mov dx,ax
- xchg dh,dl
- shl ax,6
- add ax,dx
- add ax,bx
- End;
- PROCEDURE PutSprite (SegOrg,OffOrg,SegDes,OffDes,XDim,YDim:Word);assembler;
- Asm
- push ds
- mov ax,SegDes
- mov es,ax
- mov di,OffDes
- mov ax,SegOrg
- mov ds,ax
- mov si,OffOrg
- mov bx,LogicalWide
- sub bx,XDim { Wide Cte }
- mov dx,YDim
- @@MoreY:
- mov cx,XDim
- @@MoreX:
- mov al,ds:[si]
- cmp al,0
- je @@NoPut
- mov es:[di],al
- @@NoPut:
- inc di
- inc si
- dec cx
- jnz @@MoreX
- add di,bx
- add si,bx
- dec dx
- jnz @@MoreY
- pop ds
- End;
- PROCEDURE CopySprite (SegOrg,OffOrg,SegDes,OffDes,XDim,YDim:Word);assembler;
- Asm
- push ds
- mov ax,SegOrg
- mov ds,ax
- mov si,OffOrg
- mov ax,SegDes
- mov es,ax
- mov di,OffDes
- mov dx,LogicalWide
- sub dx,XDim { Wide Cte }
- mov bx,YDim
- @@MoreY:
- mov cx,XDim
- rep movsb
- add si,dx
- dec bx
- jnz @@MoreY
- pop ds
- End;
- PROCEDURE PutSpriteClip (SegOrg,OffOrg,SegDes:Word;XDes,YDes:Integer;XDim,YDim,X1Clip,Y1Clip,X2Clip,Y2Clip:Word);assembler;
- Asm
- mov ax,X1Clip
- mov bx,XDes
- add bx,XDim
- cmp bx,ax
- jle @@End
- mov ax,Y1Clip
- mov bx,YDes
- add bx,YDim
- cmp bx,ax
- jle @@End
- mov ax,X2Clip
- cmp XDes,ax
- jge @@End
- mov ax,Y2Clip
- cmp YDes,ax
- jge @@End
-
- push ds
- mov ax,SegOrg
- mov ds,ax
- mov si,OffOrg
- mov ax,SegDes
- mov es,ax
-
- mov ax,XDes
- cmp ax,X1Clip
- jg @@NoClipIzqdo
- mov ax,X1Clip
- sub ax,XDes
- add si,ax
- mov ax,XDes
- add ax,XDim
- sub ax,X1Clip
- mov XDim,ax
- mov ax,X1Clip
- mov XDes,ax
- @@NoClipIzqdo:
- mov ax,YDes
- cmp ax,Y1Clip
- jg @@NoClipSup
- mov ax,Y1Clip
- sub ax,YDes
- mov bx,LogicalWide
- imul bx
- add si,ax
- mov ax,YDes
- add ax,YDim
- sub ax,Y1Clip
- mov YDim,ax
- mov ax,Y1Clip
- mov YDes,ax
- @@NoClipSup:
- mov ax,LogicalWide { Calcula el offset }
- mov bx,YDes
- imul bx
- mov di,ax
- add di,XDes
- mov ax,XDes
- add ax,XDim
- cmp ax,X2Clip
- jl @@NoClipDrcho
- mov ax,X2Clip
- sub ax,XDes
- mov XDim,ax
- @@NoClipDrcho:
- mov ax,YDes
- add ax,YDim
- cmp ax,Y2Clip
- jl @@NoClipInf
- mov ax,Y2Clip
- sub ax,YDes
- mov YDim,ax
- @@NoClipInf:
- mov cx,LogicalWide { Cte de cambio de linea }
- sub cx,XDim
- @@AnotherLine:
- mov dx,XDim
- @@AnotherPix:
- mov al,ds:[si]
- cmp al,0
- je @@NoPutPix
- mov es:[di],al
- @@NoPutPix:
- inc di
- inc si
- dec dx
- jnz @@AnotherPix
- add di,cx
- add si,cx
- dec YDim
- jnz @@AnotherLine
- pop ds
- @@End:
- End;
- END.