Time Master v1.0 Public Domain 1996 Spotkaîeô sië juû zapewne z programami, których zadaniem jest "siedzenie" w pamiëci i wykonywanie w tym czasie uûytecznych zadaï. Czy byî to program pakujâcy w tle wszystkie pliki za pomocâ algorytmu ByteRun1, czy obsîugujâcy zapis danych na magnetofonie MK 232P Automatic podîâczonym do zîâcza IDE, moûe nawet sterujâcy jakimô urzâdzeniem zewnëtrznym (np. pralka). Niestety, niektóre z posiadanych przez Ciebie programów tego typu to tzw. Demo Versions, charakteryzujâce sië okreôlonym czasem przydatnoôci (zwykle okoîo 15 minut), po którym znikajâ z listy tasków Execa (ewentualnie wyôwietlajâ jakieô niesîychanie interesujâce informacje). Jeûeli tak jest, moûesz potrzebowaê tego programu. Oczywiôcie problem zwiâzany z czasowym dziaîaniem tych kawaîków softu moûna rozwiâzaê w inny sposób, np. poprzez skrypt uruchamiajâcy dany program co 15 minut, jednakûe nie zapewnia to ich pewnego dziaîania (pralka musi byê sterowana w sposób ciâgîy). Ten program robi to inaczej - "troszkë" przedîuûa "czas próby" (sto trzydzieôci lat z hakiem). Ostrzegam jednak, ûe posîugiwanie sië tym programem moûe byê nieco trudne, wymaga pewnej wiedzy o systemie operacyjnym Amigi oraz moûe prowadziê do frustracji autorów rzeczonych programów (ja bym sië zdenerwowaî). Nie jestem prawnikiem, ale sâdzë, ûe wykorzystywanie TimeMastera nie jest niezgodne z prawem. Nie narusza bowiem integralnoôci samego programu. Jedynâ rzeczâ którâ robi TimeMaster jest podwieszanie sië pod wektory systemu operacyjnego, a jest to jak najbardziej legalne. Co do problemów moralnych - majâ one zazwyczaj priorytet niûszy od finansowych, ale jeûeli skonfigurowaîeô sobie ûycie inaczej (..musiaîo Cië na to staê..), to masz niezbywalne prawo niekorzystania z tego programu. Moûesz dodatkowo czuê wyûszoôê moralnâ nad jego autorem. Wymagania: - system 3.0 (V39) - biblioteka patch.library V4 System 3.0, poniewaû program uûywa funcji CreatePool etc. Dziëki temu system nie jest zwalniany przez normalne funkcje pamiëciowe za kaûdym razem, gdy trzeba coô zapamiëtaê podczas operacji OpenDevice(), CloseDevice() i BeginIO(). Biblioteka patch.libarary, gdyû zapewnia proste instalowanie i USUWANIE procedur patchujâcych. Przejdúmy do konkretów. Wszelkie pomiary czasu na Amidze dokonywane przez kulturalne programy odbywajâ sië za pomocâ timer.device (BARDZO niewiele korzysta bezpoôrednio z hardware), z wykorzystaniem komendy TR_ADDREQUEST. Takimi wîaônie programami moûe zajmowaê sië TimeMaster (no cóû, niektóre robiâ to za pomocâ innych komend, ale one zasîugujâ na to, aby ich nie oszukiwaê :-). Wszystko natomiast, co on robi, to podmienienie wartoôci czasu w IORequest (a wîaôciwie TimeRequest) wysyîanym do timer.device. Uruchomienie: Run <>NIL: TimeMaster lub z Workbencha. Jeûeli zostanie on uruchomiony bez ûadnego parametru, listë tasków do ogîupienia odczyta z pliku 'S:TimeMaster.tasks'. Jeûeli zostanie podany jakiô argument, bëdzie on potraktowany jako nazwa pliku, z którego naleûy wczytaê listë tasków. We wspomnianym wyûej pliku kaûdemu taskowi przysîuguje jedna linijka. Wyglâda to np. tak: PatchRun1 co mówi TimeMasterowi, ûe we WSZYSTKIE odwoîania tego programu naleûy przedîuûyê. W wypadku wspomnianego wyûej programu moûna tak postâpiê, poniewaû proôba o opóúnienie jest najprawdopodobniej jedynym odwoîaniem do timer.device. Nieco inaczej sprawa ma sië z urzâdzeniami (devices). Bardzo czësto uûywajâ one bowiem timer.device do opóúnieï zwiâzanych ze sprzëtem (np. rozpëdzenie sië gîowicy magnetofonu). Poniewaû jednak muszâ one byê dokîadne, uûywajâ raczej innego unita co do opóúnienia kilkunastominutowego (UNIT_VBLANK=1, o rozdzielczoôci 1/50 sekundy), a innego do bardziej dokîadnych (UNIT_MICROHZ, UNIT_ECLOCK). TimeMaster zezwala na podanie konkretnego unita, którego IORequesty ma podmieniaê (patrz Uwaga3!): mk232p.device 1 W przypadku, gdyby jednak program uûywaî UNIT_VBLANK takûe do innych celów niû nasze opóúnienie (np. wîâczanie i wyîâczanie pralki co 5 minut - do tego celu wystarczy dokîadnoôê VBlank), argumentem który takûe moûesz podaê, jest wartoôê czasowa podana w sekundach, którâ naleûy zastâpiê przez $FFFFFFFF lub innâ wartoôê (patrz dalej - w tym przypadku 900 - 15 minut): PowerFrania 1 900 W wyborze odpowiedniej wartoôci do podmiany moûe pomóc DevMon. A gdyby uûyê TimeMastera do przedîuûania czasu prania? Po czasie 'do podmienienia' naleûy podaê czas 'do wstawienia' (takûe dziesiëtnie!): PowerFrania 1 3600 7200 a wiëc zmieniliômy czas z jednej godziny na dwie. Jeûeli chcesz wstawiaê konkretny czas zamiast wszystkich proponowanych przez ogîupiany program, naleûy wstawiê zero w czasie 'do podmiany': random.device 1 0 1800 Plik moûe wiëc wyglâdaê tak: ' <- tego w pilku nie ma byê! mk232p.device 1 PatchRun1 PowerFrania 1 900 random.device 1 0 1800 ramlib 1 ' <- tego w pilku nie ma byê! Co znaczy 'ramlib 1'? Patrz na Uwagë nr 3! UWAGA1: Uwaûaj na nazwë taska! - najlepiej uruchom program tak, jak go zazwyczaj bëdziesz uruchamiaî i wtedy sprawdú jego nazwë (np. programem ARTM). W zaleûnoôci od tego, czy uruchomiîeô go w User-Startup'ie, WBStartup'ie czy jeszcze inaczej, moûe ona wyglâdaê inaczej. Np. jeûeli uruchamiasz program poprzez jego argument, którego ikona ma wpisane w polu Default Tooltype 'Work:MojeHobby/PowerFrania', to to bëdzie nazwâ taska, a nie 'PowerFrania'!!!. Jeûeli wiesz jak, moûesz uûyê programu DevMon. - sprawdú wtedy pisownië maîych/duûych liter!. TimeMaster jest programikiem w asemblerze, i nie chciaîo mi sië pisaê procedur porównujâcych case-insensitive, poza tym porównywanie zabraîoby wiëcej czasu (nie mówiâc juû o uûyciu funkcji utility.library!). UWAGA2: Uwaûaj na plik z taskami! - z powodów wspomnianych wyûej (lenistwo, nie prëdkoôê :-), odczyt pliku nie jest w ogóle idiotoodporny. Linia musi zaczynaê sië od nazwy taska, potem ewentualnie po JEDNEJ spacji numerek unita, potem ewentualnie po JEDNEJ spacji wartoôê czasu do podmiany i znów ewentualnie po JEDNEJ spacji wartoôê czasu do wstawienia. Bez komentarzy etc. Sorry, no bonus. UWAGA3: 'ramlib ' jako dodatkowy task W przypadku programów procedura patchowania wyglâda tak: - Podczas otwarcia timer.device Time Master sprawdza jaki to task i porównuje do listy tasków w pamiëci. Nastëpnie sprawdza unit, i jeûeli wszystko sië zgadza zapamiëtuje adres IORequesta (a wîaôciwie TimeRequesta). - Podczas odwoîania do funkcji BeginIO timer.device program sprawdza, czy podany request to 'jeden z naszych' i, jeôli tak, to po ewentualnym sprawdzeniu wartoôci do podmiany, wstawia zamiast kilkunastu minut lata ôwietlne (np, prawie) lub podanâ przez uûytkownika wartoôê. - Podczas zamykania timer.device, TimeMaster sprawdza IORequest i ewentualnie usuwa go z listy requestów do podmiany. Z device'ami jest nieco inaczej. Timer.device jest bowiem otwierany nie przez nie, a przez task ramlib. One 'tylko' wykonujâ OpenDevice(). TimeMaster musi wiëc zapamiëtaê wszystkie requesty uûywane przez ramlib podczas otwarcia timer.device i potem podczas OpenDevice() sprawdziê, czy wykorzystuje go jeden z naszych tasków. Jeûeli tak, to go zapamiëtuje i podmienia. Dlatego konieczny jest wpis ramlib, który wîaônie decyduje o zapamiëtywaniu requestów ramliba 'dokonanych' na jednostce . Uwaga: Z powyûszych wzglëdów, unit podany przy ramlibie odnosi sië do wszystkich device'ów, a ewentualne unity po nazwie device'a sâ ignorowane (aczkolwiek jeôli chcesz podaê konkretnâ wartoôê czasu, musisz podaê jakiô numerek jako unit!). Tak wiëc wybieranie unita ma w zasadzie sens tylko przy patchowaniu tasków (zakîadajâc, ûe w ogóle ma sens, skoro i tak najczëôciej uûywany jest VBlank=1) Podany przy ramlibie czas jest ignorowany. UWAGA4: Device'y po raz kolejny Uwaûaj, bowiem nie wszystkie device'y uûywajâ UNIT_VBLANK tylko do opóúnienia wersji demo. Konieczne jest wiëc podanie konkretnego czasu do podmiany. Podmiana wszystkich requestów takiego urzâdzenia moûe uczyniê je w najlepszym wypadku niefunkcjonalnym, w najgorszym moûesz oczekiwaê Guru i uszkodzeï danych (zaleûnie od urzâdzenia)! You have been warned. W pliku moûe znajdowaê sië nieograniczona iloôê linii z taskami. Jeûeli plik jest pusty lub pierwszy znak pliku to newline (10), to TimeMaster natychmiast wychodzi z siebie. Raz uruchomionego TimeMastera moûesz zatrzymaê poprzez wysîanie mu Ctrl-C. Patch'e funkcji zostanâ usuniëte, pamiëê zwolniona. Jeûeli uruchomisz TimeMastera gdy jedna jego kopia juû patchuje system, nic sië nie stanie - program natychmiast wyjdzie z siebie. TimeMastera moûesz usunâê po tym, jak zostaîy uruchomione wszystkie ogîupiane programy (znaczenie ma tylko podmiana podczas BeginIO, zazwyczaj na poczâtku wykonywania programu), ale nie bëdâ one patchowane podczas nastëpnego uruchomienia. Autor nie bierze ÛADNEJ odpowiedzialnoôci za dziaîanie lub nie dziaîanie programu. Jego nieodpowiednia obsîuga moûe (ba, bëdzie) prowadziê do Guru Meditation. Jego odpowiednia obsîuga moûe nic nie daê, jako ûe program NIE zostaî dokîadnie przetestowany. PS. Ostatnio skopaî mi sië kod úródîowy.. Moûe jeszcze go gdzieô znajdë, na razie archiwum jest bez niego.. Copyright 1996 by Tadek Knapik, Public Domain. Sorry folks.