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 wykonawcze

PROCEDURA 'INICJALIZACJI'

Główny punkt wejścia do tej procedury znajduje się pod adresem START/NEW (11CB). Gdy wejście nastąpi z adresu START (0000), jak wtedy, gdy zostaje włączone zasilanie, to rejestr A zawiera zero a para rejestrów DE wartość +FFFF. Jednakże główny punkt wejścia może zostać osiągnięty również z poziomu procedury obsługi polecenia NEW.

PROCEDURA 'ROZKAZU NEW'

11B7 NEW          DI                        Zablokuj przerwania maskowane.
                  LD    A,+FF               Znacznik NEW.
                  LD    DE,(RAMTOP)         Zachowana zostaje obecna wartość RAMTOP.
                  EXX                       Przełącz na zapasowe rejestry
                  LD    BC,(P-RAMT)         z następującymi zmiennymi systemowymi.
                  LD    DE,(RASP/PIP)       Wszystkie z nich zostaną również zachowane.
                  LD    HL,(UDG)
                  EXX
Główny punkt wejścia
11CB START/NEW    LD    B,A                 Zachowaj znacznik na później.
                  LD    A,+07               Ustaw biały kolor brzegu ekranu.
                  OUT   (+FE),A
                  LD    A,+3F               Ustaw w rejestrze I wartość +3F.
                  LD    I,A
                  DEFB  +00,+00,+00         Poczekaj przez 24 takty procesora.
                  DEFB  +00,+00,+00
Teraz sprawdzana jest pamięć.
11DA RAM-CHECK    LD    H,D                 Przenieś wartość z DE
                  LD    L,E                 (START = +FFFF, NEW = RAMTOP).
11DC RAM-FILL     LD    (HL),+02            Wstaw wartość +02 do każdej komórki
                  DEC   HL                  powyżej adresu +3FFF.
                  CP    H
                  JR    NZ,11DC,RAM-FILL
11E2 RAM-READ     AND   A                   Przygotuj się na prawdziwe odejmowanie.
                  SBC   HL,DE               Znacznik przeniesienia zostanie wyzerowany,
                  ADD   HL,DE               gdy będzie osiągnięty szczyt.
                  INC   HL                  Uaktualnij wskaźnik.
                  JR    NC,11EF,RAM-DONE    Skocz, gdy osiągnięty jest szczyt.
                  DEC   (HL)                +02 zmienia się na +01.
                  JR    Z,11EF,RAM-DONE     Lecz gdy wynik zerowy, to RAM jest wadliwa.
                                            Użyj bieżącego HL jako szczyt.
                  DEC   (HL)                +01 zmienia się na +00.
                  JR    Z,11E2,RAM-READ     Przejdź do następnego testu, o ile ten nie zawiódł.
11EF RAM-DONE     DEC   HL                  HL wskazuje na ostatni adres rzeczywistej pamięci RAM.
Teraz odtwórz 'zachowane' zmienne systemowe. (Bez znaczenia, jeśli wejście nastąpiło z adresu START.)
                  EXX                       Przełącz rejestry.
                  LD    (P-RAMT),BC         Odtwórz P-RAMT,RASP/PIP
                  LD    (RASP/PIP),DE       i UDG
                  LD    (UDG),HL
                  EXX
                  INC   B                   Testuj znacznik START/NEW.
                  JR    Z,1219,RAM-SET      Skocz naprzód, jeśli wejście nastąpiło
                                            z procedury polecenia NEW.
Nadpisz zmienne systemowe, gdy wejście nastąpiło od START oraz ustaw obszar grafik użytkownika.
                  LD    (P-RAMT),HL         Szczyt fizyczny RAM.
                  LD    DE,+3EAF            Ostatni bajt 'U' w zestawie znaków.
                  LD    BC,+00A8            W 28 znakach jest tyle bajtów.
                  EX    DE,HL               Zamień wskaźniki.
                  LDDR                      Teraz skopiuj kształty znaków
                                            liter od 'A' do 'U'.
                  EX    DE,HL               Zamień wskaźniki z powrotem.
                  INC   HL                  Wskaż pierwszy bajt.
                  LD    (UDG),HL            Teraz ustaw UDG.
                  DEC   HL                  W dół o jedną komórkę.
                  LD    BC,+0040            Ustaw zmienne systemowe
                  LD    (RASP/PIP),BC       RASP i PIP.
Pozostała część procedury jest wspólna zarówno dla operacji START jak i dla NEW.
1219 RAM-SET      LD    (RAMTOP),HL         Ustaw RAMTOP.
                  LD    HL,+3C00            Zainicjuj zmienną systemową
                  LD    (CHARS),HL          CHARS.
Teraz jest ustawiany stos maszynowy.
                  LD    HL,(RAMTOP)         Na szczycie pamięci
                  LD    (HL),+3E            jest umieszczane +3E.
                  DEC   HL                  Następna komórka jest pozostawiana
                                            z wartością zero.
                  LD    SP,HL               Te dwie komórki reprezentują
                                            'ostatni wpis'.
                  DEC   HL                  Zejdź w dół o dwie komórki,
                  DEC   HL                  aby znaleźć właściwą wartość dla
                  LD    (ERR-SP),HL         ERR-SP.
Procedura inicjalizacji wykonuje się dalej następująco:
                  IM    1                   Używany jest tryb przerwań nr 1.
                  LD    IY,+5C3A            IY zawsze przechowuje +ERR-NR.
                  EI                        Teraz mogą być włączone przerwania maskowane.
                                            Co 1/50 sekundy będzie uaktualniany zegar
                                            czasu rzeczywistego oraz przeszukiwana klawiatura.
                  LD    HL,+5CB6            Adres bazowy obszaru informacyjnego kanałów.
                  LD    (CHANS),HL
                  LD    DE,15AF             Początkowe dane dla kanału
                  LD    BC,+0015            są przenoszone z tablicy
                  EX    DE,HL               (15AF) do obszaru informacyjnego kanałów.
                  LDIR
                  EX    DE,HL               Zmienna systemowa DATADD
                  DEC   HL                  jest ustawiana na ostatni adres
                  LD    (DATADD),HL         danych kanału.
                  INC   HL                  A PROG i VARS na następny
                  LD    (PROG),HL           adres.
                  LD    (VARS),HL
                  LD    (HL),+80            Znacznik końca obszaru zmiennych.
                  INC   HL                  Przesuń się o jedną komórkę, aby znaleźć
                  LD    (E-LINE),HL         wartość dla E-LINE.
                  LF    (HL),+0D            Wiersz edycji będzie się składał z
                  INC   HL                  pojedynczego znaku 'powrotu karetki'.
                  LD    (HL),+80            Teraz wprowadź znacznik końca.
                  INC   HL                  Przesuń się o jedną komórkę, aby znaleźć
                  LD    (WORKSP),HL         wartość dla WORKSP, STKBOT
                  LD    (STKBOT),HL         i STKEND.
                  LD    (STKEND),HL
                  LD    A,+38               Inicjuj zmienne kolorów systemowych
                  LD    (ATTR-P),A          na: FLASH 0,
                  LD    (ATTR-T),A          BRIGHT 0, PAPER 7 i INK 0.
                  LD    (BORDCR),A
                  LD    HL,+0523            Inicjuj zmienne systemowe
                  LD    (REPDEL),HL         REPDEL i REPPER.
                  DEC   (KSTATE-0)          Ustaw KSTATE-0 na +FF
                  DEC   (KSTATE-4)          Ustaw KSTATE-4 na +FF
                  LD    HL,+15C6            Następnie przenieś początkowe
                  LD    DE,+5C10            dane strumienia z jego tablicy do
                  LD    BC,+000E            obszaru strumieni.
                  LDIR
                  SET   1,(FLAGS)           Sygnalizuj 'drukarka w użyciu'
                  CALL  0EDF,CLEAR-PRB      i wyczyść bufor drukarki.
                  LD    (DF-SZ),+02         Ustaw rozmiar dolnej części
                  CALL  0D6B,CLS            ekranu i wyczyść cały ekran.
                  XOR   A                   Teraz wypisz wiadomość
                  LD    DE,+1538            '(c) 1982 Sinclair Research Ltd'
                  CALL  0C0A,PO-MSG         w dolnym wierszu.
                  SET   5,(TV-FLAG)         Sygnalizuj 'dolna część ekranu musi
                                            zostać wyczyszczona'.
                  JR    12A9,MAIN-1         Skocz naprzód do głównej pętli wykonawczej.

GŁÓWNA PĘTLA WYKONAWCZA

Główna pętla zajmuje obszar od adresu 12A2 do 15AE i kontroluje 'tryb edycji', wykonywanie rozkazów oraz tworzenie raportów.
12A2 MAIN-EXEC    LD    (DF-SZ),+02         Dolna część ekranu ma zajmować dwa wiersze.
                  CALL  1795,AUTO-LIST      Utwórz automatyczny listing.
12A9 MAIN-1       CALL  16B0,SET-MIN        Wszystkie obszary od E-LINE
                                            w górę otrzymują swoje
                                            minimalne konfiguracje.
12AC MAIN-2       LD    A,+00               Kanał 'K' zostaje otwarty przed
                  CALL  1601,CHAN-OPEN      wywołaniem procedury EDITOR.
                  CALL  0F2C,EDITOR         Wywoływana jest procedura EDITOR, aby umożliwić
                                            użytkownikowi stworzenie wiersza w języku BASIC.
                  CALL  1B17,LINE-SCAN      Bieżący wiersz jest sprawdzany składniowo.
                  BIT   7,(ERR-NR)          Jeśli składnia jest poprawna,
                  JR    NZ,12CF,MAIN-3      skocz naprzód.
                  BIT   4,(FLAGS2)          Skocz naprzód, jeśli jest używany inny
                  JR    Z,1303,MAIN-4       kanał od  'K'.
                  LD    HL,(E-LINE)         Wskaż początek wiersza z błędem.
                  CALL  11A7,REMOVE-FP      Usuń formy zmiennoprzecinkowe z tego wiersza.
                  LD    (ERR-NR),+FF        Zresetuj ERR-NR i skocz wstecz
                  JR    12AC,MAIN-2         do MAIN-2, pozostawiając listing bez zmian.
'Wiersz edycji' przeszedł badanie składni, a teraz należy rozróżnić trzy dozwolone rodzaje wierszy.
12CF MAIN-3       LD    HL,(E-LINE)         Wskaż początek wiersza.
                  LD    (CH-ADD),HL         Ustaw CH-ADD również na ten początek.
                  CALL  19FB,E-LINE-NO      Pobierz dowolny numer wiersza do BC.
                  LD    A,B                 Czy numer jest poprawny?
                  OR    C
                  JR    NZ,155D,MAIN-ADD    Jeśli tak, skocz i dodaj ten nowy wiersz
                                            do istniejącego programu.
                  RST   0018                Pobierz pierwszy znak wiersza
                  CP    +0D                 i sprawdź, czy wiersz składa się jedynie
                                            ze znaku 'powrotu karetki'.
                  JR    Z,12A2,MAIN-EXEC    Jeśli tak, skocz wstecz.
