Programowanie stacji LDW Super 2000 i CA-2001

From Atariki

Revision as of 14:29, 26 sty 2007; view current revision
←Older revision | Newer revision→
Jump to: navigation, search

Do stacji LDW Super 2000 i CA-2001 można przesyłać własne podprogramy i zlecać ich wykonanie, pamiętając oczywiście, że w tych stacjach dysków znajduje się procesor z rodziny Z80, więc wszelkie programy muszą być zapisane w kodzie maszynowym jego właśnie.

Spis treści

Od strony Atari

Do programowania stacji służy komenda SIO o kodzie $58 ("X"). Ma ona dwie postaci, pierwsza służy do przesłania programu, druga do uruchomienia go wraz z ewentualnym odebraniem wyników.

Przesyłanie programu

W pierwszym przypadku parametry DCB ustawia się tak, jak do każdego nadawania danych przez SIO:

  • DDEVIC - wartość $31
  • DUNIT - numer stacji
  • DCMND - kod $58 ("X")
  • DSTATS - wartość $80 (zapis)
  • DBUFA - adres, gdzie znajduje się kod do wysłania
  • DTIMLO - timeout jak do zapisu sektora (8)
  • DBYT - liczba bajtów do wysłania
  • DAUX1 - wartość $00
  • DAUX2 - wartość $01 (download)

Wywołanie JSIOINT ($E459) z takimi parametrami spowoduje wysłanie programu do stacji. W tej chwili na konsolce powinna zapalić się lampka BUSY.

Wykonywanie programu

Uruchomienie przesłanego kodu uzyskujemy tą samą komendą "X", tylko z nieco innymi parametrami.

  • DSTATS powinien zawierać wartość $40, gdy uruchomiony kod prześle z powrotem do komputera jakieś wyniki, albo $00 gdy niczego nie przesyła.
  • DBUFA to adres bufora na dane wynikowe,
  • do DBYT trzeba wpisać ich spodziewaną ilość (w bajtach);
  • wartość timeout (DTIMLO) też jest zależna od tego, co robi przesłany program i ile czasu mu to zajmuje - na ogół jednak timeout "8" (10,24 sek.) powinien wystarczyć dla większości zadań.
  • DAUX1 - wartość $00
  • DAUX2 - wartość $00 (execute)

Wywołanie JSIOINT spowoduje uruchomienie przez stację przesłanego kodu. Po zakończeniu procedury lampka BUSY na konsolce stacji powinna zgasnąć.

Ważny szczegół jest taki, że pomiędzy przesłaniem programu a jego wykonaniem nie można wysyłać do stacji żadnych innych rozkazów - gdy się to zrobi, stacja "zapomni" o kodzie załadowanym przez użytkownika i nie będzie można dokonać uruchomienia.

Od strony stacji

Jak powiedziano wyżej, program musi być napisany w asemblerze procesora Z80. Komenda "X" ładuje go do pamięci stacji pod adres $7F00. Ponieważ np. stacja CA-2001 ma tylko 2k pamięci RAM zlokalizowanej w obszarze $7700-$77FF, adres "rzeczywisty" załadowanego programu to $7700. Tak czy owak, to znaczy, czy stacja ma dwa, czy cztery kilobajty RAM-u, bufor programu zajmuje ostatnią stronę pamięci - a więc przesyłany jednorazowo blok w zasadzie nie może mieć więcej niż 256 bajtów.

Ważne: przesłana procedura bierze na siebie obsługę części protokołu SIO, tę mianowicie, która przesyła do komputera (ewentualne) dane wynikowe oraz końcowe potwierdzenie wykonania komendy "X". Robi to funkcja nr 8 z tabeli poniżej.

Tabela funkcji ROM-u

Programy mogą skorzystać z wbudowanych w ROM funkcji. Nie ma oczywiście gwarancji niezmienności tej tabeli funkcji, ale jest duże tego prawdopodobieństwo.

