/[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 260 by thrust26, Sun Feb 7 23:13:49 2010 UTC revision 261 by thrust26, Mon Feb 8 14:01:57 2010 UTC
# Line 1  Line 1 
1  ; History of timings...  ; History of linebench timings...
2  ;649  ;649
3  ;614 (replacing the update of tmp0)  ;614 (replacing the update of tmp0)
4  ;607  ;607
# Line 9  Line 9 
9  ;529 removed page penalty  ;529 removed page penalty
10  ;517 final optimization at mainly_horizontal  ;517 final optimization at mainly_horizontal
11  ;501 chunking, initial version  ;501 chunking, initial version
12    ;482 optimized chunking (avg: 38.91 cylces)
13    
14    
15    ; TODOs:
16    ; + chunking
17    ; - two separate branches instead of patching?
18    ; - countdown minor
19    ;   - mainly horizontal
20    ;   - mainly vertical
21    
22      .zero      .zero
23    
# Line 24  Line 33 
33  ;_OtherPixelY   .dsb 1  ;_OtherPixelY   .dsb 1
34    
35  save_a          .dsb 1  save_a          .dsb 1
 save_y          .dsb 1  
36  curBit          .dsb 1  curBit          .dsb 1
37  chunk           .dsb 1  chunk           .dsb 1
38    lastSum         .dsb 1
39    
40    
41  #define BYTE_PIXEL  6  #define BYTE_PIXEL  6
42  #define X_SIZE      240  #define X_SIZE      240
# Line 295  draw_very_horizontal_8 Line 305  draw_very_horizontal_8
305  ; dX > 2*dY, here we use "chunking"  ; dX > 2*dY, here we use "chunking"
306  ; here we have DY in Y, and the OPCODE (inx, dex) in A  ; here we have DY in Y, and the OPCODE (inx, dex) in A
307      sty __auto_dy+1      sty __auto_dy+1
308        sty __auto_dy2+1
309      cpx #_INX      cpx #_INX
310      beq doInx      php
311    
312      ldx _CurrentPixelX      ldx _CurrentPixelX
313      ldy _TableDiv6-1,x      lda _TableDiv6,x
314        clc
315        adc tmp0
316        tay
317        bcc skipHi
318        inc tmp0+1
319    skipHi
320        lda #0
321        sta tmp0
322    
323        plp
324        beq doInx
325    ; negative x-direction
326      lda _TableMod6,x      lda _TableMod6,x
327      tax      tax
328    
329      lda #_DEY      lda #_DEY
330      sta __auto_stepx      sta __auto_stepx
331        sta __auto_stepx2
332      lda #$ff      lda #$ff
333      sta __auto_cpY+1      sta __auto_cpy+1
334        sta __auto_cpy2+1
335      lda #_DEC_ZP      lda #_DEC_ZP
336      sta __auto_yHi      sta __auto_yHi
337        sta __auto_yHi2
338      lda Pot2NTbl,x      lda Pot2NTbl,x
339      sta chunk      sta chunk
340      lda #<Pot2NCTbl      lda #<Pot2NTbl
341      bne endPatch      bne endPatch
342    
343  doInx  doInx
344      ldx _CurrentPixelX  ; positive x-direction
     ldy _TableDiv6-1,x  
345      lda #BYTE_PIXEL-1      lda #BYTE_PIXEL-1
346      sec  ;    sec
347      sbc _TableMod6,x      sbc _TableMod6,x
348      tax      tax
349    
350      lda #_INY      lda #_INY
351      sta __auto_stepx      sta __auto_stepx
352        sta __auto_stepx2
353      lda #$00      lda #$00
354      sta __auto_cpY+1      sta __auto_cpy+1
355        sta __auto_cpy2+1
356      lda #_INC_ZP      lda #_INC_ZP
357      sta __auto_yHi      sta __auto_yHi
358        sta __auto_yHi2
359      lda Pot2PTbl,x      lda Pot2PTbl,x
360      sta chunk      sta chunk
361      lda #<Pot2PCTbl      lda #<Pot2PTbl
362  endPatch  endPatch
363      sta __auto_pot_1+1      sta __auto_pot1+1
364      sta __auto_pot_2+1      sta __auto_pot2+1
365      sta __auto_pot_3+1      sta __auto_pot3+1
366    
367      lda dx      lda dx
368      sta __auto_dx+1      sta __auto_dx+1
369    ; calculate initial bresenham sum
370      lsr      lsr
371      eor #$ff      sta lastSum             ; 3         this is used for the last line segment
372        eor #$ff                ;           = -dx/2
373      clc      clc
374      inc dx                  ; 5         +1 since we count to 0      jmp loopX
375      bcc loopX  ; a = sum, x = dX+1, y = ptr-offset
 ; a = sum, x = dX+1  
376    
377      .dsb 256-(*&255)      .dsb 256-(*&255)
378    
# Line 358  nextColumn                  ; Line 387  nextColumn                  ;
387      ldx #BYTE_PIXEL-1       ; 2      ldx #BYTE_PIXEL-1       ; 2
388  __auto_stepx  __auto_stepx
389      iny                     ; 2         next column      iny                     ; 2         next column
390  __auto_cpY  __auto_cpy
391      cpy #00                 ; 2      cpy #00                 ; 2
392      clc                     ; 2      clc                     ; 2
393      bne contColumn          ; 2/3=33/34 99% taken      bne contColumn          ; 2/3=33/34 99% taken
# Line 366  __auto_yHi Line 395  __auto_yHi
395      inc tmp0+1              ; 5         dec/inc      inc tmp0+1              ; 5         dec/inc
396      bcc contColumn          ; 3 =  8      bcc contColumn          ; 3 =  8
397    
 loopX  
398  loopY  loopY
399        dec dy                  ; 5         all but one vertical segments drawn?
400        beq exitLoop            ; 2/3= 7/8  yes, exit loop
401    loopX
402      dex                     ; 2      dex                     ; 2
403      bmi nextColumn          ; 2/37.03   ~17% taken      bmi nextColumn          ; 2/37.03   ~16.7% taken
404  contColumn                  ;   =  9.84  contColumn                  ;   =  9.85
     dec dx                  ; 5         Step in x       TODO: move into loopY  
     beq exitLoop            ; 2/3       At the endpoint yet?  
405  __auto_dy  __auto_dy
406      adc #00                 ; 2         +DY      adc #00                 ; 2         +DY
407      bcc loopX               ; 2/3=11/12 ~50% taken      bcc loopX               ; 2/3= 4/5  ~50% taken
408      ; Time to step in y      ; Time to step in y
409  __auto_dx  __auto_dx
410      sbc #00                 ; 2         -DX      sbc #00                 ; 2         -DX
411      sta save_a              ; 3 =  5      sta save_a              ; 3 =  5
412    
413  ; plot the last bits of current row:  ; plot the last bits of current row:
414  __auto_pot_1  __auto_pot1
415      lda Pot2PCTbl,x         ; 4      lda Pot2PTbl,x          ; 4
416      eor chunk               ; 3      eor chunk               ; 3
417      eor (tmp0),y            ; 5      eor (tmp0),y            ; 5
418      sta (tmp0),y            ; 6      sta (tmp0),y            ; 6
419  __auto_pot_2  __auto_pot2
420      lda Pot2PCTbl,x         ; 4      lda Pot2PTbl,x          ; 4
421      sta chunk               ; 3 = 25      sta chunk               ; 3 = 25
422    
423  ; update the screen address:  ; update the screen address:
# Line 396  __auto_pot_2 Line 425  __auto_pot_2
425      adc #ROW_SIZE           ; 2      adc #ROW_SIZE           ; 2
426      tay                     ; 2      tay                     ; 2
427      lda save_a              ; 3      lda save_a              ; 3
428      bcc loopY               ; 2/3=11/12 ~84% taken      bcc loopY               ; 2/3=11/12 ~84.4% taken
429      inc tmp0+1              ; 5      inc tmp0+1              ; 5
430      clc                     ; 2      clc                     ; 2
431      bcc loopY               ; 3 = 10      bcc loopY               ; 3 = 10
432  ; average: 13.44  ; average: 13.40
433    
434    ; Timings:
435    ; x++/y  : 14.85 (75%)
436    ; x++/y++: 64.25 (25%)
437    ; average: 27.20
438    
439  exitLoop  exitLoop
440  ; plot last byte:  ; draw the last horizontal line segment:
441  __auto_pot_3      adc lastSum             ; 3
442      lda Pot2PCTbl,x         ; 4  loopXEnd
443        dex                     ; 2
444        bmi nextColumnEnd       ; 2/37.03   ~16.7% taken
445    contColumnEnd               ;   =  9.85
446    __auto_dy2
447        adc #00                 ; 2         +DY
448        bcc loopXEnd            ; 2/3=11/12 ~50% taken
449    
450    ; plot last chunk:
451    __auto_pot3
452        lda Pot2PTbl,x          ; 4
453      eor chunk               ; 3      eor chunk               ; 3
454      eor (tmp0),y            ; 5      eor (tmp0),y            ; 5
455      sta (tmp0),y            ; 6 = 18      sta (tmp0),y            ; 6 = 18
456      rts      rts
457  ; Timings:  
458  ; x++/y  : 21.84 (75%)  nextColumnEnd                  ;
459  ; x++/y++: 64.28 (25%)      tax                     ; 2
460  ; average: 32.45      lda chunk               ; 3
461        eor (tmp0),y            ; 5
462        sta (tmp0),y            ; 6
463        lda #%00111111          ; 2
464        sta chunk               ; 3
465        txa                     ; 2
466        ldx #BYTE_PIXEL-1       ; 2
467    __auto_stepx2
468        iny                     ; 2         next column
469    __auto_cpy2
470        cpy #00                 ; 2
471        clc                     ; 2
472        bne contColumnEnd       ; 2/3=33/34 99% taken
473    __auto_yHi2
474        inc tmp0+1              ; 5         dec/inc
475        bcc contColumnEnd       ; 3 =  8
476    
477  Pot2PTbl  Pot2PTbl
 ;    .byte   %00000001, %00000011, %00000111, %00001111  
 ;    .byte   %00011111, %00111111  
 Pot2PCTbl  
478      .byte   %00000001, %00000011, %00000111, %00001111      .byte   %00000001, %00000011, %00000111, %00001111
479      .byte   %00011111, %00111111      .byte   %00011111, %00111111
480  Pot2NTbl  Pot2NTbl
 Pot2NCTbl  
481      .byte   %00100000, %00110000      .byte   %00100000, %00110000
482      .byte   %00111000, %00111100, %00111110, %00111111      .byte   %00111000, %00111100, %00111110, %00111111
483  .)  .)
# Line 443  draw_mainly_vertical_8 Line 498  draw_mainly_vertical_8
498      ldx dx      ldx dx
499      stx __auto_dx+1      stx __auto_dx+1
500    
 ; TODO: two separate branches depending on x-direction  
501  ; setup direction:  ; setup direction:
502      cmp #_DEX               ;           which direction?      cmp #_DEX               ;           which direction?
503      bne doInx      bne doInx
# Line 569  __auto_yHi Line 623  __auto_yHi
623  ; average: 45.11  ; average: 45.11
624  .)  .)
625    
626    ; *** total timings: ***
627    ; draw_very_horizontal_8   (29.6%): 27.20
628    ; draw_mainly_horizontal_8 (20.4%): 40.72
629    ; draw_mainly_vertical_8   (50.0%): 45.11
630    ;----------------------------------------
631    ; total average           (100.0%): 38.91
632    
633    
634    

Legend:
Removed from v.260  
changed lines
  Added in v.261

  ViewVC Help
Powered by ViewVC 1.1.26