'Wiersz edycji' musi zatem rozpoczynać się od bezpośredniego rozkazu w języku BASIC, zatem będzie on pierwszym wierszem do zinterpretowania.
                  BIT   0,(FLAGS2)          Wyczyść cały ekran, chyba że ten znacznik
                  CALL  NZ,0DAF,CL-ALL      informuje nas, iż nie jest to konieczne.
                  CALL  0D6E,CLS-LOWER      Dolną część wyczyść zawsze.
                  LD    A,+19               Ustaw właściwą wartość
                  SUB   (S-POSN-hi)         dla licznika przewinięć ekranu.
                  LD    (SCR-CT),A
                  SET   7,(FLAGS)           Sygnalizuj 'wykonanie wiersza'.
                  LD    (ERR-NR),+FF        Upewnij się, że ERR-NR jest poprawne.
                  LD    (NSPPC),+01         Zajmij się pierwszym rozkazem w tym wierszu.
                  CALL  1B8A,PROG-RUN       Teraz wiersz jest interpretowany.
                                            Uwaga: Adres 1303 idzie na stos maszynowy
                                            i jest adresowany przez ERR-SP.
Po interpretacji wiersza i po zakończeniu wszystkich związanych z tym działań zostaje wykonany powrót do MAIN-4, aby można było utworzyć raport.
1303 MAIN-4       HALT                      Przerwania maskowane muszą zostać włączone.
                  RES   5,(FLAGS)           Sygnalizuj 'gotowy na kolejny klawisz'.
                  BIT   1,(FLAGS2)          Opróżnij bufor drukarki, jeśli
                  CALL  NZ,0ECD,COPY-BUFF   był używany.
                  LD    A,(ERR-NR)          Pobierz numer błędu
                  INC   A                   i zwiększ go o 1.
1313 MAIN-G       PUSH  AF                  Zachowaj nową wartość.
                  LD    HL,+0000            Zmienne systemowe
                  LD    (FLAGX),H           FLAGX, X-PTR-hi i
                  LD    (X-PTR-hi),H        DEFADD są zerowane.
                  LD    (DEFADD),HL
                  LD    HL,+0001            Upewnij się, że strumień +00
                  LD    (STRMS-6),HL        wskazuje na kanał 'K'
                  CALL  16B0,SET-MIN        Wyczyść obszary robocze i stos kalkulatora.
                  RES   5,(FLAGX)           Sygnalizuj 'tryb edycji'.
                  CALL  0D6E,CLS-LOWER      Wyczyść spód ekranu.
                  SET   5,(TV-FLAG)         Sygnalizuj 'spód ekranu będzie wymagał czyszczenia'.
                  POP   AF                  Pobierz wartość raportu.
                  LD    B,A                 Zrób kopię w B.
                  CP    +0A                 Skocz naprzód z numerami raportów
                  JR    C,133C,MAIN-5       od '0 do 9'.
                  ADD   A,+07               Dodaj wartość przesunięcia dla litery ASCII.
133C MAIN-5       CALL  15EF,OUT-CODE       Wydrukuj kod raportu
                  LD    A,+20               i umieść za nim 'spację'.
                  RST   0010,PRINT-A-1
                  LD    A,B                 Pobierz wartość raportu
                  LD    DE,+1391            i użyj jej do identyfikacji
                  CALL  0C0A,PO-MSG         wymaganego komunikatu raportu.
                  XOR   A                   Wyświetl komunikat i umieść
                  LD    DE,+1536            za nim 'przecinek' oraz 'spację'.
                  CALL  0C0A,PO-MSG
                  LD    BC,(PPC)            Teraz pobierz numer bieżącego wiersza
                  CALL  1A1B,OUT-NUM1       i również go wydrukuj.
                  LD    A,+3A               Dodaj za nim znak ':'
                  RST   0010,PRINT-A-1
                  LD    C,(SUBPPC)          Pobierz numer bieżącego rozkazu
                  LD    B,+00               do pary rejestrów BC
                  CALL  1A1B,OUT-NUM1       i wyświetl go.
                  CALL  1097,CLEAR-SP       Wyczyść obszar edycyjny.
                  LD    A,(ERR-NR)          Pobierz ponownie numer błędu.
                  INC   A                   Zwiększ go o 1 jak zwykle.
                  JR    Z,1386,MAIN-9       Jeśli program zakończył się
                                            z sukcesem, to nie może wystąpić
                                            żaden napis 'CONT', zatem skocz.
                  CP    +09                 Jeśli program zatrzymał się
                  JR    Z,1373,MAIN-6       z komunikatem 'STOP statement' lub
                  CP    +15                 'BREAK into program', to kontynuacja
                  JR    NZ,1376,MAIN-7      rozpocznie się od następnego rozkazu;
1373 MAIN-6       INC   (SUBPPC)            w przeciwnym razie SUBPPC nie jest zmieniane.
1376 MAIN-7       LD    BC,+0003            W zmiennych systemowych OLDPPC
                  LD    DE,+5C70            i OSPCC mają się teraz znaleźć numery
                                            wiersza i rozkazu w wierszu, od których
                                            rozpocznie się kontynuacja.
                  LD    HL,+5C44            Używane będą wartości z
                  BIT   7,(NSPPC)           PPC i SUBPPC, chyba że NSPPC
                  JR    Z,1384,MAIN-8       wskazuje wystąpienie przerwy
                  ADD   HL,BC               przed wykonaniem skoku.
1384 MAIN-8       LDDR                      (tj. po rozkazie GO TO, itp.)
1386 MAIN-9       LD    (NSPPC),+FF         NSPPC jest resetowane, aby wskazywać 'nie było skoku'.
                  RES   3,(FLAGS)           Zostaje wybrany 'tryb K'.
                  JP    12AC,MAIN-2         I na koniec robiony jest skok wstecz,
                                            lecz nie pojawi się listing programu
                                            aż do momentu, gdy się go zażąda.

KOMUNIKATY RAPORTÓW

W każdym komunikacie ostatni znak ma zanegowany najstarszy bit (+80 szesnastkowo).
1391 DEFB +80     - pierwszy bajt jest przeskakiwany.
1392 Report 0     - 'OK'                    Wszystko w porządku
1394 Report 1     - 'NEXT without FOR'      Rozkaz NEXT bez FOR
13A4 Report 2     - 'Variable not found'    Zmienna nie znaleziona
13B6 Report 3     - 'Subscript wrong'       Zły indeks
13C6 Report 4     - 'Out of memory'         Brak pamięci
13D2 Report 5     - 'Out of screen'         Poza ekranem
13DF Report 6     - 'Number too big'        Liczba za duża
13ED Report 7     - 'RETURN without GOSUB'  Rozkaz RETURN bez GOSUB
1401 Report 8     - 'End of file'           Koniec pliku
140C Report 9     - 'STOP statement'        Rozkaz STOP
141A Report A     - 'Invalid argument'      Zły argument
142A Report B     - 'Integer out of range'  Liczba całkowita poza zakresem
143E Report C     - 'Nonsense in BASIC'     Nonsens w języku BASIC
144F Report D     - 'BREAK - CONT repeats'  Klawisz BREAK - CONT powtarza
1463 Report E     - 'Out of DATA'           Koniec listy DATA
146E Report F     - 'Invalid file name'     Zła nazwa pliku
147F Report G     - 'No room for line'      Brak miejsca na wiersz
148F Report H     - 'STOP in INPUT'         Rozkaz STOP w rozkazie INPUT
149C Report I     - 'FOR without NEXT'      Rozkaz FOR bez NEXT
14AC Report J     - 'Invalid I/O device'    Złe urządzenie we/wy
14BE Report K     - 'Invalid colour'        Zły kolor
14CC Report L     - 'BREAK into program'    Zatrzymanie programu klawiszem BREAK
14DE Report M     - 'RAMTOP no good'        Zły RAMTOP
14EC Report N     - 'Statement lost'        Rozkaz utracony
14FA Report O     - 'Invalid stream'        Nieprawidłowy strumień
1508 Report P     - 'FN without DEF'        Rozkaz FN bez DEF
1516 Report Q     - 'Parameter error'       Błąd w parametrze
1525 Report R     - 'Tape loading error'    Błąd ładowania z taśmy
Są jeszcze następujące dwa komunikaty.
1537              ', '                      - 'przecinek' i 'spacja'
1539              '(c) 1982 Sinclair Research Ltd'
Raport G - Brak miejsca na wiersz
1555 REPORT-G     LD    A,+10               'G' ma kod '10+07+30'
                  LD    BC,+0000            Wyczyść BC.
                  JP    1313,MAIN-G         Skocz wstecz, aby wyświetlić ten raport.

PROCEDURA 'MAIN-ADD'

Procedura ta umożliwia dodanie do istniejącego programu nowego wiersza w języku BASIC. Jeśli ten wiersz posiada już swoją starą wersję w programie, to zostanie ona z niego usunięta. Wiersz składający się tylko z numeru nie jest wstawiany do obszaru programu.
155D MAIN-ADD     LD    (E-PPC),BC          Uczyń nowy numer wiersza 'wierszem bieżącym'.
                  LD    HL,(CH-ADD)         Pobierz CH-ADD i zachowaj
                  EX    DE,HL               adres w DE.
                  LD    HL,+1555            Umieść na stosie adres REPORT-G.
                  PUSH  HL
                                            ERR-SP będzie teraz wskazywał na REPORT-G.
                  LD    HL,(WORKSP)         Pobierz WORKSP.
                  SCF                       Znajdź długość wiersza
                  SBC,  HL,DE               od miejsca z numerem wiersza do znaku 'powrotu karetki' włącznie.
                  PUSH  HL                  Zapamiętaj tę długość.
                  LD    H,B                 Przenieś numer wiersza do
                  LD    L,C                 pary rejestrów HL.
                  CALL  196E,LINE-ADDR      Czy istnieje wiersz o takim numerze?
                  JR    NZ,157D,MAIN-ADD1   Skocz, jeśli nie.
                  CALL  19B8,NEXT-ONE       Znajdź długość 'starego'
                  CALL  19E8,RECLAIM-2      wiersza i usuń go.
157D MAIN-ADD1    POP   BC                  Pobierz długość
                  LD    A,C                 'nowego' wiersza i skocz do przodu,
                  DEC   A                   jeśli jest to tylko sam numer
                  OR    B                   i znak powrotu karetki.
                  JR    15AB,MAIN-ADD2
                  PUSH  BC                  Zapamiętaj długość.
                  INC   BC                  Będą potrzebne dodatkowe 4 bajty.
                  INC   BC
                  INC   BC                  tj. dwa na numer i
                  INC   BC                  dwa na długość.
                  DEC   HL                  Ustaw HL na adres przed 'adresem docelowym'.
                  LD    DE,(PROG)           Zapamiętaj bieżącą wartość zmiennej
                  PUSH  DE                  PROG, aby zapobiec jej zniszczeniu przy
                                            dodawaniu pierwszego wiersza.
                  CALL  1655,MAKE-ROOM      Tworzone jest miejsce na nowy wiersz.
                  POP   HL                  Stara wartość zmiennej PROG zostaje
                  LD    (PROG),HL           pobrana i odtworzona.
                  POP   BC                  Zostaje pobrana kopia długości wiersza
                  PUSH  BC                  (bez parametrów).
                  INC   DE                  Ustaw DE na adres końca nowego obszaru,
                  LD    HL,(WORKSP)         a HL na adres znaku 'powrotu karetki'
                  DEC   HL                  nowego wiersza
                  DEC   HL                  w obszarze edycyjnym.
                  LDDR                      Teraz przekopiuj wiersz.
                  LD    HL,(E-PPC)          Pobierz numer wiersza.
                  EX    DE,HL               Adres przeznaczenia do HL, a numer do DE.
                  POP   BC                  Pobierz długość nowego wiersza.
                  LD    (HL),B              Starszy bajt długości.
                  DEC   HL
                  LD    (HL),C              Młodszy bajt długości.
                  DEC   HL
                  LD    (HL),E              Młodszy bajt numeru wiersza.
                  DEC   HL
                  LD    (HL),D              Starszy bajt numeru wiersza.
