var byte queue_start = 0 var byte queue_len = 0 var byte queue_base var byte q0 = 0 var byte q1 = 0 var byte q2 = 0 var byte q3 = 0 var byte q4 = 0 var byte q5 = 0 var byte q6 = 0 var byte q7 = 0 -- global since parameter passing in interrupts is broken var byte q_param var byte __tmp_q procedure queue_init is asm movlw q0 asm movwf queue_base queue_start = 0 queue_len = 0 end procedure procedure queue_put is if queue_len < 8 then assembler movf queue_start, w addwf queue_len, w andlw 7 addwf queue_base, w movwf fsr movf q_param, w movwf indf incf queue_len, f end assembler end if end procedure procedure queue_get is if queue_len > 0 then assembler movf queue_start, w addwf queue_base, w movwf fsr movf indf, w movwf q_param incf queue_start, w andlw 7 movwf queue_start decf queue_len, f end assembler end if end procedure