/[projet1]/public/oric/routines/rasterization/linebench/line8.s
Defence Force logotype

Diff of /public/oric/routines/rasterization/linebench/line8.s

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 252 by dbug, Fri Feb 5 21:24:38 2010 UTC revision 253 by thrust26, Sat Feb 6 15:41:16 2010 UTC
# Line 2  Line 2 
2  ;649  ;649
3  ;614 (replacing the update of tmp0)  ;614 (replacing the update of tmp0)
4  ;607  ;607
5    ;588
6    ;583 after alignment
7    ;579
8    
9          .zero      .zero
10            
11  ;       *= tmp1  ;   *= tmp1
12            
13  ;e                              .dsb 2  ; Error decision factor (slope) 2 bytes in zero page  ;e              .dsb 2  ; Error decision factor (slope) 2 bytes in zero page
14  ;i                              .dsb 1  ; Number of pixels to draw (iteration counter) 1 byte in zp  ;i              .dsb 1  ; Number of pixels to draw (iteration counter) 1 byte in zp
15  ;dx                             .dsb 1  ; Width  ;dx             .dsb 1  ; Width
16  ;dy                             .dsb 1  ; Height  ;dy             .dsb 1  ; Height
17  ;_CurrentPixelX .dsb 1  ;_CurrentPixelX .dsb 1
18  ;_CurrentPixelY .dsb 1  ;_CurrentPixelY .dsb 1
19  ;_OtherPixelX   .dsb 1  ;_OtherPixelX   .dsb 1
20  ;_OtherPixelY   .dsb 1  ;_OtherPixelY   .dsb 1
21            
22  save_a                  .dsb 1  save_a          .dsb 1
23  save_y                  .dsb 1  save_y          .dsb 1
24    
25          .text      .text
26            
27          .dsb 256-(*&255)      .dsb 256-(*&255)
28    
29  ; nop $ea  ; nop $ea
30  ; inx $e8 11101000  ; inx $e8 11101000
# Line 33  save_y                 .dsb 1 Line 36  save_y                 .dsb 1
36    
37  draw_totaly_vertical_8  draw_totaly_vertical_8
38  .(  .(
39          ldx _CurrentPixelX      ldx _CurrentPixelX
40          ldy _TableDiv6,x      ldy _TableDiv6,x
41          lda _TableBit6Reverse,x         ; 4      lda _TableBit6Reverse,x     ; 4
42          sta _mask_patch+1      sta _mask_patch+1
43            
44          ldx dy      ldx dy
45          inx      inx
46            
47          clc                                                     ; 2      clc                         ; 2
48  loop  loop
49  _mask_patch  _mask_patch
50          lda #0                                          ; 2      lda #0                      ; 2
51          eor (tmp0),y                            ; 5      eor (tmp0),y                ; 5
52          sta (tmp0),y                            ; 6 => total = 13 cycles      sta (tmp0),y                ; 6 => total = 13 cycles
53    
54          ; Update screen adress      ; Update screen adress
55          .(      .(
56          lda tmp0+0                                      ; 3      lda tmp0+0                  ; 3
57          adc #40                                         ; 2      adc #40                     ; 2
58          sta tmp0+0                                      ; 3      sta tmp0+0                  ; 3
59          bcc skip                                        ; 2 (+1 if taken)      bcc skip                    ; 2 (+1 if taken)
60          inc tmp0+1                                      ; 5      inc tmp0+1                  ; 5
61          clc                                                     ; 2      clc                         ; 2
62  skip  skip
63          .)      .)
64          ; ------------------Min=13 Max=17      ; ------------------Min=13 Max=17
65    
66          dex      dex
67          bne loop      bne loop
68          rts      rts
69  .)  .)
           
