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 |