Tajemnice ATARI

Antic Assembler


    Tworzeniem obrazu na monitorze w małym "Atari" zajmuje się specjalnie do tego celu zaprojektowany mikroprocesor, zwany Antic. Program dlań tworzy automatycznie system operacyjny (np. po komendzie GRAPHICS), bądź też (ręcznie) użytkownik. W tym drugim przypadku może być to czynność nieco żmudna i stresująca. Aby temu jakoś zaradzić, stworzyłem przedstawiony niżej program. Jest to assembler, a więc program tłumaczący pewien tekst, będący ciągiem symbolicznie zapisanych rozkazów mikroprocesora, na postać dla tego ostatniego zrozumiałą.

OBSŁUGA

   Bezpośrednio po uruchomieniu ekran dzielony jest na dwie części. Dolna - to okno komunikatów. Tam wyświetlany jest listing aktualnie tworzonego programu Antic, tam także pojawiają się wszelkie komunikaty o błędach. Górna część - to okno robocze. W nim ustawiane są wszystkie parametry pracy programu. W polu "Nazwa pliku" należy wpisać nazwę pliku do odczytu (czyli pliku źródłowego), lub zapisu (czyli pliku wynikowego). Kierunek przepływu danych podany jest w oknie roboczym po słowie "Tryb". Użytkownik ma możliwość zdefiniowania rodzaju pliku wynikowego: może nim być ciąg znaków Ascii (opcja NUM) lub plik źródłowy Quick Assemblera. Wyboru dokonywać można klawiszem CNTL+K. Oprócz tego działają następujące klawisze specjalne :

  • CNTL+T - przestawia program z trybu "Zapis" na tryb "Odczyt" (nigdy odwrotnie), co równoznaczne jest ze skasowaniem bufora programu.
  • CNTL+N - zmienia urządzenie zewnętrzne, na którym przeprowadzana będzie następna operacja we/wy. Możliwe są trzy: D: - stacja dysków nr 1, C: - magnetofon i T: - magnetofon turbo. W niektórych systemach Turbo odczyt będzie przeprowadzany z urządzenia D: - jest to kwestia użytego systemu.
  • SPACE - powoduje wyświetlenie katalogu dyskietki w stacji nr 1. Jeżeli w polu nazwy pliku są wpisane jakieś znaki, to traktowane są one jako wzorzec przeszukiwania katalogu. Gdy pole nazwy jest puste, wzorcem tym automatycznie staje się D1:*.*.
  • CLEAR - powoduje skasowanie pola nazwy pliku.
  • ESC - powoduje wyjście z programu i powrót do systemu nadrzędnego.
  • RETURN - potwierdza wpisaną nazwę pliku i przechodzi do odczytu/zapisu danych.

    ASSEMBLER

       Do przygotowania listingu źródłowego potrzebny jest dowolny edytor tekstów (np. PANTHER, czy edytor QA). Poniżej przedstawiona jest lista rozkazów rozpoznawanych przez Antic Assembler. Podzielić je wszystkie można na 2 grupy: rozkazy mikroprocesora Antic, oraz pseudorozkazy, mające za zadanie jedynie ułatwienie życia programiście.

    1. Rozkazy Anticu

    SET bajt [,LMS [>]słowo,DLI,HSC,VSC] - Rozkaz ten powoduje wygenerowanie linii obrazu w trybie określonym parametrem bajt (przyjmującym wartości 2-15). Chodzi tutaj o tryb Anticu, a nie systemu operacyjnego. Tak więc jeśli chcemy uzyskać linię trybu GRAPHICS O, wartość parametru bajt wynosić musi 2. Po rozkazie SET możliwe są 4 rozkazy dodatkowe (tzn. ustawiające bity w starszej połówce bajtu rozkazu): HSC - włącza przesuw poziomy (w danej linii), VSC - włącza przesuw pionowy. DLI - wywołuje przerwanie DLI, LMS [>]słowo - powoduje załadowanie licznika obrazu adresem określonym przez "słowo". Oznacza to, że dane do wyświetlenia pobierane będą właśnie od tego adresu. Jeżeli parametr ów poprzedzony jest znaczkiem ">", to adres ów jest sumą argumentu poprzedniego LMS-a i parametru "słowo". Tak więc program

    SET 2,LMS $20
    SET 2,LMS $10

    da w efekcie

    dta b($42),a($0020)
    dta b($42),a($0010)

    a (dla porównania) program

    SET 2,LMS $20
    SET 2,LMS >$10

    wygeneruje kod

    dta b($42),a($0020)
    dta b($42),a($0030)
    - czyli $20 z poprzedniego LMS-a zsumowane z $10.

       Jeżeli nie użyto wcześniej żadnego rozkazu LMS, jako pierwszy składnik sumy przyjmowany jest adres podany w pseudorozkazie ADR, lub (jeżeli i on nie był użyty) po prostu zero.

    EMP bajt [,DLI] - powoduje wygenerowanie na ekranie pustych linii. Ich liczba określona jest parametrem bajt 1 przyjmuje wartości 1-8. Możliwy jest tutaj, podobnie jak i w dwóch następnych rozkazach, tylko jeden rozkaz dodatkowy: DLI. Uwaga! 1 linia ekranu ma grubość linii obrazu w trybie GRAPHICS 8. Tak więc EMP 8 wygeneruje na ekranie "pasek" grubości linii w trybie GRAPHICS O.

    JMP adres [,DLI] - powoduje stworzenie i pustej linii ekranu i bezwarunkowy skok pod podany adres.

    JVB adres [,DLI] - powoduje skok pod podany adres- po oczekiwaniu na synchronizację pionową.

       Więcej informacji na temat działania rozkazów mikroprocesora odnaleźć można w cyklu "Piszemy demo" prezentowanym ostatnio na łamach "TA".

    2. Pseudorozkazy

    ORG adres - ustala adres początku programu Anticu. Jeżeli użyto tego rozkazu, to w trybie QA wygenerowana zostanie linia

    org adres

    w trybie NUM natomiast stworzony zostanie 6 bajtowy nagłówek pliku.

    DEF etykieta - Ten rozkaz zadziała tylko w trybie QA. Na początku każdego pliku wynikowego dla QA tworzona jest linia

    dlist equ *

    DBF pozwala zmienić etykiete dlist na dowolną inną (max. 6-bajtową).

    REM komentarz - wszystkie znaki po rozkazie REM są ignorowane. Ignorowane są również wszystkie teksty po prawidłowo zinterpretowanym rozkazie. W przypadku rozkazów Anticu teksty owe nie mogą jednak zaczynać się od przecinka.

    ADR - definiuje pierwszy składnik sumy dla rozkazu LMS > adres

    REP bajt - początek pętli. Wszystkie instrukcje miedzy REP a NXT będą asemblowane tyle razy ile określa to liczba "bajt" (z zakresu 1-255). Pętle mogą być zagnieżdżane (tzn. jedna może być umieszczona wewnątrz drugiej) do 8 razy.

    NXT - Oznaczenie końca pętli.

    END - Koniec pliku źrodlowrgo. Przerywa asemblację.

       W powyższym zestawieniu w nawiasach kwadratowych podano te elementy rozkazu, które mogą wystąpić, ale nie muszą. Antic Assembler nie stawia żadnych wymagań odnośnie tabulacji, użytych liter (mogą być duże i małe), do woli używać można trybu inverse video. Liczby wpisywać można dziesiętnie, lub szesnastkowo - w tym wypadku poprzedzać je należy znaczkiem "$" (Uwaga! Liczba hex musi następować bezporednio po "$"!). Linie puste są ignorowane.

    BŁĘDY

       A oto lista komunikatów o błędach, wraz z krótkim komentarzem.

  • Błąd wejścia/wyjścia - występuje przy wszelkiego typu problemach z transmisją danych.
  • Plik zbyt długi - Plik źródłowy przekracza dozwoloną objętość 4 KB.
  • Błąd składni - Antic Assembler nie rozpoznał w linii żadnej instrukcji. Błąd ten może wystapic, gdy komentarz po rozkazie Anticu poprzedzono przecinkiem.
  • Nielegalny rozkaz - Użyto rozkazu podstawowego (np. SET, czy REP) w miejscu przeznaczonym dla rozkazu dodatkowego (HSC,VSC), lub odwrotnie.
  • Zły format tekstu - długość linii w pliku źrodłowym przekracza 255 bajtów.
  • Oczekiwana liczba - nie podano parametru rozkazu. Błąd ten występuje także w przypadku oddzielenia spacjami znaczka "$" od liczby hex.
  • Oczekiwana etykieta - brak etykiety po rozkazie DEF.
  • Przekroczony zakres parametru - wartość parametru rozkazu przekracza dozwolone wartości (patrz opis rozkazów)
  • Przepełnienie stosu - zbyt dużo zagnieżdżonych pętli REP/NXT. Maksymalna liczba to 8.
  • NXT bez REP - użyto NXT bez odpowiadającego mu REP.
  • REP bez NXT - Pętla REP/NXT nie została zamknięta.
  • Plik wynikowy zbyt długi - błąd ten występuje, gdy licznik rozkazów wyzeruje się w trakcie asemblacji. W trakcie pracy z programem trzeba pamiętać, że ATARI może bez problemów wyświetlić jedynie około 210 linii ekranu. Większa ich liczba spowoduje zerwanie synchronizacji obrazu.

       Po każdym komunikacie błędu asemblacji należy nacisnąć dowolny klawisz, program będzie kontynuował pracę (kod wynikowy nie będzie jednak już tworzony). Asemblację przerwać można w każdej chwili, naciskając ESC.
    1000 REM *--------------------------*
    1002 REM : ANTIC Assembler 6.3      :
    1004 REM :  autor: Maciej Czarnota  :
    1006 REM : (c) 1992 Tajemnice ATARI :
    1008 REM *--------------------------*
    1010 DATA ffff0080558aa56a38e904856a
    1020 DATA 85922094efa9e08594a5928596
    1030 DATA a90085938595a203a000b19391
    1040 DATA 95c8d0f9e694e696ca10f0a200
    1050 DATA 86908691a5928596a690bd078a
    1060 DATA 3025e6900a0a9004e696e6960a
    1070 DATA 9002e6968595a000a691bd108a
    1080 DATA 9195e8c8c008d0f586914c3280
    1090 DATA a5928df402a9038554a9d28d30
    1100 DATA 02a9878d3102a5581869788ddc
    1110 DATA 87a55969008ddd87a284a036a9
    1120 DATA 07205ce420fdf2a207dd6d88f0
    1130 DATA 30ca10f820af83c92af008c92e
    1140 DATA 90e8c95bb0e4ac018ac00cd004
    1150 DATA 888c018a99778820ba83ac018a
    1160 DATA 993188c88c018a4c8d808a0aaa
    1170 DATA bd8e878de080bd8f878de180a2
    1180 DATA e4a062a907205ce420df804c84
    1190 DATA 80ac038ac8c002d002a0008c03
    1200 DATA 8a980a0aa8a200b997889d6988
    1210 DATA c8e8e003d0f460ad028af017a9
    1220 DATA 008d028a0a0a0aa8a200b98788
    1230 DATA 9d5b88e8c8e007d0f460ac008a
    1240 DATA c8c003d002a0008c008ab98488
    1250 DATA 8d758820ba838d2f8860a56a18
    1260 DATA 6904856a2094ef6c0a00a20ca9
    1270 DATA 009d31889d7788ca10f7e88e01
    1280 DATA 8a6020b584a21020a781ac018a
    1290 DATA f003209c81ac7588c044f00320
    1300 DATA a781a9069d4a03205d843015a2
    1310 DATA 10207c84300aa280a0052042c6
    1320 DATA 4c7f81c088f005a90020a5844c
    1330 DATA 7284a9759d4403a9889d450360
    1340 DATA a99f9d4403a9889d450360ac01
    1350 DATA 8af00a20c2818820c2818c018a
    1360 DATA 60a900993188a92099778860ad
    1370 DATA 028a0aa8b99e878ddf81b99f87
    1380 DATA 8de08120de81a58ef005a90a20
    1390 DATA a584a58dd015a594c583a595e5
    1400 DATA 84f00ba9018d028a200f812049
    1410 DATA 8160a910a2029d5088ca10fa20
    1420 DATA b584204f8410034c9481a907a2
    1430 DATA 109d4203a9569d4403a98a9d45
    1440 DATA 03ad058a9d4803ad068a9d4903
    1450 DATA 2056e43005a9014ca584c088d0
    1460 DATA d2a95685f3187d48038594a98a
    1470 DATA 85f47d49038595207284a900a2
    1480 DATA 05958bca10fb8d528a8d538aa2
    1490 DATA 05bda6889de289ca10f7a59485
    1500 DATA 83a5958584a00084f2b1f3c99b
    1510 DATA f00c297f91f3c8d0f3a9044c9a
    1520 DATA 84205d838580a8a902b02ea903
    1530 DATA c00cb028b9dc88f00720c983a9
    1540 DATA 05b01ca5800aa8b9a0878dbf82
    1550 DATA b9a1878dc08220be82b074f039
    1560 DATA 8580209385b06ba000a5809183
    1570 DATA e001f00ac8a5d49183c8a5d591
    1580 DATA 838a18658385839002e6842041
    1590 DATA 83900ca900858ea90c20a5844c
    1600 DATA 7284209384a4f2b1f3c99bf003
    1610 DATA c8d0f7c8981865f385f39002e6
    1620 DATA f4a5f4c5959006a5f3c594b016
    1630 DATA adfc02c9ffd0034c7c8220fdf2
    1640 DATA a90b20a584a900858e60209a84
    1650 DATA c91bf0ef4cfe82a002b95088aa
    1660 DATA e8e01ad002a2108a995088c910
    1670 DATA d0058810ea38601860a9ac8d85
    1680 DATA 83a9888d8683a9008582202484
    1690 DATA a903b039a2008e048aa582c90f
    1700 DATA d0023860a4f220ad83dd8483f0
    1710 DATA 038d048ae8c8e003d0efa90318
    1720 DATA 6d85838d85839003ee8683e682
    1730 DATA ad048ad0cb84f2a5821860b1f3
    1740 DATA c9619006c97bb002295f60a82a
    1750 DATA 2a2a2a2903aa98299f1d49fb60
    1760 DATA 202484c924d00be6f220e48390
    1770 DATA 0cc6f238602000d8b0f720d2d9
    1780 DATA 60a00084d584d4a4f2a20020ad
    1790 DATA 83c9309025c93a900dc941901d
    1800 DATA c947b01938e937d00338e93006
    1810 DATA d426d518e8e004d0f605d485d4
    1820 DATA c8d0d2c4f2f00484f218603860
    1830 DATA a4f288c8b1f3c99bf0f4c920f0
    1840 DATA f584f21860aeff89cad00dac01
    1850 DATA 8ab931884980993188a2148eff
    1860 DATA 894c62e4a904d002a908a2109d
    1870 DATA 4a03209c81a9039d4203a9809d
    1880 DATA 48039d4b03a9009d49034c56e4
    1890 DATA a210a90c9d42034c56e4a9809d
    1900 DATA 4403a9059d4503a9059d4203a9
    1910 DATA 809d48034c56e4a6f3a4f44c42
    1920 DATA c6482093846820a5844cfdf20a
    1930 DATA a8b9b887aab9b987a82042c685
    1940 DATA 8d60a99b4cb0f2686860202484
    1950 DATA a906b024a200a4f2b1f3c99bf0
    1960 DATA 0d9de289e8c8e006f004c920d0
    1970 DATA eda9209de289e8e007d0f6a200
    1980 DATA 186018a20060a5d5d057a5d4c9
    1990 DATA 10b051c902904da2011860a5d5
    2000 DATA d045a4d4f041c009b03d88980a
    2010 DATA 0a0a0aa2011860a901d002a941
    2020 DATA a2031860a908a48ec020f023a5
    2030 DATA d5d01da5d499a000a5f399a100
    2040 DATA a5f499a200a5f299a300c8c8c8
    2050 DATA c8848e4c7585a9073860a909a4
    2060 DATA 8ef0f8b99c00aaca8a999c00f0
    2070 DATA 12b99d0085f3b99e0085f4b99f
    2080 DATA 0085f2a8d00688888888848ea2
    2090 DATA 0018608490a5d48d528aa5d58d
    2100 DATA 538a4c7585a5d4858ba5d5858c
    2110 DATA 4c7585a9008591202484c92cf0
    2120 DATA 08a580059185801860e6f28a48
    2130 DATA 205d8368aaa902900160a903a4
    2140 DATA 82c00c9055a58238e90c8582f0
    2150 DATA 3da903a480c0029044c010b040
    2160 DATA a582c903d02b20248448c93ed0
    2170 DATA 02e6f220c983b02868c93ed00d
    2180 DATA a58b1865d485d4a58c65d585d5
    2190 DATA a5d4858ba5d5858ca203a482b9
    2200 DATA d988059185914c978568a90538
    2210 DATA 60ad038af073205384306ba583
    2220 DATA 38e5948592a584e5958593a590
    2230 DATA f039a9069d4803a9009d4903a9
    2240 DATA 509d4403a98a9d4503a592186d
    2250 DATA 528a8d548aa5936d538a8d558a
    2260 DATA ac548ad003ce558a888c548aa9
    2270 DATA 0b9d42032056e4a90b9d4203a5
    2280 DATA 929d4803a5939d4903a5949d44
    2290 DATA 03a5959d45032056e430034c72
    2300 DATA 844c948120538430f8a5948585
    2310 DATA a5958586a590f016a2dca08920
    2320 DATA 4e87ad538a203187ad528a2031
    2330 DATA 87206e87a2e2a089206b87a000
    2340 DATA b18548a681e003d005204a87d0
    2350 DATA 07a2f6a089204e8768203187a0
    2360 DATA 00b185290ff02fc901f006b185
    2370 DATA 2940f025a2faa089204e87a002
    2380 DATA b185203187a001b185203187a5
    2390 DATA 8518690285859002e686206787
    2400 DATA d007206787c6811003206e87e6
    2410 DATA 85d002e686a585c583a586e584
    2420 DATA d094a581c903f00320b5844c72
    2430 DATA 844829f04a4a4a4a203e876829
    2440 DATA 0f186930c93a900269264c7487
    2450 DATA a2eea08986878488a0009848b1
    2460 DATA 8748297f20748768aa68a8c88a
    2470 DATA 10ee60a929d009204e87a90385
    2480 DATA 81a99ba20b8e5203a2008e5803
    2490 DATA 8e5903a2102056e4100568684c
    2500 DATA 948160e580228105815b81cd81
    2510 DATA 3c814981b28104821386ba84bd
    2520 DATA 84e98479851f854c85ed84ff84
    2530 DATA 158519858885e888fd880d891a
    2540 DATA 892c893e895089648982899689
    2550 DATA a289ae89c38970707042f58702
    2560 DATA 021042dc870202020202020202
    2570 DATA 02020202020202020202020241
    2580 DATA d28780a1eef4e9e380a1f3f3e5
    2590 DATA ede2ece5f280968e938080a1f5
    2600 DATA f4eff29a80ad8ea3fae1f2eeef
    2610 DATA f4e1800000000000002e617a77
    2620 DATA 6100706c696b7500241a000000
    2630 DATA 00000000000000000000000000
    2640 DATA 00000000000000326f7a6b617a
    2650 DATA 1a001010100000347279621a00
    2660 DATA 2f64637a79740000002b6f641a
    2670 DATA 00312100000b0e14209b1b3c7e
    2680 DATA 443a2020202020202020202020
    2690 DATA 20204443542f64637a79740000
    2700 DATA 3a61706973000000312100002e
    2710 DATA 352d0044313a2a2e2a20646c69
    2720 DATA 737420454e4444454652454d4f
    2730 DATA 52475245504e5854534554454d
    2740 DATA 504a4d504a5642414452444c49
    2750 DATA 4853435653434c4d5380102040
    2760 DATA 0000000101000101010101427b
    2770 DATA 11642077656a176369612f7779
    2780 DATA 6a176369619b506c696b207a62
    2790 DATA 797420647b7567699b427b1164
    2800 DATA 20736b7b61646e699b4e69656c
    2810 DATA 6567616c6e7920726f7a6b617a
    2820 DATA 9b5a7b7920666f726d61742074
    2830 DATA 656b7374759b4f637a656b6977
    2840 DATA 616e61206c69637a62619b4f63
    2850 DATA 7a656b6977616e61206574796b
    2860 DATA 696574619b50727a656b726f63
    2870 DATA 7a6f6e79207a616b7265732070
    2880 DATA 6172616d657472759b50727a65
    2890 DATA 70657b6e69656e69652073746f
    2900 DATA 73759b4e58542062657a205245
    2910 DATA 509b5245502062657a204e5854
    2920 DATA 9b4173656d626c61636a612070
    2930 DATA 727a657277616e619b506c696b
    2940 DATA 2077796e696b6f7779207a6279
    2950 DATA 7420640c7567699b206f726720
    2960 DATA a42020202020202065717520aa
    2970 DATA 20647461206228a42c6228a429
    2980 DATA 2c6128a4140000000000001044
    2990 DATA 4d50515657587bff00003c667e
    3000 DATA 603c060c18007c666666000c18
    3010 DATA 003c66663c0000003c063e663e
    3020 DATA 0c0c18003c60603c000c183e60
    3030 DATA 3c067c000018007e0c307e0000
    3040 DATA 38181c38183c00ffff00000000
    3050 DATA e002e1020080
    

    PRZYKŁADY

    Na zakończenie chciałbym przedstawić dwa przykładowe listingi źródłowe. Pierwszy z nich to moja wariacja na temat mieszania różnych trybów graficznych. Drugi za jest po prostu przełożonym na język Antic Assemblera programem wyświetlania dla trybu GRAPHICS 0 (z włączonym Basicem). Polecam samodzielną analizę tych listingów!

    rem PROGRAM PRZYKŁADOWY NR 1
    rem EKRAN MIESZANY
    
     org $8000
     
     def etyk  (Nowa etykieta!)
    
      rep 3
       emp 8  Tradycyjne 24 puste linie
      nxt
    
     adr $f00 - adres początkowy dla lms >a
    
    rem z kolejnych 16 linii dane pobierane
    rem będą z początku kolejnych stron
    rem pamięci. Początek - $f00+$100!
    
      rep 16
       set 15, lms >$100,hsc - tryb GR.8
      nxt
    
    rem okno tekstowe.
     
     set 2,lms $4000,dli  - Pamięć ekranu od $4000
      rep 9
       set 2,dli - Razem 10 linii, w każdej
    przerwanie dli
      nxt
    
    set 14,lms $5000,dli
     rep 95
      set 14 - 96 linii w trybie 7+
     nxt
    
    jvb $8000,dli - skok na początek
    
    end
    
    
    
    rem PROGRAM PRZYKŁADOWY NR 2
    rem Ekran w trybie graphics 0
    
     org $9c20   adres początkowy
    
      rep 3
       emp 8   24 linie puste
      nxt
    
    set 2,lms $9c40  pamięć ekranu od $9c40
    
     rep 23
      set 2   razem 24 linie obrazu
     nxt
    
    jvb $9c20   skok na początek
    
    end
    

    Maciej Czarnota

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

    Pixel 2001