Skip to content

Commit 277166e

Browse files
committed
VLine
1 parent 557f6da commit 277166e

1 file changed

Lines changed: 155 additions & 9 deletions

File tree

lib/fastgraph.pas

Lines changed: 155 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
@name: Unit to handle screen graphics, accelerated bitmap modes
55
@author: Tomasz Biela (Tebe/Madteam)
66
7+
@version: 1.2
8+
79
@description:
810
<http://www.freepascal.org/docs-html/rtl/graph/index-5.html>
911
@@ -18,6 +20,7 @@
1820
fRectangle fast Rectangle
1921
GetPixel
2022
HLine
23+
VLine
2124
InitGraph mode: 3, 5, 7, 8, 9, 10, 11, 15
2225
Line
2326
LineTo
@@ -115,6 +118,7 @@ TDisplayBuffer = record
115118
procedure SetActiveBuffer(var a: TDisplayBuffer); overload;
116119
procedure fRectangle(x1, y1, x2, y2: smallint);
117120
procedure Hline(x0,x1,y: smallint);
121+
procedure Vline(x,y0,y1: smallint);
118122
procedure LineTo(x, y: smallint);
119123
procedure PutPixel(x,y: smallint); assembler; register;
120124
function Scanline(y: smallint): PByte;
@@ -323,7 +327,7 @@ function GetPixel(x,y: smallint): byte; assembler;
323327
Return color of pixel
324328
*)
325329
asm
326-
{ txa:pha
330+
txa:pha
327331

328332
lda y+1
329333
bmi error
@@ -449,7 +453,6 @@ function GetPixel(x,y: smallint): byte; assembler;
449453
stop sta Result
450454

451455
pla:tax
452-
};
453456
end;
454457

455458

@@ -700,8 +703,7 @@ procedure Hline(x0,x1,y: smallint);
700703
lda (:bp2),y ; Byte with Right edge
701704
and rmsk: #0
702705
ora rcol: #0
703-
704-
; sta (:bp2),y
706+
sta (:bp2),y
705707

706708
jmp exit
707709

@@ -746,9 +748,144 @@ procedure Hline(x0,x1,y: smallint);
746748
dta %11111100
747749
dta %11111111
748750

751+
exit
752+
ldx rX: #$00
753+
end;
754+
755+
end;
756+
757+
758+
procedure Vline(x,y0,y1: smallint);
759+
(*
760+
@description:
761+
Draw horizintal line, fast as possible
762+
*)
763+
var mode: byte;
764+
tmp: smallint;
765+
begin
766+
767+
if y0 > y1 then begin
768+
tmp:=y1;
769+
y1:=y0;
770+
y0:=tmp;
771+
end;
772+
773+
mode:=GraphMode and $0f;
749774

750-
exit sta (:bp2),y
775+
if (mode<>5) and (mode<>7) and (mode<>15) then begin
776+
Line(x,y0,x,y1);
777+
exit;
778+
end;
779+
780+
asm
781+
stx rX
751782

783+
jmp skp
784+
785+
error jmp exit
786+
787+
skp
788+
lda y1+1
789+
bmi error
790+
cmp MAIN.SYSTEM.ScreenHeight+1
791+
bne sk0
792+
lda y1
793+
cmp MAIN.SYSTEM.ScreenHeight
794+
sk0
795+
bcs error
796+
797+
lda y0+1
798+
bmi error
799+
cmp MAIN.SYSTEM.ScreenHeight+1
800+
bne sk1
801+
lda y0
802+
cmp MAIN.SYSTEM.ScreenHeight
803+
sk1
804+
bcc ok1
805+
806+
mwa MAIN.SYSTEM.ScreenHeight y0
807+
808+
ok1 lda x+1
809+
bmi error
810+
cmp MAIN.SYSTEM.ScreenWidth+1
811+
bne sk2
812+
lda x
813+
cmp MAIN.SYSTEM.ScreenWidth
814+
sk2
815+
bcc ok2
816+
817+
mwa MAIN.SYSTEM.ScreenWidth x
818+
clc
819+
ok2
820+
ldy y0
821+
lda adr.lineLo,y
822+
adc lfb:#0
823+
sta :bp2
824+
825+
lda adr.lineHi,y
826+
adc hfb:#0
827+
sta :bp2+1
828+
829+
lda adr.lineLo+1
830+
sub adr.lineLo
831+
sta width
832+
833+
lda GetColor
834+
and #3
835+
tay
836+
837+
lda x
838+
and #3
839+
tax
840+
lda andm,x
841+
sta msk
842+
843+
lda tcolor,y
844+
and mask,x
845+
sta col
846+
847+
lda x
848+
lsr @
849+
lsr @
850+
tay
851+
852+
lda y1
853+
sub y0
854+
tax
855+
beq exit
856+
857+
lp lda (:bp2),y
858+
and msk: #0
859+
ora col: #0
860+
sta (:bp2),y
861+
862+
lda :bp2
863+
clc
864+
adc width: #$00
865+
sta :bp2
866+
scc
867+
inc :bp2+1
868+
869+
dex
870+
871+
bne lp
872+
873+
jmp exit
874+
875+
876+
tcolor dta $00,$55,$aa,$ff
877+
878+
mask dta %11000000
879+
dta %00110000
880+
dta %00001100
881+
dta %00000011
882+
883+
andm dta %11000000^$ff
884+
dta %00110000^$ff
885+
dta %00001100^$ff
886+
dta %00000011^$ff
887+
888+
exit
752889
ldx rX: #$00
753890
end;
754891

@@ -1060,10 +1197,14 @@ procedure fRectangle(x1, y1, x2, y2: Smallint);
10601197
*)
10611198
begin
10621199

1063-
fLine(x1,y1,x2,y1);
1064-
fLine(x2,y1,x2,y2);
1065-
fLine(x1,y2,x2,y2);
1066-
fLine(x1,y1,x1,y2);
1200+
HLine(x1,x2, y1);
1201+
HLine(x1,x2, y2);
1202+
1203+
VLine(x2, y1, y2);
1204+
//fLine(x2,y1,x2,y2);
1205+
1206+
VLine(x1, y1, y2);
1207+
//fLine(x1,y1,x1,y2);
10671208

10681209
end;
10691210

@@ -1095,6 +1236,11 @@ procedure SetActiveBuffer(a: word); assembler; overload;
10951236
sty HLine.hfb
10961237
eif
10971238

1239+
.ifdef VLine
1240+
sta VLine.lfb
1241+
sty VLine.hfb
1242+
eif
1243+
10981244
.ifdef fLine
10991245
sta fLine.lfb
11001246
sty fLine.hfb

0 commit comments

Comments
 (0)