
;*****************************************************************
;*
;*  BlitzPlay History
;*
;*  V0:   Initial release
;*
;*****************************************************************

songnumadr.l=?SongNum
maxsongadr.l=?MaxSong
maxsong2adr.l=?MaxSong2
fr_dataadr.l=?fr_data
thxreplayeradr.l=?thxReplayer
qcreplayadr.l=?QCReplay
fucoreplayadr.l=?FUCOReplay

Function.s Check{}
  SHARED maxsong2adr.l
  header$=Left$(Peek.s(Start(0)),4)     ;What's the file header look like?
  If header$="GMOD"                     ;Bugger supporting A or XMOD, I'll let somebody else do it :)
    Function Return "GMOD"              ;Is it a GMOD?
  EndIf                                 ;No, then have another fit.
  If header$="THX"
    Function Return "THX"
  EndIf
  If header$="FUCO"
    If Peek.b(Start(0)+4)=-63
      Function Return "FUCO"
    EndIf
  EndIf
  If header$=""
    Function Return "SID"               ;The only header info I have for PlaySID modules!
  EndIf
  If header$="FORM"
    header$=Left$(Peek.s(Start(0)+8),8) ;What's the file header _really_ look like?
    If header$="EMODEMIC"
      If Peek.w(Start(0)+20)=1
        Function Return "EMOD"
      EndIf
    Else
      If header$="8SVXVHDR"
        If Peek.l(Start(0)+16)=$14
          Function Return "IFF"
        EndIf
      EndIf
    EndIf
  EndIf
  If Left$(header$,3)="MMD"
    Function Return "MED"
  EndIf
  If Peek.w(Start(0))=$4efa             ;Fred ?
    If Peek.w(Start(0)+4)=$4efa         ;InitPlayer
      If Peek.w(Start(0)+8)=$4efa       ;EndPlayer
        If Peek.w(Start(0)+$c)=$4efa    ;FadeMusic
          Function Return "FRED"        ;Module OK
        EndIf
      EndIf
    EndIf
  EndIf                                 ;Module not OK
  If Peek.w(Start(0))=$48e7             ;Whittaker ?
    If Peek.w(Start(0)+$e)=$48e7        ;InitPlayer
      If Peek.w(Start(0)+$1c)=$48e7     ;Interrupt
        If Peek.w(Start(0)+$2a)=$48e7   ;EndPlayer
          If Peek.w(Start(0)+$38)=$48e7
            If Peek.w(Start(0)+$46)=$48e7
              Function Return "DWN"     ;Module OK
            EndIf
          EndIf
        EndIf
      EndIf
    EndIf
  EndIf                                 ;Module not OK
  DecodeModule 0,Start(0)
  If CheckTrackerID(0)
    Function Return "MOD"
  EndIf
  FreeTrackerModule 0
  Function Return ""
End Function

Function.s Begin{name$}
  SHARED numberofjumpadrs.b,modid$,songnumadr.l,thxreplayeradr.l,thxInitPlayer,qcreplayadr.l,sidplaybase.l,sidlen.l,sidadr.l
  SHARED header.l
  success.b=BLoad(name$,0,0,0,2)
  If success=0 Then Function Return " "
  modid$=Check{}
  playadr.l=Start(0)                                    ;Yup, let's go the next step...
  Select modid$
    Case "GMOD"
      Poke.l songnumadr,1
      numberofjumpadrs=(Peek.l(playadr+$C)-$10)/4       ;Number of jump table entries
    Case "SID"
      sidlen.l=Length(0)
      sidadr.l=AllocVec_(sidlen,2)
      If sidadr=0 Then Pop Select:Function Return "File can't be opened!"
      CopyMem_ Start(0),sidadr,sidlen
      EraseAll
      header.l=AllocVec_(4096,2)
      If header=0 Then Pop Select:Function Return "Object could not be loaded."
      sidplaybase.l=OpenLibrary_(Null("playsid.library"),1.1)
      If sidplaybase=0 Then Pop Select:Function Return "sidplay.library v1.1+ NOT found."
      MOVEM.l d0-d7/a0-a6,-(a7)
      GetReg a6,sidplaybase
      JSR -$1e(a6)
      GetReg a6,sidplaybase
      GetReg d0,50
      JSR -$60(a6)
      GetReg a6,sidplaybase
      GetReg a0,Null(name$)
      GetReg a1,header
      JSR -$2a(a6)
      MOVEM.l (a7)+,d0-d7/a0-a6
    Case "IFF"
      EraseAll
      LoadSound 0,name$
    Case "THX"
      MOVEM.l d0-d7/a0-a6,-(a7)
      MOVE.L #0,a0                                      ;auto-allocate public (MEMF_ANY) memory
      MOVE.L #0,a1                                      ;auto-allocate chip  (MEMF_CHIP) memory
      GetReg a2,thxreplayeradr+thxInitPlayer
      JSR (a2)
      MOVEM.l (a7)+,d0-d7/a0-a6
    Case "MED"
      SetMedVolume 63
    Case "MOD"
      TrackerVolume 63
    Case "EMOD"
      MOVEM.l d0-d7/a0-a6,-(a7)
      MOVE.l #63,d0
      MOVE.l #63,d1
      MOVE.l #63,d2
      GetReg a0,qcreplayadr
      JSR $14(a0)
      MOVEM.l (a7)+,d0-d7/a0-a6
    Case ""
      Erase 0
      Pop Select
      Function Return "Not a recognised module!"
  End Select
  Function Return ""
