/[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 254 by thrust26, Sat Feb 6 16:11:25 2010 UTC revision 255 by thrust26, Sat Feb 6 22:32:14 2010 UTC
# Line 21  Line 21 
21    
22  save_a          .dsb 1  save_a          .dsb 1
23  save_y          .dsb 1  save_y          .dsb 1
24    curBit          .dsb 1
25    
26      .text      .text
27    
# Line 32  save_y          .dsb 1 Line 33  save_y          .dsb 1
33  ; iny $c8 11001000  ; iny $c8 11001000
34  ; dey $88 10001000  ; dey $88 10001000
35    
36    #define _NOP    $ea
37    #define _INX    $e8
38    #define _DEX    $ca
39    #define _INY    $c8
40    #define _DEY    $88
41    #define _ASL    $0a
42    #define _LSR    $4a
43    #define _INC_ZP $e6
44    #define _DEC_ZP $c6
45    
46    
47    
48  draw_totaly_vertical_8  draw_totaly_vertical_8
# Line 154  alignIt Line 165  alignIt
165      ldy dy      ldy dy
166      beq draw_totaly_horizontal_8      beq draw_totaly_horizontal_8
167      cpy dx      cpy dx
168      bcs draw_nearly_vertical_8      bcs draw_mainly_vertical_8
169    
170  draw_nearly_horizontal_8  draw_mainly_horizontal_8
171      .(      .(
172      ; here we have DY in Y, and the OPCODE in A      ; here we have DY in Y, and the OPCODE in A
173      sta __auto_stepx        ; Write a (dex / nop / inx) instruction      sta __auto_stepx        ; Write a (dex / nop / inx) instruction
# Line 175  skipDex Line 186  skipDex
186      ldx _CurrentPixelX      ;Plotting coordinates      ldx _CurrentPixelX      ;Plotting coordinates
187      ldy _CurrentPixelY      ;in X and Y      ldy _CurrentPixelY      ;in X and Y
188    
189      lda dy      lda dx
190      lsr      lsr
191      eor #$ff      eor #$ff
192  ;    clc  ;    clc
# Line 257  __auto_cpx Line 268  __auto_cpx
268  ;  ;
269  ; dy>dx  ; dy>dx
270  ;  ;
271  draw_nearly_vertical_8  draw_mainly_vertical_8
272    ; here we have DY in Y, and the OPCODE in A
273      .(      .(
274      ; here we have DY in Y, and the OPCODE in A  ; setup bresenham values:
     sta __auto_stepx        ; Write a (dex / nop / inx) instruction  
275      sty __auto_dy+1      sty __auto_dy+1
276        ldx dx
277        stx __auto_dx+1
278    
279      lda dx  ; setup direction:
280      sta __auto_adx+1  ;    sta __auto_stepx        ;       Write a (dex / nop / inx) instruction
281        cmp #_DEX               ;       which direction
282      lda _OtherPixelY      bne doInx
283      sta __auto_cpy+1  ; dex, moving left:
284        lda #%00100000
285      ldx _CurrentPixelX      ; Plotting coordinates      sta __auto_cpBit+1
286      ldy _CurrentPixelY      ; in X and Y      lda #_ASL               ;
287        sta __auto_shBit
288      lda dx      lda #%00000001
289        sta __auto_ldBit+1
290        lda #_DEY
291        sta __auto_yLo
292        lda #$ff
293        sta __auto_cpY+1
294        lda #_DEC_ZP
295        sta __auto_yHi
296        bne endX
297    
298    doInx
299    ; inx, moving right
300        lda #%00000001
301        sta __auto_cpBit+1
302        lda #_LSR
303        sta __auto_shBit
304        lda #%00100000
305        sta __auto_ldBit+1
306        lda #_INY
307        sta __auto_yLo
308        lda #$00
309        sta __auto_cpY+1
310        lda #_INC_ZP
311        sta __auto_yHi
312    endX
313    ; setup X
314        tya                     ;       y = dY
315        tax
316        inx                     ;       x = dY+1
317    ; setup current bit:
318        ldy _CurrentPixelX
319        lda _TableBit6Reverse,y ; 4
320        sta curBit
321    ; setup pointer and Y:
322    ; TODO: self-modyfing code?
323        lda _TableDiv6,y
324        clc
325        adc tmp0
326        tay
327        lda #0
328        sta tmp0
329        bcc skipTmp0
330        inc tmp0+1
331    skipTmp0
332    ; calculate initial bresenham sum:
333        lda dy
334      lsr      lsr
335      eor #$ff                ; -DX/2      eor #$ff                ; -DX/2
336      sta save_a              ;      clc                     ; 2
337  ;    clc      bcc loopY               ; 3
338    ; a = sum, y = tmp0, x = dY+1, tmp0 = 0
339    
340  loop  incHiPtr                    ; 9
341        inc tmp0+1              ; 5
342        clc                     ; 2
343        bcc contHiPtr           ; 3
344    
345    loopY
346        sta save_a              ; 3 =  3
347      ; Draw the pixel      ; Draw the pixel
348      sty save_y              ; 3      lda curBit              ; 3
     ldy _TableDiv6,x        ; 4  
     lda _TableBit6Reverse,x ; 4  
349      eor (tmp0),y            ; 5*      eor (tmp0),y            ; 5*
350      sta (tmp0),y            ; 6*      sta (tmp0),y            ; 6*= 14**
     lda save_a              ; 3  
     ldy save_y              ; 3 = 28  
351    
352  __auto_cpy      dex                     ; 2         At the endpoint yet?
353      cpy #00                 ; 2         At the endpoint yet?      beq exitLoop            ; 2/3= 4/5
354      beq exitLoop            ; 2/3  loopX
355        ; Update screen adress
356        tya                     ; 2
357        adc #40                 ; 2
358        tay                     ; 2
359        bcs incHiPtr            ; 2/13      ~16% taken
360    contHiPtr                   ;   =  9.76 average
361    
362      iny                     ; 2         Step in y      lda save_a              ; 3
363  __auto_adx  __auto_dx
364      adc #00                 ; 2         +DX      adc #00                 ; 2         +DX
365      bcc skipX               ; 2/3=10/11 ~50% taken      bcc loopY               ; 2/3= 7/8  ~50% taken
366    
367      ; Time to step in x      ; Time to step in x
 __auto_stepx  
     inx                     ; 2         Step in x  
368  __auto_dy  __auto_dy
369      sbc #00                 ; 2 =  4    -DY      sbc #00                 ; 2         -DY
370  skipX      sta save_a              ; 3 =  5
     ; Set the new screen adress  
     sta save_a              ; 3 =  3  
371    
372      ; Update screen adress      lda curBit              ; 3
373      lda tmp0+0              ; 3  __auto_cpBit
374      adc #40                 ; 2      cmp #%00100000          ; 2         %00100000/%00000001
375      sta tmp0+0              ; 3      beq nextColumn          ; 2/14.07   ~17% taken
376      bcc loop                ; 2/3       ~84% taken  __auto_shBit
377      inc tmp0+1              ; 5      asl                     ; 2         asl/lsr, clears carry
378      bcs loop                ; 3  contNextColumn
379                              ;   = 12.12 average      sta curBit              ; 3 =~13.71
380    
381  ; x  ,y++: 54.12      ; Draw the pixel
382  ; x++,y++: 57.12      eor (tmp0),y            ; 5*
383  ; average: 55.62      sta (tmp0),y            ; 6*= 11**
384        dex                     ; 2         At the endpoint yet?
385        bne loopX               ; 2/3= 4/5
386  exitLoop  exitLoop
387      rts      rts
388    
389    nextColumn
390    __auto_ldBit
391        lda #%00000001          ; 2         %00000001/%00100000
392    __auto_yLo
393        dey                     ; 2
394    __auto_cpY
395        cpy #$ff                ; 2
396        clc                     ; 2         TODO: optimize
397        bne contNextColumn      ; 2/3       ~99% taken
398    __auto_yHi
399        dec tmp0+1              ; 5
400        bcc contNextColumn      ; 3
401    
402    ; x  ,y++: 38.76** (50%)
403    ; x++,y++: 51.47** (50%)
404    ; average: 45.11**
405    
406    
407    ; x  ,y++: 54.12**
408    ; x++,y++: 57.12**
409    ; average: 55.62**
410      .)      .)

Legend:
Removed from v.254  
changed lines
  Added in v.255

  ViewVC Help
Powered by ViewVC 1.1.26