70    
71            
72    
73  ;  ;
74  ; Expects the following variables to be set when called:  ; Expects the following variables to be set when called:
75  ; _CurrentPixelX  ; _CurrentPixelX
76  ; _CurrentPixelY  ; _CurrentPixelY
77  ; _OtherPixelX  ; _OtherPixelX
78  ; _OtherPixelY  ; _OtherPixelY
79  ;        ;
80  _DrawLine8  _DrawLine8
81          ;      ;
82          ; Compute deltas and signs      ; Compute deltas and signs
83          ;      ;
84            
85          ; Test Y value      ; Test Y value
86  .(  .(
87          sec      sec
88          lda _CurrentPixelY      lda _CurrentPixelY
89          sbc _OtherPixelY      sbc _OtherPixelY
90          beq end      beq end
91          bcc cur_smaller      bcc cur_smaller
92    
93  cur_bigger                                      ; y1>y2  cur_bigger                  ; y1>y2
94          ; Swap X and Y      ; Swap X and Y
95          ; So we always draw from top to bottom      ; So we always draw from top to bottom
96          ldy _CurrentPixelY      ldy _CurrentPixelY
97          ldx _OtherPixelY      ldx _OtherPixelY
98          sty _OtherPixelY      sty _OtherPixelY
99          stx _CurrentPixelY      stx _CurrentPixelY
100    
101          ldy _CurrentPixelX      ldy _CurrentPixelX
102          ldx _OtherPixelX      ldx _OtherPixelX
103          sty _OtherPixelX      sty _OtherPixelX
104          stx _CurrentPixelX      stx _CurrentPixelX
105                    
106          jmp end      jmp end
107            
108  cur_smaller                                     ; y1<y2  cur_smaller                 ; y1<y2
109          ; Absolute value      ; Absolute value
110          eor #$ff      eor #$ff
111          adc #1      adc #1
112  end  end
113          sta dy      sta dy
114  .)  .)
           
         ;  
         ; Initialise screen pointer  
         ;  
         ldy _CurrentPixelY  
         lda _HiresAddrLow,y                     ; 4  
         sta tmp0+0                                      ; 3  
         lda _HiresAddrHigh,y            ; 4  
         sta tmp0+1                                      ; 3 => Total 14 cycles  
