
/*
  TMC111 Relocator

  $0000..$001C	- bajty informacyjne
  $001D		- musi byc tu zawsze spacja ($20)
  $001E		- tempo, jest to wartosc o jeden mniejsza niz w CMC, MPT lub Delcie
  $001F		- czestotliwosc odtwarzenia na ramke
  $0020..$005F	- mlodsze bajty adresow instrumentow
  $0060..$009F	- starsze bajty adresow instrumentow (jezeli po zORowaniu daja 0, to znaczy, ze dzwiek jest pusty)
  $00A0..$011F	- mlodsze bajty adresow patternow
  $0120..$019F	- starsze bajty adresow patternow

  Example:
		tmc_relocator 'file.tmc' , new_address
*/


.macro	tmc_relocator

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

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

new_add	equ :2						// nowy adres modulu TMC

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

	.def ?length = .wget[4]- old_add + 1		// dlugosc pliku TMC 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 TMC
	.put[5] = .hi(new_add + ?length - 1)

ofs	equ 6

	.def fps = .get[ofs+$1f]			// liczba wywolana playera na ramke

	?tmp = .get[ofs+$20] + .get[ofs+$60]<<8		// sprawdzamy adres pierwszego instrumentu

	ift ?tmp = 0					// jesli adres = 0 tzn ze plik jest pusty
	 ert 'Song is empty'
	eif

// instruments

	.rept 64

	?tmp = .get[ofs+$20+#] + .get[ofs+$60+#]<<8

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

	.put[ofs+$20+#] = .lo(?hlp)
	.put[ofs+$60+#] = .hi(?hlp)
	eif

	.endr

// patterns

	.rept 128

	?tmp = .get[ofs+$00a0+#] + .get[ofs+$0120+#]<<8

	?hlp = ?tmp - old_add + new_add

	.put[ofs+$00a0+#] = .lo(?hlp)
	.put[ofs+$0120+#] = .hi(?hlp)

	.endr

// out new file

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

.endm
