?login_element?

Subversion Repositories NedoOS

Rev

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

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