home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 4: Demo 1 / almathera_demo1.bin / utils / rippers / sources / jamreplayer.s < prev    next >
Text File  |  1995-03-17  |  10KB  |  554 lines

  1. *
  2. * JamCracker V1.0 Replay routine, written by M. Gemmel
  3. *
  4. * Make sure you have read the ReadMe file on this disk too.
  5. *
  6. * This is not a demonstration source, showing how to write
  7. * a song-play routine.  This source is merely ment for
  8. * inclusion in other sources, or as assembly module for
  9. * linkage with other programs.
  10. *
  11. * This source was modified for the MasterSeka V1.53 assembler
  12. * and can be easily modified for other assemblers. (Not true, it's a lot of work - Arcade)
  13. * The song should be inserted at 'mysong' near the bottom of
  14. * this source, in chip memory.
  15. *
  16. *                  Modified for MasterSeka 1.53 by Arcade of CADCAM
  17. * Note from Arcade: I saved all of you who want to use the replayer
  18. * with MasterSeka a lot of work. So leave this text here, I want the credits.
  19.  
  20. * This is the correct calling procedure
  21. * Don't forget to save any important registers
  22. * because I don't care
  23.  
  24. Start    bsr.s    pp_init            ;First, initialize
  25.  
  26. here    bsr    pp_play            ;Then, play every 1/50 sec.
  27. hi    cmpi.b    #1,$dff006        ;wait for raster
  28.     bne.s    hi
  29.     btst    #6,$bfe001        ;Check left mouse button
  30.     bne.s    here
  31.     bsr    pp_end            ;Finally, stop playing
  32.  
  33.     rts
  34.  
  35. it_name        equ    0
  36. it_flags    equ    31
  37. it_size        equ    32
  38. it_address    equ    36
  39. it_sizeof    equ    40
  40.  
  41. pt_size        equ    0
  42. pt_address    equ    2
  43. pt_sizeof    equ    6
  44.  
  45. nt_period    equ    0
  46. nt_instr    equ    1
  47. nt_speed    equ    2
  48. nt_arpeggio    equ    3
  49. nt_vibrato    equ    4
  50. nt_phase    equ    5
  51. nt_volume    equ    6
  52. nt_porta    equ    7
  53. nt_sizeof    equ    8
  54.  
  55. pv_waveoffset    equ    0
  56. pv_dmacon    equ    2
  57. pv_custbase    equ    4
  58. pv_inslen    equ    8
  59. pv_insaddress    equ    10
  60. pv_peraddress    equ    14
  61. pv_pers        equ    18
  62. pv_por        equ    24
  63. pv_deltapor    equ    26
  64. pv_porlevel    equ    28
  65. pv_vib        equ    30
  66. pv_deltavib    equ    32
  67. pv_vol        equ    34
  68. pv_deltavol    equ    36
  69. pv_vollevel    equ    38
  70. pv_phase    equ    40
  71. pv_deltaphase    equ    42
  72. pv_vibcnt    equ    44
  73. pv_vibmax    equ    45
  74. pv_flags    equ    46
  75. pv_sizeof    equ    48
  76.  
  77. *** This is the actual replay routine
  78.  
  79. wavesize    equ    $40
  80.  
  81. pp_init    lea    mysong,a0
  82.     addq.w    #4,a0
  83.     move.w    (a0)+,d0
  84.     move.w    d0,d1
  85.     move.l    a0,instable
  86.     mulu    #it_sizeof,d0
  87.     adda.w    d0,a0
  88.  
  89.     move.w    (a0)+,d0
  90.     move.w    d0,d2
  91.     move.l    a0,patttable
  92.     mulu    #pt_sizeof,d0
  93.     adda.w    d0,a0
  94.  
  95.     move.w    (a0)+,d0
  96.     move.w    d0,songlen
  97.     move.l    a0,songtable
  98.     lsl.w    #1,d0
  99.     adda.w    d0,a0
  100.  
  101.     movea.l    patttable,a1
  102.     move.w    d2,d0
  103.     subq.w    #1,d0
  104. lab0    move.l    a0,pt_address(a1)
  105.     move.w    pt_size(a1),d3
  106.     mulu    #nt_sizeof*4,d3
  107.     adda.w    d3,a0
  108.     addq.w    #pt_sizeof,a1
  109.     dbf    d0,lab0
  110.  
  111.     movea.l    instable,a1
  112.     move.w    d1,d0
  113.     subq.w    #1,d0
  114. lab1    move.l    a0,it_address(a1)
  115.     move.l    it_size(a1),d2
  116.     adda.l    d2,a0
  117.     adda.w    #it_sizeof,a1
  118.     dbf    d0,lab1
  119.  
  120.  
  121.     move.l    songtable,pp_songptr
  122.     move.w    songlen,pp_songcnt
  123.     movea.l    pp_songptr,a0
  124.     move.w    (a0),d0
  125.     mulu    #pt_sizeof,d0
  126.     add.l    patttable,d0
  127.     movea.l    d0,a0
  128.     move.l    a0,pp_pattentry
  129.     move.b    pt_size+1(a0),pp_notecnt
  130.     move.l    pt_address(a0),pp_address
  131.     move.b    #6,pp_wait
  132.     move.b    #1,pp_waitcnt
  133.     clr.w    pp_nullwave
  134.     move.w    #$000f,$dff096
  135.  
  136.     lea    pp_variables,a0
  137.     lea    $dff0a0,a1
  138.     move.w    #$0001,d1
  139.     move.w    #2*wavesize,d2
  140.     move.w    #3,d0
  141. lab2    clr.w    8(a1)
  142.     move.w    d2,pv_waveoffset(a0)
  143.     move.w    d1,pv_dmacon(a0)
  144.     move.l    a1,pv_custbase(a0)
  145.     move.l    #pp_periods,pv_peraddress(a0)
  146.     move.w    #1019,pv_pers(a0)
  147.     clr.w    pv_pers+2(a0)
  148.     clr.w    pv_pers+4(a0)
  149.     clr.l    pv_por(a0)
  150.     clr.w    pv_porlevel(a0)
  151.     clr.l    pv_vib(a0)
  152.     clr.l    pv_vol(a0)
  153.     move.w    #$0040,pv_vollevel(a0)
  154.     clr.l    pv_phase(a0)
  155.     clr.w    pv_vibcnt(a0)
  156.     clr.b    pv_flags(a0)
  157.     adda.w    #pv_sizeof,a0
  158.     adda.w    #$0010,a1
  159.     lsl.w    #1,d1
  160.     addi.w    #wavesize,d2
  161.     dbf    d0,lab2
  162.     rts
  163.  
  164.  
  165. pp_end    clr.w    $dff0a8
  166.     clr.w    $dff0b8
  167.     clr.w    $dff0c8
  168.     clr.w    $dff0d8
  169.     move.w    #$000f,$dff096
  170.     rts
  171.  
  172.  
  173. pp_play    subq.b    #1,pp_waitcnt
  174.     bne.s    lab3
  175.     bsr    pp_nwnt
  176.     move.b    pp_wait,pp_waitcnt
  177.  
  178. lab3    lea    pp_variables,a1
  179.     bsr.s    pp_uvs
  180.     lea    pp_variables+pv_sizeof,a1
  181.     bsr.s    pp_uvs
  182.     lea    pp_variables+[2*pv_sizeof],a1
  183.     bsr.s    pp_uvs
  184.     lea    pp_variables+[3*pv_sizeof],a1
  185.  
  186.  
  187. pp_uvs    movea.l    pv_custbase(a1),a0
  188.  
  189. lab4    move.w    pv_pers(a1),d0
  190.     bne.s    lab5
  191.     bsr    pp_rot
  192.     bra.s    lab4
  193. lab5    add.w    pv_por(a1),d0
  194.     tst.w    pv_por(a1)
  195.     beq.s    lab5c
  196.     bpl.s    lab5a
  197.     cmp.w    pv_porlevel(a1),d0
  198.     bge.s    lab5c
  199.     bra.s    lab5b
  200. lab5a    cmp.w    pv_porlevel(a1),d0
  201.     ble.s    lab5c
  202. lab5b    move.w    pv_porlevel(a1),d0
  203.  
  204. lab5c    add.w    pv_vib(a1),d0
  205.     cmpi.w    #135,d0
  206.     bge.s    lab5d
  207.     move.w    #135,d0
  208.     bra.s    lab5e
  209. lab5d    cmpi.w    #1019,d0
  210.     ble.s    lab5e
  211.     move.w    #1019,d0
  212. lab5e    move.w    d0,6(a0)
  213.     bsr    pp_rot
  214.  
  215.  
  216.     move.w    pv_deltapor(a1),d0
  217.     add.w    d0,pv_por(a1)
  218.     cmpi.w    #-1019,pv_por(a1)
  219.     bge.s    lab6
  220.     move.w    #-1019,pv_por(a1)
  221.     bra.s    lab7
  222. lab6    cmpi.w    #1019,pv_por(a1)
  223.     ble.s    lab7
  224.     move.w    #1019,pv_por(a1)
  225.  
  226.  
  227. lab7    tst.b    pv_vibcnt(a1)
  228.     beq.s    lab8
  229.     move.w    pv_deltavib(a1),d0
  230.     add.w    d0,pv_vib(a1)
  231.     subq.b    #1,pv_vibcnt(a1)
  232.     bne.s    lab8
  233.     neg.w    pv_deltavib(a1)
  234.     move.b    pv_vibmax(a1),pv_vibcnt(a1)
  235.  
  236.  
  237. lab8    move.w    pv_dmacon(a1),d0
  238.     move.w    pv_vol(a1),8(a0)
  239.     move.w    pv_deltavol(a1),d0
  240.     add.w    d0,pv_vol(a1)
  241.     tst.w    pv_vol(a1)
  242.     bpl.s    lab9
  243.     clr.w    pv_vol(a1)
  244.     bra.s    lab10
  245. lab9    cmpi.w    #$40,pv_vol(a1)
  246.     ble.s    lab10
  247.     move.w    #$40,pv_vol(a1)
  248.  
  249.  
  250. lab10    btst    #1,pv_flags(a1)
  251.     beq.s    lab12
  252.     movea.l    pv_insaddress(a1),a0
  253.     move.w    pv_waveoffset(a1),d0
  254.     neg.w    d0
  255.     lea    0(a0,d0.w),a2
  256.     movea.l    a2,a3
  257.     move.w    pv_phase(a1),d0
  258.     lsr.w    #2,d0
  259.     adda.w    d0,a3
  260.  
  261.     move.w    #wavesize-1,d0
  262. lab11    move.b    (a2)+,d1
  263.     ext.w    d1
  264.     move.b    (a3)+,d2
  265.     ext.w    d2
  266.     add.w    d1,d2
  267.     asr.w    #1,d2
  268.     move.b    d2,(a0)+
  269.     dbf    d0,lab11
  270.  
  271.     move.w    pv_deltaphase(a1),d0
  272.     add.w    d0,pv_phase(a1)
  273.     cmpi.w    #wavesize*4,pv_phase(a1)
  274.     blt.s    lab12
  275.     subi.w    #wavesize*4,pv_phase(a1)
  276.  
  277. lab12    rts
  278.  
  279.  
  280. pp_rot    move.w    pv_pers(a1),d0
  281.     move.w    pv_pers+2(a1),pv_pers(a1)
  282.     move.w    pv_pers+4(a1),pv_pers+2(a1)
  283.     move.w    d0,pv_pers+4(a1)
  284.     rts
  285.  
  286.  
  287. pp_nwnt    movea.l    pp_address,a0
  288.     addi.l    #4*nt_sizeof,pp_address
  289.     subq.b    #1,pp_notecnt
  290.     bne.s    lab15
  291.  
  292. lab13    addq.l    #2,pp_songptr
  293.     subq.w    #1,pp_songcnt
  294.     bne.s    lab14
  295.     move.l    songtable,pp_songptr
  296.     move.w    songlen,pp_songcnt
  297. lab14    movea.l    pp_songptr,a1
  298.     move.w    (a1),d0
  299.     mulu    #pt_sizeof,d0
  300.     add.l    patttable,d0
  301.     movea.l    d0,a1
  302.     move.b    pt_size+1(a1),pp_notecnt
  303.     move.l    pt_address(a1),pp_address
  304.  
  305.  
  306. lab15    clr.w    pp_tmpdmacon
  307.     lea    pp_variables,a1
  308.     bsr    pp_nnt
  309.     addq.w    #nt_sizeof,a0
  310.     lea    pp_variables+pv_sizeof,a1
  311.     bsr    pp_nnt
  312.     addq.w    #nt_sizeof,a0
  313.     lea    pp_variables+[2*pv_sizeof],a1
  314.     bsr    pp_nnt
  315.     addq.w    #nt_sizeof,a0
  316.     lea    pp_variables+[3*pv_sizeof],a1
  317.     bsr    pp_nnt
  318.  
  319.  
  320.     move.w    pp_tmpdmacon,$dff096
  321.     move.w    #300,d0
  322. lab16    dbf    d0,lab16
  323.  
  324.     lea    pp_variables,a1
  325.     bsr    pp_scr
  326.     lea    pp_variables+pv_sizeof,a1
  327.     bsr.s    pp_scr
  328.     lea    pp_variables+[2*pv_sizeof],a1
  329.     bsr.s    pp_scr
  330.     lea    pp_variables+[3*pv_sizeof],a1
  331.     bsr.s    pp_scr
  332.  
  333.     bset    #7,pp_tmpdmacon
  334.     move.w    pp_tmpdmacon,$dff096
  335.     move.w    #300,d0
  336. lab17    dbf    d0,lab17
  337.  
  338.  
  339.     move.l    pp_variables+pv_insaddress,$dff0a0
  340.     move.w    pp_variables+pv_inslen,$dff0a4
  341.     move.l    pp_variables+pv_sizeof+pv_insaddress,$dff0b0
  342.     move.w    pp_variables+pv_sizeof+pv_inslen,$dff0b4
  343.     move.l    pp_variables+[2*pv_sizeof]+pv_insaddress,$dff0c0
  344.     move.w    pp_variables+[2*pv_sizeof]+pv_inslen,$dff0c4
  345.     move.l    pp_variables+[3*pv_sizeof]+pv_insaddress,$dff0d0
  346.     move.w    pp_variables+[3*pv_sizeof]+pv_inslen,$dff0d4
  347.  
  348.     rts
  349.  
  350.  
  351. pp_scr    move.w    pp_tmpdmacon,d0
  352.     and.w    pv_dmacon(a1),d0
  353.     beq.s    lab18
  354.  
  355.     movea.l    pv_custbase(a1),a0
  356.     move.l    pv_insaddress(a1),(a0)
  357.     move.w    pv_inslen(a1),4(a0)
  358.     move.w    pv_pers(a1),6(a0)
  359.     btst    #0,pv_flags(a1)
  360.     bne.s    lab18
  361.     move.l    #pp_nullwave,pv_insaddress(a1)
  362.     move.w    #1,pv_inslen(a1)
  363.  
  364. lab18    rts
  365.  
  366.  
  367. pp_nnt    move.b    nt_period(a0),d1
  368.     beq    lab22
  369.  
  370.     andi.l    #$000000ff,d1
  371.     lsl.w    #1,d1
  372.     addi.l    #pp_periods-2,d1
  373.     movea.l    d1,a2
  374.  
  375.     btst    #6,nt_speed(a0)
  376.     beq.s    lab21
  377.     move.w    (a2),pv_porlevel(a1)
  378.     bra    lab22
  379.  
  380.  
  381. lab21    move.w    pv_dmacon(a1),d0
  382.     or.w    d0,pp_tmpdmacon
  383.  
  384.     move.l    a2,pv_peraddress(a1)
  385.     move.w    (a2),pv_pers(a1)
  386.     move.w    (a2),pv_pers+2(a1)
  387.     move.w    (a2),pv_pers+4(a1)
  388.  
  389.     clr.w    pv_por(a1)
  390.  
  391.     move.b    nt_instr(a0),d0
  392.     ext.w    d0
  393.     mulu    #it_sizeof,d0
  394.     add.l    instable,d0
  395.     movea.l    d0,a2
  396.     tst.l    it_address(a2)
  397.     bne.s    lab20
  398.     move.l    #pp_nullwave,pv_insaddress(a1)
  399.     move.w    #1,pv_inslen(a1)
  400.     clr.b    pv_flags(a1)
  401.     bra.s    lab22
  402.  
  403. lab20    movea.l    it_address(a2),a3
  404.     btst    #1,it_flags(a2)
  405.     bne.s    lab19a
  406.     move.l    it_size(a2),d0
  407.     lsr.l    #1,d0
  408.     move.w    d0,pv_inslen(a1)
  409.     bra.s    lab19
  410. lab19a    move.w    pv_waveoffset(a1),d0
  411.     adda.w    d0,a3
  412.     move.w    #wavesize/2,pv_inslen(a1)
  413. lab19    move.l    a3,pv_insaddress(a1)
  414.     move.b    it_flags(a2),pv_flags(a1)
  415.     move.w    pv_vollevel(a1),pv_vol(a1)
  416.  
  417.  
  418. lab22    move.b    nt_speed(a0),d0
  419.     andi.b    #$0f,d0
  420.     beq.s    lab23
  421.     move.b    d0,pp_wait
  422.  
  423.  
  424. lab23    movea.l    pv_peraddress(a1),a2
  425.     move.b    nt_arpeggio(a0),d0
  426.     beq.s    lab25
  427.     cmpi.b    #$ff,d0
  428.     bne.s    lab24
  429.     move.w    (a2),pv_pers(a1)
  430.     move.w    (a2),pv_pers+2(a1)
  431.     move.w    (a2),pv_pers+4(a1)
  432.     bra.s    lab25
  433. lab24    andi.b    #$0f,d0
  434.     lsl.b    #1,d0
  435.     ext.w    d0
  436.     move.w    0(a2,d0.w),pv_pers+4(a1)
  437.     move.b    nt_arpeggio(a0),d0
  438.     lsr.b    #4,d0
  439.     lsl.b    #1,d0
  440.     ext.w    d0
  441.     move.w    0(a2,d0.w),pv_pers+2(a1)
  442.     move.w    (a2),pv_pers(a1)
  443.  
  444.  
  445. lab25    move.b    nt_vibrato(a0),d0
  446.     beq.s    lab27
  447.     cmpi.b    #$ff,d0
  448.     bne.s    lab26
  449.     clr.l    pv_vib(a1)
  450.     clr.b    pv_vibcnt(a1)
  451.     bra.s    lab27
  452. lab26    clr.w    pv_vib(a1)
  453.     andi.b    #$0f,d0
  454.     ext.w    d0
  455.     move.w    d0,pv_deltavib(a1)
  456.     move.b    nt_vibrato(a0),d0
  457.     lsr.b    #4,d0
  458.     move.b    d0,pv_vibmax(a1)
  459.     lsr.b    #1,d0
  460.     move.b    d0,pv_vibcnt(a1)
  461.  
  462.  
  463. lab27    move.b    nt_phase(a0),d0
  464.     beq.s    lab29
  465.     cmpi.b    #$ff,d0
  466.     bne.s    lab28
  467.     clr.l    pv_phase(a1)
  468.     bra.s    lab29
  469. lab28    andi.b    #$0f,d0
  470.     ext.w    d0
  471.     move.w    d0,pv_deltaphase(a1)
  472.     clr.w    pv_phase(a1)
  473.  
  474.  
  475. lab29    move.b    nt_volume(a0),d0
  476.     bne.s    lab29a
  477.     btst    #7,nt_speed(a0)
  478.     beq.s    lab33
  479.     bra.s    lab30a
  480. lab29a    cmpi.b    #$ff,d0
  481.     bne.s    lab30
  482.     clr.w    pv_deltavol(a1)
  483.     bra.s    lab33
  484. lab30    btst    #7,nt_speed(a0)
  485.     beq.s    lab31
  486. lab30a    move.b    d0,pv_vol+1(a1)
  487.     move.b    d0,pv_vollevel+1(a1)
  488.     clr.w    pv_deltavol(a1)
  489.     bra.s    lab33
  490. lab31    bclr    #7,d0
  491.     beq.s    lab32
  492.     neg.b    d0
  493. lab32    ext.w    d0
  494.     move.w    d0,pv_deltavol(a1)
  495.  
  496.  
  497. lab33    move.b    nt_porta(a0),d0
  498.     beq.s    lab36
  499.     cmpi.b    #$ff,d0
  500.     bne.s    lab34
  501.     clr.l    pv_por(a1)
  502.     bra.s    lab36
  503. lab34    clr.w    pv_por(a1)
  504.     btst    #6,nt_speed(a0)
  505.     beq.s    lab34a
  506.     move.w    pv_porlevel(a1),d1
  507.     cmp.w    pv_pers(a1),d1
  508.     bgt.s    lab34c
  509.     neg.b    d0
  510.     bra.s    lab34c
  511. lab34a    bclr    #7,d0
  512.     bne.s    lab35
  513.     neg.b    d0
  514.     move.w    #135,pv_porlevel(a1)
  515.     bra.s    lab34c
  516. lab35    move.w    #1019,pv_porlevel(a1)
  517. lab34c    ext.w    d0
  518. lab35a    move.w    d0,pv_deltapor(a1)
  519.  
  520.  
  521. lab36    rts
  522.  
  523.  
  524. * Replayer data
  525.  
  526. pp_periods    dc.w    1019,962,908,857,809,763,720,680,642,606,572,540
  527.         dc.w    509,481,454,428,404,381,360,340,321,303,286,270
  528.         dc.w    254,240,227,214,202,190,180,170,160,151,143,135
  529.         dc.w    135,135,135,135,135,135,135,135,135
  530.         dc.w    135,135,135,135,135,135
  531.  
  532. mysong        Incbin    "ST-00:Songs/DemoSong4"    ;Insert your song here!
  533.  
  534. songlen        ds.w    1
  535. songtable    ds.l    1
  536. instable    ds.l    1
  537. patttable    ds.l    1
  538.  
  539. pp_wait        ds.b    1
  540. pp_waitcnt    ds.b    1
  541. pp_notecnt    ds.b    1
  542.  
  543.         even
  544. pp_address    ds.l    1
  545. pp_songptr    ds.l    1
  546. pp_songcnt    ds.w    1
  547. pp_pattentry    ds.l    1
  548. pp_tmpdmacon    ds.w    1
  549. pp_variables    ds.b    4*48
  550.  
  551. pp_nullwave    ds.w    1
  552.  
  553.