Subversion Repositories tsfmpro

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

  1. ;--------------------------------------------------------------------
  2. ; Описание: Программа проигрывания модулей E-Tracker
  3. ; поддержка в железе: ZXM-SoundCard
  4. ; Автор порта: Тарасов М.Н.(Mick),2010
  5. ;--------------------------------------------------------------------
  6.                 DEVICE ZXSPECTRUM128
  7.  
  8.                 .org    6000h
  9.  
  10. ;-------------------------------------------------------------------
  11. ; описание: Точка входа в программу после передачи управления из ОС
  12. ;---------------------------------------------------------------------
  13. ETunes_Start:          
  14.                 xor     a                               ;бордер в черный цвет
  15.                 out     (0feh),a       
  16.  
  17.                 ld      hl,4000h
  18.                 ld      de,4001h
  19.                 ld      bc,1b00h
  20.                 ld      (hl),c
  21.                 ldir
  22.                
  23.                 ld      hl,4000h                        ;грузим экран
  24.                 ld      de,(5CF4h)
  25.                 ld      bc,1B05h
  26.                 call    3d13h
  27.                 ld      a,10h                           ;установим начальную страницу памяти
  28.                 ld      bc,7ffdh
  29.                 out     (c),a
  30.                 ld      hl,0D000h                       ;грузим анализатор
  31.                 ld      de,(5CF4h)
  32.                 ld      bc,0905h
  33.                 call    3d13h
  34.                 ld      hl,0E000h                       ;грузим данные анализатора
  35.                 ld      de,(5CF4h)
  36.                 ld      bc,1305h
  37.                 call    3d13h
  38.                 call    Str_init_load
  39.                 ei
  40. ETunes_loading:
  41.                 halt
  42.                 call    Str_play
  43.                 jr      c,ETunes_load
  44.                 call    Str_update_symbol
  45.                 jr      nc,ETunes_loading      
  46. ETunes_load:
  47.                 di                                      ;на всякий пожарный запретим прерывания
  48.                 ld      de,(5CF4h)
  49.                 ld (sect_pack0),de
  50.                 call load_packs_0
  51.                 ld      de,(5CF4h)
  52.                 ld (sect_pack1),de
  53.  
  54.                 ; xor   a
  55.                 ; ld    bc,1ffdh
  56.                 ; out   (c),a
  57.                
  58.                 ld      a,10h
  59.                 ld      bc,0x7ffd
  60.                 out     (c),a
  61.  
  62.                 ld      sp,5fffh
  63.                 call    Str_init                        ;инициализация бегущей строки
  64.                 call    Attribute_init                 
  65.                 call    Analyzer_init                  
  66.                 ld      a,1
  67.                 ld      (ETunes_number_music),a
  68.                 call    ETunes_view_number
  69.                 xor     a
  70.                 ld      (ETunes_count_music),a          ;счетчик номера музыки
  71.                 call    ETunes_copy_music
  72.                 ld      bc,0FFFDh                       ;разрешим работу SAA1099
  73.                 ld      a,0f6h
  74.                 out     (c),a
  75.                 call    ESIPlayer_Init                  ;инициализация проигрывающего модуля
  76.                 ld      hl,0fe00h                       ;создаем таблицу прерывания для im 2
  77.                 ld      de,0fe01h
  78.                 ld      bc,0100h
  79.                 ld      (hl),0fdh
  80.                 ldir
  81.                 ld      a,0c3h                          ;установим вектор прерывания
  82.                 ld      (0fdfdh),a
  83.                 ld      hl,Interrupt_handle
  84.                 ld      (0fdfeh),hl
  85.                 di
  86.                 ld      a,0feh                          ;окончание установки прерывания
  87.                 ld      i,a
  88.                 im      2
  89.                 ei
  90. ETunes_key:            
  91.                 xor     a
  92.                 ld      (ETunes_key_press),a
  93. ETunes_loop:           
  94.                 halt
  95.                 call    Str_play
  96.                 call    Str_update_symbol
  97.                 call    Attribute_update
  98.  
  99.                 ld      a,7fh                           ;ожидаем пробел - переход к следующей композиции
  100.                 in      a,(0feh)
  101.                 rra    
  102.                 jr      c,ETunes_key
  103.  
  104.                 ld      a,0FEh
  105.                 in      a,(0FEh)
  106.                 rra        
  107.                 jr      nc,ETunes_exit
  108.  
  109.                 ld      a,(ETunes_key_press)
  110.                 and     a
  111.                 jr      nz,ETunes_loop
  112.  
  113.                 di     
  114.                 inc     a
  115.                 ld      (ETunes_key_press),a
  116.        
  117.                 call    ESIPlayer_Init                  ;глушим работу проигрывающего модуля
  118.                 ld      bc,0FFFDh                       ;запрещаем работу SAA1099
  119.                 ld      a,0feh
  120.                 out     (c),a
  121.                 ld      a,(ETunes_count_music)
  122.                 inc     a
  123.                 cp      26
  124.                 jr      c,ETunes_next_music
  125.                 xor     a
  126.  
  127. ETunes_next_music:
  128.                 ld      (ETunes_count_music),a
  129.                 im 1
  130.                 call    ETunes_copy_music
  131.                 im 2
  132.                 ld      bc,0FFFDh                       ;разрешим работу SAA1099
  133.                 ld      a,0f6h
  134.                 out     (c),a
  135.                 call    ESIPlayer_Init                  ;инициализируем проигрыватель
  136.  
  137.                 ld      a,(ETunes_number_music)
  138.                 inc     a
  139.                 ld      c,a
  140.                 and     0Fh
  141.                 cp      10
  142.                 jr      c,ETunes_number_correct
  143.                 ld      a,6
  144.                 add     c
  145.                 ld      c,a
  146.  
  147. ETunes_number_correct:
  148.                 ld      a,c
  149.                 ld      (ETunes_number_music),a
  150.                 cp      27h
  151.                 jr      c,ETunes_number_valid
  152.                 ld      a,1
  153.  
  154. ETunes_number_valid:
  155.                 ld      (ETunes_number_music),a
  156.                 call    ETunes_view_number
  157.  
  158.                 ei
  159.                 jp      ETunes_loop
  160.  
  161. ETunes_exit:           
  162.                 di     
  163.                 call    ESIPlayer_Init                  ;глушим работу проигрывающего модуля
  164.                 ld      bc,0FFFDh                       ;запрещаем работу SAA1099
  165.                 ld      a,0feh
  166.                 out     (c),a
  167.                 ld      hl,0   
  168.                 push    hl
  169.                 jp      3d2fh                           ;выход в TR-DOS
  170.                 display $
  171. ETunes_copy_music:
  172.                 ld      l,a
  173.                 ld      h,0
  174.                 add     hl,hl
  175.                 ld      d,h
  176.                 ld      e,l
  177.                 add     hl,hl
  178.                 add     hl,de
  179.                 ld      de,ETunes_tabl_music
  180.                 add     hl,de
  181.                 push hl
  182.                 ld      a,(hl)                          ;номер страницы памяти
  183.                 and 0x80
  184. curr_packs=$+1
  185.                 cp 0x00
  186.                 jr z,ETunes_copy_0
  187.                 ld (curr_packs),a
  188.                 or a
  189.                 jr nz,is_pack1
  190.                 call load_packs_0
  191.                 jr ETunes_copy_0
  192. is_pack1
  193.                 call load_packs_1
  194. ETunes_copy_0:
  195.                 pop hl
  196.                 ld      a,(hl)                          ;номер страницы памяти
  197.                 and 0x7f
  198.                 ld      bc,7ffdh
  199.                 out     (c),a
  200.                 inc     hl
  201.                 ld      c,(hl)                          ;признак что залезет в С000h
  202.                 inc     hl
  203.                 ld      e,(hl)                          ;адрес где модуль                          
  204.                 inc     hl
  205.                 ld      d,(hl)
  206.                 inc     hl
  207.                 ld      a,(hl)                          ;адрес куда копировать                          
  208.                 inc     hl
  209.                 ld      h,(hl)
  210.                 ld      l,a
  211.                 ex      hl,de
  212.                 push    de
  213.                 ld      e,(hl)
  214.                 inc     hl
  215.                 ld      d,(hl)
  216.                 inc     hl
  217.                 ex      hl,de
  218.                 ld      (ESIPlayer_Init+1),hl            ;адрес музыкального произведения
  219.                 ex      hl,de
  220.                 ld      e,(hl)
  221.                 inc     hl
  222.                 ld      d,(hl)
  223.                 inc     hl
  224.                 ex      hl,de
  225.                 ld      (ESIPlayer_InitS+1),hl          ;адрес музыкального произведения
  226.                 ex      hl,de
  227.                 ld      a,c                             ;флаг копирования
  228.                 ld      c,(hl)                          ;размер файла
  229.                 inc     hl
  230.                 ld      b,(hl)
  231.                 inc     hl
  232.                 pop     de
  233.                 and     a
  234.                 jr      z,ETunes_copy_1
  235.                 ld      a,d
  236.                 cp      0C0h                            ;копируем в область C000h
  237.                 jr      nc,ETunes_copy_2
  238. ETunes_copy_3:
  239.                 ldi
  240.                 ld      a,d
  241.                 cp      0C0h
  242.                 jr      c,ETunes_copy_3
  243. ETunes_copy_2:
  244.                 push    de
  245.                 push    bc
  246.                 ld      de,8000h
  247.                 ldir
  248. ;               xor     a
  249. ;               ld      bc,1ffdh
  250. ;               out     (c),a
  251.                 ld      a,10h
  252.                 ld      bc,7ffdh
  253.                 out     (c),a
  254.                 pop     bc
  255.                 pop     de
  256.                 ld      hl,8000h
  257.                 ldir
  258.                 ret
  259.                
  260. ETunes_copy_1:
  261.                 ldir
  262. ;               xor     a
  263. ;               ld      bc,1ffdh
  264. ;               out     (c),a
  265.                 ld      a,10h
  266.                 ld      bc,7ffdh
  267.                 out     (c),a
  268.                 ret
  269.  
  270.  
  271. ETunes_view_number:
  272.                 ld      c,a
  273.                 and     0F0h
  274.                 rrca
  275.                 rrca
  276.                 rrca
  277.                 rrca
  278.                 ld      hl,55DDh
  279.                 call    ETunes_view_symbol
  280.                 ld      a,c
  281.                 and     0Fh
  282.                 ld      hl,55DEh
  283.  
  284. ETunes_view_symbol:
  285.                 push    hl
  286.                 ld      h,0
  287.                 ld      l,a
  288.                 add     hl,hl
  289.                 add     hl,hl
  290.                 add     hl,hl
  291.                 ld      de,ETunes_table_symbol
  292.                 add     hl,de  
  293.                 ex      de,hl
  294.                 pop     hl
  295.                 ld      b,8
  296.  
  297. ETunes_view_loop:
  298.                 ld      a,(de)
  299.                 ld      (hl),a
  300.                 inc     de             
  301.                 inc     h
  302.                 ld      a,h
  303.                 and     7
  304.                 jr      nz,ETunes_next_line
  305.                 ld      a, l
  306.                 add     a,20h
  307.                 ld      l, a
  308.                 jr      c,ETunes_next_line
  309.                 ld      a,h
  310.                 sub     8
  311.                 ld      h,a
  312. ETunes_next_line:      
  313.                 djnz    ETunes_view_loop
  314.                 ret    
  315.  
  316. load_packs_0
  317.                 ld      a,11h                           ;установим начальную страницу памяти
  318.                 ld      bc,7ffdh
  319.                 out     (c),a
  320.                 ld      hl,0C000h                       ;грузим музыкальный пак 1.
  321.                 ld      de,0x0000
  322. sect_pack0=$-2
  323.                 ld      bc,3A05h
  324.                 call    3d13h
  325.  
  326.                 ld      a,13h
  327.                 ld      bc,7ffdh
  328.                 out     (c),a
  329.                 ld      hl,0C000h                       ;грузим музыкальный пак 2.
  330.                 ld      de,(5CF4h)
  331.                 ld      bc,3F05h
  332.                 call    3d13h
  333.  
  334.                 ld      a,14h
  335.                 ld      bc,7ffdh
  336.                 out     (c),a
  337.                 ld      hl,0C000h                       ;грузим музыкальный пак 3.
  338.                 ld      de,(5CF4h)
  339.                 ld      bc,3905h
  340.                 call    3d13h
  341.  
  342.                 ld      a,16h
  343.                 ld      bc,7ffdh
  344.                 out     (c),a
  345.                 ld      hl,0C000h                       ;грузим музыкальный пак 4.
  346.                 ld      de,(5CF4h)
  347.                 ld      bc,3B05h
  348.                 call    3d13h
  349.  
  350.                 ld      a,17h
  351.                 ld      bc,7ffdh
  352.                 out     (c),a
  353.                 ld      hl,0C000h                       ;грузим музыкальный пак 5.
  354.                 ld      de,(5CF4h)
  355.                 ld      bc,3505h
  356.                 call    3d13h
  357.                 ret
  358.                
  359. load_packs_1
  360.                 ld      a,11h
  361.                 ld      bc,7ffdh
  362.                 out     (c),a
  363.                 ld      hl,0C000h                       ;грузим музыкальный пак 6.
  364.                 ld      de,0x0000
  365. sect_pack1=$-2
  366.                 ld      bc,2A05h
  367.                 call    3d13h
  368.  
  369.                 ld      a,13h
  370.                 ld      bc,7ffdh
  371.                 out     (c),a
  372.                 ld      hl,0C000h                       ;грузим музыкальный пак 7.
  373.                 ld      de,(5CF4h)
  374.                 ld      bc,2205h
  375.                 call    3d13h
  376.  
  377.                 ld      a,14h
  378.                 ld      bc,7ffdh
  379.                 out     (c),a
  380.                 ld      hl,0C000h                       ;грузим музыкальный пак 8.
  381.                 ld      de,(5CF4h)
  382.                 ld      bc,3B05h
  383.                 call    3d13h
  384.  
  385.                 ld      a,16h
  386.                 ld      bc,7ffdh
  387.                 out     (c),a
  388.                 ld      hl,0C000h                       ;грузим музыкальный пак 9.
  389.                 ld      de,(5CF4h)
  390.                 ld      bc,3205h
  391.                 call    3d13h
  392.                 ret
  393.  
  394. ETunes_tabl_music:
  395.                 db      11h                             ; 1 музыкальное произведение
  396.                 db      0
  397.                 dw      0C000h
  398.                 dw      8567h
  399.                 db      11h                             ; 2 музыкальное произведение
  400.                 db      0
  401.                 dw      0DC10h
  402.                 dw      8567h
  403.  
  404.                 db      13h                             ; 3 музыкальное произведение
  405.                 db      0
  406.                 dw      0C000h
  407.                 dw      8567h
  408.                 db      13h                             ; 4 музыкальное произведение
  409.                 db      0
  410.                 dw      0D210h
  411.                 dw      8567h
  412.  
  413.                 db      14h                             ; 5 музыкальное произведение
  414.                 db      0
  415.                 dw      0C000h
  416.                 dw      8567h
  417.                 db      14h                             ; 6 музыкальное произведение
  418.                 db      0
  419.                 dw      0D7F0h
  420.                 dw      8567h
  421.  
  422.                 db      16h                             ; 7 музыкальное произведение
  423.                 db      0
  424.                 dw      0C000h
  425.                 dw      8567h
  426.                 db      16h                             ; 8 музыкальное произведение
  427.                 db      0
  428.                 dw      0D200h
  429.                 dw      8567h
  430.                 db      16h                             ; 9 музыкальное произведение
  431.                 db      0
  432.                 dw      0D9D0h
  433.                 dw      8567h
  434.                 db      16h                             ; 10 музыкальное произведение
  435.                 db      0
  436.                 dw      0EAC0h
  437.                 dw      85A8h
  438.                 db      16h                             ; 11 музыкальное произведение
  439.                 db      0
  440.                 dw      0EE40h
  441.                 dw      891Ch
  442.                 db      16h                             ; 12 музыкальное произведение
  443.                 db      0
  444.                 dw      0F450h
  445.                 dw      8F20h
  446.                 db      16h                             ; 13 музыкальное произведение
  447.                 db      1
  448.                 dw      0F760h
  449.                 dw      0C220h
  450.  
  451.                 db      17h                             ; 14 музыкальное произведение
  452.                 db      0
  453.                 dw      0C000h
  454.                 dw      8590h
  455.                 db      17h                             ; 15 музыкальное произведение
  456.                 db      0
  457.                 dw      0D0A0h
  458.                 dw      9628h
  459.                 db      17h                             ; 16 музыкальное произведение
  460.                 db      0
  461.                 dw      0DEC0h
  462.                 dw      921Ch
  463.                 db      17h                             ; 17 музыкальное произведение
  464.                 db      0
  465.                 dw      0E5D0h
  466.                 dw      991Ch
  467.  
  468.                 db      91h                             ; 18 музыкальное произведение
  469.                 db      0
  470.                 dw      0C000h
  471.                 dw      0A820h
  472.                 db      91h                             ; 19 музыкальное произведение
  473.                 db      1
  474.                 dw      0CD10h
  475.                 dw      0B524h
  476.                 db      91h                             ; 20 музыкальное произведение
  477.                 db      0
  478.                 dw      0DA20h
  479.                 dw      8598h
  480.                 db      91h                             ; 21 музыкальное произведение
  481.                 db      0
  482.                 dw      0E5C0h
  483.                 dw      9128h
  484.  
  485.                 db      93h                             ; 22 музыкальное произведение
  486.                 db      0
  487.                 dw      0C000h
  488.                 dw      951Ch
  489.                 db      93h                             ; 23 музыкальное произведение
  490.                 db      0
  491.                 dw      0D660h
  492.                 dw      0AB6Ch
  493.  
  494.                 db      94h                             ; 24 музыкальное произведение
  495.                 db      0
  496.                 dw      0C000h
  497.                 dw      85ACh
  498.                 db      94h                             ; 25 музыкальное произведение
  499.                 db      0
  500.                 dw      0EAB0h
  501.                 dw      8567h
  502.  
  503.                 db      96h                             ; 26 музыкальное произведение
  504.                 db      0
  505.                 dw      0C000h
  506.                 dw      8567h
  507.  
  508.  
  509. ETunes_table_symbol:
  510.                 db      0,3Ch,66h,6Eh,76h,66h,3Ch,0
  511.                 db      0,18h,38h,18h,18h,18h,7Eh,0
  512.                 db      0,3Ch,66h,0Ch,18h,30h,7Eh,0
  513.                 db      0,7Eh,0Ch,18h,0Ch,66h,3Ch,0
  514.                 db      0,0Ch,1Ch,3Ch,6Ch,7Eh,0Ch,0
  515.                 db      0,7Eh,60h,7Ch,06h,66h,3Ch,0
  516.                 db      0,3Ch,60h,7Ch,66h,66h,3Ch,0
  517.                 db      0,7Eh,06h,0Ch,18h,30h,30h,0
  518.                 db      0,3Ch,66h,3Ch,66h,66h,3Ch,0
  519.                 db      0,3Ch,66h,3Eh,06h,0Ch,38h,0
  520.  
  521.  
  522.  
  523. ETunes_count_music:
  524.                 db      0
  525. ETunes_number_music:
  526.                 db      0
  527. ETunes_key_press:
  528.                 db      0
  529. ETunes_phase:
  530.                 db      0
  531.  
  532. Interrupt_handle:
  533.                 push    hl     
  534.                 push    bc     
  535.                 push    de
  536.                 push    af     
  537.  
  538.                 call    Analyzer_clear
  539.                 call    Analyzer_update
  540.                 ld      a,(ETunes_count_music)
  541.                 cp      8
  542.                 jr      z,ETunes_analyzer_0
  543.                 cp      0Dh
  544.                 jr      z,ETunes_analyzer_1
  545.                 cp      0Eh
  546.                 jr      z,ETunes_analyzer_1
  547.                 cp      18h
  548.                 jr      z,ETunes_analyzer_0
  549.                 call    Analyzer_view_0
  550. ETunes_continue:
  551.                 call    Analyzer_draw_flash
  552.                 call    ESIPlayer_Play
  553.                 pop     af
  554.                 pop     de
  555.                 pop     bc
  556.                 pop     hl
  557.                 ei
  558.                 ret
  559.  
  560. ETunes_analyzer_0:
  561.                 call    Analyzer_view_1
  562.                 jr      ETunes_continue
  563.  
  564. ETunes_analyzer_1:
  565.                 call    Analyzer_view_2
  566.                 jr      ETunes_continue
  567.  
  568.                 .include  esplayer.asm
  569.                 .include  attribute.asm
  570.                 .include  string.asm
  571. Etunes_end:
  572.                 .savebin "etunes.bin",ETunes_Start, Etunes_end - ETunes_Start
  573.  
  574.                 .include  analyzer.asm
  575.  
  576.                 .savebin "erunea.bin",Analyzer_update, Analyzer_end - Analyzer_update
  577.                 .end
  578.  
  579.