home *** CD-ROM | disk | FTP | other *** search
/ Fujiology Archive / fujiology_archive_v1_0.iso / A / AURA / MADPLAY.ZIP / MADPLAY / MPLAY2.S < prev    next >
Text File  |  1997-06-29  |  17KB  |  518 lines

  1. ; Player for Syntheticsounds in MadMax Format.
  2. ; Runs on any monitor, any machine (STE/E/TT/F030), uses Timer-A for proper
  3. ; 50Hz VBL-emulation (even can handle some SID voice tunes (e.g.
  4. ; BigAlecs ones).
  5. ; Can handle informations from an SNDH Header (name of composer, number of
  6. ; tunes).
  7.  
  8. ; Doesnt use anything like XBRA, so your memory keeps shrinking if you run
  9. ; several tunes resident (normal play: no probs!).
  10.  
  11. ; Coded at one afternoon (the code looks like that!): 15.2.1992
  12. ; Updates:    End of 92.
  13. ; F030-patch: 3.3.97
  14.  
  15. ; By the way: Done by BDCannibal (knaus@ruf.uni-freiburg.de)
  16.  
  17. speed           EQU 246         ; 245.76 (Timer-Wert fuer 50Hz IRQ)
  18. MAX_HEADER      EQU 200
  19.  
  20.                 OPT D+,O+
  21.                 OUTPUT 'E:\MAD_PLAY.TTP','c:\swap\newtunes\sowatt5.snd'
  22.  
  23. ; Commandozeile auslesen, restlichen Speicher freigeben und Tune laden.
  24.  
  25.                 movea.l 4(SP),A0
  26.                 lea     $80(A0),A0      ; Commandline
  27.                 move.b  (A0)+,D7        ; leer ?
  28.                 beq     endend
  29.  
  30.                 ext.w   D7              ; Anzahl Buchstaben
  31.                 subq.w  #1,D7
  32.                 lea     filename(PC),A1
  33. loop:           move.b  (A0)+,(A1)+
  34.                 dbra    D7,loop
  35.  
  36.                 clr.b   (A1)            ; Schlußbyte
  37.  
  38.                 movea.l 4(SP),A6        ; Erst nötig, nachdem man Filegr. kennt
  39.  
  40.                 pea     dta(PC)         ; DTA-Buffer einrichten
  41.                 move.w  #$1A,-(SP)      ; Datei einlesen
  42.                 trap    #1
  43.                 addq.w  #6,SP
  44.  
  45.                 clr.w   -(SP)           ; Nur normale Dateien
  46.                 pea     filename(PC)
  47.                 move.w  #$4E,-(SP)
  48.                 trap    #1
  49.                 addq.w  #8,SP
  50.  
  51.                 tst.w   D0
  52.                 beq.s   found
  53.  
  54.                 pea     fault1(PC)
  55. fault_out:      move.w  #9,-(SP)
  56.                 trap    #1
  57.                 addq.w  #6,SP
  58.                 bra     ende
  59.  
  60. found:          move.l  $0C(A6),D0
  61.                 add.l   $14(A6),D0
  62.                 add.l   $1C(A6),D0
  63.                 add.l   #$0400,D0
  64.                 lea     dta(PC),A0
  65. ;                add.l   26(A0),D0       ; Größe des Files dazuaddieren
  66.                 move.l  D0,resident     ; wird gebraucht, wenn das Teil resident
  67. ; gemacht werden soll !
  68.                 move.l  D0,-(SP)
  69.                 move.l  A6,-(SP)
  70.                 clr.w   -(SP)
  71.                 move.w  #$4A,-(SP)
  72.                 trap    #1
  73.                 lea     12(SP),SP
  74.  
  75.                 tst.w   D0
  76.                 beq.s   no_mem_f
  77.  
  78. suck_it:        pea     fault5(PC)
  79.                 bra     fault_out
  80.  
  81. no_mem_f:       move.l  dta+26(PC),-(SP) ; Speicher für Sound allocieren.
  82.                 move.w  #$48,-(SP)
  83.                 trap    #1
  84.                 addq.l  #4,SP
  85.  
  86.                 tst.l   D0
  87.                 ble.s   suck_it
  88.  
  89.                 move.l  D0,sound
  90.  
  91.                 clr.w   -(SP)           ; nur lesen
  92.                 pea     filename(PC)
  93.                 move.w  #$3D,-(SP)
  94.                 trap    #1
  95.                 addq.w  #6,SP
  96.  
  97.                 tst.l   D0
  98.                 bpl.s   ok1
  99.  
  100.                 pea     fault2(PC)
  101.                 bra.s   fault_out
  102.  
  103. ok1:            move.l  sound(PC),-(SP)
  104.                 move.l  dta+26(PC),-(SP) ; Dateigröße
  105.                 move.w  D0,D7
  106.                 move.w  D7,-(SP)
  107.                 move.w  #$3F,-(SP)
  108.                 trap    #1
  109.                 lea     12(SP),SP
  110.  
  111.                 tst.l   D0
  112.                 bpl.s   ok2
  113.  
  114.                 pea     fault3(PC)
  115.                 bra     fault_out
  116.  
  117. ok2:            move.w  D7,-(SP)
  118.                 move.w  #$3E,-(SP)
  119.                 trap    #1
  120.                 addq.w  #4,SP
  121.  
  122.                 lea     txt1(PC),A0     ; Text modifizieren
  123.                 lea     dta+30(PC),A1   ; Filenamen.
  124.                 moveq   #11,D0          ; max. 12 Buchstaben
  125. loop2:          move.b  (A1)+,D1
  126.                 beq.s   clr_rest
  127.                 move.b  D1,(A0)+
  128.                 dbra    D0,loop2
  129.  
  130. clr_rest:       tst.w   D0
  131.                 bmi.s   noclrrest
  132.  
  133. clr_rest_lp:    move.b  #' ',(A0)+
  134.                 dbra    D0,clr_rest_lp
  135.  
  136. noclrrest:      lea     txt2(PC),A0
  137.                 move.l  dta+26(PC),D0   ; Dateilänge
  138.                 move.w  #10000,D2
  139.                 REPT 4
  140.                 divu    D2,D0
  141.                 add.b   #'0',D0
  142.                 move.b  D0,(A0)+
  143.                 clr.w   D0
  144.                 swap    D0
  145.                 divu    #10,D2
  146.                 ENDR
  147.                 add.b   #'0',D0
  148.                 move.b  D0,(A0)
  149.  
  150.                 pea     starttxt(PC)
  151.                 move.w  #9,-(SP)
  152.                 trap    #1
  153.                 addq.w  #6,SP
  154.  
  155.                 bsr     test_sndh       ; Testen, ob SNDH Header vorhanden.
  156.  
  157. ; ****************************************************************************
  158.  
  159.                 clr.l   -(SP)
  160.                 move.w  #$20,-(SP)
  161.                 trap    #1
  162.                 addq.w  #6,SP
  163.  
  164.                 move.l  D0,saver
  165.  
  166.                 lea     saver+4(PC),A0  ; alle benötigten Vektoren retten
  167.                 move.w  $FFFF8242.w,(A0)+
  168.                 move    SR,(A0)+
  169.                 move.w  $0484.w,(A0)+
  170.                 move.b  $FFFFFA19.w,(A0)+
  171.                 move.b  $FFFFFA17.w,(A0)+
  172.                 move.b  $FFFFFA13.w,(A0)+
  173.                 move.b  $FFFFFA07.w,(A0)+
  174.                 move.b  $FFFFFA1F.w,(A0)+
  175.                 move.b  $FFFFFA19.w,(A0)+
  176.                 move.l  $0134.w,(A0)+
  177.  
  178.                 clr.b   backgrd
  179.  
  180.                 moveq   #1,D0
  181.                 movea.l sound(PC),A0
  182.                 jsr     (A0)            ; Soundinit
  183.  
  184.                 move    #$2700,SR       ; Interrupts sperren und Timer A init.
  185.                 bclr    #0,$0484.w      ; Tastaturklick aus (nur bei Backgrd.)
  186.                 move.w  #$00,$FFFF8242.w ; für alle Farbmonis !
  187.                 clr.b   $FFFFFA19.w     ; Timer A stoppen
  188.                 move.l  #timer_a,$0134.w
  189.                 bclr    #3,$FFFFFA17.w
  190.                 bset    #5,$FFFFFA13.w
  191.                 bset    #5,$FFFFFA07.w
  192.                 move.b  #speed,$FFFFFA1F.w
  193.                 move.b  #7,$FFFFFA19.w  ; Timer mit Vorteiler 1:200 starten
  194.                 stop    #$2300          ; ab geht's...
  195.  
  196. loopy:          move.w  #$0B,-(SP)      ; Tastaturbuffer leeren.
  197.                 trap    #1
  198.                 addq.l  #2,SP
  199.                 tst.w   D0
  200.                 beq.s   mainloop
  201.                 move.w  #7,-(SP)
  202.                 trap    #1
  203.                 addq.l  #2,SP
  204.                 bra.s   loopy
  205.  
  206. mainloop:       move.w  counter(PC),D0  ; Nur alle 50 Hz.
  207. wait_timer_a:   cmp.w   counter(PC),D0
  208.                 beq.s   wait_timer_a
  209.  
  210.                 bsr     volumeter       ; Fürs Auge.
  211.  
  212.                 move.w  #$0B,-(SP)      ; Tasten ???
  213.                 trap    #1
  214.                 addq.l  #2,SP
  215.  
  216.                 tst.w   D0
  217.                 beq.s   mainloop
  218.  
  219.                 move.w  #7,-(SP)
  220.                 trap    #1
  221.                 addq.w  #2,SP
  222.  
  223.                 swap    D0              ; Scancode
  224.  
  225.                 cmp.b   #$39,D0         ; Ende ? (Space)
  226.                 beq     end
  227.                 cmp.b   #$13,D0         ; Resident halrten ? (R)
  228.                 beq     resi
  229.                 cmp.b   #$0B,D0         ; 1-0 ?
  230.                 bgt.s   mainloop
  231.                 sub.b   #$02,D0
  232.                 bmi.s   mainloop
  233.  
  234.                 ext.w   D0
  235.                 addq.w  #1,D0
  236.  
  237.                 tst.w   anz_songs       ; Wenn kein SNDH Header vorh.: alles
  238.                 beq.s   all_keys        ; moeglich.
  239.  
  240.                 cmp.w   anz_songs(PC),D0 ; Zu weit ?
  241.                 bgt.s   mainloop
  242.  
  243. all_keys:       movea.l sound(PC),A0
  244.                 jsr     (A0)            ; neuer Sound installieren
  245.                 bra.s   mainloop
  246.  
  247. ; Volumeter: Code genauso lächerlich wie das Ding aussieht...
  248. volumeter:      movem.l D0-A6,-(SP)
  249.  
  250.                 moveq   #2,D7
  251.                 moveq   #8,D6
  252. out_loop:       moveq   #$0F,D0
  253.                 move.b  D6,$FFFF8800.w
  254.                 and.b   $FFFF8800.w,D0
  255.                 add.w   D0,D0
  256.                 add.w   D0,D0
  257.                 move.l  volm(PC,D0.w),D0
  258.                 move.l  D0,-(SP)
  259.                 move.w  #9,-(SP)
  260.                 trap    #1
  261.                 addq.l  #6,SP
  262.                 addq.b  #1,D6
  263.                 dbra    D7,out_loop
  264.  
  265.                 pea     curs_up(PC)
  266.                 move.w  #9,-(SP)
  267.                 trap    #1
  268.                 addq.l  #6,SP
  269.  
  270.                 movem.l (SP)+,D0-A6
  271.                 rts
  272.  
  273. ; Volumeterstrings (kein Stress bei Umwandlung...)
  274. volm:           DC.L vol0,vol1,vol2,vol3
  275.                 DC.L vol4,vol5,vol6,vol7
  276.                 DC.L vol8,vol9,vola,volb
  277.                 DC.L volc,vold,vole,volf
  278.  
  279. resi:           st      backgrd
  280.  
  281.                 clr.w   -(SP)           ; Programm beenden und resident halten
  282.                 move.l  resident(PC),-(SP)
  283.                 move.w  #$31,-(SP)
  284.                 trap    #1
  285.  
  286. vorspul:        move.w  #$0700,$FFFF8240.w
  287.                 movem.l D0-A6,-(SP)
  288. spieler:        movea.l sound(PC),A0
  289.                 jsr     8(A0)           ; Sound playen
  290.  
  291.                 move.w  #50,D0
  292. lp1:            move.w  #5,D1
  293. lp2:            dbra    D1,lp2
  294.                 dbra    D0,lp1
  295.  
  296.                 move.w  #-1,-(SP)
  297.                 move.w  #11,-(SP)
  298.                 trap    #13
  299.                 addq.w  #4,SP
  300.  
  301.                 btst    #0,D0
  302.                 bne.s   spieler
  303.  
  304.                 movem.l (SP)+,D0-A6
  305.                 bra     mainloop
  306.  
  307. end:
  308. ;                moveq   #0,D0
  309. ;                movea.l sound(PC),A0
  310. ;                jsr     (A0)
  311.  
  312.                 move.l  sound(PC),-(SP) ; Soundspeicher freigeben.
  313.                 move.w  #$49,-(SP)
  314.                 trap    #1
  315.                 addq.l  #6,SP
  316.  
  317.                 pea     ping(PC)
  318.                 move.w  #9,-(SP)
  319.                 trap    #1
  320.                 addq.l  #6,SP
  321.  
  322.                 move    #$2700,SR
  323.                 lea     saver(PC),A0
  324.                 move.l  (A0)+,-(SP)     ; alter Stack
  325.                 move.w  (A0)+,$FFFF8242.w
  326.                 move    (A0)+,SR
  327.                 move.w  (A0)+,$0484.w
  328.                 move.b  (A0)+,$FFFFFA19.w
  329.                 move.b  (A0)+,$FFFFFA17.w
  330.                 move.b  (A0)+,$FFFFFA13.w
  331.                 move.b  (A0)+,$FFFFFA07.w
  332.                 move.b  (A0)+,$FFFFFA1F.w
  333.                 move.b  (A0)+,$FFFFFA19.w
  334.                 move.l  (A0)+,$0134.w
  335.                 move.l  #$080000,$FFFF8800.w ; Ton aus Geppard !
  336.                 move.l  #$090000,$FFFF8800.w
  337.                 move.l  #$0A0000,$FFFF8800.w
  338.                 move    #$2300,SR
  339.  
  340.                 move.w  #$20,-(SP)      ; zurück in den User-Mode
  341.                 trap    #1
  342.                 addq.w  #6,SP
  343.  
  344. endend:         clr.w   -(SP)
  345.                 trap    #1
  346.  
  347. ende:           move.w  #7,-(SP)        ; wird nach den Fehlermeldungen ange-
  348.                 trap    #1              ; sprungen
  349.                 addq.w  #2,SP
  350.                 clr.w   -(SP)
  351.                 trap    #1
  352.  
  353. timer_a:        movem.l D0-A6,-(SP)
  354.                 movea.l sound(PC),A0
  355.                 jsr     8(A0)           ; Sound spielen
  356.  
  357. ;                tst.b   backgrd         ; Läuft Musik im Hauptprogramm ???
  358. ;                bne.s   end_tima
  359.  
  360. end_tima:       movem.l (SP)+,D0-A6
  361.                 move.b  #%11011111,$FFFFFA0F.w ; da SEI
  362.                 move.b  #speed,$FFFFFA1F.w
  363.  
  364.                 addq.w  #1,counter
  365.                 rte
  366.  
  367.                 >PART 'SNDH test und Infos ausgeben'
  368. test_sndh:      move.l  #'COMM',D0
  369.                 bsr     search_sndh
  370.                 beq     no_sndh
  371.  
  372.                 lea     composer(PC),A6
  373.                 bsr     print
  374.                 movea.l D0,A6
  375.                 bsr     print
  376.  
  377.                 move.l  #'TITL',D0
  378.                 bsr     search_sndh
  379.                 beq     no_sndh
  380.  
  381.                 lea     title(PC),A6
  382.                 bsr     print
  383.                 movea.l D0,A6
  384.                 bsr     print
  385.  
  386.                 move.l  #'RIPP',D0
  387.                 bsr     search_sndh
  388.                 beq     no_sndh
  389.  
  390.                 lea     ripp(PC),A6
  391.                 bsr     print
  392.                 movea.l D0,A6
  393.                 bsr     print
  394.  
  395.                 move.l  #'CONV',D0
  396.                 bsr     search_sndh
  397.                 beq     no_sndh
  398.  
  399.                 lea     conversion(PC),A6
  400.                 bsr     print
  401.                 movea.l D0,A6
  402.                 bsr     print
  403.  
  404.                 move.w  #'##',D0
  405.                 bsr     search_sndh_w
  406.                 beq     no_sndh
  407.  
  408.                 move.w  D0,anz
  409.  
  410.                 move.w  #$FF,D1
  411.                 and.w   D0,D1           ; 10^0
  412.                 lsr.w   #8,D0           ; 10^1
  413.  
  414.                 subi.b  #'0',D0
  415.                 subi.b  #'0',D1
  416.                 mulu    #10,D0
  417.                 add.w   D1,D0
  418.                 move.w  D0,anz_songs
  419.  
  420.                 lea     songs(PC),A6
  421.                 bsr     print
  422.  
  423.                 bra     no_sndh
  424.  
  425. search_sndh:    movea.l sound(PC),A5
  426.                 move.w  #MAX_HEADER-1,D7
  427.                 move.l  (A5)+,D1
  428. _search_sndh:   cmp.l   D0,D1
  429.                 beq.s   wow2
  430.                 lsl.l   #8,D1
  431.                 move.b  (A5)+,D1
  432.                 dbra    D7,_search_sndh
  433.                 moveq   #0,D0
  434.                 rts
  435. wow2:           move.l  A5,D0
  436.                 rts
  437.  
  438. search_sndh_w:  movea.l sound(PC),A5
  439.                 move.w  #MAX_HEADER-1,D7
  440.                 move.w  (A5)+,D1
  441. _search_sndh_w: cmp.w   D0,D1
  442.                 beq.s   wow_w
  443.                 lsl.w   #8,D1
  444.                 move.b  (A5)+,D1
  445.                 dbra    D7,_search_sndh_w
  446.                 moveq   #0,D0
  447.                 rts
  448. wow_w:          move.b  (A5)+,D0
  449.                 lsl.w   #8,D0
  450.                 move.b  (A5)+,D0
  451.                 rts
  452.  
  453.  
  454. composer:       DC.B 'Composer:   ',0
  455. title:          DC.B 13,10,'Title:      ',0
  456. ripp:           DC.B 13,10,'Ripped:     ',0
  457. conversion:     DC.B 13,10,'Conversion: ',0
  458. songs:          DC.B 13,10,'Songs:      '
  459. anz:            DC.B 'xx',13,10,13,10,0
  460.                 EVEN
  461.  
  462. print:          movem.l D0-D2/A0-A2,-(SP)
  463.                 pea     (A6)
  464.                 move.w  #9,-(SP)
  465.                 trap    #1
  466.                 addq.l  #6,SP
  467.                 movem.l (SP)+,D0-D2/A0-A2
  468. no_sndh:        rts
  469.                 ENDPART
  470.  
  471. starttxt:                               ;DC.B 27,'f',27,'E'
  472.                 DC.B 13,10
  473.                 DC.B 'Soundchipplayer v. 0.2 by BDCannibal/AURA (4.3.97).'
  474.                 DC.B 13,10,13,10
  475. txt:            DC.B 'Playing File:   '
  476. txt1:           DC.B 'XXXXXXXX.XXX',13,10
  477.                 DC.B 'Length:         '
  478. txt2:           DC.B 'XXXXX',' Bytes',13,10,13,10,27,'f',27,'b9',0
  479.                 EVEN
  480.  
  481. vol0:           DC.B '[               ]',13,10,0
  482. vol1:           DC.B '[*              ]',13,10,0
  483. vol2:           DC.B '[**             ]',13,10,0
  484. vol3:           DC.B '[***            ]',13,10,0
  485. vol4:           DC.B '[****           ]',13,10,0
  486. vol5:           DC.B '[*****          ]',13,10,0
  487. vol6:           DC.B '[******         ]',13,10,0
  488. vol7:           DC.B '[*******        ]',13,10,0
  489. vol8:           DC.B '[********       ]',13,10,0
  490. vol9:           DC.B '[*********      ]',13,10,0
  491. vola:           DC.B '[**********     ]',13,10,0
  492. volb:           DC.B '[***********    ]',13,10,0
  493. volc:           DC.B '[************   ]',13,10,0
  494. vold:           DC.B '[************',27,'b1','*  ',27,'b9',']',13,10,0
  495. vole:           DC.B '[************',27,'b1','** ',27,'b9',']',13,10,0
  496. volf:           DC.B '[************',27,'b1','***',27,'b9',']',13,10,0
  497. curs_up:        DC.B 27,'A',27,'A',27,'A',0
  498.  
  499. fault1:         DC.B 27,'E','Datei nicht gefunden...',0
  500. fault2:         DC.B 27,'E','Datei konnte nicht geöffnet werden...',0
  501. fault3:         DC.B 27,'E','Datei konnte nicht korrekt gelesen werden...',0
  502. fault5:         DC.B 27,'E','Fehler bei der Speicherreservierung...',0
  503. ping:           DC.B 7,0
  504.                 EVEN
  505. anz_songs:      DC.W 0
  506.  
  507.                 BSS
  508.                 EVEN
  509. counter:        DS.W 1
  510. resident:       DS.L 1
  511. backgrd:        DS.B 2
  512. saver:          DS.B 40
  513. filename:       DS.B 258
  514. dta:            DS.B 44
  515. graf:           DS.L 1
  516. sound:          DS.L 1
  517.                 END
  518.