115    
116          ; Test X value      ;
117        ; Initialise screen pointer
118        ;
119        ldy _CurrentPixelY
120        lda _HiresAddrLow,y         ; 4
121        sta tmp0+0                  ; 3
122        lda _HiresAddrHigh,y        ; 4
123        sta tmp0+1                  ; 3 => Total 14 cycles
124    
125        ; Test X value
126  .(  .(
127          sec      sec
128          lda _CurrentPixelX      lda _CurrentPixelX
129          sbc _OtherPixelX      sbc _OtherPixelX
130          sta dx      sta dx
131          beq draw_totaly_vertical_8      beq draw_totaly_vertical_8
132          bcc cur_smaller      bcc cur_smaller
133    
134  cur_bigger                                      ; x1>x2  cur_bigger                  ; x1>x2
135          lda #$ca                                ; dex      lda #$ca                ; dex
136          bne end      bne end
137    
138  cur_smaller                                     ; x1<x2  cur_smaller                 ; x1<x2
139          ; Absolute value      ; Absolute value
140          eor #$ff      eor #$ff
141          adc #1      adc #1
142          sta dx      sta dx
143            
144          lda #$e8                                ; inx      lda #$e8                ; inx
145  end  end
146  .)  .)
147    
148          ; Compute slope and call the specialized code for mostly horizontal or vertical lines      jmp alignIt
149          ldy dy  
150          beq draw_totaly_horizontal_8      .dsb 256-(*&255)
151          cpy dx  
152          bcs draw_nearly_vertical_8  alignIt
153        ; Compute slope and call the specialized code for mostly horizontal or vertical lines
154  draw_nearly_horizontal_8      ldy dy
155          .(      beq draw_totaly_horizontal_8
156          ; here we have DY in Y, and the OPCODE in A      cpy dx
157          sta __auto_stepx        ; Write a (dex / nop / inx) instruction      bcs draw_nearly_vertical_8
158          sty __auto_ady+1  
159            draw_nearly_horizontal_8
160          lda dx      .(
161          sta __auto_dx+1      ; here we have DY in Y, and the OPCODE in A
162                sta __auto_stepx        ; Write a (dex / nop / inx) instruction
163          lda _OtherPixelX      cmp #$ca                ; dex?
164          sta __auto_cpx+1      bne skipDex
165                dey                     ; adjust for carry being set in loop
166          ldx _CurrentPixelX      ;Plotting coordinates  skipDex
167          ldy _CurrentPixelY      ;in X and Y      sty __auto_ady+1
168                            
169          lda #00                         ;Saves us a CMP      lda dx
170          sec      sta __auto_dx+1
171          sbc dy                                  ; -DY  
172          sta save_a                              ; 3      lda _OtherPixelX
173                sta __auto_cpx+1
174          jmp draw_pixel  
175                        ldx _CurrentPixelX      ;Plotting coordinates
176  loop      ldy _CurrentPixelY      ;in X and Y
177    
178        lda dy
179        lsr
180        eor #$ff
181    ;    clc
182    
183    loopX
184        sta save_a              ; 3 =  3
185    loopY
186        ; Draw the pixel
187    __auto_div6
188        ldy _TableDiv6,x        ; 4
189    __auto_bit6
190        lda _TableBit6Reverse,x ; 4
191        eor (tmp0),y            ; 5*
192        sta (tmp0),y            ; 6*= 19
193    
194    __auto_cpx
195        cpx #00                 ; 2         At the endpoint yet?
196        beq exitLoop            ; 2/3
197  __auto_stepx  __auto_stepx
198          inx                             ; Step in x      inx                     ; 2         Step in x
199          lda save_a                              ; 3      lda save_a              ; 3
200  __auto_ady  __auto_ady
201          adc #00                                 ; 2 +DY      adc #00                 ; 2         +DY
202          sta save_a                              ; 3      bcc loopX               ; 2/3=13/14
203          bcc draw_pixel                  ; Time to step in y?      ; Time to step in y
204            __auto_dx
205  __auto_dx        sbc #00                 ; 2         -DX
206          sbc #00                         ; 2 -DX      sta save_a              ; 3 =  5
207          sta save_a                              ; 3  
208                ; Set the new screen adress
209          ; Set the new screen adress      lda tmp0+0              ; 3
210          .(      adc #40                 ; 2
211          lda tmp0+0                      ; 3      sta tmp0+0              ; 3
212          adc #40                         ; 2      bcc loopY               ; 2/3=10/11 ~84 taken
213          sta tmp0+0                      ; 3      inc tmp0+1              ; 5
214          bcc skip                        ; 2 (+1 if taken)      bcs loopY               ; 3 =  8
215          inc tmp0+1                      ; 5  ; average: 12.12
216  skip  
217          .)  exitLoop
218                rts
219  draw_pixel  ; Timings:
220          ; Draw the pixel  ; x++/y  : 36
221          ldy _TableDiv6,x  ; x++/y++: 49.12
222          lda _TableBit6Reverse,x  ; average: 42.56
223          eor (tmp0),y      .)
224          sta (tmp0),y  
     
 __auto_cpx  
         cpx #00                                 ; At the endpoint yet?  
         bne loop  
         rts      
         .)                        
           
225  draw_totaly_horizontal_8  draw_totaly_horizontal_8
226  .(  .(
227          ; here we have DY in Y, and the OPCODE in A      ; here we have DY in Y, and the OPCODE in A
228          sta _outer_patch        ; Write a (dex / nop / inx) instruction      sta _outer_patch    ; Write a (dex / nop / inx) instruction
229            
230          ldx _OtherPixelX      ldx _OtherPixelX
231          sta __auto_cpx+1      sta __auto_cpx+1
232            
233          ldx _CurrentPixelX      ldx _CurrentPixelX
234            
235          ;      ;
236          ; Draw loop      ; Draw loop
237          ;      ;
238  outer_loop  outer_loop
239          ldy _TableDiv6,x      ldy _TableDiv6,x
240          lda _TableBit6Reverse,x         ; 4      lda _TableBit6Reverse,x     ; 4
241          eor (tmp0),y                            ; 5      eor (tmp0),y                ; 5
242          sta (tmp0),y                            ; 6      sta (tmp0),y                ; 6
243    
244  _outer_patch  _outer_patch
245          inx      inx
246    
247    __auto_cpx
248        cpx #00                 ; At the endpoint yet?
249        bne outer_loop
250        rts
251    .)
252    
253    
 __auto_cpx        
         cpx #00                                 ; At the endpoint yet?  
         bne outer_loop  
         rts  
 .)        
           
           