End Function

Function.s CreatorID{}
  SHARED modid$       ;Shouldn't be altered, except by Begin{}!
  id$=modid$
  Select modid$
    Case "GMOD"
      id$=Left$(Peek.s(Start(0)+4),4)
    Case "SID"
      id$="PSID"
    Case "DWN"
      id$="_DW_"
    Case "FRED"
      id$="Fred"
    Case "EMOD"
      id$="QuadraComposer"
    Case "MOD"
      id$=Left$(Peek.s(Start(0)+$438),4)
  End Select
  Function Return id$ ;What program was used to make the file?
End Function

Function.s InitMusic{}
  SHARED numberofjumpadrs.b,modid$,maxsongadr.l,maxsong2adr.l,fr_dataadr.l,thxInitModule,thxreplayeradr.l,qcreplayadr.l
  SHARED sidplaybase.l,sidlen.l,header.l,sidadr.l
  ret$=""
  Select modid$
    Case "GMOD"
      initmusic.l=Start(0)+$10              ;InitMusic offset
      noteplayer.l=Start(0)+$20             ;NotePlayer offset
      If numberofjumpadrs>4
        MOVEM.l d0-d7/a0-a6,-(a7)
        GetReg a0,?GMODnoteplayer           ;Pointer to the noteplayer source
        MOVE.l #0,D0
        GetReg A1,noteplayer                ;Supply module with noteplayer pointer
        JSR (A1)
        MOVEM.l (a7)+,d0-d7/a0-a6
      EndIf
      MOVEM.l d0-d7/a0-a6,-(a7)
      MOVE.l #0,D0
      GetReg A1,initmusic
      JSR (A1)                              ;Initialise the GMOD
      PutReg D0,check.l
      MOVEM.l (a7)+,d0-d7/a0-a6
      If check>0                            ;Did it work?
        ret$=Peek.s(check)
        If ret$="" Then ret$="Undefined Error"
      EndIf                                 ;Nope, then error me purple.
    Case "EMOD"
      MOVEM.l d0-d7/a0-a6,-(a7)
      GetReg a0,Start(0)
      GetReg d0,Length(0)
      GetReg a1,qcreplayadr
      JSR (a1)
      PutReg d0,success.b
      MOVEM.l (a7)+,d0-d7/a0-a6
      If success Then ret$="Error"
    Case "THX"
      MOVEM.l d0-d7/a0-a6,-(a7)
      GetReg a0,Start(0)
      GetReg a2,thxreplayeradr+thxInitModule
      JSR (a2)
      MOVEM.l (a7)+,d0-d7/a0-a6
    Case "SID"
      MOVEM.l d0-d7/a0-a6,-(a7)
      GetReg a6,sidplaybase
      GetReg a0,header
      GetReg a1,sidadr
      GetReg d0,sidlen
      JSR -$36(a6)
      MOVEM.l (a7)+,d0-d7/a0-a6
    Case "FRED"
      Poke.l fr_dataadr.l,Start(0)
      Poke.l maxsongadr,Peek.l(maxsong2adr) ;copy buffer
    Case "MED"
      DecodeMedModule 0,Start(0)
  End Select
  Function Return ret$

.GMODnoteplayer:
  IncBin "bin/note.lib"
End Function

Statement Finish{}
  SHARED songnumadr.l,maxsongadr.l,maxsong2adr.l,modid$,sidplaybase.l,sidadr.l,header.l
  Select modid$
    Case "IFF"
      Free Sound 0
    Case "SID"
      CloseLibrary_ sidplaybase
      FreeVec_ sidadr
      FreeVec_ header
    Case "MED"
      Free MedModule 0
    Case "MOD"
      FreeTrackerModule 0
  End Select
  EraseAll
  Poke.l songnumadr,1
  Poke.l maxsongadr,1
  Poke.l maxsong2adr,1
End Statement

Function.s StartMusic{}
  SHARED modid$,songnumadr.l,thxInitSubSong,thxreplayeradr.l,qcreplayadr.l,fucoreplayadr.l,sidplaybase.l,fr_dataadr.l
  Select modid$
    Case "GMOD"
      startmusic.l=Start(0)+$14       ;StartMusic offset
      MOVEM.l d0-d7/a0-a6,-(a7)
      GetReg d0,Peek.l(songnumadr)
      SUB.l #1,d0
      GetReg A1,startmusic
      JSR (A1)                        ;And now we finally start playing!
      MOVEM.l (a7)+,d0-d7/a0-a6
    Case "EMOD"
      MOVEM.l d0-d7/a0-a6,-(a7)
      GetReg a0,qcreplayadr
      JSR 4(a0)
      MOVEM.l (a7)+,d0-d7/a0-a6
    Case "DWN"
      MOVEM.l d0-d7/a0-a6,-(a7)
      GetReg a0,Start(0)
      JSR (a0)
      MOVEM.l (a7)+,d0-d7/a0-a6
    Case "IFF"
      LoopSound 0,3
    Case "THX"
      MOVEM.l d0-d7/a0-a6,-(a7)
      GetReg d0,Peek.l(songnumadr)    ;subsong
      MOVE.l #0,d1                    ;play immediately
      GetReg a2,thxreplayeradr+thxInitSubSong
      JSR (a2)
      MOVEM.l (a7)+,d0-d7/a0-a6
    Case "SID"
      MOVEM.l d0-d7/a0-a6,-(a7)
      GetReg a6,sidplaybase
      GetReg d0,Peek.l(songnumadr)
      JSR -$3c(a6)
      PutReg d0,err.l
      MOVEM.l (a7)+,d0-d7/a0-a6
      If err=-3 Then Pop Select:Finish{}:Function Return "Could NOT allocate CIAA timer."
    Case "FUCO"
      MOVEM.l d0-d7/a0-a6,-(a7)
      GetReg a0,Start(0)
      GetReg a1,fucoreplayadr
      JSR (a1)
      MOVEM.l (a7)+,d0-d7/a0-a6
    Case "FRED"
      MOVEM.l d0-d7/a0-a6,-(a7)
      GetReg d0,Peek.l(songnumadr)-1
      GetReg a0,Peek.l(fr_dataadr)
      JSR (a0)                        ;Init Sound
      MOVEM.l (a7)+,d0-d7/a0-a6
    Case "MED"
      StartMedModule 0
    Case "MOD"
      success.b=StartTracker(0)
      If success=0
        Pop Select
        Function Return "Not a valid module!"
      EndIf
  End Select
  Function Return ""
End Function

Statement StopMusic{}
  SHARED modid$,fr_dataadr.l,thxStopSong,thxreplayeradr.l,qcreplayadr.l,fucoreplayadr.l,sidplaybase.l
  Select modid$
    Case "GMOD"
      stopmusic.l=Start(0)+$18  ;StopMusic offset
      MOVEM.l d0-d7/a0-a6,-(a7)
      GetReg A1,stopmusic       ;Enough of that noise!
      JSR (A1)                  ;Just stop, stop it, leave me alone!
      MOVEM.l (a7)+,d0-d7/a0-a6
    Case "SID"
      MOVEM.l d0-d7/a0-a6,-(a7)
      GetReg a6,sidplaybase
      JSR -$42(a6)
      MOVEM.l (a7)+,d0-d7/a0-a6
    Case "IFF"
      Volume 3,0
    Case "FRED"
      MOVEM.l d0-d7/a0-a6,-(a7)
      MOVEQ #0,d1
      GetReg a0,Peek.l(fr_dataadr)
      JSR 8(a0)                 ;End Sound
      MOVEQ #0,d0
      LEA $dff000,a0
      MOVE.w d0,$a8(a0)
      MOVE.w d0,$b8(a0)
      MOVE.w d0,$c8(a0)
      MOVE.w d0,$d8(a0)
      MOVE.w #$f,$96(a0)
      MOVEM.l (a7)+,d0-d7/a0-a6
    Case "DWN"
      MOVEM.l d0-d7/a0-a6,-(a7)
      GetReg a0,Start(0)
      JSR $1c(a0)
      MOVEM.l (a7)+,d0-d7/a0-a6
    Case "EMOD"
      MOVEM.l d0-d7/a0-a6,-(a7)
      GetReg a0,qcreplayadr
      JSR $c(a0)
      MOVEM.l (a7)+,d0-d7/a0-a6
    Case "FUCO"
      MOVEM.l d0-d7/a0-a6,-(a7)
      GetReg a0,fucoreplayadr
      JSR 8(a0)
      MOVEM.l (a7)+,d0-d7/a0-a6
    Case "THX"
      MOVEM.l d0-d7/a0-a6,-(a7)
      GetReg a2,thxreplayeradr+thxStopSong
      JSR (a2)
      MOVEM.l (a7)+,d0-d7/a0-a6
    Case "MED"
      StopMed
    Case "MOD"
      PauseModule
  End Select
End Statement

Statement EndMusic{}
  SHARED modid$,thxKillPlayer,thxreplayeradr.l,qcreplayadr.l,sidplaybase.l
  Select modid$
    Case "GMOD"
      endmusic.l=Start(0)+$1C ;EndMusic offset
      MOVEM.l d0-d7/a0-a6,-(a7)
      GetReg A1,endmusic
      JSR (A1)                ;A neat'n'tidy cleanup.
      MOVEM.l (a7)+,d0-d7/a0-a6
    Case "SID"
      MOVEM.l d0-d7/a0-a6,-(a7)
      GetReg a6,sidplaybase
      JSR -$24(a6)
      MOVEM.l (a7)+,d0-d7/a0-a6
    Case "EMOD"
      MOVEM.l d0-d7/a0-a6,-(a7)
      GetReg a0,qcreplayadr
      JSR $10(a0)
      MOVEM.l (a7)+,d0-d7/a0-a6
    Case "THX"
      MOVEM.l d0-d7/a0-a6,-(a7)
      GetReg a2,thxreplayeradr+thxKillPlayer
      JSR (a2)
      MOVEM.l (a7)+,d0-d7/a0-a6
    Case "MOD"
      StopTracker
  End Select
End Statement

Function.b ContinueMusic{}
  SHARED numberofjumpadrs,modid$
  success.b=0
  Select modid$
    Case "GMOD"
      continuemusic.l=Start(0)+$24
      If numberofjumpadrs>5
        MOVEM.l d0-d7/a0-a6,-(a7)
        MOVE.l #0,D0
        GetReg A1,continuemusic
        JSR (A1)
        PutReg D0,success
        MOVEM.l (a7)+,d0-d7/a0-a6
      EndIf
    Case "IFF"
      Volume 3,63
    Case "MOD"
      PauseModule
      success=True
    Default
      If StartMusic{}="" Then success=True
  End Select
  Function Return success
End Function

Function.b TimerModes{}
  SHARED modid$
  timermodes.b=0
  Select modid$
    Case "GMOD"
      vblank50.l=Start(0)+$28         ;VBlank50 offset
      vblank60.l=Start(0)+$2C         ;VBlank60 offset
      timertick.l=Start(0)+$50        ;TimerTick offset
      tempnumber1.w=Peek.w(vblank50)  ;Which tempos are supported?
      tempnumber2.w=Peek.w(vblank60)
      tempnumber3.w=Peek.w(timertick)
      If tempnumber1<>$4E75 Then timermodes+1
      If tempnumber2<>$4E75 Then timermodes+2
      If tempnumber3<>$4E75 Then timermodes+4
    Default
      timermodes=3
  End Select
  Function Return timermodes
End Function

Function.b Interrupt{}
  SHARED modid$,thxInterrupt,thxreplayeradr.l,qcreplayadr.l,fucoreplayadr.l,fr_dataadr.l
  success=True
  Select modid$
    Case "FRED"
      MOVEM.l d0-d7/a0-a6,-(a7)
      GetReg a0,Peek.l(fr_dataadr)
      JSR 4(a0) ;DudelDiDum
      MOVEM.l (a7)+,d0-d7/a0-a6
    Case "EMOD"
      MOVEM.l d0-d7/a0-a6,-(a7)
      GetReg a0,qcreplayadr
      JSR 8(a0)
      MOVEM.l (a7)+,d0-d7/a0-a6
    Case "FUCO"
      MOVEM.l d0-d7/a0-a6,-(a7)
      GetReg a0,fucoreplayadr
      JSR 4(a0)
      MOVEM.l (a7)+,d0-d7/a0-a6
    Case "THX"
      MOVEM.l d0-d7/a0-a6,-(a7)
      GetReg a2,thxreplayeradr+thxInterrupt
      JSR (a2)
      MOVEM.l (a7)+,d0-d7/a0-a6
    Case "DWN"
      MOVEM.l d0-d7/a0-a6,-(a7)
      GetReg a0,Start(0)
      JSR $e(a0)
      MOVEM.l (a7)+,d0-d7/a0-a6
    Case "MED"
      PlayMed
  End Select
  Function Return success
End Function

Function.b Vblank50{}
  SHARED numberofjumpadrs,modid$
  success.b=0
  Select modid$
    Case "GMOD"
      vblank50.l=Start(0)+$28 ;VBlank50 offset
      If numberofjumpadrs>6
        MOVEM.l d0-d7/a0-a6,-(a7)
        GetReg A1,vblank50    ;Actually PLAYS the MOD :)
        JSR (A1)
        MOVEM.l (a7)+,d0-d7/a0-a6
        success=True
      EndIf
    Default
      success=Interrupt{}
  End Select
  Function Return success
End Function

Function.b Vblank60{}
  SHARED numberofjumpadrs,modid$
  success.b=0
  Select modid$
    Case "GMOD"
      vblank60.l=Start(0)+$2C ;VBlank60 offset
      If numberofjumpadrs>7
        MOVEM.l d0-d7/a0-a6,-(a7)
        GetReg A1,vblank60    ;Actually PLAYS the MOD :)
        JSR (A1)
        MOVEM.l (a7)+,d0-d7/a0-a6
        success=True
      EndIf
    Default
      success=Interrupt{}
  End Select
  Function Return success
End Function

Function.b Channel0{}
  SHARED numberofjumpadrs,modid$
  Select modid$
    Case "GMOD"
      channel0.l=Start(0)+$30
      If numberjumpadrs>8
        MOVEM.l d0-d7/a0-a6,-(a7)
        GetReg A1,channel0
        JSR (A1)
        MOVEM.l (a7)+,d0-d7/a0-a6
        Pop Select
        Function Return True
      EndIf
  End Select
  Function Return False
End Function

Function.b Channel1{}
  SHARED numberofjumpadrs,modid$
  Select modid$
    Case "GMOD"
      channel1.l=Start(0)+$34
      If numberjumpadrs>9
        MOVEM.l d0-d7/a0-a6,-(a7)
        GetReg A1,channel1
        JSR (A1)
        MOVEM.l (a7)+,d0-d7/a0-a6
        Pop Select
        Function Return True
      EndIf
  End Select
  Function Return False
End Function

Function.b Channel2{}
  SHARED numberofjumpadrs,modid$
  Select modid$
    Case "GMOD"
      channel2.l=Start(0)+$38
      If numberjumpadrs>10
        MOVEM.l d0-d7/a0-a6,-(a7)
        GetReg A1,channel2
        JSR (A1)
        MOVEM.l (a7)+,d0-d7/a0-a6
        Pop Select
        Function Return True
      EndIf
  End Select
  Function Return False
End Function

Function.b Channel3{}
  SHARED numberofjumpadrs,modid$
  Select modid$
    Case "GMOD"
      channel3.l=Start(0)+$3C
      If numberjumpadrs>11
        MOVEM.l d0-d7/a0-a6,-(a7)
        GetReg A1,channel3
        JSR (A1)
        MOVEM.l (a7)+,d0-d7/a0-a6
        Pop Select
        Function Return True
      EndIf
  End Select
  Function Return False
End Function