15AB MAIN-ADD2    POP   AF                  Usuń adres REPORT-G.
                  JP    12A2,MAIN-EXEC      Skocz wstecz i tym razem
                                            faktycznie utwórz automatyczny listing.

DANE INICJALIZACYJNE DLA KANAŁÓW

Początkowo istnieją cztery kanały – 'K', 'S', 'R' i 'P' – do komunikacji z klawiaturą (keyboard), ekranem (screen), obszarem roboczym i drukarką (printer). Dla każdego kanału adres procedury wyjścia jest umieszczony przed adresem procedury wejścia i kodem kanału.
15AF DEFB         F4 09                     - PRINT-OUT
     DEFB         A8 10                     - KEY-INPUT
     DEFB         4B                        - 'K'
15B4 DEFB         F4 09                     - PRINT-OUT
     DEFB         C4 15                     - REPORT-J
     DEFB         53                        - 'S'
15B9 DEFB         81 0F                     - ADD-CHAR
     DEFB         C4 15                     - REPORT-J
     DEFB         52                        - 'R'
15BE DEFB         F4 09                     - PRINT-OUT
     DEFB         C4 15                     - REPORT-J
     DEFB         50                        - 'P'
15C3 DEFB         80                        - Znacznik końca.
Raport J - złe urządzenie we/wy
15C4 REPORT-J     RST   0008,ERROR-1        Wywołaj procedurę
                  DEFB  +12                 obsługi błędów kanału 'K'
15C8 DEFB         06 00 - stream +FE prowadzi do

DANE INICJALIZACYJNE DLA STRUMIENI

Początkowo jest siedem strumieni – od +FD do +03.

15C6 DEFB         01 00 - strumień +FD prowadzi do kanału 'S'
15CA DEFB         0B 00 - strumień +FF prowadzi do kanału 'R'
15CC DEFB         01 00 - strumień +00 prowadzi do kanału 'K'
15CE DEFB         01 00 - strumień +01 prowadzi do kanału 'K'
15D0 DEFB         06 00 - strumień +02 prowadzi do kanału 'S'
15D2 DEFB         10 00 - strumień +03 prowadzi do kanału 'P'

PROCEDURA 'CZEKANIA NA KLAWISZ'

Procedura ta jest procedurą sterującą wywołaniem bieżącej procedury wejścia.
15D4 WAIT-KEY     BIT   5,(TV-FLAG)         Skocz naprzód, jeśli ten znacznik
                  JR    NZ,15DE,WAIT-KEY1   wskazuje, że dolna część ekranu nie wymaga czyszczenia.
                  SET   3,(TV-FLAG)         Inaczej sygnalizuj 'uważaj ten tryb jako zmieniony'.
15DE WAIT-KEY1    CALL  15E6,INPUT-AD       Wywołaj pośrednio procedurę wejścia poprzez INPUT-AD.
                  RET   C                   Wróć z akceptowalnymi kodami.
                  JR    Z,15DE,WAIT-KEY1    Znaczniki przeniesienia
                                            i zera są resetowane, jeśli nie jest
                                            naciśnięty żaden klawisz; inaczej sygnalizuj błąd.
Raport 8 - Koniec pliku
15E4 REPORT-8     RST   0008,ERROR-1        Wywołaj procedurę obsługi błędów.
                  DEFB  +07

PROCEDURA 'INPUT-AD'

Rejestry są zapamiętywane, a HL zostaje ustawione na adres wejścia.
15E6 INPUT-AD     EXX                       Zachowaj rejestry.
                  PUSH  HL
                  LD    HL,(CURCHL)         Pobierz adres bazowy bieżącej informacji na temat kanału.
                  INC   HL                  Pomiń adres wyjścia.
                  INC   HL
                  JR    15F7,CALL-SUB       Skocz naprzód.

GŁÓWNA PROCEDURA DRUKOWANIA

Procedura jest wywoływana albo z wartością bezwzględną, albo z właściwym kodem znaku w rejestrze A.
15EF OUT-CODE     LD    E,+30               Zwiększ wartość w
                  ADD   A,E                 rejestrze A o +30.
15F2 PRINT-A-2    EXX                       Znów zachowaj rejestry.
                  PUSH  HL
                  LD    HL,(CURCHL)         Pobierz adres bazowy
                                            bieżącego kanału.  Będzie on wskazywał
                                            na adres wyjścia.
Teraz wywołaj właściwą procedurę. HL wskazuje na adres wejścia lub wyjścia.
15F7 CALL-SUB     LD    E,(HL)              Pobierz młodszy bajt.
                  INC   HL
                  LD    D,(HL)              Pobierz starszy bajt.
                  EX    DE,HL               Umieść ten adres w parze HL.
                  CALL  162C,CALL-JUMP      Wywołaj właściwą procedurę.
                  POP   HL                  Przywróć rejestry.
                  EXX
                  RET                       Powrót nastąpi z tego miejsca, chyba że
                                            wystąpił jakiś błąd.

PROCEDURA 'CHAN-OPEN'

Ta procedura jest wywoływana z rejestrem A zawierającym poprawny numer strumienia – zwykle od +FD do +03. Następnie w zależności od danych strumienia określony kanał stanie się kanałem bieżącym.
1601 CHAN-OPEN    ADD   A,A                 Wartość w rejestrze A zostaje
                  ADD   A,+16               podwojona, a następnie zwiększona o +16.
                  LD    L,A                 Wynik jest umieszczany w L.
                  LD    H,+5C               Adres +5C16 jest adresem bazowym dla strumienia +00.
                  LD    E,(HL)              Pobierz pierwszy bajt
                  INC   HL                  pożądanych danych strumienia; następnie
                  LD    D,(HL)              drugi bajt.
                  LD    A,D                 Generuj błąd, jeśli oba bajty mają
                  OR    E                   wartość zero.
                  JR    NZ,1610,CHAN-OP-1   Inaczej skocz naprzód.
Raport O - Nieprawidłowy strumień
160E REPORT-O     RST   0008,ERROR-1        Wywołaj procedurę obsługi błędów.
                  DEFB  +17
Używając tych danych strumienia, teraz znajdziemy adres bazowy informacji kanału związanej ze strumieniem.
1610 CHAN-OP-1    DEC   DE                  Zmniejsz dane strumienia.
                  LD    HL,(CHANS)          Adres bazowy obszaru z całą informacją o kanałach.
                  ADD   HL,DE               Utwórz pożądany adres w tym obszarze.

PROCEDURA 'CHAN-FLAG'

Procedura ta ustawia odpowiednie znaczniki dla różnych kanałów.
1615 CHAN-FLAG    LD    (CURCHL),HL         Para rejestrów HL zawiera
                                            adres bazowy określonego kanału.
                  RES   4,(FLAGS2)          Sygnalizuj 'użycie kanału innego niż K'.
                  INC   HL                  Przeskocz przez adresy wyjścia
                  INC   HL                  i wejścia i ustaw
                  INC   HL                  HL na adres kodu kanału.
                  INC   HL
                  LD    C,(HL)              Pobierz ten kod.
                  LD    HL,+162D            Adres bazowy tablicy 'kodów kanałów'.
                  CALL  16DC,INDEXER        Indeksuj tę tablicę i znajdź
                                            potrzebne przesunięcie; lecz wróć, jeśli
                  RET   NC                  kod kanału nie został znaleziony.
                  LD    D,+00               Umieść to przesunięcie
                  LD    E,(HL)              w parze rejestrów DE.
                  ADD   HL,DE               Skocz naprzód do odpowiedniej
162C CALL-JUMP    JP    (HL)                procedury ustawiającej znaczniki.

TABLICA 'KODÓW KANAŁÓW'

162D DEFB         4B 06 - kanał 'K',        przesunięcie +06, adres 1634
162F DEFB         53 12 - kanał 'S',        przesunięcie +12, adres 1642
1631 DEFB         50 1B - kanał 'P',        przesunięcie +1B, adres 164D
1633 DEFB         00    - znacznik końca.

PROCEDURA 'CHAN-K'

1634 CHAN-K       SET   0,(TV-FLAG)         Sygnalizuj 'używanie spodu ekranu'.
                  RES   5,(FLAGS)           Sygnalizuj 'gotowość na klawisz'.
                  SET   4,(FLAGS2)          Sygnalizuj 'używanie kanału K'.
                  JR    1646,CHAN-S-1       Skocz naprzód.

PROCEDURA 'CHAN-S'

1642 CHAN-S       RES   0,(TV-FLAG)         Sygnalizuj 'używanie głównego ekranu'.
1646 CHAN-S-1     RES   1,(FLAGS)           Sygnalizuj 'brak użycia drukarki'.
                  JP    0D4D,TEMPS          Wyjdź poprzez TEMPS, aby ustawić w ten sposób
                                            zmienne kolorów systemowych.

PROCEDURA 'CHAN-P'

164D CHAN-P       SET   1,(FLAGS)           Sygnalizuj 'używanie drukarki'.
                  RET

PROCEDURA 'REZERWACJI MIEJSCA

Jest to bardzo ważna procedura. Wywołuje się ją przy wielu okazjach do 'powiększania' obszaru. We wszystkich przypadkach para rejestrów HL wskazuje komórkę za pozycją, gdzie wymagane jest 'miejsce', a para rejestrów BC zawiera długość tego potrzebnego 'miejsca'. Gdy potrzebna jest tylko jedna komórka pamięci, wejście do procedury następuje od adresu ONE-SPACE.
1652 ONE-SPACE    LD    BC,+0001            Potrzebna jest tylko jedna komórka pamięci.
1655 MAKE-ROOM    PUSH  HL                  Zachowaj wskaźnik.
                  CALL  1F05,TEST-ROOM      Upewnij się, że jest dostępna wystarczająca
                                            ilość pamięci dla wykonywanego zadania.
                  POP   HL                  Odtwórz wskaźnik.
                  CALL  1664,POINTERS       Zmień wszystkie wskaźniki przed zrobieniem 'miejsca'.
                  LD    HL,(STKEND)         Do HL wprowadź nowe STKEND.
                  EX    DE,HL               Przełącz 'stare' z 'nowym'.
                  LDDR                      Teraz zrób 'miejsce'
                  RET                       i powróć.
