This is now 32 instructions.
The assumption is the runup always ends up on the negative side (below zero)..
.program ms
.side_set 1
; 1 side set bit for the MEAS pin
; don't forget to enable auto push
start:
set pins, 0 side 0
mov X, !NULL side 0 ; set X to 0xFFFFFFFF
out Y, 32 side 0 ; read the number desired counts
irq 0 side 0 ; first residue ADC reading
out NULL, 32 side 0 ; stall until DMA finished reading the ADC
beginning:
set pins, 1 side 1
jmp pin pwmhigh side 1
set pins, 2 side 1 [15]
jmp Y-- beginning side 1 [13]
jmp finish side 0
pwmhigh:
jmp X-- dummy side 1 [15]
dummy:
nop side 1 [11]
set pins, 2 side 1
jmp Y-- beginning side 1
jmp finish side 0
finish:
in X, 32 side 0 ; push PWM to FIFO, after the push X=0, Y=0
; let us assume the runup finished on negative side
rundown:
mov X, !NULL side 0 ; set X to 0xFFFFFFFF
countX:
jmp X-- loop1 side 0
loop1:
jmp pin countX side 0 ; if COMP==0 we are on positive side
in X, 32 side 0 ; send X to FIFO
mov X, !NULL side 0 ; set X to 0xFFFFFFFF
set pins, 2 side 0 ; set switch such we go downwards towards zero
countY:
jmp pin rndwend side 0 ; if COMP==1 we crossed zero, end
jmp X-- countY side 0 ; count Y
rndwend:
in X, 32 side 0 ; send Y to FIFO
set pins, 0 side 0 ; set PWMA/PWMB off
irq 1 side 0 ; second residue ADC reading
out NULL, 32 side 0 ; stall until DMA finished reading the ADC
.wrap_target
dither:
jmp !OSRE start side 0 ; jump out of desaturation when the OSR has data
set pins, 1 side 0 ; set pin polarity
jmp pin dither side 0 ; check if the integrator is still high
set pins, 2 side 0 [1]
.wrap