Repetierのパルスジェネレータ部分

パルスを打ち込む部分
motion.cpp

int32_t PrintLine::bresenhamStep());// Version for delta printer

Queueに入ってるデータ分を打ち込む
割り込み部分
HAL.cpp

ISR(TIMER1_COMPA_vect)
{
    if(insideTimer1) return;
    uint8_t doExit;
    __asm__ __volatile__ (
        "ldi %[ex],0 \n\t"
        "lds r23,stepperWait+2 \n\t"
        "tst r23 \n\t" //if(stepperWait<65536) {
        "brne else%= \n\t" // Still > 65535
        "lds r23,stepperWait+1 \n\t"
        "tst r23 \n\t"
        "brne last%= \n\t" // Still not 0, go ahead
        "lds r22,stepperWait \n\t"
        "breq end%= \n\t" // stepperWait is 0, do your work
        "last%=: \n\t"
        "sts %[ocr]+1,r23 \n\t" //  OCR1A = stepper wait;
        "sts %[ocr],r22 \n\t"
        "sts stepperWait,r1 \n\t"
        "sts stepperWait+1,r1 \n\t"
        "rjmp end1%= \n\t"
        "else%=: lds r22,stepperWait+1 \n\t" //} else { stepperWait = stepperWait-32768;
        "subi	r22, 0x80 \n\t"
        "sbci	r23, 0x00 \n\t"
        "sts stepperWait+1,r22 \n\t"	// ocr1a stays 32768
        "sts stepperWait+2,r23 \n\t"
        "end1%=: ldi %[ex],1 \n\t"
        "end%=: \n\t"
        :[ex]"=&d"(doExit):[ocr]"i" (_SFR_MEM_ADDR(OCR1A)):"r22","r23" );
    if(doExit) return;
    insideTimer1 = 1;
    OCR1A = 61000;
    if(PrintLine::hasLines())
    {
        setTimer(PrintLine::bresenhamStep());
    }
    else if(FEATURE_BABYSTEPPING && Printer::zBabystepsMissing)
    {
        Printer::zBabystep();
        setTimer(Printer::interval);
    }
    else
    {
        if(waitRelax == 0)
        {
#if USE_ADVANCE
            if(Printer::advanceStepsSet)
            {
                Printer::extruderStepsNeeded -= Printer::advanceStepsSet;
#if ENABLE_QUADRATIC_ADVANCE
                Printer::advanceExecuted = 0;
#endif
                Printer::advanceStepsSet = 0;
            }
#endif
#if USE_ADVANCE
            if(!Printer::extruderStepsNeeded) if(DISABLE_E) Extruder::disableCurrentExtruderMotor();
#else
            if(DISABLE_E) Extruder::disableCurrentExtruderMotor();
#endif
        }
        else waitRelax--;
        stepperWait = 0; // Importent becaus of optimization in asm at begin
        OCR1A = 65500; // Wait for next move
    }
    DEBUG_MEMORY;
    insideTimer1 = 0;
}

_SFR_MEM_ADDR(OCR1A) : I/OレジスタであるOCR1Aに対して、メモリ空間からのアクセスを行なう(他にはI/O空間からのアクセスがある)

ldi "=&d"(doExit),0
lds r23,stepperWait+2
tst r23 ;;if(stepperWait<65536) {
brne else ;; Still > 65535
lds r23,stepperWait+1
tst r23
brne last ;; Still not 0, go ahead
lds r22,stepperWait
breq end ;; stepperWait is 0, do your work

last:
  sts "i" (_SFR_MEM_ADDR(OCR1A))+1,r23 ;;  OCR1A = stepper wait;
  sts "i" (_SFR_MEM_ADDR(OCR1A)),r22
  sts stepperWait,r1
  sts stepperWait+1,r1
  rjmp end1

else: lds r22,stepperWait+1 ;;} else { stepperWait = stepperWait-32768;
  subi   r22, 0x80
  sbci   r23, 0x00
  sts stepperWait+1,r22    ;; ocr1a stays 32768
  sts stepperWait+2,r23

end1: ldi "=&d"(doExit),1

end: