
/*
  MPT Relocator

  $0000..$003F	- 32 adresy brzmien (LSB/MSB), bajty $00,$00 oznaczaja ze dane brzmienie jest puste
  $0040..$00BF	- 64 adresy patternow (LSB/MSB), bajty $00,$00 oznaczaja ze dany pattern jest pusty
  $01C0..$01C3	- mlodsze bajty adresow trackow
  $01C4..$01C7	- starsze bajty adresow trackow
  $01C8..$01C8	- dlugosc patternow (wartosci - $10,$20,$30 lub $40)
  $01C9..$01C9	- tempo utworu

  Example:
		mpt_relocator 'file.mpt' , new_address
*/

.macro	mpt_relocator

	.get :1					// wczytujemy plik do bufora MADS'a

	ift (.wget[0]) <> $FFFF
	 ert 'Bad file format'
	eif

new_add equ :2					// nowy adres dla modulu MPT

old_add	equ .wget[2]				// stary adres modulu MPT

	.def ?length = .wget[4] - old_add + 1	// dlugosc pliku MPT bez naglowka DOS'u

	.put[2] = .lo(new_add)			// poprawiamy naglowek DOS'a
	.put[3] = .hi(new_add)			// tak aby zawieral informacje o nowym

	.put[4] = .lo(new_add + ?length - 1)	// adresie modulu MPT
	.put[5] = .hi(new_add + ?length - 1)

ofs	equ 6

	.def ?lenpat	= .get[ofs+$1c8]
	.def ?speed	= .get[ofs+$1c9]

// instruments

	.rept 32

	?tmp = .wget[ofs+#*2]

	ift ?tmp <> 0
	?hlp = ?tmp - old_add + new_add

	.put[ofs+#*2]   = .lo(?hlp)
	.put[ofs+#*2+1] = .hi(?hlp)
	eif

	.endr

// patterns

	.rept 64

	?tmp = .wget[ofs+$40+#*2]

	ift ?tmp <> 0
	?hlp = ?tmp - old_add + new_add

	.put[ofs+$40+#*2]   = .lo(?hlp)
	.put[ofs+$40+#*2+1] = .hi(?hlp)
	eif

	.endr

// 4 tracks

	.rept 4

	?tmp = .get[ofs+$1c0+#] + .get[ofs+$1c4+#]<<8

	ift ?tmp <> 0
	?hlp = ?tmp - old_add + new_add

	.put[ofs+$1c0+#] = .lo(?hlp)
	.put[ofs+$1c4+#] = .hi(?hlp)
	eif

	.endr

// out new file

;	.sav 'test.mpt',?length + 6			// zapisujemy zawartosc bufora MADS'a do pliku

.endm
