/[projet1]/users/chema/TINE/oobj3d/LineDraw.s
Defence Force logotype

Diff of /users/chema/TINE/oobj3d/LineDraw.s

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

revision 265 by Chema, Mon Feb 8 16:49:54 2010 UTC revision 266 by Chema, Mon Feb 8 22:12:53 2010 UTC
# Line 51  _ClipXc         .dsb 2 Line 51  _ClipXc         .dsb 2
51  _ClipYc         .dsb 2  _ClipYc         .dsb 2
52    
53    
54  save_a          .dsb 1  l8save_a          .dsb 1
55  curBit          .dsb 1  curBit          .dsb 1
56  chunk           .dsb 1  chunk           .dsb 1
57  lastSum         .dsb 1  lastSum         .dsb 1
# Line 206  _TableBit6 Line 206  _TableBit6
206  /////////////////////////////////////  /////////////////////////////////////
207    
208    
209    
210    
211    ; History of linebench timings...
212    ;649
213    ;614 (replacing the update of tmp0)
214    ;607
215    ;588
216    ;583 after alignment
217    ;579
218    ;534 redid mainly_vertical
219    ;529 removed page penalty
220    ;517 final optimization at mainly_horizontal
221    ;501 chunking, initial version
222    ;482 optimized chunking (avg: 38.91 cylces)
223    ;473 final optimization for mainly_vertical (37.89 -> 38.34 corrected)
224    
225    ; TODOs:
226    ; + chunking (-35)
227    ; - two separate branches instead of patching?
228    ; + countdown minor
229    ;   x mainly_horizontal (won't work)
230    ;   + mainly_vertical (-9)
231    
232        .zero
233    
234    ;   *= tmp1
235    
236    
237    
238    #define BYTE_PIXEL  6
239    #define X_SIZE      240
240    #define ROW_SIZE    X_SIZE/BYTE_PIXEL
241    
242    #define _NOP        $ea
243    #define _INX        $e8
244    #define _DEX        $ca
245    #define _INY        $c8
246    #define _DEY        $88
247    #define _ASL        $0a
248    #define _LSR        $4a
249    #define _INC_ZP     $e6
250    #define _DEC_ZP     $c6
251    
252    
253        .text
254    
255      .dsb 256-(*&255)      .dsb 256-(*&255)
256    
257    ;**********************************************************
258  draw_totaly_vertical_8  draw_totaly_vertical_8
259  .(  .(
260      ldx _CurrentPixelX      ldx _CurrentPixelX
261      ldy _TableDiv6,x      ldy _TableDiv6,x
262      lda _TableBit6Reverse,x     ; 4      lda _TableBit6Reverse,x     ; 4
263      sta _mask_patch+1      sta _mask_patch+1
   
264      ldx dy      ldx dy
265      inx      inx
   
266      clc                         ; 2      clc                         ; 2
267  loop  loop
268  _mask_patch  _mask_patch
269      lda #0                      ; 2      lda #0                      ; 2
270      ora (tmp0),y                ; 5      ora (tmp0),y                ; 5*
271      sta (tmp0),y                ; 6 => total = 13 cycles      sta (tmp0),y                ; 6*= 13**
272    
273  ; update the screen address:  ; update the screen address:
274      .(      .(
275      lda tmp0+0                  ; 3      tya                         ; 2
276      adc #ROW_SIZE               ; 2      adc #ROW_SIZE               ; 2
277      sta tmp0+0                  ; 3      tay                         ; 2
278      bcc skip                    ; 2 (+1 if taken)      bcc skip                    ; 2/3= 8/9
279      inc tmp0+1                  ; 5      inc tmp0+1                  ; 5
280      clc                         ; 2      clc                         ; 2 =  7
281  skip  skip                            ;
282      .)      .)
283      ; ------------------Min=13 Max=17      dex                         ; 2
284        bne loop                    ; 2/3=4/5
     dex  
     bne loop  
285      rts      rts
286  .)  .)
287    
288    
289    ;**********************************************************
290  ;  ;
291  ; Expects the following variables to be set when called:  ; Expects the following variables to be set when called:
292  ; _CurrentPixelX  ; _CurrentPixelX
# Line 319  cur_smaller                 ; x1<x2 Line 362  cur_smaller                 ; x1<x2
362  end  end
363  .)  .)
364    
365      jmp alignIt  ;    jmp alignIt
366    ;
367      .dsb 256-(*&255)  ;    .dsb 256-(*&255)
368    ;
369  alignIt  ;alignIt
370      ; Compute slope and call the specialized code for mostly horizontal or vertical lines      ; Compute slope and call the specialized code for mostly horizontal or vertical lines
371      ldy dy      ldy dy
372      beq draw_totaly_horizontal_8      beq draw_totaly_horizontal_8
# Line 331  alignIt Line 374  alignIt
374      bcc draw_mainly_horizontal_8      bcc draw_mainly_horizontal_8
375      jmp draw_mainly_vertical_8      jmp draw_mainly_vertical_8
376    
377    ;**********************************************************
378  draw_totaly_horizontal_8  draw_totaly_horizontal_8
379  .(  .(
380      ; here we have DY in Y, and the OPCODE in A      ; here we have DY in Y, and the OPCODE in A
# Line 354  _outer_patch Line 398  _outer_patch
398      inx      inx
399    
400  __auto_cpx  __auto_cpx
401      cpx #00                 ; At the endpoint yet?      cpx #00                     ; At the endpoint yet?
402      bne outer_loop      bne outer_loop
403      rts      rts
404  .)  .)
405    
406    ;**********************************************************
407  draw_mainly_horizontal_8  draw_mainly_horizontal_8
408  .(  .(
409      tax      tax
# Line 410  endPatch Line 455  endPatch
455      eor #$ff      eor #$ff
456      clc      clc
457  ; a = sum, x = dX+1  ; a = sum, x = dX+1
458    ;----------------------------------------------------------
459  loopX  loopX
460      sta save_a              ; 3 =  3      sta l8save_a              ; 3 =  3
461  loopY  loopY
462      ; Draw the pixel      ; Draw the pixel
463  __auto_div6  __auto_div6
# Line 424  __auto_bit6 Line 469  __auto_bit6
469    
470      dex                     ; 2         Step in x      dex                     ; 2         Step in x
471      beq exitLoop            ; 2/3       At the endpoint yet?      beq exitLoop            ; 2/3       At the endpoint yet?
472      lda save_a              ; 3      lda l8save_a              ; 3
473  __auto_dy  __auto_dy
474      adc #00                 ; 2         +DY      adc #00                 ; 2         +DY
475      bcc loopX               ; 2/3=11/12 ~50% taken      bcc loopX               ; 2/3=11/12 ~33.3% taken (not 50% due do to special code for very horizontal lines)
476      ; Time to step in y      ; Time to step in y
477  __auto_dx  __auto_dx
478      sbc #00                 ; 2         -DX      sbc #00                 ; 2         -DX
479      sta save_a              ; 3 =  5      sta l8save_a              ; 3 =  5
480    
481  ; update the screen address:  ; update the screen address:
482      lda tmp0+0              ; 3      lda tmp0+0              ; 3
483      adc #ROW_SIZE           ; 2      adc #ROW_SIZE           ; 2
484      sta tmp0+0              ; 3      sta tmp0+0              ; 3
485      bcc loopY               ; 2/3=10/11 ~84% taken      bcc loopY               ; 2/3=10/11 ~84.4% taken
486      inc tmp0+1              ; 5      inc tmp0+1              ; 5
487      clc                     ; 2      clc                     ; 2
488      bcc loopY               ; 3 = 10      bcc loopY               ; 3 = 10
489  ; average: 12.44  ; average: 12.40
490    
491  exitLoop  exitLoop
492      rts      rts
493  ; Timings:  ; Timings:
494  ; x++/y  : 34  ; x++/y  : 34    (33.3%)
495  ; x++/y++: 47.44  ; x++/y++: 47.40 (66.7%)
496  ; average: 40.72  ; average: 42.94
497  .)  .)
498    
499        .dsb 256-(*&255)
500    ;**********************************************************
501  draw_very_horizontal_8  draw_very_horizontal_8
502  .(  .(
503  ; dX > 2*dY, here we use "chunking"  ; dX > 2*dY, here we use "chunking"
# Line 459  draw_very_horizontal_8 Line 506  draw_very_horizontal_8
506      sty __auto_dy2+1      sty __auto_dy2+1
507      cpx #_INX      cpx #_INX
508      php      php
509    ; setup pointer and Y:
510      ldx _CurrentPixelX      ldx _CurrentPixelX
511      lda _TableDiv6,x      lda _TableDiv6,x
512      clc      clc
# Line 470  draw_very_horizontal_8 Line 517  draw_very_horizontal_8
517  skipHi  skipHi
518      lda #0      lda #0
519      sta tmp0      sta tmp0
520    ; patch the code:
521      plp      plp
522      beq doInx      beq doInx
523  ; negative x-direction  ; negative x-direction
# Line 514  endPatch Line 561  endPatch
561      sta __auto_pot1+1      sta __auto_pot1+1
562      sta __auto_pot2+1      sta __auto_pot2+1
563      sta __auto_pot3+1      sta __auto_pot3+1
   
564      lda dx      lda dx
565      sta __auto_dx+1      sta __auto_dx+1
566  ; calculate initial bresenham sum  ; calculate initial bresenham sum
# Line 525  endPatch Line 571  endPatch
571      jmp loopX      jmp loopX
572  ; a = sum, x = dX+1, y = ptr-offset  ; a = sum, x = dX+1, y = ptr-offset
573    
574      .dsb 256-(*&255)  ;----------------------------------------------------------
   
575  nextColumn                  ;  nextColumn                  ;
576      tax                     ; 2      tax                     ; 2
577      lda chunk               ; 3      lda chunk               ; 3
# Line 545  __auto_cpy Line 590  __auto_cpy
590  __auto_yHi  __auto_yHi
591      inc tmp0+1              ; 5         dec/inc      inc tmp0+1              ; 5         dec/inc
592      bcc contColumn          ; 3 =  8      bcc contColumn          ; 3 =  8
593    ;----------------------------------------------------------
594  loopY  loopY
595      dec dy                  ; 5         all but one vertical segments drawn?      dec dy                  ; 5         all but one vertical segments drawn?
596      beq exitLoop            ; 2/3= 7/8  yes, exit loop      beq exitLoop            ; 2/3= 7/8  yes, exit loop
# Line 555  loopX Line 600  loopX
600  contColumn                  ;   =  9.85  contColumn                  ;   =  9.85
601  __auto_dy  __auto_dy
602      adc #00                 ; 2         +DY      adc #00                 ; 2         +DY
603      bcc loopX               ; 2/3= 4/5  ~50% taken      bcc loopX               ; 2/3= 4/5  ~75% taken
604      ; Time to step in y      ; Time to step in y
605  __auto_dx  __auto_dx
606      sbc #00                 ; 2         -DX      sbc #00                 ; 2         -DX
607      sta save_a              ; 3 =  5      sta l8save_a              ; 3 =  5
608    
609  ; plot the last bits of current row:  ; plot the last bits of current row:
610  __auto_pot1  __auto_pot1
# Line 575  __auto_pot2 Line 620  __auto_pot2
620      tya                     ; 2      tya                     ; 2
621      adc #ROW_SIZE           ; 2      adc #ROW_SIZE           ; 2
622      tay                     ; 2      tay                     ; 2
623      lda save_a              ; 3      lda l8save_a              ; 3
624      bcc loopY               ; 2/3=11/12 ~84.4% taken      bcc loopY               ; 2/3=11/12 ~84.4% taken
625      inc tmp0+1              ; 5      inc tmp0+1              ; 5
626      clc                     ; 2      clc                     ; 2
# Line 586  __auto_pot2 Line 631  __auto_pot2
631  ; x++/y  : 14.85 (75%)  ; x++/y  : 14.85 (75%)
632  ; x++/y++: 64.25 (25%)  ; x++/y++: 64.25 (25%)
633  ; average: 27.20  ; average: 27.20
634    ;----------------------------------------------------------
635  exitLoop  exitLoop
636  ; draw the last horizontal line segment:  ; draw the last horizontal line segment:
637      adc lastSum             ; 3      adc lastSum             ; 3
# Line 596  loopXEnd Line 641  loopXEnd
641  contColumnEnd               ;   =  9.85  contColumnEnd               ;   =  9.85
642  __auto_dy2  __auto_dy2
643      adc #00                 ; 2         +DY      adc #00                 ; 2         +DY
644      bcc loopXEnd            ; 2/3=11/12 ~50% taken      bcc loopXEnd            ; 2/3= 4/5  ~50% taken
645    
646  ; plot last chunk:  ; plot last chunk:
647  __auto_pot3  __auto_pot3
# Line 605  __auto_pot3 Line 650  __auto_pot3
650      ora (tmp0),y            ; 5      ora (tmp0),y            ; 5
651      sta (tmp0),y            ; 6 = 18      sta (tmp0),y            ; 6 = 18
652      rts      rts
653    ;----------------------------------------------------------
654  nextColumnEnd                  ;  nextColumnEnd                  ;
655      tax                     ; 2      tax                     ; 2
656      lda chunk               ; 3      lda chunk               ; 3
# Line 633  Pot2NTbl Line 678  Pot2NTbl
678      .byte   %00111000, %00111100, %00111110, %00111111      .byte   %00111000, %00111100, %00111110, %00111111
679  .)  .)
680    
   
