ok, juz mam, w plikach DOC dolaczonych do TMC111 byla odpowiednia informacja
a to efekt, relocator TMC 111 w postaci makra do MADS'a, tyle ze dziala dopiero od wersji 1.6.8 MADS'a :)
/*
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
*/
.macro tmc_relocator
.get :1 // wczytaj plik do bufora MADS'a
new_add equ :2 // nowy adres modulu TMC
old_add equ .get[2] + .get[3]<<8 // stary adres modulu TMC
length equ .get[4] + .get[5]<<8 - 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 pliku TMC
.put[5] = .hi(new_add + length - 1)
ofs equ 6
fps equ .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+.r] + .get[ofs+$60+.r]<<8
ift ?tmp <> 0
?hlp = ?tmp - old_add + new_add
.put[ofs+$20+.r] = .lo(?hlp)
.put[ofs+$60+.r] = .hi(?hlp)
eif
.endr
// patterns
.rept 128
?tmp = .get[ofs+$00a0+.r] + .get[ofs+$0120+.r]<<8
?hlp = ?tmp - old_add + new_add
.put[ofs+$00a0+.r] = .lo(?hlp)
.put[ofs+$0120+.r] = .hi(?hlp)
.endr
// out new file
; .sav 'test.tmc',length + 6 // zapisujemy zawartosc bufora MADS'a do pliku
.endm
takie makro ulatwia zycie, nie trzeba uruchamiac TMC aby zmienic adres modulu, ktory pozniej polaczymy z naszym programem, wiecej przykladow zastosowania tego makra bedzie w nastepnej paczce z MADS'em