Uwaga: Procedura powraca z parą rejestrów HL wskazującą na komórkę przed nowym 'miejscem' i z parą rejestrów DE wskazującą na ostatnią komórkę nowego obszaru. Stąd to nowe 'miejsce' ma opis: od (HL)+1 do (DE) włącznie. Jednakże, ponieważ 'nowe komórki' wciąż zawierają swoje 'stare wartości', to również można uważać to nowe 'miejsce' jako utworzone za pierwotnym adresem (HL) i stąd  posiadające opis od (HL)+2 do (DE)+1. W rzeczywistości programista tego kodu wydaje się preferować ten 'drugi opis', co może być nieco mylące.

PROCEDURA 'WSKAŹNIKI'

Zawsze gdy jakiś obszar ma być 'utworzony' lub 'usunięty', zmienne systemowe adresujące komórki poza 'miejscem' zmiany muszą zostać odpowiednio zmodyfikowane. Na wejściu para rejestrów BC zawiera liczbę zaangażowanych bajtów, a para rejestrów HL adresuje komórkę przed tym 'miejscem'.
1664 POINTERS     PUSH  AF                  Te rejestry zostają zapamiętane na stosie.
                  PUSH  HL                  Skopiuj adres 'miejsca'.
                  LD    HL,+5C4B            To jest VARS, pierwszy z
                  LD    A,+0E               czternastu wskaźników systemowych.
Teraz następuje wejście do pętli, która zajmuje się kolejno każdym ze wskaźników. Tylko wskaźniki wskazujące poza 'miejsce' są zmieniane.
166B PTR-NEXT     LD    E,(HL)              Pobierz dwa bajty
                  INC   HL                  bieżącego wskaźnika.
                  LD    D,(HL)
                  EX    (SP),HL             Wymień zmienną systemową z adresem 'miejsca'.
                  AND   A                   Znacznik przeniesienia zostanie
                  SBC   HL,DE               ustawiony, jeśli adres w zmiennej systemowej
                  ADD   HL,DE               należy uaktualnić.
                  EX    (SP),HL             Odtwórz 'miejsce'.
                  JR    NC,167F,PTR-DONE    Skocz naprzód, jeśli dany wskaźnik ma zostać
                                            zachowany; inaczej zmień go.
                  PUSH  DE                  Zachowaj starą wartość.
                  EX    DE,HL               Teraz dodaj wartość w BC
                  ADD   HL,BC               do starej wartości.
                  EX    DE,HL
                  LD    (HL),D              Wprowadź nową wartość do
                  DEC   HL                  zmiennej systemowej - starszy bajt
                  LD    (HL),E              przed młodszym.
                  INC   HL                  Wskaż ponownie na starszy bajt.
                  POP   DE                  Pobierz starą wartość.
167F PTR-DONE     INC   HL                  Wskaż na kolejną zmienną systemową
                  DEC   A                   i skocz wstecz aż zostanie przetworzone
                  JR    NZ,166B,PTR-NEXT    wszystkie czternaście tych zmiennych.
Teraz znajdź rozmiar bloku do przesunięcia.
                  EX    DE,HL               Umieść starą wartość zmiennej STKEND
                  POP   DE                  w HL i przywróć pozostałe
                  POP   AF                  rejestry.
                  AND   A                   Teraz znajdź różnicę
                  SBC   HL,DE               pomiędzy starą wartością
                  LD    B,H                 zmiennej STKEND a 'miejscem'.
                  LD    C,L                 Przenieś wynik do BC
                  INC   BC                  i dodaj '1' dla ostatniego bajtu.
                  ADD   HL,DE               Zmodyfikuj starą wartość zmiennej
                  EX    DE,HL               STKEND i przekaż ją do DE
                  RET                       przed powrotem.

PROCEDURA 'POBRANIA NUMERU WIERSZA'

Na wejściu para rejestrów HL wskazuje rozważaną pozycję. Jeśli w tym miejscu znajduje się wartość, która tworzy właściwy starszy bajt numeru wiersza, to numer ten zostaje zwrócony w DE. Jednakże jeśli tak nie jest, to następnie jest wypróbowywane miejsce wskazywane przez DE; a gdy i to się nie powiedzie, to zostaje zwrócony numer wiersza zero.
168F LINE-ZERO    DEFB  +00                 Numer wiersza zero.
                  DEFB  +00
1691 LINE-NO-A    EX    DE,HL               Rozważ inny wskaźnik.
                  LD    DE,+168F            Użyj numeru wiersza zero.
Zwykłym punktem wejścia jest LINE-NO.
1695 LINE-NO      LD    A,(HL)              Pobierz starszy bajt
                  AND   +C0                 i sprawdź go.
                  JR    NZ,1691,LINE-NO-A   Skocz wstecz, jeśli9 jest zły.
                  LD    D,(HL)              Pobierz starszy bajt.
                  INC   HL
                  LD    E,(HL)              Pobierz młodszy bajt
                  RET                       i powróć.

PROCEDURA 'REZERWACJA'

Tę procedurę zwykle wywołuje się poprzez RST 0030,BC-SPACES. Tutaj na wejściu ostatnią wartością na stosie maszynowym jest WORKSP, a wartością tuż nad nią jest liczba miejsc, które należy 'zarezerwować'. Procedura ta zawsze robi 'miejsce' pomiędzy istniejącym obszarem roboczym a stosem kalkulatora.
169E RESERVE      LD    HL,(STKBOT)         Pobierz bieżącą wartość
                  DEC   HL                  STKBOT i zmniejsz ją o 1,
                                            aby otrzymać adres ostatniej komórki obszaru roboczego.
                  CALL  1655,MAKE-ROOM      Teraz zrób 'BC miejsc'.
                  INC   HL                  Wskaż na pierwszą komórkę nowego obszaru,
                  INC   HL                  a później na drugą.
                  POP   BC                  Pobierz starą wartość
                  LD    (WORKSP),BC         WORKSP i odtwórz ją.
                  POP   BC                  Odtwórz BC - liczba miejsc.
                  EX    DE,HL               Przełącz wskaźniki.
                  INC   HL                  Ustaw HL na pierwszy z przemieszczanych bajtów.
                  RET                       Teraz powróć.
Uwaga: Można również uważać, że procedura ta powraca z parą rejestrów DE wskazującą na 'pierwszy dodatkowy bajt' i z parą rejestrów HL wskazującą na 'ostatni dodatkowy bajt', a te dodatkowe bajty zostały dodane po pierwotnym adresie '(HL)+1'.

PROCEDURA 'SET-MIN'

Procedura ta przywraca obszar edycyjny oraz obszary leżące za nim do ich minimalnych rozmiarów. W wyniku obszary zostają 'wyczyszczone'.
16B0 SET-MIN      LD    HL,(E-LINE)         Pobierz E-LINE.
                  LD    (HL),+0D            W obszarze edycyjnym umieść jedynie
                  LD    (K-CUR),HL          znak 'powrotu karetki'
                  INC   HL                  oraz znacznik końca.
                  LD    (HL),+80
                  INC   HL                  Przejdź dalej, aby wyczyścić obszar roboczy.
                  LD    (WORKSP),HL
Wejście w tym miejscu spowoduje 'wyczyszczenie' obszaru roboczego i stosu kalkulatora.
16BF SET-WORK     LD    HL,(WORKSP)         Pobierz WORKSP.
                  LD    (STKBOT),HL         To czyści obszar roboczy.
Wejście tutaj 'wyczyści' tylko stos kalkulatora.
16C5 SET-STK      LD    HL,(STKBOT)         Pobierz STKBOT.
                  LD    (STKEND),HL         To czyści ten stos.
We wszystkich przypadkach w MEM umieść adres obszaru pamięci kalkulatora.
                  PUSH  HL                  Zachowaj STKEND.
                  LD    HL,+5C92            Podstawa obszaru pamięci.
                  LD    (MEM),HL            Ustaw MEM na ten adres.
                  POP   HL                  Odtwórz STKEND w parze rejestrów HL
                  RET                       przed powrotem.

PROCEDURA 'ODZYSKANIA WIERSZA EDYCYJNEGO'

16D4 REC-EDIT     LD    DE,(E-LINE)         Pobierz E-LINE.
                  JP    19E5,RECLAIM-1      Odzyskaj pamięć.

PROCEDURA 'INDEKSOWANIE'

Tę procedurę wykorzystuje się w kilku przypadkach do przeszukiwania tablic. Punktem wejścia jest INDEXER.
16DB INDEXER-1    INC   HL                  Przejdź dalej, aby przetworzyć kolejną parę danych.
16DC INDEXER      LD    A,(HL)              Pobierz pierwszą daną z pary,
                  AND   A                   lecz powróć, jeśli ma ona wartość
                  RET   Z                   zero - znacznik końca.
                  CP    C                   Porównaj ją z dostarczonym kodem.
                  INC   HL                  Wskaż na drugą daną.
                  JR    NZ,16DB,INDEXER-1   Skocz wstecz, jeśli nie znaleziono właściwej pary.
                  SCF                       Przy sukcesie zostaje ustawiony
                  RET                       znacznik przeniesienia.

PROCEDURA ROZKAZU 'CLOSE #'

Ten rozkaz pozwala użytkownikowi zamykać strumienie. Jednakże w strumieniach od +00 do +03 'wstępne' dane są odtwarzane i dlatego strumieni tych nie można zamknąć.
16E5 CLOSE        CALL  171E,STR-DATA       Zostają pobrane istniejące dane strumienia.
                  CALL  1701,CLOSE-2        Sprawdź kod w tym kanale strumienia.
                  LD    BC,+0000            Przygotuj się na ustawienie danych strumienia na zero.
                  LD    DE,+A3E2            Przygotuj się na zidentyfikowanie
                  EX    DE,HL               strumieni od +00 do +03.
                  ADD   HL,DE               Znacznik przeniesienia będzie ustawiony dla strumieni od +04 do +0F.
                  JR    C,16FC,CLOSE-1      Przy tych strumieniach skocz naprzód,
                  LD    BC,+15D4            inaczej znajdź poprawne
                  ADD   HL,BC               dane w tablicy 'wartości początkowych strumieni'.
                  LD    C,(HL)              Pobierz dane początkowe
                  INC   HL                  dla strumieni od +00 do +03.
                  LD    B,(HL)
16FC CLOSE-1      EX    DE,HL               Teraz wprowadź te dane; albo
                  LD    (HL),C              zero i zero, albo wartości początkowe.
                  INC   HL
                  LD    (HL),B
                  RET

PROCEDURA 'CLOSE-2'

Kodem kanału związanego z zamykanym strumieniem musi być 'K', 'S' lub 'P'.
1701 CLOSE-2      PUSH  HL                  Zachowaj adres danych strumienia.
                  LD    HL,(CHANS)          Pobierz adres bazowy obszaru
                  ADD   HL,BC               informacji o kanale dla zamykanego strumienia.
                  INC   HL                  Omiń adres procedury
                  INC   HL
                  INC   HL
                  LD    C,(HL)              i pobierz kod dla tego kanału
                  EX    DE,HL               Zachowaj wskaźnik.
                  LD    HL,+1716            Adres bazowy tablicy 'zamykania kanału'
                  CALL  16DC,INDEXER        Indeksuj tę tablicę i zlokalizuj pożądane przesunięcia.
                  LD    C,(HL)              Przenieś te przesunięcie do
                  LD    B,+00               pary rejestrów BC.
                  ADD   HL,BC               Skocz naprzód do
                  JP    (HL)                odpowiedniej procedury.

