Ready/Run

Takie sobie archiwum listingów ze starych magazynów komputerowych


CPC Dump
  • Język programu: Locomotive Basic
  • Platforma: Amstrad
  • Kod zamieszczono w Bajtek 12/1987
  • Autor listingu: Wojciech Ziółek
  • Listing nadesłał: Faust

Stan listingu:

2
Listing skorygowany - zawiera błędy, uruchamia się na emulatorze lub realnej maszynie, jednak z organiczoną funkcjonalnością

 Wizja nadchodzącego, jak zwykle pechowego trzynastego odcinka cyklu sprawiła, że w autorze obudziło się sumienie i postanowił nie męczyć już dłużej czytelników widokiem monotonnych tabelek, wypełniających cenna przestrzeń Klanu Amstrad-Schneider. Jednakże sumienie nie zadowoliło się samym postanowieniem i zażądało pokuty, w ramach której zobligowało autora do odpowiedzi na dwa pytania: „po co to wszystko było drukowane?” i „co z tego ma Czytelnik?”. Kończąc cykl, skruszony autor odpowiada...

 
Dokładna znajomość systemu operacyjnego mikrokomputera pozwala nie tylko na oszacowanie jego możliwości, ale bardziej zaawansowanym użytkownikom umożliwia przystosowanie sprzętu do konkretnych i indywidualnych wymogów m.in. poprzez modyfikację lub rozbudowę procedur systemowych. Jednakże działalność taka jest możliwa tylko wtedy, gdy dysponuje się listą procedur i opisem ich działania... a także potrafi się programować w języku maszynowym.
Zamiarem autora nie było prowadzenie kursu programowania lecz dostarczenie niezbędnej dokumentacji. Wprawdzie niektóre procedury mogą być wywoływane bezpośrednio z poziomu BASIC-a i znacznie upraszczają pisanie programów (np. CALL & BBBA jest odpowiednikiem ciągu rozkazów: PAPER 0:PEN 1:ORIGIN 0,0: WINDOW #0,0, 639,0,399 lub CALL &BB18 zastąpi ciąg A$=””:WHILE A$=” „:A$=INKEY$:WEND) lecz większość procedur może być uaktywniana dopiero po ustaleniu pewnych stanów wejściowych w wymaganych dla danej procedury rejestrach. Taka sytuacja wymusza wprawdzie na programiście znajomość sposobu działania procedur systemu, ale jednocześnie pozwala na wprowadzanie pożądanych zmian.
Zacznijmy od najprostszych przykładów:
Procedura Screen Mode Set (ustalenie trybu pracy ekranu monitora) &BC0E w momencie uruchomienia odczytuje informację z rejestru A (akumulatora), mówiącą o wybranym trybie pracy. Pisząc program w języku maszynowym trzeba przed wywołaniem procedury wpisać do akumulatora 0,1 lub 2. Dla trybu MODE 2 wygląda to następująco: kod hex
 
kod hexa mnemonik
3E02 LD A,2 Wprowadź 2 do rej. A
CD0EBC CALL BC0E wywołaj procedurę Screen Mode Set
C9 RET powrót do programu
 
Procedura drukowania znaku na ekranie &BB5A wymaga podania w rejestrze A kodu znaku, ale jednak wcześniej trzeba również określić tryb pracy ekranu i pozycję na której ma być ten znak drukowany, czyli podać parametry wejściowe wymagane w procedurach odpowiednio & BC0E i & BB75 (patrz odcinek 7 i 4 cyklu). Wygląda to tak:
 
3E02 LD A,2 wprowadź 2 do akumulatora
CD0EBC CALL BC0EH wywołaj procedurę SMS
260A LD H,10 wprowadź numer kolumny (10)
2E10 LD L,16 wprowadź numer wiersza (16)
CD75BB CALL BB75H wywołaj procedurę &BB75 (pozycja)
3E42 LD A,66 wprowadź kod litery B do rej. A
CD5ABB CALL BB5AH wyświetl znak B na ekranie
C9 RET wróć do programu głównego
 
Modyfikacje procedur wymagają oczywiście bardziej skomplikowanych zabiegów, jednak ze względu na charakter cyklu i szczupłość miejsca podam jedynie mechanizm przeprowadzania modyfikacji. Załóżmy, że nie wystarcza nam 7-bitowy sprzęg w CPC, ponieważ chcemy wykorzystywać pełne możliwości przyłączanej do niego drukarki. Jednocześnie wiemy, iż drukarka ma możliwość ustawienia 8-go bitu po odebraniu określonego znaku lub sekwencji znaków (w przypadku DMP 2000 jest to ESC „>” i skasowania 8-go bitu po odebraniu innej sekwencji (ESC „=”). Mamy również świadomość, że procedura wywoływana przez & BD2B ograniczona jest właśnie 7-bitowym sprzęgiem. Rozwiązanie problemu polega na napisaniu programu, który najpierw sprawdzi, czy wysyłany do drukarki znak ma ustawiony ósmy bit. Jeśli znak ma ósmy bit = 0 to powinien być od razu przesłany do drukarki. W przeciwnym przypadku najpierw powinien być przesłany ESC „>”, następnie znak i ESC „ = „. Tak napisany program trzeba ulokować w pamięci RAM poza obszarem dostępnym dla BASICa (MEMORY HIMEM-długość programu) dołączając wcześniej do niego skopiowane z adresów & BD2B, &BD2C i &BD2D instrukcje skoku do precedury wydruku znaku w pamięci ROM. Teraz wystarczy wpisać pod adres &BD2B kod C3 (skok pod dwubajtowy adres), pod &BD2C młodszy bajt a pod &BD2D starszy bajt adresu początku naszego programu i po uruchomieniu drukować aż do chr$(225). Czytelników oczekujących gotowego rozwiązania informuję, że programy takie były już publikowane w naszej prasie (o ile dobrze pamiętam pionierem był pan Wojciech Wojtanowski z programem opublikowanym w Przeglądzie Technicznym).
Namawiając do dalszej samodzielnej pracy podaję dwa krótkie programy umożliwiające odczyt na ekranie monitora zawartości pamięci ROM (dolnej) w postaci kodów ASCI i heksadecymalnym. Niewielkie zmiany programu pozwolą również na odczyt zawartości pamięci ROM górnej.W tym celu należy: 
 
w linii   10 — wpisać ...ROM górny... &C000 do &FFFF 
w linii   40 — wpisać ... górnej...
w linii 110 — zamiast cd,06,bd wpisać cd,00,bd i zamiast 00,00,11 wpisać 00,c0,11
w linii 140 — zamiast (i-6000) wpisać i+6000).
 
Zachęcam do modyfikacji programów w celu uzyskania możliwości odczytu ograniczonej przestrzeni adresowej (np. zajmowanej tylko przez jedną procedurę) i organizacji wydruku na drukarce. Finis coronat opus!