SHOW:
|
|
- or go back to the newest paste.
1 | p_VLine: | |
2 | .db __VLineEnd-$-1 | |
3 | ld de,plotSScreen | |
4 | x_VLineEntry: | |
5 | ||
6 | ;; de=buff, l=y2, (sp)=ret, (sp+2)=y1, (sp+4)=x | |
7 | ;; Rearrange stuff | |
8 | ld a,l | |
9 | pop hl | |
10 | pop bc | |
11 | ex (sp),hl | |
12 | ||
13 | ;; a=y2, c=y1, de=buff, l=x | |
14 | ;; Check if y1 is offscreen top while calculating y1*2; if so, abort if y2 is | |
15 | ;; too, then fix it | |
16 | ld h,0 | |
17 | sla c | |
18 | jr nc,$+5 | |
19 | or a | |
20 | ret m | |
21 | ld c,h | |
22 | ||
23 | - | ;; carry=y1 offscreen, a=y2, c=top-fixed y1*2, de=buff, h=0, l=x |
23 | + | ;; a=y2, c=top-fixed y1*2, de=buff, h=0, l=x |
24 | ;; Check if y2 is offscreen top while calculating y2*2; if so, fix it | |
25 | add a,a | |
26 | jr nc,$+3 | |
27 | ld a,h | |
28 | ||
29 | ;; a=top-fixed y2*2, c=top-fixed y1*2, de=buff, h=0, l=x | |
30 | ;; Check that y2>=y1; if not, swap y1 and y2 | |
31 | cp c | |
32 | jr nc,$+5 | |
33 | ld b,c | |
34 | ld c,a | |
35 | ld a,b | |
36 | ||
37 | ;; y1 is now guaranteed to be <=y2 | |
38 | ;; a=top-fixed y2*2, c=top-fixed y1*2, de=buff, h=0, l=x | |
39 | ;; Check if y1 is offscreen bottom while calculating y1*4; if so, abort | |
40 | sla c | |
41 | ret c | |
42 | ||
43 | ;; a=top-fixed y2*2, c=fixed y1*4, de=buff, h=0, l=x | |
44 | ;; Check if y2 is offscreen bottom while calculating y2*4; if so, fix it | |
45 | add a,a | |
46 | jr nc,$+4 | |
47 | ld a,63*4 | |
48 | ||
49 | ;; Y Clipping complete; y1 and y2 guaranteed to be onscreen | |
50 | ;; a=y2*4, c=y1*4, de=buff, h=0, l=x | |
51 | ;; Calculate the height of the line | |
52 | sub c | |
53 | rra | |
54 | rra | |
55 | inc a | |
56 | ld b,a | |
57 | ||
58 | ;; y2 no longer needed | |
59 | ;; a=height, b=height, c=y1*4, de=buff, h=0, l=x | |
60 | ;; Calculate x1/8 and add it and y*12 to the buffer pointer | |
61 | ex de,hl | |
62 | ld a,e | |
63 | ld e,c | |
64 | ld c,a | |
65 | add hl,de | |
66 | rra | |
67 | add hl,de | |
68 | rra | |
69 | add hl,de | |
70 | rra | |
71 | ld e,a | |
72 | add hl,de | |
73 | ||
74 | ||
75 | ;; y1 no longer needed | |
76 | ;; a=x/8, b=height, c=x, d=0, e=x/8, hl=y1*12+(x/8)+buff | |
77 | ;; Check if x is offscreen; if so, abort | |
78 | ld e,12 | |
79 | cp e | |
80 | ret nc | |
81 | ||
82 | ;; Begin drawing! | |
83 | ;; a=x/8, b=height, c=x, de=12, hl=y1*12+(x/8)+buff | |
84 | ;; Calculate the mask | |
85 | ld a,c | |
86 | or %11111000 | |
87 | ld c,$80 | |
88 | __VLineMaskLoop: | |
89 | rlc c | |
90 | inc a | |
91 | jr nz,__VLineMaskLoop | |
92 | ||
93 | ||
94 | ;; a=0, b=height, c=mask, de=12, hl=y1*12+(x/8)+buff | |
95 | ;; Draw the line | |
96 | __VLineLoop: | |
97 | ld a,(hl) | |
98 | or c | |
99 | ld (hl),a | |
100 | add hl,de | |
101 | djnz __VLineLoop | |
102 | ||
103 | ret | |
104 | __VLineEnd: |