TABLICA 'ZAMYKANIA KANAŁU'

1716              DEFB  4B 05               - kanał 'K', przesunięcie +05, adres 171C
1718              DEFB  53 03               - kanał 'S', przesunięcie +03, adres 171C
171A              DEFB  50 01               - kanał 'P', przesunięcie +01, adres 171C
Uwaga: Na końcu tej tablicy nie ma znacznika końca.

PROCEDURA 'ZAMYKANIA STRUMIENIA'

171C CLOSE-STR    POP   HL                  Pobierz wskaźnik do informacji o kanale
                  RET                       i powróć.

PROCEDURA 'DANYCH STRUMIENIA'

Procedura ta zwraca w parze rejestrów BC dane dla wybranego strumienia.
171E STR-DATA     CALL  1E94,STK-TO-A       Ze stosu kalkulatora zostaje zdjęty
                                            numer strumienia.
                  CP    +10                 Jeśli jest on większy od +0F,
                  JR    C,1727,STR-DATA1    sygnalizuj błąd.
Raport O – Nieprawidłowy strumień
1725 REPORT-O     RST   0008,ERROR-1        Wywołaj procedurę obsługi błędów.
                  DEFB  +17
Kontynuuj przy prawidłowym numerze strumienia.
1727 STR-DATA1    ADD   A,+03               Teraz zakres od +03 do +12;
                  RLCA                      a teraz od +06 do +24.
                  LD    HL,+5C10            Adres bazowy obszaru danych strumieni.
                  LD    C,A                 Przenieś kod strumienia do
                  LD    B,+00               pary rejestrów BC.
                  ADD   HL,BC               Indeksuj w obszar danych
                  LD    C,(HL)              i pobierz z niego dwa bajty
                  INC   HL                  do pary rejestrów BC.
                  LD    B,(HL)
                  DEC   HL                  Ustaw wskaźnik na adres
                  RET                       pierwszego z tych bajtów danych przed
                                            powrotem.

PROCEDURA ROZKAZU 'OPEN #'

Rozkaz ten umożliwia użytkownikowi otwieranie strumieni. Musi być dostarczony kod kanału, którym musi być 'K', 'k', 'S', 's', 'P' lub 'p'.
Zauważ,  że nie jest podejmowana żadna próba nadania strumieniom od +00 do +03 ich danych początkowych.
1736 OPEN         RST   0028,FP-CALC        Użyj KALKULATORA.
                  DEFB  +01,exchange        Wymień miejscami numer strumienia
                  DEFB  +38,end-calc        z kodem kanału.
                  CALL  171E,STR-DATA       Pobierz dane dla strumienia.
                  LD    A,B                 Skocz naprzód, jeśli oba bajty
                  OR    C                   danych mają wartość zero, tj.
                  JR    Z,1756,OPEN-1       strumień był w stanie zamkniętym.
                  EX    DE,HL               Zachowaj DE.
                  LD    HL,(CHANS)          Pobierz CHANS - adres bazowy
                  ADD   HL,BC               informacji o kanale i znajdź
                  INC   HL                  kod kanału związanego z otwieranym
                  INC   HL                  strumieniem.
                  INC   HL
                  LD    A,(HL)
                  EX    DE,HL               Odtwórz DE.
                  CP    +4B                 Kod pobrany z obszaru
                  JR    Z,1756,OPEN-1       informacji o strumieniu musi być
                  CP    +53                 jedną z liter 'K', 'S' lub 'P';
                  JR    Z,1756,OPEN-1       jeśli tak nie jest, sygnalizuj błąd.
                  CP    +50
                  JR    NZ,1725,REPORT-O
1756 OPEN-1       CALL  175D,OPEN-2         Zbierz odpowiednie dane w DE.
                  LD    (HL),E              Wprowadź te dane do dwóch bajtów
                  INC   HL                  w obszarze informacji o strumieniu.
                  LD    (HL),D
                  RET                       Na koniec powróć.

PROCEDURA 'OPEN-2'

Zostają znalezione odpowiednie bajty danych strumienia dla kanału związanego z otwieranym strumieniem.
175D OPEN-2       PUSH  HL                  Zachowaj HL
                  CALL  2BF1,STK-FETCH      Pobierz parametry kodu kanału.
                  LD    A,B                 Sygnalizuj błąd, jeśli dostarczone
                  OR    C                   wyrażenie jest puste
                  JR    NZ,1767,OPEN-3      np. OPEN #5,"".
Raport F - Nieprawidłowa nazwa
1765 REPORT-F     RST   0008,ERROR-1        Wywołaj procedurę obsługi błędów.
                  DEFB  +0E
Kontynuuj, jeśli błędu nie było.
1767 OPEN-3       PUSH  BC                  Długość wyrażenia zostaje zapamiętana.
                  LD    A,(DE)              Pobierz pierwszy znak.
                  AND   +DF                 Zamień małe litery na duże.
                  LD    C,A                 Przenieś kod do rejestru C.
                  LD    HL,+177A            Adres bazowy tablicy 'danych dla otwieranego strumienia'.
                  CALL  16DC,INDEXER        Indeksuj tablicę i zlokalizuj potrzebne przesunięcie.
                  JR    NC,1765,REPORT-F    Skocz wstecz, jeśli go nie ma.
                  LD    C,(HL)              Przenieś przesunięcie do pary rejestrów BC.
                  LD    B,+00
                  ADD   HL,BC               Ustaw HL na początek właściwej procedury.
                  POP   BC                  Pobierz długość wyrażenia
                  JP    (HL)                przed wykonaniem skoku do tej procedury.

TABLICA 'DANYCH DLA OTWIERANEGO STRUMIENIA'

177A              DEFB  4B 06               - kanał 'K', przesunięcie +06, adres 1781
177C              DEFB  53 08               - kanał 'S', przesunięcie +08, adres 1785
177E              DEFB  50 0A               - kanał 'P', przesunięcie +0A, adres 1789
1780              DEFB  00                  - znacznik końca;

PROCEDURA 'OTWARCIA KANAŁU K'

1781 OPEN-K       LD    E,+01               Bajty danych będą miały wartość +01 i +00.
                  JR    178B,OPEN-END

PROCEDURA 'OTWARCIA KANAŁU S'

1785 OPEN-S       LD    E,+06               Bajty danych będą miały wartość +06 i +00.
                  JR    178B,OPEN-END

PROCEDURA 'OTWARCIA KANAŁU P'

1789 OPEN-P       LD    E,+10               Bajty danych będą miały wartość +10 i +00.
178B OPEN-END     DEC   BC                  Zmniejsz długość wyrażenia
                  LD    A,B                 i sygnalizuj błąd, jeśli zawierało ono
                  OR    C                   więcej niż jeden znak;
                  JR    NZ,1765,REPORT-F
                  LD    D,A                 inaczej wyczyść rejestr D,
                  POP   HL                  pobierz HL
                  RET                       i powróć

PROCEDURY ROZKAZÓW 'CAT, ERASE, FORMAT I MOVE'

W standardowym systemie SPECTRUM użycie tych rozkazów prowadzi do powstania raportu O – Nieprawidłowy strumień.
1793 CAT-ETC.     JR    1725,REPORT-O       Twórz ten raport.

PROCEDURY ROZKAZÓW 'LIST I LLIST'

Procedury w tej części 16KB systemu są używane do tworzenie wydruków bieżącego programu w języku BASIC. W każdym wierszu należy przetworzyć jego numer, rozwinąć w znaki kody rozkazów oraz pozycjonowania właściwych kursorów. Punkt wejścia AUTO-LIST jest używany zarówno przez procedurę GŁÓWNEGO WYKONYWANIA jak i przez EDYTOR do tworzenia pojedynczej strony wydruku.
1795 AUTO-LIST    LD    (LIST-SP),SP        Wskaźnik stosu zostaje zapamiętany,
                                            pozwalając na zresetowanie stosu maszynowego,
                                            gdy zostanie ukończony listing.  (zobacz na PO-SCR,0C55)
                  LD    (TV-FLAG),+10       Sygnalizuj 'automatyczny listing jest na głównym ekranie'.
                  CALL  0DAF,CL-ALL         Wyczyść tę część ekranu.
                  SET   0,(TV-FLAG)         Przełącz się na obszar edycyjny.
                  LD    B,(DF-SZ)           Teraz wyczyść również dolną część ekranu
                  CALL  0E44,CL-LINE
                  RES   0,(TV-FLAG)         A następnie przełącz się z powrotem.
                  SET   0,(FLAGS2)          Sygnalizuj 'ekran jest wyczyszczony'.
                  LD    HL,(E-PPC)          Teraz pobierz 'bieżący' numer wiersza
                  LD    DE,(S-TOP)          oraz 'automatyczny' numer wiersza.
                  AND   A                   Jeśli 'bieżący' numer jest
                  SBC   HL,DE               mniejszy od 'automatycznego',
                  ADD   HL,DE               to skocz naprzód, aby uaktualnić
                  JR    C,17E1,AUTO-L-2     ten numer 'automatyczny'.
'Automatyczny' numer musi być teraz zmieniony, aby utworzyć listing z wierszem 'bieżącym' u spodu ekranu.
                  PUSH  DE                  Zapamiętaj numer 'automatyczny'.
                  CALL  196E,LINE-ADDR      Znajdź adres początku
                  LD    DE,+02C0            'bieżącego' wiersza
                  EX    DE,HL               i utwórz adres w przybliżeniu
                  SBC   HL,DE               o 'ekran przed nim' (zanegowany).
                  EX    (SP),HL             Zapamiętaj ten 'wynik' na stosie maszynowym,
                  CALL  196E,LINE-ADDR      podczas gdy adres 'automatycznego' wiersza jest
                                            znajdowany (w HL).
                  POP   BC                  'Wynik' idzie do pary rejestrów BC.
Teraz następuje wejście do pętli. 'Automatyczny' numer jest zwiększany przy każdym obiegu aż do momentu, gdy stanie się prawdopodobne, że 'bieżący' wiersz pojawi się na listingu.
17CE AUTO-L-1     PUSH  BC                  Zapamiętaj 'wynik'.
                  CALL  19B8,NEXT-ONE       Znajdź adres początku wiersza za obecnym wierszem 'automatycznym' (w DE).
                  POP   BC                  Odtwórz 'wynik'.
                  ADD   HL,BC               Wykonaj obliczenia
                  JR    C,17E4,AUTO-L-3     i skocz naprzód, jeśli są zakończone.
                  EX    DE,HL               Przesuń adres następnego wiersza
                  LD    D,(HL)              do pary rejestrów HL
                  INC   HL                  i pobierz jego numer.
                  LD    E,(HL)
                  DEC   HL
                  LD    (S-TOP),DE          Teraz S-TOP może być uaktualnione
                  JR    17CE,AUTO-L-1       a test powtórzony z nowym wierszem.