Function.l GetNumSongs{}
  SHARED numberofjumpadrs,modid$,maxsongadr.l,thxreplayeradr.l,thxBSS_P,thx_pSubsongs,header.l
  success.l=1
  Select modid$
    Case "GMOD"
      getnumsongs.l=Start(0)+$40
      If numberofjumpadrs>12
        MOVEM.l d0-d7/a0-a6,-(a7)
        MOVE.l #1,D0
        GetReg A1,getnumsongs
        JSR (A1)
        PutReg D0,success
        MOVEM.l (a7)+,d0-d7/a0-a6
      EndIf                                                   ;get ptr to
    Case "THX"                                                ;players public memory
      success=Peek.b(thxreplayeradr+thxBSS_P+thx_pSubsongs)   ;and get nr.  of
    Case "FRED"                                               ;subsongs from there
      success=Peek.l(maxsongadr)
    Case "SID"
      success=Peek.w(header+$e)                               ;I *think* this is right :)
  End Select
  Function Return success
End Function

Statement SetSongNum{success.l}
  SHARED songnumadr.l
  Poke.l songnumadr,success
End Statement

Function.s GetSongName{}
  SHARED numberofjumpadrs,modid$,songnumadr.l,header.l
  songname$=""
  Select modid$
    Case "GMOD"
      getsongname.l=Start(0)+$44  ;GetSongName offset
      If numberofjumpadrs>13      ;Checking to see if these functions actually exist!
        MOVEM.l d0-d7/a0-a6,-(a7)
        GetReg d0,Peek.l(songnumadr)
        SUB.l #1,d0
        GetReg A1,getsongname
        JSR (A1)                  ;Is the song named?
        PutReg D0,check.l
        MOVEM.l (a7)+,d0-d7/a0-a6
        If check>0                ;Apparently it is.
          songname$=Peek.s(check)
        EndIf
      EndIf
    Case "SID"
      songname$=Peek.s(header+$16)
    Case "MOD"
      songname$=GetModuleName$(0)
  End Select
  Function Return songname$
End Function

Function.s GetSongAuthor{}
  SHARED numberofjumpadrs,modid$,header
  songauthor$=""
  Select modid$
    Case "GMOD"
      getsongauthor.l=Start(0)+$48  ;GetSongAuthor offset
      If numberofjumpadrs>14
        MOVEM.l d0-d7/a0-a6,-(a7)
        GetReg d0,Peek.l(SongNum)
        SUB.l #1,d0
        GetReg A1,getsongauthor
        JSR (A1)                    ;Have they given us an author name?
        PutReg D0,check.l
        MOVEM.l (a7)+,d0-d7/a0-a6
        If check>0                  ;Sure have!
          songauthor$=Peek.s(check)
        EndIf
      EndIf
    Case "SID"
      songauthor$=Peek.s(header+$36)
    Case "FRED"
      songauthor$="Frederic Hahn"
    Case "DWN"
      songauthor$="Dave Whittaker"
  End Select
  Function Return songauthor$
End Function

Function.b GetFrequency{}
  SHARED numberofjumpadrs,modid$
  success.b=False
  Select modid$
    Case "GMOD"
      getfrequency.l=Start(0)+$4C
      If numberofjumpadrs>15
        MOVEM.l d0-d7/a0-a6,-(a7)
        MOVE.l #0,D0
        GetReg A1,getfrequency
        JSR (A1)
        PutReg D0,success
        MOVEM.l (a7)+,d0-d7/a0-a6
      EndIf
  End Select
  Function Return success
End Function

Function.b TimerTick{}
  SHARED numberofjumpadrs,modid$
  Select modid$
    Case "GMOD"
      timertick.l=Start(0)+$50  ;TimerTick offset
      If numberofjumpadrs>16
        MOVEM.l d0-d7/a0-a6,-(a7)
        GetReg A1,timertick     ;Actually PLAYS the MOD :)
        JSR (A1)
        MOVEM.l (a7)+,d0-d7/a0-a6
        Pop Select
        Function Return True
      EndIf
  End Select
  Function Return False
End Function

Function.s GetMakerName{}
  SHARED numberofjumpadrs,modid$
  title$=""
  Select modid$
    Case "GMOD"
      getmakername.l=Start(0)+$54 ;GetMakerName offset
      If numberofjumpadrs>17
        MOVEM.l d0-d7/a0-a6,-(a7)
        MOVE.l #0,D0
        GetReg A1,getmakername
        JSR (A1)                  ;And what helped create this song?
        PutReg D0,check.l
        MOVEM.l (a7)+,d0-d7/a0-a6
        If check>0
          title$=Peek.s(check)
        EndIf
      EndIf
    Case "FRED"
      title$="FredMonitor"
    Case "EMOD"
      title$="QuadraComposer 2.1"
    Case "FUCO"
      title$="Future Composer v1.02"
  End Select
  Function Return title$
