?login_element?

Subversion Repositories NedoOS

Rev

Rev 751 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.         DEVICE ZXSPECTRUM128
  2.         include "../_sdk/sys_h.asm"
  3.  
  4. OLDTTYPES=0
  5.  
  6. ;freemem_start=0x8000
  7.  
  8. MAXTIME=65536;4096
  9.  
  10. MAXNTRACKS=64
  11.  
  12. SCRNTRACKS=23;8
  13. TRACKX=8
  14. SCRTRACKWID=64-TRACKX
  15.  
  16. NOTE_SPACE=0 ;надо удобно на уровне mem! на уровне mem упаковывать
  17. NOTE_GLISS=0xfe
  18. NOTE_PAUSE=0xff
  19. NOTE_RLE=0xe0
  20. NOTE_LOWEST=1;0
  21.  
  22. COLOR=7
  23. TIMECOLOR=0x04
  24. TYPESCOLOR=0x06
  25.  
  26. MAXSONGNAME=64
  27.  
  28. ;pgsamples содержит 256 байт на сэмпл (там все, кроме smp_pause), т.е. 37 строчек + зацикливание
  29.  
  30.         include "struct.asm"
  31.  
  32. smp_pause=0x4000
  33. smp_snare=0x4000+(_s*256)
  34. smp_tone=0x4000+(_t*256)
  35. smp_maj=0x4000+(_p*256)
  36. smp_bass=0x4000+(_b*256)
  37. smp_crash=0x4000+(_c*256)
  38. smp_drum=0x4000+(_d*256)
  39. smp_hihat=0x4000+(_h*256)
  40. smp_orn1of3=0x4000+(_1*256)
  41. smp_orn2of6=0x4000+(_2*256)
  42.  
  43.         org PROGSTART
  44. cmd_begin
  45.         ld sp,0x4000 ;не должен опускаться ниже 0x3b00! иначе возможна порча OS
  46.         OS_HIDEFROMPARENT
  47.         ld e,3+0x80 ;6912 + keep gfx pages
  48.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  49.         ;ld e,0
  50.         ;OS_CLS
  51.  
  52.         OS_GETMAINPAGES
  53. ;dehl=номера страниц в 0000,4000,8000,c000
  54.         ld a,e
  55.         ld (pgroots),a
  56.         ;ld a,h
  57.         ld (player4000page),a
  58.  
  59.         OS_NEWPAGE
  60.         ld a,e
  61.         ld (pgsamples),a
  62.  
  63.         call cls
  64.         call setscrpg
  65.         ld hl,0x5800
  66.         ld de,0x5801
  67.         ld bc,0x0020
  68.         ld (hl),TIMECOLOR
  69.         ldir
  70.         push hl
  71.         ld bc,4
  72.         ld (hl),TYPESCOLOR
  73.         ldir
  74.         ld bc,31-4
  75.         ld (hl),COLOR
  76.         ldir
  77.         pop hl
  78.         ld bc,0x02c0
  79.         ldir
  80.         call gennotefont
  81.        
  82.         call setpgsamples
  83.         ld de,0x4000;smp_pause
  84.         ld a,0x40
  85. killsamples0
  86.         ld hl,wassmp_pause
  87.         ld bc,256;szsmp_pause
  88.         ldir
  89.         dec a
  90.         jr nz,killsamples0
  91.         ld hl,wassmp_snare
  92.         ld de,smp_snare
  93.         ld bc,szsmp_snare
  94.         ldir
  95.         ld hl,wassmp_bass
  96.         ld de,smp_bass
  97.         ld bc,szsmp_bass
  98.         ldir
  99.         ld hl,wassmp_maj
  100.         ld de,smp_maj
  101.         ld bc,szsmp_maj
  102.         ldir
  103.         ld hl,wassmp_tone
  104.         ld de,smp_tone
  105.         ld bc,szsmp_tone
  106.         ldir
  107.         ld hl,wassmp_crash
  108.         ld de,smp_crash
  109.         ld bc,szsmp_crash
  110.         ldir
  111.         ld hl,wassmp_drum
  112.         ld de,smp_drum
  113.         ld bc,szsmp_drum
  114.         ldir
  115.         ld hl,wassmp_hihat
  116.         ld de,smp_hihat
  117.         ld bc,szsmp_hihat
  118.         ldir
  119.         ld hl,wassmp_orn1of3
  120.         ld de,smp_orn1of3
  121.         ld bc,szsmp_orn1of3
  122.         ldir
  123.         ld hl,wassmp_orn2of6
  124.         ld de,smp_orn2of6
  125.         ld bc,szsmp_orn2of6
  126.         ldir
  127.        
  128.         call setpgroots
  129.  
  130.         ld hl,0x4000
  131.         ld de,0x4001
  132.         ld bc,0x3fff
  133.         ld (hl),l;0
  134.         ldir ;чистим roots
  135.  
  136.         call initmem
  137.         ld c,1
  138.         call pokecurtime_curtrack_c ;set part 0 in the beginning
  139.  
  140.         ld hl,wasfrq
  141.         ld de,tfrq
  142.         ld b,96
  143. refrq0
  144.         ld a,(hl)
  145.         ld (de),a
  146.         inc hl
  147.         inc d
  148.         ld a,(hl)
  149.         ld (de),a
  150.         inc hl
  151.         dec d
  152.         inc e
  153.         djnz refrq0
  154.         ld a,e
  155.         sub 3*12
  156.         ld l,a
  157.         ld h,d
  158. refrq1
  159.         ld a,(hl)
  160.         add a,3
  161.         rra
  162.         rra
  163.         rra
  164.         and 0x1f
  165.         ld (de),a
  166.         inc l
  167.         inc d
  168.         xor a
  169.         ld (de),a
  170.         dec d
  171.         inc e
  172.         jp p,refrq1
  173.         ld l,0
  174. ;notes -128..-1 equal to 0
  175. refrq2
  176.         ld a,(hl)
  177.         ld (de),a
  178.         inc d
  179.         inc h
  180.         ld a,(hl)
  181.         ld (de),a
  182.         dec h
  183.         dec d
  184.         inc e
  185.         jr nz,refrq2
  186.  
  187. ;for example: 0=bass/pad, 2=tone, 5=drum
  188.         ld ix,emptychn
  189.         ;ld (ix+chn.keepme_in),5
  190.         ;ld (ix+chn.channel_in),0
  191.         call initchnnote_pause ;делает smpcuraddr=smp_pause и nogliss
  192.         call setpgsamples
  193.         call playsample ;после этого канал можно микшировать
  194.         call setpgroots
  195.  
  196. ;;;;;;;;;;;;;;;;;;;;;
  197.         ;call setneedredraw
  198.         call prcurcur
  199. mainloop
  200.         xor a
  201.         ld (tracksmode),a
  202. mainloop_nokey
  203.         YIELD
  204.         call updatescr
  205.         ;call prcurcur
  206.         GET_KEY
  207.         or a
  208.         jr z,mainloop_nokey
  209.         ;push af
  210.         ;call prcurcur
  211.         ;pop af
  212.          cp key_tab
  213.          jp z,tracksloop
  214.         ld hl,mainloop
  215.         push hl
  216.         ld c,0
  217.         cp key_F2
  218.         jp z,untr_save
  219.         cp key_F3
  220.         jp z,untr_load
  221.         cp ss0
  222.         jp z,untr_step0
  223.         cp ss1
  224.         jp z,untr_step1
  225.         cp ss2
  226.         jp z,untr_step2
  227.         cp ss3
  228.         jp z,untr_step3
  229.         cp ss4
  230.         jp z,untr_step4
  231.         cp ss5
  232.         jp z,untr_step5
  233.         cp ss6
  234.         jp z,untr_step6
  235.         cp ss7
  236.         jp z,untr_step7
  237.         cp ss8
  238.         jp z,untr_step8
  239.         cp 'Y'
  240.         jp z,untr_copy
  241.         cp 'Q'
  242.         jp z,untr_setplayall
  243.         cp 'W'
  244.         jp z,untr_setplaybegin
  245.         cp 'E'
  246.         jp z,untr_setplayend
  247.         cp 'R'
  248.         jp z,untr_startplay
  249.         cp 'T'
  250.         jp z,untr_stopplay
  251.         cp key_left
  252.         jp z,untr_left
  253.         cp key_right
  254.         jp z,untr_right
  255.         cp key_up
  256.         jp z,untr_up
  257.         cp key_down
  258.         jp z,untr_down
  259.         cp key_pgup
  260.         jp z,untr_pgup
  261.         cp key_pgdown
  262.         jp z,untr_pgdown
  263.         cp key_home
  264.         jp z,untr_home
  265.         cp key_end
  266.         jp z,untr_end
  267.         cp key_enter
  268.         jp z,untr_play
  269.         cp key_del
  270.         jp z,untr_del
  271.         cp key_ins
  272.         jp z,untr_ins
  273.         cp key_backspace
  274.         jp z,untr_backspace
  275.         cp ' '
  276.         jp z,untr_space
  277.         cp key_esc
  278.         jp z,untr_quit
  279.  
  280.         push af
  281. ;смотрим тип текущего канала
  282.         ld a,(curtrack)
  283.         call gettracktype
  284.         cp _t;CHNTYPE_NOTES
  285.         jr z,enternote
  286.         pop af
  287.         call keytodigit
  288.         jr c,untr_afternotekey_alltracksiforder
  289.         push af
  290.         ld a,(newdigit)
  291.         ld (olddigit),a
  292.         pop af
  293.         ld (newdigit),a
  294.         call pokecurtime_curtrack_c
  295. untr_afternotekey_alltracksiforder
  296.         call setneedredraw_alltracksiforder
  297.         jp untr_afternotekey;untr_right
  298.  
  299. untr_copy
  300. ;fromdigit,todigit,csY
  301.         ;ld hy,0 ;track
  302.         ld a,(curtrack)
  303.         ld hy,a
  304. ;untr_copy0
  305.         ld a,(olddigit)
  306.         ld ly,a ;part
  307. ;ly=part
  308.         ld a,hy ;a=track
  309.         call getendaddr ;de=end or 0
  310.         ex de,hl
  311. untr_copybytes0
  312. ;hl=index
  313. olddigit=$+2
  314.         ld ly,0 ;part
  315.         ld a,hy ;a=track
  316.         call peektrackpartindex
  317.         ld c,a
  318. newdigit=$+2
  319.         ld ly,0 ;part
  320.         ld a,hy ;a=track
  321.         call poketrackpartindex_c
  322.         ld a,h
  323.         or l
  324.         dec hl
  325.         jr nz,untr_copybytes0
  326.         ;inc hy
  327.         ;ld a,(ntracks)
  328.         ;cp hy
  329.         ;jr nz,untr_copy0
  330.         jp setneedpralltracks
  331.  
  332. keytodigit
  333. ;ввод цифры 0..9a..zA..Z -> 1..62 (пробел -> 0)
  334. ;out: CY=error
  335.         sub ' '
  336.         ld c,a;0
  337.         jr z,enterdigok
  338.         sub '0'-' '
  339.         cp 10
  340.         ld c,1
  341.         jr c,enterdigok
  342.         sub 'a'-'0'
  343.         cp 26
  344.         ld c,1+10
  345.         jr c,enterdigok
  346.         sub 'A'-'a'
  347.         cp 26
  348.         ld c,1+10+26
  349.         ccf
  350.         ret c ;wrong digit!
  351. enterdigok
  352.         add a,c
  353.         ld c,a
  354.         ret
  355.  
  356. enternote
  357.         pop af
  358.         cp 'a'
  359.         jp z,untr_pause
  360.         cp 'f'
  361.         jp z,untr_keygliss
  362.  
  363.         ld hl,tnotekeys
  364.         ld bc,3*12
  365.         cpir
  366.         ret nz
  367.          inc c ;add c,NOTE_LOWEST
  368.         call pokecurtime_curtrack_c
  369.  
  370. untr_afternotekey
  371.  
  372.         call setneedredraw_curtrack
  373.         call updatescr
  374.  
  375.        ld a,(nowplaying)
  376.         or a
  377.         jr nz,untr_afternotekey_noplay
  378.  
  379.        ld hl,(curtime)
  380.        ld (playtime),hl
  381.         call inittracks ;в каналах с пустышкой включает паузу, форсирует ретриггер огибающей
  382.         call initnote
  383.  
  384. playnote0
  385.         halt
  386.         call playnote
  387.         call checknotekeys_pressed
  388.         jr nz,playnote0
  389.  
  390.         call shutay
  391. untr_afternotekey_noplay
  392.         ;call setneedredraw
  393. curstep=$+1
  394.         ld b,0
  395.         ld a,b
  396.         or a
  397.         ret z
  398. step0
  399.         push bc
  400.         call untr_right
  401.         pop bc
  402.         djnz step0
  403.         ret
  404.  
  405. untr_keygliss
  406.         ld c,NOTE_GLISS
  407.         jr untr_pauseq
  408. untr_pause
  409.         ld c,NOTE_PAUSE
  410. untr_pauseq
  411.         call pokecurtime_curtrack_c
  412.         jp untr_afternotekey
  413.  
  414. untr_space
  415.         ld c,NOTE_SPACE
  416.         call pokecurtime_curtrack_c
  417.         jp untr_afternotekey_alltracksiforder
  418.  
  419. untr_step8
  420.         inc c
  421. untr_step7
  422.         inc c
  423. untr_step6
  424.         inc c
  425. untr_step5
  426.         inc c
  427. untr_step4
  428.         inc c
  429. untr_step3
  430.         inc c
  431. untr_step2
  432.         inc c
  433. untr_step1
  434.         inc c
  435. untr_step0
  436.         ld a,c
  437.         ld (curstep),a
  438.         ret
  439.  
  440. tracksloop
  441.         ld a,1
  442.         ld (tracksmode),a
  443. tracksloop_nokey
  444.         YIELD
  445.         call updatescr
  446.         ;call prtrackscur
  447.         GET_KEY
  448.         or a
  449.         jr z,tracksloop_nokey
  450.         ;push af
  451.         ;call prtrackscur
  452.         ;pop af
  453.          cp key_tab
  454.          jp z,mainloop
  455.         ld hl,tracksloop
  456.         push hl
  457.         cp key_left
  458.         jp z,tracks_left
  459.         cp key_right
  460.         jp z,tracks_right
  461.         cp key_up
  462.         jp z,untr_up
  463.         cp key_down
  464.         jp z,untr_down
  465.         cp key_ins
  466.         jp z,tracks_ins
  467.         cp key_del
  468.         jp z,tracks_del
  469.         ;push af
  470.         ld hl,(curtrack)
  471.         ld h,0
  472.         add hl,hl
  473.         add hl,hl
  474.         add hl,hl ;*8
  475. tracks_curx=$+1
  476.         ld bc,0
  477.         add hl,bc
  478.         ld bc,ttypes
  479.         add hl,bc
  480.         ;pop af
  481.         call keytodigit ;out: CY=error, a=digit
  482.         ret c
  483.         ld (hl),a
  484.         jp setneedprtypes
  485.  
  486. tracks_ins
  487.         ld hl,ntracks
  488.         ld a,(hl)
  489.         cp MAXNTRACKS
  490.         ret z
  491.         inc (hl)
  492. ;вставить трек в tracks
  493. ;если мы на треке a=MAXNTRACKS-2, то надо сдвинуть 4 байта (1 строчку)
  494. ;если мы на треке a=MAXNTRACKS-3, то надо сдвинуть 4*2 байта (2 строчки)
  495. ;значит, надо сдвинуть MAXNTRACKS-a-1 строчек
  496.         ld a,(curtrack)
  497.         cpl
  498.         add a,MAXNTRACKS
  499.         call amulchnsstep_tohl
  500.         ld b,h
  501.         ld c,l
  502.         ;add a,a
  503.         ;add a,a
  504.         ;ld c,a
  505.         ;ld b,0
  506.         ld hl,tracks_end-1-chnsstep;4
  507.         ld de,tracks_end-1
  508.         lddr
  509. ;вставить трек в ttypes
  510.         ld hl,ttypes_end-1-8
  511.         ld de,ttypes_end-1
  512.         ld a,(curtrack)
  513.         cpl
  514.         add a,MAXNTRACKS
  515.         add a,a
  516.         add a,a
  517.         add a,a
  518.         ld c,a
  519.         ;ld b,0
  520.         rl b
  521.         lddr
  522. ;сдвинуть roots треков, начиная с curtrack
  523.         ld a,(curtrack)
  524.         ld hl,0x4000+0x3eff
  525.         ld de,0x4000+0x3fff
  526.         cpl
  527.         add a,64;MAXNTRACKS
  528.         ld b,a
  529.         ;ld c,0
  530.         lddr
  531.         inc hl
  532.         ld d,h
  533.         ld e,l
  534.         inc de
  535.         ld (hl),l;0
  536.         dec c ;bc=0x00ff
  537.         ldir
  538.  
  539.         jp setneedprtracks
  540.  
  541. tracks_del
  542.         ld hl,ntracks
  543.         ld a,(hl)
  544.         dec a
  545.         ret z
  546.         dec (hl)
  547. ;очистить трек
  548.         ld hl,0
  549.         ld ly,0 ;part=0..63
  550. tracks_del0
  551.         ld a,(curtrack)
  552. ;ly=part
  553. ;a=track
  554.         call getendaddr
  555.         ex de,hl
  556. tracks_del1
  557.         ld a,(curtrack)
  558.         ld c,0 ;c=data
  559. ;hl=index
  560. ;ly=part
  561. ;a=track
  562. ;c=data
  563.         call poketrackpartindex_c
  564.         ld a,h
  565.         or l
  566.         dec hl
  567.         jr nz,tracks_del1
  568.         inc ly
  569.         ld a,ly
  570.         cp 64
  571.         jr nz,tracks_del0
  572.        
  573. ;удалить трек в tracks
  574.         ld a,(curtrack)
  575.         or a
  576.         ret z ;don't delete order
  577.         ;add a,a
  578.         ;add a,a
  579.         ;ld e,a
  580.         ;ld d,0
  581.         call amulchnsstep_tohl
  582.         ld de,tracks
  583.         add hl,de
  584.         ld d,h
  585.         ld e,l
  586.         ld bc,chnsstep
  587.         add hl,bc
  588. ;если мы на треке a=MAXNTRACKS-2, то надо сдвинуть chnsstep байт (1 строчку)
  589. ;если мы на треке a=MAXNTRACKS-3, то надо сдвинуть chnsstep*2 байт (2 строчки)
  590. ;значит, надо сдвинуть MAXNTRACKS-a-1 строчек
  591.         ld a,(curtrack)
  592.         cpl
  593.         add a,MAXNTRACKS
  594.         ;add a,a
  595.         ;add a,a
  596.         ;ld c,a
  597.         ;ld b,0
  598.         push de
  599.         push hl
  600.         call amulchnsstep_tohl
  601.         ld b,h
  602.         ld c,l
  603.         pop hl
  604.         pop de
  605.         ldir
  606. ;удалить трек в ttypes
  607.         ld a,(curtrack)
  608.         add a,a
  609.         add a,a
  610.         add a,a
  611.         ld e,a
  612.         ld d,b;0
  613.         ld hl,ttypes
  614.         add hl,de
  615.         ld d,h
  616.         ld e,l
  617.         ld c,8
  618.         add hl,bc
  619.         ld a,(curtrack)
  620.         cpl
  621.         add a,MAXNTRACKS
  622.         add a,a
  623.         add a,a
  624.         add a,a
  625.         ld c,a
  626.         ;ld b,0
  627.         rl b
  628.         ldir
  629.  
  630. ;сдвинуть roots треков, начиная с curtrack
  631.         ld a,(curtrack)
  632.         add a,0x40
  633.         ld d,a
  634.         inc a
  635.         ld h,a
  636.         ld l,0
  637.         ld e,l;0
  638.         ld a,(curtrack)
  639.         cpl
  640.         add a,64;MAXNTRACKS
  641.         ld b,a
  642.         ;ld c,0
  643.         ldir
  644.        
  645.         call cls
  646.         jp setneedprtracks
  647.  
  648. tracks_left
  649.         ld hl,tracks_curx
  650.         ld a,(hl)
  651.         or a
  652.         ret z
  653.         dec (hl)
  654.         ret
  655.  
  656. tracks_right
  657.         ld hl,tracks_curx
  658.         ld a,(hl)
  659.         cp 6;7
  660.         ret z
  661.         inc (hl)
  662.         ret
  663.  
  664. untr_setplaybegin
  665.         ld hl,(curtime)
  666.         ld (playbegin),hl
  667.         ret
  668.  
  669. untr_setplayend
  670.         ld hl,(curtime)
  671.         ld (playend),hl
  672.         ret
  673.  
  674. untr_setplayall
  675.         ld hl,0
  676.         ld (playbegin),hl
  677.         ld (playend),hl
  678.         ret
  679.  
  680. untr_startplay
  681. startplay
  682.         ld a,1
  683.         ld (nowplaying),a
  684.          ld hl,(curtime)
  685.          ld (playtime),hl
  686.         call initplayer
  687.         call inittracks ;в каналах с пустышкой включает паузу, форсирует ретриггер огибающей
  688. player4000page=$+1
  689.          ld a,0
  690.          ld hl,player
  691.          OS_SETMUSIC
  692.         ret
  693.        
  694. untr_stopplay
  695. stopplay
  696.         xor a
  697.         ld (nowplaying),a
  698.          ld a,(player4000page)
  699.          ld hl,play_reter
  700.          OS_SETMUSIC
  701.  
  702.         call shutay
  703.         ret
  704.  
  705. untr_play
  706.         call startplay
  707.  
  708.         jr playenter0_go
  709.         ;OS_GETTIMER ;out: hlde=timer
  710.         ;ld (playenter_oldtimer),de
  711. playenter0
  712. ;        OS_GETTIMER ;out: hlde=timer
  713. ;        ex de,hl
  714. ;playenter_oldtimer=$+1
  715. ;        ld de,0
  716. ;        ld (playenter_oldtimer),hl
  717.        
  718.         ;call untr_right ;TODO check end and loop
  719.         halt
  720. playenter_curxy=$+1
  721.         ld bc,0
  722.           ;call prcur
  723. playenter0_go
  724.         call updatescr
  725.         call getcurplayx
  726.         ld c,a
  727.         call getcury
  728.         ld b,a
  729.         ld (playenter_curxy),bc
  730.           ;call prcur
  731.           ;jr playenter0
  732.         call checknotekeys_pressed
  733.         jr nz,playenter0
  734.          ld hl,(playtime)
  735.          call untr_pgdown_ok
  736.  
  737.         call stopplay
  738.  
  739.         jp untr_afternotekey
  740.  
  741. untr_del_popret
  742.         pop hl
  743.         ret
  744.  
  745. untr_backspace
  746.         ld hl,(curtime)
  747.         ld a,h
  748.         or l
  749.         ret z
  750.         call untr_left
  751.         ;jp untr_del
  752. untr_del
  753.         ld a,(curtrack)
  754.         ld hl,(curtime)
  755.         call tracktime_totrackpartindex
  756. ;hl=index
  757. ;ly=part
  758. ;a=track
  759.         push hl ;hl=curaddr
  760.         call getendaddr ;de=end or 0
  761.         ex de,hl
  762.         pop de ;de=curaddr
  763.         push hl ;hl=endaddr
  764.         xor a
  765.         sbc hl,de ;endaddr-curaddr
  766.         jr c,untr_del_popret
  767.         ex de,hl
  768.         inc de
  769. ;de=число нот до конца трека включительно
  770. ;0x0101 - 1 проход
  771. ;0x0102 - 2 прохода
  772. ;0x0100 - 256 проходов
  773. ;0x0201 - 257 проходов
  774. ;b=LSB
  775. ;hx=HSB = ((num-1)/256)+1
  776.         ld b,e
  777.         dec de
  778.         inc d
  779.         ld hx,d
  780.  
  781.         pop hl ;hl=endaddr
  782.  
  783.         ;ld de,-NTRACKS
  784.         ld c,NOTE_SPACE
  785. ;hl=index
  786. ;ly=part
  787. untr_del0
  788.         push de
  789.         ld a,(curtrack)
  790.         call poketrackpartindex_c ;c<->mem(hl)
  791.         pop de
  792.          dec hl ;add hl,de
  793.         djnz untr_del0
  794.         dec hx
  795.         jr nz,untr_del0
  796.  
  797.         jp setneedredraw_alltracksiforder
  798.  
  799. untr_ins
  800.         ld a,(curtrack)
  801.         ld hl,(curtime)
  802.         call tracktime_totrackpartindex
  803. ;hl=index
  804. ;ly=part
  805. ;a=track
  806.         push hl ;hl=curaddr
  807.         push hl ;hl=curaddr
  808.         call getendaddr ;de=end or 0
  809.         ex de,hl
  810.         pop de ;de=curaddr
  811.         or a
  812.         sbc hl,de ;endaddr-curaddr
  813.         jr c,untr_del_popret
  814.         ex de,hl
  815.         inc de
  816.         inc de
  817. ;de=число нот до конца трека включительно
  818. ;0x0101 - 1 проход
  819. ;0x0102 - 2 прохода
  820. ;0x0100 - 256 проходов
  821. ;0x0201 - 257 проходов
  822. ;b=LSB
  823. ;hx=HSB = ((num-1)/256)+1
  824.         ld b,e
  825.         dec de
  826.         inc d
  827.         ld hx,d
  828.  
  829.         pop hl ;hl=curaddr
  830.  
  831.         ;ld de,NTRACKS
  832.         ld c,NOTE_SPACE
  833. ;hl=index
  834. ;ly=part
  835. untr_ins0
  836.         push de
  837.         ld a,(curtrack)
  838.         call poketrackpartindex_c ;c<->mem(hl)
  839.         pop de
  840.          inc hl ;add hl,de
  841.         djnz untr_ins0
  842.         dec hx
  843.         jr nz,untr_ins0
  844.         jp setneedredraw_alltracksiforder
  845.  
  846. untr_quit
  847.         QUIT
  848.  
  849. checknotekeys_pressed
  850.         ld a,0x81
  851.         in a,(0xfe)
  852.         cpl
  853.         and 0x1f
  854.         ret nz
  855.         ld a,0x7f ;space..B
  856.         in a,(0xfe)
  857.         cpl
  858.         and 0x1c ;BNM
  859.         ret nz
  860.         ld a,0xfe ;cs..V
  861.         in a,(0xfe)
  862.         cpl
  863.         and 0x1e
  864.         ret
  865.  
  866. untr_home
  867. ;переход на начало текущей части
  868.         ld hl,(curtime)
  869.         ld a,(curtrack)
  870.         push hl
  871.         call tracktime_totrackpartindex ;hl=index
  872.         ex de,hl ;de=index
  873.         pop hl
  874.        ld a,d
  875.        or e
  876.        jr z,untr_home_left
  877. untr_home_ok
  878.         or a
  879.         sbc hl,de ;beg=time-index (index=time-beg)
  880.         jp untr_pgdown_ok
  881. untr_home_left
  882. ;уже в начале текущей части, пытаемся найти предыдущую
  883.         ld a,h
  884.         or l
  885.         ret z
  886.         dec hl
  887.         ld a,(curtrack)
  888.         push hl
  889.         call tracktime_totrackpartindex ;hl=index
  890.         ex de,hl ;de=index
  891.         pop hl
  892.         jr untr_home_ok
  893.  
  894. untr_end
  895. ;переход на конец текущей части в текущем треке
  896.         ld a,(curtrack)
  897.         ld hl,(curtime)
  898.        push hl ;curtime
  899.         push hl
  900.         call tracktime_totrackpartindex ;hl=index
  901.         ex de,hl ;de=index
  902.         pop hl
  903.         or a
  904.         sbc hl,de ;beg=time-index (index=time-beg)
  905.         push hl ;beg
  906.         call getendaddr ;de=end index
  907.         pop hl ;beg
  908.         add hl,de ;time=index+beg (beg=time-index)
  909.        pop de ;curtime
  910.         or a
  911.         sbc hl,de ;time>curtime?
  912.         add hl,de
  913.         jr c,untr_end_findnext
  914.         jp nz,untr_pgdown_ok
  915. untr_end_findnext
  916.         ex de,hl ;hl=curtime
  917. ;уже на конце текущей части в текущем треке
  918. ;пытаемся найти следующую часть
  919.         ld a,(curtrack)
  920.         inc hl
  921.         push hl
  922.         call gettrackorder ;номер ордера (0=нет)
  923.         pop hl
  924.         or a ;канал подписан на ордер?
  925.         ret z ;не подписан
  926.         ex de,hl
  927.         xor a ;TODO номер канала ордера
  928.         ld ly,0 ;у ордера всегда берём дефолтную часть (part=0), т.к. ордер не подчиняется ордерам
  929.         call getroot
  930.         call findright ;out: de=nonempty index (or 0xffff), a=data (1..62 or 0)
  931.          ld a,d
  932.          and e
  933.          inc a
  934.          ret z
  935.         ex de,hl
  936.         jp untr_pgdown_ok
  937.  
  938. untr_up
  939.         ld hl,curtrack
  940.         ld a,(hl)
  941.         or a
  942.         ret z
  943.         dec (hl)
  944.         ld a,(hl)
  945.         ld hl,toptrack
  946.         cp (hl)
  947.         ret nc
  948.         dec (hl)
  949.         ret;jp setneedprtypes ;setneedredraw
  950.  
  951. setneedredraw_alltracksiforder
  952.         ld a,(curtrack)
  953.         or a
  954.         call z,setneedpralltracks ;keep a!
  955. setneedredraw_curtrack
  956.         ;ld a,1
  957.         ;ld (untr_needredraw),a ;forced redraw (even if lefttime has not changed)
  958.         ld a,(curtrack)
  959.         call amulchnsstep_tohl
  960.         ld de,chns-2;tracks
  961.         add hl,de
  962.         set 7,(hl)
  963.         ret
  964. setneedpralltracks
  965. ;keep a!
  966.         ld ix,chns;tracks
  967.         ld a,(ntracks)
  968.         ld b,a
  969.         ld de,chnsstep
  970. setneedpralltracks0
  971.         set 7,(ix-2);(hl)
  972.         add ix,de
  973.         ;inc hl
  974.         ;inc hl
  975.         ;inc hl
  976.         ;inc hl
  977.         djnz setneedpralltracks0
  978.         ;ld a,55 ;"scf"
  979.         ;ld (needpralltracks),a
  980.         ret
  981.  
  982. untr_down
  983.         ld hl,curtrack
  984.         ld a,(ntracks)
  985.         dec a
  986.         cp (hl)
  987.         ret z
  988.         inc (hl)
  989.         ld c,(hl)
  990.         ld hl,toptrack
  991.         ld a,(hl)
  992.         add a,SCRNTRACKS
  993.         ld b,a
  994.         ld a,c
  995.         cp b
  996.         ret c
  997.         inc (hl)
  998.         ret;jp setneedprtypes;setneedredraw
  999.  
  1000. untr_pgdown
  1001.         ld hl,(curtime)
  1002.          ;inc hl
  1003.          ;inc hl
  1004.          ;inc hl
  1005.          ;inc hl
  1006.          ;inc hl
  1007.         ld a,l
  1008.         and 0xf8
  1009.         ld l,a
  1010.         ld bc,8
  1011.         add hl,bc
  1012.         ret c
  1013.         call checkeof
  1014. untr_pgdown_ok
  1015.         ld (curtime),hl
  1016. ;установим курсор в центр, если это возможно
  1017.         ld bc,SCRTRACKWID/2
  1018.         xor a
  1019.         sbc hl,bc
  1020.         jr nc,$+4
  1021.          ld h,a
  1022.          ld l,a
  1023.         push hl
  1024.         add hl,bc
  1025.         pop hl
  1026.         jr nc,$+5
  1027.          ld hl,0x10000-(SCRTRACKWID/2)
  1028.         ld (lefttime),hl
  1029.         ret
  1030.  
  1031. untr_pgup
  1032.         ld hl,(curtime)
  1033.         ld a,h
  1034.         or l
  1035.         ret z
  1036.         dec hl
  1037.          ;dec hl
  1038.          ;dec hl
  1039.          ;dec hl
  1040.          ;dec hl
  1041.         ld a,l
  1042.         and 0xf8
  1043.         ld l,a
  1044.         jr untr_pgdown_ok
  1045.  
  1046. untr_left
  1047.         ld hl,(curtime)
  1048.         ld a,h
  1049.         or l
  1050.         ret z
  1051.         dec hl
  1052.         ld (curtime),hl
  1053.         ld de,(lefttime)
  1054.         or a
  1055.         sbc hl,de
  1056.         add hl,de
  1057.         ret nc
  1058.         dec de
  1059.         ld (lefttime),de
  1060.         ret
  1061.  
  1062. amulchnsstep_tohl
  1063. _=chnsstep
  1064.         ld e,a
  1065.         ld d,0
  1066.         if _&0x80
  1067.         ;ld h,d
  1068.         ;ld l,e
  1069. __=1
  1070.         else
  1071.         ;ld h,d
  1072.         ;ld l,d
  1073. __=0
  1074.         endif
  1075. _=_*2
  1076.         dup 7
  1077.         if __ != 0
  1078.         add hl,hl
  1079. __=__*2
  1080.         endif
  1081.         if _&0x80
  1082.         if __ != 0
  1083.         add hl,de
  1084.         else
  1085.         ld h,d
  1086.         ld l,e
  1087.         endif
  1088. __=__+1
  1089.         endif
  1090. _=_*2
  1091.         edup
  1092.         ret
  1093.  
  1094. getcurplayxonscreen
  1095. ;out: a=0=offscreen
  1096.         call isplayxonscreen
  1097.         ld a,0
  1098.         ret c
  1099.         add hl,bc
  1100.         ld a,l
  1101.         add a,TRACKX
  1102.         ret
  1103.  
  1104. isplayxonscreen
  1105. ;CY=offscreen
  1106.         ld hl,(playtime)
  1107.         ld bc,(lefttime)
  1108.         or a
  1109.         sbc hl,bc
  1110.         ret c
  1111.         ld bc,SCRTRACKWID
  1112.         ;or a
  1113.         sbc hl,bc
  1114.         ccf
  1115.         ret
  1116.  
  1117. getcurplayx
  1118.         push bc
  1119.         ld hl,(playtime)
  1120.         ld bc,(lefttime)
  1121.         or a
  1122.         sbc hl,bc
  1123.         ld a,l
  1124.         add a,TRACKX
  1125.         pop bc
  1126. ;a=x
  1127.         ret
  1128.  
  1129. getcurx
  1130.         push bc
  1131.         ld hl,(curtime)
  1132.         ld bc,(lefttime)
  1133.         or a
  1134.         sbc hl,bc
  1135.         ld a,l
  1136.         add a,TRACKX
  1137.         pop bc
  1138. ;a=x
  1139.         ret
  1140.  
  1141. getcury
  1142.         ld a,(curtrack)
  1143.         ld hl,toptrack
  1144.         sub (hl)
  1145.         inc a
  1146. ;a=y
  1147.         ret
  1148.  
  1149. prcurcur
  1150.         call getcurx
  1151.         ld c,a
  1152.         call getcury
  1153.         ld b,a
  1154.         ld (oldcurxonscreen),bc
  1155.         jp prcur
  1156.  
  1157.         if 1==0
  1158. prtrackscur
  1159.         ld a,(tracks_curx)
  1160.         ld c,a
  1161.         call getcury
  1162.         ld b,a
  1163.         ld (oldcurxonscreen),bc
  1164.         jp prcur
  1165.         endif
  1166.  
  1167. findsamplelengthandloop
  1168. ;find sample length and loop line
  1169. ;hl=sample
  1170. ;out: e=length, d=loopsize
  1171.         ld de,0 ;e=length, d=loopsize
  1172.         ld bc,7
  1173. findsamplelength0
  1174.         inc e ;length = 1..
  1175.         add hl,bc
  1176.         ld a,(hl)
  1177.         inc a
  1178.         jr nz,findsamplelength0
  1179.         inc hl
  1180.         ld c,(hl)
  1181.         inc hl
  1182.         ld b,(hl)
  1183.         add hl,bc
  1184. ;hl=sampleloop
  1185.         ld bc,7
  1186. findsampleloop0
  1187.         inc d ;loopsize = 1..
  1188.         add hl,bc
  1189.         ld a,(hl)
  1190.         inc a
  1191.         jr nz,findsampleloop0
  1192.         ret
  1193.  
  1194.         include "view.asm"
  1195.         include "scroll.asm"
  1196.         include "save.asm"
  1197.  
  1198.         macro tn msk,semi,vol,frq,noi
  1199.         db msk,semi,0,vol
  1200.         dw frq
  1201.         db noi
  1202.         endm
  1203.  
  1204.         macro tne msk,semi,envsemi,vol,frq,noi
  1205.         db msk,semi,envsemi,vol
  1206.         dw frq
  1207.         db noi
  1208.         endm
  1209.  
  1210. C4ADD=-3353
  1211.  
  1212. C8ADD=0x000f-0x0ef8
  1213.  
  1214. wassmp_drum
  1215. ;-0187 01 TN- F (+3353 для орнамента -96)
  1216. ;-0352 00 T-- E
  1217. ;-0608 00 T-- D
  1218.             ;fsrohENT  ;s ;v ;f       ;n (o=outerenv)
  1219.         tn 0b11000011,-96,15,C4ADD+187,1
  1220.         tn 0b11000001,-96,15,C4ADD+352,0
  1221.         tn 0b11000001,-96,15,C4ADD+608,0
  1222.         tn 0b11001000,  0, 0,        0,0
  1223.         db -1
  1224.         dw -2-SMPLINE ;loop to line with hole
  1225. szsmp_drum=$-wassmp_drum
  1226.  
  1227. wassmp_hihat
  1228. ;+0471 05 TN- F (+3353 для орнамента -96)
  1229. ;+0471 04 TN- D
  1230. ;+0471 04 -N- C
  1231. ;+0471 03 -N- B
  1232. ;+0471 03 -N- A
  1233. ;+0471 02 -N- 9
  1234. ;+0471 02 -N- 8
  1235. ;+0471 01 -N- 7
  1236. ;+0471 01 -N- 5
  1237. ;+0471 01 -N- 5
  1238. ;+0471 01 -N- 4
  1239. ;+0471 01 -N- 4
  1240. ;+0471 01 -N- 3
  1241. ;+0471 01 -N- 3
  1242. ;+0471 01 -N- 2
  1243. ;+0471 01 -N- 2
  1244. ;+0471 01 -N- 1
  1245. ;+0471 01 -N- 1
  1246.             ;fsrohENT  ;s ;v ;f       ;n (o=outerenv)
  1247.         tn 0b11000011,-96,15,C4ADD-471,5
  1248.         tn 0b11000011,-96,13,C4ADD-471,4
  1249.         tn 0b11000010,-96,12,C4ADD-471,4
  1250.         tn 0b11000010,-96,11,C4ADD-471,3
  1251.         tn 0b11000010,-96,10,C4ADD-471,3
  1252.         tn 0b11000010,-96, 9,C4ADD-471,2
  1253.         tn 0b11000010,-96, 8,C4ADD-471,2
  1254.         tn 0b11000010,-96, 7,C4ADD-471,1
  1255.         tn 0b11000010,-96, 5,C4ADD-471,1
  1256.         tn 0b11000010,-96, 5,C4ADD-471,1
  1257.         tn 0b11000010,-96, 4,C4ADD-471,1
  1258.         tn 0b11000010,-96, 4,C4ADD-471,1
  1259.         tn 0b11000010,-96, 3,C4ADD-471,1
  1260.         tn 0b11000010,-96, 3,C4ADD-471,1
  1261.         tn 0b11000010,-96, 2,C4ADD-471,1
  1262.         tn 0b11000010,-96, 2,C4ADD-471,1
  1263.         tn 0b11000010,-96, 1,C4ADD-471,1
  1264.         tn 0b11000010,-96, 1,C4ADD-471,1
  1265.         tn 0b11001000,  0, 0,        0,0
  1266.         db -1
  1267.         dw -2-SMPLINE ;loop to line with hole
  1268. szsmp_hihat=$-wassmp_hihat
  1269.  
  1270. wassmp_crash ;B-8!!!
  1271. ;-0000 07 TN- F
  1272. ;-0000 10 -N- E
  1273. ;-0000 10 TN- E
  1274. ;-0000 14 -N- D
  1275. ;-0000 14 -N- C
  1276. ;-0000 14 -N- C
  1277. ;-0000 14 -N- C
  1278. ;-0000 14 -N- B
  1279. ;-0000 14 -N- B
  1280. ;-0000 14 -N- B etc
  1281.             ;fsrohENT  ;s ;v ;f       ;n (o=outerenv)
  1282.         tn 0b11000011,-96,15,C8ADD+0,7
  1283.         tn 0b11000010,-96,14,C8ADD+0,10
  1284.         tn 0b11000011,-96,14,C8ADD+0,10
  1285.         tn 0b11000010,-96,13,C8ADD+0,14
  1286.         tn 0b11000011,-96,12,C8ADD+0,14
  1287.         tn 0b11000011,-96,12,C8ADD+0,14
  1288.         tn 0b11000011,-96,12,C8ADD+0,14
  1289.         tn 0b11000011,-96,11,C8ADD+0,14
  1290.         tn 0b11000011,-96,11,C8ADD+0,14
  1291.         tn 0b11000011,-96,11,C8ADD+0,14
  1292.         tn 0b11000011,-96,10,C8ADD+0,14
  1293.         tn 0b11000011,-96,10,C8ADD+0,14
  1294.         tn 0b11000011,-96,10,C8ADD+0,14
  1295.         tn 0b11000011,-96, 9,C8ADD+0,14
  1296.         tn 0b11000011,-96, 9,C8ADD+0,14
  1297.         tn 0b11000011,-96, 9,C8ADD+0,14
  1298.         tn 0b11000011,-96, 8,C8ADD+0,14
  1299.         tn 0b11000011,-96, 8,C8ADD+0,14
  1300.         tn 0b11000011,-96, 8,C8ADD+0,14
  1301.         tn 0b11000011,-96, 7,C8ADD+0,14
  1302.         tn 0b11000011,-96, 7,C8ADD+0,14
  1303.         tn 0b11000011,-96, 7,C8ADD+0,14
  1304.         tn 0b11000011,-96, 6,C8ADD+0,14
  1305.         tn 0b11000011,-96, 6,C8ADD+0,14
  1306.         tn 0b11000011,-96, 6,C8ADD+0,14
  1307.         tn 0b11000011,-96, 5,C8ADD+0,14
  1308.         tn 0b11000011,-96, 5,C8ADD+0,14
  1309.         tn 0b11000011,-96, 5,C8ADD+0,14
  1310.         tn 0b11000011,-96, 4,C8ADD+0,14
  1311.         tn 0b11000011,-96, 4,C8ADD+0,14
  1312.         tn 0b11000011,-96, 4,C8ADD+0,14
  1313.         tn 0b11000011,-96, 3,C8ADD+0,14
  1314.         tn 0b11000011,-96, 3,C8ADD+0,14
  1315.         tn 0b11000011,-96, 3,C8ADD+0,14
  1316.         tn 0b11000011,-96, 2,C8ADD+0,14
  1317.         ;tn 0b11000011,-96, 2,C8ADD+0,14
  1318.         ;tn 0b11000011,-96, 2,C8ADD+0,14
  1319.         ;tn 0b11000011,-96, 1,C8ADD+0,14
  1320.         ;tn 0b11000011,-96, 1,C8ADD+0,14
  1321.         ;tn 0b11000011,-96, 1,C8ADD+0,14
  1322.         tn 0b11001000,  0, 0,        0,0
  1323.         db -1
  1324.         dw -2-SMPLINE ;loop to line with hole
  1325. szsmp_crash=$-wassmp_crash
  1326.  
  1327. wassmp_snare
  1328. ;-0288 00 TN- F (+3353 для орнамента -96)
  1329. ;+0202 06 TN- C
  1330. ;-0512 06 TN- B
  1331. ;-0970 06 TN- A
  1332. ;      06 -N- 9
  1333. ;      06 -N- 8
  1334. ;      05 -N- 7
  1335. ;      05 -N- 6
  1336. ;      05 -N- 5
  1337. ;      05 -N- 4
  1338. ;      05 -N- 3
  1339. ;      05 -N- 2
  1340. ;      05 -N- 1
  1341.             ;fsrohENT  ;s ;v ;f       ;n (o=outerenv)
  1342.         tn 0b11000011,-96,15,C4ADD+288,0
  1343.         tn 0b11000011,-96,12,C4ADD-202,6
  1344.         tn 0b11000011,-96,11,C4ADD+512,6
  1345.         tn 0b11000011,-96,10,C4ADD+970,6
  1346.         tn 0b00000010,  0, 9,        0,6
  1347.         tn 0b00000010,  0, 8,        0,6
  1348.         tn 0b00000010,  0, 7,        0,5
  1349.         tn 0b00000010,  0, 6,        0,5
  1350.         tn 0b00000010,  0, 5,        0,5
  1351.         tn 0b00000010,  0, 4,        0,5
  1352.         tn 0b00000010,  0, 3,        0,5
  1353.         tn 0b00000010,  0, 2,        0,5
  1354.         tn 0b00000010,  0, 1,        0,5
  1355. wassmp_pause
  1356.         tn 0b11001000,  0, 0,        0,0
  1357.         db -1
  1358.         dw -2-SMPLINE ;loop to line with hole
  1359. szsmp_pause=$-wassmp_pause
  1360. szsmp_snare=$-wassmp_snare
  1361.  
  1362. wassmp_bass
  1363.         tne 0b11000100,0,+5*12,0x0e,    0,0
  1364.         db -1
  1365.         dw -2-SMPLINE ;loop to first line
  1366. szsmp_bass=$-wassmp_bass
  1367.  
  1368. wassmp_maj
  1369.         tn 0b11000001,2*12+0,11,     0,0
  1370.         tn 0b11000001,2*12+4,11,     0,0
  1371.         tn 0b11000001,2*12+7,11,     0,0
  1372.         db -1
  1373.         dw wassmp_maj-($+1) ;loop to first line
  1374. szsmp_maj=$-wassmp_maj
  1375.  
  1376.         macro t4 msk,vol
  1377.         db msk|0b11000000,2*12,0,vol,  0,0,0
  1378.         endm
  1379.  
  1380. wassmp_orn2of6
  1381.         tn 0b11001000,  0, 0,        0,0
  1382.         tn 0b11001000,  0, 0,        0,0
  1383.         tn 0b11001000,  0, 0,        0,0
  1384.         tn 0b11001000,  0, 0,        0,0
  1385.         tn 0b11000001,2*12+0,15,     0,0
  1386.         tn 0b11000001,2*12+0,15,     0,0
  1387.         db -1
  1388.         dw wassmp_orn2of6-($+1) ;loop to first line
  1389. szsmp_orn2of6=$-wassmp_orn2of6
  1390.  
  1391. wassmp_orn1of3
  1392.         tn 0b11001000,  0, 0,        0,0
  1393.         tn 0b11001000,  0, 0,        0,0
  1394.         tn 0b11000001,2*12+0,15,     0,0
  1395.         db -1
  1396.         dw wassmp_orn1of3-($+1) ;loop to first line
  1397. szsmp_orn1of3=$-wassmp_orn1of3
  1398.  
  1399. wassmp_tone
  1400.         t4 0b00000001,15
  1401.         t4 0b00000001,14
  1402.         t4 0b00000001,14
  1403.         t4 0b00000001,14
  1404.         t4 0b00000001,14
  1405.         t4 0b00000001,13
  1406.         t4 0b00000001,13
  1407.         t4 0b00000001,13
  1408.         t4 0b00000001,13
  1409.         t4 0b00000001,12
  1410.         t4 0b00000001,12
  1411.         t4 0b00000001,12
  1412.         t4 0b00000001,12
  1413.         t4 0b00000001,11
  1414.         t4 0b00000001,11
  1415.         t4 0b00000001,11
  1416.         t4 0b00000001,11
  1417.         t4 0b00000001,10
  1418.         t4 0b00000001,10
  1419.         t4 0b00000001,10
  1420.         t4 0b00000001,10
  1421.         t4 0b00000001,9
  1422.         t4 0b00000001,9
  1423.         t4 0b00000001,9
  1424.         t4 0b00000001,9
  1425.         t4 0b00000001,8
  1426.         t4 0b00000001,8
  1427.         t4 0b00000001,8
  1428.         t4 0b00000001,8
  1429.         t4 0b00000001,7
  1430.         t4 0b00000001,7
  1431.         t4 0b00000001,7
  1432.         t4 0b00000001,7
  1433.         t4 0b00001000,0
  1434.         db -1
  1435.         dw -2-SMPLINE ;loop to line with hole
  1436. szsmp_tone=$-wassmp_tone
  1437.  
  1438. ;A0gO123
  1439.  
  1440. ;bass, pad и tone имеют параметры:
  1441. ;сэмпл
  1442. ;громкость
  1443. ;смещение в сэмпле
  1444.  ;канал [рабочая октава не нужна, она в сэмпле]
  1445.  ;приоритет
  1446.  
  1447. ;drum имеет параметры:
  1448. ;
  1449. ;громкость
  1450. ;[смещение в сэмпле не нужно?]
  1451.  ;канал [рабочая октава]
  1452.  ;приоритет
  1453.  
  1454. ;фильтр имеет параметры:
  1455. ;тип фильтра (d=drum channel, t=tone channel(bass/pad/tone), g=gain, Vv=vib/gliss up/down, Ee=env(vib/gliss up/down), n=noise down)
  1456. ;для вибрато и глисса: скорость изменения
  1457. ;для вибрато: глубина (0=бесконечность, т.е. gliss)
  1458. ;для вибрато: период
  1459.  
  1460. ;0,0,0,0,1,0,0,0,0,-1
  1461. ;0,0,0,1,1,0,0,0,-1,-1
  1462.  
  1463. tnotekeys
  1464.         db "MJNHBGVCDXSZ"
  1465.         db "mjnhbgvcdxsz"
  1466.         db ssM,ssJ,ssN,ssH,ssB,ssG,ssV,ssC,ssD,ssX,ssS,ssZ
  1467.         align 256
  1468. wasfrq
  1469.         incbin "tb_st.bin"
  1470.  
  1471.         ds 0x8000-$
  1472. tfrq
  1473.         ds 512
  1474.         include "mem.asm"
  1475.         include "play.asm"
  1476.         include "mix.asm"
  1477.  
  1478. ttypes
  1479.         if OLDTTYPES
  1480.         db "ORDER ",13
  1481.         db "drum *",13
  1482.         db "tone *",13
  1483.         db "vib 1*",13
  1484.         db "pad  *",13
  1485.         db "vol   ",13
  1486.          ;db "vol   ",13
  1487.         db "drum *",13
  1488.         db "tone *",13
  1489.         db "vol   ",13
  1490.         db "bass *",13
  1491.         db "drum *",13
  1492.         db "tone *",13
  1493.         db "pad  *",13
  1494.         db "vol   "
  1495.         db 0
  1496.  
  1497.         else
  1498. ;A0gOS2v*
  1499.         db  0, 0,_O, 0, 0, 0, 0, 0;"  O     "
  1500.         db _A,_5,_d,_O, 0, 0,_f, 0;"A5dO  f "
  1501.         db _A,_2,_t,_O,_t, 0,_f, 0;"A2tOt f "
  1502.         db  0, 0,_V,_O,_3,_1,_1, 0;"  VO311 "
  1503.         db _D,_0,_t,_O,_p, 0,_f, 0;"D0tOp1f "
  1504.         db  0, 0,_g, 0, 0, 0, 0, 0;"  g     "
  1505.         db _B,_5,_d,_O, 0, 0,_f, 0;"B5dO  f "
  1506.         db _B,_2,_t,_O,_t, 0,_f, 0;"B2tOt f "
  1507.         db  0, 0,_g, 0, 0, 0, 0, 0;"  g     "
  1508.         db _B,_0,_t,_O,_b, 0,_f, 0;"B0tOb f "
  1509.         db _C,_5,_d,_O, 0, 0,_f, 0;"C5dO  f "
  1510.         db _C,_5,_t,_O,_t, 0,_f, 0;"C2tOt f "
  1511.         db _C,_0,_t,_O,_p, 0,_f, 0;"C0tOp1f "
  1512.         db  0, 0,_g, 0, 0, 0, 0, 0;"  g     "
  1513.         ds ttypes+(MAXNTRACKS*8)-$
  1514. ttypes_end
  1515.         endif
  1516.  
  1517. ;смотрим тип текущего канала
  1518. gettracktype
  1519.         push de
  1520.         ld l,a
  1521.         ld h,0
  1522.         add hl,hl
  1523.         add hl,hl
  1524.         add hl,hl
  1525.         ld de,ttypes+2
  1526.         add hl,de
  1527.         ld a,(hl)
  1528.         pop de
  1529.         ret
  1530.  
  1531. gettrackorder
  1532.         push de
  1533.         ld l,a
  1534.         ld h,0
  1535.         add hl,hl
  1536.         add hl,hl
  1537.         add hl,hl
  1538.         ld de,ttypes+3
  1539.         add hl,de
  1540.         ld a,(hl)
  1541.         pop de
  1542.         ret
  1543.  
  1544. tracks
  1545. chns=tracks+2
  1546.         CHNTYPE 0x80+CHNTYPE_ORDER  ,0;,0;-1
  1547.         CHNTYPE 0x80+CHNTYPE_SAMPLES,1;,0;Adrum
  1548.         CHNTYPE 0x80+CHNTYPE_NOTES  ,1;,0;Atone
  1549.         CHNTYPE 0x80+CHNTYPE_FILTER ,1;,0;Filter_Avib
  1550.         CHNTYPE 0x80+CHNTYPE_NOTES  ,1;,0;Apad
  1551.         CHNTYPE 0x80+CHNTYPE_FILTER ,0;,0;Filter_Avol
  1552.          ;CHNTYPE 0x80+CHNTYPE_FILTER ,0,0;Filter_Bvol
  1553.         CHNTYPE 0x80+CHNTYPE_SAMPLES,1;,0;Bdrum
  1554.         CHNTYPE 0x80+CHNTYPE_NOTES  ,1;,0;Btone
  1555.         CHNTYPE 0x80+CHNTYPE_FILTER ,0;,0;Filter_Bvol
  1556.         CHNTYPE 0x80+CHNTYPE_NOTES  ,1;,0;Bbass
  1557.         CHNTYPE 0x80+CHNTYPE_SAMPLES,1;,0;Cdrum
  1558.         CHNTYPE 0x80+CHNTYPE_NOTES  ,1;,0;Ctone
  1559.         CHNTYPE 0x80+CHNTYPE_NOTES  ,1;,0;Cpad
  1560.         CHNTYPE 0x80+CHNTYPE_FILTER ,0;,0;Filter_Cvol
  1561.          ;CHNTYPE 0x80+CHNTYPE_FILTER ,0;,0;Filter_Cvol
  1562.         ds tracks+(chnsstep*MAXNTRACKS)-$,-1
  1563. tracks_end
  1564.         ;db -1
  1565.  
  1566. emptychn
  1567.         chn
  1568.  
  1569. chip0
  1570.         chip
  1571. chip1
  1572.         chip
  1573.  
  1574.  
  1575. lefttime
  1576.         dw 0
  1577. playtime
  1578.         dw 0
  1579. curtime
  1580.         dw 0
  1581. curtrack
  1582.         db 0
  1583. toptrack
  1584.         db 0
  1585. ntracks
  1586.         db 14 ;числотреков N
  1587.  
  1588.         align 4
  1589. freemem_start
  1590. cmd_end
  1591.  
  1592.  
  1593.         display "Size ",/d,cmd_end-cmd_begin," bytes"
  1594.  
  1595.         savebin "untr.com",cmd_begin,cmd_end-cmd_begin
  1596.  
  1597.         LABELSLIST "../../us/user.l"
  1598.