?login_element?

Subversion Repositories NedoOS

Rev

Rev 746 | Blame | Compare with Previous | Last modification | View Log | Download

  1. untr_save
  2.         ld a,(ntracks)
  3.         ld (save_ntracks),a
  4.         ld de,tfilename
  5.         OS_CREATEHANDLE
  6.         ld a,b
  7.         ld (curhandle),a
  8.        
  9.         ld hl,tsongname
  10.         push hl
  11.         xor a
  12.         ld b,-1
  13.         cpir ;hl=after song name
  14.         cpir ;hl=after author name
  15.         pop de
  16.         or a
  17.         sbc hl,de
  18.         ld de,szheader
  19.         add hl,de
  20.         ld (theader_size),hl
  21.         ld de,theader
  22.         call save_hlbytes_fromde
  23.        
  24.         call setpgsamples
  25.         call savesamples
  26.         call setpgroots
  27.         call savefragments ;includes track info
  28.         call savetracks
  29. untr_saveclose
  30. curhandle=$+1
  31.         ld b,0
  32.         OS_CLOSEHANDLE
  33.        
  34.         ret
  35.  
  36. untr_load
  37.         ld de,tfilename
  38.         OS_OPENHANDLE
  39.         ld a,b
  40.         ld (curhandle),a
  41.        
  42.         call cleartracks ;удалить все данные треков из динамической памяти
  43.  
  44.         ld de,theader
  45.         ld hl,szheaderstart
  46.         call load_hlbytes_fromde
  47.         ld hl,(theader_size)
  48.         ld de,-szheaderstart
  49.         add hl,de
  50.         ld de,theaderpart2
  51.         call load_hlbytes_fromde
  52.        
  53.         call setpgsamples
  54.         call loadsamples
  55.         call setpgroots
  56.         call loadfragments ;includes track info
  57.         call loadtracks
  58.  
  59.         ld a,(save_ntracks)
  60.         ld (ntracks),a
  61.         call setneedpralltracks
  62.         call setneedprtypes
  63.         jr untr_saveclose
  64.  
  65. loadsamples
  66.         ld hy,0
  67. loadsamples0
  68.         ld de,save_sampleheader
  69.         ld hl,sz_sampleheader
  70.         call load_hlbytes_fromde
  71.         ;db длина в строчках
  72.         ;db длина зацикливания
  73.         ;dw 0 ;reserved
  74.         ;строчки по 8 байт (для возможности расширения)
  75.         ld a,hy
  76.         add a,0x40
  77.         ld h,a
  78.         ld l,0 ;hl=sample address
  79.         ld de,(save_sampleheader)
  80.        push de ;e=length, d=loopsize
  81.        push hl ;hl=sample address
  82. loadsamplelines0
  83.        push de
  84.        push hl
  85.         ld de,save_sampleline
  86.         ld hl,sz_sampleline
  87.         push de
  88.         call load_hlbytes_fromde
  89.         pop hl
  90.        pop de
  91.         ld bc,7
  92.         ldir
  93.         ex de,hl
  94.        pop de
  95.         dec e
  96.         jr nz,loadsamplelines0
  97.        pop bc ;bc=sample address
  98.        pop de ;e=length, d=loopsize
  99. ;add loop:
  100.         push hl
  101.         xor a
  102.         sub d
  103.         ld l,a
  104.         ld h,-1
  105.         ld d,h
  106.         ld e,l
  107.         add hl,hl
  108.         add hl,hl
  109.         add hl,hl
  110.         or a
  111.         sbc hl,de ;-(loopsize*7)
  112.         ex de,hl
  113.         dec de
  114.         dec de ;-(loopsize*7)-2
  115.         pop hl
  116.         ld (hl),-1
  117.         inc hl
  118.         ld (hl),e
  119.         inc hl
  120.         ld (hl),d
  121.         inc hy
  122.         ld a,(nsamples)
  123.         cp hy
  124.         jr nz,loadsamples0
  125.         ret
  126.  
  127. loadfragments
  128. ;пока только один фрагмент
  129.         ld de,save_fragmentheader
  130.         ld hl,sz_fragmentheader
  131.         call load_hlbytes_fromde ;там длина фрагмента
  132.  
  133.         ld de,ttypes
  134.         ld hy,0 ;track
  135. loadtracktypes0
  136.         push de
  137.         ld de,save_tracktype
  138.         ld hl,sz_tracktype
  139.         push de
  140.         call load_hlbytes_fromde
  141.         pop hl
  142.         pop de
  143.         ld bc,8
  144.         ldir
  145.         inc hy
  146.         ld a,(save_ntracks)
  147.         cp hy
  148.         jr nz,loadtracktypes0
  149.         ret
  150.        
  151. loadtracks
  152.         ld hy,0 ;track
  153. loadtracks0
  154.         ld ly,0 ;part
  155. loadtrackparts0
  156. ;ly=part
  157.         ld de,save_trackheader
  158.         ld hl,sz_trackheader
  159.         call load_hlbytes_fromde
  160.         ld bc,(save_trackheader)
  161.         ld hl,0
  162. loadtrackbytes0
  163.         push bc
  164. ;hl=index
  165. ;ly=part
  166.         push hl
  167.         ld de,save_byte
  168.         ld hl,1
  169.         call load_hlbytes_fromde
  170.         pop hl
  171.         ld a,(save_byte)
  172.         ld c,a
  173.         ld a,hy ;a=track
  174.         call poketrackpartindex_c
  175.         pop bc
  176.         cpi
  177.         jp pe,loadtrackbytes0
  178.         inc ly
  179.         ld a,(nparts)
  180.         cp ly
  181.         jr nz,loadtrackparts0
  182.         inc hy
  183.         ld a,(save_ntracks)
  184.         cp hy
  185.         jr nz,loadtracks0
  186.         ret
  187.  
  188. savesamples
  189.         ld hy,0
  190. savesamples0
  191.         ;ld hl,tsamples+2
  192.         ;ld e,hy
  193.         ;ld d,0
  194.         ;add hl,de
  195.         ;add hl,de
  196.         ;ld a,(hl)
  197.         ;inc hl
  198.         ;ld h,(hl)
  199.         ;ld l,a ;hl=sample address
  200.         ld a,hy
  201.         add a,0x40
  202.         ld h,a
  203.         ld l,0 ;hl=sample address
  204.        push hl
  205.         ;db длина в строчках
  206.         ;db длина зацикливания
  207.         ;dw 0 ;reserved
  208.         ;строчки по 8 байт (для возможности расширения)
  209. ;find sample length and loop line
  210.         call findsamplelengthandloop ;out: e=length, d=loopsize
  211.        push de
  212.         ld (save_sampleheader),de
  213.         ld de,save_sampleheader
  214.         ld hl,sz_sampleheader
  215.         call save_hlbytes_fromde
  216.        pop de ;e=length
  217.        pop hl
  218. savesamplelines0
  219.        push de
  220.         ld de,save_sampleline
  221.         push de
  222.         ld bc,7
  223.         ldir
  224.         pop de
  225.        push hl
  226.         ld hl,sz_sampleline
  227.         call save_hlbytes_fromde
  228.        pop hl
  229.        pop de
  230.         dec e
  231.         jr nz,savesamplelines0        
  232.         inc hy
  233.         ld a,(nsamples)
  234.         cp hy
  235.         jr nz,savesamples0
  236.         ret
  237.  
  238. savefragments
  239. ;пока только один фрагмент
  240.         ld hl,(songlength)
  241.         ld (save_fragmentheader),hl
  242.         ld de,save_fragmentheader
  243.         ld hl,sz_fragmentheader
  244.         call save_hlbytes_fromde
  245.  
  246.         ld hl,ttypes
  247.         ld hy,0 ;track
  248. savetracktypes0
  249.         ld de,save_tracktype
  250.         push de
  251.         ld bc,8
  252.         ldir
  253.         pop de
  254.        push hl
  255.         ld hl,sz_tracktype
  256.         call save_hlbytes_fromde
  257.        pop hl
  258.         inc hy
  259.         ld a,(save_ntracks)
  260.         cp hy
  261.         jr nz,savetracktypes0
  262.  
  263.         ret
  264.  
  265. savetracks
  266.         ld hy,0 ;track
  267. savetracks0
  268.         ld ly,0 ;part
  269. savetrackparts0
  270. ;ly=part
  271.         ld a,hy ;a=track
  272.         call getendaddr ;de=end or 0
  273.         inc de
  274.         ld (save_trackheader),de
  275.        push de
  276.         ld de,save_trackheader
  277.         ld hl,sz_trackheader
  278.         call save_hlbytes_fromde
  279.        pop bc
  280.         ld hl,0
  281. savetrackbytes0
  282.         push bc
  283. ;hl=index
  284. ;ly=part
  285.         ld a,hy ;a=track
  286.         call peektrackpartindex
  287.         push hl
  288.         ld de,save_byte
  289.         ld (de),a
  290.         ld hl,1
  291.         call save_hlbytes_fromde
  292.         pop hl
  293.         pop bc
  294.         cpi
  295.         jp pe,savetrackbytes0
  296.         inc ly
  297.         ld a,(nparts)
  298.         cp ly
  299.         jr nz,savetrackparts0
  300.        
  301.         inc hy
  302.         ld a,(save_ntracks)
  303.         cp hy
  304.         jr nz,savetracks0
  305.         ret
  306.  
  307. save_hlbytes_fromde
  308.         push ix
  309.         push iy
  310.         ld a,(curhandle)
  311.         ld b,a
  312.         OS_WRITEHANDLE
  313.         pop iy
  314.         pop ix
  315.         ret
  316.  
  317. load_hlbytes_fromde
  318.         push ix
  319.         push iy
  320.         ld a,(curhandle)
  321.         ld b,a
  322.         OS_READHANDLE
  323.         pop iy
  324.         pop ix
  325.         ret
  326.  
  327. cleartracks
  328.         ld hy,0 ;track
  329. cleartracks0
  330.         ld ly,0 ;part
  331. cleartrackparts0
  332. ;ly=part
  333.         ld a,hy ;a=track
  334.         call getendaddr ;de=end or 0
  335.         ex de,hl
  336. cleartrackbytes0
  337. ;hl=index
  338. ;ly=part
  339.         ld a,hy ;a=track
  340.         ld c,0
  341.         call poketrackpartindex_c
  342.         ld a,h
  343.         or l
  344.         dec hl
  345.         jr nz,cleartrackbytes0
  346.         inc ly
  347.         ld a,64;(nparts)
  348.         cp ly
  349.         jr nz,cleartrackparts0
  350.         inc hy
  351.         ld a,(save_ntracks)
  352.         cp hy
  353.         jr nz,cleartracks0
  354.         ret
  355.  
  356. save_byte
  357.         db 0
  358.  
  359. save_sampleheader
  360.         dw 0
  361.         dw 0 ;reserved
  362.         db 0 ;sample name
  363. sz_sampleheader=$-save_sampleheader
  364.  
  365. save_fragmentheader
  366.         dw 0
  367.         db 0 ;fragment name
  368. sz_fragmentheader=$-save_fragmentheader
  369.  
  370. save_sampleline
  371.         ds 8
  372. sz_sampleline=$-save_sampleline
  373.  
  374. save_tracktype
  375.         ds 8
  376.         db 0 ;track name
  377. sz_tracktype=$-save_tracktype
  378.  
  379. save_trackheader
  380.         dw 0 ;length=1..65536
  381. sz_trackheader=$-save_trackheader
  382.  
  383. theader
  384.         db "untr"
  385.         db 0 ;ver
  386.         db 0 ;subver
  387.  
  388. theader_size
  389.         dw 0 ;смещение до сэмплов от начала файла
  390. szheaderstart=$-theader
  391.  
  392. theaderpart2
  393. songlength
  394.         dw 65536&0xffff ;length =1..65536
  395. songloop
  396.         dw 0 ;loop
  397.  
  398. nsamples
  399.         db 64 ;числосэмплов (сейчас =64)
  400. nfragments
  401.         db 1 ;числофрагментов F
  402. save_ntracks
  403.         db 14 ;числотреков N
  404. nparts
  405.         db 64 ;числочастей (сейчас =64)
  406. szheaderpart2=$-theaderpart2
  407. szheader=$-theader
  408.  
  409. tsongname
  410.         db "song name"
  411.         db 0
  412.         db "author"
  413.         db 0
  414.         ds tsongname+((MAXSONGNAME+1)*2)-$
  415.  
  416. tfilename
  417.         db "untr/muz.unt",0
  418.         ds tfilename+DIRMAXFILENAME64-$
  419.