End Function

Function.l Hook{HookFlags.l,HookStructure.l}
  SHARED numberofjumpadrs,modid$
  success.l=0
  Select modid$
    Case "GMOD"
      hook.l=Start(0)+$58
      If numberofjumpadrs>18
        MOVEM.l d0-d7/a0-a6,-(a7)
        MOVE.l #0,D0
        GetReg D1,HookFlags
        GetReg A0,HookStructure
        GetReg A1,hook
        JSR (A1)
        PutReg D0,success
        MOVEM.l (a7)+,d0-d7/a0-a6
      EndIf
  End Select
  Function Return success
End Function

Function.b Jump{Position.l}
  SHARED numberofjumpadrs,modid$
  success.b=0
  Select modid$
    Case "GMOD"
      jump.l=Start(0)+$5C
      If numberofjumpadrs>19
        MOVEM.l d0-d7/a0-a6,-(a7)
        MOVE.l #0,D0
        GetReg D1,Position
        GetReg A1,jump
        JSR (A1)
        PutReg D0,success
        MOVEM.l (a7)+,d0-d7/a0-a6
      EndIf
    Case "MED"
      JumpMed Position
      success=True
    Case "MOD"
      ModulePositionJump Position
      success=True
  End Select
  Function Return success
End Function

Function.b SetVolume{Left.l,Right.l}
  SHARED numberofjumpadrs,modid$,thx_pMainVolume,thxreplayeradr.l,thxBSS_P,qcreplayadr.l
  success.b=0
  Select modid$
    Case "GMOD"
      setvolume.l=Start(0)+$60
      If numberofjumpadrs>20
        MOVEM.l d0-d7/a0-a6,-(a7)
        GetReg D0,Left
        GetReg D1,Right
        GetReg A1,setvolume
        JSR (A1)
        MOVEM.l (a7)+,d0-d7/a0-a6
        success=True
      EndIf
;    Case "FRED"
;      success=True
;      MOVEM.l d0-d7/a0-a6,-(a7)
;      MOVE.l fr_data(pc),a0
;      JSR 12(a0)  ;Seems to fade the music, there might be some other registers to effect it that I don't know about
;      MOVEM.l (a7)+,d0-d7/a0-a6
    Case "EMOD"
      MOVEM.l d0-d7/a0-a6,-(a7)
      GetReg d2,((Left/4)+(Right/4))/2
      GetReg a0,qcreplayadr
      JSR $14(a0)
      MOVEM.l (a7)+,d0-d7/a0-a6
    Case "IFF"
      Volume 1,Left/4
      Volume 2,Right/4
    Case "THX"
      success=True
      Poke.b thxreplayeradr+thxBSS_P+thx_pMainVolume,((Left/4)+(Right/4))/2
    Case "MOD"
      TrackerVolume ((Left/4)+(Right/4))/2
      success=True
    Case "MED"
      SetMedVolume ((Left/4)+(Right/4))/2
      success=True
  End Select
  Function Return success
End Function

Function.s GetScroll{}
  SHARED numberofjumpadrs,modid$  ;Look, but don't touch!
  success$=""
  Select modid$
    Case "GMOD"
      getscroll.l=Start(0)+$64
      If numberofjumpadrs>21
        MOVEM.l d0-d7/a0-a6,-(a7)
        GetReg A1,getscroll
        JSR (A1)
        PutReg D0,check.l
        MOVEM.l (a7)+,d0-d7/a0-a6
        If check>0
          success$=Peek.s(check)
        EndIf
      EndIf
    Case "MOD"
      For success.b=0 To 30
        If ModuleSampleName(0,success)<>""
          success$+ModuleSampleName(0,success)+" "
        EndIf
      Next
  End Select
  Function Return success$
End Function

Goto endincludesource

.thxReplayer:
  IncBin "bin/THX-Replayer.BIN"

.QCReplay:
  IncBin "bin/QuadraComposer.bin"

.FUCOReplay:
  IncBin "bin/FutureComposer.bin"

.SongNum:
  Dc.l 1

.MaxSong:
  Dc.l 1

.MaxSong2:
  Dc.l 1

.fr_data:
  Dc.l 0

Dc.b "$VER: BlitzPlay v0 1997 Toby Zuijdveld"
Even

.endincludesource:

;*****************************************************************
;*  The End
;*****************************************************************

