Tajemnice ATARI

OPTY


   Do zrozumienia zasady działania programu OPTY niezbędna jest pewna wiedza na temat struktury pliku binarnego w formacie DOS-u 2.5 oraz sposobu jego wczytywania. Oto garść niezbędnych informacji:

   Plik binarny składa się z jednego lub kilku segmentów. Każdy segment składa się z czterobajtowego nagłówka i następującego po nim bloku danych. Nagłówek zbudowany jest kolejno: z młodszego i starszego bajtu adresu początku oraz młodszego i starszego bajtu adresu końca bloku danych w pamięci. Aby uzyskać długość bloku danych, należy od adresu końca odjąć adres początku i dodać jeden.

   Każdy plik binarny rozpoczyna się dwubajtowym identyfikatorem $FFFF. Przy próbie wczytania pliku bez w/w identyfikatora DOS 2.5 wyświetla komunikat "BAD LOAD FILE" (zły plik binarny).

   Po identyfikatorze następuje segment danych. W najprostszym przypadku jest to cały plik. Gdy nie osiągnięto końca pliku, to znaczy, że plik jest wielosegmentowy. DOS sprawdza, czy zapisano coś do dwubajtowego rejestru INITAD (hex 2E2). Gdy sprawdzian wypadnie pozytywnie, to DOS uruchamia program od adresu wpisanego do INITAD. W przeciwnym przypadku lub po natrafieniu w uruchomionym programie na rozkaz RTS następuje dalsze wczytytywanie.

   W tym miejscu zdarzają się dwie możliwości: występuje kolejny segment (jest to sytuacja najczęściej spotykana) lub występuje zbędny identyfikator a po nim kolejny segment. Takie pliki uzyskujemy np. z KYAN PASCALA lub po połączeniu plików binarnych opcją COPY APPEND. Gdy dalej nie osiągnięto końca pliku, to sytuacja się powtarza tak jak po wczytaniu pierwszego segmentu.

   Po osiągnięciu końca pliku DOS sprawdza czy zapisano coś do INITAD i postępuje w sposób wyżej opisany. Gdy brak wpisu do INITAD lub nastąpił powrót rozkazem RTS to sprawdzany jest dwubajtowy rejestr RUNAD (hex 2E0) i DOS postępuje analogicznie jak z rejestrem INITAD. Jest jednak zasadnicza różnica: w przypadku wpisu do INITAD skok do programu wykonywany jest natychmiast po załadowaniu aktualnego segmentu czyli można niezależnie uruchamiać każdy kolejny segment przed wczytaniem następnych. Natomiast w przypadku kolejnych wpisów RUNAD znaczący jest tylko ostatni, a skok wykonywany jest po załadowaniu całego pliku a nie tylko segmentu. Po natrafieniu na rozkaz RTS program powraca do DOS. Przy braku wpisów do INITAD i RUNAD sposób postępowania jest zależny od DOS-u: np. DOS 2.5 powraca do DUP.SYS, a DOS XL uruchamia program od początku pierwszego segmentu. Osoby bardziej zainteresowane tematem odsyłam do literatury.

Opcja nr 1 - Directoty chyba nie wymaga omówienia. W kolejnych opcjach na pytanie o plik wejściowy należy podać pełną specyfikację pliku binarnego na dysku np. D1:NAZWA.COM.
Opcja nr 2 - Analiza dokonuje analizy pliku wejściowego wpisując do pliku wyjściowego kolejno: adres startu, adres końca i długość kolejnych segmentów podając równocześnie ewentualne adresy inicjacji lub uruchomienia pliku. Pozwala ona na orientację w rozmieszczeniu programu w pamięci oraz na znalezienie miejsca od którego należy rozpocząć "rozgryzanie" programu. Jest wręcz niezbędna gdy chcemy znaleźć wolne miejsce w pamięci np. na monitor. Gdy wyniki chcemy uzyskać na ekranie, to jako plik wyjściowy podajemy S: lub E: a dla drukarki P:.

   Opcja nr 3 - Optymalizacja kopiuje plik wejściowy, usuwając jednocześnie zbędne identyfikatory oraz "sklejając" sąsiadujące segmenty w jeden większy. Co daje taka opcja? W większości przypadków nic, proszę jednak ją wypróbować na plikach generowanych przez Deep Blue C oraz na nim samym. W tym przypadku czas wczytywania z ramdysku skraca się kilkunastokrotnie a z normalnej stacji o 20-30%. Sam plik skraca się o kilka sektorów.

   Uwagi: przy korzystaniu z jednej stacji dysków pliki wejściowy i wyjściowy muszą być na tym samym dysku. Nie kasujmy starych plików przed wszechstronnym przetestowaniem pliku wyjściowego, który czasami może nie działać. Niekiedy pomaga zmiana "loadera" np. z BOOTSTRAP na MICRODOS itp. W celu nieznacznego poprawienia efektywności można w ramach wolnej pamięci zwiększyć wartość zmiennej MAX, co powiększa bufor programu. Program kończy pracę zgłoszeniem błędu nr 136 i nie należy się nim przejmować, natomiast błąd nr 21 oznacza, że wczytywany plik ma strukturę niezgodną z omówioną na początku opisu.

