User Tools

Site Tools


base:improved_clockslide

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
base:improved_clockslide [2017-02-28 08:14] lftbase:improved_clockslide [2017-04-27 01:17] (current) copyfault
Line 1: Line 1:
-==== Improved Clock Slide ====+====== Improved Clock Slide ======
  
 by **lft** by **lft**
Line 19: Line 19:
 Every additional byte we skip corresponds to one less cycle of delay. Notice that the operands are reinterpreted as opcodes depending on where we land on the slide. For instance, the final ''lda $eaa5'' is encoded as ''ad a5 ea'' and takes 4 cycles. Skipping the first byte, we get ''a5 ea'' (''lda $ea'', 3 cycles). Skipping also the second byte, we get ''ea'' (''nop'', 2 cycles). Every additional byte we skip corresponds to one less cycle of delay. Notice that the operands are reinterpreted as opcodes depending on where we land on the slide. For instance, the final ''lda $eaa5'' is encoded as ''ad a5 ea'' and takes 4 cycles. Skipping the first byte, we get ''a5 ea'' (''lda $ea'', 3 cycles). Skipping also the second byte, we get ''ea'' (''nop'', 2 cycles).
  
-The length of the clockslide depends on the maximum jitter we have to support, and we pay a corresponding penalty in the form of useless waiting cycles. In the example, the maximum supported jitter is 10 cycles (41-31), and the minimum overhead cost is 9 cycles (50-41).+The length of the clock slide depends on the maximum jitter we have to support, and we pay a corresponding penalty in the form of useless waiting cycles. In the example, the maximum supported jitter is 10 cycles (41-31), and the minimum overhead cost is 9 cycles (50-41).
  
 Now here comes the improvement: Now here comes the improvement:
  
-Notice that in the latest case (starting at cycle 41), we still execute a single ''nop'' instruction in the clockslide. This is because there is no single-cycle instruction on the 6502. Jumping one byte further would reduce the number of cycles by two. That is, jumping directly to the ''at cycle 50'' comment would actually get us there one cycle too early.+Notice that in the latest case (starting at cycle 41), we still execute a single ''nop'' instruction in the clock slide. This is because there is no single-cycle instruction on the 6502. Jumping one byte further would reduce the number of cycles by two. That is, jumping directly to the ''at cycle 50'' comment would actually get us there one cycle too early.
  
 But we can use the page-crossing penalty of the branch instruction to add an extra cycle in this particular case! Consider: But we can use the page-crossing penalty of the branch instruction to add an extra cycle in this particular case! Consider:
Line 38: Line 38:
            ; at cycle 49            ; at cycle 49
  
-The clockslide is now one byte shorter, and the minimum overhead cost has been reduced to 8 cycles.+The clock slide is now one byte shorter, and the minimum overhead cost has been reduced to 8 cycles.
  
 The downside is that we now have an alignment requirement. Sometimes it may not be possible to adjust the starting address of the delay code. But note that we can insert dummy bytes just after the branch instruction, as long as we update the computation of A accordingly. The downside is that we now have an alignment requirement. Sometimes it may not be possible to adjust the starting address of the delay code. But note that we can insert dummy bytes just after the branch instruction, as long as we update the computation of A accordingly.
 +
 +
 +=== Slight variation ===
 +
 +by //Copyfault//
 +
 +Optionally, if the Z-flag reflects the value of the accumulator, then the following variation is also possible: 
 +
 +           ; delay 18-A cycles
 +                               ; 31..41 (A in range 0..10)
 +           sta     branch+1    
 +                               ; 35..45
 +  branch   BNE               
 +                               ; 37     (if A=0: no add. branch-cylce, no pb-cycle)
 +                               ; 39..47 (if A=1..9: add. branch-cycle)
 +                               ; 49     (if A=10: +branch-cycle +pb-cycle)
 +           ; --- clock slide starts here ---
 +           nop                 ; 39
 +           lda     #$a9        ; 41
 +           lda     #$a9        ; 43
 +           lda     #$a9        ; 45
 +           lda     $eaa5       ; 49
 +           ; ---    end of clock slide   ---
 +           ; page-crossing here!
 +           ; at cycle 49
 +
 +If A=0, the branch is not taken; thus the total sum of cycles wasted by the clockslide until the page break will be 11. In case of a non-vanishing A, the NOP-instruction is skipped (-2 cycles) but the additional "branch taken"-cycle comes in. Mind that if you want to slide down to 2 cycle-delay the page break is mandatory! A one-cycle delay is not possible but this is the same with the "BPL"-instruction which always comes with that additional cycle.
base/improved_clockslide.1488266056.txt.gz · Last modified: 2017-02-28 08:14 by lft