Teraz 'automatyczny' wydruk może zostać wykonany.
17E1 AUTO-L-2     LD    (S-TOP),HL          Gdy E-PPC jest mniejsze od S-TOP.
17E4 AUTO-L-3     LD    HL,(S-TOP)          Pobierz numer górnego wiersza
                  CALL  196E,LINE-ADDR      wraz z jego adresem.
                  JR    Z,17ED,AUTO-L-4     Jeśli wiersza nie można znaleźć,
                  EX    DE,HL               użyj w zastępstwie DE.
17ED AUTO-L-4     CALL  1833,LIST-ALL       Wydruk jest tworzony.
                  RES   4,(TV-FLAG)         Powrót nastąpi w to miejsce,
                  RET                       chyba że potrzebne było przewinięcie ekranu
                                            w celu pokazania bieżącego wiersza.

PUNKT WEJŚCIA DLA ROZKAZU 'LLIST'

Należy otworzyć kanał drukarki.
17F5 LLIST        LD    A,+03               Użyj strumienia +03.
                  JR    17FB,LIST-1         Skocz naprzód.

PUNKT WEJŚCIA DLA ROZKAZU 'LIST'

Należy otworzyć kanał na 'ekran główny'.
17F9 LIST         LD    A,+02               Użyj strumienia +02.
17FB LIST-1       LD    (TV-FLAG),+00       Sygnalizuj 'zwykły listing na głównej części ekranu'.
                  CALL  2530,SYNTAX-Z       Otwórz kanał o ile nie jest
                  CALL  NZ,1601,CHAN-OPEN   właśnie sprawdzana składnia.
                  RST   0018,GET-CHAR       Z bieżącym znakiem w rejestrze A
                  CALL  2070,STR-ALTER      sprawdź, czy ten strumień nie musi być zmieniony.
                  JR    C,181F,LIST-4       Jeśli nie, to skocz naprzód.
                  RST   0018,GET-CHAR       Czy bieżącym znakiem jest
                  CP    +3B                 ';'?
                  JR    Z,1814,LIST-2       Skocz, jeśli tak.
                  CP    +2C                 Czy jest to ','?
                  JR    NZ,181A,LIST-3      Skocz, jeśli nie.
1814 LIST-2       RST   0020,NEXT-CHAR      Teraz musi następować wyrażenie
                  CALL  1C82,EXPT-1NUM      numeryczne, np. LIST #5,20
                  JR    1822,LIST-5         Przy wyrażeniu, skocz naprzód.
181A LIST-3       CALL  1CE6,USE-ZERO       Inaczej użyj zera
                  JR    1822,LIST-5         i też skocz naprzód.
Przyjdź tutaj, jeśli strumień nie był zmieniany.
181F LIST-4       CALL  1CDE,FETCH-NUM      Pobierz numer wiersza lub użyj zera,
                                            jeśli żadnego nie dostarczono.
1822 LIST-5       CALL  1BEE,CHECK-END      Jeśli jest sprawdzana składnia
                                            wiersza edycyjnego, przejdź do następnego polecenia.
                  CALL  1E99,FIND-INT       Numer wiersza do BC.
                  LD    A,B                 Starszy bajt do A.
                  AND   +3F                 Ogranicz starszy bajt do poprawnego
                  LD    H,A                 zakresu i przekaż cały numer wiersza
                  LD    L,C                 do pary rejestrów HL.
                  LD    (E-PPC),HL          Ustaw E-PPC i znajdź adres
                  CALL  196E,LINE-ADDR      początku tego wiersza lub
                                            pierwszego wiersza za nim, jeśli bieżący
                                            wiersz nie istnieje.
1833 LIST-ALL     LD    E,+01               Znacznik 'przed bieżącym wierszem'.
Teraz następuje wejście do pętli sterującej wydrukiem ciągu wierszy.
1835 LIST-ALL-1   CALL  1855,OUT-LINE       Wypisz całość wiersza języka BASIC.
                  RST   0010,PRINT-A-1      To będzie znak 'powrotu karetki'.
                  BIT   4,(TV-FLAG)         Skocz wstecz o ile nie jest przetwarzany
                  JR    Z,1835,LIST-ALL-1   automatyczny wydruk.
                  LD    A,(DF-SZ)           Również skocz wstecz, jeśli wciąż
                  SUB   (S-POSN-hi)         jest część ekranu głównego,
                  JR    NZ,1835,LIST-ALL-1  której można użyć.
                  XOR   E                   W tym miejscu można wykonać powrót, jeśli
                  RET   Z                   ekran jest zapełniony, a bieżący wiersz został wydrukowany (E = +00)
                  PUSH  HL                  Jednakże, gdy bieżącego wiersza nie ma
                  PUSH  DE                  na listingu, to
                  LD    HL,+5C6C            należy uaktualnić S-TOP oraz
                  CALL  190F,LN-FETCH       wydrukować kolejny wiersz
                  POP   DE                  (używając przewijania ekranu).
                  POP   HL
                  JR    1835,LIST-ALL-1

PROCEDURA 'WYDRUKU CAŁEGO WIERSZA PROGRAMU'

Para rejestrów HL wskazuje na początek wiersza – czyli na komórkę, która przechowuje starszy bajt numeru wiersza. Zanim ten numer zostanie wydrukowany, najpierw jest testowany, aby stwierdzić, czy występuje przed 'bieżącym' wierszem, czy jest 'bieżącym' wierszem, lub czy następuje po 'bieżącym' wierszu.
1855 OUT-LINE     LD    BC,(E-PPC)          Pobierz numer 'bieżącego' wiersza
                  CALL  1980,CP-LINES       i porównaj go.
                  LD    D,+3E               Załaduj wstępnie rejestr D bieżącym kursorem wiersza.
                  JR    Z,1865,OUT-LINE1    Skocz naprzód, jeśli jest drukowany 'bieżący' wiersz.
                  LD    DE,+0000            Załaduj zero do rejestru D (to nie jest kursor)
                  RL    E                   i ustaw E na +01, jeśli wiersz znajduje się
                                            przed 'bieżącym' wierszem, a na +00,
                                            jeśli jest po nim.  (Znacznik przeniesienia pochodzi
                                            z CP-LINES.)
1865 OUT-LINE1    LD    (BREG),E            Zapamiętaj znacznik wiersza.
                  LD    A,(HL)              Pobierz starszy bajt
                  CP    +40                 numeru wiersza i wykonaj pełny powrót,
                  POP   BC                  jeśli listing został zakończony
                  RET   NC
                  PUSH  BC
                  CALL  1A28,OUT-NUM-2      Teraz numer wiersza może być wydrukowany z wiodącymi spacjami.
                  INC   HL                  Przesuń wskaźnik na adres
                  INC   HL                  kodu pierwszego rozkazu w wierszu
                  INC   HL
                  RES   0,(FLAGS)           Sygnalizuj 'dozwoloną spację wiodącą'
                  LD    A,D                 Pobierz kod kursora
                  AND   A                   i skocz naprzód o ile kursor
                  JR    Z,1881,OUT-LINE3    nie ma być drukowany.
                  RST   0010,PRINT-A-1      Więc wydrukuj kursor teraz.
187D OUT-LINE2    SET   0,(FLAGS)           Sygnalizuj 'bez spacji wiodącej teraz'.
1881 OUT-LINE3    PUSH  DE                  Zapamiętaj rejestry.
                  EX    DE,HL               Przemieść wskaźnik do DE.
                  RES   2,(FLAGS2)          Sygnalizuj 'nie wewnątrz cudzysłowu'.
                  LD    HL,+5C3B            To jest adres FLAGS.
                  RES   2,(HL)              Sygnalizuj 'drukuj w trybie K'.
                  BIT   5,(FLAGX)           Skocz naprzód o ile nie
                  JR    1894,OUT-LINE4      w trybie INPUT.
                  SET   2,(HL)              Sygnalizuj 'drukuj w trybie L'.
Teraz wejdź do pętli, aby wydrukować wszystkie kody w pozostałej części wiersza języka BASIC – przeskakując w razie konieczności przez dane zmiennoprzecinkowe.
1894 OUT-LINE4    LD    HL,(X-PTR)          Pobierz wskaźnik błędu składniowego
                  AND   A                   i skocz naprzód
                  SBC   HL,DE               o ile nie nadszedł czas wydrukowania
                  JR    NZ,18A1,OUT-LINE5   znacznika błędu.
                  LD    A,+3F               Wydrukuj znacznik błędu teraz.
                  CALL  18C1,OUT-FLASH      Jest to mrugający znak '?'.
18A1 OUT-LINE5    CALL  18E1,OUT-CURS       Rozważ, czy wydrukować kursor.
                  EX    DE,HL               Teraz przenieś wskaźnik do HL.
                  LD    A,(HL)              Pobieraj po kolei każdy znak.
                  CALL  18B6,NUMBER         Jeśli znak jest 'znacznikiem liczby',
                                            to ukryte dane zmiennoprzecinkowe
                                            nie mają być drukowane.
                  INC   HL                  Uaktualnij wskaźnik dla następnego obiegu.
                  CP    +0D                 Czy znakiem jest 'powrót karetki'?
                  JR    Z,18B4,OUT-LINE6    Skocz, jeśli tak.
                  EX    DE,HL               Przełącz wskaźnik na DE.
                  CALL  1937,OUT-CHAR       Wydrukuj znak.
                  JR    1894,OUT-LINE4      Wróć na początek pętli na co najmniej jeszcze jeden obieg.
Wiersz został teraz wydrukowany.
18B4 OUT-LINE6    POP   DE                  Odtwórz parę rejestrów DE
                  RET                       i powróć.

PROCEDURA 'LICZBA'

Jeśli rejestr A zawiera 'znacznik liczby', to para rejestrów HL zostanie zwiększona, tak aby wskazywała adres za danymi zmiennoprzecinkowymi.
18B6 NUMBER       CP    +0E                 Czy znak jest 'znacznikiem liczby'?
                  RET   NZ                  Jeśli nie, to powróć.
                  INC   HL                  Przesuń wskaźnik sześć razy,
                  INC   HL                  aby pominąć 'znacznik liczby'
                  INC   HL                  oraz pięć komórek zawierających
                  INC   HL                  dane zmiennoprzecinkowe
                  INC   HL
                  INC   HL
                  LD    A,(HL)              Przed powrotem pobierz bieżący kod.
                  RET

PROCEDURA 'WYDRUKOWANIA MRUGAJĄCEGO ZNAKU'

Procedura ta jest używana do wydruku 'kursora błędu' oraz 'kursorów trybu'.
18C1 OUT-FLASH    EXX                       Zapamiętaj bieżące rejestry.
                  LD    HL,(ATTR-T)         Zapamiętaj ATTR-T i MASK-T na
                  PUSH  HL                  stosie procesora.
                  RES   7,H                 Upewnij się, że FLASH jest włączone.
                  SET   7,L
                  LD    (ATTR-T),HL         Użyj tych zmodyfikowanych wartości dla ATTR-T i MASK-T.
                  LD    HL,+5C91            To jest P-FLAG.
                  LD    D,(HL)              Zapamiętaj P-FLAG również na stosie.
                  PUSH  DE
                  LD    (HL),+00            Upewnij się, że jest INVERSE 0, OVER 0, i nie ma PAPER 9 ani INK 9.
                  CALL  09F4,PRINT-OUT      Wydrukuj znak.
                  POP   HL                  Odtwórz poprzednią wartość P-FLAG
                  LD    (P-FLAG),H
                  POP   HL                  Przed powrotem odtwórz również
                  LD    (ATTR-T),HL         poprzednie wartości ATTR-T i MASK-T.
                  EXX
                  RET

