/[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 258 by thrust26, Sun Feb 7 14:05:11 2010 UTC revision 259 by thrust26, Sun Feb 7 23:13:49 2010 UTC
# Line 8  Line 8 
8  ;534 redid mainly_vertical  ;534 redid mainly_vertical
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
12    
13      .zero      .zero
14    
# Line 25  Line 26 
26  save_a          .dsb 1  save_a          .dsb 1
27  save_y          .dsb 1  save_y          .dsb 1
28  curBit          .dsb 1  curBit          .dsb 1
29    chunk           .dsb 1
30    
31    #define BYTE_PIXEL  6
32  #define X_SIZE      240  #define X_SIZE      240
33  #define ROW_SIZE    X_SIZE/6  #define ROW_SIZE    X_SIZE/BYTE_PIXEL
34    
35  #define _NOP        $ea  #define _NOP        $ea
36  #define _INX        $e8  #define _INX        $e8
# Line 61  _mask_patch Line 64  _mask_patch
64      eor (tmp0),y                ; 5      eor (tmp0),y                ; 5
65      sta (tmp0),y                ; 6 => total = 13 cycles      sta (tmp0),y                ; 6 => total = 13 cycles
66    
67      ; Update screen adress  ; update the screen address:
68      .(      .(
69      lda tmp0+0                  ; 3      lda tmp0+0                  ; 3
70      adc #ROW_SIZE               ; 2      adc #ROW_SIZE               ; 2
# Line 164  alignIt Line 167  alignIt
167      ldy dy      ldy dy
168      beq draw_totaly_horizontal_8      beq draw_totaly_horizontal_8
169      cpy dx      cpy dx
170      bcc draw_mainly_horizontal_8_new      bcc draw_mainly_horizontal_8
171      jmp draw_mainly_vertical_8      jmp draw_mainly_vertical_8
172    
173  draw_totaly_horizontal_8  draw_totaly_horizontal_8
174      .(  .(
175      ; here we have DY in Y, and the OPCODE in A      ; here we have DY in Y, and the OPCODE in A
176      sta _outer_patch    ; Write a (dex / nop / inx) instruction      sta _outer_patch    ; Write a (dex / nop / inx) instruction
177    
# Line 196  __auto_cpx Line 199  __auto_cpx
199  .)  .)
200    
201  draw_mainly_horizontal_8  draw_mainly_horizontal_8
202      .(  .(
203      ; here we have DY in Y, and the OPCODE in A      tax
     sta __auto_stepx        ; Write a (dex / nop / inx) instruction  
     cmp #_DEX               ; dex?  
     bne skipDex  
     dey                     ; adjust for carry being set in loop  
 skipDex  
     sty __auto_ady+1  
   
     lda _OtherPixelX  
     sta __auto_cpx+1  
   
     ldx _CurrentPixelX      ;Plotting coordinates  
 ;    ldy _CurrentPixelY      ;in X and Y  
   
204      lda dx      lda dx
     sta __auto_dx+1  
205      lsr      lsr
206      eor #$ff      cmp dy
207  ;    clc      bcs draw_very_horizontal_8
208    
 loopX  
     sta save_a              ; 3 =  3  
 loopY  
     ; Draw the pixel  
 __auto_div6  
     ldy _TableDiv6,x        ; 4  
 __auto_bit6  
     lda _TableBit6Reverse,x ; 4  
     eor (tmp0),y            ; 5*  
     sta (tmp0),y            ; 6*= 19  
   
 __auto_cpx  
     cpx #00                 ; 2         At the endpoint yet?  
     beq exitLoop            ; 2/3  
 __auto_stepx  
     inx                     ; 2         Step in x  
     lda save_a              ; 3  
 __auto_ady  
     adc #00                 ; 2         +DY         TODO: bugfix carry  
     bcc loopX               ; 2/3=13/14 ~50% taken  
     ; Time to step in y  
 __auto_dx  
     sbc #00                 ; 2         -DX  
     sta save_a              ; 3 =  5  
   
     ; Set the new screen adress  
     lda tmp0+0              ; 3  
     adc #ROW_SIZE           ; 2  
     sta tmp0+0              ; 3  
     bcc loopY               ; 2/3=10/11 ~84% taken  
     inc tmp0+1              ; 5  
     bcs loopY               ; 3 =  8  
 ; average: 12.12  
   
 exitLoop  
     rts  
 ; Timings:  
 ; x++/y  : 36  
 ; x++/y++: 49.12  
 ; average: 42.56  
     .)  
   
   
 draw_mainly_horizontal_8_new  
     .(  
209  ; 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
210      sty __auto_dy+1      sty __auto_dy+1
211    
212      cmp #_INX  ; all this stress to be able to use dex, beq :)
213        cpx #_INX
214      beq doInx      beq doInx
215    
216      lda #<_TableDiv6-1          ; == 0      lda #<_TableDiv6-1          ; == 0
# Line 298  endPatch Line 243  endPatch
243    
244      lda dx      lda dx
245      tax      tax
246      inx      inx                     ; 2         +1 since we count to 0
247      sta __auto_dx+1      sta __auto_dx+1
248      lsr      lsr
249      eor #$ff      eor #$ff
# Line 320  __auto_bit6 Line 265  __auto_bit6
265      beq exitLoop            ; 2/3       At the endpoint yet?      beq exitLoop            ; 2/3       At the endpoint yet?
266      lda save_a              ; 3      lda save_a              ; 3
267  __auto_dy  __auto_dy
268      adc #00                 ; 2         +DY         TODO: bugfix carry      adc #00                 ; 2         +DY
269      bcc loopX               ; 2/3=11/12 ~50% taken      bcc loopX               ; 2/3=11/12 ~50% taken
270      ; Time to step in y      ; Time to step in y
271  __auto_dx  __auto_dx
272      sbc #00                 ; 2         -DX      sbc #00                 ; 2         -DX
273      sta save_a              ; 3 =  5      sta save_a              ; 3 =  5
274    
275      ; Set the new screen adress  ; update the screen address:
276      lda tmp0+0              ; 3      lda tmp0+0              ; 3
277      adc #ROW_SIZE           ; 2      adc #ROW_SIZE           ; 2
278      sta tmp0+0              ; 3      sta tmp0+0              ; 3
# Line 341  exitLoop Line 286  exitLoop
286      rts      rts
287  ; Timings:  ; Timings:
288  ; x++/y  : 34  ; x++/y  : 34
289  ; x++/y++: 47.12  ; x++/y++: 47.44
290  ; average: 40.56  ; average: 40.72
291      .)  .)
292    
293    draw_very_horizontal_8
294    .(
295    ; dX > 2*dY, here we use "chunking"
296    ; here we have DY in Y, and the OPCODE (inx, dex) in A
297        sty __auto_dy+1
298        cpx #_INX
299        beq doInx
300    
301        ldx _CurrentPixelX
302        ldy _TableDiv6-1,x
303        lda _TableMod6,x
304        tax
305    
306        lda #_DEY
307        sta __auto_stepx
308        lda #$ff
309        sta __auto_cpY+1
310        lda #_DEC_ZP
311        sta __auto_yHi
312        lda Pot2NTbl,x
313        sta chunk
314        lda #<Pot2NCTbl
315        bne endPatch
316    
317    doInx
318        ldx _CurrentPixelX
319        ldy _TableDiv6-1,x
320        lda #BYTE_PIXEL-1
321        sec
322        sbc _TableMod6,x
323        tax
324    
325        lda #_INY
326        sta __auto_stepx
327        lda #$00
328        sta __auto_cpY+1
329        lda #_INC_ZP
330        sta __auto_yHi
331        lda Pot2PTbl,x
332        sta chunk
333        lda #<Pot2PCTbl
334    endPatch
335        sta __auto_pot_1+1
336        sta __auto_pot_2+1
337        sta __auto_pot_3+1
338    
339        lda dx
340        sta __auto_dx+1
341        lsr
342        eor #$ff
343        clc
344        inc dx                  ; 5         +1 since we count to 0
345        bcc loopX
346    ; a = sum, x = dX+1
347    
348      .dsb 256-(*&255)      .dsb 256-(*&255)
349    
350    nextColumn                  ;
351        tax                     ; 2
352        lda chunk               ; 3
353        eor (tmp0),y            ; 5
354        sta (tmp0),y            ; 6
355        lda #%00111111          ; 2
356        sta chunk               ; 3
357        txa                     ; 2
358        ldx #BYTE_PIXEL-1       ; 2
359    __auto_stepx
360        iny                     ; 2         next column
361    __auto_cpY
362        cpy #00                 ; 2
363        clc                     ; 2
364        bne contColumn          ; 2/3=33/34 99% taken
365    __auto_yHi
366        inc tmp0+1              ; 5         dec/inc
367        bcc contColumn          ; 3 =  8
368    
369    loopX
370    loopY
371        dex                     ; 2
372        bmi nextColumn          ; 2/37.03   ~17% taken
373    contColumn                  ;   =  9.84
374        dec dx                  ; 5         Step in x       TODO: move into loopY
375        beq exitLoop            ; 2/3       At the endpoint yet?
376    __auto_dy
377        adc #00                 ; 2         +DY
378        bcc loopX               ; 2/3=11/12 ~50% taken
379        ; Time to step in y
380    __auto_dx
381        sbc #00                 ; 2         -DX
382        sta save_a              ; 3 =  5
383    
384    ; plot the last bits of current row:
385    __auto_pot_1
386        lda Pot2PCTbl,x         ; 4
387        eor chunk               ; 3
388        eor (tmp0),y            ; 5
389        sta (tmp0),y            ; 6
390    __auto_pot_2
391        lda Pot2PCTbl,x         ; 4
392        sta chunk               ; 3 = 25
393    
394    ; update the screen address:
395        tya                     ; 2
396        adc #ROW_SIZE           ; 2
397        tay                     ; 2
398        lda save_a              ; 3
399        bcc loopY               ; 2/3=11/12 ~84% taken
400        inc tmp0+1              ; 5
401        clc                     ; 2
402        bcc loopY               ; 3 = 10
403    ; average: 13.44
404    
405    exitLoop
406    ; plot last byte:
407    __auto_pot_3
408        lda Pot2PCTbl,x         ; 4
409        eor chunk               ; 3
410        eor (tmp0),y            ; 5
411        sta (tmp0),y            ; 6 = 18
412        rts
413    ; Timings:
414    ; x++/y  : 21.84 (75%)
415    ; x++/y++: 64.28 (25%)
416    ; average: 32.45
417    
418    Pot2PTbl
419    ;    .byte   %00000001, %00000011, %00000111, %00001111
420    ;    .byte   %00011111, %00111111
421    Pot2PCTbl
422        .byte   %00000001, %00000011, %00000111, %00001111
423        .byte   %00011111, %00111111
424    Pot2NTbl
425    Pot2NCTbl
426        .byte   %00100000, %00110000
427        .byte   %00111000, %00111100, %00111110, %00111111
428    .)
429    
430    
431        .dsb 256-(*&255)
432  ;  ;
433  ; This code is used when the things are moving faster  ; This code is used when the things are moving faster
434  ; vertically than horizontally  ; vertically than horizontally
# Line 356  exitLoop Line 437  exitLoop
437  ;  ;
438  draw_mainly_vertical_8  draw_mainly_vertical_8
439  ; here we have DY in Y, and the OPCODE in A  ; here we have DY in Y, and the OPCODE in A
440      .(  .(
441  ; setup bresenham values:  ; setup bresenham values:
442      sty __auto_dy+1      sty __auto_dy+1
443      ldx dx      ldx dx
# Line 436  loopY Line 517  loopY
517      dex                     ; 2         At the endpoint yet?      dex                     ; 2         At the endpoint yet?
518      beq exitLoop            ; 2/3= 4/5      beq exitLoop            ; 2/3= 4/5
519  loopX  loopX
520      ; Update screen adress  ; update the screen address:
521      tya                     ; 2      tya                     ; 2
522      adc #ROW_SIZE           ; 2      adc #ROW_SIZE           ; 2
523      tay                     ; 2      tay                     ; 2
# Line 486  __auto_yHi Line 567  __auto_yHi
567  ; x  ,y++: 38.76 (50%)  ; x  ,y++: 38.76 (50%)
568  ; x++,y++: 51.47 (50%)  ; x++,y++: 51.47 (50%)
569  ; average: 45.11  ; average: 45.11
570      .)  .)
571    
572    
573    

Legend:
Removed from v.258  
changed lines
  Added in v.259

  ViewVC Help
Powered by ViewVC 1.1.26