📄 vga256.pas
字号:
mov al, MAP_MASK
mov dx, SC_INDEX
out dx, ax
cld
push di
mov bx, Width
shr bx, 1
shr bx, 1
mov ax, BYTES_PER_LINE
sub ax, bx { Space before next line }
mov dx, Height
@Line:
mov cx, bx
shr cx, 1
push ax
pushf
@Pixel:
lodsw
or al, al
jz @Skip1
seges
mov [di], al
@Skip1:
inc di
or ah, ah
jz @Skip2
seges
mov [di], ah
@Skip2:
inc di
loop @Pixel
popf
rcl cx, 1
jcxz @Skip3
lodsb
or al, al
jz @Odd
stosb
jmp @Skip3
@Odd: inc di
@Skip3:
pop ax
add di, ax
dec dx
jnz @Line
pop di
pop ax
mov al, ah
mov cl, 4
shl al, cl
or ah, al { Mask for next byte }
rol ah, 1 { Bit mask for next plane }
pop cx { Planes }
pop bx
inc bl { Still in the same byte? }
adc di, 0
loop @Plane
@End:
pop ds
end;
end;
procedure RecolorImage (XPos, YPos, Width, Height: Integer; var BitMap; Diff: Byte);
begin
asm
push ds
mov ax, VGA_SEGMENT
mov es, ax
mov ax, YPos
cmp ax, VIR_SCREEN_HEIGHT
jb @NotNeg
jg @End
mov bx, ax
add bx, Height
jnc @End
@NotNeg:
mov bx, BYTES_PER_LINE
mul bx
mov di, XPos
mov bx, di
shr di, 1
shr di, 1
add di, ax { DI = (YPos * 80) + XPos / 4 }
add di, PageOffset
lds si, BitMap { Point to bitmap }
and bl, 3
mov cl, bl
mov ah, 1
shl ah, cl
sub bl, 4
mov cx, 4 { 4 planes }
@Plane:
push bx
push cx { Planes to go }
push ax { Mask in AH }
mov al, MAP_MASK
mov dx, SC_INDEX
out dx, ax
cld
push di
mov bx, Width
shr bx, 1
shr bx, 1
mov ax, BYTES_PER_LINE
sub ax, bx { Space before next line }
mov dx, Height
@Line:
mov cx, bx
shr cx, 1
push ax
pushf
@Pixel:
lodsw
or al, al
jz @Skip1
add al, Diff
seges
mov [di], al
@Skip1:
inc di
or ah, ah
jz @Skip2
add ah, Diff
seges
mov [di], ah
@Skip2:
inc di
loop @Pixel
popf
rcl cx, 1
jcxz @Skip3
lodsb
or al, al
jz @Odd
add al, Diff
stosb
jmp @Skip3
@Odd: inc di
@Skip3:
pop ax
add di, ax
dec dx
jnz @Line
pop di
pop ax
mov al, ah
mov cl, 4
shl al, cl
or ah, al { Mask for next byte }
rol ah, 1 { Bit mask for next plane }
pop cx { Planes }
pop bx
inc bl { Still in the same byte? }
adc di, 0
loop @Plane
@End:
pop ds
end;
end;
procedure DrawPart (XPos, YPos, Width, Height, Y1, Y2: Integer; var BitMap);
begin
asm
push ds
cmp Height, 0
jle @End
mov ax, VGA_SEGMENT
mov es, ax
mov ax, YPos
cmp ax, VIR_SCREEN_HEIGHT
jb @NotNeg
jg @End
mov bx, ax
add bx, Height
jnc @End
@NotNeg:
mov bx, BYTES_PER_LINE
mul bx
mov di, XPos
mov bx, di
shr di, 1
shr di, 1
add di, ax { DI = (YPos * 80) + XPos / 4 }
add di, PageOffset
lds si, BitMap { Point to bitmap }
and bl, 3
mov cl, bl
mov ah, 1
shl ah, cl
sub bl, 4
mov cx, 4 { 4 planes }
@Plane:
push bx
push cx { Planes to go }
push ax { Mask in AH }
mov al, MAP_MASK
mov dx, SC_INDEX
out dx, ax
cld
push di
mov bx, Width
shr bx, 1
shr bx, 1
mov ax, BYTES_PER_LINE
sub ax, bx { Space before next line }
xor dx, dx
@Line:
cmp dx, Y1
jl @EndLine
cmp dx, Y2
jg @EndLine
mov cx, bx
shr cx, 1
push ax
pushf
@Pixel:
lodsw
or al, al
jz @Skip1
seges
mov [di], al
@Skip1:
inc di
or ah, ah
jz @Skip2
seges
mov [di], ah
@Skip2:
inc di
loop @Pixel
popf
rcl cx, 1
jcxz @Skip3
lodsb
or al, al
jz @Odd
stosb
jmp @Skip3
@Odd: inc di
@Skip3:
pop ax
add di, ax
jmp @1
@EndLine:
add si, bx
add di, BYTES_PER_LINE
@1: inc dx
cmp dx, Height
jb @Line
pop di
pop ax
mov al, ah
mov cl, 4
shl al, cl
or ah, al { Mask for next byte }
rol ah, 1 { Bit mask for next plane }
pop cx { Planes }
pop bx
inc bl { Still in the same byte? }
adc di, 0
loop @Plane
@End:
pop ds
end;
end;
procedure UpSideDown (XPos, YPos, Width, Height: Integer; var BitMap);
{ Draw an image on the screen up-side-down (NULL-bytes are ignored) }
begin
asm
push ds
mov ax, VGA_SEGMENT
mov es, ax
mov ax, YPos
cmp ax, VIR_SCREEN_HEIGHT
jb @NotNeg
jg @End
mov bx, ax
add bx, Height
jnc @End
@NotNeg:
add ax, Height
dec ax
mov bx, BYTES_PER_LINE
mul bx
mov di, XPos
mov bx, di
shr di, 1
shr di, 1
add di, ax { DI = (YPos * 80) + XPos / 4 }
add di, PageOffset
lds si, BitMap { Point to bitmap }
and bl, 3
mov cl, bl
mov ah, 1
shl ah, cl
sub bl, 4
mov cx, 4 { 4 planes }
@Plane:
push bx
push cx { Planes to go }
push ax { Mask in AH }
mov al, MAP_MASK
mov dx, SC_INDEX
out dx, ax
cld
push di
mov bx, Width
shr bx, 1
shr bx, 1
mov ax, BYTES_PER_LINE
add ax, bx { Space before next line }
mov dx, Height
@Line:
mov cx, bx
shr cx, 1
push ax
pushf
@Pixel:
lodsw
or al, al
jz @Skip1
seges
mov [di], al
@Skip1:
inc di
or ah, ah
jz @Skip2
seges
mov [di], ah
@Skip2:
inc di
loop @Pixel
popf
rcl cx, 1
jcxz @Skip3
lodsb
or al, al
jz @Odd
stosb
jmp @Skip3
@Odd: inc di
@Skip3:
pop ax
sub di, ax
dec dx
jnz @Line
pop di
pop ax
mov al, ah
mov cl, 4
shl al, cl
or ah, al { Mask for next byte }
rol ah, 1 { Bit mask for next plane }
pop cx { Planes }
pop bx
inc bl { Still in the same byte? }
adc di, 0
loop @Plane
@End:
pop ds
end;
end;
procedure PutImage (XPos, YPos, Width, Height: Integer; var BitMap);
{ Draw an image on the screen (NULL-bytes are NOT ignored) }
begin
asm
push ds
push es
mov ax, VGA_SEGMENT
mov es, ax
mov ax, YPos
mov bx, BYTES_PER_LINE
mul bx
mov di, XPos
mov bx, di
shr di, 1
shr di, 1
add di, ax { DI = (YPos * 80) + XPos / 4 }
add di, PageOffset
lds si, BitMap { Point to bitmap }
and bl, 3
mov cl, bl
mov ah, 1
shl ah, cl
sub bl, 4
mov cx, 4 { 4 planes }
@Plane:
push bx
push cx { Planes to go }
push ax { Mask in AH }
mov al, MAP_MASK
mov dx, SC_INDEX
out dx, ax
cld
push di
mov bx, Width
shr bx, 1
shr bx, 1
mov ax, BYTES_PER_LINE
sub ax, bx { Space before next line }
mov dx, Height
@Line:
mov cx, bx
shr cx, 1
rep movsw
rcl cx, 1
rep movsb
add di, ax
dec dx
jnz @Line
pop di
pop ax
mov al, ah
mov cl, 4
shl al, cl
or ah, al { Mask for next byte }
rol ah, 1 { Bit mask for next plane }
pop cx { Planes }
pop bx
inc bl { Still in the same byte? }
adc di, 0
loop @Plane
pop es
pop ds
end;
end;
procedure GetImage (XPos, YPos, Width, Height: Integer; var BitMap);
begin
asm
push ds
push es
mov cx, PageOffset
mov ax, VGA_SEGMENT
mov ds, ax
mov ax, YPos
mov bx, BYTES_PER_LINE
mul bx
mov si, XPos
mov bx, si
shr si, 1
shr si, 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -