|
4 | 4 | @name: Unit to handle screen graphics, accelerated bitmap modes |
5 | 5 | @author: Tomasz Biela (Tebe/Madteam) |
6 | 6 |
|
| 7 | +@version: 1.2 |
| 8 | +
|
7 | 9 | @description: |
8 | 10 | <http://www.freepascal.org/docs-html/rtl/graph/index-5.html> |
9 | 11 |
|
|
18 | 20 | fRectangle fast Rectangle |
19 | 21 | GetPixel |
20 | 22 | HLine |
| 23 | +VLine |
21 | 24 | InitGraph mode: 3, 5, 7, 8, 9, 10, 11, 15 |
22 | 25 | Line |
23 | 26 | LineTo |
@@ -115,6 +118,7 @@ TDisplayBuffer = record |
115 | 118 | procedure SetActiveBuffer(var a: TDisplayBuffer); overload; |
116 | 119 | procedure fRectangle(x1, y1, x2, y2: smallint); |
117 | 120 | procedure Hline(x0,x1,y: smallint); |
| 121 | + procedure Vline(x,y0,y1: smallint); |
118 | 122 | procedure LineTo(x, y: smallint); |
119 | 123 | procedure PutPixel(x,y: smallint); assembler; register; |
120 | 124 | function Scanline(y: smallint): PByte; |
@@ -323,7 +327,7 @@ function GetPixel(x,y: smallint): byte; assembler; |
323 | 327 | Return color of pixel |
324 | 328 | *) |
325 | 329 | asm |
326 | | -{ txa:pha |
| 330 | + txa:pha |
327 | 331 |
|
328 | 332 | lda y+1 |
329 | 333 | bmi error |
@@ -449,7 +453,6 @@ function GetPixel(x,y: smallint): byte; assembler; |
449 | 453 | stop sta Result |
450 | 454 |
|
451 | 455 | pla:tax |
452 | | -}; |
453 | 456 | end; |
454 | 457 |
|
455 | 458 |
|
@@ -700,8 +703,7 @@ procedure Hline(x0,x1,y: smallint); |
700 | 703 | lda (:bp2),y ; Byte with Right edge |
701 | 704 | and rmsk: #0 |
702 | 705 | ora rcol: #0 |
703 | | - |
704 | | -; sta (:bp2),y |
| 706 | + sta (:bp2),y |
705 | 707 |
|
706 | 708 | jmp exit |
707 | 709 |
|
@@ -746,9 +748,144 @@ procedure Hline(x0,x1,y: smallint); |
746 | 748 | dta %11111100 |
747 | 749 | dta %11111111 |
748 | 750 |
|
| 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; |
749 | 774 |
|
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 |
751 | 782 |
|
| 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 |
752 | 889 | ldx rX: #$00 |
753 | 890 | end; |
754 | 891 |
|
@@ -1060,10 +1197,14 @@ procedure fRectangle(x1, y1, x2, y2: Smallint); |
1060 | 1197 | *) |
1061 | 1198 | begin |
1062 | 1199 |
|
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); |
1067 | 1208 |
|
1068 | 1209 | end; |
1069 | 1210 |
|
@@ -1095,6 +1236,11 @@ procedure SetActiveBuffer(a: word); assembler; overload; |
1095 | 1236 | sty HLine.hfb |
1096 | 1237 | eif |
1097 | 1238 |
|
| 1239 | + .ifdef VLine |
| 1240 | + sta VLine.lfb |
| 1241 | + sty VLine.hfb |
| 1242 | + eif |
| 1243 | + |
1098 | 1244 | .ifdef fLine |
1099 | 1245 | sta fLine.lfb |
1100 | 1246 | sty fLine.hfb |
|
0 commit comments