?login_element?

Subversion Repositories NedoOS

Rev

Rev 1460 | 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 ;+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: dehl=timer
  722.         ;ld (playenter_oldtimer),hl
  723. playenter0
  724. ;        OS_GETTIMER ;out: dehl=timer
  725. ;playenter_oldtimer=$+1
  726. ;        ld de,0
  727. ;        ld (playenter_oldtimer),hl
  728.        
  729.         ;call untr_right ;TODO check end and loop
  730.         halt
  731. playenter_curxy=$+1
  732.         ld bc,0
  733.           ;call prcur
  734. playenter0_go
  735.         call updatescr
  736.         call getcurplayx
  737.         ld c,a
  738.         call getcury
  739.         ld b,a
  740.         ld (playenter_curxy),bc
  741.           ;call prcur
  742.           ;jr playenter0
  743.         call checknotekeys_pressed
  744.         jr nz,playenter0
  745.          ld hl,(playtime)
  746.          call untr_pgdown_ok
  747.  
  748.         call stopplay
  749.  
  750.         jp untr_afternotekey
  751.  
  752. untr_del_popret
  753.         pop hl
  754.         ret
  755.  
  756. untr_backspace
  757.         ld hl,(curtime)
  758.         ld a,h
  759.         or l
  760.         ret z
  761.         call untr_left
  762.         ;jp untr_del
  763. untr_del
  764.         ld a,(curtrack)
  765.         ld hl,(curtime)
  766.         call tracktime_totrackpartindex
  767. ;hl=index
  768. ;ly=part
  769. ;a=track
  770.         push hl ;hl=curaddr
  771.         call getendaddr ;de=end or 0
  772.         ex de,hl
  773.         pop de ;de=curaddr
  774.         push hl ;hl=endaddr
  775.         xor a
  776.         sbc hl,de ;endaddr-curaddr
  777.         jr c,untr_del_popret
  778.         ex de,hl
  779.         inc de
  780. ;de=число нот до конца трека включительно
  781. ;0x0101 - 1 проход
  782. ;0x0102 - 2 прохода
  783. ;0x0100 - 256 проходов
  784. ;0x0201 - 257 проходов
  785. ;b=LSB
  786. ;hx=HSB = ((num-1)/256)+1
  787.         ld b,e
  788.         dec de
  789.         inc d
  790.         ld hx,d
  791.  
  792.         pop hl ;hl=endaddr
  793.  
  794.         ;ld de,-NTRACKS
  795.         ld c,NOTE_SPACE
  796. ;hl=index
  797. ;ly=part
  798. untr_del0
  799.         push de
  800.         ld a,(curtrack)
  801.         call poketrackpartindex_c ;c<->mem(hl)
  802.         pop de
  803.          dec hl ;add hl,de
  804.         djnz untr_del0
  805.         dec hx
  806.         jr nz,untr_del0
  807.  
  808.         jp setneedredraw_alltracksiforder
  809.  
  810. untr_ins
  811.         ld a,(curtrack)
  812.         ld hl,(curtime)
  813.         call tracktime_totrackpartindex
  814. ;hl=index
  815. ;ly=part
  816. ;a=track
  817.         push hl ;hl=curaddr
  818.         push hl ;hl=curaddr
  819.         call getendaddr ;de=end or 0
  820.         ex de,hl
  821.         pop de ;de=curaddr
  822.         or a
  823.         sbc hl,de ;endaddr-curaddr
  824.         jr c,untr_del_popret
  825.         ex de,hl
  826.         inc de
  827.         inc de
  828. ;de=число нот до конца трека включительно
  829. ;0x0101 - 1 проход
  830. ;0x0102 - 2 прохода
  831. ;0x0100 - 256 проходов
  832. ;0x0201 - 257 проходов
  833. ;b=LSB
  834. ;hx=HSB = ((num-1)/256)+1
  835.         ld b,e
  836.         dec de
  837.         inc d
  838.         ld hx,d
  839.  
  840.         pop hl ;hl=curaddr
  841.  
  842.         ;ld de,NTRACKS
  843.         ld c,NOTE_SPACE
  844. ;hl=index
  845. ;ly=part
  846. untr_ins0
  847.         push de
  848.         ld a,(curtrack)
  849.         call poketrackpartindex_c ;c<->mem(hl)
  850.         pop de
  851.          inc hl ;add hl,de
  852.         djnz untr_ins0
  853.         dec hx
  854.         jr nz,untr_ins0
  855.         jp setneedredraw_alltracksiforder
  856.  
  857. untr_quit
  858.         QUIT
  859.  
  860. checknotekeys_pressed
  861.         ld a,0x81
  862.         in a,(0xfe)
  863.         cpl
  864.         and 0x1f
  865.         ret nz
  866.         ld a,0x7f ;space..B
  867.         in a,(0xfe)
  868.         cpl
  869.         and 0x1c ;BNM
  870.         ret nz
  871.         ld a,0xfe ;cs..V
  872.         in a,(0xfe)
  873.         cpl
  874.         and 0x1e
  875.         ret
  876.  
  877. untr_home
  878. ;переход на начало текущей части
  879.         ld hl,(curtime)
  880.         ld a,(curtrack)
  881.         push hl
  882.         call tracktime_totrackpartindex ;hl=index
  883.         ex de,hl ;de=index
  884.         pop hl
  885.        ld a,d
  886.        or e
  887.        jr z,untr_home_left
  888. untr_home_ok
  889.         or a
  890.         sbc hl,de ;beg=time-index (index=time-beg)
  891.         jp untr_pgdown_ok
  892. untr_home_left
  893. ;уже в начале текущей части, пытаемся найти предыдущую
  894.         ld a,h
  895.         or l
  896.         ret z
  897.         dec hl
  898.         ld a,(curtrack)
  899.         push hl
  900.         call tracktime_totrackpartindex ;hl=index
  901.         ex de,hl ;de=index
  902.         pop hl
  903.         jr untr_home_ok
  904.  
  905. untr_end
  906. ;переход на конец текущей части в текущем треке
  907.         ld a,(curtrack)
  908.         ld hl,(curtime)
  909.        push hl ;curtime
  910.         push hl
  911.         call tracktime_totrackpartindex ;hl=index
  912.         ex de,hl ;de=index
  913.         pop hl
  914.         or a
  915.         sbc hl,de ;beg=time-index (index=time-beg)
  916.         push hl ;beg
  917.         call getendaddr ;de=end index
  918.         pop hl ;beg
  919.         add hl,de ;time=index+beg (beg=time-index)
  920.        pop de ;curtime
  921.         or a
  922.         sbc hl,de ;time>curtime?
  923.         add hl,de
  924.         jr c,untr_end_findnext
  925.         jp nz,untr_pgdown_ok
  926. untr_end_findnext
  927.         ex de,hl ;hl=curtime
  928. ;уже на конце текущей части в текущем треке
  929. ;пытаемся найти следующую часть
  930.         ld a,(curtrack)
  931.         inc hl
  932.         push hl
  933.         call gettrackorder ;номер ордера (0=нет)
  934.         pop hl
  935.         or a ;канал подписан на ордер?
  936.         ret z ;не подписан
  937.         ex de,hl
  938.         xor a ;TODO номер канала ордера
  939.         ld ly,0 ;у ордера всегда берём дефолтную часть (part=0), т.к. ордер не подчиняется ордерам
  940.         call getroot
  941.         call findright ;out: de=nonempty index (or 0xffff), a=data (1..62 or 0)
  942.          ld a,d
  943.          and e
  944.          inc a
  945.          ret z
  946.         ex de,hl
  947.         jp untr_pgdown_ok
  948.  
  949. untr_up
  950.         ld hl,curtrack
  951.         ld a,(hl)
  952.         or a
  953.         ret z
  954.         dec (hl)
  955.         ld a,(hl)
  956.         ld hl,toptrack
  957.         cp (hl)
  958.         ret nc
  959.         dec (hl)
  960.         ret;jp setneedprtypes ;setneedredraw
  961.  
  962. setneedredraw_alltracksiforder
  963.         ld a,(curtrack)
  964.         or a
  965.         call z,setneedpralltracks ;keep a!
  966. setneedredraw_curtrack
  967.         ;ld a,1
  968.         ;ld (untr_needredraw),a ;forced redraw (even if lefttime has not changed)
  969.         ld a,(curtrack)
  970.         call amulchnsstep_tohl
  971.         ld de,chns-2;tracks
  972.         add hl,de
  973.         set 7,(hl)
  974.         ret
  975. setneedpralltracks
  976. ;keep a!
  977.         ld ix,chns;tracks
  978.         ld a,(ntracks)
  979.         ld b,a
  980.         ld de,chnsstep
  981. setneedpralltracks0
  982.         set 7,(ix-2);(hl)
  983.         add ix,de
  984.         ;inc hl
  985.         ;inc hl
  986.         ;inc hl
  987.         ;inc hl
  988.         djnz setneedpralltracks0
  989.         ;ld a,55 ;"scf"
  990.         ;ld (needpralltracks),a
  991.         ret
  992.  
  993. untr_down
  994.         ld hl,curtrack
  995.         ld a,(ntracks)
  996.         dec a
  997.         cp (hl)
  998.         ret z
  999.         inc (hl)
  1000.         ld c,(hl)
  1001.         ld hl,toptrack
  1002.         ld a,(hl)
  1003.         add a,SCRNTRACKS
  1004.         ld b,a
  1005.         ld a,c
  1006.         cp b
  1007.         ret c
  1008.         inc (hl)
  1009.         ret;jp setneedprtypes;setneedredraw
  1010.  
  1011. untr_pgdown
  1012.         ld hl,(curtime)
  1013.          ;inc hl
  1014.          ;inc hl
  1015.          ;inc hl
  1016.          ;inc hl
  1017.          ;inc hl
  1018.         ld a,l
  1019.         and 0xf8
  1020.         ld l,a
  1021.         ld bc,8
  1022.         add hl,bc
  1023.         ret c
  1024.         call checkeof
  1025. untr_pgdown_ok
  1026.         ld (curtime),hl
  1027. ;установим курсор в центр, если это возможно
  1028.         ld bc,SCRTRACKWID/2
  1029.         xor a
  1030.         sbc hl,bc
  1031.         jr nc,$+4
  1032.          ld h,a
  1033.          ld l,a
  1034.         push hl
  1035.         add hl,bc
  1036.         pop hl
  1037.         jr nc,$+5
  1038.          ld hl,0x10000-(SCRTRACKWID/2)
  1039.         ld (lefttime),hl
  1040.         ret
  1041.  
  1042. untr_pgup
  1043.         ld hl,(curtime)
  1044.         ld a,h
  1045.         or l
  1046.         ret z
  1047.         dec hl
  1048.          ;dec hl
  1049.          ;dec hl
  1050.          ;dec hl
  1051.          ;dec hl
  1052.         ld a,l
  1053.         and 0xf8
  1054.         ld l,a
  1055.         jr untr_pgdown_ok
  1056.  
  1057. untr_left
  1058.         ld hl,(curtime)
  1059.         ld a,h
  1060.         or l
  1061.         ret z
  1062.         dec hl
  1063.         ld (curtime),hl
  1064.         ld de,(lefttime)
  1065.         or a
  1066.         sbc hl,de
  1067.         add hl,de
  1068.         ret nc
  1069.         dec de
  1070.         ld (lefttime),de
  1071.         ret
  1072.  
  1073. amulchnsstep_tohl
  1074. _=chnsstep
  1075.         ld e,a
  1076.         ld d,0
  1077.         if _&0x80
  1078.         ;ld h,d
  1079.         ;ld l,e
  1080. __=1
  1081.         else
  1082.         ;ld h,d
  1083.         ;ld l,d
  1084. __=0
  1085.         endif
  1086. _=_*2
  1087.         dup 7
  1088.         if __ != 0
  1089.         add hl,hl
  1090. __=__*2
  1091.         endif
  1092.         if _&0x80
  1093.         if __ != 0
  1094.         add hl,de
  1095.         else
  1096.         ld h,d
  1097.         ld l,e
  1098.         endif
  1099. __=__+1
  1100.         endif
  1101. _=_*2
  1102.         edup
  1103.         ret
  1104.  
  1105. getcurplayxonscreen
  1106. ;out: a=0=offscreen
  1107.         call isplayxonscreen
  1108.         ld a,0
  1109.         ret c
  1110.         add hl,bc
  1111.         ld a,l
  1112.         add a,TRACKX
  1113.         ret
  1114.  
  1115. isplayxonscreen
  1116. ;CY=offscreen
  1117.         ld hl,(playtime)
  1118.         ld bc,(lefttime)
  1119.         or a
  1120.         sbc hl,bc
  1121.         ret c
  1122.         ld bc,SCRTRACKWID
  1123.         ;or a
  1124.         sbc hl,bc
  1125.         ccf
  1126.         ret
  1127.  
  1128. getcurplayx
  1129.         push bc
  1130.         ld hl,(playtime)
  1131.         ld bc,(lefttime)
  1132.         or a
  1133.         sbc hl,bc
  1134.         ld a,l
  1135.         add a,TRACKX
  1136.         pop bc
  1137. ;a=x
  1138.         ret
  1139.  
  1140. getcurx
  1141.         push bc
  1142.         ld hl,(curtime)
  1143.         ld bc,(lefttime)
  1144.         or a
  1145.         sbc hl,bc
  1146.         ld a,l
  1147.         add a,TRACKX
  1148.         pop bc
  1149. ;a=x
  1150.         ret
  1151.  
  1152. getcury
  1153.         ld a,(curtrack)
  1154.         ld hl,toptrack
  1155.         sub (hl)
  1156.         inc a
  1157. ;a=y
  1158.         ret
  1159.  
  1160. prcurcur
  1161.         call getcurx
  1162.         ld c,a
  1163.         call getcury
  1164.         ld b,a
  1165.         ld (oldcurxonscreen),bc
  1166.         jp prcur
  1167.  
  1168.         if 1==0
  1169. prtrackscur
  1170.         ld a,(tracks_curx)
  1171.         ld c,a
  1172.         call getcury
  1173.         ld b,a
  1174.         ld (oldcurxonscreen),bc
  1175.         jp prcur
  1176.         endif
  1177.  
  1178. findsamplelengthandloop
  1179. ;find sample length and loop line
  1180. ;hl=sample
  1181. ;out: e=length, d=loopsize
  1182.         ld de,0 ;e=length, d=loopsize
  1183.         ld bc,7
  1184. findsamplelength0
  1185.         inc e ;length = 1..
  1186.         add hl,bc
  1187.         ld a,(hl)
  1188.         inc a
  1189.         jr nz,findsamplelength0
  1190.         inc hl
  1191.         ld c,(hl)
  1192.         inc hl
  1193.         ld b,(hl)
  1194.         add hl,bc
  1195. ;hl=sampleloop
  1196.         ld bc,7
  1197. findsampleloop0
  1198.         inc d ;loopsize = 1..
  1199.         add hl,bc
  1200.         ld a,(hl)
  1201.         inc a
  1202.         jr nz,findsampleloop0
  1203.         ret
  1204.  
  1205.         include "view.asm"
  1206.         include "scroll.asm"
  1207.         include "save.asm"
  1208.  
  1209. getword
  1210. ;hl=string
  1211. ;de=wordbuf
  1212. ;out: hl=terminator/space addr
  1213. getword0
  1214.         ld a,(hl)
  1215.         or a
  1216.         jr z,getwordq
  1217.         sub ' '
  1218.         jr z,getwordq
  1219.         ldi
  1220.         jp getword0
  1221. getwordq
  1222.         ;xor a
  1223.         ld (de),a
  1224.         ret
  1225.  
  1226. skipword
  1227. ;hl=string
  1228. ;out: hl=terminator/space addr
  1229. skipword0
  1230.         ld a,(hl)
  1231.         or a
  1232.         ret z
  1233.         sub ' '
  1234.         ret z
  1235.         inc hl
  1236.         jp skipword0
  1237.  
  1238. skipspaces
  1239. ;hl=string
  1240. ;out: hl=after last space
  1241.         ld a,(hl)
  1242.         cp ' '
  1243.         ret nz
  1244.         inc hl
  1245.         jr skipspaces
  1246.  
  1247.  
  1248.         macro tn msk,semi,vol,frq,noi
  1249.         db msk,semi,0,vol
  1250.         dw frq
  1251.         db noi
  1252.         endm
  1253.  
  1254.         macro tne msk,semi,envsemi,vol,frq,noi
  1255.         db msk,semi,envsemi,vol
  1256.         dw frq
  1257.         db noi
  1258.         endm
  1259.  
  1260. C4ADD=-3353
  1261.  
  1262. C8ADD=0x000f-0x0ef8
  1263.  
  1264. wassmp_drum
  1265. ;-0187 01 TN- F (+3353 для орнамента -96)
  1266. ;-0352 00 T-- E
  1267. ;-0608 00 T-- D
  1268.             ;fsrohENT  ;s ;v ;f       ;n (o=outerenv)
  1269.         tn 0b11000011,-96,15,C4ADD+187,1
  1270.         tn 0b11000001,-96,15,C4ADD+352,0
  1271.         tn 0b11000001,-96,15,C4ADD+608,0
  1272.         tn 0b11001000,  0, 0,        0,0
  1273.         db -1
  1274.         dw -2-SMPLINE ;loop to line with hole
  1275. szsmp_drum=$-wassmp_drum
  1276.  
  1277. wassmp_hihat
  1278. ;+0471 05 TN- F (+3353 для орнамента -96)
  1279. ;+0471 04 TN- D
  1280. ;+0471 04 -N- C
  1281. ;+0471 03 -N- B
  1282. ;+0471 03 -N- A
  1283. ;+0471 02 -N- 9
  1284. ;+0471 02 -N- 8
  1285. ;+0471 01 -N- 7
  1286. ;+0471 01 -N- 5
  1287. ;+0471 01 -N- 5
  1288. ;+0471 01 -N- 4
  1289. ;+0471 01 -N- 4
  1290. ;+0471 01 -N- 3
  1291. ;+0471 01 -N- 3
  1292. ;+0471 01 -N- 2
  1293. ;+0471 01 -N- 2
  1294. ;+0471 01 -N- 1
  1295. ;+0471 01 -N- 1
  1296.             ;fsrohENT  ;s ;v ;f       ;n (o=outerenv)
  1297.         tn 0b11000011,-96,15,C4ADD-471,5
  1298.         tn 0b11000011,-96,13,C4ADD-471,4
  1299.         tn 0b11000010,-96,12,C4ADD-471,4
  1300.         tn 0b11000010,-96,11,C4ADD-471,3
  1301.         tn 0b11000010,-96,10,C4ADD-471,3
  1302.         tn 0b11000010,-96, 9,C4ADD-471,2
  1303.         tn 0b11000010,-96, 8,C4ADD-471,2
  1304.         tn 0b11000010,-96, 7,C4ADD-471,1
  1305.         tn 0b11000010,-96, 5,C4ADD-471,1
  1306.         tn 0b11000010,-96, 5,C4ADD-471,1
  1307.         tn 0b11000010,-96, 4,C4ADD-471,1
  1308.         tn 0b11000010,-96, 4,C4ADD-471,1
  1309.         tn 0b11000010,-96, 3,C4ADD-471,1
  1310.         tn 0b11000010,-96, 3,C4ADD-471,1
  1311.         tn 0b11000010,-96, 2,C4ADD-471,1
  1312.         tn 0b11000010,-96, 2,C4ADD-471,1
  1313.         tn 0b11000010,-96, 1,C4ADD-471,1
  1314.         tn 0b11000010,-96, 1,C4ADD-471,1
  1315.         tn 0b11001000,  0, 0,        0,0
  1316.         db -1
  1317.         dw -2-SMPLINE ;loop to line with hole
  1318. szsmp_hihat=$-wassmp_hihat
  1319.  
  1320. wassmp_crash ;B-8!!!
  1321. ;-0000 07 TN- F
  1322. ;-0000 10 -N- E
  1323. ;-0000 10 TN- E
  1324. ;-0000 14 -N- D
  1325. ;-0000 14 -N- C
  1326. ;-0000 14 -N- C
  1327. ;-0000 14 -N- C
  1328. ;-0000 14 -N- B
  1329. ;-0000 14 -N- B
  1330. ;-0000 14 -N- B etc
  1331.             ;fsrohENT  ;s ;v ;f       ;n (o=outerenv)
  1332.         tn 0b11000011,-96,15,C8ADD+0,7
  1333.         tn 0b11000010,-96,14,C8ADD+0,10
  1334.         tn 0b11000011,-96,14,C8ADD+0,10
  1335.         tn 0b11000010,-96,13,C8ADD+0,14
  1336.         tn 0b11000011,-96,12,C8ADD+0,14
  1337.         tn 0b11000011,-96,12,C8ADD+0,14
  1338.         tn 0b11000011,-96,12,C8ADD+0,14
  1339.         tn 0b11000011,-96,11,C8ADD+0,14
  1340.         tn 0b11000011,-96,11,C8ADD+0,14
  1341.         tn 0b11000011,-96,11,C8ADD+0,14
  1342.         tn 0b11000011,-96,10,C8ADD+0,14
  1343.         tn 0b11000011,-96,10,C8ADD+0,14
  1344.         tn 0b11000011,-96,10,C8ADD+0,14
  1345.         tn 0b11000011,-96, 9,C8ADD+0,14
  1346.         tn 0b11000011,-96, 9,C8ADD+0,14
  1347.         tn 0b11000011,-96, 9,C8ADD+0,14
  1348.         tn 0b11000011,-96, 8,C8ADD+0,14
  1349.         tn 0b11000011,-96, 8,C8ADD+0,14
  1350.         tn 0b11000011,-96, 8,C8ADD+0,14
  1351.         tn 0b11000011,-96, 7,C8ADD+0,14
  1352.         tn 0b11000011,-96, 7,C8ADD+0,14
  1353.         tn 0b11000011,-96, 7,C8ADD+0,14
  1354.         tn 0b11000011,-96, 6,C8ADD+0,14
  1355.         tn 0b11000011,-96, 6,C8ADD+0,14
  1356.         tn 0b11000011,-96, 6,C8ADD+0,14
  1357.         tn 0b11000011,-96, 5,C8ADD+0,14
  1358.         tn 0b11000011,-96, 5,C8ADD+0,14
  1359.         tn 0b11000011,-96, 5,C8ADD+0,14
  1360.         tn 0b11000011,-96, 4,C8ADD+0,14
  1361.         tn 0b11000011,-96, 4,C8ADD+0,14
  1362.         tn 0b11000011,-96, 4,C8ADD+0,14
  1363.         tn 0b11000011,-96, 3,C8ADD+0,14
  1364.         tn 0b11000011,-96, 3,C8ADD+0,14
  1365.         tn 0b11000011,-96, 3,C8ADD+0,14
  1366.         tn 0b11000011,-96, 2,C8ADD+0,14
  1367.         ;tn 0b11000011,-96, 2,C8ADD+0,14
  1368.         ;tn 0b11000011,-96, 2,C8ADD+0,14
  1369.         ;tn 0b11000011,-96, 1,C8ADD+0,14
  1370.         ;tn 0b11000011,-96, 1,C8ADD+0,14
  1371.         ;tn 0b11000011,-96, 1,C8ADD+0,14
  1372.         tn 0b11001000,  0, 0,        0,0
  1373.         db -1
  1374.         dw -2-SMPLINE ;loop to line with hole
  1375. szsmp_crash=$-wassmp_crash
  1376.  
  1377. wassmp_snare
  1378. ;-0288 00 TN- F (+3353 для орнамента -96)
  1379. ;+0202 06 TN- C
  1380. ;-0512 06 TN- B
  1381. ;-0970 06 TN- A
  1382. ;      06 -N- 9
  1383. ;      06 -N- 8
  1384. ;      05 -N- 7
  1385. ;      05 -N- 6
  1386. ;      05 -N- 5
  1387. ;      05 -N- 4
  1388. ;      05 -N- 3
  1389. ;      05 -N- 2
  1390. ;      05 -N- 1
  1391.             ;fsrohENT  ;s ;v ;f       ;n (o=outerenv)
  1392.         tn 0b11000011,-96,15,C4ADD+288,0
  1393.         tn 0b11000011,-96,12,C4ADD-202,6
  1394.         tn 0b11000011,-96,11,C4ADD+512,6
  1395.         tn 0b11000011,-96,10,C4ADD+970,6
  1396.         tn 0b00000010,  0, 9,        0,6
  1397.         tn 0b00000010,  0, 8,        0,6
  1398.         tn 0b00000010,  0, 7,        0,5
  1399.         tn 0b00000010,  0, 6,        0,5
  1400.         tn 0b00000010,  0, 5,        0,5
  1401.         tn 0b00000010,  0, 4,        0,5
  1402.         tn 0b00000010,  0, 3,        0,5
  1403.         tn 0b00000010,  0, 2,        0,5
  1404.         tn 0b00000010,  0, 1,        0,5
  1405. wassmp_pause
  1406.         tn 0b11001000,  0, 0,        0,0
  1407.         db -1
  1408.         dw -2-SMPLINE ;loop to line with hole
  1409. szsmp_pause=$-wassmp_pause
  1410. szsmp_snare=$-wassmp_snare
  1411.  
  1412. wassmp_bass
  1413.         tne 0b11000100,0,+5*12,0x0e,    0,0
  1414.         db -1
  1415.         dw -2-SMPLINE ;loop to first line
  1416. szsmp_bass=$-wassmp_bass
  1417.  
  1418. wassmp_maj
  1419.         tn 0b11000001,2*12+0,11,     0,0
  1420.         tn 0b11000001,2*12+4,11,     0,0
  1421.         tn 0b11000001,2*12+7,11,     0,0
  1422.         db -1
  1423.         dw wassmp_maj-($+1) ;loop to first line
  1424. szsmp_maj=$-wassmp_maj
  1425.  
  1426.         macro t4 msk,vol
  1427.         db msk|0b11000000,2*12,0,vol,  0,0,0
  1428.         endm
  1429.  
  1430. wassmp_orn2of6
  1431.         tn 0b11001000,  0, 0,        0,0
  1432.         tn 0b11001000,  0, 0,        0,0
  1433.         tn 0b11001000,  0, 0,        0,0
  1434.         tn 0b11001000,  0, 0,        0,0
  1435.         tn 0b11000001,2*12+0,15,     0,0
  1436.         tn 0b11000001,2*12+0,15,     0,0
  1437.         db -1
  1438.         dw wassmp_orn2of6-($+1) ;loop to first line
  1439. szsmp_orn2of6=$-wassmp_orn2of6
  1440.  
  1441. wassmp_orn1of3
  1442.         tn 0b11001000,  0, 0,        0,0
  1443.         tn 0b11001000,  0, 0,        0,0
  1444.         tn 0b11000001,2*12+0,15,     0,0
  1445.         db -1
  1446.         dw wassmp_orn1of3-($+1) ;loop to first line
  1447. szsmp_orn1of3=$-wassmp_orn1of3
  1448.  
  1449. wassmp_tone
  1450.         t4 0b00000001,15
  1451.         t4 0b00000001,14
  1452.         t4 0b00000001,14
  1453.         t4 0b00000001,14
  1454.         t4 0b00000001,14
  1455.         t4 0b00000001,13
  1456.         t4 0b00000001,13
  1457.         t4 0b00000001,13
  1458.         t4 0b00000001,13
  1459.         t4 0b00000001,12
  1460.         t4 0b00000001,12
  1461.         t4 0b00000001,12
  1462.         t4 0b00000001,12
  1463.         t4 0b00000001,11
  1464.         t4 0b00000001,11
  1465.         t4 0b00000001,11
  1466.         t4 0b00000001,11
  1467.         t4 0b00000001,10
  1468.         t4 0b00000001,10
  1469.         t4 0b00000001,10
  1470.         t4 0b00000001,10
  1471.         t4 0b00000001,9
  1472.         t4 0b00000001,9
  1473.         t4 0b00000001,9
  1474.         t4 0b00000001,9
  1475.         t4 0b00000001,8
  1476.         t4 0b00000001,8
  1477.         t4 0b00000001,8
  1478.         t4 0b00000001,8
  1479.         t4 0b00000001,7
  1480.         t4 0b00000001,7
  1481.         t4 0b00000001,7
  1482.         t4 0b00000001,7
  1483.         t4 0b00001000,0
  1484.         db -1
  1485.         dw -2-SMPLINE ;loop to line with hole
  1486. szsmp_tone=$-wassmp_tone
  1487.  
  1488. ;A0gO123
  1489.  
  1490. ;bass, pad и tone имеют параметры:
  1491. ;сэмпл
  1492. ;громкость
  1493. ;смещение в сэмпле
  1494.  ;канал [рабочая октава не нужна, она в сэмпле]
  1495.  ;приоритет
  1496.  
  1497. ;drum имеет параметры:
  1498. ;
  1499. ;громкость
  1500. ;[смещение в сэмпле не нужно?]
  1501.  ;канал [рабочая октава]
  1502.  ;приоритет
  1503.  
  1504. ;фильтр имеет параметры:
  1505. ;тип фильтра (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)
  1506. ;для вибрато и глисса: скорость изменения
  1507. ;для вибрато: глубина (0=бесконечность, т.е. gliss)
  1508. ;для вибрато: период
  1509.  
  1510. ;0,0,0,0,1,0,0,0,0,-1
  1511. ;0,0,0,1,1,0,0,0,-1,-1
  1512.  
  1513. tnotekeys
  1514.         db "MJNHBGVCDXSZ"
  1515.         db "mjnhbgvcdxsz"
  1516.         db ssM,ssJ,ssN,ssH,ssB,ssG,ssV,ssC,ssD,ssX,ssS,ssZ
  1517.         align 256
  1518. wasfrq
  1519.         incbin "tb_st.bin"
  1520.  
  1521.         ds 0x8000-$
  1522. tfrq
  1523.         ds 512
  1524.         include "mem.asm"
  1525.         include "play.asm"
  1526.         include "mix.asm"
  1527.  
  1528. ttypes
  1529.         if OLDTTYPES
  1530.         db "ORDER ",13
  1531.         db "drum *",13
  1532.         db "tone *",13
  1533.         db "vib 1*",13
  1534.         db "pad  *",13
  1535.         db "vol   ",13
  1536.          ;db "vol   ",13
  1537.         db "drum *",13
  1538.         db "tone *",13
  1539.         db "vol   ",13
  1540.         db "bass *",13
  1541.         db "drum *",13
  1542.         db "tone *",13
  1543.         db "pad  *",13
  1544.         db "vol   "
  1545.         db 0
  1546.  
  1547.         else
  1548. ;A0gOS2v*
  1549.         db  0, 0,_O, 0, 0, 0, 0, 0;"  O     "
  1550.         db _A,_5,_d,_O, 0, 0,_f, 0;"A5dO  f "
  1551.         db _A,_2,_t,_O,_t, 0,_f, 0;"A2tOt f "
  1552.         db  0, 0,_V,_O,_3,_1,_1, 0;"  VO311 "
  1553.         db _D,_0,_t,_O,_p, 0,_f, 0;"D0tOp1f "
  1554.         db  0, 0,_g, 0, 0, 0, 0, 0;"  g     "
  1555.         db _B,_5,_d,_O, 0, 0,_f, 0;"B5dO  f "
  1556.         db _B,_2,_t,_O,_t, 0,_f, 0;"B2tOt f "
  1557.         db  0, 0,_g, 0, 0, 0, 0, 0;"  g     "
  1558.         db _B,_0,_t,_O,_b, 0,_f, 0;"B0tOb f "
  1559.         db _C,_5,_d,_O, 0, 0,_f, 0;"C5dO  f "
  1560.         db _C,_5,_t,_O,_t, 0,_f, 0;"C2tOt f "
  1561.         db _C,_0,_t,_O,_p, 0,_f, 0;"C0tOp1f "
  1562.         db  0, 0,_g, 0, 0, 0, 0, 0;"  g     "
  1563.         ds ttypes+(MAXNTRACKS*8)-$
  1564. ttypes_end
  1565.         endif
  1566.  
  1567. ;смотрим тип текущего канала
  1568. gettracktype
  1569.         push de
  1570.         ld l,a
  1571.         ld h,0
  1572.         add hl,hl
  1573.         add hl,hl
  1574.         add hl,hl
  1575.         ld de,ttypes+2
  1576.         add hl,de
  1577.         ld a,(hl)
  1578.         pop de
  1579.         ret
  1580.  
  1581. gettrackorder
  1582.         push de
  1583.         ld l,a
  1584.         ld h,0
  1585.         add hl,hl
  1586.         add hl,hl
  1587.         add hl,hl
  1588.         ld de,ttypes+3
  1589.         add hl,de
  1590.         ld a,(hl)
  1591.         pop de
  1592.         ret
  1593.  
  1594. tracks
  1595. chns=tracks+2
  1596.         CHNTYPE 0x80+CHNTYPE_ORDER  ,0;,0;-1
  1597.         CHNTYPE 0x80+CHNTYPE_SAMPLES,1;,0;Adrum
  1598.         CHNTYPE 0x80+CHNTYPE_NOTES  ,1;,0;Atone
  1599.         CHNTYPE 0x80+CHNTYPE_FILTER ,1;,0;Filter_Avib
  1600.         CHNTYPE 0x80+CHNTYPE_NOTES  ,1;,0;Apad
  1601.         CHNTYPE 0x80+CHNTYPE_FILTER ,0;,0;Filter_Avol
  1602.          ;CHNTYPE 0x80+CHNTYPE_FILTER ,0,0;Filter_Bvol
  1603.         CHNTYPE 0x80+CHNTYPE_SAMPLES,1;,0;Bdrum
  1604.         CHNTYPE 0x80+CHNTYPE_NOTES  ,1;,0;Btone
  1605.         CHNTYPE 0x80+CHNTYPE_FILTER ,0;,0;Filter_Bvol
  1606.         CHNTYPE 0x80+CHNTYPE_NOTES  ,1;,0;Bbass
  1607.         CHNTYPE 0x80+CHNTYPE_SAMPLES,1;,0;Cdrum
  1608.         CHNTYPE 0x80+CHNTYPE_NOTES  ,1;,0;Ctone
  1609.         CHNTYPE 0x80+CHNTYPE_NOTES  ,1;,0;Cpad
  1610.         CHNTYPE 0x80+CHNTYPE_FILTER ,0;,0;Filter_Cvol
  1611.          ;CHNTYPE 0x80+CHNTYPE_FILTER ,0;,0;Filter_Cvol
  1612.         ds tracks+(chnsstep*MAXNTRACKS)-$,-1
  1613. tracks_end
  1614.         ;db -1
  1615.  
  1616. emptychn
  1617.         chn
  1618.  
  1619. chip0
  1620.         chip
  1621. chip1
  1622.         chip
  1623.  
  1624.  
  1625. lefttime
  1626.         dw 0
  1627. playtime
  1628.         dw 0
  1629. curtime
  1630.         dw 0
  1631. curtrack
  1632.         db 0
  1633. toptrack
  1634.         db 0
  1635. ntracks
  1636.         db 14 ;числотреков N
  1637.  
  1638.         align 4
  1639. freemem_start
  1640. cmd_end
  1641.  
  1642.  
  1643.         display "Size ",/d,cmd_end-cmd_begin," bytes"
  1644.  
  1645.         savebin "untr.com",cmd_begin,cmd_end-cmd_begin
  1646.  
  1647.         LABELSLIST "../../us/user.l",1
  1648.