681      .dsb 256-(*&255)      .dsb 256-(*&255)
682    ;**********************************************************
683  ;  ;
684  ; This code is used when the things are moving faster  ; This code is used when the things are moving faster
685  ; vertically than horizontally  ; vertically than horizontally
# Line 646  draw_mainly_vertical_8 Line 691  draw_mainly_vertical_8
691  .(  .(
692  ; setup bresenham values:  ; setup bresenham values:
693      sty __auto_dy+1      sty __auto_dy+1
     ldx dx  
     stx __auto_dx+1  
694    
695  ; setup direction:  ; setup direction:
696      cmp #_DEX               ;           which direction?      cmp #_DEX               ;           which direction?
# Line 681  endPatch Line 724  endPatch
724      stx __auto_cpY+1      stx __auto_cpY+1
725      sta __auto_yHi      sta __auto_yHi
726  ; setup X  ; setup X
727      tya                     ;           y = dY      ldx dx                  ;           X = dx
728      tax      stx __auto_dx1+1
729      inx                     ;           x = dY+1      stx __auto_dx2+1
730  ; setup current bit:  ; setup current bit:
731      ldy _CurrentPixelX      ldy _CurrentPixelX
732      lda _TableBit6Reverse,y ; 4      lda _TableBit6Reverse,y ; 4
733      sta curBit      sta curBit
734  ; setup pointer and Y:  ; setup pointer and Y:
735  ; TODO: self-modyfing code?  ; TODO: self-modyfing code for the ptrs?
736      lda _TableDiv6,y      lda _TableDiv6,y
737      clc      clc
738      adc tmp0      adc tmp0
# Line 702  skipTmp0 Line 745  skipTmp0
745  ; calculate initial bresenham sum:  ; calculate initial bresenham sum:
746      lda dy      lda dy
747      lsr      lsr
748        sta lastSum
749      eor #$ff                ;           -DY/2      eor #$ff                ;           -DY/2
750      clc                     ; 2      clc                     ; 2
751      bcc loopY               ; 3      bcc loopY               ; 3
752  ; a = sum, y = tmp0, x = dY+1, tmp0 = 0  ; a = sum, y = tmp0, x = dX, tmp0 = 0
753    ;----------------------------------------------------------
754  incHiPtr                    ; 9  incHiPtr                    ;
755      inc tmp0+1              ; 5      inc tmp0+1              ; 5
756      clc                     ; 2      clc                     ; 2
757      bcc contHiPtr           ; 3      bcc contHiPtr           ; 3
758  ;----------------------------------------------------------  ;----------------------------------------------------------
759  loopY  loopY
760      sta save_a              ; 3 =  3      sta l8save_a              ; 3
761        lda curBit              ; 3 =  6
762    loopX
763      ; Draw the pixel      ; Draw the pixel
     lda curBit              ; 3  
764      ora (tmp0),y            ; 5      ora (tmp0),y            ; 5
765      sta (tmp0),y            ; 6 = 14      sta (tmp0),y            ; 6 = 11
   
     dex                     ; 2         At the endpoint yet?  
     beq exitLoop            ; 2/3= 4/5  
 loopX  
766  ; update the screen address:  ; update the screen address:
767      tya                     ; 2      tya                     ; 2
768      adc #ROW_SIZE           ; 2      adc #ROW_SIZE           ; 2
769      tay                     ; 2      tay                     ; 2
770      bcs incHiPtr            ; 2/13      ~16% taken      bcs incHiPtr            ; 2/13      ~15.6% taken
771  contHiPtr                   ;   =  9.76 average  contHiPtr                   ;   =  9.72 average
772        lda l8save_a              ; 3
773      lda save_a              ; 3  __auto_dx1
 __auto_dx  
774      adc #00                 ; 2         +DX      adc #00                 ; 2         +DX
775      bcc loopY               ; 2/3= 7/8  ~50% taken      bcc loopY               ; 2/3= 7/8  ~50% taken
   
776      ; Time to step in x      ; Time to step in x
777  __auto_dy  __auto_dy
778      sbc #00                 ; 2         -DY      sbc #00                 ; 2         -DY
779      sta save_a              ; 3 =  5      sta l8save_a              ; 3 =  5
780    
781      lda curBit              ; 3      lda curBit              ; 3
782  __auto_cpBit                ;           TODO: optimize  __auto_cpBit                ;           TODO: optimize
783      cmp #%00100000          ; 2         %00100000/%00000001      cmp #%00100000          ; 2         %00100000/%00000001
784      beq nextColumn          ; 2/14.07   ~17% taken      beq nextColumn          ; 2/14.07   ~16.7% taken
785  __auto_shBit  __auto_shBit
786      asl                     ; 2         asl/lsr, clears carry      asl                     ; 2         asl/lsr, clears carry
787  contNextColumn  contNextColumn
788      sta curBit              ; 3 =~13.71      sta curBit              ; 3 =~13.68
789    ; step in x:
790        dex                     ; 2         At the endpoint yet?
791        bne loopX               ; 2/3= 4/5
792    
793    ; x  ,y++: 34.72 (50%)
794    ; x++,y++: 51.40 (50%)
795    ; average: 43.06
796    
797    ; draw the last vertical line segment:
798        lda l8save_a              ; 3
799        adc lastSum             ; 3
800    loopYEnd
801        tax                     ; 2 =  2
802      ; Draw the pixel      ; Draw the pixel
803        lda curBit              ; 3
804      ora (tmp0),y            ; 5      ora (tmp0),y            ; 5
805      sta (tmp0),y            ; 6 = 11      sta (tmp0),y            ; 6 = 14
806      dex                     ; 2         At the endpoint yet?  ; update the screen address:
807      bne loopX               ; 2/3= 4/5      tya                     ; 2
808  exitLoop      adc #ROW_SIZE           ; 2
809        tay                     ; 2
810        bcs incHiPtrEnd         ; 2/13      ~15.6% taken
811    contHiPtrEnd                ;   =  9.72 average
812        txa                     ; 2
813    __auto_dx2
814        adc #00                 ; 2         +DX
815        bcc loopYEnd            ; 2/3= 6/7  ~25% taken
816      rts      rts
817  ;----------------------------------------------------------  ;----------------------------------------------------------
818  nextColumn  nextColumn
# Line 769  __auto_yHi Line 828  __auto_yHi
828      dec tmp0+1              ; 5         dec/inc      dec tmp0+1              ; 5         dec/inc
829      bcc contNextColumn      ; 3      bcc contNextColumn      ; 3
830    
831  ; x  ,y++: 38.76 (50%)  incHiPtrEnd                 ; 9
832  ; x++,y++: 51.47 (50%)      inc tmp0+1              ; 5
833  ; average: 45.11      clc                     ; 2
834        bcc contHiPtrEnd        ; 3
835    ;----------------------------------------------------------
836  .)  .)
837    
838  ; *** total timings: ***  ; *** total timings: ***
839  ; draw_very_horizontal_8   (29.6%): 27.20  ; draw_very_horizontal_8   (29.6%): 27.20
840  ; draw_mainly_horizontal_8 (20.4%): 40.72  ; draw_mainly_horizontal_8 (20.4%): 42.94 <- corrected!
841  ; draw_mainly_vertical_8   (50.0%): 45.11  ; draw_mainly_vertical_8   (50.0%): 43.06
842  ;----------------------------------------  ;----------------------------------------
843  ; total average           (100.0%): 38.91  ; total average           (100.0%): 38.34
844    
845    
846    
847    

Legend:
Removed from v.265  
changed lines
  Added in v.266

  ViewVC Help
Powered by ViewVC 1.1.26