ZEGARYGłówny grzech - to zabijanie DOS-u. Z niewiadomych powodów użytkownicy magnetofonów nienawidzą DOS-u i zabijają go przez POKE 12,L:POKE 13,H:POKE 9,1W praktyce każdy program, w którym widzę tę magiczną sekwencję rozkazów, leci natychmiast do kosza. Grzech drugi: wyświetlanie. Nadsyłane zegary przeważnie zasłaniają coś na ekranie lub same są przez coś zamazywane, mrugają podczas różnych operacji, ulegają metamorfozie w różnych trybach graficznych. Grzech trzeci: przeciążanie przerwań. Większość zegarów ma ambicję nigdy nie zamierać. Korzystają więc z bardzo mocnych przerwań - VBLKI lub DLI. Nieumiejętne ich użycie powoduje zakłócenia komunikacji z szybkimi urządzeniami WE/WY, np. ze stacją dysków. Dziś prezentujemy garść czasomierzy nie dlatego, że są one całkiem wolne od usterek, lecz w nadziei, że wpłyną na postawę ich przyszłych (lub niedoszłych) autorów. 1. Bargarian: Program modyfikuje istniejącą DL, dopisując kilka bajtów z przodu. Ponieważ jednak nie zmienia przy tym wskaźnika MEMHI, może powodować konflikty z innymi programami. Zegar znika po wykonaniu rozkazu GRAPHICS, a pojawia się znów po RESET. To częsty błąd! Program na 6. stronie powinien umrzeć po RESET, robiąc miejsce dla swego następcy. 2. Marcin Kania: Zegar ustawia się przez SELECT/OPTION, START/SELECT i START/SELECT/OPTION wyświetla się na zastanym ekranie (także w trybach innych niż 0, lecz wtedy trudniej go odczytać), w dodatku w stałym miejscu pamięci, zamiast we wskazanym przez słowo 88. Zamazuje część ekranu, co jest nieraz dość kłopotliwe. Na szczęście RESET go zabija. 3. Jacek Binkul: Niszczy łańcuch procedur inicjalizacyjnych wskazywany przez słowo 12. Oczywiście blokuje przy tym nieodwracalnie szóstą stronę. Można tego uniknąć, wyrzucając "poki" z wiersza 90. 1 REM 2 REM ZEGAR by BARGARIAN 3 REM COPYRAIGHT BY TAJEMNICE ATARI 4 REM 9 N=1536 10 READ K:IF K<0 THEN GOTO 12 11 POKE N,K:N=N+1:GOTO 10 12 ? CHR$(125) 13 ? "Podaj ktora jest godzina ";:INPU T GOD 14 ? "--------|------- minuta ";:INPU T MIN 15 ? "--------|------- sekunda ";:INPU T SEK 16 REM 24 POKE 1784,INT(GOD/10)*16+(GOD-INT(G OD/10)*10) 26 POKE 1785,INT(MIN/10)*16+(MIN-INT(M IN/10)*10) 27 POKE 1786,INT(SEK/10)*16+(SEK-INT(S EK/10)*10) 28 REM 29 X=USR(1536) 30 DATA 104,165,12,141,24,6,165,13,141 ,25,6,32,27,6,76,92,228,32,27,6,32,92, 228,32,32 31 DATA 78,96,173,49,2,133,204,173,48, 2,56,233,3,141,48,2,133,203,160,0,185, 201,6,145,203 32 DATA 200,192,6,208,246,160,33,173,4 8,2,145,203,169,6,160,69,162,6,96,169, 1,133,9,169,17 33 DATA 133,12,169,6,133,13,206,251,6, 208,67,169,50,141,251,6,248,173,250,6, 24,105,1,141,250 34 DATA 6,201,96,208,14,169,0,141,250, 6,173,249,6,24,105,1,141,249,6,173,249 ,6,201,96,208 35 DATA 14,169,0,141,249,6,173,248,6,2 4,105,1,141,248,6,173,248,6,201,36,208 ,5,169,0,141 36 DATA 248,6,216,216,160,0,173,248,6, 32,177,6,173,249,6,32,177,6,173,250,6, 32,177,6,76 37 DATA 95,228,170,74,74,74,74,24,105, 16,153,207,6,200,138,41,15,24,105,16,1 53,207,6,200,200 38 DATA 96,112,64,66,207,6,32,0,0,26,0 ,0,26,0,0,0,0,0,0,0,0,0,0,0,0 39 DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,35,89,80,50,-1 10000 FOR I=1536 TO 1788:READ A:POKE I ,A:NEXT I:I=USR(1779):POKE 206,50:RETU RN 10010 DATA 198,205,165,205,201,0,208,4 ,169,10,133,205,198,206,165,206,240,3, 76,169,6 10020 DATA 169,50,133,206,238,141,1,16 9,10,205,141,1,208,100,169,0,141,141,1 ,238,140 10030 DATA 1,169,6,205,140,1,208,85,16 9,0,141,140,1,238,138,1,169,10,205,138 ,1 10040 DATA 208,70,169,0,141,138,1,238, 137,1,169,6,205,137,1,208,55,169,0,141 ,137 10050 DATA 1,173,142,1,201,1,240,43,23 8,135,1,169,4,205,135,1,240,18,169,10, 205 10060 DATA 135,1,208,26,169,0,141,135, 1,238,134,1,76,135,6,169,2,205,134,1,2 08 10070 DATA 8,169,0,141,135,1,141,134,1 ,173,143,1,201,0,208,24,160,0,24,185,1 34 10080 DATA 1,105,16,153,64,156,200,192 ,8,208,242,169,26,141,66,156,141,69,15 6,76,98 10090 DATA 228,173,31,208,201,0,208,6, 141,141,1,141,140,1,174,142,1,240,6,16 6,205 10100 DATA 224,10,208,198,162,1,142,14 2,1,201,1,208,3,76,92,6,201,4,208,3,76 10110 DATA 55,6,206,142,1,173,143,1,24 0,171,201,2,240,167,238,143,1,160,0,18 5,124 10120 DATA 1,153,64,156,200,192,8,208, 245,76,135,6,104,160,0,162,6,169,7,76, 92,228 2 REM ZEGAR Z BUDZIKIEM 10 GH=1000:CZ=1536:M=0:P=0:K=0:DIM A$( 26),ODP$(1):GOSUB 900 20 GRAPHICS 0:? "PODAJ GODZINY ":INPUT GODZ:? "PODAJ MINUTY ":INPUT MIN:? "P ODAJ SEKUNDY ":INPUT SEC 30 IF GODZ>23 OR MIN>59 OR SEC>59 THEN GOSUB 100:GOTO 20 40 POKE 1773,INT(GODZ/10):POKE 1772,GO DZ-INT(GODZ/10)*10:POKE 1770,INT(MIN/1 0):POKE 1769,MIN-INT(MIN/10)*10 50 POKE 1767,INT(SEC/10):POKE 1766,SEC -INT(SEC/10)*10 60 ? "USTAWIC BUDZIK [T/N] ":INPUT ODP $:IF ODP$="N" THEN POKE 1689,96:GOTO 9 0 70 ? "PODAJ GODZINY ":INPUT GODZ:? "PO DAJ MINUTY ":INPUT MIN:IF GODZ>23 OR M IN>59 THEN SEC=0:GOSUB 100:GOTO 70 80 POKE 1777,INT(GODZ/10):POKE 1776,GO DZ-INT(GODZ/10)*10:POKE 1775,INT(MIN/1 0):POKE 1774,MIN-INT(MIN/10)*10 90 POKE 9,1:POKE 12,1:POKE 13,6:I=USR( 1536):END 100 CLOSE #1:? "ZLE PODALES CZAS - ";G ODZ;":";MIN;":";SEC:? :OPEN #1,4,0,"K: ":GET #1,A:CLOSE #1:RETURN 900 RESTORE GH:FOR I=1 TO 19:READ A$ 910 FOR J=1 TO LEN(A$) STEP 2 920 M=ASC(A$(J))-48:M=(M-7*(M>9))*16:P =ASC(A$(J+1))-48:P=P-7*(P>9):POKE CZ+K ,M+P:K=K+1:NEXT J:NEXT I 930 RETURN 1000 REM ZEGAR 1010 DATA 68A9008DF306A001A200A90220 1020 DATA 5CE4A018A206A9094C5CE4EEE6 1030 DATA 06ADE606C90A9051A9008DE606 1040 DATA EEE706ADE706C9069042A9008D 1050 DATA E706EEE906ADE906C90A9033A9 1060 DATA 008DE906EEEA06ADEA06C90690 1070 DATA 24A9008DEA06EEEC06ADEC06CD 1080 DATA F2069014A9008DEC06EEED06AD 1090 DATA ED06C9039005A9008DED06A90A 1100 DATA 8DF206ADED06C9029005A9048D 1110 DATA F206A9328D1A02A020A207BDE6 1120 DATA 061869909158C8CA10F4ADED06 1130 DATA CDF106D01DADEC06CDF006D015 1140 DATA ADEA06CDEF06D00DADE906CDEE 1150 DATA 06D005A9028DF306ADF306C900 1160 DATA F012CEF406F00EA92F8D02D28D 1170 DATA C802A9C88D63D260A9008D03D2 1180 DATA 8DC802A9028DF4066000000A00 1190 DATA 000A0000000000000A0002 |