Tajemnice ATARI

ZEGARY

    Dziś rewia zegarów. Ten szczególnie umiłowany przez Was temat był przez nas traktowany dotąd po macoszemu. Z banalnej przyczyny: choć programów tego typu przysyłacie wiele, tylko nieliczne są na tyle dobre, by je można było bez wstydu komuś pokazać.

   Głó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,1
   W 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



Powrót na start | Powrót do spisu treści | Powrót na stronę główną

Pixel 2001