Aby użyć danej funkcji należy jej numer załadować do rejestru C procesora, a następnie wywołać (rozkazem CALL) procedurę spod adresu $0004. Rejestry, z których korzysta się przy wywołaniu/powrocie z funkcji znajdują się w nawiasach, z wyjątkiem funkcji 0C, która używa flagi przeniesienia (carry) procesora (CF).

  • $00 - zwraca numer wersji ROM-u (DE)
  • $01 - powrót głowicy
  • $02 - ustawienie głowicy nad konkretną ścieżką (D); numer ścieżki musi być pomnożony przez dwa
  • $03 - odczyt sektora (E) ze scieżki (D)
  • $04 - zapis sektora (E) na scieżce (D)
  • $05 - odbiór bajtu (transmisja szeregowa) (C)
  • $06 - wysłanie bajtu (A)
  • $07 - odbiór rekordu o długości (B) pod adres (DE)
  • $08 - wysłanie rekordu o długości (B) spod adresu (DE) z zadanym potwierdzeniem (A)
  • $09 - konwersja cyfry do formatu odpowiedniego dla wyswietlacza (A) do (A)
  • $0A - konwersja dwucyfrowa decymalna (A) do (DE)
  • $0B - konwersja dwucyfrowa heksadecymalna (A) do (DE)
  • $0C - włączenie (CF=1) lub wyłączenie (CF=0) silnika
  • $0D - aktualizacja statusu przełączników i zmiany dysku
  • $0E - zwraca adres bieżącego bufora (BC)
  • $0F - zwraca adres flagi typu kontrolera (IX)
  • $10 - wytworzenie dźwięku na linii audio
  • $11 - aktualizacja wyświetlacza
  • $12 - zwraca adresy rejestrów (odczyt/zapis) kontrolera (BC i DE)
  • $13 - ustawienie gęstości zapisu w zależności od trybu
  • $14 - zwraca adresy statusu i bieżącej ścieżki (DE i IX); numer ścieżki musi być pomnożony przez dwa

Mapka pamięci stacji

AdresOpis
$0000-$0FFFROM z oprogramowaniem wewnętrznym stacji (4 kB).
$1000-$6FFFObszar pusty lub zajęty na układy I/O.
$7000-$77FF

Pamięć RAM (2 kB):

  • $7000-$70FF - bufor sektora (256 bajtów)
  • $7100-$76FF - pamięć wewnętrzna (1536 bajtów)
  • $7700-$77FF - bufor programu użytkownika (256 bajtów)

"Pamięć wewnętrzną" zajmuje np. program Synchromesh, gdy jest załadowany.

Przykłady

Brzęknięcie dzwonkiem stacji

Program wywołuje "sygnał ostrzegawczy" na linii audio, ten sam, którym stacja się posługuje dla zasygnalizowania np. błędów odczytu.

   LD   C,$10     ;e0 10         numer funkcji: "bell"
   CALL $0004     ;cd 04 00      wykonać
   LD   B,$00     ;06 00         ilość danych wynikowych (zero)
   LD   C,$08     ;0e 08         numer funkcji: "send record"
   LD   A,$43     ;3e 43         kod potwierdzenia: "C" (Complete)
   CALL $0004     ;cd 04 00      wykonać
   OR   A         ;b7            ustawienie znaczników procesora
   RET            ;c9            powrot

Odczytanie numeru wersji ROM

Program przesyła do komputera dwa bajty stanowiące numer wersji ROM-u stacji.

   LD   C,$00      ;e0 00        numer funkcji: "version"
   CALL $0004      ;cd 04 00     wykonać
   LD   ($7F17),DE ;ed 53 17 7F  zapisz DE pod adres $7F17 w pamięci stacji
   LD   DE,$7F17   ;17 17 7F     adres danych do przesłania umieść w DE
   LD   B,$02      ;06 02        ilość danych wynikowych (dwa bajty)
   LD   C,$08      ;0e 08        numer funkcji: "send record"
   LD   A,$43      ;3e 43        kod potwierdzenia: "C" (Complete)
   CALL $0004      ;cd 04 00     wykonać
   OR   A          ;b7           ustawienie znaczników procesora
   RET             ;c9           powrot
Personal tools