|
Serwis Edukacyjny w I-LO w Tarnowie
Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej
Autorzy: dr Ian Logan i dr Frank O'Hara |
©2026 mgr Jerzy Wałaszek
|
Całość drukowania do głównej części ekranu, dolnej części oraz na drukarce jest obsługiwana przez ten zbiór procedur.
Do procedury PRINT-OUT następuje wejście z rejestrem A zawierającym kod znaku sterującego, znaku drukowalnego lub symbolu.
09F4 PRINT-OUT CALL 0B03,PO-FETCH Bieżąca pozycja druku.
CP +20 Jeśli kod przedstawia
JP NC,0AD9,PO-ABLE drukowalny znak, to skocz.
CP +06 Wydrukuj pytajnik dla
JR C,0A69,PO-QUEST kodów w zakresie +00 - +05.
CP +18 A również dla kodów +18 - +1F.
JR NC,0A69,PO-QUEST
LD HL,+0A0B Podstawa tablicy 'znaków sterujących'.
LD E,A Przenieś kod do
LD D,+00 pary rejestrów DE.
ADD HL,DE Zaindeksuj tablicę
LD E,(HL) i pobierz przesunięcie.
ADD HL,DE Dodaj przesunięcie i wykonaj
PUSH HL pośredni skok do
JP 0B03,PO-FETCH odpowiedniej procedury.adres przesunięcie znak adres przesunięcie znak 0A11 4E przecinek 0A1A 4F nieużywane 0A12 57 EDIT 0A1B 5F INK 0A13 10 kursor w lewo 0A1C 5E PAPER 0A14 29 kursor w prawo 0A1D 5D FLASH 0A15 54 kursor w dół 0A1E 5C BRIGHT 0A16 53 kursor w górę 0A1F 5B INVERSE 0A17 52 DELETE 0A20 5A OVER 0A18 37 ENTER 0A21 54 AT 0A19 50 nieużywane 0A22 53 TAB
Do procedury wchodzi się z rejestrem B zawierającym bieżący numer wiersza i z rejestrem C z bieżącym numerem kolumny.
0A23 PO-BACK-1 INC C Przesuń się w lewo o jedną kolumnę.
LD A,+22 Zaakceptuj tę zmianę, chyba że pozycja
CP C wyszła poza lewą krawędź.
JR NZ,0A3A,PO-BACK-3
BIT 1,(FLAGS) Jeśli obsługiwana jest drukarka, to
JR NZ,0A38,PO-BACK-2 skocz naprzód.
INC B Idź o jeden wiersz w górę.
LD C,+02 Ustaw wartość dla kolumny.
LD A,+18 Sprawdź z górnym wierszem.
CP B Uwaga: To powinno być +19.
JR NZ,0A3A,PO-BACK-3 Zaakceptuj tę zmianę, chyba że
pozycja jest u samej góry ekranu.
DEC B Nie do przyjęcia, więc o wiersz w dół.
0A38 PO-BACK-2 LD C,+21 Ustaw lewą kolumnę.
0A3A PO-BACK-3 JP 0DD9,CL-SET Wykonaj pośredni powrót przez
CL-SET i PO-STORE.Ta procedura wykonuje operację identyczną z poleceniem języka BASIC –
0A3D PO-RIGHT LD A,(P-FLAG) Pobierz P-FLAG i zachowaj na stosie.
PUSH AF
LD (P-FLAG),+01 Ustaw P-FLAG na OVER 1.
LD A,+20 'Spacja'.
CALL 0B65,PO-CHAR Drukuj znak.
POP AF Odtwórz starą wartość
LD (P-FLAG),A P-FLAG.
RET Skończone.
Uwaga: Programista zapomniał wyjść
poprzez PO-STORE.Jeśli obsługiwany wydruk idzie na drukarkę, to znak 'powrót karetki' prowadzi do wyczyszczenia bufora drukarki. Jeśli wydruk idzie na ekran, to przed zmniejszeniem numeru wiersza zostaje wykonany test na przesunięcie ekranu.
0A4F PO-ENTER BIT 1,(FLAGS) Skocz naprzód, jeśli obsługiwana jest
JP NZ,0ECD,COPY-BUFF drukarka.
LD C,+21 Ustaw na lewą kolumnę.
CALL 0C55,PO-SCR Przewiń ekran w razie potrzeby.
DEC B Teraz o wiersz w dół.
JP 0DD9,CL-SET Wykonaj pośredni powrót przez
CL-SET i PO-STORE.Przetworzona zostaje bieżąca wartość kolumny i rejestr A ustawiony na +00
(dla
0A5F PO-COMMA CALL 0B03,PO-FETCH Po co znowu?
LD A,C Bieżący numer kolumny.
DEC A Przesuń się w prawo o dwie kolumny
DEC A i wykonaj test.
AND +10 Rejestr A będzie zawierał +00 lub +10.
JR 0AC3,PO-FILL Wyjdź przez PO-FILL.Przy każdej próbie wydruku niedrukowalnego kodu zostaje wydrukowany pytajnik.
0A69 PO-QUEST LD A,+3F Znak '?'.
JR 0AD9,PO-ABLE A teraz wydrukuj go zamiast znaku pierwotnego.Znaki sterujące od INK do OVER wymagają pojedynczego parametru, natomiast znaki AT i TAB wymagają dwóch parametrów.
Obecna procedura prowadzi do zapisania kodu znaku sterującego w TVDATA-lo, pierwszego parametru w TVDATA-hi lub w rejestrze A, jeśli jest wymagany tylko jeden parametr, a drugiego parametru w rejestrze A.
0A6D PO-TV-2 LD DE,+0A87 Zachowaj pierwszy parametr w
LD (TVDATA-hi),A TVDATA-hi i zmień
JR 0A80,PO-CHANGE adres procedury 'wyprowadzania'
na PO-CONT (+0A87).Tutaj jest wejście dla obsługi znaków AT i TAB.
0A75 PO-2-OPER LD DE,+0A6D Kod znaku zostanie
JR 0A7D,PO-TV-1 zachowany w TVDATA-lo, a adres
procedury 'wyprowadzania'
zmieniony na PO-TV-2 (+0A6D).Tutaj jest wejście przy obsłudze elementów koloru – od INK do OVER.
0A7A PO-1-OPER LD DE,+0A87 Procedura 'wyprowadzania' musi być
zmieniona na PO-CONT (+0A87).
0A7D PO-TV-1 LD (TVDATA-lo),A Zachowaj kod znaku sterującego.Tymczasowo zostaje zmieniony adres bieżącej procedury 'wyprowadzania'.
0A80 PO-CHANGE LD HL,(CURCHL) HL będzie wskazywało na
adres procedury 'wyprowadzania'.
LD (HL),E Zmień ten adres
INC HL i w ten sposób
LD (HL),D wymuś interpretację kolejnego kodu znaku
RET jako parametru.Gdy zostaną zebrane parametry, procedura jest kontynuowana.
0A87 PO-CONT LD DE,+09F4 Przywróć pierwotny adres
CALL 0A80,PO-CHANGE dla PRINT-OUT (+09F4).
LD HL,(TVDATA) Pobierz kod sterujący i pierwszy
parametr, jeśli rzeczywiście są
dwa parametry.
LD D,A 'Ostatni' parametr i
LD A,L kod sterujący zostają przeniesione.
CP +16 Skocz naprzód, jeśli są obsługiwane
JP C,2211,CO-TEMPS znaki od INK do OVER.
JR NZ,0AC2,PO-TAB Skocz naprzód przy obsłudze TAB.Teraz zajmij się znakiem sterującym AT.
LD B,H Numer wiersza.
LD C,D Numer kolumny.
LD A,+1F Odwróć numer kolumny;
SUB C tj. +00 - +1F staje się +1F - +00.
JR C,0AAC,PO-AT-ERR Musi być w zakresie.
ADD A,+02 Dodaj przesunięcie, aby otrzymać
LD C,A w C wartość +21 - +22.
BIT 1,(FLAGS) Skocz naprzód, jeśli obsługiwana
JR NZ,0ABF,PO-AT-SET jest drukarka.
LD A,+16 Odwróć numer wiersza;
SUB B tj. +00 - +15 staje się +16 - +01.
0AAC PO-AT-ERR JP C,1E9F,REPORT-B Jeśli numer poprawny, skocz naprzód.
INC A Zakres +16 - +01 przechodzi
LD B,A w +17 - +02.
INC B A teraz w +18 - +03.
BIT 0,(TV-FLAG) Jeśli wydruk dotyczy dolnej części
JP NZ,0C55,PO-SCR ekranu, to rozważ konieczność
przewinięcia treści.
CP (DF-SZ) Generuj raport 5 - Poza ekranem,
JP C,0C86,REPORT-5 jeśli to konieczne.
0ABF PO-AT-SET JP 0D09,CL-SET Powróć poprzez CL-SET i PO-STORE.Znak sterujący TAB.
0AC2 PO-TAB LD A,H Pobierz pierwszy parametr.
0AC3 PO-FILL CALL 0B03,PO-FETCH Bieżąca pozycja wydruku.
ADD A,C Dodaj bieżący numer kolumny.
DEC A Znajdź liczbę potrzebnych 'spacji'
AND +1F modulo 32 i powróć,
RET Z jeśli wynikiem jest zero.
LD D,A Użyj wyniku jako licznika.
SET 0,(FLAGS) Wymuś 'wiodącą spację'.
0AD0 PO-SPACE LD A,+20 Drukuj 'D' spacji.
CALL 0C3B,PO-SAVE
DEC D
JR NZ,0AD0,PO-SPACE
RET Teraz skończone.Wymagany znak (lub znaki) jest drukowany przez wywołanie PO-ANY, a później PO-STORE.
0AD9 PO-ABLE CALL 0B24,PO-ANY Drukuj znak (znaki) i przejdź do PO-STORE.W odpowiednich zmiennych systemowych zostają zapisane wartości wiersza i kolumny dla nowej pozycji oraz adres 'pikseli'.
0ADC PO-STORE BIT 1,(FLAGS) Skocz naprzód przy obsłudze
JR NZ,0AFC,PO-ST-PR drukarki.
BIT 0,(TV-FLAG) Skocz naprzód przy obsłudze
JR NZ,0AF0,PO-ST-E dolnej części ekranu.
LD (S-POSN),BC Zachowaj wartości odnoszące się
LD (DF-CC),HL do głównej części ekranu.
RET Następnie powróć.
0AF0 PO-ST-E LD (S-POSNL),BC Zachowaj wartości odnoszące się
LD (ECHO-E),BC do dolnej części ekranu.
LD (DF-CCL),HL
RET Następnie powróć.
0AFC PO-ST-PR LD (P-POSN),C Zachowaj wartości odnoszące się
LD (PR-CC),HL do bufora drukarki.
RET I powróć.Bieżące parametry pozycji zostają pobrane z odpowiednich zmiennych systemowych.
0B03 PO-FETCH BIT 1,(FLAGS) Skocz naprzód przy obsłudze
JR NZ,0B1D,PO-F-PR drukarki.
LD BC,(S-POSN) Pobierz wartości związane
LD HL,(DF-CC) z główną częścią ekranu
BIT 0,(TV-FLAG) i wróć, jeśli
RET Z taki był zamiar.
LD BC,(S-POSNL) W przeciwnym razie pobierz wartości
LD HL,(DF-CCL) odnoszące się do dolnej części
RET ekranu i powróć.
0B1D PO-F-PR LD C,(P-POSN) Pobierz wartości związane
LD HL,(PR-CC) z buforem drukarki.
RETOddzielnie są traktowane kody zwykłych znaków, kody nazw symbolicznych, kody grafik definiowanych przez użytkownika oraz kody znaków graficznych.
0B24 PO-ANY CP +80 Przy zwykłych kodach znaków
JR C,0B65,PO-CHAR skocz do przodu.
CP +90 Skocz do przodu przy kodach
JR NC,0B52,PO-T&UDG symboli i UDG.
LD B,A Przenieś kod grafiki.
CALL 0B38,PO-GR-1 Utwórz kształt graficzny.
CALL 0B03,PO-FETCH HL zostało zaburzone,
więc 'pobierz' ponownie.
LD DE,+5C92 Ustaw DE na początek
kształtu graficznego, tj. MEMBOT.
JR 0B7F,PO-ALL Skocz naprzód, aby wydrukować
ten znak graficzny.Znaki graficzne są budowane w sposób prowizoryczny w obszarze pamięci kalkulatora, tj. MEM-0 i MEM-1.
0B38 PO-GR-1 LD HL,+5C92 To jest MEMBOT.
CALL 0B3E,PO-GR-2 W efekcie wywołaj poniższą
procedurę dwukrotnie.
0B3E PO-GR-2 RR B Określ bit 0 (a później bit 2)
SBC A,A kodu grafiki.
AND +0F Rejestr A będzie zawierał +00 lub
+0F zależnie od wartości badanego
bitu w kodzie.
LD C,A Zapisz wynik w C.
RR B Określ bit 1 (a później bit 3)
SBC A,A kodu grafiki.
AND +F0 Rejestr A będzie zawierał +00
lub +F0.
OR C Oba wyniki są łączone.
LD C,+04 Rejestr A zawiera połowę
0B4C PO-GR-3 LD (HL),A kształtu znaku i musi być
INC HL użyty cztery razy.
DEC C Robi się to dla górnej
JR NZ,0B4C,PO-GR-3 połówki znaku graficznego,
RET a potem dla dolnej.Kody symboli i znaków grafiki użytkownika są teraz oddzielone.
0B52 PO-T&UDG SUB +A5 Skocz naprzód przy kodach symboli
JR NC,0B5F,PO-T
ADD A,+15 kody UDG mają teraz zakres +00 - +0F.
PUSH BC Zachowaj wartość bieżącej pozycji
na stosie maszynowym.
LD BC,(UDG) Pobierz adres bazowy
JR 0B6A,PO-CHAR-2 obszaru UDG i skocz naprzód.
0B5F PO-T CALL 0C10,PO-TOKENS Teraz drukuj symbol i powróć
JP 0B03,PO-FETCH przez PO-FETCH.Zostaje zidentyfikowany wymagany kształt znaku.
0B65 PO-CHAR PUSH BC Bieżąca pozycja jest zapamiętywana.
LD BC,(CHARS) Adres bazowy obszaru
znaków zostaje pobrany.
0B6A PO-CHAR-2 EX DE,HL Adres druku zostaje zapamiętany.
LD HL,+5C3B To jest zmienna FLAGS.
RES 0,(HL) Zezwól na wiodącą spację.
CP +20 Skocz naprzód, jeśli ten znak
JR NZ,0B76,PO-CHAR-3 nie jest 'spacją'.
SET 0,(HL) Lecz 'zlikwiduj', jeśli jest.
0B76 PO-CHAR-3 LD H,+00 Teraz przekaż kod znaku
LD L,A do pary rejestrów HL.
ADD HL,HL W efekcie kod znaku zostaje
ADD HL,HL pomnożony przez 8.
ADD HL,HL
ADD HL,BC Zostaje znaleziony adres bazowy
kształtu znaku.
POP BC Pobrana zostaje bieżąca pozycja
EX DE,HL a adres bazowy jest przekazywany
do pary rejestrów DE.Ta procedura jest używana do wydruku znaków
0B7F PR-ALL LD A,C Pobierz numer kolumny.
DEC A Przesuń się o jedną kolumnę w prawo.
LD A,+21 Skocz naprzód, o ile nie jest
JR NZ,0893,PR-ALL-1 wskazywany nowy wiersz.
DEC B Przejdź o jeden wiersz w dół.
LD C,A Numer kolumny wynosi +21.
BIT 1,(FLAGS) Skocz naprzód przy obsłudze
JR Z,0B93,PR-ALL-1 ekranu.
PUSH DE Zachowaj adres bazowy podczas
CALL 0ECD,COPY-BUFF opróżniania bufora drukarki
POP DE
LD A,C Kopiuj numer nowej kolumny.
0B93 PR-ALL-1 CP C Sprawdź, czy nowy wiersz
PUSH DE jest w użyciu. jeśli tak,
CALL Z,0C55,PO-SCR sprawdź, czy ekran nie wymaga
POP DE przewinięcia.Teraz rozważ obecny stan INVERSE i OVER
PUSH BC Zachowaj wartości pozycji
PUSH HL oraz adres przeznaczenia
na stosie maszynowym.
LD A,(P-FLAG) Pobierz P-FLAG i odczytaj bit 0.
LD B,+FF Przygotuj maskę OVER w
RRA rejestrze B; tj. OVER 0 = +00,
JR C,0BA4,PR-ALL-2 a OVER 1 = +FF.
INC B
0BA4 PR-ALL-2 RRA Czytaj bit 2 z P-FLAG i
RRA przygotuj maskę INVERSE
SBC A,A w rejestrze C; tj.
LD C,A INVERSE 0 = +00, a
INVERSE 1 = +FF.
LD A,+08 Ustaw rejestr A jako
AND A licznik linii pikseli i
wyczyść znacznik przeniesienia.
BIT 1,(FLAGS) Skocz naprzód przy obsłudze
JR Z,0BB6,PR-ALL-3 ekranu.
SET 1,(FLAGS2) Sygnalizuj 'bufor drukarki już nie jest
pusty'.
SCF Ustaw znacznik przeniesienia, aby pokazać,
że drukarka jest w użyciu.
0BB6 PR-ALL-3 EX DE,HL Zamień adres przeznaczenia
z adresem bazowym przed wejściem do pętli.Teraz znak może zostać wydrukowany. Jest wykonywane osiem obiegów pętli – jeden dla każdej linii pikseli.
0BB7 PR-ALL-4 EX AF,A'F' Znacznik przeniesienia jest ustawiony, gdy
używa się drukarki. Zachowaj ten znacznik w F'.
LD A,(DE) Pobierz istniejącą linię pikseli.
AND B Użyj maski OVER, a następnie wykonaj operację
XOR (HL) XOR wyniku z linią pikseli
z kształtu znaku.
XOR C Na koniec rozważ maskę INVERSE.
LD (DE),A Wstaw wynik.
EX AF,A'F' Pobierz znacznik drukarki i
JR C,0BD3,PR-ALL-6 w razie konieczności skocz naprzód.
INC D Uaktualnij adres przeznaczenia
0BC1 PR-ALL-5 INC HL Uaktualnij linię pikseli
kształtu znaku.
DEC A Zmniejsz licznik i skocz na
JR NZ,0BB7,PR-ALL-4 początek pętli, jeśli nie wynosi zero.Po wydrukowaniu znaku bajt atrybutu musi zostać ustawiony wedle potrzeb.
EX DE,HL Ustaw rejestr H na poprawny
DEC H górny adres obszaru znaków.
BIT 1,(FLAGS) Ustaw bajt atrybutu tylko przy
CALL Z,0BDB,PO-ATTR obsługiwaniu ekranu.
POP HL Przywróć oryginalny
POP BC adres przeznaczenia oraz
wartości pozycji.
DEC C Zmniejsz numer kolumny
INC HL i zwiększ adres przeznaczenia
RET przed powrotem.Gdy drukarka jest w użyciu, to adres przeznaczenia musi być uaktualniany skokami co +20.
0BD3 PR-ALL-6 EX AF,A'F' Znów zachowaj znacznik drukarki.
LD A,+20 Potrzebna wartość przyrostu.
ADD A,E Dodaj ją i przekaż wynik
LD E,A z powrotem do rejestru E.
EX AF,A'F' Pobierz znacznik.
JR 0BC1,PR-ALL-5 Skocz wstecz w pętlę.Odpowiedni atrybut zostaje zidentyfikowany i pobrany. Nowa wartość jest tworzona przez manipulacje starą wartością, ATTR-T, MASK-T i P-FLAG. Na koniec ta nowa wartość zostaje skopiowana do obszaru atrybutów.
0BDB PO-ATTR LD A,H Górny bajt adresu przeznaczenia
RRCA zostaje podzielony przez osiem
RRCA i poddany operacji AND +03
RRCA w celu określenia, która z
AND +03 1/3 ekranu jest adresowana;
tj. 00, 01 lub 02.
OR +58 Tworzony jest następnie starszy bajt
LD H,A obszaru atrybutów.
LD DE,(ATTR-T) D zawiera ATTR-T, a
E zawiera MASK-T.
LD A,(HL) Wartość starego atrybutu.
XOR E Wartość MASK-T i
AND D ATTR-R są brane pod
XOR E uwagę.
BIT 6,(P-FLAG) Skocz naprzód o ile nie
JR Z,0BFA,PO-ATTR-1 jest obsługiwane PAPER 9.
AND +C7 Stary kolor papieru zostaje zignorowany
i w zależności czy kolor tuszu
BIT 2,A jest jasny lub ciemny
JR NZ,0BFA,PO-ATTR-1 nowy kolor papieru będzie
XOR +38 czarny (000) lub biały (111).
0BFA PO-ATTR-1 BIT 4,(P-FLAG) Skocz naprzód o ile nie jest
JR Z,0C08,PO-ATTR-2 obsługiwane INK 9.
AND +F8 Stary kolor tuszu jest ignorowany
i zależnie czy kolor papieru
BIT 5,A jest jasny lub ciemny nowy
JR NZ,0C08,PO-ATTR-2 kolor tuszu będzie czarny (000)
XOR +07 lub biały (111).
0C08 PO-ATTR-2 LD (HL),A Wprowadź wartość nowego atrybutu
RET i powróć.Ta procedura jest używana do drukowania wiadomości oraz nazw. Rejestr A zawiera 'numer wejścia' wiadomości lub nazwy w tablicy. Para rejestrów DE zawiera adres bazowy tej tablicy.
0C0A PO-MSG PUSH HL Starszy bajt ostatniej wartości
LD H,+00 na stosie maszynowym jest zerowany,
EX (SP),HL aby usunąć wiodące spacje (patrz niżej).
JR 0C14,PO-TABLE Skocz naprzód.Wejście przy rozwijaniu kodów nazw.
0C10 PO-TOKENS LD DE,+0095 Adres bazowy tablicy nazw.
PUSH AF Zachowaj kod na stosie.
(Zakres +00 - +5A; RND - COPY).Tablica zostaje przeszukana i właściwa pozycja wydrukowana.
0C14 PO-TABLE CALL 0C41,PO-SEARCH Znajdź pożądaną pozycję.
JR C,0C22,PO-EACH Drukuj wiadomość/nazwę.
LD A,+20 Zostanie wydrukowana spacja
BIT 0,(FLAGS) przed wiadomością/nazwą,
CALL Z,0C3B,PO-SAVE jeśli jest wymagana.Znaki wiadomości/nazwy są kolejno drukowane.
0C22 PO-EACH LD A,(DE) Pobierz kod.
AND +7F Usuń każdy 'odwrócony bit'.
CALL 0C3B,PO-SAVE Drukuj znak.
LD A,(DE) Pobierz ponownie kod.
INC DE Przesuń do przodu wskaźnik.
ADD A,A 'Odwrócony bit' idzie do
JR NC,0C22,PO-EACH znacznika przeniesienia i sygnalizuje
koniec wiadomości/nazwy;
inaczej skocz wstecz.Teraz rozważ, czy jest wymagana spacja końcowa.
POP DE Dla wiadomości - D zawiera +00;
dla nazw - D zawiera +00 - +5A.
CP +48 Skocz naprzód, jeśli ostatnim
JR Z,0C35,PO-TR-SP znakiem było '$'.
CP +82 Wróć, jeśli ostatnim znakiem
RET C był dowolny znak przed 'A'.
0C35 PO-TRSP LD A,D Zbadaj wartość w D i
CP +03 wróć, jeśli oznacza
RET C wiadomość, RND, INKEY$ lub PI.
LD A,+20 Wszystkie pozostałe przypadki będą wymagały
spacji końcowej.Ta procedura umożliwia rekurencyjne drukowanie znaków. Odpowiednie rejestry zostają zachowane przy wywołaniu 'PRINT-OUT'.
0C3B PO-SAVE PUSH DE Zachowaj parę rejestrów DE.
EXX Zachowaj HL i BC.
RST 0010,PRINT-A-1 Drukuj pojedynczy znak.
EXX Odtwórz HL i BC.
POP DE Odtwórz DE.
RET Skończone.Procedura wraca z parą rejestrów DE wskazującą na początkowy znak pożądanej pozycji w tablicy oraz z wyzerowanym znacznikiem przeniesienia, jeśli należy rozważyć 'spację wiodącą'.
0C41 PO-SEARCH PUSH AF Zachowaj 'numer pozycji'.
EX DE,HL HL teraz zawiera adres bazowy.
INC A Utwórz zakres +01 - ?.
0C44 PO-STEP BIT 7,(HL) Czekaj na 'znak odwrócony'
INC HL
JR Z,0C44,PO-STEP
DEC A Zliczaj przez pozycje
JR NZ,0C44,PO-STEP aż zostanie znaleziona właściwa.
EX DE,HL DE wskazuje na początkowy znak.
POP AF Pobierz 'numer pozycji' i
CP +20 wróć z ustawionym przeniesieniem
RET C dla pierwszych 32 pozycji.
LD A,(DE) Jednak jeśli początkowym
SUB +41 znakiem jest litera, to
RET może być potrzebna spacja wiodąca.Ta procedura jest wywoływana zawsze wtedy, gdy może zaistnieć potrzeba przewinięcia ekranu. Zdarza się to w trzech przypadkach:
i gdy jest obsługiwany znak 'powrotu karetki', czyli znak
końca wiersza;
ii gdy używane jest AT w wierszu INPUT;
iii gdy bieżący wiersz jest pełen i należy użyć następnego wiersza.
Na wejściu rejestr B zawiera numer testowanego wiersza.
0C55 PO-SCR BIT 1,(FLAGS) Powróć natychmiast, jeśli jest
RET NZ używana drukarka.
LD DE,+0DD9 Załaduj na stos maszynowy
PUSH DE adres 'CL-SET'.
LD A,B Przenieś numer wiersza.
BIT 0,(TV-FLAG) Skocz naprzód, jeśli jest rozważane
JP NZ,0D02,PO-SCR-4 'INPUT ... AT ..'.
CP (DF-SZ) Powróć poprzez CL-SET, jeśli numer
JR C,0C86,REPORT-6 wiersza jest większy od wartości
RET NZ w DF-SZ; daj raport 5, jeśli jest
mniejszy; inaczej kontynuuj.
BIT 4,(TV-FLAG) Skocz naprzód o ile nie jest obsługiwany
JR Z,0C88,PO-SCR-2 'automatyczny listing'.
LD E,(BREG) Pobierz licznik wierszy.
DEC E Zmniejsz ten licznik.
JR Z,0CD2,PO-SCR-3 Skocz naprzód, jeśli ten listing
jest ustawiony na przewijanie.
LD A,+00 Inaczej otwórz kanał 'K',
CALL 1601,CHAN-OPEN odtwórz wskaźnik stosu,
LD SP,(LIST-SP) oznacz, że automatyczny
RES 4,(TV-FLAG) listing zakończył się i
RET wróć poprzez CL-SET.Raport 5 - Poza ekranem
0C86 REPORT-5 RST 0008,ERROR-1 Wywołaj procedurę obsługi
DEFB +04 błędów.Teraz rozważ, czy wymagane jest pytanie 'scroll?'.
0C88 PO-SCR-2 DEC (SCR-CT) Zmniejsz licznik przesunięć
JR NZ,0CD2,PO-SCR-3 i idź naprzód, aby wyświetlić to pytanie
tylko wtedy, jeśli osiągnie zero.Kontynuuj z wyświetleniem wiadomości.
LD A,+18 Licznik zostaje ustawiony na nowo.
SUB B
LD (SCR-CT),A
LD HL,(ATTR-T) Bieżące wartości ATTR-T oraz
PUSH HL MASK-T zostają zachowane.
LD A,(P-FLAG) Bieżąca wartość P-FLAG
PUSH AF zostaje zachowana.
LD A,+FD Otwarty zostaje kanał 'K'.
CALL 1601,CHAN-OPEN
XOR A Wiadomość 'scroll?' jest
LD DE,+0CF8 wiadomością '0'. Ta wiadomość zostaje
CALL 0C0A,PO-MSG teraz wypisana.
SET 5,(TV-FLAG) Sygnalizuj 'czyszczenie dolnej części ekranu
po naciśnięciu klawisza'.
LD HL,+5C3B To jest FLAGS.
SET 3,(HL) Sygnalizuj 'tryb L'.
RES 5,(HL) Sygnalizuj 'jeszcze żaden klawisz'.
EXX Uwaga: DE również powinno być zachowane.
CALL 15D4,WAIT-KEY Pobierz kod pojedynczego klawisza.
EXX Przywróć rejestry.
CP +20 Nastąpi skok naprzód do
JR Z,0D00,REPORT-D REPORT-D - 'BREAK - CONT
CP +E2 repeats' - jeśli klawiszem
JR Z,0D00,REPORT-D było 'BREAK', 'STOP', 'N' lub
OR +20 'n'; inaczej zaakceptuj klawisz
CP +6E jako zgodę na przewinięcie
JR Z,0D00,REPORT-D treści ekranu.
LD A,+FE Otwórz kanał 'S'.
CALL 1601,CHAN-OPEN
POP AF Przywróć wartość
LD (P-FLAG),A P-FLAG.
POP HL Przywróć wartości ATTR-T
LD (ATTR-T),HL i MASK-T.Teraz ekran jest przewijany
0CD2 PO-SCR-3 CALL 0DFE,CL-SC-ALL Cały ekran jest przewijany.
LD B,(DF-SZ) Numery wiersza i kolumny
INC B początku wiersza ponad
LD C,+21 dolną częścią ekranu
PUSH BC zostają znalezione i zachowane.
CALL 0E9B,CL-ADDR Odpowiedni bajt atrybutu
LD A,H dla tego obszaru znaków jest następnie
RRCA znajdowany. Para rejestrów HL
RRCA zawiera adres tego bajtu
RRCA
AND +03
OR +58
LD H,APrzetwarzany wiersz będzie miał wartości atrybutów z dolnej części ekranu, a nowy wiersz na spodzie ekranu może posiadać wartości 'ATTR-P', zatem atrybuty te są wymieniane.
LD DE,+5AE0 DE wskazuje na pierwszy bajt
atrybutu dolnego wiersza.
LD A,(DE) Wartość ta zostaje pobrana.
LD C,(HL) Wartość 'dolnej części'.
LD B,+20 Jest trzydzieści dwa bajty.
EX DE,HL Zamień wskaźniki ze sobą.
0CF0 PO-SCR-3A LD (DE),A Dokonaj pierwszej wymiany
LD (HL),C i używaj tej samej wartości
INC DE dla trzydziestu dwóch bajtów
INC HL atrybutów tych dwóch przetwarzanych
DJNZ 0CF0,PO-SCR-3A wierszy.
POP BC Numery wiersza i kolumny
dolnego wiersza 'górnej części'
RET zostają pobrane przed powrotem0CF8 DEFB +80 Początkowy znacznik - jest pomijany.
DEFB +73,+63,+72,+6F s-c-r-o
DEFB +6C,+6C,+BF l - l - ? (zanegowany).Report 0 - BREAK - CONT powtarza
0D00 REPORT-D RST 0008,ERROR-1 Wywołaj procedurę obsługi
DEFB +0C błędów.Dolna część ekranu jest obsługiwana następująco:
0D02 PO-SCR-4 CP +02 Błąd 'poza ekranem' powstaje,
JR C,0C86,REPORT-5 jeśli dolna część jest
ADD A,(DF-SZ) zbyt duża, a powrót zostaje
SUB +19 wykonany, gdy przewijanie jest
RET NC zbędne.
NEG Rejestr A będzie teraz zawierał
'liczbę przewinięć do wykonania'.
PUSH BC Teraz zostają zachowane numery
wiersza i kolumny.
LD B,A Zachowane są 'liczba przewinięć',
LD HL,(ATTR-T) ATTR-T, MASK-T i P-FLAG
PUSH HL
LD HL,(P-FLAG)
PUSH HL
CALL 0D40,TEMPS Mają być używane kolory 'stałe'.
LD A,B Pobrana zostaje 'liczba przewinięć'.Teraz jest przewijana dolna część ekranu 'A' razy.
0D1C PO-SCR-4A PUSH AF Zachowaj tę 'liczbę'.
LD HL,+5C6B To jest DF-SZ.
LD B,(HL) Wartość w DF-SZ jest
LD A,B zwiększana; rejestr B zostaje
INC A ustawiony na starą wartość,
LD (HL),A a rejestr A na nową wartość.
LD HL,+5C89 To jest starszy bajt S-POSN.
CP (HL) Skok zostanie wykonany,
JR C,0D2D,PO-SCR-4B gdy tylko dolna część ekranu ma być
przewinięta. (B = stare DF-SZ).
INC (HL) Inaczej starszy bajt S-POSN
LD B,+18 zostaje zwiększony i przewinięty
cały ekran. (B = +18)
0D2D PO-SCR-4B CALL 0E00,CL-SCROLL Przewiń 'B' wierszy.
POP AF Pobierz i zmniejsz
DEC A 'liczbę przewinięć'.
JR NZ,0D1C,PO-SCR-4A Skocz do tyłu aż do zakończenia.
POP HL Przywróć wartość
LD (P-FLAG),L P-FLAG.
POP HL Przywróć wartość ATTR-T
LD (ATTR-T),HL i MASK-T.
LD BC,(S-POSN) Jeśli S-POSN zostało zmienione,
RES 0,(TV-FLAG) jest wywoływane CL-SET, aby
CALL 0DD9,CL-SET nadać właściwą wartość zmiennej DF-CC.
SET 0,(TV-FLAG) Zresetuj znacznik, aby wskazać, że
POP BC jest przetwarzana dolna część ekranu,
RET pobierz numery wiersza i kolumny,
a następnie powróć.Jest to w pewnym sensie najważniejsza procedura. Używa się jej zawsze, gdy 'stałe' elementy muszą być skopiowane do 'tymczasowych' zmiennych systemowych. Najpierw są rozważane ATTR-T i MASK-T.
0D4D TEMPS XOR A A jest ustawiane na +00.
LD HL,(ATTR-P) Bieżące wartości ATTR-P
BIT 0,(TV-FLAG) i MASK-P są pobierane.
JR Z,0D5B,TEMPS-1 Skocz naprzód, jeśli jest przetwarzana
główna część ekranu.
LD H,A Inaczej użyj zamiennie +00 i wartości
LD L,(BORDCR) w BORDCR.
0D5B TEMPS-1 LD (ATTR-T),HL Teraz ustaw ATTR-T i MASK-T.Następnie brany pod uwagę jest P-FLAG.
LD HL,+5C91 To jest P-FLAG.
JR NZ,0D65,TEMPS-2 Skocz naprzód, jeśli jest obsługiwana
dolna część ekranu(A = +00).
LD A,(HL) Inaczej pobierz wartość
RRCA P-FLAG i przesuń bity nieparzyste
na bity parzyste.
0D65 TEMPS-2 XOR (HL) Skopiuj bity parzyste
AND +55 rejestru A do P-FLAG.
XOR (HL)
LD (HL),A
RETW pierwszym egzemplarzu 'czyszczona' jest całość ekranu – 'piksele' są wszystkie zerowane, a bajty atrybutów ustawione na wartość z ATTR-P – potem zostaje przebudowana dolna część ekranu.
0D6B CLS CALL 0DAF,CL-ALL 'Czyszczony' jest cały ekran.
0D6E CLS-LOWER LD HL,+5C3C To jest TV-FLAG.
RES 5,(HL) Sygnalizuj 'nie czyść spodu
ekranu po naciśnięciu klawisza'.
SET 0,(HL) Sygnalizuj 'dolną część'.
CALL 0D4D,TEMPS Użyj stałej wartości, tj.
ATTR-T zostaje skopiowane z BORDCR.
LD B,(DF-SZ) Dolna część ekranu jest teraz
CALL 0E44,CL-LINE 'czyszczona' z tymi wartościami.Z wyjątkiem bajtów atrybutów dla wierszy 22 i 23, bajty atrybutów dla wierszy w dolnej części ekranu będą musiały zostać wyrównane do ATTR-P.
LD HL,+5AC0 Bajt atrybutów na początku wiersza 22.
LD A,(ATTR-P) Pobierz ATTR-P.
DEC B Licznik wierszy.
JR 0D8E,CLS-3 Skocz naprzód do pętli.
0D87 CLS-1 LD C,+20 +20 znaków na wiersz.
0D89 CLS-2 DEC HL Cofaj się wzdłuż wiersza, ustawiając
LD (HL),A kolejne bajty atrybutów.
DEC C
JR NZ,0D89,CLS-2
0D8E CLS-3 DJNZ 0D87,CLS-1 Skocz w pętli wstecz aż do zakończenia.Teraz można będzie ustalić rozmiar dolnej części ekranu.
LD (DF-SZ),+02 Będzie miała rozmiar dwóch wierszy.
Teraz pozostaje jedynie wykonać następujące 'porządki domowe'.
0D94 CL-CHAN LD A,+FD Otwórz kanał 'K'.
CALL 1601,CHAN-OPEN
LD HL,(CURCHL) Pobierz adres bieżącego
LD DE,+09F4 kanału i ustaw adres wyjścia
AND A na +09F4 (= PRINT-OUT)
0DA0 CL-CHAN-A LD (HL),E oraz adres wejścia
INC HL na +10A8 (= KEY-INPUT).
LD (HL),D
INC HL
LD DE,+10A8
CCF Najpierw adres wyjścia,
JR C,0DA0,CL-CHAN-A a następnie adres wejścia.
LD BC,+1721 Skoro jest obsługiwana dolna część
ekranu, to 'dolnym wierszem wydruku'
będzie wiersz 23.
JR 0DD9,CL-SET Powróć poprzez CL-SET.Ta procedura jest wywoływana z: i) procedury rozkazu CLS, ii) głównej procedury wykonawczej i iii) z procedury automatycznego listingu.
0DAF CL-ALL LD HL,+0000 Zmienna systemowa C00RDS
LD (C00RDS),HL zostaje wyzerowana.
RES 0,(FLAGS2) Sygnalizuj 'ekran jest wyczyszczony'.
CALL 0D94,CL-CHAN Wykonaj zadania porządkujące.
LD A,+FE Otwórz kanał 'S'.
CALL 1601,CHAN-OPEN
CALL 0D4D,TEMPS Użyj 'stałej' wartości.
LD B,+18 Teraz 'wyczyść' 24 wiersze
CALL 0E44,CL-LINE ekranu.
LD HL,(CURCHL) Upewnij się, że bieżącym
LD DE,+09F4 adresem wyjścia jest +09F4
LD (HL),E (PRINT-OUT).
INC HL
LD (HL),D
LD (SCR-CT),+01 Wyzeruj licznik przewinięć.
LD BC,+1821 Skoro jest obsługiwana górna część
ekranu, to 'górnym wierszem druku'
stanie się wiersz 0.
Kontynuuj w CL-SET.Wejście do tej procedury następuje z parą rejestrów BC przechowującą numery wiersza i kolumny obszarów znaków lub z rejestrem C zawierającym numer kolumny wewnątrz bufora drukarki. Następnie zostaje znaleziony odpowiedni adres pierwszego bitu znaku. Procedura powraca poprzez PO-STORE, aby zapisać wszystkie te wartości w pożądanych zmiennych systemowych.
0DD9 CL-SET LD HL,+5B00 Początek bufora drukarki.
BIT 1,(FLAGS) Skocz naprzód, jeśli obsługiwany jest
JR NZ,0DF4,CL-SET-2 bufor drukarki.
LD A,B Przenieś numer wiersza.
BIT 0,(TV-FLAG) Skocz naprzód, jeśli obsługiwana jest
JR Z,0DEE,CL-SET-1 główna część ekranu.
ADD A,(DF-SZ) Górny wiersz dolnej części
SUB +18 ekranu nazywany jest
'wierszem +18' i jego właśnie należy
przetworzyć.
0DEE CL-SET-1 PUSH BC Numery wiersza i kolumny zostają zapamiętane.
LD B,A Numer wiersza zostaje przeniesiony.
CALL 0E9B,CL-ADDR Adres początku tego wiersza
zostaje uformowany w HL.
POP BC Numery wiersza i kolumny zostają z powrotem pobrane
0DF4 CL-SET-2 LD A,+21 Teraz numer kolumny jest odwrócony
SUB C i przeniesiony do
LD E,A pary rejestrów DE.
LD D,+00
ADD HL,DE Teraz zostaje utworzony pożądany
JP 0ADC,PO-STORE adres; a adres ten oraz numery
wiersza i kolumny są zapisywane przez
wykonanie skoku do PO-STORE.Liczba wierszy ekranu do przewinięcia musi być umieszczona przy wejściu do głównej procedury w rejestrze B.
0DFE CL-SC-ALL LD B,+17 Punkt wejścia po 'scroll?'
Główny punkt wejścia – z powyżej oraz gdy wykonywane jest przewijanie dla
0E00 CL-SCROLL CALL 0E9B,CL-ADDR Znajdź adres początku wiersza.
LD C,+08 Każdy wiersz składa się z ośmiu linii pikseli.Teraz wejdź do głównej pętli przewijania. Rejestr B przechowuje numer górnego wiersza do przewinięcia, para rejestrów HL adres początkowy tego wiersza w obszarze ekranu, a rejestr C licznik linii pikseli.
0E05 CL-SCR-1 PUSH BC Zapamiętaj liczniki na stosie.
PUSH HL Zachowaj adres początkowy.
LD A,B Skocz naprzód, jeśli nie jest
AND +07 teraz przetwarzana jakaś 'jedna trzecia'
LD A,B część ekranu
JR NZ,0E19,CL-SCR-3Linie pikseli górnych wierszy 'jednych trzecich' części ekranu muszą być przesunięte ponad obszarem 2KB (każda jedna 'trzecia' część = 2KB).
0E0D CL-SCR-2 EX DE,HL Wynikiem tej manipulacji
LD HL,+F8E0 jest pozostawienie bez zmian pary HL
ADD HL,DE i ustawienie adresu w DE
EX DE,HL na pożądane miejsce przeznaczenia.
LD BC,+0020 Jest +20 znaków.
DEC A Zmniejsz licznik przy każdej przesłanej linii.
LDIR Teraz przenieś te trzydzieści dwa bajty.Teraz mogą być przesłane linie pikseli wewnątrz 'jednych trzecich'. Rejestr A zawiera przy pierwszym obiegu +01 - +07, +09 – +0F lub +11 – +17.
0E19 CL-SCR-3 EX DE,HL Ponownie w DE zostaje ustawiony
LD HL,+FFE0 pożądany adres przeznaczenia.
ADD HL,DE Tym razem jedynie 32 bajty dalej
EX DE,HL
LD B,A Zachowaj numer wiersza w B.
AND +07 Teraz sprawdź, ile znaków
RRCA pozostaje w 'jednej trzeciej'.
RRCA
RRCA
LD C,A Prześlij 'liczbę znaków' do
rejestru C.
LD A,B Pobierz numer wiersza.
LD B,+00 BC zawiera 'liczbę znaków'
LDIR i zostaje przewinięta linia pikseli
w każdym z wierszy znakowych.
LD B,+07 Teraz przygotuj się do zwiększenia
adresu i skocz ponad granicą 'jednej trzeciej'.
ADD HL,BC Zwiększ HL o +0700.
AND +F8 Skocz wstecz, jeśli zostały jakieś
JR NZ,0E0D,CL-SCR-2 'jedne trzecie' do przewinięcia.Teraz sprawdź, czy ta pętla została wykonana osiem razy – po jednym razie dla każdej linii pikseli.
POP HL Pobierz oryginalny adres.
INC H Zaadresuj następną linię pikseli.
POP BC Pobierz liczniki.
DEC C Zmniejsz licznik linii pikseli
JR NZ,0E05,CL-SCR-1 i skocz wstecz o ile nie zostało przesuniętych
osiem linii pikseli.Następnie przewijane są bajty atrybutów. Zauważ, że rejestr B wciąż zawiera liczbę wierszy do przewinięcia, a rejestr C zawiera zero.
CALL 0E88,CL-ATTR Zostają znalezione pożądany adres
w obszarze atrybutów oraz liczba znaków
w rejestrze 'B'.
LD HL,+FFE0 Przesunięcie dla wszystkich bajtów
ADD HL,DE atrybutów wynosi trzydzieści dwa
EX DE,HL
LDIR Bajty atrybutów są przewijane.Pozostaje teraz wyczyścić spodni wiersz ekranu.
LD B,+01 W rejestrze B zostaje umieszczone
+01 i następuje wejście do CL-LINE.Ta procedura wyczyści dolne 'B' wierszy ekranu.
0E44 CL-LINE PUSH BC Numer wiersza zostaje zachowany na czas
działania tej procedury.
CALL 0E9B,CL-ADDR Adres początku wiersza zostaje
utworzony w HL.
LD C,+08 Znowu należy przetworzyć
osiem linii pikseli.Teraz wejdź do pętli, aby wyczyścić wszystkie linie pikseli.
0E4A CL-LINE-1 PUSH BC Zachowaj numer wiersza i
licznik linii pikseli.
PUSH HL Zachowaj ten adres.
LD A,B Zachowaj numer wiersza w A.
0E4D CL-LINE-2 AND +07 Wylicz liczbę znaków zawartych
RRCA w 'B modulo 8' wierszy.
RRCA Przenieś wynik do
RRCA rejestru C. (C będzie przechowywać +00
LD C,A tj. 256 dziesiętnie dla 'jednej trzeciej'.)
LD A,B Pobierz numer wiersza.
LD B,+00 Ustaw parę rejestrów BC na
DEC C o jeden mniej niż liczba znaków.
LD D,H Ustaw DE na adres pierwszego znaku.
LD E,L
LD (HL),+00 Wyczyść bajt pikseli pierwszego znaku.
INC DE Ustaw DE na adres drugiego znaku
LDIR i następnie wyzeruj linie pikseli
wszystkich pozostałych znaków.
LD DE,+0701 Dla każdej 'jednej trzeciej' części ekranu
ADD HL,DE HL musi być zwiększane o +0701.
DEC A Teraz zmniejsz numer wiersza.
AND +F8 Porzuć wszystkie dodatkowe wiersze
LD B,A i przenieś liczbę 'jednych trzecich' do B.
JR NZ,0E4D,CL-LINE-2 Skocz wstecz, jeśli wciąż istnieją 'jedne trzecie',
którymi należy się zająć.Teraz sprawdź, czy ta pętla została użyta osiem razy.
POP HL Uaktualnij adres dla każdej
INC H linii pikseli.
POP BC Pobierz liczniki.
DEC C Zmniejsz licznik linii pikseli
JR NZ,0E4A,CL-LINE-1 i skocz wstecz, o ile nie koniec.Następnie są ustawiane atrybuty. Wartość w ATTR-P będzie użyta przy obsłudze głównej części ekranu, a wartość z BORDER przy obsłudze dolnej części.
CALL 0E88,CL-ATTR Znajdowane są adres pierwszego
bajtu atrybutu i liczba bajtów.
LD H,D HL będzie wskazywać na pierwszy
LD L,E bajt atrybutów
INC DE a DE na drugi.
LD A,(ATTR-P) Pobierz wartość w ATTR-P.
BIT 0,(TV-FLAG) Skocz naprzód, jeśli jest obsługiwana
JR Z,0E80,CL-LINE-3 główna część ekranu.
LD A,(BORDCR) Inaczej użyj zastępczo BORDCR.
0E80 CL-LINE-3 LD (HL),A Ustaw ten bajt atrybutów.
DEC BC Jeden bajt został ustawiony.
LDIR Teraz skopiuj tę wartość na wszystkie
bajty atrybutów.
POP BC Odtwórz numer wiersza.
LD C,+21 Ustaw numer kolumny na pierwszą kolumnę
RET od lewej i powróć.Ta procedura spełnia dwie oddzielne funkcje.
i. Dla adresu danego obszaru ekranu odpowiedni adres atrybutu
zostaje zwrócony w parze rejestrów DE. Zauważ, że wartość ta na wejściu
wskazuje na 'dziewiątą' linię znaku.
ii. Dla danego numeru wiersza w rejestrze B liczba obszarów znakowych na
ekranie od początku tego wiersza w dół zostaje zwrócona w parze rejestrów BC.
0E88 CL-ATTR LD A,H Pobierz górny bajt.
RRCA Pomnóż go przez 32.
RRCA
RRCA
DEC A Wróć do 'ósmej' linii.
OR +50 Zaadresuj obszar atrybutów.
LD H,A Odtwórz górny bajt i
EX DE,HL przenieś ten adres do DE.
LD H,C To zawsze daje zero.
LD L,B Numer wiersza.
ADD HL,HL Pomnóż przez 32.
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD B,H Przenieś wynik do
LD C,L pary rejestrów BC przed
RET powrotem.Dla danego numeru wiersza w rejestrze B odpowiedni adres w obszarze ekranu jest tworzony w parze rejestrów HL.
0E9B CL-ADDR LD A,+18 Numer wiersza musi być
SUB B odwrócony.
LD D,A Wynik jest zapisywany w D.
RRCA W efekcie '(A mod 8) * 32'.
RRCA W 'jednej trzeciej' części ekranu
RRCA dolne bajty dla:
AND +E0 1-go wiersza = +00,
2-go wiersza = +20, itd.
LD L,A Dolny bajt idzie do L.
LD A,D Zostaje pobrany prawdziwy numer wiersza.
AND +18 W efekcie '64 +8 * INT (A/8)'
OR +40 Dla górnej 'jednej trzeciej' części
ekranu starszy bajt = +40,
dla środkowej 'jednej trzeciej' = +48, a dla
dolnej 'jednej trzeciej' = +50.
LD H,A Górny bajt idzie do H.
RET Skończone.Sto siedemdziesiąt sześć linii pikseli ekranu zostaje obsłużonych jedna po drugiej.
0EAC COPY DI Podczas COPY przerwanie maskowane
jest wyłączane.
LD B,+B0 '176' linii.
LD HL,+4000 Adres bazowy ekranu.Teraz następuje wejście do poniższej pętli.
0EB2 COPY-1 PUSH HL Zachowaj adres bazowy ekranu
PUSH BC oraz numer linii.
CALL 0EF4,COPY-LINE To jest wywoływane '176' razy.
POP BC Pobierz numer linii oraz
POP HL adres bazowy.
INC H Adres bazowy jest zwiększany
o '256' dla każdej kolejnej linii pikseli.
LD A,H Skocz naprzód, a w efekcie ponownie
AND +07 do pętli bezpośrednio dla ośmiu linii
JR NZ,0EC9,COPY-2 pikseli wiersza znaków.Dla każdego nowego wiersza znaków adres bazowy musi być uaktualniony.
LD A,L Pobierz dolny bajt.
ADD A,+20 Zwiększ go o +20 bajtów.
LD L,A Znacznik przeniesienia będzie wyzerowany
wewnątrz 'jednej trzeciej' części ekranu.
CCF Zmień znacznik przeniesienia.
SBC A,A Rejestr A będzie zawierał +F8
AND +F8 wewnątrz 'jednej trzeciej', lecz +00,
gdy nastąpi wejście do nowej 'jednej trzeciej'.
ADD A,H Teraz zostaje uaktualniony starszy
LD H,A bajt adresu.
0EC9 COPY-2 DJNZ 0EB2,COPY-1 Skocz wstecz, aż zostanie wydrukowanych
176 linii.
JR 0EDA,COPY-END Skocz naprzód na koniec procedury.Procedura ta jest wywoływana, gdy bufor drukarki wymaga przesłania danych do drukarki.
0ECD COPY-BUFF DI Zablokuj przerwania maskowane.
LD HL,+5B00 Adres bazowy bufora drukarki.
LD B,+08 Jest osiem linii pikseli.
0ED3 COPY-3 PUSH BC Zachowaj numer linii.
CALL 0EF4,COPY-LINE To jest wywoływane '8' razy.
POP BC Pobierz numer linii.
DJNZ 0ED3,COPY-3 Skocz wstecz, aż '8' linii
zostanie wydrukowane.Kontynuuj do procedury COPY-END.
0EDA COPY-END LD A,+04 Zatrzymaj silnik drukarki.
OUT (+FB),A
EI Odblokuj przerwania maskowane
i kontynuuj w CLEAR-PRB.Przez wywołanie tej procedury bufor drukarki zostaje wyczyszczony.
0EDF CLEAR-PRB LD HL,+5B00 Adres bazowy bufora drukarki.
LD (PR-CC-lo),L Zresetuj 'kolumnę' drukarki.
XOR A Wyczyść rejestr A.
LD B,A Również wyczyść rejestr B (w rezultacie
B przechowuje dziesiętnie 256).
0EE7 PRB-BYTES LD (HL),A '256' bajtów bufora drukarki
INC HL zostaje kolejno wyczyszczone.
DJNZ 0EE7,PRB-BYTES
RES 1,(FLAGS2) Sygnalizuj 'bufor drukarki jest pusty'.
LD C,+21 Ustaw pozycję drukarki i
JP 0DD9,CL-SET wróć poprzez CL-SET i P0-STORE.Wejście do tej procedury następuje z parą rejestrów HL zawierającą adres bazowy trzydziestu dwóch bajtów, które tworzą linię pikseli, oraz z rejestrem B zawierającym numer linii pikseli.
0EF4 COPY-LINE LD A,B Skopiuj numer linii pikseli.
CP +03 Rejestr A będzie zawierał
SBC A,A +00 aż do ostatnich dwóch linii.
OUT (+FB),A Zwolnij silnik tylko dla ostatnich
dwóch linii pikseli.
LD D,A Rejestr D będzie przechowywał
albo +00, albo +02.Należy wykonać trzy testy przed rozpoczęciem jakiegokolwiek 'drukowania'.
0EFD COPY-L-1 CALL 1F54,BREAK-KEY Skocz naprzód, jeśli klawisz
JR C,0F0C,COPY-L-2 BREAK nie jest naciśnięty.
LD A,+04 Jeśli jest,
OUT (+FB),A zatrzymaj silnik,
EI włącz przerwania maskowane,
CALL 0EDF,CLEAR-PRB wyczyść bufor drukarki i wyjdź
RST 0008,ERROR-1 poprzez procedurę obsługi błędów
DEFB +0C - 'BREAK-CONT repeats'.
0F0C COPY-L-2 IN A,(+FB) Pobierz status drukarki.
ADD A,A
RET M Wróć natychmiast, jeśli drukarka nieobecna.
JR NC,0EFD,COPY-L-1 Czekaj na rysik.
LD C,+20 Jest trzydzieści dwa bajty.Teraz wejdź w pętlę obsługi tych bajtów.
0F14 COPY-L-3 LD E,(HL) Pobierz bajt.
INC HL Uaktualnij wskaźnik.
LD B,+08 Osiem bitów na bajt.
0F18 COPY-L-4 RL D Przesuń D w lewo.
RL E Przesuń każdy bit do przeniesienia.
RR D Przesuń D z powrotem, pobierając
przeniesienie z E.
0F1E COPY-L-5 IN A,(+FB) Ponownie pobierz status
RRA drukarki i poczekaj na
JR NC,0F1E,COPY-L-5 sygnał z dekodera.
LD A,D Teraz prześlij 'bit'
OUT (+FB),A do drukarki.
Uwaga: bit 2 - niska wartość włącza
silnik, bit 1 - wysoka wartość zwalnia
silnik a bit 7 ma stan 1 przy 'drukowaniu'.
DJNZ 0F18,COPY-L-4 'Drukuj' każdy bit.
DEC C Zmniejsz licznik bajtów.
JR NZ,0F14,COPY-L-3 Skocz wstecz, jeśli są wciąż bajty,
RET inaczej powróć.Edytor jest wywoływany w dwóch przypadkach:
i. Z głównej procedury wykonawczej, aby użytkownik mógł wprowadzić do komputera wiersza w BASIC.
ii. Z polecenia INPUT.
Najpierw zachowany zostaje wskaźnik stosu błędów i na jego miejsce dostarczany jest adres alternatywny.
0F2C EDITOR LD HL,(ERR-SP) Bieżąca wartość jest zachowywana na
PUSH HL stosie maszynowym.
0F30 ED-AGAIN LD HL,+107F To jest ED-ERROR.
PUSH HL Każde zdarzenie prowadzące do
LD (ERR-SP),SP używanej procedury obsługi błędów
powróci do ED-ERROR.Teraz następuje wejście do pętli, która obsługuje każde naciśnięcie klawisza.
0F38 ED-LOOP CALL 15D4,WAIT-KEY Wróć po naciśnięciu klawisza.
PUSH AF Zachowaj chwilowo jego kod.
LD D,+00 Pobierz czas trwania
LD E,(PIP) kliku klawiszy.
LD HL,+00C8 Oraz jego wysokość.
CALL 03B5,BEEPER Wykonaj 'kliknięcie'.
POP AF Odtwórz kod.
LD HL,+0F38 Załaduj wstępnie stos maszynowy
PUSH HL adresem ED-LOOP.Teraz analizuj otrzymany kod.
CP +18 Zaakceptuj wszystkie kody klawiszy,
JR NC,0F81,ADD-CHAR kody graficzne i symbole.
CP +07 Akceptuj również ','.
JR C,0F81,ADD-CHAR
CP +10 Skocz naprzód, jeśli ten kod
JR C,0F92,ED-KEYS reprezentuje klawisz edycyjny.Teraz są rozpatrywane klawisze sterujące – od INK do TAB.
LD BC,+0002 INK i PAPER będą wymagały 2 komórek.
LD D,A Skopiuj kod do D.
CP +16 Skocz naprzód przy INK i
JR C,0F6C,ED-CONTR PAPERAT i TAB zostaną obsłużone następująco:
INC BC Potrzeba trzech komórek.
BIT 7,(FLAGX) Skocz naprzód, o ile nie jest
JP Z,101E,ED-IGNORE obsługiwane INPUT LINE... .
CALL 15D4,WAIT-KEY Pobierz drugi kod
LD E,A i wstaw go do E.Teraz są pobierane pozostałe bajty dla znaków sterujących.
0F6C ED-CONTR CALL 15D4,WAIT-KEY Pobierz kolejny kod.
PUSH DE Zachowaj poprzednie kody.
LD HL,(K-CUR) Pobierz K-CUR.
RES 0,(MODE) Sygnalizuj 'tryb K'.
CALL 1655,MAKE-ROOM Utwórz miejsce na dwa lub trzy bajty.
POP BC Odtwórz poprzednie kody.
INC HL Wskaż pierwszą komórkę.
LD (HL),B Wprowadź pierwszy kod.
INC HL Następnie wprowadź drugi,
LD (HL),C który zostanie nadpisany, jeśli
są tylko dwa kody – tj. z INK i PAPER.
JR 0F8B,ADD-CH-1 Skocz naprzód.Procedura ta faktycznie dodaje kod do bieżącego wiersza EDIT lub INPUT.
0F81 ADD-CHAR RES 0,(MODE) Sygnalizuj 'tryb K'.
LD HL,(K-CUR) Pobierz pozycję kursora.
CALL 1652,ONE-SPACE Zrób jedno wolne miejsce.
0F8B ADD-CH-1 LD (DE),A Wprowadź ten kod w to miejsce
INC DE i sygnalizuj, że kursor ma się
LD (K-CUR),DE pojawić na następnej pozycji. Potem
RET wróć pośrednio do ED-LOOP.Klawisze edycyjne są obsługiwane następująco:
0F92 ED-KEYS LD E,A Kod zostaje przeniesiony do
LD C,+00 pary rejestrów DE.
LD HL,+0F99 Adres bazowy tablicy klawiszy edycyjnych.
ADD HL,DE Pozycja zostaje zaadresowana i
LD E,(HL) następnie pobrana do E.
ADD HL,DE Adres procedury obsługi
PUSH HL zostaje umieszczony na stosie maszynowym.
LD HL,(K-CUR) Zostaje ustawiona para rejestrów HL i
RET wykonany skok pośredni do odpowiedniej procedury.adres przesunięcie znak
0FA0 09 EDIT 0FA5 70 DELETE 0FA1 66 kursor w lewo 0FA6 7E ENTER 0FA2 6A kursor w prawo 0FA7 CF SYMBOL SHIFT 0FA3 50 kursor w dół 0FA8 D4 GRAPHICS 0FA4 85 kursor do góry
W 'trybie edycyjnym' naciśnięcie klawisza EDIT sprowadza w dół 'bieżący wiersz BASIC'. Jednakże w 'trybie INPUT' działanie klawisza EDIT sprowadza się do wyczyszczenia bieżącej odpowiedzi w celu wprowadzenia świeżej.
0FA9 ED-EDIT LD HL,(E-PPC) Pobierz bieżący numer wiersza.
BIT 5,(FLAGX) Lecz skocz naprzód w 'trybie INPUT'.
JP NZ,1097,CLEAR-SP
CALL 196E,LINE-ADDR Znajdź adres początku
CALL 1695,LINE-NO bieżącego wiersza, a stąd jego numer.
LD A,D Jeśli zwrócony numer ma wartość
OR E zero, to po prostu wyczyść
JP Z,1097,CLEAR-SP obszar edycji.
PUSH HL Zapamiętaj adres wiersza.
INC HL Idź dalej do pobrania
LD C,(HL) długości tego wiersza.
INC HL
LD B,(HL)
LD HL,+000A Dodaj +0A do długości i sprawdź,
ADD HL,BC czy jest wystarczające miejsce
LD B,H do skopiowania tego wiersza.
LD C,L
CALL 1F05,TEST-ROOM
CALL 1097,CLEAR-SP Teraz wyczyść obszar edycji.
LD HL,(CURCHL) Pobierz adres bieżącego kanału
EX (SP),HL i zamień go na adres tego wiersza.
PUSH HL Zachowaj go chwilowo.
LD A,+FF Otwórz kanał 'R', aby wiersz został
CALL 1601,CHAN-OPEN skopiowany do obszaru edycji.
POP HL Odtwórz adres wiersza.
DEC HL Idź przed wiersz.
DEC (E-PPC-lo) Zmniejsz numer bieżącego wiersza,
aby uniknąć drukowania kursora.
CALL 1855,OUT-LINE Drukuj wiersz BASIC.
INC (E-PPC-lo) Zwiększ numer bieżącego wiersza.
Uwaga: Zmniejszenie numeru wiersza
nie zawsze zapobiega drukowaniu kursora.
LD HL,(E-LINE) Pobierz adres początku wiersza w
INC HL obszarze edycji i przeskocz ponad
INC HL numerem wiersza i jego
INC HL długością, aby znaleźć adres
INC HL dla K-CUR.
LD (K-CUR),HL
POP HL Odtwórz adres poprzedniego
CALL 1615,CHAN-FLAG kanału i ustaw odpowiednie
RET znaczniki przed powrotem do ED-LOOP.0FF3 ED-DOWN BIT 5,(FLAGX) Skocz naprzód, jeśli trybem jest
JR NZ,1001,ED-STOP 'tryb INPUT'.
LD HL,+5C49 To jest E-PPC.
CALL 190F,LN-FETCH Znajdowany jest numer następnego wiersza
JR 106E,ED-LIST i tworzony zostaje nowy automatyczny
listing.
1001 ED-STOP LD (ERR-NR),+10 raport 'STOP in INPUT'.
JR 1024,ED-ENTER Skocz naprzód.1007 ED-LEFT CALL 1031,ED-EDGE Kursor jest przesuwany.
JR 1011,ED-CUR Skocz naprzód.100C ED-RIGHT LD A,(HL) Sprawdzany jest bieżący znak
CP +0D i jeśli jest nim 'CR',
RET Z to powróć.
INC HL Inaczej przesuń kursor za znak.
1011 ED-CUR LD (K-CUR),HL Ustaw zmienną systemową K-CUR.
RET1015 ED-DELETE CALL 1031,ED-EDGE Przesuń kursor w lewo.
LD BC,+0001 Usuń bieżący znak.
JP 19E8,RECLAIM-2101E ED-IGNORE CALL 15D4,WAIT-KEY Następne dwa kody z klawiatury
CALL 15D4,WAIT-KEY zostaną zignorowane.1024 ED-ENTER POP HL Adresy pętli ED-LOOP oraz
POP HL ED-ERROR zostają usunięte.
1026 ED-END POP HL Odtwarzana jest stara wartość ERR-SP.
LD (ERR-SP),HL
BIT 7,(ERR-NR) Teraz powróć, jeśli nie było
RET NZ błędów.
LD SP,HL Inaczej wykonaj pośredni skok
RET do procedury obsługi błędów.Adres kursora jest w parze rejestrów HL i zostanie zmniejszony, o ile kursor już nie znajduje się na początku wiersza. Procedura dba, aby nie umieścić kursora pomiędzy znakami sterującymi a ich parametrami.
1031 ED-EDGE SCF DE będzie zawierać albo E-LINE
CALL 1195,SET-DE (przy edycji), albo WORKSP (przy INPUT).
SBC HL,DE Znacznik przeniesienia będzie ustawiony,
jeśli kursor już jest na początku wiersza.
ADD HL,DE
INC HL Korekcja po odejmowaniu.
POP BC Usuń adres powrotny.
RET C Wróć poprzez ED-LOOP, jeśli jest
ustawiony znacznik przeniesienia.
PUSH BC Odtwórz adres powrotny.
LD B,H Przenieś bieżący adres
LD C,L kursora do BC.Teraz wejdź do pętli, aby sprawdzić, czy znaki sterujące nie zostały oddzielone od ich parametrów.
103E ED-EDGE-1 LD H,D HL będzie wskazywało
LD L,E znak w wierszu za tym, który
INC HL jest adresowany przez DE.
LD A,(DE) Pobierz kod znaku.
AND +F0 Skocz naprzód, jeśli ten kod
CP +10 nie reprezentuje znaków
JR NZ,1051,ED-EDGE-2 od INK do TAB.
INC HL Zezwól na jeden parametr.
LD A,(DE) Pobierz kod od nowa.
SUB +17 Przeniesienie jest ustawione przy TAB.
ADC A,+00 Uwaga: To rozdziela AT i TAB, lecz
AT i TAB w tej postaci i tak
nie są zaimplementowane, więc
co za różnica.
JR NZ,1051,ED-EDGE-2 Skocz naprzód, o ile nie mamy do czynienia
INC HL z AT i TAB, które mogą posiadać dwa
parametry, jeśli są użyte.
1051 ED-EDGE-2 AND A Przygotuj się na faktyczne odejmowanie.
SBC HL,BC Znacznik przeniesienia będzie wyzerowany,
ADD HL,BC gdy 'uaktualniony wskaźnik' osiągnie K-CUR.
EX DE,HL Dla następnego obiegu wykorzystaj
JR C,103E,ED-EDGE-1 'uaktualniony wskaźnik', lecz przy wyjściu
RET użyj 'bieżącego wskaźnika' dla K-CUR.
Uwaga: Jest to znak sterujący, który
zostanie usunięty po naciśnięciu DELETE.1059 ED-UP BIT 5,(FLAGX) Wróć, jeśli trybem jest 'INPUT'.
RET NZ
LD HL,(E-PPC) Pobierz bieżący numer wiersza
CALL 196E,LINE-ADDR i jego adres startowy.
EX DE,HL HL teraz wskazuje na poprzedni wiersz.
CALL 1695,LINE-NO Zostaje pobrany numer tego wiersza.
LD HL,+5C4A To jest E-PPC-hi.
CALL 1910,LN-STORE Numer wiersza zostaje zachowany.
106E ED-LIST CALL 1795,AUTO-LIST Terza zostaje utworzony nowy
LD A,+00 automatyczny listing, a kanał 'K'
JP 1601,CHAN-OPEN jest ponownie otwierany przed powrotem do ED-LOOP.Jeśli zostały użyte kody SYMBOL i GRAPHICS, to będą obsłużone następująco:
1076 ED-SYMBOL BIT 7,(FLAGX) Skocz wstecz o ile nie jest obsługiwane
JR Z,1024,ED-ENTER INPUT LINE.
107C ED-GRAPH JP 0F81,ADD-CHAR Skocz wstecz.Przyjdź tutaj, jeśli wystąpił jakiś rodzaj błędu.
107F ED-ERROR BIT 4,(FLAGS2) Skocz wstecz, jeśli używany jest inny
JR Z,1026,ED-END kanał od 'K'.
LD (ERR-NR),+FF Usuń numer błędu i wydaj dźwięk ostrzegawczy,
LD D,+00 'zgrzyt', przed powrotem do edytora.
LD E,(RASP)
LD HL,+1A90
CALL 0385,BEEPER
JP 0F30,ED-AGAINObszar edycji lub przestrzeń robocza są czyszczone wg życzeń.
1097 CLEAR-SP PUSH HL Zachowaj wskaźnik do tego obszaru.
CALL 1190,SET-HL DE będzie wskazywać na pierwszy
znak, a HL na ostatni.
DEC HL Teraz właściwa ilość jest zwracana.
CALL 19E5,RECLAIM-1
LD (K-CUR),HL Zmienne systemowe K-CUR
LD (MODE),+00 i MODE ('tryb K') są inicjowane
POP HL przed pobraniem wskaźnika
RET i powrotem.Ta ważna procedura zwraca kod ostatnio naciśniętego klawisza, lecz CAPS LOCK, zmiana trybu oraz parametry sterujące kolorem są również obsługiwane wewnątrz procedury.
10A8 KEY-INPUT BIT 3,(TV-FLAG) Skopiuj wiersz edycji lub wiersz INPUT
CALL NZ,111D,ED-COPY na ekran, jeśli zmienił się tryb.
AND A Wróć z oboma znacznikami przeniesienia
BIT 5,(FLAGS) i zera wyzerowanymi, jeśli nie
RET Z naciśnięto nowego klawisza.
LD A,(LAST-K) Inaczej pobierz kod i
RES 5,(FLAGS) sygnalizuj, że został on pobrany.
PUSH AF Czasowo zachowaj ten kod.
BIT 5,(TV-FLAG) Jeśli trzeba, wyczyść dolną
CALL NZ,0D6E,CLS-LOWER część ekranu;
np. po napisie 'scroll?';
POP AF Pobierz kod.
CP +20 Zaakceptuj wszystkie znaki i
JR NC,111B,KEY-DONE kody symboli.
CP +10 Skocz naprzód przy większości
JR NC,10FA,KEY-CONTR kodów znaków sterujących.
CP +06 Skocz naprzód przy kodach 'trybu'
JR NC,10DB,KEY=M&CL i kodach CAPS LOCK.Teraz zajmij się kodami FLASH, BRIGHT i INVERSE.
LD B,A Zachowaj kod.
AND +01 Zatrzymaj tylko bit 0.
LD C,A C zawiera +00 (= WYŁĄCZONE) lub
C zawiera +01 (= WŁĄCZONE).
LD A,B Pobierz kod.
RRA Obróć go raz (tracąc bit 0).
ADD A,+12 Zwiększ go o +12, otrzymując dla
JR 1105,KEY-DATA FLASH - +12, BRIGHT - +13
i INVERSE - +14.Kody CAPS LOCK i kody trybu są obsługiwane 'lokalnie'.
10DB KEY-M&CL JR NZ,10E6,KEY-MODE Skocz naprzód przy kodach 'trybu'.
LD HL,+5C6A To jest zmienna FLAGS2.
LD A,+08 Przełącz bit 3 zmiennej FLAGS2.
XOR (HL) Znacznik CAPS LOCK.
LD (HL),A
JR 10F4,KEY-FLAG Skocz naprzód.
10E6 KEY-MODE CP +0E Sprawdź dolną granicę.
RET C
SUB +0D Zmniejsz zakres.
LD HL,+5C41 To jest zmienna MODE.
CP (HL) Czy zmieniła się?
LD (HL),A Wprowadź nowy kod 'trybu'.
JR NZ,10F4,KEY-FLAG Skocz przy zmianie;
LD (HL),+00 inaczej ustaw 'tryb L'.
10F4 KEY-FLAG SET 3,(TV-FLAG) Sygnalizuj 'tryb mógł się zmienić'.
CP A Wyzeruj znacznik przeniesienia
RET i powróć.Tutaj obsługiwane są kody klawiszy sterujących (oprócz FLASH, BRIGHT i INVERSE).
10FA KEY-CONTR LD B,A Zachowaj kod.
AND +07 Niech rejestr C przechowa parametr
LD C,A (+00 do +07)
LD A,+10 A teraz zawiera kod INK.
BIT 3,B Lecz jeśli kod był bez klawisza
JR NZ,1105,KEY-DATA SHIFT, to zmień zawartość A
INC A na kod PAPER.Parametr jest zapisywany w K-DATA, a adres kanału zostaje zmieniony z KEY-INPUT na KEY-NEXT.
1105 KEY-DATA LD (K-DATA),C Zapisz parametr.
LD DE,+110D To jest KEY-NEXT.
JR 1113,KEY-CHAN Skocz naprzód.Uwaga: Przy wejściu w pierwszym obiegu do KEY-INPUT rejestr A zostaje zwrócony z zawartością kodu sterującego, a przy kolejnym obiegu wejście do KEY-NEXT powoduje zwrot w A parametru.
110D KEY-NEXT LD A,(K-DATA) Pobierz parametr.
LD DE,+10A8 To jest KEY-INPUT.Teraz ustaw adres wejścia w obszarze pierwszego kanału.
1113 KEY-CHAN LD HL,(CHANS) Pobierz adres kanału.
INC HL
INC HL
LD (HL),E Teraz ustaw adres wejścia danych.
INC HL
LD (HL),DNa koniec wróć z pożądanym kodem w rejestrze A.
111B KEY-DONE SCF Pokaż, że kod został znaleziony
RET w wróć.Ta procedura jest wywoływana każdorazowo, gdy wiersz w obszarze edycji lub w obszarze INPUT ma być wyświetlony w dolnej części ekranu.
111D ED-COPY CALL 0D4D,TEMPS Użyj stałych kolorów.
RES 3,(TV-FLAG) Sygnalizuj, że 'należy potraktować tryb
RES 5,(TV-FLAG) jako niezmieniony', a
'dolna część ekranu nie wymaga czyszczenia'.
LD HL,(S-POSNL) Zapisz bieżącą wartość
PUSH HL S-POSNL.
LD HL,(ERR-SP) Utrzymaj bieżącą wartość
PUSH HL ERR-SP.
LD HL,+1167 To jest ED-FULL.
PUSH HL Zapisz ten adres na
LD (ERR-SP),SP stosie maszynowym, aby ED-FULL
stało się punktem wejścia przy
błędzie.
LD HL,(ECHO-E) Zapisz na stosie wartość ECHO-E
PUSH HL
SCF Ustaw w HL adres początku
CALL 1195,SET-HL obszaru a w DE końca.
EX DE,HL
CALL 187D,OUT-LINE2 Teraz wyświetl wiersz.
EX DE,HL Wymień ze sobą wskaźniki i
CALL 18E1,OUT-CURS wypisz kursor.
LD HL,(S-POSNL) Następnie pobierz bieżącą wartość
EX (SP),HL S-POSNL i wymień ją z ECHO-E.
EX DE,HL Przenieś ECHO-E do DE.
CALL 0D4D,TEMPS Znów pobierz kolory stałe.Reszta każdego rozpoczętego wiersza jest teraz wypełniana spacjami wypisywanymi w 'stałym' kolorze PAPER.
1150 ED-BLANK LD A,(S-POSNL-hi) Pobierz numer bieżącego wiersza
SUB D i odejmij numer starego wiersza.
JR C,117C,ED-C-DONE Skocz naprzód, jeśli nie są
potrzebne puste wiersze wymazujące.
JR NZ,115E,ED-SPACES Jeśli nie w tym samym wierszu, skocz naprzód.
LD A,E Pobierz numer starej kolumny
SUB (S-POSNL-lo) i odejmij numer nowej kolumny.
JR NC,117C,ED-C-DONE Skocz, jeśli nie są potrzebne spacje.
115E ED-SPACES LD A,+20 'spacja'.
PUSH DE Zapisz stare wartości,
CALL 09F4,PRINT-OUT Wypisz ją.
POP DE Pobierz stare wartości.
JR 1150,ED-BLANK Jeszcze raz wstecz.Teraz obsłuż błędy.
1167 ED-FULL LD D,+00 Wydaj 'zgrzyt'.
LD E,(RASP)
LD HL,+1A90
CALL 03B5,BEEPER
LD (ERR-NR),+FF Usuń numer błędu.
LD DE,(S-POSNL) Pobierz bieżącą wartość
JR 117E,ED-C-END S-POSNL i skocz naprzód.Normalne wyjście po skończeniu kopiowania wiersza edytora lub wiersza INPUT.
117C ED-C-DONE POP DE Wartość nowej pozycji.
POP HL 'Adres błędu'.Lecz skocz tutaj po błędzie.
117E ED-C-END POP HL Stara wartość ERR-SP zostaje
LD (ERR-SP),HL przywrócona.
POP BC Pobierz starą wartość S-POSNL.
PUSH DE Zapisz wartości nowej pozycji.
CALL 0DD9,CL-SET Ustaw zmienne systemowe.
POP HL Stara wartość S-POSNL
LD (ECHO-E),HL idzie do ECHO-E.
LD (X-PTR-hi),+00 X-PTR jest czyszczone w odpowiedni
RET sposób i następuje powrót.Te procedury wracają z HL ustawionym na adres pierwszej komórki a DE na adres ostatniej komórki w obszarze albo edycyjnym, albo roboczym.
1190 SET-HL LD HL,(WORKSP) Wskaż ostatnią komórkę
DEC HL obszaru edycji.
AND A Zeruj znacznik przeniesienia.
1195 SET-DE LD DE,(E-LINE) Wskaż początek
BIT 5,(FLAGX) obszaru edycji i wróć, jeśli
RET Z jest 'tryb edycji'.
LD DE,(WORKSP) Inaczej zmień DE.
RET C Wróć, jeśli tak miało być.
LD HL,(STKBOT) Pobierz STKBOT i dopiero teraz
RET wróć.Ta procedura usuwa ukrytą liczbę zmiennoprzecinkową z wiersza BASIC.
11A7 REMOVE-FP LD A,(HL) Sprawdzane są wszystkie znaki po kolei.
CP +0E Czy jest to znacznik liczby?
LD BC,+0006 Będzie zajmowała sześć komórek.
CALL Z,19E8,RECLAIM-2 Odzyskaj pamięć zajętą przez tę liczbę.
LD A,(HL) Pobierz kod jeszcze raz.
INC HL Uaktualnij wskaźnik.
CP +0D 'Koniec wiersza'?
JR NZ,11A7,REMOVE-FP Wstecz, jeśli nie.
RET A jeśli tak, to wróć.
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2026 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.