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 |
©2024 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 – PRINT OVER 1;CHR$ 32;
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 TAB 0) lub na +10 (dla TAB 16).
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. RET |
Oddzielnie 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 8 x 8 bitów. Na wejściu para rejestrów DE zawiera adres bazowy kształtu znaku, HL adres przeznaczenia, a para rejestrów BC bieżące wartości "wiersza i kolumny'.
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,A |
Przetwarzany 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 powrotem |
0CF8 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
RET |
W 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 INPUT..AT.
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-3 |
Linie 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 petla 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 PAPER |
AT 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. RET |
1015 ED-DELETE CALL 1031,ED-EDGE Przesuń kursor w lewo. LD BC,+0001 Usuń bieżący znak. JP 19E8,RECLAIM-2 |
101E 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 petli, 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, jesli 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-AGAIN |
Obszar 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),D |
Na 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 ©2024 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.