254  ;  ;
255  ; This code is used when the things are moving faster  ; This code is used when the things are moving faster
256  ; vertically than horizontally  ; vertically than horizontally
257  ;  ;
258  ; dy>dx  ; dy>dx
259  ;  ;
260  draw_nearly_vertical_8  draw_nearly_vertical_8
261          .(      .(
262          ; here we have DY in Y, and the OPCODE in A      ; here we have DY in Y, and the OPCODE in A
263          sta __auto_stepx        ; Write a (dex / nop / inx) instruction      sta __auto_stepx        ; Write a (dex / nop / inx) instruction
264          sty __auto_dy+1      sty __auto_dy+1
265    
266          lda dx      lda dx
267          sta __auto_adx+1      sta __auto_adx+1
268                    
269          lda _OtherPixelY      lda _OtherPixelY
270          sta __auto_cpy+1      sta __auto_cpy+1
271            
272          ldx _CurrentPixelX      ;Plotting coordinates      ldx _CurrentPixelX      ; Plotting coordinates
273          ldy _CurrentPixelY      ;in X and Y      ldy _CurrentPixelY      ; in X and Y
274            
275          lda #00                         ;Saves us a CMP      lda dx
276          sec      lsr
277          sbc dx                                  ; -DX      eor #$ff                ; -DX/2
278                    ;    clc
279          jmp draw_pixel  
280            loop
281  loop      ; Draw the pixel
282          iny                             ; Step in y      sty save_y              ; 3
283        ldy _TableDiv6,x        ; 4
284        lda _TableBit6Reverse,x ; 4
285        eor (tmp0),y            ; 5*
286        sta (tmp0),y            ; 6*
287        lda save_a              ; 3
288        ldy save_y              ; 3 = 28
289    
290    __auto_cpy
291        cpy #00                 ; 2         At the endpoint yet?
292        beq exitLoop            ; 2/3
293    
294        iny                     ; 2         Step in y
295  __auto_adx  __auto_adx
296          adc #00                                 ; +DX      adc #00                 ; 2         +DX
297          bcc skip                        ; Time to step in x?      bcc skipX               ; 2/3=10/11 ~50% taken
298                ; Time to step in x
299  __auto_stepx  __auto_stepx
300          inx                             ; Step in x      inx                     ; 2         Step in x
301                    __auto_dy
302  __auto_dy        sbc #00                 ; 2 =  4    -DY
303          sbc #00                         ; -DY  skipX
304        ; Set the new screen adress
305  skip      sta save_a              ; 3 =  3
306          ; Set the new screen adress  
307          sta save_a      ; Update screen adress
308          .(      lda tmp0+0              ; 3
309          ; Update screen adress      adc #40                 ; 2
310          lda tmp0+0                                      ; 3      sta tmp0+0              ; 3
311          adc #40                                         ; 2      bcc loop                ; 2/3       ~84% taken
312          sta tmp0+0                                      ; 3      inc tmp0+1              ; 5
313          bcc skip2                                       ; 2 (+1 if taken)      bcs loop                ; 3
314          inc tmp0+1                                      ; 5                              ;   = 12.12 average
315          clc                                                     ; 2  
316  skip2  ; x  ,y++: 54.12
317          .)  ; x++,y++: 57.12
318    ; average: 55.62
319  draw_pixel        exitLoop
320          ; Draw the pixel      rts
321          sty save_y      .)
         ldy _TableDiv6,x  
         lda _TableBit6Reverse,x  
         eor (tmp0),y  
         sta (tmp0),y  
         lda save_a  
         ldy save_y  
     
 __auto_cpy  
         cpy #00                         ; At the endpoint yet?  
         bne loop  
         rts      
         .)  

Legend:
Removed from v.252  
changed lines
  Added in v.253

  ViewVC Help
Powered by ViewVC 1.1.26