@RomanWorkshop, post #1
@asman, post #3
move.l 4.w,A6 ;adres bazowy biblioteki Exec moveq #0,D0 lea INT(pc),A1 ;nazwa biblioteki Intuition jsr -552(A6) ;otwiera bibliotekę Intuition (funkcja Exec:OpenLibrary) move.l D0,A1 ;adres bazowy biblioteki Intuition jsr -414(A6) ;zamyka bibliotekę Intuition (funkcja Exec:CloseLibrary) lea OKI(pc),A0 move.l A0,BUT move.l #-276,A0 ;numer funkcji do zamiany (Intuition:SetWindowTitles) lea PRO(pc),A2 move.l A2,D0 ;adres nowej funkcji move.l A2,BUF jsr -420(A6) ;zamienia starą funkcję na nową (funkcja Exec:SetFunction) move.l D0,BUF ;adres starej funkcji LOP: bra.s LOP PRO: move.l BUT,A2 ;adres tekstu do wyświetlenia na belce aktywnego ekranu dc.w $4EF9 ;skok pod adres starej funkcji (Intuition:SetWindowTitles) BUF: dc.l 0 INT: dc.b "intuition.library",0 OKI: dc.b "New name of every active screen",0 BUT: dc.l 0
@RomanWorkshop, post #5
@Hexmage960, post #6
@RomanWorkshop, post #7
- Program musi ciągle działać. Co mi da użycie funkcji Wait() i sprawdzanie sygnałów?
- Jak się mam do niego odwoływać? Adres funkcji Intuition:SetWindowTitles jest stały po uruchomieniu WB, chyba że inny program go zmienia.
- Nie ma potrzeby, aby biblioteka Intuition pozostawała otwarta. Zamykam ją po uzyskaniu jej adresu bazowego, który również jest stały. Bibliotekę zamykam, bo w zamyśle program będzie się wyłączał, pozostawiając jedynie w pamięci podmienioną funkcję SetWindowTitles.
- Tak wiem o tym, przetestuje to na różnych Kickstartach. Dokumentacja nic o tym nie mówi więc, jeśli rejestr A1 raz pozostaje niezmieniony, to zakładam że będzie tak zawsze na danym Kickstarcie.
@RomanWorkshop, post #9
Czyli mam wyzerować rejestr D0, wywołać funkcję Exec:Wait i wtedy program będzie zajmował mniej czasu procesora?
Którą dokumentację masz na myśli?
@Hexmage960, post #10
@RomanWorkshop, post #12
Ale, jeśli program ma działać w nieskończoność, czyli żadne sygnały nie mogą go przerywać, to czy użycie funkcji Wait(0) spowoduje zmniejszenie obciążenia procesora tym programem?
Nie bardzo rozumiem, jaki warunek i gdzie?
; Program główny: ... jsr _LVOSetFunction(a6) move.l d0, funkcja ... ; Zamiennik funkcji: nowa_funkcja: move.l funkcja,d0 beq .zero movea.l d0,a0 jmp (a0) .zero: rts funkcja: dc.l 0
@Hexmage960, post #13
@RomanWorkshop, post #14
Można i tak, ale jeśli jakiś program wywoła moją funkcję z takim warunkiem w czasie, gdy bufor z adresem będzie pusty, to w efekcie zmiana nazwy na belce nigdy nie nastąpi (RTS). W moim rozwiązaniu nastąpi tuż po zapisaniu adresu w buforze (do tego czasu będą wykonywane skoki na początek mojej funkcji). Jednak są to skrajne przypadki.
Jeszcze interesuje mnie, jak sprawdzić że mój program został już uruchomiony i przykładowo, zainstalował odpowiednie procedury w pamięci? Chodzi o to, żeby nie zajmować niepotrzebnie pamięci.
@Hexmage960, post #15
@RomanWorkshop, post #16
move.l 4.w,A6 ;adres bazowy biblioteki Exec
moveq #0,D0
lea INT(pc),A1 ;nazwa biblioteki Intuition
jsr -552(A6) ;otwiera bibliotekę Intuition (funkcja Exec:OpenLibrary)
move.l D0,D7
move.l D0,A1 ;adres bazowy biblioteki Intuition
lea OKI(pc),A0
move.l A0,BUT
move.l #-276,A0 ;numer funkcji do zamiany (Intuition:SetWindowTitles)
lea PRO(pc),A2
move.l A2,D0 ;adres nowej funkcji
jsr -132(A6) ;wyłącza multitasking (funkcja Exec:Forbid)
jsr -420(A6) ;zamienia starą funkcję na nową (funkcja Exec:SetFunction)
move.l D0,BUF ;adres starej funkcji
jsr -636(A6) ;czyści pamięć cache procesora (funkcja Exec:CacheClearU)
jsr -138(A6) ;włącza multitasking (funkcja Exec:Permit)
move.l D7,A1
jsr -414(A6) ;zamyka bibliotekę Intuition (funkcja Exec:CloseLibrary)
LOP: bra.s LOP
PRO:
move.l BUT,A2 ;adres tekstu do wyświetlenia na belce aktywnego ekranu
dc.w $4EF9
BUF: dc.l 0 ;skok pod adres starej funkcji (Intuition:SetWindowTitles)
INT: dc.b "intuition.library",0
OKI: dc.b "New name of every active screen",0
BUT: dc.l 0