PROCEDURA 'WYDRUKU KURSORA'

Procedura powraca, jeśli bieżące miejsce nie nadaje się do druku kursora. W przeciwnym razie zostanie wydrukowany kursor  C ,  E ,  G ,  K  lub  L .
18E1 OUT-CURS     LD    HL,(K-CUR)          Pobierz adres kursora,
                  AND   A                   lecz powróć tylko wtedy, jeśli
                  SBC   HL,DE               nie jest brane pod uwagę poprawna
                  RET   NZ                  pozycja.
                  LD    A,(MODE)            Bieżąca wartość zmiennej MODE
                  RLC   A                   zostaje pobrana i podwojona.
                  JR    Z,18F3,OUT-C-1      Skocz naprzód, o ile nie jest obsługiwany
                                            tryb rozszerzony lub graficzny.
                  ADD   A,+43               Dodaj odpowiednie przesunięcie, aby otrzymać 'E' lub 'G'.
                  JR    1909,OUT-C-2        Skocz naprzód, aby to wydrukować.
18F3 OUT-C-1      LD    HL,+5C3B            To jest zmienna FLAGS.
                  RES   3,(HL)              Sygnalizuj 'tryb K'.
                  LD    A,+4B               Znak 'K'.
                  BIT   2,(HL)              Skocz naprzód, aby wydrukować 'K'.
                  JR    Z,1909,OUT-C-2      Jeśli drukowanie ma być wykonane w trybie K.
                  SET   3,(HL)              Drukowanie ma być w trybie L, więc sygnalizuj 'tryb L'.
                  INC   A                   Utwórz znak 'L'.
                  BIT   3,(FLAGS2)          Skocz naprzód, o ile tryb jest inny od
                  JR    Z,1909,OUT-C-2      'trybu C'.
                  LD    A,+43               Znak 'C'.
1909 OUT-C-2      PUSH  DE                  Zapamiętaj parę rejestrów DE,
                  CALL  18C1,OUT-FLASH      gdy kursor jest drukowany z miganiem.
                  POP   DE
                  RET                       Wróć po wykonaniu pracy.
Uwaga: To działanie rozpoznawania, którą literę kursora należy drukować, określa tryb  'K' lub 'L/C'.

PROCEDURA 'POBRANIA WIERSZA'

Do tej procedury wchodzi się z parą rejestrów HL ustawioną na adres zmiennej systemowej S-TOP lub E-PPC. Procedura wraca ze zmienną systemową przechowującą numer następnego wiersza.
190F LN-FETCH     LD    E,(HL)              Pobrany zostaje numer wiersza
                  INC   HL                  przechowywany w zmiennej systemowej.
                  LD    D,(HL)
                  PUSH  HL                  Wskaźnik jest zapamiętywany.
                  EX    DE,HL               Numer wiersza zostaje przeniesiony
                  INC   HL                  do pary rejestrów HL i zwiększony o 1.
                  CALL  196E,LINE-ADDR      Znaleziony zostaje adres początku
                                            tego wiersza lub adres następnego wiersza,
                                            jeśli właściwy numer wiersza nie jest używany.
                  CALL  1695,LINE-NO        Numer tego wiersza jest pobierany.
                  POP   HL                  Wskaźnik zmiennej systemowej jest odtwarzany.
Punkt wejścia LN-STORE używany jest przez EDYTOR.
191C LN-STORE     BIT   5,(FLAGX)           Wróć, jeśli jest tryb INPUT;
                  RET   NZ                  inaczej idź dalej, aby wprowadzić
                  LD    (HL),D              numer tego wiersza do
                  DEC   HL                  dwóch komórek zmiennej systemowej.
                  LD    (HL),E
                  RET                       Gdy skończysz, powróć.

PROCEDURA 'DRUK ZNAKÓW W WIERSZU BASICA'

Wszystkie znaki oraz symbole w wierszu języka BASIC są wyświetlane przez cykliczne wywoływanie tej procedury. Punkt wejścia OUT-SP-NO jest używany, gdy są wyświetlane numery wierszy, które mogą wymagać spacji wiodących.
1925 OUT-SP-2     LD    A,E                 Rejestr A będzie zawierał +20 dla
                                            spacji lub +FF dla pozostałych znaków.
                  AND   A                   Sprawdź wartość i powróć, jeśli
                  RET   M                   nie ma być spacji.
                  JR    1937,OUT-CHAR       Skocz naprzód, aby wyświetlić spację.
192A OUT-SP-NO    XOR   A                   Zeruj rejestr A.
Para rejestrów HL zawiera numer wiersza a rejestry BC wartość dla 'powtarzanego odejmowania'. (BC zawiera kolejno '-1000, -100 lub -10'.)
192B OUT-SP-1     ADD   HL,BC               'Próbne odejmowanie'.
                  INC   A                   Zliczaj każdą 'próbę'.
                  JR    C,192B,OUT-SP-1     Skacz wstecz aż do wyczerpania.
                  SBC   HL,BC               Odtwórz ostatnie 'odejmowanie'
                  DEC   A                   i zmniejsz je.
                  JR    Z,1925,OUT-SP-2     Jeśli żadne 'odejmowanie' nie było możliwe,
                                            to skocz wstecz, aby sprawdzić, czy należy
                                            wyświetlić spację.
                  JP    15EF,OUT-CODE       Inaczej wyświetl cyfrę.
Punkt wejścia OUT-CHAR jest używany dla wszystkich znaków, symboli oraz znaków kontrolnych.
1937 OUT-CHAR     CALL  2D1B,NUMERIC        Zwróć wyzerowane przeniesienie, jeśli jest
                                            przetwarzany kod cyfry.
                  JR    NC,196C,OUT-CH-3    Skocz naprzód, aby wyświetlić tę cyfrę.
                  CP    +21                 Również wyświetlaj znaki sterujące
                  JR    C,196C,OUT-CH-3     oraz 'spację'.
                  RES   2,(FLAGS)           Sygnalizuj 'wyświetlanie w trybie K'.
                  CP    +CB                 Skocz naprzód, jeśli mamy do czynienia
                  JR    Z,196C,OUT-CH-3     ze symbolem 'THEN'.
                  CP    +3A                 Skocz naprzód, o ile nie mamy do czynienia
                  JR    NZ,195A,OUT-CH-1    ze znakiem ':'.
                  BIT   5,(FLAGX)           Skocz naprzód, aby wyświetlić
                  JR    NZ,1968,OUT-CH-2    ':', jeśli pracujemy w 'trybie INPUT'.
                  BIT   2,(FLAGS2)          Skocz naprzód, jeśli ':'
                  JR    Z,196C,OUT-CH-3     nie jest 'w cudzysłowach', to znaczy, że
                                            jest to znacznik rozdzielający polecenia.
                  JR    1968,OUT-CH-2       Znak ':' jest w cudzysłowach i można go teraz wyświetlić.
195A OUT-CH-1     CP    +22                 Akceptuj drukowanie wszystkich
                  JR    NZ,1968,OUT-CH-2    znaków z wyjątkiem '"'.
                  PUSH  AF                  Zapamiętaj kod znaku na czas zmieniania 'trybu cudzysłowu'.
                  LD    A,(FLAGS2)          Pobierz FLAGS2 i zmień
                  XOR   +04                 bit 2 na przeciwny.
                  LD    (FLAGS2),A          Wprowadź poprawioną wartość
                  POP   AF                  odtwórz kod znaku.
1968 OUT-CH-2     SET   2,(FLAGS)           Sygnalizuj 'następny znak należy wyświetlić w trybie L'.
196C OUT-CH-3     RST   0010,PRINT-A-1      Bieżący znak jest wyświetlany
                  RET                       przed powrotem.
Uwaga: Konsekwencją testów na bieżącym znaku jest to, czy następny znak zostanie "wyświetlony" w trybie 'K' czy w trybie 'L'.  Również zwróć uwagę na to, że program nie troszczy się o ':' w poleceniach REM.

PROCEDURA 'ADRES WIERSZA'

Dla danego numeru wiersza w parze rejestrów HL procedura ta zwraca w parze rejestrów HL adres początkowy tego wiersza lub 'pierwszego wiersza za nim' oraz początek poprzedniego wiersza w parze rejestrów DE. Jeśli ten numer wiersza jest w użyciu, to zostaje ustawiony znacznik zera. Jednakże w przypadku braku następnego wiersza, znacznik zera jest zwracany w stanie wyzerowanym.
196E LINE-ADDR    PUSH  HL                  Zapamiętaj dany numer wiersza.
                  LD    HL,(PROG)           Pobierz zmienną systemową
                  LD    D,H                 PROG i przenieś ten adres
                  LD    E,L                 do pary rejestrów DE.
Teraz wejdź do pętli, aby sprawdzać numer wiersza każdego wiersza w programie z danym numerem aż do momentu, gdy pojawi się zgodność lub przekroczenie wartości.
1974 LINE-AD-1    POP   BC                  Dany numer wiersza.
                  CALL  1980,CP-LINES       Porównaj go z numerem adresowanego wiersza.
                  RET   NC                  Wróć z wyzerowanym przeniesieniem;
                  PUSH  BC                  inaczej zaadresuj następny
                  CALL  19B8,NEXT-ONE       numer wiersza.
                  EX    DE,HL               Przełącz wskaźniki
                  JR    1974,LINE-AD-1      i skocz wstecz, aby przetworzyć następny
                                            numer wiersza w programie.

PROCEDURA 'PORÓWNANIA NUMERÓW WIERSZY'

Dany numer wiersza w parze rejestrów BC jest porównywany z adresowanym numerem wiersza.
1980 CP-LINES     LD    A,(HL)              Pobierz starszy bajt
                  CP    B                   adresowanego numeru wiersza
                  RET   NZ                  i porównaj go.  Wróć, jeśli nie jest zgodny.
                  INC   HL                  Następnie porównaj młodsze bajty.
                  LD    A,(HL)              Wróć z ustawionym znacznikiem przeniesienia,
                  DEC   HL                  jeśli adresowany numer wiersza jest wciąż
                  CP    C                   mniejszy od danego.
                  RET

PROCEDURA 'ZNAJDOWANIA ROZKAZU'

Procedura ta posiada dwie bezpośrednie funkcje.

i. Może zostać użyta do znalezienia D-tego rozkazu w wierszu języka BASIC – powracając z parą rejestrów HL zawierającą adres przed początkiem rozkazu i ustawionym znacznikiem zera.

ii. Może również być użyta do znalezienia rozkazu, jeśli istnieje, który rozpoczyna się określonym kodem symbolu (w rejestrze E).

1988              INC   HL                  Nieużywane.
                  INC   HL
                  INC   HL
198B EACH-STMT    LD    (CH-ADD),HL         Ustaw CH-ADD na bieżący bajt.
                  LD    C,+00               Ustaw znacznik 'wyłączonych cudzysłowów'.