10 REM (c) 1992 Tajemnice ATARI
20 REM Autor: A.W.
30 MAX=$5000:TRAP #ERROR
40 DIM B$(MAX),F1$(15),F2$(15)
50 ------------------------------
60 POKE 195,136
70 B$(MAX)=" ":B=ADR(B$):P=ADR(" ")
80 ? "(c) TA '92 Opty v.1"
90 ? " Katalog dysku"
100 ? " Analiza"
110 ? " Optymalizacja"
120 ? " Koniec"
130 ? "Co wybierasz? ";
140 W=4:EXEC WYBOR:? 
150 ON W EXEC DIR,ANALIZ,OPTY,FIN
160 RUN 
170 ------------------------------
180 # ERROR:CLOSE 
190 ? :? "ERROR # ";ERR:GET X
200 RUN 
210 ------------------------------
220 PROC WYBOR
230   REPEAT 
240     GET X:X=X-48
250   UNTIL X>0 AND X<=W
260   W=X
270 ENDPROC 
280 ------------------------------
290 PROC DIR
300   ? "Numer stacji (1-8)? ";
310   W=8:EXEC WYBOR
320   F1$="D1:*.*":F1$(2,2)=STR$(W)
330   ? F1$:DIR F1$:GET X
340 ENDPROC 
350 ------------------------------
360 PROC GET2
370   BGET #1,P,2:X=DPEEK(P)
380 ENDPROC 
390 ------------------------------
400 PROC NAGLOWEK
410   REPEAT :EXEC GET2:UNTIL X<>$FFFF
420   ST=X:EXEC GET2:KN=X:LN=KN-ST+1
430   IF LN<1 THEN POKE 195,21:GO# ERROR
440 ENDPROC 
450 ------------------------------
460 PROC PUT2
470   DPOKE P,X:BPUT #2,P,2
480 ENDPROC 
490 ------------------------------
500 PROC OPEN
510   INPUT "Plik wejsciowy? ",F1$
520   INPUT "Plik wyjsciowy? ",F2$
530   OPEN #1,4,0,F1$:OPEN #2,8,0,F2$
540   BGET #1,P,2
550   IF DPEEK(P)<>$FFFF THEN POKE 195,21:GO# ERROR
560 ENDPROC 
570 ------------------------------
580 PROC DBLOK
590   REPEAT 
600     LN=LN-MAX
610     BGET #1,B,MAX:BPUT #2,B,MAX
620   UNTIL LN<=MAX
630   EXEC EBLOK
640 ENDPROC 
650 ------------------------------
660 PROC EBLOK
670   IF LN THEN BGET #1,B,LN:BPUT #2,B,LN
680   OST=0:OKN=0:OLN=0
690 ENDPROC 
770 ------------------------------
780 PROC ANALIZ
790   ? "ANALIZA:":EXEC OPEN
800   DO 
810     EXEC NAGLOWEK
820     IF ST=$02E0 OR ST=$02E2 AND LN=2
830       EXEC GET2
840       IF ST=$02E0:? "Run  ";
850       ELSE :? "Init ";:ENDIF 
860       ? "address=$";HEX$(X)
870     ELSE 
880       ? "Start=$";HEX$(ST);" End=$";HEX$(KN);
" bytes=";LN
890       IF LN>MAX
900         REPEAT 
910           LN=LN-MAX
920           BGET #1,B,MAX
930         UNTIL LN<=MAX
940       ENDIF 
950       BGET #1,B,LN
960     ENDIF 
970   LOOP 
980 ENDPROC 
990 ------------------------------
1000 PROC OPTY
1010   ? "OPTYMALIZACJA:":EXEC OPEN
1020   X=$FFFF:EXEC PUT2:TRAP #OPTYERR
1030   OST=0:OKN=0:OLN=0
1040   DO 
1050     EXEC NAGLOWEK
1060     IF ST=OKN+1
1070       Y=LN+OLN
1080       IF Y>MAX
1090         X=OST:EXEC PUT2
1100         X=KN:EXEC PUT2
1110         BPUT #2,B,OLN
1120         IF LN>MAX
1130           EXEC DBLOK
1140         ELSE 
1150           EXEC EBLOK
1160         ENDIF 
1170       ELSE 
1180         BGET #1,B+OLN,LN
1190         OKN=KN:OLN=Y
1200       ENDIF 
1210     ELSE 
1220       IF OLN
1230         X=OST:EXEC PUT2
1240         X=OKN:EXEC PUT2
1250         BPUT #2,B,OLN
1260       ENDIF 
1270       IF LN>MAX
1280         X=ST:EXEC PUT2
1290         X=KN:EXEC PUT2
1300         EXEC DBLOK
1310       ELSE 
1320         BGET #1,B,LN
1330         OST=ST:OKN=KN:OLN=LN
1340       ENDIF 
1350     ENDIF 
1360   LOOP 
1370   # OPTYERR
1380   IF ERR=136
1390     X=OST:EXEC PUT2
1400     X=OKN:EXEC PUT2
1410     BPUT #2,B,OLN
1420     ? "Gotowe!"
1430   ENDIF 
1440   GO# ERROR
1450 ENDPROC 
1460 ------------------------------
1470 PROC FIN
1480   END 
1490 ENDPROC 
1500 ------------------------------

   Literatura:
1. "DOS 2.5:l050 Disk Drive Owner's Manual" - ATARI Corp.
2. W.Zientara "Mapa pamięci ATARI XL/XE - dyskowe systemy operacyjne" - SOETO

A.W.



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

Pixel 2001