home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 4: Demo 1 / almathera_demo1.bin / utils / rippers / sources / jamreplay.devpac < prev    next >
Text File  |  1995-03-17  |  10KB  |  562 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 written for the GenIm V2.12 assembler
  12. * and can be easily modified for other assemblers.
  13. * The song should be inserted at 'mysong' near the bottom of
  14. * this source, in chip memory.
  15. *
  16.  
  17. * This is the correct calling procedure
  18. * Don't forget to save any important registers
  19. * because I don't care
  20.  
  21.     bsr.s    pp_init            First, initialize
  22.  
  23. here    bsr    pp_play            Then, play every 1/50 sec.
  24. hi    cmpi.b    #1,$dff006
  25.     bne.s    hi
  26.     btst    #6,$bfe001        Check left mouse button
  27.     bne.s    here
  28.     bsr    pp_end            Finally, stop playing
  29.  
  30.     rts
  31.  
  32.  
  33. *** This is the actual replay routine
  34.  
  35. wavesize set $40
  36.  
  37. pp_init    lea    mysong,a0
  38.     addq.w    #4,a0
  39.     move.w    (a0)+,d0
  40.     move.w    d0,d1
  41.     move.l    a0,instable
  42.     mulu    #it_sizeof,d0
  43.     adda.w    d0,a0
  44.  
  45.     move.w    (a0)+,d0
  46.     move.w    d0,d2
  47.     move.l    a0,patttable
  48.     mulu    #pt_sizeof,d0
  49.     adda.w    d0,a0
  50.  
  51.     move.w    (a0)+,d0
  52.     move.w    d0,songlen
  53.     move.l    a0,songtable
  54.     lsl.w    #1,d0
  55.     adda.w    d0,a0
  56.  
  57.     movea.l    patttable,a1
  58.     move.w    d2,d0
  59.     subq.w    #1,d0
  60. .l0    move.l    a0,pt_address(a1)
  61.     move.w    pt_size(a1),d3
  62.     mulu    #nt_sizeof*4,d3
  63.     adda.w    d3,a0
  64.     addq.w    #pt_sizeof,a1
  65.     dbf    d0,.l0
  66.  
  67.     movea.l    instable,a1
  68.     move.w    d1,d0
  69.     subq.w    #1,d0
  70. .l1    move.l    a0,it_address(a1)
  71.     move.l    it_size(a1),d2
  72.     adda.l    d2,a0
  73.     adda.w    #it_sizeof,a1
  74.     dbf    d0,.l1
  75.  
  76.  
  77.     move.l    songtable,pp_songptr
  78.     move.w    songlen,pp_songcnt
  79.     movea.l    pp_songptr,a0
  80.     move.w    (a0),d0
  81.     mulu    #pt_sizeof,d0
  82.     add.l    patttable,d0
  83.     movea.l    d0,a0
  84.     move.l    a0,pp_pattentry
  85.     move.b    pt_size+1(a0),pp_notecnt
  86.     move.l    pt_address(a0),pp_address
  87.     move.b    #6,pp_wait
  88.     move.b    #1,pp_waitcnt
  89.     clr.w    pp_nullwave
  90.     move.w    #$000f,$dff096
  91.  
  92.     lea    pp_variables,a0
  93.     lea    $dff0a0,a1
  94.     move.w    #$0001,d1
  95.     move.w    #2*wavesize,d2
  96.     move.w    #3,d0
  97. .l2    clr.w    8(a1)
  98.     move.w    d2,pv_waveoffset(a0)
  99.     move.w    d1,pv_dmacon(a0)
  100.     move.l    a1,pv_custbase(a0)
  101.     move.l    #pp_periods,pv_peraddress(a0)
  102.     move.w    #1019,pv_pers(a0)
  103.     clr.w    pv_pers+2(a0)
  104.     clr.w    pv_pers+4(a0)
  105.     clr.l    pv_por(a0)
  106.     clr.w    pv_porlevel(a0)
  107.     clr.l    pv_vib(a0)
  108.     clr.l    pv_vol(a0)
  109.     move.w    #$0040,pv_vollevel(a0)
  110.     clr.l    pv_phase(a0)
  111.     clr.w    pv_vibcnt(a0)
  112.     clr.b    pv_flags(a0)
  113.     adda.w    #pv_sizeof,a0
  114.     adda.w    #$0010,a1
  115.     lsl.w    #1,d1
  116.     addi.w    #wavesize,d2
  117.     dbf    d0,.l2
  118.     rts
  119.  
  120.  
  121. pp_end    clr.w    $dff0a8
  122.     clr.w    $dff0b8
  123.     clr.w    $dff0c8
  124.     clr.w    $dff0d8
  125.     move.w    #$000f,$dff096
  126.     rts
  127.  
  128.  
  129. pp_play    subq.b    #1,pp_waitcnt
  130.     bne.s    .l0
  131.     bsr    pp_nwnt
  132.     move.b    pp_wait,pp_waitcnt
  133.  
  134. .l0    lea    pp_variables,a1
  135.     bsr.s    pp_uvs
  136.     lea    pp_variables+pv_sizeof,a1
  137.     bsr.s    pp_uvs
  138.     lea    pp_variables+2*pv_sizeof,a1
  139.     bsr.s    pp_uvs
  140.     lea    pp_variables+3*pv_sizeof,a1
  141.  
  142.  
  143. pp_uvs    movea.l    pv_custbase(a1),a0
  144.  
  145. .l0    move.w    pv_pers(a1),d0
  146.     bne.s    .l1
  147.     bsr    pp_rot
  148.     bra.s    .l0
  149. .l1    add.w    pv_por(a1),d0
  150.     tst.w    pv_por(a1)
  151.     beq.s    .l1c
  152.     bpl.s    .l1a
  153.     cmp.w    pv_porlevel(a1),d0
  154.     bge.s    .l1c
  155.     bra.s    .l1b
  156. .l1a    cmp.w    pv_porlevel(a1),d0
  157.     ble.s    .l1c
  158. .l1b    move.w    pv_porlevel(a1),d0
  159.  
  160. .l1c    add.w    pv_vib(a1),d0
  161.     cmpi.w    #135,d0
  162.     bge.s    .l1d
  163.     move.w    #135,d0
  164.     bra.s    .l1e
  165. .l1d    cmpi.w    #1019,d0
  166.     ble.s    .l1e
  167.     move.w    #1019,d0
  168. .l1e    move.w    d0,6(a0)
  169.     bsr    pp_rot
  170.  
  171.  
  172.     move.w    pv_deltapor(a1),d0
  173.     add.w    d0,pv_por(a1)
  174.     cmpi.w    #-1019,pv_por(a1)
  175.     bge.s    .l3
  176.     move.w    #-1019,pv_por(a1)
  177.     bra.s    .l5
  178. .l3    cmpi.w    #1019,pv_por(a1)
  179.     ble.s    .l5
  180.     move.w    #1019,pv_por(a1)
  181.  
  182.  
  183. .l5    tst.b    pv_vibcnt(a1)
  184.     beq.s    .l7
  185.     move.w    pv_deltavib(a1),d0
  186.     add.w    d0,pv_vib(a1)
  187.     subq.b    #1,pv_vibcnt(a1)
  188.     bne.s    .l7
  189.     neg.w    pv_deltavib(a1)
  190.     move.b    pv_vibmax(a1),pv_vibcnt(a1)
  191.  
  192.  
  193. .l7    move.w    pv_dmacon(a1),d0
  194.     move.w    pv_vol(a1),8(a0)
  195.     move.w    pv_deltavol(a1),d0
  196.     add.w    d0,pv_vol(a1)
  197.     tst.w    pv_vol(a1)
  198.     bpl.s    .l8
  199.     clr.w    pv_vol(a1)
  200.     bra.s    .la
  201. .l8    cmpi.w    #$40,pv_vol(a1)
  202.     ble.s    .la
  203.     move.w    #$40,pv_vol(a1)
  204.  
  205.  
  206. .la    btst    #1,pv_flags(a1)
  207.     beq.s    .l10
  208.     movea.l    pv_insaddress(a1),a0
  209.     move.w    pv_waveoffset(a1),d0
  210.     neg.w    d0
  211.     lea    0(a0,d0.w),a2
  212.     movea.l    a2,a3
  213.     move.w    pv_phase(a1),d0
  214.     lsr.w    #2,d0
  215.     adda.w    d0,a3
  216.  
  217.     move.w    #wavesize-1,d0
  218. .lb    move.b    (a2)+,d1
  219.     ext.w    d1
  220.     move.b    (a3)+,d2
  221.     ext.w    d2
  222.     add.w    d1,d2
  223.     asr.w    #1,d2
  224.     move.b    d2,(a0)+
  225.     dbf    d0,.lb
  226.  
  227.     move.w    pv_deltaphase(a1),d0
  228.     add.w    d0,pv_phase(a1)
  229.     cmpi.w    #wavesize<<2,pv_phase(a1)
  230.     blt.s    .l10
  231.     subi.w    #wavesize<<2,pv_phase(a1)
  232.  
  233. .l10    rts
  234.  
  235.  
  236. pp_rot    move.w    pv_pers(a1),d0
  237.     move.w    pv_pers+2(a1),pv_pers(a1)
  238.     move.w    pv_pers+4(a1),pv_pers+2(a1)
  239.     move.w    d0,pv_pers+4(a1)
  240.     rts
  241.  
  242.  
  243. pp_nwnt    movea.l    pp_address,a0
  244.     addi.l    #4*nt_sizeof,pp_address
  245.     subq.b    #1,pp_notecnt
  246.     bne.s    .l5
  247.  
  248. .l0    addq.l    #2,pp_songptr
  249.     subq.w    #1,pp_songcnt
  250.     bne.s    .l1
  251.     move.l    songtable,pp_songptr
  252.     move.w    songlen,pp_songcnt
  253. .l1    movea.l    pp_songptr,a1
  254.     move.w    (a1),d0
  255.     mulu    #pt_sizeof,d0
  256.     add.l    patttable,d0
  257.     movea.l    d0,a1
  258.     move.b    pt_size+1(a1),pp_notecnt
  259.     move.l    pt_address(a1),pp_address
  260.  
  261.  
  262. .l5    clr.w    pp_tmpdmacon
  263.     lea    pp_variables,a1
  264.     bsr    pp_nnt
  265.     addq.w    #nt_sizeof,a0
  266.     lea    pp_variables+pv_sizeof,a1
  267.     bsr    pp_nnt
  268.     addq.w    #nt_sizeof,a0
  269.     lea    pp_variables+2*pv_sizeof,a1
  270.     bsr    pp_nnt
  271.     addq.w    #nt_sizeof,a0
  272.     lea    pp_variables+3*pv_sizeof,a1
  273.     bsr    pp_nnt
  274.  
  275.  
  276.     move.w    pp_tmpdmacon,$dff096
  277.     move.w    #300,d0
  278. .l6    dbf    d0,.l6
  279.  
  280.     lea    pp_variables,a1
  281.     bsr    pp_scr
  282.     lea    pp_variables+pv_sizeof,a1
  283.     bsr.s    pp_scr
  284.     lea    pp_variables+2*pv_sizeof,a1
  285.     bsr.s    pp_scr
  286.     lea    pp_variables+3*pv_sizeof,a1
  287.     bsr.s    pp_scr
  288.  
  289.     bset    #7,pp_tmpdmacon
  290.     move.w    pp_tmpdmacon,$dff096
  291.     move.w    #300,d0
  292. .l7    dbf    d0,.l7
  293.  
  294.  
  295.     move.l    pp_variables+pv_insaddress,$dff0a0
  296.     move.w    pp_variables+pv_inslen,$dff0a4
  297.     move.l    pp_variables+pv_sizeof+pv_insaddress,$dff0b0
  298.     move.w    pp_variables+pv_sizeof+pv_inslen,$dff0b4
  299.     move.l    pp_variables+2*pv_sizeof+pv_insaddress,$dff0c0
  300.     move.w    pp_variables+2*pv_sizeof+pv_inslen,$dff0c4
  301.     move.l    pp_variables+3*pv_sizeof+pv_insaddress,$dff0d0
  302.     move.w    pp_variables+3*pv_sizeof+pv_inslen,$dff0d4
  303.  
  304.     rts
  305.  
  306.  
  307. pp_scr    move.w    pp_tmpdmacon,d0
  308.     and.w    pv_dmacon(a1),d0
  309.     beq.s    .l5
  310.  
  311.     movea.l    pv_custbase(a1),a0
  312.     move.l    pv_insaddress(a1),(a0)
  313.     move.w    pv_inslen(a1),4(a0)
  314.     move.w    pv_pers(a1),6(a0)
  315.     btst    #0,pv_flags(a1)
  316.     bne.s    .l5
  317.     move.l    #pp_nullwave,pv_insaddress(a1)
  318.     move.w    #1,pv_inslen(a1)
  319.  
  320. .l5    rts
  321.  
  322.  
  323. pp_nnt    move.b    nt_period(a0),d1
  324.     beq    .l5
  325.  
  326.  
  327.     andi.l    #$000000ff,d1
  328.     lsl.w    #1,d1
  329.     addi.l    #pp_periods-2,d1
  330.     movea.l    d1,a2
  331.  
  332.     btst    #6,nt_speed(a0)
  333.     beq.s    .l2
  334.     move.w    (a2),pv_porlevel(a1)
  335.     bra    .l5
  336.  
  337.  
  338. .l2    move.w    pv_dmacon(a1),d0
  339.     or.w    d0,pp_tmpdmacon
  340.  
  341.     move.l    a2,pv_peraddress(a1)
  342.     move.w    (a2),pv_pers(a1)
  343.     move.w    (a2),pv_pers+2(a1)
  344.     move.w    (a2),pv_pers+4(a1)
  345.  
  346.     clr.w    pv_por(a1)
  347.  
  348.     move.b    nt_instr(a0),d0
  349.     ext.w    d0
  350.     mulu    #it_sizeof,d0
  351.     add.l    instable,d0
  352.     movea.l    d0,a2
  353.     tst.l    it_address(a2)
  354.     bne.s    .l1
  355.     move.l    #pp_nullwave,pv_insaddress(a1)
  356.     move.w    #1,pv_inslen(a1)
  357.     clr.b    pv_flags(a1)
  358.     bra.s    .l5
  359.  
  360. .l1    movea.l    it_address(a2),a3
  361.     btst    #1,it_flags(a2)
  362.     bne.s    .l0a
  363.     move.l    it_size(a2),d0
  364.     lsr.l    #1,d0
  365.     move.w    d0,pv_inslen(a1)
  366.     bra.s    .l0
  367. .l0a    move.w    pv_waveoffset(a1),d0
  368.     adda.w    d0,a3
  369.     move.w    #wavesize>>1,pv_inslen(a1)
  370. .l0    move.l    a3,pv_insaddress(a1)
  371.     move.b    it_flags(a2),pv_flags(a1)
  372.     move.w    pv_vollevel(a1),pv_vol(a1)
  373.  
  374.  
  375. .l5    move.b    nt_speed(a0),d0
  376.     andi.b    #$0f,d0
  377.     beq.s    .l6
  378.     move.b    d0,pp_wait
  379.  
  380.  
  381. .l6    movea.l    pv_peraddress(a1),a2
  382.     move.b    nt_arpeggio(a0),d0
  383.     beq.s    .l9
  384.     cmpi.b    #$ff,d0
  385.     bne.s    .l7
  386.     move.w    (a2),pv_pers(a1)
  387.     move.w    (a2),pv_pers+2(a1)
  388.     move.w    (a2),pv_pers+4(a1)
  389.     bra.s    .l9
  390. .l7    andi.b    #$0f,d0
  391.     lsl.b    #1,d0
  392.     ext.w    d0
  393.     move.w    0(a2,d0.w),pv_pers+4(a1)
  394.     move.b    nt_arpeggio(a0),d0
  395.     lsr.b    #4,d0
  396.     lsl.b    #1,d0
  397.     ext.w    d0
  398.     move.w    0(a2,d0.w),pv_pers+2(a1)
  399.     move.w    (a2),pv_pers(a1)
  400.  
  401.  
  402. .l9    move.b    nt_vibrato(a0),d0
  403.     beq.s    .ld
  404.     cmpi.b    #$ff,d0
  405.     bne.s    .la
  406.     clr.l    pv_vib(a1)
  407.     clr.b    pv_vibcnt(a1)
  408.     bra.s    .ld
  409. .la    clr.w    pv_vib(a1)
  410.     andi.b    #$0f,d0
  411.     ext.w    d0
  412.     move.w    d0,pv_deltavib(a1)
  413.     move.b    nt_vibrato(a0),d0
  414.     lsr.b    #4,d0
  415.     move.b    d0,pv_vibmax(a1)
  416.     lsr.b    #1,d0
  417.     move.b    d0,pv_vibcnt(a1)
  418.  
  419.  
  420. .ld    move.b    nt_phase(a0),d0
  421.     beq.s    .l10
  422.     cmpi.b    #$ff,d0
  423.     bne.s    .le
  424.     clr.l    pv_phase(a1)
  425.     bra.s    .l10
  426. .le    andi.b    #$0f,d0
  427.     ext.w    d0
  428.     move.w    d0,pv_deltaphase(a1)
  429.     clr.w    pv_phase(a1)
  430.  
  431.  
  432. .l10    move.b    nt_volume(a0),d0
  433.     bne.s    .l10a
  434.     btst    #7,nt_speed(a0)
  435.     beq.s    .l16
  436.     bra.s    .l11a
  437. .l10a    cmpi.b    #$ff,d0
  438.     bne.s    .l11
  439.     clr.w    pv_deltavol(a1)
  440.     bra.s    .l16
  441. .l11    btst    #7,nt_speed(a0)
  442.     beq.s    .l12
  443. .l11a    move.b    d0,pv_vol+1(a1)
  444.     move.b    d0,pv_vollevel+1(a1)
  445.     clr.w    pv_deltavol(a1)
  446.     bra.s    .l16
  447. .l12    bclr    #7,d0
  448.     beq.s    .l13
  449.     neg.b    d0
  450. .l13    ext.w    d0
  451.     move.w    d0,pv_deltavol(a1)
  452.  
  453.  
  454. .l16    move.b    nt_porta(a0),d0
  455.     beq.s    .l1a
  456.     cmpi.b    #$ff,d0
  457.     bne.s    .l17
  458.     clr.l    pv_por(a1)
  459.     bra.s    .l1a
  460. .l17    clr.w    pv_por(a1)
  461.     btst    #6,nt_speed(a0)
  462.     beq.s    .l17a
  463.     move.w    pv_porlevel(a1),d1
  464.     cmp.w    pv_pers(a1),d1
  465.     bgt.s    .l17c
  466.     neg.b    d0
  467.     bra.s    .l17c
  468. .l17a    bclr    #7,d0
  469.     bne.s    .l18
  470.     neg.b    d0
  471.     move.w    #135,pv_porlevel(a1)
  472.     bra.s    .l17c
  473. .l18    move.w    #1019,pv_porlevel(a1)
  474. .l17c    ext.w    d0
  475. .l18a    move.w    d0,pv_deltapor(a1)
  476.  
  477.  
  478. .l1a    rts
  479.  
  480.  
  481. * Replayer data
  482.  
  483.         section    reppubdata,data
  484.  
  485. pp_periods    dc.w    1019,962,908,857,809,763,720,680,642,606,572,540
  486.         dc.w    509,481,454,428,404,381,360,340,321,303,286,270
  487.         dc.w    254,240,227,214,202,190,180,170,160,151,143,135
  488.         dc.w    135,135,135,135,135,135,135,135,135
  489.         dc.w    135,135,135,135,135,135
  490.  
  491.  
  492.         section    repchipdata,data_c
  493.  
  494. mysong        ;Insert your song here!
  495.  
  496.  
  497.         section    reppubbss,bss
  498.  
  499. songlen        ds.w    1
  500. songtable    ds.l    1
  501. instable    ds.l    1
  502. patttable    ds.l    1
  503.  
  504. pp_wait        ds.b    1
  505. pp_waitcnt    ds.b    1
  506. pp_notecnt    ds.b    1
  507. pp_address    ds.l    1
  508. pp_songptr    ds.l    1
  509. pp_songcnt    ds.w    1
  510. pp_pattentry    ds.l    1
  511. pp_tmpdmacon    ds.w    1
  512. pp_variables    ds.b    4*48
  513.  
  514.  
  515.         section    repchipbss,bss_c
  516.  
  517. pp_nullwave    ds.w    1
  518.  
  519.  
  520.         rsreset
  521. it_name        rs.b    31
  522. it_flags    rs.b    1
  523. it_size        rs.l    1
  524. it_address    rs.l    1
  525. it_sizeof    rs.w    0
  526.         rsreset
  527. pt_size        rs.w    1
  528. pt_address    rs.l    1
  529. pt_sizeof    rs.w    0
  530.         rsreset
  531. nt_period    rs.b    1
  532. nt_instr    rs.b    1
  533. nt_speed    rs.b    1
  534. nt_arpeggio    rs.b    1
  535. nt_vibrato    rs.b    1
  536. nt_phase    rs.b    1
  537. nt_volume    rs.b    1
  538. nt_porta    rs.b    1
  539. nt_sizeof    rs.w    0
  540.         rsreset
  541. pv_waveoffset    rs.w    1
  542. pv_dmacon    rs.w    1
  543. pv_custbase    rs.l    1
  544. pv_inslen    rs.w    1
  545. pv_insaddress    rs.l    1
  546. pv_peraddress    rs.l    1
  547. pv_pers        rs.w    3
  548. pv_por        rs.w    1
  549. pv_deltapor    rs.w    1
  550. pv_porlevel    rs.w    1
  551. pv_vib        rs.w    1
  552. pv_deltavib    rs.w    1
  553. pv_vol        rs.w    1
  554. pv_deltavol    rs.w    1
  555. pv_vollevel    rs.w    1
  556. pv_phase    rs.w    1
  557. pv_deltaphase    rs.w    1
  558. pv_vibcnt    rs.b    1
  559. pv_vibmax    rs.b    1
  560. pv_flags    rs.b    1
  561. pv_sizeof    rs.w    0
  562.