Wejdź do pętli obsługującej każdy rozkaz w wierszu języka BASIC.
1990 EACH-S-1     DEC   D                   Zmniejsz 'D' i wróć, jeśli
                  RET   Z                   został znaleziony pożądany rozkaz.
                  RST   0020,NEXT-CHAR      Pobierz kod następnego znaku
                  CP    E                   i skocz, jeśli nie pasuje
                  JR    NZ,199A,EACH-S-3    do kodu danego symbolu.
                  AND   A                   Lecz jeśli pasuje, to
                  RET                       wróć z wyzerowanymi znacznikami
                                            przeniesienia i zera.
Teraz wejdź do pętli, aby przetworzyć pojedyncze znaki w wierszu w celu znalezienia końca tego rozkazu.
1998 EACH-S-2     INC   HL                  Uaktualnij wskaźnik i pobierz
                  LD    A,(HL)              nowy kod.
199A EACH-S-3     CALL  18B6,NUMBER         Pomiń każdą liczbę.
                  LD    (CH-ADD),HL         Uaktualnij CH-ADD.
                  CP    +22                 Skocz naprzód, jeśli znakiem
                  JR    NZ,19A5,EACH-S-4    nie jest '"'.
                  DEC   C                   Inaczej ustaw 'znacznik cudzysłowów'.
19A5 EACH-S-4     CP    +3A                 Skocz naprzód, jeśli
                  JR    Z,19AD,EACH-S-5     znakiem jest ':'.
                  CP    +CB                 Skocz naprzód, o ile znak
                  JR    NZ,19B1,EACH-S-6    nie jest symbolem 'THEN'.
19AD EACH-S-5     BIT   0,C                 Odczytaj 'znacznik cudzysłowów'
                  JR    Z,1990,EACH-S-1     i skocz wstecz na końcu każdego rozkazu (łącznie z tym za 'THEN').
19B1 EACH-S-6     CP    +0D                 Skocz wstecz, o ile nie znajdujemy się
                  JR    NZ,1998,EACH-S-2    na końcu wiersza języka BASIC.
                  DEC   D                   Zmniejsz licznik rozkazów
                  SCF                       i ustaw znacznik przeniesienia
                  RET                       przed powrotem.

PROCEDURA 'NASTĘPNY'

Procedurę tę można użyć do znalezienia 'następnego wiersza' w obszarze programu lub 'następnej zmiennej' w obszarze zmiennych. Procedura troszczy się o sześć różnych rodzajów zmiennych, które używa BASIC komputera SPECTRUM.
19B8 NEXT-ONE     PUSH  HL                  Zapamiętaj adres bieżącego wiersza lub zmiennej.
                  LD    A,(HL)              Pobierz pierwszy bajt.
                  CP    +40                 Skocz naprzód, jeśli poszukiwany
                  JR    C,19D5,NEXT-O-3     jest 'następny wiersz'.
                  BIT   5,A                 Skocz naprzód, jeśli poszukiwany 
                  JR    Z,19D6,NEXT-O-4     jest następny łańcuch lub zmienna tablicowa.
                  ADD   A,A                 Skocz naprzód przy zmiennych
                  JP    M,19C7,NEXT-O-1     prostych lub zmiennych pętli FOR-NEXT.
                  CCF                       Tylko dla zmiennych liczbowych o długiej nazwie.
19C7 NEXT-O-1     LD    BC,+0005            Zmienna liczbowa zajmuje
                  JR    NC,19CE,NEXT-O-2    pięć komórek, lecz zmienna sterująca pętli
                  LD    C,+12               FOR-NEXT potrzebuje osiemnaście komórek.
19CE NEXT-O-2     RLA                       Znacznik przeniesienia przyjmuje stan zero
                                            tylko dla zmiennych o długich nazwach
                                            aż do momentu, gdy zostanie osiągnięty końcowy znak długiej nazwy.
                  INC   HL                  Zwiększ wskaźnik
                  LD    A,(HL)              i pobierz nowy kod.
                  JR    NC,19CE,NEXT-O-2    Skocz wstecz, o ile poprzedni kod nie był ostatnim kodem nazwy zmiennej.
                  JR    19DB,NEXT-O-5       Teraz skocz naprzód (BC = +0005 lub +0012).
19D5 NEXT-O-3     INC   HL                  Pomiń młodszy bajt numeru wiersza.
19D6 NEXT-O-4     INC   HL                  Teraz wskaż młodszy bajt długości wiersza.
                  LD    C,(HL)              Pobierz długość do pary rejestrów BC.
                  INC   HL
                  LD    B,(HL)
                  INC   HL                  Zrób miejsce na dodatkowy bajt.
We wszystkich przypadkach zostaje znaleziony adres 'następnego' wiersza lub zmiennej.
19DB NEXT-O-5     ADD   HL,BC               Wskaż pierwszy bajt 'następnego' wiersza lub zmiennej.
                  POP   DE                  Pobierz adres poprzedniego i przejdź dalej
                                            do następnej procedury.

PROCEDURA 'RÓŻNICY'

'Długość' pomiędzy dwoma 'początkami' zostaje utworzona w parze rejestrów BC. Wskaźniki zostają odtworzone i zwrócone w stanie nienaruszonym.
19DD DIFFER       AND   A                   Przygotuj się do prawdziwego odejmowania.
                  SBC   HL,DE               Znajdź długość z 'początku' następnego
                  LD    B,H                 elementu i przekaż ją do
                  LD    C,L                 pary rejestrów BC.
                  ADD   HL,DE               Odtwórz adres
                  EX    DE,HL               i wymień go
                  RET                       przed powrotem.

PROCEDURA 'ODZYSKU'

Punkt wejścia RECLAIM-1 jest używany, gdy adres pierwszej komórki do odzyskania jest w parze rejestrów BC, a adres pierwszej komórki, która ma zostać pozostawiona w spokoju, jest w parze rejestrów HL. Punkt wejścia RECLAIM-2 jest używany, gdy para rejestrów HL wskazuje na pierwszą komórkę do odzyskania, a para rejestrów BC zawiera liczbę bajtów do odzysku.
19E5 RECLAIM-1    CALL  19DD,DIFFER         Użyj procedury 'różnicy' do uzyskania
                                            pożądanych wartości.
19E8 RECLAIM-2    PUSH  BC                  Zapamiętaj liczbę bajtów do odzysku.
                  LD    A,B                 Wszystkie wskaźniki zmiennych systemowych
                  CPL                       powyżej tego obszaru muszą zostać
                  LD    B,A                 zredukowane o zawartość 'BC',
                  LD    A,C                 więc liczba ta zostaje zanegowana arytmetycznie
                  CPL                       przed zmianą tych wskaźników.
                  LD    C,A
                  INC   BC
                  CALL  1664,POINTERS
                  EX    DE,HL               Umieść adres 'pierwszej komórki'
                  POP   HL                  w parze rejestrów DE
                  ADD   HL,DE               i odtwórz adres pierwszej komórki na lewo.
                  PUSH  DE                  Zapamiętaj adres 'pierwszej komórki'
                  LDIR                      w czasie odzyskiwania.
                  POP   HL
                  RET                       Teraz powróć.

PROCEDURA 'E-LINE-NO'

Procedura ta jest używana do odczytu numeru wiersza w obszarze edycyjnym. Jeśli brak numeru wiersza, tj. bezpośredni rozkaz języka BASIC, to przyjmuje się, że ma on wartość 0. We wszystkich przypadkach numer wiersza jest zwracany w parze rejestrów BC.
19FB E-LINE-NO    LD    HL,(E-LINE)         Pobierz wskaźnik edytowanego wiersza.
                  DEC   HL                  Ustaw CH-ADD na adres komórki
                  LD    (CH-ADD),HL         przed jakimkolwiek numerem.
                  RST   0020,NEXT-CHAR      Przekaż pierwszy kod do rejestru A.
                  LD    HL,+5C92            Jednakże przed zbadaniem tego kodu
                  LD    (STKEND),HL         ustaw obszar pamięci kalkulatora jako tymczasowy.
                  CALL  2D3B,INT-TO-FP      Teraz odczytaj cyfry numeru wiersza. Jeśli brak numeru, zwróć zero.
                  CALL  2DA2,FP-TO-BC       Wprowadź numer wiersza do pary rejestrów BC.
                  JR    C,1A15,E-L-1        Skocz naprzód, jeśli numer przekracza 65.536.
                  LD    HL,+D8F0            Inaczej testuj go względem liczby 10.000
                  ADD   HL,BC
1A15 E-L-1        JP    C,1C8A,REPORT-C     Jeśli jest ponad 9.999, generuj raport C.
                  JP    16C5,SET-STK        Powróć poprzez SET-STK, które
                                            umieści stos kalkulatora na swoim miejscu.

PROCEDURA 'DRUKOWANIA RAPORTU I NUMERU WIERSZA'

Punkt wejścia OUT-NUM-1 prowadzi do wydruku liczby w parze rejestrów BC. Jednakże poprawnie nie zostanie wydrukowana żadna wartość powyżej 9.999. Punkt wejścia OUT-NUM-2 prowadzi do wydrukowania liczby adresowanej pośrednio przez parę rejestrów HL. Tym razem pojawią się we właściwej liczbie wszystkie niezbędne spacje wiodące. Ponownie granicą poprawności wydruku liczb jest 9.999.
1A1B OUT-NUM-1    PUSH  DE                  Zapamiętaj rejestry wskaźnikowe
                  PUSH  HL                  na czas wykonywania procedury.
                  XOR   A                   Wyzeruj rejestr A.
                  BIT   7,B                 Skocz naprzód, aby wydrukować raczej zero
                                            niż '-2' przy raportowaniu 
                  JR    NZ,1A42,OUT-NUM-4   w wierszu edycyjnym.
                  LD    H,B                 Przenieś liczbę do
                  LD    L,C                 pary rejestrów HL.
                  LD    E,+FF               Zaznacz 'bez spacji wiodących'.
                  JR    1A30,OUT-NUM-3      Skocz naprzód, aby wydrukować liczbę.
1A28 OUT-NUM-2    PUSH  DE                  Zapamiętaj parę rejestrów DE.
                  LD    D,(HL)              Pobierz liczbę do
                  INC   HL                  pary rejestrów DE i zapamiętaj 
                  LD    E,(HL)              zmieniony wskaźnik.
                  PUSH  HL
                  EX    DE,HL               Przenieś liczbę do pary rejestrów HL
                  LD    E,+20               i oznacz 'należy drukować spacje wiodące'.
Teraz zostaje wydrukowana liczba całkowita z pary rejestrów HL.
1A30 OUT-NUM-3    LD    BC,+FC18            To jest '-1,000'.
                  CALL  192A,OUT-SP-NO      Drukuj pierwszą cyfrę.
                  LD    BC,+FF9C            To jest '-100'.
                  CALL  192A,OUT-SP-NO      Drukuj drugą cyfrę.
                  LD    C,+F6               To jest '-10'.
                  CALL  192A,OUT-SP-NO      Drukuj trzecią cyfrę.
                  LD    A,L                 Przenieś pozostałość liczby do rejestru A.
1A42 OUT-NUM-4    CALL  15EF,OUT-CODE       Drukuj cyfrę.
                  POP   HL                  Przed powrotem odtwórz rejestry.
                  POP   DE
                  RET

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.