Programowanie stacji LDW Super 2000 i CA-2001

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 15:37, 26 sty 2007
KMK (Dyskusja | wkład)
(Przykłady)
← Previous diff
Aktualna wersja
Trub (Dyskusja | wkład)
(aktualny link)
Linia 1: Linia 1:
-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.+Do stacji [[Indus GT]], [[LDW Super 2000]] i [[CA-2001]] można przesyłać własne podprogramy i zlecać ich wykonanie.
== Od strony Atari == == Od strony Atari ==
Linia 13: Linia 13:
* DBUFA - adres, gdzie znajduje się kod do wysłania * DBUFA - adres, gdzie znajduje się kod do wysłania
* DTIMLO - timeout jak do zapisu sektora (8) * DTIMLO - timeout jak do zapisu sektora (8)
-* DBYT - liczba bajtów do wysłania+* DBYT - liczba bajtów do wysłania (zawsze <= 256)
-* DAUX1 - wartość $00+* DAUX1 - to samo, co w młodszym bajcie DBYT
* DAUX2 - wartość $01 (download) * 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.+Wywołanie [[Tablica skoków#JSIOINT|JSIOINT]] ($E459) z takimi parametrami spowoduje wysłanie programu do stacji. W tej chwili na jej konsolce powinna zapalić się lampka BUSY.
=== Wykonywanie programu === === Wykonywanie programu ===
Uruchomienie przesłanego kodu uzyskujemy tą samą komendą "X", tylko z nieco innymi parametrami. 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.+* DSTATS powinien zawierać wartość $80, gdy uruchomiony kod oczekuje nadesłania z komputera dodatkowych danych; $40, gdy ma przesłać z powrotem do komputera jakieś wyniki; $C0, gdy zachodzi jedno i drugie, albo $00, gdy nic nie jest przesyłane.
* DBUFA to adres bufora na dane wynikowe, * DBUFA to adres bufora na dane wynikowe,
* do DBYT trzeba wpisać ich spodziewaną ilość (w bajtach); * do DBYT trzeba wpisać ich spodziewaną ilość (w bajtach);
Linia 34: Linia 34:
== Od strony stacji == == 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.+Program dla stacji musi być napisany w asemblerze Z80, gdyż taki właśnie procesor, taktowany zegarem 4 MHz, się tam znajduje. Komenda "X" ładuje kod do pamięci stacji pod adres $7F00. Ponieważ stacja typowo ma tylko 2k pamięci RAM zlokalizowanej w obszarze $7800-$7FFF, a pod wyższymi adresami zawartość całej pamięci od początku powtarza się, zatem przesyłany jednorazowo blok nie może mieć więcej niż 256 bajtów, gdyż bufor programu zajmuje ostatnią stronę pamięci RAM.
-Ważne: procedura przesłana rozkazem "X" odpowiada za poprawne zakończenie transmisji SIO, tj. zwłaszcza za zadbanie, by komputer dostał końcowe potwierdzenie wykonania ("C") lub sygnał błędu ("E"). Jeśli w chwili opuszczania procedury (rozkazem RET) bit CF rejestru znaczników Z80 jest ustawiony, stanowi to sygnał dla stacji, że ma sama zakończyć transmisję przesyłając do komputera kod potwierdzenia umieszczony w rejestrze A (patrz przykład nr 1). W przeciwnym wypadku, gdy CF=0, jest to sygnał, że program użytkownika zatroszczył się o dopełnienie protokołu i żadne dalsze działania nie są potrzebne (patrz przykład 2). +Ważne: procedura przesłana rozkazem "X" odpowiada za poprawne zakończenie transmisji SIO, tj. zwłaszcza za zadbanie, by komputer dostał końcowe potwierdzenie wykonania ("C") lub sygnał błędu ("E"). Jeśli w chwili opuszczania procedury (rozkazem RET) bit CF rejestru znaczników Z80 jest ustawiony, stanowi to sygnał dla stacji, że ma sama zakończyć transmisję przesyłając do komputera kod potwierdzenia umieszczony w rejestrze A (patrz przykład nr 1). W przeciwnym wypadku, gdy CF=0, jest to sygnał, że program użytkownika zatroszczył się o dopełnienie protokołu i żadne dalsze działania nie są potrzebne (patrz przykład 2).
=== Tabela funkcji ROM-u === === Tabela funkcji ROM-u ===
Linia 47: Linia 47:
* $01 - powrót głowicy * $01 - powrót głowicy
* $02 - ustawienie głowicy nad konkretną ścieżką (D); numer ścieżki musi być pomnożony przez dwa * $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)+* $03 - odczyt sektora (E) ze ścieżki (D)
-* $04 - zapis sektora (E) na scieżce (D)+* $04 - zapis sektora (E) na ścieżce (D)
-* $05 - odbiór bajtu (transmisja szeregowa) (C)+* $05 - odbiór bajtu z SIO (C)
-* $06 - wysłanie bajtu (A)+* $06 - wysłanie bajtu na SIO (A)
-* $07 - odbiór rekordu o długości (B) pod adres (DE)+* $07 - odbiór z SIO rekordu o długości (B) pod adres (DE); długość $00 oznacza 256 bajtów
-* $08 - wysłanie rekordu o długości (B) spod adresu (DE) z zadanym potwierdzeniem (A)+* $08 - wysłanie na SIO rekordu o długości (B) spod adresu (DE) z zadanym potwierdzeniem (A); długość $00 to 256 bajtów
-* $09 - konwersja cyfry do formatu odpowiedniego dla wyswietlacza (A) do (A)+* $09 - konwersja cyfry do formatu odpowiedniego dla wyświetlacza (A do A)
-* $0A - konwersja dwucyfrowa decymalna (A) do (DE)+* $0A - konwersja dwucyfrowa decymalna (A do DE)
-* $0B - konwersja dwucyfrowa heksadecymalna (A) do (DE)+* $0B - konwersja dwucyfrowa heksadecymalna (A do DE)
* $0C - włączenie (CF=1) lub wyłączenie (CF=0) silnika * $0C - włączenie (CF=1) lub wyłączenie (CF=0) silnika
* $0D - aktualizacja statusu przełączników i zmiany dysku * $0D - aktualizacja statusu przełączników i zmiany dysku
Linia 66: Linia 66:
* $14 - zwraca adresy statusu i bieżącej ścieżki (DE i IX); numer ścieżki musi być pomnożony przez dwa * $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 ===+=== Porty I/O ===
 + 
 +* IN $0,$1 - sygnał audio
 +* IN $2,$3 - włączenie śledzenia impulsu indeksowego
 +* IN $4,$5 - inwertowanie linii TxD gniazda SIO
 +* IN $6,$7 - inwertowanie linii RxD gniazda SIO
 +* IN $8,$9 - włączanie/wyłączanie sygnału DDEN dla FDC
 +* IN $A,$B - włączenie/wyłączenie silnika
 +* IN $C,$D - wygenerowanie impulsu indeksowego
 +* IN $E,$F - wyłączenie/włączenie [[RAM Charger]]a w obszarze $0000-$7FFF.
 + 
 +=== Mapka pamięci ===
<table border = 1 cellpadding = 5> <table border = 1 cellpadding = 5>
<tr><td><b>Adres</b></td><td><b>Opis</b></td></tr> <tr><td><b>Adres</b></td><td><b>Opis</b></td></tr>
<tr><td>$0000-$0FFF</td><td>ROM z oprogramowaniem wewnętrznym stacji (4 kB).</td></tr> <tr><td>$0000-$0FFF</td><td>ROM z oprogramowaniem wewnętrznym stacji (4 kB).</td></tr>
-<tr><td>$1000-$6FFF</td><td>Obszar pusty lub zajęty na układy I/O.</td></tr>+<tr><td>$1000-$1FFF</td><td>
-<tr><td>$7000-$77FF</td><td>Powtórka RAM-u spod adresów $7800-$7FFF</td></tr>+<p>2 porty ośmiobitowe tylko do odczytu. $1000 i $1001 działają tak samo, z tym, że odczyt tego pierwszego zeruje zatrzaski.</p>
 +* bit 7: przycisk PROTECT
 +* bit 6: przycisk ERROR
 +* bit 5: przycisk ID
 +* bit 4: przycisk TRACK
 +* bit 3: nieużywany
 +* bit 2: stan przełącznika gęstości (sprawdzane tylko przy włączeniu zasilania)
 +* bit 1: wybór numeru napędu, stan przełącznika nr 2
 +* bit 0: wybór numeru napędu, stan przełącznika nr 1
 +</td></tr>
 +<tr><td>$2000-$2FFF</td>
 +<td><p>1 port ośmiobitowy:</p>
 +* bit 7: INTRQ (kontroler FDD)
 +* bit 6: DRQ (kontroler FDD)
 +* bit 5: COMMAND (SIO)
 +* bit 4: READY (SIO)
 +* bit 3: DATA IN (SIO)
 +* bit 2: DATA OUT (SIO)
 +* bit 1: CLOCK IN (SIO)
 +* bit 0: CLOCK OUT (SIO)
 +</td></tr>
 +<tr><td>$3000-$3FFF</td><td>
 +<p>1 port ośmiobitowy tylko do zapisu: sterowanie silnikiem krokowym napędu. Używane są tylko bity 0-3.</p>
 +</td></tr>
 +<tr><td>$4000-$4FFF</td><td><p>
 +1 port ośmiobitowy: prawa cyfra wyświetlacza. Skasowanie danego bitu powoduje zaświecenie się odpowiedniego segmentu wyświetlacza:</p>
 +* bit 0 - szczytowy segment
 +* bit 1 - prawy, góry segment
 +* bit 2 - prawy, dolny segment
 +* bit 3 - najniższy segment
 +* bit 4 - lewy, dolny segment
 +* bit 5 - lewy, górny segment
 +* bit 6 - środkowy segment
 +* bit 7 - lampka BUSY
 +</td></tr>
 +<tr><td>$5000-$5FFF</td><td><p>1 port ośmiobitowy: lewa cyfra wyświetlacza. Działa analogicznie do prawej, z tym, że bit 7 to ENPRE (enable precompensation) dla FDD.</p></td></tr>
 +<tr><td>$6000-$6FFF</td><td><p>Kontroler FDD:</p>
 +* $6000 - COMMAND/STATUS
 +* $6001 - TRACK
 +* $6002 - SECTOR
 +* $6003 - DATA
 +</td></tr>
 +<tr><td>$7000-$77FF</td><td><p>Powtórka adresów $7800-$7FFF</p></td></tr>
<tr><td>$7800-$7FFF</td><td> <tr><td>$7800-$7FFF</td><td>
<p>Pamięć RAM (2 kB):</p> <p>Pamięć RAM (2 kB):</p>
-* $7800-$7941 - bufor I/O (322 bajty)+* $7824-$7941 - bufor I/O (286 bajtów)
-* $7942-$7EFF - pamięć wewnętrzna (1470 bajtów)+* $7942-$7A7F - pamięć wewnętrzna (318 bajtów)
 +* $7A80-$7B7F - stos Z80 (256 bajtów)
 +* $7B80-$7EFF - pamięć wewnętrzna (896 bajtów); tu m.in. rezyduje [[Synchromesh]]
* $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> 
</td></tr> </td></tr>
</table> </table>
 +
 +Do bufora programu stacja wczytuje też pierwszy sektor włożonej dyskietki, gdy zostaną naciśnięte jednocześnie klawisze "DRIVE" i "ERROR", a potem próbuje go uruchomić. Służy to przede wszystkim do bootowania systemu [[CP/M]] - oczywiście tylko w stacjach z pamięcią RAM rozszerzoną do 64k.
=== Przykłady === === Przykłady ===
Linia 87: Linia 143:
Program wywołuje "sygnał ostrzegawczy" na linii audio, ten sam, którym stacja się posługuje dla zasygnalizowania np. błędów odczytu. Nie towarzyszy temu transmisja danych do komputera (DSTATS=$00), a o wysłanie potwierdzenia wykonania rozkazu "X" martwi się stacja. Program wywołuje "sygnał ostrzegawczy" na linii audio, ten sam, którym stacja się posługuje dla zasygnalizowania np. błędów odczytu. Nie towarzyszy temu transmisja danych do komputera (DSTATS=$00), a o wysłanie potwierdzenia wykonania rozkazu "X" martwi się stacja.
- LD C,$10 ;e0 10 numer funkcji: "bell"+ LD C,$10 ;0e 10 numer funkcji: "bell"
CALL $0004 ;cd 04 00 wykonać CALL $0004 ;cd 04 00 wykonać
LD A,$43 ;3e 43 kod potwierdzenia: "C" (Complete) LD A,$43 ;3e 43 kod potwierdzenia: "C" (Complete)
Linia 94: Linia 150:
==== Przykład nr 2: odczytanie numeru wersji ROM ==== ==== Przykład nr 2: odczytanie numeru wersji ROM ====
-Program przesyła do komputera dwa bajty stanowiące numer wersji ROM-u stacji. Procedura wysyła też końcowe potwierdzenie wykonania rozkazu "X". Kod pochodzi z programu [[Synchromesh]] dla [[CA-2001]].+Program przesyła do komputera dwa bajty stanowiące numer wersji ROM-u stacji zapisany w postaci dziesiętnej. Najpierw przesyłany jest numer rewizji, następnie numer wersji - a więc odpowiedź w rodzaju $20,$01 trzeba rozumieć jako wersję "1.20". Procedura wysyła też końcowe potwierdzenie wykonania rozkazu "X". Kod pochodzi z programu [[Synchromesh]] dla [[CA-2001]].
- LD C,$00 ;e0 00 numer funkcji: "version"+ LD C,$00 ;0e 00 numer funkcji: "version"
CALL $0004 ;cd 04 00 wykonać CALL $0004 ;cd 04 00 wykonać
LD ($7F17),DE ;ed 53 17 7F zapisz DE pod adres $7F17 w pamięci stacji LD ($7F17),DE ;ed 53 17 7F zapisz DE pod adres $7F17 w pamięci stacji
Linia 106: Linia 162:
OR A ;b7 CF=0 - transmisja zakończona OR A ;b7 CF=0 - transmisja zakończona
RET ;c9 powrót RET ;c9 powrót
 +
 +== Zobacz też ==
 +* [https://atariwiki.org/wiki/Wiki.jsp?page=Indus%20GT%20Firmware%20ROM%20Source Indus GT Firmware ROM source]
[[Kategoria:Peryferia_8-bit|LDW 2000 Super, Funkcje ROM]] [[Kategoria:Peryferia_8-bit|LDW 2000 Super, Funkcje ROM]]
[[Kategoria:Programowanie Atari 8-bit|LDW 2000 Super, Funkcje ROM]] [[Kategoria:Programowanie Atari 8-bit|LDW 2000 Super, Funkcje ROM]]
 +[[Kategoria:Niezbędnik kodera]]

Aktualna wersja

Do stacji Indus GT, LDW Super 2000 i CA-2001 można przesyłać własne podprogramy i zlecać ich wykonanie.

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 (zawsze <= 256)
  • DAUX1 - to samo, co w młodszym bajcie DBYT
  • DAUX2 - wartość $01 (download)

Wywołanie JSIOINT ($E459) z takimi parametrami spowoduje wysłanie programu do stacji. W tej chwili na jej 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ść $80, gdy uruchomiony kod oczekuje nadesłania z komputera dodatkowych danych; $40, gdy ma przesłać z powrotem do komputera jakieś wyniki; $C0, gdy zachodzi jedno i drugie, albo $00, gdy nic nie jest przesyłane.
  • 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

Program dla stacji musi być napisany w asemblerze Z80, gdyż taki właśnie procesor, taktowany zegarem 4 MHz, się tam znajduje. Komenda "X" ładuje kod do pamięci stacji pod adres $7F00. Ponieważ stacja typowo ma tylko 2k pamięci RAM zlokalizowanej w obszarze $7800-$7FFF, a pod wyższymi adresami zawartość całej pamięci od początku powtarza się, zatem przesyłany jednorazowo blok nie może mieć więcej niż 256 bajtów, gdyż bufor programu zajmuje ostatnią stronę pamięci RAM.

Ważne: procedura przesłana rozkazem "X" odpowiada za poprawne zakończenie transmisji SIO, tj. zwłaszcza za zadbanie, by komputer dostał końcowe potwierdzenie wykonania ("C") lub sygnał błędu ("E"). Jeśli w chwili opuszczania procedury (rozkazem RET) bit CF rejestru znaczników Z80 jest ustawiony, stanowi to sygnał dla stacji, że ma sama zakończyć transmisję przesyłając do komputera kod potwierdzenia umieszczony w rejestrze A (patrz przykład nr 1). W przeciwnym wypadku, gdy CF=0, jest to sygnał, że program użytkownika zatroszczył się o dopełnienie protokołu i żadne dalsze działania nie są potrzebne (patrz przykład 2).

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 ścieżki (D)
  • $04 - zapis sektora (E) na ścieżce (D)
  • $05 - odbiór bajtu z SIO (C)
  • $06 - wysłanie bajtu na SIO (A)
  • $07 - odbiór z SIO rekordu o długości (B) pod adres (DE); długość $00 oznacza 256 bajtów
  • $08 - wysłanie na SIO rekordu o długości (B) spod adresu (DE) z zadanym potwierdzeniem (A); długość $00 to 256 bajtów
  • $09 - konwersja cyfry do formatu odpowiedniego dla wyświetlacza (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

Porty I/O

  • IN $0,$1 - sygnał audio
  • IN $2,$3 - włączenie śledzenia impulsu indeksowego
  • IN $4,$5 - inwertowanie linii TxD gniazda SIO
  • IN $6,$7 - inwertowanie linii RxD gniazda SIO
  • IN $8,$9 - włączanie/wyłączanie sygnału DDEN dla FDC
  • IN $A,$B - włączenie/wyłączenie silnika
  • IN $C,$D - wygenerowanie impulsu indeksowego
  • IN $E,$F - wyłączenie/włączenie RAM Chargera w obszarze $0000-$7FFF.

Mapka pamięci

AdresOpis
$0000-$0FFFROM z oprogramowaniem wewnętrznym stacji (4 kB).
$1000-$1FFF

2 porty ośmiobitowe tylko do odczytu. $1000 i $1001 działają tak samo, z tym, że odczyt tego pierwszego zeruje zatrzaski.

  • bit 7: przycisk PROTECT
  • bit 6: przycisk ERROR
  • bit 5: przycisk ID
  • bit 4: przycisk TRACK
  • bit 3: nieużywany
  • bit 2: stan przełącznika gęstości (sprawdzane tylko przy włączeniu zasilania)
  • bit 1: wybór numeru napędu, stan przełącznika nr 2
  • bit 0: wybór numeru napędu, stan przełącznika nr 1
$2000-$2FFF

1 port ośmiobitowy:

  • bit 7: INTRQ (kontroler FDD)
  • bit 6: DRQ (kontroler FDD)
  • bit 5: COMMAND (SIO)
  • bit 4: READY (SIO)
  • bit 3: DATA IN (SIO)
  • bit 2: DATA OUT (SIO)
  • bit 1: CLOCK IN (SIO)
  • bit 0: CLOCK OUT (SIO)
$3000-$3FFF

1 port ośmiobitowy tylko do zapisu: sterowanie silnikiem krokowym napędu. Używane są tylko bity 0-3.

$4000-$4FFF

1 port ośmiobitowy: prawa cyfra wyświetlacza. Skasowanie danego bitu powoduje zaświecenie się odpowiedniego segmentu wyświetlacza:

  • bit 0 - szczytowy segment
  • bit 1 - prawy, góry segment
  • bit 2 - prawy, dolny segment
  • bit 3 - najniższy segment
  • bit 4 - lewy, dolny segment
  • bit 5 - lewy, górny segment
  • bit 6 - środkowy segment
  • bit 7 - lampka BUSY
$5000-$5FFF

1 port ośmiobitowy: lewa cyfra wyświetlacza. Działa analogicznie do prawej, z tym, że bit 7 to ENPRE (enable precompensation) dla FDD.

$6000-$6FFF

Kontroler FDD:

  • $6000 - COMMAND/STATUS
  • $6001 - TRACK
  • $6002 - SECTOR
  • $6003 - DATA
$7000-$77FF

Powtórka adresów $7800-$7FFF

$7800-$7FFF

Pamięć RAM (2 kB):

  • $7824-$7941 - bufor I/O (286 bajtów)
  • $7942-$7A7F - pamięć wewnętrzna (318 bajtów)
  • $7A80-$7B7F - stos Z80 (256 bajtów)
  • $7B80-$7EFF - pamięć wewnętrzna (896 bajtów); tu m.in. rezyduje Synchromesh
  • $7F00-$7FFF - bufor programu użytkownika (256 bajtów)

Do bufora programu stacja wczytuje też pierwszy sektor włożonej dyskietki, gdy zostaną naciśnięte jednocześnie klawisze "DRIVE" i "ERROR", a potem próbuje go uruchomić. Służy to przede wszystkim do bootowania systemu CP/M - oczywiście tylko w stacjach z pamięcią RAM rozszerzoną do 64k.

Przykłady

Przykład nr 1: 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. Nie towarzyszy temu transmisja danych do komputera (DSTATS=$00), a o wysłanie potwierdzenia wykonania rozkazu "X" martwi się stacja.

   LD   C,$10     ;0e 10         numer funkcji: "bell"
   CALL $0004     ;cd 04 00      wykonać
   LD   A,$43     ;3e 43         kod potwierdzenia: "C" (Complete)
   SCF            ;37            CF=1 - potwierdzenie z A wyśle ROM stacji
   RET            ;c9            powrot

Przykład nr 2: odczytanie numeru wersji ROM

Program przesyła do komputera dwa bajty stanowiące numer wersji ROM-u stacji zapisany w postaci dziesiętnej. Najpierw przesyłany jest numer rewizji, następnie numer wersji - a więc odpowiedź w rodzaju $20,$01 trzeba rozumieć jako wersję "1.20". Procedura wysyła też końcowe potwierdzenie wykonania rozkazu "X". Kod pochodzi z programu Synchromesh dla CA-2001.

   LD   C,$00      ;0e 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           CF=0 - transmisja zakończona
   RET             ;c9           powrót

Zobacz też

Personal tools