[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]
{
> 640/480/16 mode... Yes I know how to put a pixel with the
> What I want is Line, Bitmap procedure...
The first is mine, the second a bit.
}
procedure FillBox(X1,Y1,X2,Y2:word; Color:byte); assembler;
{ Fill (X1,Y1)-(X2,Y1) with Color, VGA only, 640 lines, 16 color mode, PD }
asm
cld
mov dx,3ceh
mov ah,Color
mov al,0
out dx,ax
mov ax,0305h
out dx,ax
mov ax,0a000h
mov es,ax
mov ax,Y1
mov si,Y2
sub si,ax
jz @NoLines
{$ifopt G+}shl ax,6{$else}mov cl,6;shl ax,cl{$endif}
mov di,ax
{$ifopt G+}shr ax,2{$else}shr ax,1; shr ax,1{$endif}
add di,ax
mov ax,X1
mov cl,al
{$ifdef G+}shr ax,3{$else}shr ax,1; shr ax,1; shr ax,1{$endif}
mov bx,X2
mov ch,bl
{$ifdef G+}shr bx,3{$else}shr bx,1; shr bx,1; shr bx,1{$endif}
sub bx,ax
push bp
mov bp,bx
add di,ax
and cx,707h
mov bx,0ffffh
shr bl,cl
mov cl,ch
xor cl,7
inc cx
shl bh,cl
or bp,bp
jnz @NoDub
and bl,bh
jz @NoLines2
@NoDub:
mov al,8
@PutLines:
cli
mov al,es:[di]
mov es:[di],bl
sti
inc di
mov cx,bp
dec cx
js @NoPBL
jz @NoPB
mov al,0ffh
rep stosb
@NoPB:
cli
mov al,es:[di]
mov es:[di],bh
sti
inc di
@NoPBL:
sub di,bp
add di,80-1
dec si
jnz @PutLines
@NoLines2:
pop bp
@NoLines:
mov ax,0005h
out dx,ax
end;
procedure PixelAddrHGC; assembler;
asm
mov cl,bl
{$ifopt G+}shr bx,3{$else}shr bx,1;shr bx,1;shr bx,1{$endif}
{$ifopt G+}shl ax,6{$else}mov ch,cl; mov cl,6; shl ax,cl; mov cl,ch;{$endif}
add bx,ax
{$ifopt G+}shr ax,2{$else}shr ax,1; shr ax,1;{$endif}
add bx,ax
mov ax,0a000h
mov es,ax
and cl,7
xor cl,7
mov ah,1
end;
procedure Line(X1,Y1,X2,Y2:word; Color:byte); assembler;
{ Draw a line from (X1,Y1)-(X2,Y2) in Color, VGA only, 640 lines, 16 colors }
{ Originally from a HGC line routine in a book, converted to VGA by me }
const
ByteOffsetShift=3;
var
Incr1,Incr2:word;
Routine:word;
asm
cld
mov si,80
mov dx,3ceh
mov ah,Color
xor al,al
out dx,ax
mov ax,0305h
out dx,ax
mov cx,X2
sub cx,X1
jz @VertLineHGC { Jump if X1=X2, VertLine }
jns @Li01 { Jump if X2>X1, no swap }
neg cx
mov bx,X2
xchg bx,X1
mov X2,bx
mov bx,Y2
xchg bx,Y1
mov Y2,bx
@Li01: mov bx,Y2
sub bx,Y1
jnz @Li02 { Jump if Y1<>Y2, no HorizLine }
jmp @HorizLineHGC
@Li02: jns @Li03 { Jump if Y2 > Y1, no swap }
neg bx
neg si
@Li03: mov routine,offset @LoSlopeLineHGC
cmp bx,cx
jle @Li04
mov routine,offset @HiSlopeLineHGC
xchg bx,cx
@Li04: shl bx,1
mov incr1,bx
sub bx,cx
mov di,bx
sub bx,cx
mov incr2,bx
push cx
mov ax,Y1
mov bx,X1
call PixelAddrHGC
mov al,1
shl ax,cl
mov dx,ax
not dh
pop cx
inc cx
jmp routine { Var containing LoSlope/HiSlope }
@VertLineHGC: mov ax,Y1
mov bx,Y2
mov cx,bx
sub cx,ax
jge @Li31
neg cx
mov ax,bx
@Li31: inc cx
mov bx,X1
push cx
call PixelAddrHGC
mov al,1
shl ax,cl
not ah
pop cx
@Li32: mov ah,es:[bx]
mov es:[bx],al
add bx,si
loop @Li32
jmp @Liexit
@HorizLineHGC:
mov ax,Y1
mov bx,X1
call PixelAddrHGC
mov di,bx
mov dh,ah
not dh
mov dl,0ffh
shl dh,cl
not dh
mov cx,X2
and cl,7
xor cl,7
shl dl,cl
mov ax,X2
mov bx,X1
mov cl,ByteOffsetShift
shr ax,cl
shr bx,cl
mov cx,ax
sub cx,bx
mov ax,0ffffh
or dh,dh
js @Li43
or cx,cx
jnz @Li42
and dl,dh
jmp @Li44
@Li42: mov ah,al
and ah,dh
mov bl,es:[di]
mov es:[di],ah
inc di
dec cx
@Li43: or cx,cx
jz @Li44
@InLoop: mov bl,es:[di]
stosb
loop @InLoop
{ if mode = NO_OP replace 'or cx,cx'-'loop @InLoop:' with 'rep stosb'}
@Li44: and al,dl
mov dl,es:[di]
mov es:[di],al
jmp @Liexit
@LoSlopeLineHGC:
@Li10: mov ah,es:[bx]
xor ah,ah
@Li11: or ah,dl
ror dl,1
ror dh,1
jnc @Li14
or di,di
jns @Li12
add di,incr1
loop @Li11
mov es:[bx],ah
jmp @Liexit
@Li12: add di,incr2
mov es:[bx],ah
add bx,si
loop @Li10
jmp @Liexit
@Li14: mov es:[bx],ah
inc bx
or di,di
jns @Li15
add di,incr1
loop @Li10
jmp @Liexit
@Li15: add di,incr2
add bx,si
loop @Li10
jmp @Liexit
@HiSlopeLineHGC:
@Li21: mov al,es:[bx]
mov es:[bx],dl
add bx,si
or di,di
jns @Li23
add di,incr1
loop @Li21
jmp @Liexit
@Li23: add di,incr2
ror dl,1
ror dh,1
cmc
adc bx,0
loop @Li21
@Liexit:
mov dx,3ceh
mov ax,5
out dx,ax
end;
[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]