Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

Autorzy: dr Ian Logan i dr Frank O'Hara
Tłumaczenie: mgr Jerzy Wałaszek

©2024 mgr Jerzy Wałaszek
I LO w Tarnowie

SPIS TREŚCI

Procedury obsługi ekranu i drukarki

PROCEDURA 'WYDRUKU'

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.

TABLICA 'ZNAKÓW STERUJĄCYCH'

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

PROCEDURA DLA ZNAKU 'KURSOR W LEWO'

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.

PROCEDURA DLA ZNAKU 'KURSOR W PRAWO'

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.

PROCEDURA DLA ZNAKU 'POWRÓT KARETKI'

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.

PROCEDURA DLA ZNAKU 'PRZECINEK'

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.

PROCEDURA DRUKOWANIA PYTAJNIKA

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.

PROCEDURA DLA 'ZNAKÓW STERUJĄCYCH Z PARAMETRAMI'

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.

KODY ZNAKÓW DRUKOWALNYCH.

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.

PROCEDURA 'ZAPISU POZYCJI'

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óć.

PROCEDURA 'POBRANIA POZYCJI'

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

PROCEDURA 'WYDRUKU DOWOLNEGO ZNAKU/ZNAKÓW'

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.

PROCEDURA 'WYDRUKU WSZYSTKICH ZNAKÓW'

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ę.

PROCEDURA 'USTAWIANIA BAJTU ATRYBUTU'

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óć.

PROCEDURA 'WYDRUKU WIADOMOŚCI'

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.

PROCEDURA 'PO-SAVE'

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 'PRZESZUKIWANIA TABLICY'

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.

PROCEDURA 'TESTU NA PRZEWIJANIE'

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

Wiadomość 'scroll?'

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óć.

PROCEDURA 'TYMCZASOWYCH ELEMENTÓW KOLORU'

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

PROCEDURA 'ROZKAZU CLS'

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.

PROCEDURA 'CZYSZCZENIA CAŁEGO EKRANU'

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.

PROCEDURA '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.

PROCEDURA 'PRZEWIJANIA'

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.

PROCEDURA 'CZYSZCZENIA WIERSZY'

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óć.

PROCEDURA 'CL-ATTR'

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.

PROCEDURA 'CL-ADDR'

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.

PROCEDURA ROZKAZU 'COPY'

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 'COPY-BUFF'

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.

PROCEDURA 'CZYSZCZENIA BUFORA DRUKARKI'

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.

PROCEDURA 'COPY-LINE'

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óć.

PROCEDURY 'EDYTORA'

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 'ADDCHAR'

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.

TABLICA 'KLAWISZY EDYCYJNYCH'

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

PROCEDURA 'KLAWISZA EDIT'

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.

PROCEDURA OBSŁUGI 'KURSORA W DÓŁ'

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.

PROCEDURA OBSŁUGI 'KURSORA W LEWO'

1007 ED-LEFT      CALL  1031,ED-EDGE        Kursor jest przesuwany.
                  JR    1011,ED-CUR         Skocz naprzód.

PROCEDURA OBSŁUGI 'KURSORA W PRAWO'

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

PROCEDURA OBSŁUGI 'USUWANIA'

1015 ED-DELETE    CALL  1031,ED-EDGE        Przesuń kursor w lewo.
                  LD    BC,+0001            Usuń bieżący znak.
                  JP    19E8,RECLAIM-2

PROCEDURA 'IGNOROWANIA'

101E ED-IGNORE    CALL  15D4,WAIT-KEY       Następne dwa kody z klawiatury
                  CALL  15D4,WAIT-KEY       zostaną zignorowane.

PROCEDURA OBSŁUGI 'WEJŚCIA DO EDYCJI'

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.

PROCEDURA 'ED-EDGE'

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.

PROCEDURA OBSŁUGI 'KURSORA W GÓRĘ'

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.

PROCEDURA 'ED-SYMBOL'

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.

PROCEDURA 'ED-ERROR'

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

PROCEDURA 'CLEAR-SP'

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.

PROCEDURA 'ODCZYTU Z KLAWIATURY'

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óć.

PROCEDURA 'KOPIOWANIA SPODU EKRANU'

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.

PROCEDURY 'SET-HL' I 'SET-DE'

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óć.

PROCEDURA 'REMOVE-FP'

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óć.

Na początek:  podrozdziału   strony 

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: i-lo@eduinf.waw.pl

Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.

Informacje dodatkowe.