Programowanie stacji LDW Super 2000 i CA-2001
From Atariki
Wersja z dnia 14:55, 26 sty 2007 KMK (Dyskusja | wkład) (→Od strony stacji) ← Previous diff |
Wersja z dnia 14:56, 26 sty 2007 KMK (Dyskusja | wkład) (→Mapka pamięci CA-2001) Next diff → |
||
Linia 76: | Linia 76: | ||
<p>Pamięć RAM (2 kB):</p> | <p>Pamięć RAM (2 kB):</p> | ||
* $7800-$7941 - bufor I/O (322 bajty) | * $7800-$7941 - bufor I/O (322 bajty) | ||
- | * $7942-$7EFF - pamięć wewnętrzna (1536 bajtów) | + | * $7942-$7EFF - pamięć wewnętrzna (1470 bajtów) |
* $7F00-$7FFF - bufor programu użytkownika (256 bajtów) | * $7F00-$7FFF - bufor programu użytkownika (256 bajtów) | ||
<p>"Pamięć wewnętrzną" zajmuje np. program [[Synchromesh]], gdy jest załadowany.</p> | <p>"Pamięć wewnętrzną" zajmuje np. program [[Synchromesh]], gdy jest załadowany.</p> |
Wersja z dnia 14:56, 26 sty 2007
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 $7800-$7FFF, a pod wyższymi adresami zawartość tych 2k się powtarza, bufor programu zajmuje ostatnią stronę pamięci - a więc przesyłany jednorazowo blok 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 CA-2001
Adres | Opis |
$0000-$0FFF | ROM z oprogramowaniem wewnętrznym stacji (4 kB). |
$1000-$6FFF | Obszar pusty lub zajęty na układy I/O. |
$7000-$77FF | Powtórka RAM-u spod adresów $7800-$7FFF |
$7800-$7FFF |
Pamięć RAM (2 kB):
"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. Kod pochodzi z programu Synchromesh dla CA-2001.
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