0000 3060 movlw 60 0002 0084 movwf FSR 0004 2A76 goto 04EC ; main 0006 2A64 goto 04C8 ; mainloop 0008 2948 goto 0290 ; isr 000A 3FFF 3FFF 000C 3FFF 3FFF 000E 3FFF 3FFF 0010 28AC goto 0158 ; xmod 0012 28EF goto 01DE ; none 0014 28BD goto 017A ; sync 0016 28D0 goto 01A0 ; noise 0018 28E7 goto 01CE ; noisemod 001A 28EF goto 01DE ; none 001C 28EF goto 01DE ; none 001E 28EF goto 01DE ; none 0020 2901 goto 0202 ; idle 0022 290C goto 0218 ; receive 0024 2917 goto 022E ; stop 0026 2901 goto 0202 ; idle 0028 340A retlw 0A 002A 3418 retlw 18 002C 3425 retlw 25 002E 3431 retlw 31 0030 343D retlw 3D 0032 3448 retlw 48 0034 3452 retlw 52 0036 345C retlw 5C 0038 3465 retlw 65 003A 346E retlw 6E 003C 3476 retlw 76 003E 347D retlw 7D 0040 3485 retlw 85 0042 348C retlw 8C 0044 3492 retlw 92 0046 3498 retlw 98 0048 29AF goto 035E ; note0! 004A 29B4 goto 0368 ; note1! 004C 29B9 goto 0372 ; note2! 004E 29BE goto 037C ; delay! 0050 29E1 goto 03C2 ; burst! 0052 29D6 goto 03AC ; octave! 0054 29D1 goto 03A2 ; chirp! 0056 29DA goto 03B4 ; range! 0058 299E goto 033C ; (nop) 005A 299E goto 033C ; (nop) 005C 299E goto 033C ; (nop) 005E 299E goto 033C ; (nop) 0060 299E goto 033C ; (nop) 0062 299E goto 033C ; (nop) 0064 299E goto 033C ; (nop) 0066 299E goto 033C ; (nop) 0068 2974 goto 02E8 ; period0! 006A 2979 goto 02F2 ; period1! 006C 297E goto 02FC ; period2! 006E 2983 goto 0306 ; >engine 0070 299E goto 033C ; (nop) 0072 299E goto 033C ; (nop) 0074 299E goto 033C ; (nop) 0076 299E goto 033C ; (nop) 0078 2A08 goto 0410 ; rs>ip 007A 2A0D goto 041A ; drop-engine 007C 299E goto 033C ; (nop) 007E 299E goto 033C ; (nop) 0080 2A16 goto 042C ; pwm 0082 299E goto 033C ; (nop) 0084 299E goto 033C ; (nop) 0086 299E goto 033C ; (nop) 0088 299E goto 033C ; (nop) 008A 2A37 goto 046E ; chirp 008C 2A3C goto 0478 ; woot 008E 2A45 goto 048A ; trans 0090 299E goto 033C ; (nop) 0092 299E goto 033C ; (nop) 0094 299E goto 033C ; (nop) 0096 299E goto 033C ; (nop) 0098 28F6 goto 01EC ; read 009A 2871 goto 00E2 ; (@) 009C 287E goto 00FC ; (!) 009E 3FFF 3FFF ; dup 00A0 0800 movf INDF, W ; push=w 00A2 0384 decf FSR, F 00A4 0080 movwf INDF 00A6 0008 return ; ee@ 00A8 0800 movf INDF, W 00AA 1683 bsf STATUS, 5 00AC 009B movwf 1B 00AE 141C bsf 1C, 0 00B0 081A movf 1A, W 00B2 1283 bcf STATUS, 5 00B4 0080 movwf INDF 00B6 0008 return ; iret 00B8 0E21 swapf 21, W 00BA 0083 movwf STATUS 00BC 0E20 swapf 20, W 00BE 0009 retfie ; x@y@ 00C0 0823 movf 23, W 00C2 2051 call 00A2 ; push=w 00C4 0824 movf 24, W 00C6 2851 goto 00A2 ; push=w ; swap 00C8 0800 movf INDF, W 00CA 0A84 incf FSR, F 00CC 00A3 movwf 23 00CE 0800 movf INDF, W 00D0 0A84 incf FSR, F 00D2 00A4 movwf 24 00D4 2860 goto 00C0 ; x@y@ ; over 00D6 0800 movf INDF, W 00D8 0A84 incf FSR, F 00DA 00A3 movwf 23 00DC 0800 movf INDF, W 00DE 00A4 movwf 24 00E0 2860 goto 00C0 ; x@y@ ; (@) 00E2 0800 movf INDF, W 00E4 00A3 movwf 23 00E6 0804 movf FSR, W 00E8 00A5 movwf 25 00EA 0823 movf 23, W 00EC 0084 movwf FSR 00EE 0800 movf INDF, W 00F0 00A3 movwf 23 00F2 0825 movf 25, W 00F4 0084 movwf FSR 00F6 0823 movf 23, W 00F8 0080 movwf INDF 00FA 0008 return ; (!) 00FC 0800 movf INDF, W 00FE 0A84 incf FSR, F 0100 00A3 movwf 23 0102 0800 movf INDF, W 0104 0A84 incf FSR, F 0106 00A4 movwf 24 0108 0804 movf FSR, W 010A 00A5 movwf 25 010C 0823 movf 23, W 010E 0084 movwf FSR 0110 0824 movf 24, W 0112 0080 movwf INDF 0114 0825 movf 25, W 0116 0084 movwf FSR 0118 0008 return ; (or) 011A 0800 movf INDF, W 011C 0A84 incf FSR, F 011E 0480 iorwf INDF, F 0120 0008 return ; (and) 0122 0800 movf INDF, W 0124 0A84 incf FSR, F 0126 0580 andwf INDF, F 0128 0008 return ; clearmem 012A 303A movlw 3A 012C 2051 call 00A2 ; push=w 012E 3000 movlw 00 0130 2066 call 00CC 0132 0380 decf INDF, F 0134 0800 movf INDF, W 0136 1D03 btfss STATUS, 2 0138 2897 goto 012E 013A 3060 movlw 60 013C 0084 movwf FSR 013E 0008 return ; mod2 0140 1FAC btfss 2C, 7 0142 28A9 goto 0152 0144 0AB3 incf 33, F 0146 1D03 btfss STATUS, 2 0148 28A9 goto 0152 014A 0828 movf 28, W 014C 00B3 movwf 33 014E 3020 movlw 20 0150 0685 xorwf GPIO, F 0152 158B bsf INTCON, 3 0154 168B bsf INTCON, 5 0156 285C goto 00B8 ; iret ; xmod 0158 0AB1 incf 31, F 015A 1D03 btfss STATUS, 2 015C 28B3 goto 0166 015E 0826 movf 26, W 0160 00B1 movwf 31 0162 3020 movlw 20 0164 0685 xorwf GPIO, F 0166 1DAC btfss 2C, 3 0168 28A0 goto 0140 ; mod2 016A 0AB2 incf 32, F 016C 1D03 btfss STATUS, 2 016E 28A0 goto 0140 ; mod2 0170 0827 movf 27, W 0172 00B2 movwf 32 0174 3020 movlw 20 0176 0685 xorwf GPIO, F 0178 28A0 goto 0140 ; mod2 ; sync 017A 0AB1 incf 31, F 017C 1D03 btfss STATUS, 2 017E 28C8 goto 0190 0180 0826 movf 26, W 0182 00B1 movwf 31 0184 0827 movf 27, W 0186 00B2 movwf 32 0188 1685 bsf GPIO, 5 018A 158B bsf INTCON, 3 018C 168B bsf INTCON, 5 018E 285C goto 00B8 ; iret 0190 0AB2 incf 32, F 0192 1D03 btfss STATUS, 2 0194 28A0 goto 0140 ; mod2 0196 0827 movf 27, W 0198 00B2 movwf 32 019A 3020 movlw 20 019C 0685 xorwf GPIO, F 019E 28A0 goto 0140 ; mod2 ; noise 01A0 3000 movlw 00 01A2 1BB5 btfsc 35, 7 01A4 3A01 xorlw 01 01A6 1B35 btfsc 35, 6 01A8 3A01 xorlw 01 01AA 1A35 btfsc 35, 4 01AC 3A01 xorlw 01 01AE 19B4 btfsc 34, 3 01B0 3A01 xorlw 01 01B2 0603 xorwf STATUS, W 01B4 0083 movwf STATUS 01B6 0DB4 rlf 34, F 01B8 0DB5 rlf 35, F 01BA 1C03 btfss STATUS, 0 01BC 28E1 goto 01C2 01BE 3020 movlw 20 01C0 0685 xorwf GPIO, F 01C2 158B bsf INTCON, 3 01C4 168B bsf INTCON, 5 01C6 285C goto 00B8 ; iret ; (1noise) 01C8 0827 movf 27, W 01CA 00B2 movwf 32 01CC 28D0 goto 01A0 ; noise ; noisemod 01CE 1DAC btfss 2C, 3 01D0 28EB goto 01D6 01D2 3020 movlw 20 01D4 0685 xorwf GPIO, F 01D6 0AB2 incf 32, F 01D8 1903 btfsc STATUS, 2 01DA 28E4 goto 01C8 ; (1noise) 01DC 28A0 goto 0140 ; mod2 ; none 01DE 158B bsf INTCON, 3 01E0 168B bsf INTCON, 5 01E2 285C goto 00B8 ; iret ; synth 01E4 082C movf 2C, W 01E6 3907 andlw 07 01E8 3E08 addlw 08 01EA 0082 movwf PCL ; read 01EC 1CBE btfss 3E, 1 01EE 28F6 goto 01EC ; read 01F0 10BE bcf 3E, 1 01F2 083D movf 3D, W 01F4 2851 goto 00A2 ; push=w ; command 01F6 20F6 call 01EC ; read 01F8 0800 movf INDF, W 01FA 0A84 incf FSR, F 01FC 0082 movwf PCL ; forth 01FE 20FB call 01F6 ; command 0200 28FF goto 01FE ; forth ; idle 0202 30BA movlw BA 0204 0701 addwf TMR0, W 0206 1803 btfsc STATUS, 0 0208 2909 goto 0212 020A 3001 movlw 01 020C 00BA movwf 3A 020E 30F8 movlw F8 0210 00BB movwf 3B 0212 158B bsf INTCON, 3 0214 168B bsf INTCON, 5 0216 285C goto 00B8 ; iret ; receive 0218 30BA movlw BA 021A 0701 addwf TMR0, W 021C 0CBC rrf 3C, F 021E 0ABB incf 3B, F 0220 1D03 btfss STATUS, 2 0222 2914 goto 0228 0224 3002 movlw 02 0226 00BA movwf 3A 0228 158B bsf INTCON, 3 022A 168B bsf INTCON, 5 022C 285C goto 00B8 ; iret ; stop 022E 30BA movlw BA 0230 0701 addwf TMR0, W 0232 1C03 btfss STATUS, 0 0234 292A goto 0254 0236 083C movf 3C, W 0238 00BD movwf 3D 023A 1D03 btfss STATUS, 2 023C 2929 goto 0252 023E 1505 bsf GPIO, 2 0240 10BE bcf 3E, 1 0242 01BA clrf 3A 0244 158B bsf INTCON, 3 0246 168B bsf INTCON, 5 0248 0E21 swapf 21, W 024A 0083 movwf STATUS 024C 0E20 swapf 20, W 024E 178B bsf INTCON, 7 0250 28FF goto 01FE ; forth 0252 14BE bsf 3E, 1 0254 01BA clrf 3A 0256 158B bsf INTCON, 3 0258 168B bsf INTCON, 5 025A 285C goto 00B8 ; iret ; comm 025C 083A movf 3A, W 025E 3903 andlw 03 0260 3E10 addlw 10 0262 0082 movwf PCL ; ioc-isr 0264 0805 movf GPIO, W 0266 100B bcf INTCON, 0 0268 1E05 btfss GPIO, 4 026A 292E goto 025C ; comm 026C 0181 clrf TMR0 026E 0AAD incf 2D, F 0270 1D03 btfss STATUS, 2 0272 28F2 goto 01E4 ; synth 0274 30D8 movlw D8 0276 00AD movwf 2D 0278 143E bsf 3E, 0 027A 28F2 goto 01E4 ; synth ; timer-isr 027C 110B bcf INTCON, 2 027E 3085 movlw 85 0280 0781 addwf TMR0, F 0282 0AAD incf 2D, F 0284 1D03 btfss STATUS, 2 0286 28F2 goto 01E4 ; synth 0288 30D8 movlw D8 028A 00AD movwf 2D 028C 143E bsf 3E, 0 028E 28F2 goto 01E4 ; synth ; isr 0290 00A0 movwf 20 0292 0EA0 swapf 20, F 0294 0E03 swapf STATUS, W 0296 00A1 movwf 21 0298 1283 bcf STATUS, 5 029A 190B btfsc INTCON, 2 029C 293E goto 027C ; timer-isr 029E 2932 goto 0264 ; ioc-isr ; rs 02A0 0836 movf 36, W 02A2 2051 call 00A2 ; push=w 02A4 3050 movlw 50 02A6 0780 addwf INDF, F 02A8 0008 return ; es 02AA 0837 movf 37, W 02AC 2051 call 00A2 ; push=w 02AE 3058 movlw 58 02B0 0780 addwf INDF, F 02B2 0008 return ; @rs 02B4 2150 call 02A0 ; rs 02B6 2871 goto 00E2 ; (@) ; !rs 02B8 2150 call 02A0 ; rs 02BA 287E goto 00FC ; (!) ; >rs 02BC 0AB6 incf 36, F 02BE 3007 movlw 07 02C0 05B6 andwf 36, F 02C2 295C goto 02B8 ; !rs ; rs> 02C4 215A call 02B4 ; @rs 02C6 03B6 decf 36, F 02C8 3007 movlw 07 02CA 05B6 andwf 36, F 02CC 0008 return ; @es 02CE 2155 call 02AA ; es 02D0 2871 goto 00E2 ; (@) ; !es 02D2 2155 call 02AA ; es 02D4 287E goto 00FC ; (!) ; >es 02D6 0AB7 incf 37, F 02D8 3007 movlw 07 02DA 05B7 andwf 37, F 02DC 2969 goto 02D2 ; !es ; es> 02DE 2167 call 02CE ; @es 02E0 03B7 decf 37, F 02E2 3007 movlw 07 02E4 05B7 andwf 37, F 02E6 0008 return ; period0! 02E8 0980 comf INDF, F 02EA 0800 movf INDF, W 02EC 0A84 incf FSR, F 02EE 00A6 movwf 26 02F0 0008 return ; period1! 02F2 0980 comf INDF, F 02F4 0800 movf INDF, W 02F6 0A84 incf FSR, F 02F8 00A7 movwf 27 02FA 0008 return ; period2! 02FC 0980 comf INDF, F 02FE 0800 movf INDF, W 0300 0A84 incf FSR, F 0302 00A8 movwf 28 0304 0008 return ; >engine 0306 082C movf 2C, W 0308 2051 call 00A2 ; push=w 030A 216B call 02D6 ; >es 030C 0800 movf INDF, W 030E 0A84 incf FSR, F 0310 00AC movwf 2C 0312 0008 return ; scale 0314 218D call 031A 0316 0080 movwf INDF 0318 0008 return 031A 0800 movf INDF, W 031C 3E14 addlw 14 031E 0082 movwf PCL ; transpose 0320 0800 movf INDF, W 0322 0A84 incf FSR, F 0324 3A00 xorlw 00 0326 1903 btfsc STATUS, 2 0328 0008 return 032A 1403 bsf STATUS, 0 032C 0C80 rrf INDF, F 032E 3EFF addlw FF 0330 2993 goto 0326 ; frequency 0332 218A call 0314 ; scale 0334 082B movf 2B, W 0336 2992 goto 0324 ; transient 0338 0980 comf INDF, F 033A 0008 return ; (nop) 033C 0008 return ; advance 033E 0838 movf 38, W 0340 2051 call 00A2 ; push=w 0342 2054 call 00A8 ; ee@ 0344 0800 movf INDF, W 0346 0A84 incf FSR, F 0348 00B9 movwf 39 034A 0AB8 incf 38, F 034C 307F movlw 7F 034E 05B8 andwf 38, F 0350 0008 return ; subroutine 0352 0838 movf 38, W 0354 2051 call 00A2 ; push=w 0356 215E call 02BC ; >rs 0358 0839 movf 39, W 035A 00B8 movwf 38 035C 0008 return ; note0! 035E 2199 call 0332 ; frequency 0360 0800 movf INDF, W 0362 0A84 incf FSR, F 0364 00A6 movwf 26 0366 0008 return ; note1! 0368 2199 call 0332 ; frequency 036A 0800 movf INDF, W 036C 0A84 incf FSR, F 036E 00A7 movwf 27 0370 0008 return ; note2! 0372 2199 call 0332 ; frequency 0374 0800 movf INDF, W 0376 0A84 incf FSR, F 0378 00A8 movwf 28 037A 0008 return ; delay! 037C 0980 comf INDF, F 037E 0800 movf INDF, W 0380 0A84 incf FSR, F 0382 00B0 movwf 30 0384 0008 return ; 4lit 0386 0839 movf 39, W 0388 390F andlw 0F 038A 2051 call 00A2 ; push=w 038C 0839 movf 39, W 038E 2051 call 00A2 ; push=w 0390 0E80 swapf INDF, F 0392 3003 movlw 03 0394 0580 andwf INDF, F 0396 0800 movf INDF, W 0398 0A84 incf FSR, F 039A 3E24 addlw 24 039C 0082 movwf PCL ; (drop) 039E 0A84 incf FSR, F 03A0 0008 return ; chirp! 03A2 0980 comf INDF, F 03A4 0800 movf INDF, W 03A6 0A84 incf FSR, F 03A8 00A9 movwf 29 03AA 0008 return ; octave! 03AC 0800 movf INDF, W 03AE 0A84 incf FSR, F 03B0 00AB movwf 2B 03B2 0008 return ; range! 03B4 3000 movlw 00 03B6 2066 call 00CC 03B8 2190 call 0320 ; transpose 03BA 0800 movf INDF, W 03BC 0A84 incf FSR, F 03BE 00AA movwf 2A 03C0 0008 return ; burst! 03C2 0980 comf INDF, F 03C4 0800 movf INDF, W 03C6 0A84 incf FSR, F 03C8 00AF movwf 2F 03CA 3033 movlw 33 03CC 2051 call 00A2 ; push=w 03CE 2983 goto 0306 ; >engine ; 3lit 03D0 0839 movf 39, W 03D2 3907 andlw 07 03D4 2051 call 00A2 ; push=w 03D6 0839 movf 39, W 03D8 2051 call 00A2 ; push=w 03DA 0D80 rlf INDF, F 03DC 0E80 swapf INDF, F 03DE 3003 movlw 03 03E0 0580 andwf INDF, F 03E2 0800 movf INDF, W 03E4 0A84 incf FSR, F 03E6 3E28 addlw 28 03E8 0082 movwf PCL ; 1lit 03EA 0839 movf 39, W 03EC 2051 call 00A2 ; push=w 03EE 0C80 rrf INDF, F 03F0 300F movlw 0F 03F2 0580 andwf INDF, F 03F4 0800 movf INDF, W 03F6 0A84 incf FSR, F 03F8 3E2C addlw 2C 03FA 0082 movwf PCL ; 0lit 03FC 0839 movf 39, W 03FE 3907 andlw 07 0400 2051 call 00A2 ; push=w 0402 219F call 033E ; advance 0404 0839 movf 39, W 0406 2066 call 00CC 0408 0800 movf INDF, W 040A 0A84 incf FSR, F 040C 3E34 addlw 34 040E 0082 movwf PCL ; rs>ip 0410 2162 call 02C4 ; rs> 0412 0800 movf INDF, W 0414 0A84 incf FSR, F 0416 00B8 movwf 38 0418 0008 return ; drop-engine 041A 216F call 02DE ; es> 041C 0800 movf INDF, W 041E 0A84 incf FSR, F 0420 00AC movwf 2C 0422 0008 return ; pop 0424 0839 movf 39, W 0426 3903 andlw 03 0428 3E3C addlw 3C 042A 0082 movwf PCL ; pwm 042C 0826 movf 26, W 042E 00A7 movwf 27 0430 3001 movlw 01 0432 02A7 subwf 27, F 0434 0827 movf 27, W 0436 00A8 movwf 28 0438 3001 movlw 01 043A 02A8 subwf 28, F 043C 0008 return ; misc 043E 0839 movf 39, W 0440 3903 andlw 03 0442 3E40 addlw 40 0444 0082 movwf PCL ; interpret 0446 1FB9 btfss 39, 7 0448 29A9 goto 0352 ; subroutine 044A 1F39 btfss 39, 6 044C 29C3 goto 0386 ; 4lit 044E 1EB9 btfss 39, 5 0450 29E8 goto 03D0 ; 3lit 0452 1E39 btfss 39, 4 0454 29F5 goto 03EA ; 1lit 0456 1DB9 btfss 39, 3 0458 29FE goto 03FC ; 0lit 045A 1D39 btfss 39, 2 045C 2A12 goto 0424 ; pop 045E 2A1F goto 043E ; misc ; interpreter 0460 219F call 033E ; advance 0462 2223 call 0446 ; interpret 0464 3000 movlw 00 0466 0630 xorwf 30, W 0468 1903 btfsc STATUS, 2 046A 2A30 goto 0460 ; interpreter 046C 0008 return ; chirp 046E 0829 movf 29, W 0470 07A6 addwf 26, F 0472 082A movf 2A, W 0474 04A6 iorwf 26, F 0476 0008 return ; woot 0478 0829 movf 29, W 047A 02A6 subwf 26, F 047C 082A movf 2A, W 047E 04A6 iorwf 26, F 0480 0008 return ; end-trans 0482 220D call 041A ; drop-engine 0484 30FF movlw FF 0486 00AF movwf 2F 0488 0008 return ; trans 048A 0AAF incf 2F, F 048C 1903 btfsc STATUS, 2 048E 2A41 goto 0482 ; end-trans 0490 0008 return ; pad 0492 0000 nop 0494 0008 return ; control 0496 082C movf 2C, W 0498 2051 call 00A2 ; push=w 049A 0E80 swapf INDF, F 049C 3007 movlw 07 049E 0580 andwf INDF, F 04A0 0800 movf INDF, W 04A2 0A84 incf FSR, F 04A4 3E44 addlw 44 04A6 0082 movwf PCL ; initsynth 04A8 30FF movlw FF 04AA 00A9 movwf 29 04AC 00A6 movwf 26 04AE 00B0 movwf 30 04B0 30E7 movlw E7 04B2 00A7 movwf 27 04B4 30EC movlw EC 04B6 00A8 movwf 28 04B8 3003 movlw 03 04BA 00AB movwf 2B 04BC 3055 movlw 55 04BE 00B4 movwf 34 04C0 3055 movlw 55 04C2 00B5 movwf 35 04C4 01AC clrf 2C 04C6 0008 return ; mainloop 04C8 01B6 clrf 36 04CA 01B7 clrf 37 04CC 01B8 clrf 38 04CE 1105 bcf GPIO, 2 04D0 1C3E btfss 3E, 0 04D2 2A68 goto 04D0 04D4 103E bcf 3E, 0 04D6 224B call 0496 ; control 04D8 0AAE incf 2E, F 04DA 1D03 btfss STATUS, 2 04DC 2A68 goto 04D0 04DE 30E7 movlw E7 04E0 00AE movwf 2E 04E2 0AB0 incf 30, F 04E4 1903 btfsc STATUS, 2 04E6 2230 call 0460 ; interpreter 04E8 2A68 goto 04D0 04EA 0008 return ; main 04EC 2095 call 012A ; clearmem 04EE 3050 movlw 50 04F0 0084 movwf FSR 04F2 1283 bcf STATUS, 5 04F4 0185 clrf GPIO 04F6 3007 movlw 07 04F8 0099 movwf 19 04FA 1683 bsf STATUS, 5 04FC 019F clrf 1F 04FE 1283 bcf STATUS, 5 0500 1683 bsf STATUS, 5 0502 301B movlw 1B 0504 0085 movwf GPIO 0506 1283 bcf STATUS, 5 0508 30E7 movlw E7 050A 00AE movwf 2E 050C 30D8 movlw D8 050E 00AD movwf 2D 0510 1683 bsf STATUS, 5 0512 0064 clrwdt 0514 3088 movlw 88 0516 0081 movwf TMR0 0518 1283 bcf STATUS, 5 051A 1683 bsf STATUS, 5 051C 3010 movlw 10 051E 0096 movwf 16 0520 1283 bcf STATUS, 5 0522 170B bsf INTCON, 6 0524 178B bsf INTCON, 7 0526 158B bsf INTCON, 3 0528 168B bsf INTCON, 5 052A 2254 call 04A8 ; initsynth 052C 2A64 goto 04C8 ; mainloop