ZX ROM Výpis

Transkript

ZX ROM Výpis
Vydavatelství Naše vojsko, n. p., Praha – 1989
Vytiskly JČT, n. p., České Budějovice, provoz 6 Jindřichův Hradec
ÚVOD
16K monitorový program Spectra je složitý program ve strojovém kódu
struktura je velmi zřetelná a to proto, že je rozdělena do tří hlavních částí:
a)
b)
c)
procesoru
Z80.
Jeho
Vstupní a výstupní podprogramy
Interpret jazyka BASIC
Manipulace s výrazy
Tyto bloky jsou ale ještě příliš velké na to, aby je bylo možno snadno pochopit vcelku, a
je monitorový program v této knize rozdělen do deseti částí.
Nyní nastíníme každou z těchto částí:
proto
Restartovací podprogramy a tabulky
Na začátku monitorového programu jsou různé restartovací podprogramy, které jsou volány
jednobajtovými instrukcemi RST. Tyto restarty jsou využity všechny. Například restart #08 je využíván
pro hlášení různých sdělení nebo chyb. Tabulky v této části monitorového programu obsahují nezkrácené
tvary klíčových slov a kódy tlačítek.
Podprogram pro obsluhu klávesnice
Klávesnice je testována každou 1/50 sec, a po testu je na příslušnou systémovou proměnnou uložen
kód příslušné klávesy. Všechna tlačítka na klávesnici "opakují" jestliže jsou stlačena delší dobu. O
to se stará také tento podprogram.
Podprogram pro obsluhu reproduktoru
Spectrum má vestavěný reproduktor a tóny vznikají opakovaným užitím instrukce OUT. V řídícím
podprogramu byla věnována velká pozornost tomu, aby bylo zajištěno, že žádaný tón bude mít příslušnou
výšku a délku trvání.
Podprogramy obsluhující kazetový magnetofon
Jednou ze slabých stránek počítače ZX-81 bylo to, že jen velmi malá část jeho monitorového
programu byla určena k obsluze kazetového magnetofonu. Ale ve Spectru je už rozsáhlý blok strojového
kódu a dá se říci, že jedním z nejúspěšnějších rysů Spectra je právě vysoká kvalita ovládacích
podprogramů. Basicové programy nebo bloky dat jsou ukládány pomocí hlavičkového bloku, který má 17
bajtů a je ukládán první. Hlavička popisuje charakter dat ukládaných v následujícím bloku. Jedinou
"nevýhodou" tohoto systému je to, že není možno zabezpečit utajení bloků dat.
Podprogramy obsluhující obrazovku a tiskárnu
Všechny ostatní vstupní a výstupní podprogramy jsou "vektorovány" pomocí kanálových a
"streamových" (proudových) adres. Ve standardním Spectru je vstup možný pouze z klávesnice, ale výstup
může být směrován na tiskárnu a horní nebo dolní část televizního displeje. Hlavní "vstupní"
podprogram v této části monitorového programu je EDITOR, který umožňuje uživateli vkládat znaky do
dolní části televizního displeje. Podprogram PRINT OUT je dosti pomalý, protože je společný pro
všechny druhy tisku. Například přidání jednoho bajtu na displej v sobě zahrnuje též současné posouzení
stavu funkcí OVER a INVERSE při každém použití tohoto podprogramu.
Komentovaný výpis paměti ROM
5
Prováděcí podprogramy
V této části monitorového programu můžeme najít iniciační podprogram a hlavní prováděcí smyčku
interpretu jazyka Basic. Ve Spectru je kontrolována syntaxe basicového řádku, který je posléze uložen
do programové oblasti, jestliže měl číslo, jinak je okamžitě vykonán, což může ve svém důsledku vést k
různým situacím. (Zřetelně je to vidět v případě operace RUN).
Interpretace příkazů jazyka Basic
Tato část monitorového programu považuje basicový řádek za soubor příkazů. Pro každý příkaz je
zde "příkazový" podprogram, který provede (interpretuje) příslušný příkaz jako sled instrukcí ve
strojovém kódu.
Vyhodnocování výrazu
Spectrum má velmi obsažný program pro vyhodnocování výrazů, který umožňuje využít širokou škálu
typů proměnných, funkcí a operací. Tato část monitoru je opět dosti pomalá, a to právě proto, že se
zabývá všemi možnými alternativami. Zvláště zpracování řetězců je velmi dobře zvládnuto. Všechny
jednoduché řetězce jsou uloženy dynamicky a jejich staré kopie jsou okamžitě, jakmile se stanou
nadbytečnými, zničeny. To znamená, že není potřeba provádět vytřiďování "smetí" tak jako u jiných
systémů.
Aritmetické podprogramy
Spectrum používá dva typy čísel. Celočíselné hodnoty v rozsahu -65535 až 65535 jsou takzvané
krátké (integer) formy, zatímco všechna ostatní čísla jsou ukládána v pětibajtové formě zvané
pohyblivá řádová čárka (floating point). Současná verze monitoru má však bohužel také dvě chyby.
1) Chyba v dělení (34. bit je při dělení ztracen).
2) Hodnota -65535 je někdy uložena ve formě integer a jindy ve formě floating point, což někdy
působí problémy.
Kalkulátor pro reálná čísla
Kalkulátor Spectra zpracovává čísla a řetězce. Jeho operace jsou specifikovány tzv. "literály".
Tato část monitorového programu obsahuje podprogramy pro všechny matematické funkce. Funkce jako sin,
exp, ln atd. jsou získávány aproximačním způsobem. Aproximace se provádí rozvojem Čebyševových
polynomů.
Celkově se dá říci, že 16K monitor nabízí extrémně široký rozsah různých basicových příkazů a
funkcí, ale protože jeho tvůrci měli k dispozici jen omezený prostor v paměti, je tento program spíše
kompaktnější než rychlejší.
6
Komentovaný výpis paměti ROM
PODPROGRAMY RESTARTŮ A TABULKY
RST #00 START
Maskované přerušení je zakázáno a registrový pár DE nastaven tak, aby obsahoval nejvyšší možnou
adresu paměti RAM.
0000
START
DI
XOR
LD
JP
Zákaz přerušení i testu klávesnice
#00 pro start, ale #FF pro NEW
Nejvyšší možná adresa RAM
Skok dopředu
A
DE,#FFFF
#11CB,START/NEW
RST #08 ERROR RESTART
Chybový ukazatel je nastaven tak, aby ukazoval na pozici chyby.
0008
ERROR-1
LD
LD
JP
HL,(#5C5D) {CH-ADD}
(#5C5F),HL {X-PTR}
#0053,ERROR-2
Adresa dosazená interpretem
je okopírována do chybového ukazatele,
dříve než se bude pokračovat.
RST #10 RESTART TISK ZNAKU
Registr A obsahuje kód znaku, který má být vytištěn.
0010
PRINT-A-1
JP
DEFB
#15F2,PRINT-A-2
#FF,#FF,#FF,#FF,#FF
Okamžitý skok dopředu.
Volné místo.
RST #18 RESTART NAČTENÍ ZNAKU
Obsah místa adresovaného systémovou proměnnou CH-ADD je přečten. Návrat, jestliže se jedná o
znak použitelný k tisku, jinak je CH-ADD zvětšen a testy se opakují.
0018
GET-CHAR
001C
TEST-CHAR
LD
LD
CALL
RET
HL,(#5C5D) {CH-ADD}
A,(HL)
#007D,SKIP-OVER
NC
RST #20 RESTART NAČTENÍ DALŠÍHO ZNAKU
Při interpretaci basicového řádku
postupování po řádku.
0020
NEXT-CHAR
CALL
JR
DEFB
#0074,CH-ADD+1
#001C,TEST-CHAR
#FF,#FF,#FF
Vyzvedni hodnotu adresovanou
systémovou proměnnou CH-ADD.
Zjisti, zda se jedná o znak použitelný k tisku a
vrať se, je-li to pravda.
je
tento
podprogram
opakovaně
vyvoláván,
což
způsobuje
Je nutno zvětšit CH-ADD.
Skok zpět a test nové hodnoty.
Volná místa.
RST #28 RESTART KALKULÁTORU
Kalkulátor pracující s pohyblivou řádovou čárkou začíná na adrese #335B.
0028
FP-CALC
JP
DEFB
#335B,CALCULATE
#FF,#FF,#FF,#FF,#FF
Okamžitě skoč dopředu.
Volná místa.
Komentovaný výpis paměti ROM
7
RST #30 RESTART VYTVOŘENÍ BC PROSTORU
Tento podprogram vytváří volná místa v pracovním prostoru. Počet
hodnotou uloženou v reg. BC.
0030
BC-SPACES
PUSH BC
LD
HL,(#5C61) (WORKSP)
PUSH HL
JP
#169E,RESERVE
vytvářených míst je dán
Uschovej čítač.
Vyzvedni současnou adresu pracovního prostoru a
uchovej ji před
vstupem do samotného podprogramu.
RST #38 PODPROGRAM MASKOVATELNÉHO PŘERUŠENÍ
Hodiny reálného času ve SPECTRU jsou zvětšeny a současně je testována klávesnice kdykoliv dojde
k maskovatelnému přerušení.
0038
MASK-INT
0048
KEY-INT
PUSH
PUSH
LD
INC
LD
LD
OR
JR
INC
PUSH
PUSH
CALL
POP
POP
POP
POP
EI
RET
AF
HL
HL,(#5C78) (FRAMES)
HL
(#5C78),HL (FRAMES)
A,H
L
NZ,#0048,KEY-INT
(IY+64) (FRAMES-3)
BC
DE
#02BF,KEYBOARD
DE
BC
HL
AF
Uchovej hodnoty uložené
v těchto registrech.
Dolní dva bajty systémové proměnné FRAMES
jsou zvětšeny
každých 20 ms. (Evropská norma)
Nejvyšší bajt této proměnné je
zvětšen pouze tehdy,
je-li hodnota nižších dvou
bajtů nulová.
Uschovej hodnoty obsažené
v těchto registrech.
Nyní testuj klávesnici.
Obnov hodnoty
v registrech.
Maskovatelné přerušení je před
návratem znovu povoleno.
PODPROGRAM ERROR-2
Návratové adresy do interpretu ukazují na data, která určují, ke které chybě došlo. Tato data
jsou vyzvednuta a přenesena do systémové proměnné ERR-NR. Než se provede odskok dopředu a vyčištění
zásobníku kalkulátoru, je také vyčištěn zásobník.
0053
ERROR-2
0055
ERROR-3
POP
LD
LD
LD
JP
DEFB
DEFB
HL
L,(HL)
(IY+0),L
SP,(#5C3D) {ERR-SP}
#16C5,SET-STK
#FF,#FF,#FF,#FF
#FF,#FF,#FF
Adresa na zásobníku
ukazuje na kód chyby.
(ERR-NR) Je přenesena do ERR-NR a provede
se vyčištění zásobníku před
odskokem do SET-STK.
Volná místa.
PODPROGRAM NEMASKOVATELNÉHO PŘERUŠENÍ
Tento podprogram není v normálním SPECTRU využit, ale měl by umožňovat NMI (nemaskovatelné
přerušení). Systémová proměnná na adr. #5CB0, která se jmenuje NMIADD, musí mít nulovou hodnotu aby
došlo k resetu.
0066
8
RESET
PUSH
PUSH
LD
LD
OR
AF
HL
HL,(#5CB0) {NMIADD}
A,H
L
Uchovej hodnoty
obsažené v registrech.
Dva bajty proměnné NMIADD
musí být oba
nulové.
Komentovaný výpis paměti ROM
0070
NO-RESET
JR
JP
POP
POP
RETN
NZ,#0070,NO-RESET
(HL)
HL
AF
Pozn.: zde mělo správně být
Skok na START.
Obnov hodnoty v
registrech a
vrať se.
JR z,#0070.
PODPROGRAM CH-ADD+1
Adresa, která se nachází v CH-ADD je zvětšena a opět uložena. Nyní se vezme obsah místa
adresovaného CH-ADD. Vstupní body podprogramu TEMP-PTR1 a TEMP-PTR2 jsou použity, aby
nastavily
CH-ADD na přechodnou periodu.
0074
0077
0078
CH-ADD+1
TEMP-PTR1
TEMP-PTR2
LD
INC
LD
LD
RET
HL,(#5C5D)
HL
(#5C5D),HL
A,(HL)
(CH-ADD)
(CH-ADD)
Vyzvedni adresu.
Zvětši ukazatel.
Nastav adresu.
Vyzvedni adresovanou hodnotu
a vrať se.
PODPROGRAM SKIP-OVER
Hodnota, která do tohoto podprogramu vstupuje v registru A, je testována zda se jedná o znak,
který je možno tisknout. Různé speciální kódy způsobují, že reg. HL je jednou nebo dvakrát zvětšen a
podle toho se současně upravuje hodnota CH-ADD.
007D
0090
SKIP-OVER
SKIPS
CP
RET
CP
RET
CP
RET
CP
CCF
RET
INC
CP
JR
INC
SCF
LD
RET
#21
NC
#0D
Z
#10
C
#18
Vrať se s vynulovaným CY,
jestli se jedná o obyčejný znak.
Vrať se, jestliže
bylo dosaženo konce řádku.
Jestliže se jedná o hodnotu v rozsahu #00 až #0F,
vrať se s nastaveným CY.
Vrať se s kódy #18-#20 rovněž
s nastaveným CY.
C
HL
#16
C,#0090,SKIPS
HL
(#5C5D),HL
(CH-ADD)
Jednou přeskoč.
Skoč dopředu při
kódu #10 až #15 (INK až OVER)).
Ještě jednou skoč (AT & TAB).
Vrať se s nastaveným CY
a s CH-ADD nastavenou na
příslušnou adresu.
TABULKA KÓDOVANÝCH KLÍČOVÝCH SLOV - "TOKENS"
Všechny TOKENS, které SPECTRUM používá jsou expandovány odkazy na tuto tabulku. Poslední bajt
každého TOKEN je označen nastavením bitu 7.
0095
009D
00A5
00AD
00B5
00BD
00C5
00CD
00D5
00DD
00E5
00ED
BF
59
49
4E
54
4F
CE
41
41
49
CE
49
52
A4
4E
A4
41
44
53
CE
54
4E
41
CE
4E
50
D4
41
C2
C5
49
41
CE
D4
42
55
C4
C9
53
54
56
56
CE
53
4C
53
D3
53
49
46
43
54
41
41
43
CE
CE
51
50
D2
4E
CE
52
D2
4C
CC
4F
41
45
D2
45
53
4B
50
45
41
A4
4C
D3
43
58
53
45
54
45
4F
45
D4
43
45
54
D3
D0
47
CB
52
?
Y
I
N
T
O
N
A
A
I
N
I
R
$
N
$
A
D
S
N
T
N
A
N
N
P
T
A
B
E
I
A
N
T
B
U
D
I
S
T
V
V
N
S
L
S
S
S
Komentovaný výpis paměti ROM
I
F
C
T
A
A
C
N
N
Q
P
R
N
N
R
R
L
L
O
A
E
R
E
S
K
P
E
A
$
L
S
C
X
S
E
T
E
O
E
T
C
E
T
S
P
G
K
R
9
00F5
00FD
0105
010D
0115
011D
0125
012D
0135
013D
0145
014D
0155
015D
0165
016D
0175
017D
0185
018D
0195
019D
01A5
01AD
01B5
01BD
01C5
01CD
01D5
01DD
01E5
01ED
01F5
01FD
A4
42
3C
4E
53
46
4D
52
20
A3
52
43
CB
41
D4
4F
50
53
41
53
42
4E
CD
4F
55
4F
45
45
52
52
41
49
D7
54
43
49
BD
C5
54
CE
41
41
A3
4D
49
49
50
53
49
56
52
D4
C4
54
4F
54
52
20
C2
41
D4
58
49
55
4E
C6
43
55
48
CE
3E
54
45
43
D4
53
43
45
46
52
41
C8
4E
45
49
53
44
4F
52
49
45
54
49
C4
50
D4
4E
CE
44
43
4C
52
52
4F
BD
48
D0
41
4D
C5
4C
52
D9
43
50
42
56
D2
4E
54
41
52
44
4E
CD
CF
4E
4C
41
50
D4
53
4F
4C
45
CE
A4
D2
3C
45
44
D4
4F
4F
4F
47
42
4C
45
52
45
4F
D4
4F
54
C5
45
55
46
47
50
49
55
4F
50
41
4D
D3
41
43
4E
41
BE
CE
45
46
56
50
53
C5
45
C5
D2
49
52
55
4C
D0
C1
4E
D2
C5
4F
4F
55
53
53
4B
4C
56
49
44
D2
4F
4F
4E
4C
54
46
4F
C5
45
45
56
45
49
46
47
53
D4
4C
52
52
45
43
44
D2
20
D4
D4
C5
C5
4F
C5
5A
52
52
50
D4
C4
49
CF
20
52
45
4E
20
45
D0
4E
4C
48
C5
4C
49
45
45
D7
4F
49
47
53
4C
4C
4E
50
D4
52
C5
41
45
D9
$
B
<
N
S
F
M
R
#
R
C
K
A
T
O
P
S
A
S
B
N
M
O
U
O
E
E
R
R
A
I
W
T
C
I
=
E
T
N
A
A
#
M
I
I
P
S
I
V
R
T
D
T
O
T
R
B
A
T
X
I
U
N
F
C
U
H
N
>
T
E
C
T
S
C
E
F
R
A
H
N
E
I
S
D
O
R
I
E
T
I
D
P
T
N
N
D
C
L
R
R
O
=
H
P
A
M
E
L
R
Y
C
P
B
V
R
N
T
A
R
D
N
M
O
N
L
A
P
T
S
O
L
E
N
$
R
<
E
D
T
O
O
O
G
B
L
E
R
E
O
T
O
T
E
E
U
F
G
P
I
U
O
P
A
M
S
A
C
N
A
>
N
E
F
V
P
S
E
E
E
R
I
R
U
L
P
A
N
R
E
O
O
U
S
S
K
L
V
I
D
R
O
O
N
L
T
F
O
E
E
E
V
E
I
F
G
S
T
L
R
R
E
C
D
R
T
D
I
O
R
E
N
E
P
N
L
H
E
L
I
E
E
W
O
I
G
S
L
L
N
P
T
R
E
A
E
Y
T
T
E
E
O
E
Z
R
R
P
TABULKY KLÁVES
Ve SPECTRU je 6 oddělených tabulek kláves. Výsledný kód znaku závisí na stištění určité klávesy
a na momentálně použitém režimu.
(a) Tabulka hlavních kláves - L režim a CAPS SHIFT.
0205
020D
0215
021D
0225
10
42
4E
4D
0E
20
48
4A
4B
4C
0D
59
55
49
4F
50
36
37
38
39
30
35
34
33
32
31
54
52
45
57
51
47
46
44
53
41
56
43
58
5A
B
N
M
SYM.SH.
SPACE
H
J
K
L
ENTER
Y
U
I
0
P
6
7
8
9
0
5
4
3
2
1
T
R
E
W
Q
G
F
D
S
A
V
C
X
Z
Komentovaný výpis paměti ROM
(b) Režim EXTEND. Klávesy písmen.
022C
0230
0234
0238
023C
0240
0244
E3
B4
AF
A7
B2
C2
C1
C4
BC
B0
A6
BA
E1
B8
E0
BD
B1
BE
E5
B3
E4
BB
C0
AD
A5
B9
READ
TAN
CODE
PI
SIN
CHR$
STR$
BIN
SGN
VAL
INKEY$
INT
LLIST
LN
LPRINT
ABS
LEN
PEEK
RESTORE
COS
DATA
SQR
USR
TAB
RND
EXP
(c) Režim EXTEND. Klávesy písmen a SYMBOL SHIFT.
0246
024A
024E
0252
0256
025A
025E
7E
B7
BF
DD
B5
5D
5B
DC
7B
AE
DE
D6
DB
D7
DA
7D
AA
DF
7C
B6
5C
D8
AB
7F
D5
D9
~
ATN
IN
INVERSE
ASN
]
[
BRIGHT
{
VAL$
OVER
VERIFY
FLASH
BEEP
PAPER
}
SCREEN$
OUT
|
ACS
\
CIRCLE
ATTR
©
MERGE
INK
(d) Řídící kódy. Klávesy číslic a CAPS SHIFT.
0260
0264
0268
0C 07 06 04
05 08 0A 0B
09 0F
DELETE
EDIT
CAPS LOCK
INV.VIDEO kurzor vlevo dolů
vpravo
GRAPHICS
TRUE VIDEO
nahoru
(e) Kódy symbolů. Klávesy písmen a SYMBOL SHIFT.
026A
026E
0272
0276
027A
027E
0282
E2
C8
AC
2E
C7
C5
C6
2A
CC
2D
2C
3C
2F
3A
3F
CB
2B
3B
C3
C9
CD
5E
3D
22
3E
60
STOP
>=
AT
.
<=
OR
AND
*
TO
,
<
/
:
?
THEN
+
;
NOT
<>
STEP
^
=
"
>
£
(f) Režim EXTEND. Klávesy číslic a SYMBOL SHIFT.
0284
0288
028C
D0 CE A8 CA
D3 D4 D1 D2
A9 CF
FORMAT
OPEN
POINT
DEF FN
CLOSE
CAT
FN
MOVE
Komentovaný výpis paměti ROM
LINE
ERASE
11
KLÁVESNICOVÉ PODPROGRAMY
PODPROGRAM VYHODNOCENÍ KLÁVESNICE
Tento velmi důležitý podprogram je vyvoláván z hlavního klávesnicového podprogramu a z
podprogramu INKEY$ (při SCANINGu). Ve všech případech obsahuje registr E hodnotu v rozsahu #00-#27
byla-li stlačena některá z kláves, nebo hodnotu #FF nebyla-li stlačena žádná klávesa. Registr D
obsahuje hodnotu, která indikuje stištění SHIFTovacích kláves. Jestliže byly stlačeny obě SHIFTovací
klávesy, obsahují registry D a E hodnoty pro CAPS SHIFT a SYMBOL SHIFT. Jestliže nebyla stištěna žádná
klávesa obsahuje registrový pár DE hodnotu #FFFF. Nulový indikátor se vrací vynulován, když došlo ke
stištění dvou kláves a ani jedna z nich nebyla klávesa SHIFT.
028E
KEY-SCAN
LD
L,#2F
LD
LD
DE,#FFFF
BC,#FEFE
Počáteční hodnota pro každý řádek bude: #2F, #2E, ..., #28
(8 řádků).
Nastav registrový pár DE na signál "žádná klávesa".
Registr C obsahuje adresu portu, registr B je čítač.
Nyní se vstupuje do smyčky, která bude vykonána osmkrát a při každém průchodu se bude začínat s
novou počáteční hodnotou v registru L jak bylo uvedeno výše.
0296
KEY-LINE
029F
KEY-3KEYS
02A1
KEY-BITS
02AB
KEY-DONE
IN
CPL
AND
JR
LD
LD
INC
RET
SUB
SRL
JR
LD
LD
JR
DEC
RLC
JR
A,(C)
Je čten specifikovaný port.
Stištěná klávesa v této řádce nastaví příslušný bit
#1F
(jedná se o bity 0-4).
Z,#02AB,KEY-DONE
Nebyla-li stištěna žádná klávesa provede se odskok,
H,A
jinak jsou klávesové bity uloženy do registru H a
A,L
kód "první" klávesy v tomto řádku je uložen do registru A.
D
Jestliže byly stištěny 3 klávesy, nemůže registr D
obsahovat hodnotu #FF a
NZ
provede se návrat.
#08
V této smyčce je
H
opakovaně odečítána hodnota #08, dokud není
NC,#02A1,KEY-BITS nalezen klávesový bit.
D,E
Okopíruj předchozí klávesovou hodnotu do registru D a
E,A
ulož novou klávesovou hodnotu do registru E.
NZ,#029F,KEY-3KEYS Skoč zpět, jsou-li ještě další stisknuté klávesy
v tomto řádku.
L
Řádka byla prozkoumána počáteční hodnota může být snížena.
B
Čítač je posunut doleva a
C,#0296,KEY-LINE
provede se odskok, jestliže se nejednalo o poslední řádek.
Nyní se provedou čtyři testy:
LD
INC
RET
CP
RET
CP
RET
LD
LD
LD
CP
RET
12
A,D
A
Z
#28
Z
#19
Z
A,E
E,D
D,A
#18
Pokud registr D obsahuje hodnotu #FF,
je zároveň s touto hodnotou přijata i
jakákoliv hodnota v registru E.
Je-li v registru D hodnota #28 (CAPS SHIFT), je opět
přijata i jakákoliv hodnota v registru E.
Je-li v registru D hodnota #19 (SYMBOL SHIFT), je také
přijata i jakákoliv hodnota v registru E.
Je ovšem možné,
že v registru E je
hodnota pro SYMBOL SHIFT a
toto musí být také zváženo.
Z=0, jestliže se nejednalo o SYMBOL SHIFT a nějakou klávesu
Komentovaný výpis paměti ROM
PODPROGRAM KLÁVESNICE
Tento podprogram je volán při každém maskovatelném přerušení, což se děje 50krát za sekundu,
je-li procesor v modu IM1. Úkolem tohoto podprogramu je otestovat klávesnici a dekódovat hodnoty
stištěných kláves. Výsledný kód stištěné klávesy je předán do systémové proměnné LAST-K, pokud to
umožní "opakovací statut". Po uložení získaného kódu do syst. proměnné je nastaven bit 5 v systémové
proměnné FLAGS jako signál, že byla stlačena klávesa.
02BF
KEYBOARD
CALL
RET
#028E,KEY-SCAN
NZ
číslo určující typ stlačené klávesy je uloženo do reg. DE
Bylo-li stlačeno více kláves (ne SHIFT) provede se návrat.
Je využíván zdvojený systém systémových proměnných KSTATE (KSTATE0-KSTATE3 (1.sada) a
KSTATE4-KSTATE7 (2.sada)), který umožňuje detekci stištění další klávesy i když program ještě
pokračuje v opakovací periodě předchozí klávesy. Systém přijme novou klávesu, byla-li stištěna alespoň
1/10 sec., což odpovídá pěti voláním podprogramu klávesnice.
02C6
K-ST-LOOP
LD
BIT
JR
INC
DEC
DEC
JR
LD
HL,#5C00 (KSTATE0)
7,(HL)
NZ,#02D1,K-CH-SET
HL
(HL)
HL
NZ,#02D1,K-CH-SET
(HL),#FF
Začne se s KSTATE0.
Je-li systém volný (tj. KSTATE0/4 obsahují hodnotu #FF),
provede se odskok dopředu.
HL ukazuje na čítač pěti volání
který je následovně
zmenšen a
provede se odskok, nebyla-li 1.sada volná.
Signál: 1.sada volná.
Po otestování 1. sady systému bude změněn ukazatel a testována 2. sada.
02D1
K-CH-SET
LD
LD
CP
JR
A,L
HL,#5C04 (KSTATE4)
L
NZ,#02C6,K-ST-LOOP
Nižší bajt adresy 1.sady je porovnán
s nižším bajtem
adresy 2.sady a
provede se odskok při kontrole 2. sady.
Provede se návrat, nebyla-li stištěna žádná klávesa nebo pouze jedna z kláves SHIFT.
CALL
RET
#031E,K-TEST
NC
Proveď nezbytné testy
a vrať se, je-li to třeba.
Nyní bude rozlišeno zda se jedná o nový stisk, nebo byla-li stištěna nějaká klávesa již delší
dobu.
LD
CP
JR
EX
LD
CP
JR
HL,#5C00 (KSTATE0)
(HL)
Z,#0310,K-REPEAT
DE,HL
HL,#5C04 (KSTATE4)
(HL)
Z,#0310,K-REPEAT
Nejdříve zhodnoť 1.sadu
a jestliže se hodnoty shodují,
skoč dopředu.
Je uschována adresa KSTATE0.
Podívej se do 2.sady
a jsou-li kódy shodné,
skoč dopředu (opakuj).
Nová klávesa bude akceptována, je-li jedna ze sad systému KSTATE volná.
BIT
JR
EX
BIT
RET
7,(HL)
NZ,#02F1,K-NEW
DE,HL
7,(HL)
Z
Posuď 2.sadu a skoč
dopředu, je-li volná.
Nyní testuj
1.sadu a
pokračuj, je-li volná.
Nové tlačítko musí být nyní akceptováno. Ale před tím než bude do LAST-K uložena nová hodnota,
musí být bajty systému KSTATE nastaveny na správné hodnoty tak, aby neobsahovaly žádné opakovací
hodnoty. Nyní může být zjištěn kód tlačítka.
Komentovaný výpis paměti ROM
13
02F1
K-NEW
LD
LD
INC
LD
INC
LD
LD
INC
E,A
Kód je okopírován do registru E a
(HL),A
do KSTATE0/4.
HL
(HL),#05
Počítadlo 5-ti průchodů
HL
je nastaveno na hodnotu 5.
A,(#5C09) (REPDEL) Třetí proměnná tohoto systému je nastavena
(HL),A
na hodnotu systémové proměnné REPDEL (normálně 0.7 sec).
HL
HL ukazuje nyní na KSTATE3/7.
Dekódování hlavního kódu závisí na stavu MODE, bitu 3 systémové proměnné FLAGS a SHIFTového
bajtu.
LD
LD
PUSH
CALL
POP
LD
C,(IY+7) (MODE)
D,(IY+1) (FLAGS)
HL
#0333,K-DECODE
HL
(HL),A
Další tři instrukční
opakujících kláves.
0308
K-END
LD
SET
RET
řádky
jsou
Vyzvedni hodnotu MODE.
Vyzvedni hodnotu FLAGS.
Uschovej ukazatel
po dobu dekódování hlavního kódu.
Konečná hodnota je uložena v proměnné
KSTATE3/7 odkud je vybírána v případě opakování.
společné
pro
vyhodnocení
jak
nově
vložených
kláves
tak
(#5C08),A (LAST-K) Vlož novou hodnotu do LAST-K a
5,(IY+1) (FLAGS) signalizuj, že byla stlačena nová klávesa
a konečně se vrať.
PODPROGRAM OPAKOVÁNÍ KLÁVESY
Klávesa bude opakována při prvním výskytu po zpožďovací periodě REPDEL (normálně 0.7 sec.) a při
dalších výskytech (opakování) po zpožďovací periodě REPPER (normálně 0.1 sec).
0310
K-REPEAT
INC
LD
INC
DEC
RET
LD
LD
INC
LD
JR
HL
(HL),#05
HL
Ukazuj na čítač 5ti volání v sadě, která je právě používána,
a nastav jí na hodnotu 5.
HL nyní ukazuje na 3. systémovou proměnnou
(tj. REPPER/REPDEL),
(HL)
která je právě zmenšena a
NZ
je proveden návrat, jestliže zpožďovací perioda neproběhla.
A,(#5C0A) (REPPER) V opačném případě bude hodnotu zpoždění
(HL),A
udávat hodnota na sys. proměnné REPPER.
HL
Opakování bylo přijato,
A,(HL)
takže bude nakonec do registru A uložena hodnota KSTATE3/7
#0308,K-END
a předána podprogramu K-END.
PODPROGRAM K-TEST
Hodnota klávesy je testována a provede se návrat, jestliže nebyla stištěna žádná klávesa nebo
pouze některý SHIFT. Jinak bude nalezen kód pro příslušnou klávesu.
031E
14
K-TEST
LD
LD
LD
CP
RET
CP
JR
BIT
RET
B,D
D,#00
A,E
#27
NC
#18
NZ,#032C,K-MAIN
7,B
NZ
Je okopírován SHIFTovací bajt.
Vynuluj registr D pro pozdější užití.
Přenes číslo klávesy do registru A a
byl-li to CAPS SHIFT nebo žádná klávesa,
proveď návrat.
Pokud se nejedná o SYMBOL SHIFT, provede se
odskok dopředu.
SYMBOL SHIFT a jiné klávesy jsou akceptovány a
je proveden návrat, jednalo-li se pouze o SYMBOL SHIFT.
Komentovaný výpis paměti ROM
Hlavní kód je nalezen v tabulce hlavních kláves.
032C
K-MAIN
LD
ADD
LD
SCF
RET
HL,#0205
HL,DE
A,(HL)
Bázová adresa tabulky.
Najdi v tabulce
kód klávesy.
Signál: platné stištění.
Vrať se.
PODPROGRAM DEKÓDOVÁNÍ KLÁVESNICE
Do tohoto programu se vstupuje s "hlavním kódem" v registru E, s hodnotou systémové proměnné
FLAGS v registru D, hodnotou MODE v registru C a se SHIFT bajtem v registru B. Posouzením těchto čtyř
hodnot s pomocí šesti klávesových tabulek je získán "finální kód", který je na výstupu uložen v
registru A.
0333
K-DECODE
LD
CP
A,E
#3A
JR
DEC
JP
JR
C,#0367,K-DIGIT
C
M,#034F,K-KLC-LET
Z,#0341,K-E-LET
Okopíruj "hlavní kód".
Pokud se jedná o posouzení číslicových kláves, ENTER, SPACE
a obou SHIFTů,
provede se skok.
Zmenši hodnotu MODE
a skoč dopředu, vyžadují-li to
mody K,L,C nebo mod E.
Zůstává pouze grafický mod a "finální kód" je vypočítán přímo z "hlavního kódu".
ADD
RET
A,#4F
Přičti doplněk a
vrať se s "finálním kódem".
Jsou posouzeny znaky v EXTENDED MODE.
0341
K-E-LET
LD
INC
JR
LD
HL,#01EB
B
Z,#034A,K-LOOK-UP
HL,#0205
Bázová adresa tabulky "b".
Nebyla-li stisknuta žádná ze SHIFTových kláves,
užij tabulku "b".
Jinak užij bázovou tabulku "c".
Tabulky "b-f" jsou obslouženy následujícím podprogramem. Ve všech případech je nalezen a předán
"finální kód".
034A
K-LOOK-UP
LD
ADD
LD
RET
D,#00
HL,DE
A,(HL)
Vynuluj registr D.
Najdi v tabulce
"finální kód".
Pak se hezky vrať.
Nyní jsou posuzovány znaky v modech K, L a C. Ale nejprve se musí pracovat s kódy pro
SYMBOL SHIFT.
034F
K-KLC-LET
LD
BIT
JR
BIT
JR
BIT
RET
INC
RET
ADD
HL,#0229
0,B
Z,#034A,K-LOOK-UP
3,D
Z,#0364,K-TOKENS
3,(IY+48) (FLAGS2)
NZ
B
NZ
A,#20
Bázová adresa tabulky "e".
Jedná-li se o SYMBOL SHIFT + písmeno
skoč zpět.
Jseš-li se v modu K,
skoč dopředu.
Byl-li nastaven
CAPS LOCK, vrať se s "finálním kódem".
Byl-li stištěn CAPS SHIFT,
vrať se s tou samou hodnotou.
Jedná-li se o malé písmeno, je třeba přičíst
#20 k hlavnímu kódu
Komentovaný výpis paměti ROM
15
RET
a provést návrat.
Číselné hodnoty pro "tokens" jsou získány přičtením hodnoty #A5 k "hlavnímu kódu".
0364
K-TOKENS
ADD
RET
A,#A5
Přičti požadovaný doplněk
a vrať se.
Nyní jsou posuzovány číselné klávesy, SPACE, ENTER a oba SHIFTy.
0367
K-DIGIT
CP
RET
DEC
JP
JR
LD
BIT
JR
CP
JR
#30
C
C
M,#039D,K-KLC-DGT
NZ,#0389,K-GRA-DGT
HL,#0254
5,B
Z,#034A,K-LOOK-UP
#38
NC,#0382,K-8-&-9
Pokračuj jedině v tom případě, jedná-li se o číslo, tzn.
vrať se při SPACE (#20), ENTER (#0D) nebo oba SHIFTy (#0E).
Nyní rozděl číselné klávesy do tří skupin
a to podle modů K,L,C
a modu G.
Pokračuj v modu E. Bázová adresa tabulky "f".
Použij tuto tabulku pro SYMBOL SHIFT a
číselné klávesy v EXTENDED MODU.
Jedná-li se o klávesy
8 a 9, skoč dopředu.
Číselné klávesy 0 až 7 mají dát buď kód barvy papíru nebo inkoustu - když je stlačen CAPS SHIFT.
SUB
INC
RET
ADD
RET
#20
B
Z
A,#08
Rozsah #30 až #37 je snížen na #10 až #17 a
jestliže nebyl užit CAPS LOCK,
vrať se s hodnotou tohoto papíru.
Ale kdyby byl rozsah #18 až #1E, znamená to
že se jedná o barvu inkoustu.
Klávesy 8 a 9 musí dávat BRIGHT a FLASH.
0382
K-8-&-9
SUB
INC
RET
ADD
RET
#36
B
Z
A,#FE
Hodnoty #38 a #39 dávají #02 a #03.
Nebyl-li použit CAPS SHIFT,
provede se návrat (jedná se o kód pro BRIGHT).
Je odečtena dvojka a vzniknou tak hodnoty #00 a #01 (FLASH).
Návrat s těmito kódy.
Číselné klávesy v grafickém modu mají dát skupinu grafických znaků (#80 až
(#0F) a kód pro DELETE (#0C).
0389
K-GRA-DGT
LD
CP
JR
CP
JR
AND
ADD
INC
RET
XOR
HL,#0230
#39
Z,#034A,K-LOOK-UP
#30
Z,#034A,K-LOOK-UP
#07
A,#80
B
Z
#0F
RET
Bázová adresa tabulky "d".
Použij tuto tabulku přímo jak pro klávesu 9, která
má provést GRAPHICS,
tak pro klávesu 0,
která provede DELETE.
Pro klávesy 1 až 8
uprav rozsah na hodnoty #80 až #87 a
pokud nebyla stlačena ani jedna ze SHIFTovacích kláves,
proveď návrat.
Byl-li stlačen některý SHIFT, uprav rozsah na
hodnoty #88 až #8F.
Návrat.
Nakonec posuzuj číslicové klávesy v modech K, L, &
039D
16
K-KLC-DGT
INC
RET
BIT
B
Z
5,B
#8f), grafický kód
C.
Pokud nebyl stištěn žádný SHIFT,
vrať se přímo s "finálními kódy" #30 až #39.
Je-li stisknuta
Komentovaný výpis paměti ROM
LD
JR
HL,#0230
klávesa CAPS SHIFT,
NZ,#034A,K-LOOK-UP použij tabulku "d".
Nyní mohou být nalezeny kódy pro různé číslicové klávesy při použití SYMBOL SHIFTu.
03B2
K-&-CHAR
SUB
CP
JR
CP
RET
LD
RET
LD
RET
#10
#22
Z,#03B2,K-&-CHAR
#20
NZ
A,#5F
A,#40
Sniž rozsah
na #20 až #29 a odděl
zavináč ( @ ) od ostatních.
Znak "_" musí být také oddělen a
vrať s "finálními kódy" #21, #23
Ulož do registru A kód znaku "_"
vrať se.
Ulož do registru A kód znaku "@"
vrať se.
Komentovaný výpis paměti ROM
proto se
až #29.
a
a
17
PODPROGRAMY PRO OVLÁDÁNÍ REPRODUKTORU
Dva podprogramy v této části jsou:
a) podprogram BEEPER obsluhující reproduktor;
b) podprogram pro příkaz BEEP.
Reproduktor je aktivován logickou nulou na D4 během instrukce OUT #FE, která používá port 254.
Podobně při logické 1 je reproduktor deaktivován. Střídáním logických úrovní na D4 vzniká tón.
(pozn.překl.: D4 označuje bit 4 na datové sběrnici) Uvažujme tón střední C jehož frekvence je
261.63Hz. K vytvoření tohoto tónu musí být reproduktor střídavě zapínán a vypínán každou 1/523.26
sekundy. Systémové hodiny ve Spectru jsou nastaveny na kmitočet 3.5 MHz a tón střední C bude tedy
vyžadovat vystřídání logických úrovní každých 6689 T stavů. Tato poslední hodnota je nepatrně snížena
aby se předešlo nevyhnutelným časovým ztrátám. Představuje délku časové smyčky pro podprogram BEEPER.
PODPROGRAM BEEPER
Do tohoto podprogramu se vstupuje s hodnotou f*t v registrovém páru DE, kde f je daná frekvence
po dobu t sekund. Registrový pár HL obsahuje počet T stavů děleno 4. Tedy pro tón střední C v trvání
jedné sekundy DE obsahuje hodnotu #0105 což je INT (261.63*1) a HL obsahuje +066A což je odvozeno od
6689/4-30,125.
03B5
BEEPER
DI
LD
SRL
SRL
CPL
AND
LD
LD
LD
ADD
LD
AND
RRCA
RRCA
RRCA
OR
A,L
L
L
Zákaz přerušení během trvání BEEPu.
Přechodná úschova L.
Každá "1" v registru L má počítat 4 T stavy, ale provedením
INT(L/4) dochází k čítání 16 T stavu.
Vrací původní hodnotu do L a zjišťuje zbytek po dělení
#03
C,A
B, #00
IX,#03D1
Bázová adresa časové smyčky
IX,BC
Oprava délky časové smyčky za každou "1" zlomkové části.
A,(#5C48) (BORDCR) Vyzvedni současnou barvu pro BORDER a
#38
ulož ji do bitů 0,1 a 2 registru A.
#08
Výstup MIC je vypnut.
Zde se vstupuje do smyčky, která produkuje vlastní zvuk. V DE je počet kompletních průchodů. HL
obsahuje "délku časové smyčky".
03D1
03D2
03D3
03D4
BE-IX+3
BE-IX+2
BE-IX+1
BE-IX+0
03D6
BE-H&L-LP
NOP
NOP
NOP
INC
INC
DEC
JR
LD
DEC
JP
Přičte 4 T stavy za
každý dřívější vstupní
bod, který je použit.
B
Hodnoty v BC přijdou
C
z HL viz. dále.
C
časová smyčka;
NZ,#03D6,BE-H&L-LP tedy BC*4 T stavy.
C,#3F
(Při polovičním cyklu
B
se bude C rovnat L+1)
NZ,#03D6,BE-H&L-LP
Reproduktor je nyní střídavě zapínán a vypínán.
XOR
OUT
LD
LD
18
#10
(#FE),A
B,H
C,A
Otoč bit 4.
Vykonej instrukci OUT při zachování barvy BORDERu.
Resetuj registr B.
Uschovej registr A.
Komentovaný výpis paměti ROM
BIT
JR
4,A
NZ,#03F2,BE-AGAIN
Skok, jestliže jsi v bodě polovičního cyklu.
Po úplném cyklu se testuje registrový pár DE.
LD
OR
JR
LD
LD
DEC
JP
A,D
E
Z,#03D6,BE-END
A,C
C,L
DE
(IX)
Skok zpět, jestliže již byl vykonán poslední průchod
Obnovení uschované hodnoty.
Resetuj registr C.
Zmenšení čítače průchodů smyčkou.
Skok zpět na počátek smyčky.
Parametry pro druhý poloviční cyklus jsou nastaveny.
03F2
BE-AGAIN
LD
INC
JP
C,L
C
(IX)
Resetuj registr C.
Přičti 16 T stavů, protože tato cesta je kratší.
Skok zpět na počátek smyčky.
Maskovatelné přerušení je obnoveno po ukončení BEEPu.
03F6
BE-END
EI
RET
Obnovení přerušení.
Závěrečný návrat.
PODPROGRAM PŘÍKAZU BEEP
Před vstupem do tohoto podprogramu musí být na vrcholu zásobníku kalkulátoru uložena výška tónu
P a pod ní délka trvání tónu t.
03F8
BEEP
RST
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
#28,FP-CALC
#31,zdvojení
#27,int
#C0,st-mem-0
#03,rozdíl
#34,stk-data
#EC,exponent+7C
#6C,#98,#1F,#F5
#04,násobení
#A1,stk-one
#0F,součet
#38,konec výpočtu
Volání FP kalkulátoru.
t,P,P
t,P,i ( i = INT P )
t,P,i ( i uloženo do mem-0 )
t,P ( p je zlomková část P )
konstanta K na zásobník (K=0.057762606)
t,pK
t,pK,1
t,pK+1
Nyní se provede řada testů i (celočíselná hodnota výšky tónu u).
LD
LD
AND
JR
INC
LD
INC
LD
LD
RLA
SBC
CP
JR
INC
HL,#5C92
A,(HL)
A
NZ,#046C,REPORT-B
HL
C,(HL)
HL
B,(HL)
A,B
A,A
C
NZ,#046C,REPORT-B
HL
Toto je mem-0-1 (MEMBOT).
Vyzvedni exponent i
a vyvolej chybu, pokud se nejedná o "krátkou formu".
Kopíruj znaménkový
bajt do registru C.
Kopíruj nižší bajt
do registru B a
do registru A.
Vyvolej chybu pokud neplatí, že -128 <= i <= +127.
Komentovaný výpis paměti ROM
19
CP
JR
LD
ADD
JP
JP
(HL)
NZ,#046C,REPORT-B
A,B
A,#3C
P,#0425,BE-i-OK
PO,#046C,REPORT-B
Dále testuj nižší bajt.
Akceptuj pouze -60 <= i <= +67.
Odmítni hodnoty od -128 do -61.
Poznámka: Rozsah +70 až +127 bude zamítnut později. Nyní může být nalezena správná frekvence pro
výšku i.
0425
0427
BE-i-OK
BE-OCTAVE
LD
INC
SUB
JR
ADD
PUSH
LD
CALL
CALL
B,#FA
B
#0C
NC,#0427,BE-OCTAVE
A,#0C
BC
HL,#046E
#3406,LOC-MEM
#33B4,STACK-NUM
Začni "6" oktáv pod středním C.
Opakovaně snižuj i,
aby byla nalezena
správná oktáva.
Přičti zpět poslední odečet.
Uchovej číslo oktávy.
Bázová adresa tabulky půl tónů.
Prohledej tabulku a nalezenou FP hodnotu
přidej na zásobník kalkulátoru.
Nyní se vezme v úvahu zlomková část výšky.
RST
DEFB
DEFB
#28,FP-CALC
#04,násobení
#38,konec výpočtu
t,pK+1,C
t,C(pK+1)
Konečná frekvence f je nalezena modifikací poslední hodnoty podle čísla oktávy.
POP
ADD
LD
RST
DEFB
DEFB
AF
A,(HL)
(HL),A
#28,FP-CALC
#C0,st-mem-0
#02,výmaz
Vyzvedni číslo oktávy.
a vynásob "poslední hodnotu"*2^x.
(x=číslo oktávy)
t,f
frekvence provizorně
uložena v mem-0.
Výpočet trvání tónu.
DEFB
DEFB
CALL
CP
JR
#31,zdvojení
#38,konec výpočtu
#1E94,FIND-INT1
#0B
NC,#046C,REPORT-B
t,t
Hodnota INT t musí být v rozsahu #00 až #0A.
Počet kompletních cyklů pro BEEP je dán součinem f*t.
RST
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
20
#28,FP-CALC
#E0,get-mem-0
#04,násobení
#E0,get-mem-0
#34,stk-data
#80,4 bajty
#43,exponent #93
#55,#9F,#80,#00
#01,záměna
#05,dělení
#34,stk-data
#35,exponent #85
#71,#00,#00,#00
t
t,f
f*t
f*t,f
Na vrcholu zásobníku se vytvoří kons. KK=3.5*10^6/8.
(KK=437500)
f*t,f,KK
f*t,KK,f
f*t,KK/f
f*t,KK/f,30.125
Komentovaný výpis paměti ROM
DEFB
DEFB
#03,odčítání
#38,konec výpočtu
f*t,KK/f,-30.125
Poznámka: Hodnota 437500/f dává délku polovičního cyklu. Její snížení o 30.125 poskytne 120.5T
stavů, během kterých dojde k produkci noty, nastavení čítačů a podobně.
Nyní se přenesou hodnoty do patřičných registrů.
CALL
PUSH
#1E99,FIND-INT2
BC
Hodnota časové smyčky je převedena do BC
a je uschována.
Poznámka: Jestliže je tato hodnota příliš vysoká dojde k vyvolání chybového podprogramu což
vyloučí hodnoty od +70 do +127.
CALL
POP
LD
LD
#1E99,FIND-INT2
HL
D,B
E,C
Hodnota f*t je přenesena do BC,
časová smyčka do HL.
f*t do DE
Nyní poslední test hodnoty f*t.
046C
REPORT-B
LD
OR
RET
DEC
JP
A,D
E
Z
DE
#03B5,BEEPER
Návrat, pokud nejsou požadovány žádné cykly.
Zmenšení čítače průchodů smyčkou a
skok do podprogramu BEEPER.
RST
DEFB
#08,ERROR-1
#0A
Ohlaš:
B-Integer out of range
TABULKA PŮLTÓNŮ
Tato tabulka obsahuje frekvence dvanácti půltónů v oktávě.
046E
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
#89,#02,#D0,#12,#86
#89,#0A,#97,#60,#75
#89,#12,#D5,#17,#1F
#89,#1B,#90,#41,#02
#89,#24,#D0,#53,#CA
#89,#2E,#9D,#36,#B1
#89,#38,#FF,#49,#3E
#89,#43,#FF,#6A,#73
#89,#4F,#A7,#00,#54
#89,#5C,#00,#00,#00
#89,#69,#14,#F6,#24
#89,#76,#F1,#10,#05
frekvence
tón
261.63
277.18
293.66
311.12
329.63
349.23
369.99
392
415.30
440
466.16
493.88
C
C#
D
D#
E
F
F#
G
G#
A
A#
H
"NÁZEV PROGRAMU" (ZX81)
Následující podprogram je pro ZX81 a nebyl odstraněn když se program přepisoval pro SPECTRUM.
04AA
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
#CD,#FB,#24,#3A
#3B,#5C,#87,#FA
#8A,#1C,#E1,#D0
#E5,#CD,#F1,#2B
#62,#6B,#0D,#F8
#09,#CB,#FE,#C9
Komentovaný výpis paměti ROM
21
PODPROGRAMY
SAVE - LOAD - VERIFY
Vstupní bod pro tyto podprogramy je na adrese #0605 SAVE - ETC. (Nicméně skutečné podprogramy
pro SAVE, LOAD nebo VERIFY bloků bajtů začínají od #04C2). Ve všech případech obsahuje DE počet
bajtů, v IX je adresa umístění začátku bloku dat v paměti. Registr A obsahuje #00 pro hlavičku a #FF
pro vlastní blok dat. Rychlost přenosu je 1200 bit/sec.
PODPROGRAM SA-BYTES
Je volán pro SAVE hlavičky (z #09BA) a později pro vlastní blok dat (z #099E).
04C2
04D0
SA-BYTES
SA-FLAG
LD
PUSH
LD
BIT
JR
LD
EX
INC
DEC
DI
LD
LD
HL,#053F
HL
HL,#1F80
7,A
Z,#04D0,SA-FLAG
HL,#0C98
AF,AF’
DE
IX
A,#02
B,A
Uložení adresy SA/LD-RET
do zásobníku.
Konstanta 5 sec. pro zaváděcí signál hlavičky.
Skok, když se zaznamenává hlavička.
Pouze 2 sec. pro datový blok.
Uložení podmínkového registru.
Délka o jedničku zvětšena.
Bázová adresa snížena.
Přerušení zakázáno po dobu SAVE.
Maska pro MIC,BORDER červený.
Přenos hodnoty 2 do B.
Nyní následuje podprogram pro tvorbu pulsů zaváděcího signálu. Pulsy MIC - on a MIC - off
jsou dlouhé 2.168 T (taktů hodin). Barva BORDERu se mění v témže rytmu z červené do cyanu (při
nástupné a sestupné hraně signálu).
04D8
SA-LEADER
DJNZ
OUT
XOR
LD
DEC
JR
DEC
DEC
JP
#04D8,SA-LEADER
(#FE),A
#0F
B,#A4
L
NZ,#04D8,SA-LEADER
B
H
P,#04D8,SA-LEADER
Hlavní časová perioda.
MIC on-off, BORDER červený - cyan
v každém průchodu.
Hlavní časová konstanta.
Snížení nižšího bajtu čítače.
Skok pro další puls.
Další průchod, redukce o 13 T stavů.
Snížení vyššího bajtu čítače.
Zpět pro další puls dokud není zaváděcí část kompletní.
Dále je vyslán synchronizační puls (sync):
04EA
SA-SYNC-1
04F2
SA-SYNC-2
LD
DJNZ
OUT
LD
LD
DJNZ
OUT
B,#2F
#04EA,SA-SYNC-1
(#FE),A
A,#0D
B,#37
#04F2,SA-SYNC-2
(#FE),A
MIC off: 667 T od OUT k OUT.
MIC on a červená.
Signál MIC off a cyan.
MIC on: 735 T od OUT k OUT
MIC off a BORDER cyan.
Bajt indikace bude zaznamenán jako první.
LD
EX
LD
JP
BC,#3B0E
AF,AF’
L,A
#0507,SA-START
3B je časovací konstanta, #0E = MIC off a žlutou.
Indikační bajt do
reg. A a jeho převod do L s odesláním.
Skok do záznamové smyčky.
Je zaznamenán indikační bajt, dál už následují bajty dat. Poslední je paritní bajt, který je
konstruován průběžné postupným porovnáváním hodnot všech zaznamenávaných bajtů (pro kontrolu
správnosti záznamu při verifikaci nebo načítání).
22
Komentovaný výpis paměti ROM
04FE
SA-LOOP
0505
SA-LOOP-P
0507
SA-START
LD
OR
JR
LD
LD
XOR
LD
LD
SCF
JP
A,D
E
Z,#050E,SA-PARITY
L,(IX+00)
A,H
L
H,A
A,#01
#0525,SA-8-BITS
Čítač délky dat je
testován a když dosáhne 0, provede se
skok.
Do L další bajt pro záznam.
H je momentální paritní bajt.
Přidej nový bajt záznamu.
Nový paritní bajt do H.
Signál MIC on a modrá.
CY jako návěští pro 8 bitů zaznamenávaného bajtu.
Skok do tvorby bajtu a jeho zaznamenání na pásek.
Před posláním paritního bajtu k nahrání je bajt převeden do L:
050E
SA-PARITY
LD
JR
L,H
#0505,SA-LOOP-P
Konečná podoba paritního bajtu.
Skok zpět.
Následující podprogram tvaruje jednotlivé bity nahrávaného bajtu tak, že každý obsahuje on i
off puls, přičemž pulsy pro bity log.1 jsou přesně dvakrát delší než pulsy bitu log.0 (o 855 T).
0511
SA-BIT-2
0514
SA-BIT-1
051A
051C
SA-SET
SA-OUT
LD
BIT
DJNZ
JR
LD
DJNZ
OUT
LD
JR
DEC
XOR
INC
A,C
7,B
#0514,SA-BIT-1
NC,#051C,SA-OUT
B,#42
#051A,SA-SET
(#FE),A
B,#3E
NZ,#0511,SA-BIT-2
B
A
A
Druhý průchod; MIC off a žlutá.
Indikátor nuly je 1 (při 2. průchodu).
Hlavní časovací smyčka, 801 T při 2. průchodu.
Skok na kratší průchod při tvorbě log.0.
Při tvorbě log.1 o 855 T víc.
Při 1. průchodu MIC on. Při 2. průchodu MIC off a žlutá.
Čas. konstanta pro 2. průchod.
Zpět na konec 1. průchodu, jinak
puls 13 T.
CY nastaven na 0.
Registr A je 1; MIC on a modrá.
Smyčka 8 bitů: Reg. L obsahuje nahrávaný bajt a bit přenosu, CY je nastaven na jedna (jako
návěští) z podprogramu SA-START. Každý bit je odeslán na výstup a CY nulován. Po osmi průchodech
podprogramem bude registr L vynulován a program pokračuje dál.
0525
053C
SA-8-BITS
SA-DELAY
RL
JP
DEC
INC
LD
LD
IN
RRA
RET
LD
INC
JP
LD
DJNZ
RET
L
NZ,#0514,SA-BIT-1
DE
IX
B,#31
A,#7F
A,(#FE)
Bit 7 do CY a návěští do nulového bitu.
Opakování do vynulování registru L.
Sniž čítač bajtů.
Posuň bázovou adresu o 1 dopředu.
Nastav časovou konstantu pro první bit dalšího bajtu.
Adresa brány pro klávesu BREAK a
její otestování.
NC
A,D
A
NZ,#04FE,SA-LOOP
B,#3B
#053C,SA-DELAY
Návrat (do SA/LD RET) v případě, že je BREAK.
Jinak test čítače
bajtů
a skok zpět i když je čítač nulový.
Návrat jestliže je čítač bajtů nastaven na #FFFF.
Poznámka: Vynulovaný bit způsobí puls MIC off následovaný pulsem MIC on, oba v délce 855T stavů.
Jedničkový bit dává pulsy 2 krát delší. Povšimněte si, že mezi synchronizačním pulsem, indikačním
bajtem a dalšími bajty nejsou žádné mezery.
Komentovaný výpis paměti ROM
23
PODPROGRAM SA/LD-RETROUTINE
Je společný pro SAVE i LOAD. BORDER je nastaven na původní barvu a naposledy je testováno
tlačítko BREAK.
053F
SA/LD-RET
0552
REPORT-D
0554
SA/LD-END
PUSH
LD
AND
RRCA
RRCA
RRCA
OUT
LD
IN
RRA
EI
JR
AF
A,(#5C48)
#38
RST
DEFB
POP
RET
#08,ERROR-1
#0C
AF
(BORDCR)
(#FE),A
A,#7F
A,(#FE)
C,#0554,SA/LD-END
Uložení CY (CY je resetováno při chybném LOADu).
Vyzvednutí barvy ze systémové proměnné BORDCR.
Přenos barvy BORDER do bitů 2,1,0.
Nastavení BORDERu na původní barvu.
Test tlačítka BREAK
Povolení maskovaného přerušení.
Není-li BREAK, skok.
Ohlaš:
D-BREAK-CONT repeats
Obnovení původního stavu CY.
Návrat.
PODPROGRAM LD-BYTES
Tento podprogram je volán jako funkce LOAD nebo VERIFY hlavičky (z #076E) nebo dat (z #0802).
0556
LD-BYTES
INC
EX
DEC
DI
LD
OUT
LD
PUSH
IN
RRA
AND
OR
LD
CP
D
AF,AF’
D
A,#0F
(#FE),A
HL,#053F
HL
A,(#FE)
#20
#02
C,A
A
Z flag je vynulován (neboť D nemůže obsahovat #FF).
A=#00 - hlavička, A=#FF pro blok. CY=0 - VERIFY.
CY=1 - LOAD. Registr D zpět na původní hodnotu.
Zákaz přerušení.
Bílý BORDER.
Adresa SA/LD-RET
na zásobník.
Test brány #FE.
Rotace načteného
bajtu, ale zvážení jen bitu EAR.
Signál BORDER červený je uložen i do
registru C. (#22 pro OFF a #02 pro ON stav vstupu EAR)
Nulový indikátor je nastaven na 1.
Prvním úkolem při čtení dat z pásku je zjistit, zda existuje nějaký pulsní signál (tedy hrany
on-off a off-on).
056B
056C
LD-BREAK
LD-START
RET
CALL
JR
NZ
#05E7,LD-EDGE-1
NC,#056B,LD-BREAK
Návrat při BREAKu.
Není-li přítomen signál během 1400 T
stavů, návrat s CY=1. Jinak je BORDER nastaven na cyan.
Dále se čeká a zjišťuje, zda je signál stále přítomen.
0574
24
LD-WAIT
LD
DJNZ
DEC
LD
OR
JR
CALL
JR
HL,#0415
#0574,LD-WAIT
HL
A,H
L
NZ,#0574,LD-WAIT
#05E3,LD-EDGE-2
NC,#056B,LD-BREAK
Délka čekání je téměř 1 sekunda.
Čekací smyčka.
Pokračuj při zachycení dvou po sobě
jdoucích hran v dané periodě.
Komentovaný výpis paměti ROM
Nyní bude přijat jen zaváděcí signál.
0580
LD-LEADER
LD
CALL
JR
LD
CP
JR
INC
JR
B,#9C
#05E3,LD-EDGE-2
NC,#056B,LD-BREAK
A,#C6
B
NC,#056C,LD-START
H
NZ,#0580,LD-LEADER
Časovací konstanta,
Pokračuj při zachycení dvou po sobě
jdoucích hran v dané periodě.
Tyto hrany musí být zachyceny během
3000 T.
Počet párů hran je ukládán do reg. H
dokud jich není 256.
Po zaváděcím signálu přicházejí části off a on pulsu sync.
058F
LD-SYNC
LD
CALL
JR
LD
CP
JR
CALL
RET
B,#C9
#05E7,LD-EDGE-1
NC,#056B,LD-BREAK
A,B
#D4
NC,#058F,LD-SYNC
#05E7,LD-EDGE-1
NC
Časovací konstanta.
Každá hrana je testována,
dokud nejsou nalezeny dvě hrany blízko sebe.
(startovací puls sync).
Na konci musí být ještě konečná hrana části on
synchronizačního pulsu sync.
Teď už se mohou načítat bajty hlavičky nebo programu (bloku dat) v operacích LOAD, VERIFY.
První bajt určuje typ.
LD
XOR
LD
LD
LD
JR
A,C
#03
C,A
H,#00
B,#B0
#05C8,LD-MARKER
Smyčka čtení bajtu se používá
datovými a na závěr bajt paritní.
05A9
LD-LOOP
05B3
LD-FLAG
EX
JR
JR
LD
JR
RL
XOR
RET
LD
RRA
LD
INC
JR
BORDER na modrou a žlutou.
Inicializace bajtu parity na 0.
Časovací konstanta pro bajt určující typ.
Skok do smyčky čtení bajtu.
k načtení vždy
jednoho
bajtu. První je typový, následován
AF,AF’
NZ,#05B3,LD-FLAG
NC,#05BD,LD-VERIFY
(IX+00),L
#05C2,LD-NEXT
C
L
NZ
A,C
Vyzvednutí indikátorů.
Skok pro první (typový) bajt.
Skok při VERIFY nahrávky.
Uložení načteného bajtu na správnou adresu.
Skok pro načtení dalšího bajtu.
Dočasné uložení CY.
Návrat když se typový bajt liší od typového bajtu
z pásky; CY=0.
CY je obnoveno na původní hodnotu.
C,A
DE
#05C4,LD-DEC
Čítač je zvětšen, aby bylo kompenzováno jeho
zmenšení po odskoku.
Při VERIFYkaci je nově načtený bajt porovnán s původním:
05BD
LD-VERIFY
Nový
LD
XOR
RET
A,(IX+00)
L
NZ
Zjištění hodnoty původního bajtu a
porovnání s právě načteným bajtem.
Návrat, jestliže se oba bajty nerovnají.
bajt bude načten po jednotlivých bitech.
Komentovaný výpis paměti ROM
25
05C2
05C4
LD-NEXT
LD-DEC
05C8
LD-MARKER
INC
DEC
EX
LD
LD
IX
DE
AF,AF’
B,#B2
L,#01
Zvýšení adresy pro uložení dalšího bajtu.
Snížení čítače délky bloku.
Uložení indikátorů.
Časovací konstanta.
Uložení značkového bitu.
Tato smyčka sestavuje načítaný bajt do registru L.
05CA
LD-8-BITS
CALL
RET
LD
CP
RL
LD
JP
LD
XOR
LD
#05E3,LD-EDGE-2
NC
A,#CB
B
L
B,#B0
NC,#05CA,LD-8-BITS
A,H
L
H,A
Nalezení délky pulsů jednotlivých bitů.
Návrat při nesprávné (větší) délce pulsu, (pak CY=0)
Porovnání délky oproti asi 2400 T,
kdy pro nulový bit je CY=0 a pro jedničkový bit je CY=1.
Uložení nového bitu do registru L.
Časová konstanta pro další bit.
Nejednalo-li se o poslední (osmý)bit skok zpět do smyčky.
Vyzvedni paritní bajt z reg.H.
a přidej nový bajt.
Výsledek zpět do H.
Průchody se opakují do vynulování čítače DE, pak musí být i paritní bajt nulový.
LD
OR
JR
LD
CP
RET
A,D
E
NZ,#05A9,LD-LOOP
A,H
#01
Je-li DE nenulový, skok zpět pro další bajt.
Test paritního bajtu.
Je-li paritní bajt nulový - návrat s CY=1, jinak CY=0.
PODPROGRAMY LD-EDGE-2 A LD-EDGE-1
Tyto dva podprogramy jsou nejdůležitější částí operací LOAD a VERIFY. Vstupuje se do nich s
časovou konstantou v registru B a barvou BORDERu i "typem hrany" v registru C.
Návrat z těchto podprogramů je s CY=1, když požadovaný počet hran byl nalezen v povolené
periodě - pak změna v registru B u CY=0 při chybě. Z flag=0 pokud byla stisknuta klávesa BREAK.
Zflag=1 znamená "bez nálezu" a provede se návrat. LD-EDGE-2 slouží pro nalezení délky kompletního
pulsu. LD-EDGE-1 slouží k určení času, který uplyne do nalezení hrany.
05E3
LD-EDGE-2
05E7
05E9
LD-EDGE-1
LD-DELAY
CALL
RET
LD
DEC
JR
AND
#05E7,LD-EDGE-1
NC
A,#16
A
NZ,#05E9,LD-DELAY
A
Zde se v podstatě volá ještě jednou LD-EDGE-1 a
návrat pokud došlo k chybě.
Čekání 358 T před vstupem do
vzorkovací smyčky.
Následuje vzorkovací smyčka. Obsah registru B je zvýšen
nálezu" při dosažení 0 v reg. B.
05ED
26
LD-SAMPLE
INC
RET
LD
IN
RRA
RET
XOR
AND
JR
při
každém průchodu. Návrat "bez
B
Z
A,#7F
A,(#FE)
Čítání průchodů.
CY=0 & Z=1 "bez nálezu".
Čtení z brány #7FFE (BREAK a EAR).
NC
C
#20
Z,#05ED,LD-SAMPLE
CY=0 & Z=0, když byla stisknuta klávesa BREAK.
Test bajtu s posledním typem hrany.
Skok zpět, když je beze změny.
Komentovaný výpis paměti ROM
Byla nalezena nová 'hrana' ve stanovené době k hledání. Takže následuje změna barvy a nastavení
CY flagu.
LD
CPL
LD
AND
OR
OUT
SCF
RET
A,C
C,A
#07
#08
(#FE),A
Změna posledního "typu hrany"
a barvy BORDERu.
Bere se jen barva BORDERu.
Signál MIC-off.
Změna barvy BORDERu červená/fialová nebo modrá/žlutá.
Signalizace úspěšného nalezení
před návratem.
Podprogram LD-EDGE-1 trvá 465T, plus 58T z každého průchodu vzorkovací smyčkou při neúspěšném
hledání. Například při očekávání sync pulsu (viz. LD-SYNC na #058F) je povoleno 10 průchodů
vzorkovací smyčkou. Hledání hrany probíhá během cca 1100T (465+10+58+přechody). Tak je zajištěno
zachycení části off pulsu sync, který přichází po dlouhých pulsech zaváděcího signálu.
PODPROGRAMY PŘÍKAZU SAVE, LOAD, VERIFY, MERGE
Užívá se jako vstupní bod pro všechny čtyři povely. Hodnota v T-ADDR se u jednotlivých funkcí
liší. V první části podprogramu probíhá konstrukce hlavičky v pracovní oblasti.
0605
0621
0629
0642
SAVE-ETC
SA-SPACE
SA-BLANK
REPORT-F
POP
LD
SUB
LD
CALL
CALL
JR
LD
LD
AND
JR
LD
RST
PUSH
POP
LD
LD
LD
INC
DJNZ
LD
CALL
LD
DEC
ADD
INC
JR
LD
AND
JR
RST
DEFB
AF
A,(#5C74) {T-ADDR-lo}
#E0
(#5C74),A {T-ADDR-lo}
#1C8C,EXPT-EXP
#2530,SYNTAX-Z
Z,#0652,SA-DATA
BC,#0011
A,(#5C74) {T-ADDR-lo}
A
Z,#0621,SA-SPACE
C,#22
#30,BC-SPACES
DE
IX
B,#0B
A,#20
(DE),A
DE
#0629,SA-BLANK
(IX+1),#FF
#2BF1,STK-FETCH
HL,#FFF6
BC
HL,BC
BC
NC,#064B,SA-NAME
A,(#5C74) {T-ADDR-lo}
A
NZ,#0644,SA-NULL
#08,ERROR-1
#0E
Zničení návratové adresy SCAN-LOOP.
Redukce T-ADDR-lo
o #E0; pak je 00 pro SAVE, 01 pro
LOAD, 02 pro VERIFY 03 pro MERGE.
Uložení parametrů na zásobník kalkulátoru.
Skok při testování syntaxe.
17 adres pro hlavičku SAVE,
ale 34 pro ostatní povely.
Vytvoří se požadovaný prostor v pracovní oblasti.
Předání parametrů z DE do IX.
Název programu může mít až 10 znaků, ale
nejdříve se uloží
11 mezer na připravené místo.
Nulové jméno jen při #FF.
Parametry jména jsou vyvolány a je testována jeho délka.
Tato hodnota je přímo -10 (doplněk).
Není-li jméno delší než 10
pokračuje se dál.
Ale LOAD, VERIFY, MERGE jsou umožněny
i při nulových nebo velmi dlouhých názvech.
Ohlaš:
F-Invalid file name
Pokračování práce se jménem programu:
Komentovaný výpis paměti ROM
27
0644
SA-NULL
LD
OR
JR
LD
A,B
C
Z,#0652,SA-DATA
BC,#000A
Skok dál, když je
délka názvu nulová.
Useknutí přebytečných znaků.
Nyní je název přenesen do WORKSPACE (od jeho druhé adresy):
064B
SA-NAME
PUSH
POP
INC
EX
LDIR
IX
HL
HL
DE,HL
Přesun počáteční
adresy do HL.
Posun na druhou adresu.
Výměna ukazatelů a
přenos jména.
Dále jsou zvažovány některé parametry připojené za povel (pokud existují).
0652
0670
SA-DATA
REPORT-2
RST
CP
JR
LD
CP
JP
RST
CALL
SET
JR
LD
LD
DEC
JR
#18,GET-CHAR
#E4
NZ,#06A0,SA-SCR$
A,(#5C74) {T-ADDR-lo}
#03
Z,#1C8A,REPORT-C
#20,NEXT-CHAR
#28B2,LOOK-VARS
7,C
NC,#0672,SA-V-OLD
HL,#0000
A,(#5C74) {T-ADDR-lo}
A
Z,#0685,SA-V-NEW
RST #08,ERROR-1
DEFB #01
Načtení znaku.
Jedná se o znak "DATA" ?
Skoč, když ne.
Není možný MERGE "název" DATA
Načtení dalšího znaku a zvýšení syst. proměnné CH-ADD.
Vyhledání řetězce v oblasti proměnných.
Nastavení bitu 7 v názvu pole.
Skok dopředu, jedná-li se o existující pole.
Signál: užití nového pole.
Porovnání obsahu T-ADDR a vyvolání
chybového hlášení,
když bylo požadováno SAVE nebo VERIFY nového pole.
Ohlaš:
2-Variable not found
Pokračování v práci s existujícím polem:
0672
SA-V-OLD
JP
CALL
JR
INC
LD
LD
INC
LD
LD
INC
NZ,#1C8A,REPORT-C
#2530,SYNTAX-Z
Z,#0692,SA-DATA-1
HL
A,(HL)
(IX+11),A
HL
A,(HL)
(IX+12),A
HL
Skok dopředu při
kontrole syntaxe.
Nižší bajt délky
pole je přesouván
do pracovní oblasti
a je následován
příslušným vyšším bajtem délky pole.
Další část je společná pro "nová" i "stará" pole.
0685
068F
SA-V-NEW
SA-V-TYPE
LD
LD
BIT
JR
INC
LD
(IX+14),C
A,#01
6,C
Z,#068F,SA-V-TYPE
A
(IX+0),A
Kopie jména pole.
Je pole číselné?
Skok, když je číselné.
Je znakové.
Uložení typu na první adresu hlavičkové oblasti.
Test poslední části příkazu.
0692
28
SA-DATA-1
EX
DE,HL
Uložení ukazatele do DE.
Komentovaný výpis paměti ROM
RST
CP
JR
RST
CALL
EX
JP
#20,NEXT-CHAR
#29
NZ,#0672,SA-V-OLD
#20,NEXT-CHAR
#1BEE,CHECK-END
DE,HL
#075A,SA-ALL
Načtení dalšího znaku a zvýšení syst. proměnné CH-ADD.
Je konec závorky ")" ?
Hlášení "REPORT-C" když ne.
Načtení dalšího znaku a zvýšení syst. proměnné CH-ADD.
Pokračuj na další část příkazu při zjišťování syntaxe.
Ukazatel zpět do HL (indikuje začátek obsahu
existujícího pole).
Test na token SCREEN$.
06A0
SA-SCR$
CP
JR
LD
CP
JP
RST
CALL
LD
LD
LD
LD
LD
JR
#AA
NZ,#06C3,SA-CODE
A,(#5C74) {T-ADDR-lo}
#03
Z,#1C8A,REPORT-C
#20,NEXT-CHAR
#1BEE,CHECK-END
(IX+11),#00
(IX+12),#1B
HL,#4000
(IX+13),L
(IX+14),H
#0710,SA-TYPE-3
Není-li token
SCREEN$, skok dopředu.
Je zakázáno MERGE "název" SCREEN$
Vyzvednutí následujícího znaku a zvýšení CH-ADD.
Posun na další část příkazu při zjišťování syntaxe.
Do hlavičky je ukládán počet nahrávaných bajtů, což
je pro obrazovou paměť právě #1B00.
Adresa 1. bajtu obrazové paměti je právě #4000.
A toto číslo je také uloženo mezi
hlavičkové údaje.
Test na token CODE.
06C3
SA-CODE
CP
JR
LD
CP
JP
RST
CALL
JR
LD
AND
JP
CALL
JR
#AF
NZ,#0716,SA-LINE
A,(#5C74) {T-ADDR-lo}
#03
Z,#1C8A,REPORT-C
#20,NEXT-CHAR
#2048,PR-ST-END
NZ,#06E1,SA-CODE-1
A,(#5C74) {T-ADDR-lo}
A
Z,#1C8A,REPORT-C
#1CE6,USE-ZERO
#06F0,SA-CODE-2
Není-li token CODE,
skok dopředu.
Není dovoleno MERGE "název" CODE
Vyzvednutí následujícího znaku a zvýšení CH-ADD.
Skok, když příkaz pokračuje.
Není povoleno SAVE "název" CODE bez uvedení parametrů.
Uložení 0 na zásobník kalkulátoru pro startovací adresu.
Hledání startovací adresy.
06E1
06F0
SA-CODE-1
SA-CODE-2
CALL
RST
CP
JR
LD
AND
JP
#1C82,EXPT-1NUM
#18,GET-CHAR
#2C
Z,#06F5,SA-CODE-3
A,(#5C74) {T-ADDR-lo}
A
Z,#1C8A,REPORT-C
CALL #1CE6,USE-ZERO
JR
Vyzvedni 1. číslo za CODE.
Následuje-li
další číslo
skok dopředu, první číslo bylo startovací adresou.
Není povoleno SAVE CODE bez parametrů, startovací adresy
a délky.
Uložení nuly do kalkulátorového zásobníku pro počet
bajtů.
#06F9,SA-CODE-4
Zjištění počtu bajtů.
06F5
SA-CODE-3
RST #20,NEXT-CHAR
CALL #1C82,EXPT-1NUM
Vyzvednutí následujícího znaku a zvýšení CH-ADD.
Zjištění počtu bajtů.
Komentovaný výpis paměti ROM
29
Parametry jsou uloženy do hlavičkové části pracovní oblasti.
06F9
SA-CODE-4
CALL
CALL
LD
LD
CALL
LD
LD
LD
LD
#1BEE,CHECK-END
#1E99,FIND-INT2
(IX+11),C
(IX+12),B
#1E99,FIND-INT2
(IX+13),C
(IX+14),B
H,B
L,C
Posun na další část příkazu při zjišťování syntaxe.
Přenos délky do BC.
a její uložení do hlavičky.
Přenos startovací adresy do BC
a její uložení do hlavičky.
Přenos ukazatele do
HL jako obvykle.
SCREEN$ a CODE jsou oba typu 3.
0710
SA-TYPE-3
LD
JR
(IX+0),#03
#075A,SA-ALL
Nyní vlož číslo pro typ bloku dat.
Vrať se na dráhu.
Zjištění přítomnosti LINE a dalších možných parametrů.
0716
SA-LINE
CP
JR
CALL
LD
JR
#CA
Z,#0723,SA-LINE-1
#1BEE,CHECK-END
(IX+14),#80
#073A,SA-TYPE-0
Je-li token LINE,
skok dopředu.
Posun na další část povelu při zjišťování syntaxe.
Už nejsou další parametry.
Zjištění čísla, které musí následovat po výrazu LINE.
0723
SA-LINE-1
LD
AND
JP
RST
CALL
CALL
CALL
LD
LD
A,(#5C74) {T-ADDR-lo}
A
NZ,#1C8A,REPORT-C
#20,NEXT-CHAR
#1C82,EXPT-1NUM
#1BEE,CHECK-END
#1E99,FIND-INT2
(IX+13),C
(IX+14),B
Nelze provádět SAVE "název" LINE bez udání čísla.
Vyzvednutí následujícího znaku a zvýšení CH-ADD.
Uložení čísla do kalkulátorového zásobníku.
Posun na další část povelu při zjišťování syntaxe.
Přenos čísla řádku autostartu do BC
a jeho uložení.
LINE a žádný parametr jsou oba typu 0.
073A
SA-TYPE-0
LD
(IX+00),#00
Uložení čísla typu.
Parametry určující program a jeho proměnné jsou nalezeny a uloženy do hlavičkové části pracovní
oblasti.
LD
LD
SCF
SBC
LD
LD
LD
SBC
LD
LD
EX
HL,(#5C59) {E-LINE}
DE,(#5C53) {PROG}
HL,DE
(IX+11),L
(IX+12),H
HL,(#5C4B) {VARS}
HL,DE
(IX+15),L
(IX+16),H
DE,HL
Ukazatel konce oblasti proměnných.
Ukazatel počátku basicového programu.
Odečet pro určení
délky programu +
proměnných a její uložení.
Opakování odečtu,
ale jen pro zjištění délky samotného programu.
Přesun ukazatele do HL.
Ve všech případech byly připraveny hlavičkové informace.
30
Komentovaný výpis paměti ROM
IX+0
IX+1 až IX+10
IX+11 a IX+12
IX+13 až IX+16
Obsahuje
Obsahuje
Obsahuje
Obsahuje
číslo
jméno
počet
různé
typu dat.
(#FF v IX+1 znamená data beze jména).
bajtů bloku dat.
parametry, jejichž obsah záleží na typovém čísle.
Nyní se separuje jedna z operací SAVE, LOAD, VERIFY nebo MERGE.
075A
SA-ALL
LD
AND
JP
A,(#5C74) {T-ADDR-lo}
A
Je-li povel SAVE
Z,#0970,SA-CONTRL
skoč dopředu
V případě zbylých tří operací je prvních 17 bajtů hlavičkové části pracovní oblastí vybaveno
informacemi, jak uvedeno výše. Ted je čas pro odebrání hlavičky z pásku.
PUSH HL
LD
BC,#0011
ADD IX,BC
Uložení ukazatele adresy určení.
Formování 1. adresy
2.hlavičkové oblasti do IX.
Smyčka pro načtení hlavičky.
0767
LD-LOOK-H
PUSH
LD
XOR
SCF
CALL
POP
JR
IX
DE,#0011
A
#0556,LD-BYTES
IX
NC,#0767,LD-LOOK-H
Uložení 1. adresy 2. hlavičkové oblasti.
LOAD 17ti bajtů.
Signál: hlavička.
Signál: LOAD.
Hledání hlavičky.
Obnovení 1. adresy 2.hlavičkové oblasti.
Skoky dokud neskončeno.
Nová hlavička se vypíše na obrazovce, ale podprogram pokračuje jen tehdy, když se "nový" typ
neliší od "starého":
078A
LD-TYPE
LD
CALL
LD
LD
LD
CP
JR
LD
CP
JR
A,#FE
#1601,CHAN-OPEN
(IY+82),#03 {SCR-CT}
C,#80
A,(IX+0)
(IX-17)
NZ,#078A LD-TYPE
C,#F6
#04
NC,#0767 LD-LOOK-H
Ujištění, že kanál
S je otevřen.
Nastavení čítače skrolování.
Signál: typy se neliší.
Porovnání "nového"
typu se "starým".
Liší-li se, skoč.
Když OK., tak dej signál: 10 znaků a porovnej je.
Je-li číslo "typu 4" a více, je
hlavička nesmyslná a odskakuje se.
Objeví se jedno z hlášení: Program:, Number array:, Character array:, Bytes:
LD
PUSH
CALL
POP
DE,#09C0
BC
#0C0A,PO-MSG
BC
První adresa bloku uvedených hlášení.
Uložení registru C, dokud není zobrazeno.
Patřičné hlášení
se zobrazí.
Zobrazí se nové jméno a potom se toto porovná se starým.
PUSH
POP
LD
ADD
LD
LD
IX
DE
HL,#FFF0
HL,DE
B,#0A
A,(HL)
Registrový pár DE bude
ukazovat na nový typ a
registrový pár HL na
staré jméno.
10 znaků jména.
Znak z názvu
Komentovaný výpis paměti ROM
31
INC
JR
LD
ADD
LD
A
NZ,#07A6,LD-NAME
A,C
A,B
C,A
je to #FF ?
ne - porovnávat dál
Pokud je staré jméno prázdné
indikovat signál
všechny znaky souhlasí.
Následující smyčka tiskne znaky nového jména. Pokud toto jméno souhlasí, je při výstupu ze
smyčky čítač nulový.
07A6
07AD
LD-NAME
LD-CH-PR
INC
LD
CP
INC
JR
INC
RST
DJNZ
BIT
JR
LD
RST
DE
A,(DE)
(HL)
HL
NZ,#07AD,LD-CH-PR
C
#10,PRINT-A-1
#07A6,LD-NAME
7,C
NZ,#0767,LD-LOOK-H
A,#0D
#10,PRINT-A-1
Znak nového
jména
porovnat se starým
nečítat pokud písmeno nesouhlasí.
Tisknout znak jména.
Opakovat pro všech deset znaků.
Jméno souhlasilo pokud je
čítač nulový.
Nové jméno ukončit
znakem CR.
Hlavička souboru odpovídá požadované hlavičce. Dále se rozlišuje, zda se bude provádět LOAD,
VERIFY nebo MERGE.
POP
LD
CP
JR
LD
DEC
JP
CP
JP
HL
A,(IX+0)
#03
Z,#07CB,VR-CONTRL
A,(#5C74) (T-ADDR-lo)
A
Z,#0808,LD-CONTRL
#02
Z,#08B6,ME-CONTRL
Obnovit ukazatel.
SCREEN$ a CODE jsou
ošetřeny podprogramem pro VERIFY.
Je požadována funkce
LOAD ?
Je požadována funkce MERGE ?
Pokud ne zbývá pouze VERIFY.
PODPROGRAM ŘÍZENÍ "VERIFY"
Proces ověřování probíhá podobně jako čtení, s tím rozdílem, že data se neukládají, ale pouze
ověřují. Tento podprogram je také používán při čtení bloku dat.
07CB
07E9
32
VR-CONTRL
VR-CONT-1
PUSH
LD
LD
LD
LD
LD
OR
JR
SBC
JR
JR
LD
CP
JR
POP
LD
OR
JR
HL
L,(IX-06)
H,(IX-05)
E,(IX+11)
D,(IX+12)
A,H
L
Z,#07E9,VR-CONT-1
HL,DE
C,#0806,REPORT-R
Z,#07E9,VR-CONT-1
A,(IX+00)
#03
NZ,#0806,REPORT-R
HL
A,H
L
NZ,#07F4,VR-CONT-2
Ulož ukazatel.
Vyzvedni počet bajtů ze staré hlavičky.
Počet bajtů z nové hlavičky.
Skoč dopředu v případě, že délka není určena.
T.j. příkaz 'LOAD jméno CODE'.
Vypiš chybu R v případě, že blok dat
je větší než je požadováno.
Délky jsou shodné - v pořádku.
Chybové hlášení R se také vypíše, pokud se pokusíme
ověřovat bloky s nestejnou délkou.
Obnovení ukazatele (kam se bude ukládat).
Tento ukazatel se použije, pokud
není roven nule.
V tom případě se totiž místo něho použije
Komentovaný výpis paměti ROM
LD
LD
L,(IX+13)
H,(IX+14)
hodnota z nové hlavičky.
Nyní se podle příznaku VERIFY/LOAD provede buď načtení nebo ověření.
07F4
0800
VR-CONT-2
VR-CONT-3
PUSH
POP
LD
CP
SCF
JR
AND
LD
HL
IX
A,(#5C74) (T-ADDR-lo)
#02
NZ,#0800,VR-CONT-3
A
A,#FF
Přesuň pointer do registrového
páru IX.
Nastavit příznak pro zpracování bloku dat.
A to buď příznak
LOAD, nebo příznak
VERIFY.
Příznak pro zpracování pouze datového bloku.
PODPROGRAM PRO PŘEČTENÍ BLOKU DAT
Tento podprogram je společný pro všechny čtecí podprogramy.
0802
LD-BLOCK
CALL #0556,LD-BYTES
RET C
LOAD/VERIFY bloku dat.
Pokud není chyba - návrat.
Chybové hlášení R - Tape loading error.
0806 REPORT-R
RST #08,ERROR-1
DEFB #1A
Zavolej hlášení chyby.
PODPROGRAM PRO ŘÍZENÍ PŘÍKAZU LOAD
Tento podprogram řídí čtení basicovského programu včetně proměnných.
0808
LD-CONTRL
LD
LD
PUSH
LD
OR
JR
INC
INC
INC
EX
JR
E,(IX+11)
D,(IX+12)
HL
A,H
L
NZ,#0819,LD-CONT-1
DE
DE
DE
DE,HL
#0825,LD-CONT-2
Vyzvedni délku bloku
z nové hlavičky.
Uložit cílový ukazatel.
Skoč dopředu v případě pokusu o načtení
dosud nedeklarovaného pole.
Přidej tři bajty pro novou proměnnou.
Místo pro jméno
a délku nové proměnné.
Skoč dopředu.
Nyní je tedy v paměti dost místa pro blok dat.
0819
LD-CONT-1
LD
LD
EX
SCF
SBC
JR
L,(IX-06)
H,(IX-05)
DE,HL
HL,DE
C,#082E,LD-DATA
Vezmi délku existujícího programu
včetně proměnných.
Skoč dopředu pokud není vyžadována
žádná paměť navíc.
Otestuj volné místo.
0825
LD-CONT-2
LD
ADD
LD
LD
CALL
DE,#0005
HL,DE
B,H
C,L
#1F05,TEST-ROOM
Komentovaný výpis paměti ROM
5 bajtů navíc.
Výsledek do BC.
Otestuj.
33
082E
LD-DATA
POP
LD
AND
JR
LD
OR
JR
DEC
LD
DEC
LD
DEC
INC
INC
INC
LD
CALL
LD
HL
A,(IX+0)
A
Z,#0873,LD-PROG
A,H
L
Z,#084C,LD-DATA-1
HL
B,(HL)
HL
C,(HL)
HL
BC
BC
BC
(#5C5F),IX
{X-PTR}
#19E8,RECLAIM-2
IX,(#5C5F)
{X-PTR}
Vyzvedni ukazatel.
Skoč dopředu pokud se čte
basicovský program.
Skoč dopředu pokud se čte
nové pole.
Vezmi délku existujícího pole
Ukazatel posuň na jméno.
Přičti tři bajty pro délku a název.
Ulož registr IX po dobu
rušení staré proměnné.
Nyní je vyhrazeno místo pro novou proměnnou - na konci platné oblasti pro data.
084C
LD-DATA-1
LD
DEC
LD
LD
PUSH
INC
INC
INC
LD
PUSH
CALL
INC
POP
LD
POP
INC
LD
INC
LD
INC
PUSH
POP
SCF
LD
JP
HL,(#5C59) {E-LINE}
HL
C,(IX+11)
B,(IX+12)
BC
BC
BC
BC
A,(IX-3)
AF
#1655,MAKE-ROOM
HL
AF
(HL),A
DE
HL
(HL),E
HL
(HL),D
HL
HL
IX
A,#FF
#0802,LD-BLOCK
Nalezení konce oblasti proměnných,
který je označen bajtem #80.
Do BC je uložena
délka nového pole,
která je okamžitě uschována.
Nyní se přičtou tři
bajty pro jméno a
délku pole.
Je zjištěn název pole a okamžitě
uschován.
Je vytvořen prostor v počtu bajtů udaných registry BC.
HL nyní ukazuje na 1. bajt pole, kam
bude po zjištění
uloženo jeho jméno.
Opět je vyzvednuta délka pole
a po bajtech uložena.
HL nyní ukazuje na adresu, kam bude ukládán již samotný
obsah pole. Tato adresa je zároveň okamžitě přenesena
do IX.
Signál: LOAD.
Signál: blok dat.
Je proveden odskok na LOADovací podprogram.
LOAD BASICového programu a jeho proměnných:
0873
34
LD-PROG
EX
LD
DEC
LD
LD
LD
PUSH
CALL
POP
DE,HL
HL,(#5C59) {E-LINE}
HL
(#5C5F),IX {X-PTR}
C,(IX+11)
B,(IX+12)
BC
#19E5,RECLAIM-1
BC
Uschování 1. adresy programu do DE.
Nalezení konce oblasti proměnných,
který je označen bajtem #80.
Uschování IX.
Do BC je uložena
délka programu a
okamžitě uschována.
Podprogram zničí starý existující BASICový program.
Délka nového programu je opět uložena do BC.
Komentovaný výpis paměti ROM
PUSH
PUSH
CALL
LD
INC
LD
LD
ADD
LD
LD
LD
AND
JR
LD
LD
LD
HL
BC
#1655,MAKE-ROOM
IX,(#5C5F) {X-PTR}
HL
C,(IX+15)
B,(IX+16)
HL,BC
(#5C4B),HL {VARS}
H,(IX+14)
A,H
#C0
NZ,#08AD,LD-PROG-1
L,(IX+13)
(#5C42),HL {NEWPPC}
(IY+10),#00 {NSPPC}
Jsou uschovány ukazatele programové
oblasti a délky programu.
Vytvoření nového místa pro program a jeho proměnné.
V IX je obnovena jeho původní hodnota.
Systémová proměnná VARS je nastavena na novou hodnotu,
která již odpovídá parametrům nového programu.
Je testováno,
zda byl přítomen
příkaz LINE.
Odskok jestliže se nejedná o autostart.
Jinak jsou nastaveny systémové
proměnné NEWPPC a
NSPPC.
Nyní muže být načten blok dat:
08AD
LD-PROG-1
POP
POP
SCF
LD
JP
DE
IX
A,#FF
#0802,LD-BLOCK
Je vyzvednuta délka
a adresa 1.bajtu programu.
Signál: LOAD.
Signál: blok dat.
A nahraj ho.
PODPROGRAM ŘÍZENÍ MERGE
Tento podprogram se skládá ze tří částí:
a) LOAD bloku dat do oblasti WORKSPACE.
b) MERGE řádků nového programu mezi řádky starého programu.
c) MERGE nových proměnných do starých proměnných.
Začíná se s načtením bloku dat.
08B6
ME-CONTRL
LD
LD
PUSH
INC
RST
LD
EX
POP
PUSH
PUSH
POP
SCF
LD
CALL
C,(IX+11)
B,(IX+12)
BC
BC
#30,BC-SPACES
(HL),#80
DE,HL
DE
HL
HL
IX
A,#FF
#0802,LD-BLOCK
Načti délku bloku
do BC
a uschovej ji.
Vytvoř prostor o délce LEN+1
v pracovním prostoru
a do bajtu "navíc" vlož koncový znak.
Přesun ukazatele startu do HL.
Vyzvedni původní délku.
Uschovej kopii startu.
A převeď start do IX.
Signál: LOAD.
Signál: blok dat.
Proveď LOAD bloku dat.
Nyní dojde k splynutí řádků nového a starého programu.
POP
LD
HL
DE,(#5C53)
{PROG}
Vyzvedni start nového programu.
Vyzvedni start starého programu.
Vstup do smyčky, která zpracovává řádky nového programu.
08D2
ME-NEW-LP
LD
A,(HL)
Vyzvedni číslo řádku
Komentovaný výpis paměti ROM
35
AND
JR
#C0
NZ,#08F0,ME-VAR-LP
a testuj je.
Skok, když jsou řádky skončeny.
Vstup do vnitřní smyčky, která zpracovává řádky starého programu.
08D7
ME-OLD-LP
08DF
ME-OLD-L1
08EB
ME-NEW-L2
LD
INC
CP
INC
JR
LD
CP
DEC
DEC
JR
A,(DE)
DE
(HL)
HL
NZ,#08DF,ME-OLD-L1
A,(DE)
(HL)
DE
HL
NC,#08EB,ME-NEW-L2
PUSH
EX
CALL
POP
JR
CALL
JR
HL
DE,HL
#19B8,NEXT-ONE
HL
#08D7,ME-OLD-LP
#092C,ME-ENTER
#08D2,ME-NEW-LP
Vyzvedni vyšší bajt čísla řádku
a porovnej jej
s novým
inkrementuj ukazatele.
Skok dopředu, není-li shoda.
Opakuj porovnání
také pro nižší bajty čísla řádku.
Obnov oba ukazatele.
Skok při nalezení správného místa pro řádek nového
programu.
Jinak najdi adresu začátku dalšího
starého
řádku.
Procházej smyčkou pro každý starý řádek.
Vlož nový řádek a
skoč zpět do hlavní smyčky.
Obdobným způsobem budou nyní splývat nové a staré proměnné.
08F0
ME-VAR-LP
LD
LD
CP
RET
PUSH
LD
A,(HL)
C,A
#80
Z
HL
HL,(#5C4B)
{VARS}
Vyzvedni postupně
jména všech proměnných a testuj je.
Test na konec a
návrat, když byly všechny proměnné posouzeny.
Uschovej ukazatel.
Vyzvedni VARS (pro starý program).
Nyní vstup do smyčky, kde se naleznou všechny existující proměnné.
08F9
ME-OLD-VP
0901
ME-OLD-V1
LD
CP
JR
CP
JR
PUSH
CALL
POP
EX
JR
A,(HL)
#80
Z,#0923,ME-VAR-L2
C
Z,#0909,ME-OLD-V2
BC
#19B8,NEXT-ONE
BC
DE,HL
#08F9,ME-OLD-VP
Vyzvedni jméno proměnné.
Jakmile je nalezen koncový bajt,
proveď skok dopředu (bude se přidávat).
Porovnej první bajt
názvů a skoč dopředu pro další posouzení.
Uschovej název nové proměnné a hledej
další starou proměnnou.
Obnov ukazatele.
a pokračuj ve smyčce.
Stará a nová proměnná se shodují podle prvních bajtů, ale proměnné s dlouhými názvy je třeba
porovnat celé.
0909
ME-OLD-V2
AND
CP
JR
POP
PUSH
PUSH
#E0
#A0
NZ,#0921,ME-VAR-L1
DE
DE
HL
V úvahu se vezmou pouze bity 7,6 a 5.
Akceptuj všechny typy proměnných,
kromě proměnných s dlouhým názvem.
DE bude ukazovat na první znak názvu nové proměnné
a bude uschován.
Úschova ukazatele na první znak názvu staré proměnné.
Vstup do smyčky k porovnání všech znaků názvu dlouhé proměnné.
36
Komentovaný výpis paměti ROM
0912
091E
ME-OLD-V3
ME-OLD-V4
INC
INC
LD
CP
JR
RLA
JR
POP
JR
POP
JR
HL
DE
A,(DE)
(HL)
NZ,#091E,ME-OLD-V4
NC,#0912,ME-OLD-V3
HL
#0921,ME-VAR-L1
HL
#0901,ME-OLD-V1
Posuň
oba ukazatele.
Porovnej oba znaky
a skoč, jestliže se neshodují.
Dokud není nalezen poslední znak,
pokračuj ve smyčce.
Vyzvedni ukazatel na první znak názvu staré proměnné
a skoč s úspěšným nálezem dopředu.
Vyzvedni ukazatel na první znak názvu staré proměnné
a skoč s neúspěšným nálezem zpět.
Zde je vstup pro shodu.
0921
ME-VAR-L1
LD
A,#FF
Signál: náhrada proměnné.
Zde je vstup pro neshodu. A obsahuje #80 což je signál, že proměnná má být přidána.
0923
ME-VAR-L2
POP
EX
INC
SCF
CALL
JR
DE
DE,HL
A
#092C,ME-ENTER
#08F0,ME-VAR-LP
Vyzvedni ukazatel na první znak názvu nové proměnné.
Zaměň registry.
Z flag=1 jde-li o náhradu a Z flag=0 jde-li o přidání.
Signál: proměnná.
Nyní proveď vložení.
Pokračuj ve smyčce a posuzuj další proměnnou.
MERGE řádky nebo proměnné
Do tohoto podprogramu se vstupuje s následujícími parametry:
CY=0 - MERGE basicového řádku.
CY=1
- MERGE proměnné.
Z flag=0
- Bude se přidávat. Z flag=1 - Bude se nahrazovat.
HL ukazuje na start nového vstupu. DE ukazuje kam se provede MERGE.
092C
ME-ENTER
JR
EX
LD
EX
CALL
CALL
EX
LD
EX
NZ,#093E,ME-ENT-1
AF,AF'
(#5C5F),HL {X-PTR}
DE,HL
#19B8,NEXT-ONE
#19E8,RECLAIM-2
DE,HL
HL,(#5C5F) {X-PTR}
AF,AF'
Skoč, jde-li o "přídavek".
Uschovej příznaky.
Uschovej "nový"
ukazatel,
zatímco bude provedena
likvidace řádku nebo proměnné.
Obnov
všechny ukazatele
a příznaky.
Nyní může dojít k vložení "nového".
093E
ME-ENT-1
EX
PUSH
CALL
LD
LD
EX
PUSH
EX
JR
DEC
CALL
INC
JR
AF,AF’
DE
#19B8,NEXT-ONE
(#5C5F),HL {X-PTR}
HL,(#5C53) {PROG}
(SP),HL
BC
AF,AF’
C,#0955,ME-ENT-2
HL
#1655,MAKE-ROOM
HL
#0958,ME-ENT-3
Uschovej příznaky.
Uschovej cílový ukazatel.
Nalezni délku "nového".
Uschovej ukazatel na "nové".
Vyzvedni PROG aby se předešlo poškození.
Uschovej PROG na zásob. a současně vyzvedni ukaz. nov.
Uschovej délku.
Obnov příznaky.
Skoč, jestliže přidáváš novou proměnnou.
Nový řádek je vložen před cílovou lokaci.
Vytvoř prostor pro nový řádek.
Skoč dopředu.
Komentovaný výpis paměti ROM
37
0955
0958
ME-ENT-2
ME-ENT-3
CALL
INC
POP
POP
LD
LD
PUSH
PUSH
EX
LDIR
#1655,MAKE-ROOM
HL
BC
DE
(#5C53),DE {PROG}
DE,(#5C5F) {X-PTR}
BC
DE
DE,HL
Vytvoř prostor pro novou proměnnou.
Ukazuj na první novou lokaci.
Obnov délku.
Vyzvedni PROG
a ulož na patřičné místo.
Také vyzvedni "nový" ukazatel
a opět ulož délku
a "nový" ukazatel.
Zaměň ukazatele
a kopíruj "nové" do prostoru, který byl vytvořen.
Nová proměnná nebo řádek musí být nyní odstraněny z pracovního prostoru.
POP
POP
PUSH
CALL
POP
RET
HL
BC
DE
#19E8,RECLAIM-2
DE
Vyzvedni ukazatel na "nové".
Vyzvedni délku.
Uschovej ukazatel na "staré".
Odstraň řádek nebo proměnnou z pracovního prostoru.
Vyzvedni ukazatel na "staré"
a vrať se.
PODPROGRAM ŘÍZENÍ SAVE
Podprogram SAVE je velmi pochopitelný.
0970
SA-CONTRL
PUSH
LD
CALL
XOR
LD
CALL
SET
CALL
HL
A,#FD
#1601,CHAN-OPEN
A
DE,#09A1
#0C0A,PO-MSG
5,(IY+2) (TV-FLAG)
#15D4,WAIT-KEY
Uschovej si ukazatel.
Signál: kanál K.
Otevři kanál K.
Signál 1. hlášení.
Báze tabulky kazetových hlášení.
Tiskni hlášení: Start tape, then press any key.
Signál: obrazovka bude vyžadovat smazání.
Čekej na stlačení klávesy.
Po stisknutí tlačítka se začne nahrávat hlavička.
PUSH IX
Uschovej si adresu hlavičky.
LD
DE,#0011
Počítadlo 17ti bajtů, které budou nahrány.
XOR A
Signál: hlavička.
CALL #04C2,SA-BYTES
Nahrání hlavičky.
POP IX
Obnovení adresy hlavičky
Následuje pauza asi jednu sec. před nahráním dat.
0991
38
SA-1-SEC
LD
HALT
DJNZ
LD
LD
LD
POP
JP
B,#32
#0991,SA-1-SEC
E,(IX+11)
D,(IX+12)
A,#FF
IX
#04C2,SA-BYTES
Pauza 50ti přerušení.
Do DE je vložena
délka zaznamenávaného bloku dat.
Signál:
blok dat.
Obnovení ukazatele 1. adresy bloku
a konečné se všechno nahraje!
Komentovaný výpis paměti ROM
TEXTY POUŽÍVANÉ PŘI PRÁCI S KAZETOU
Každé hlášení je zakončeno invertovaným znakem, tzn.: bit 7 tohoto znaku je logická 1. Bajt #0D
(carriage return) způsobí tisk od levého okraje na dalším řádku.
09A1
09A2
09C1
09CB
09DA
09EC
DEFB
DEFM
DEFM
DEFM
DEFM
DEFM
#80
'Start tape, then press any key.'
#0D,'Program:‘
#0D,'Number array:'
#0D,'Character array:'
#0D,'Bytes:'
Komentovaný výpis paměti ROM
39
PODPROGRAMY OBSLUHUJÍCÍ TISK NA OBRAZOVKU A TISKÁRNU
PODPROGRAM PRINT-OUT
Veškerý tisk na hlavní část obrazovky, dolní část obrazovky a na tiskárnu obstarávají
následující podprogramy. Do podprogramu PRINT-OUT vstupuje kód znaku, kontrolního znaku, nebo tokenu v
registru A.
09F4
PRINT-OUT
CALL
CP
JP
CP
JR
CP
JR
LD
LD
LD
ADD
LD
ADD
PUSH
JP
#0B03,PO-FETCH
#20
NC,#0AD9,PO-ABLE
#06
C,#0A69,PO-QUEST
#18
NC,#0A69,PO-QUEST
HL,#0A0B
E,A
D,#00
HL,DE
E,(HL)
HL,DE
HL
#0B03,PO-FETCH
Aktuální tisková pozice.
Jestliže se jedná o znak který lze tisknout,
provede se skok.
Tiskni otazník pro
hodnoty #00 až #05 a pro
hodnoty #18 až #1F.
Báze "řídící" tabulky.
Převeď kód
do registrového páru DE.
Indexuj v tabulce a
vyzvedni doplněk.
Přičti doplněk
a proveď nepřímý skok
do příslušného podprogramu.
TABULKA ŘÍDÍCÍCH ZNAKŮ
adresa
0A11
0A12
0A13
0A14
0A15
0A16
0A17
0A18
0A19
doplněk
4E
57
10
29
54
53
52
37
50
znak
PRINT čárka
EDIT
kurzor vlevo
kurzor vpravo
kurzor dolů
kurzor nahoru
DELETE
ENTER
nevyužito
adresa
0A1A
0A1B
0A1C
0A1D
0A1E
0A1F
0A20
0A21
0A22
doplněk
4F
5F
5E
5D
5C
5B
5A
54
53
znak
nevyužito
INK
PAPER
FLASH
BRIGHT
INVERSE
OVER
AT
TAB
PODPROGRAM KURZOR VLEVO
Na vstupu obsahuje registr B číslo aktuálního řádku a registr C číslo aktuálního sloupce.
0A23
0A38
0A3A
40
PO-BACK-1
PO-BACK-2
PO-BACK-3
INC
LD
CP
JR
BIT
JR
INC
LD
LD
CP
JR
DEC
LD
JP
C
A,#22
C
NZ,#0A3A,PO-BACK-3
1,(IY+1) (FLAGS)
NZ,#0A38,PO-BACK-2
B
C,#02
A,#18
B
NZ,#0A3A,PO-BACK-3
B
C,#21
#0DD9,CL-SET
Pohyb doleva o jeden sloupec.
Akceptuj tuto změnu
pokud nepřevýší max. hodnotu pro levou stranu.
Při obsluze tiskárny
skok dopředu.
Jeden řádek nahoru.
Nastav sloupcovou hodnotu.
Testuj na nejvyšší řádek.
Poznámka: správně mělo být #19.
Akceptuj změnu, pokud není vrchol obrazovky.
Nepřijatelné, takže o řádek dolů.
Nastav na levou krajní pozici.
Proveď nepřímý návrat přes CL-SET & PO-STORE.
Komentovaný výpis paměti ROM
PODPROGRAM KURZOR VPRAVO
Tento podprogram provede identickou operaci jako basicové PRINT OVER 1; CHR$ 32;.
0A3D
PO-RIGHT
LD
PUSH
LD
LD
CALL
POP
LD
RET
A,(#5C91) (P-FLAG)
AF
(IY+87),#01 (P-FLAG)
A,#20
#0B65,PO-CHAR
AF
(#5C91),A (P-FLAG)
Vyzvedni P-FLAG a
uschovej na zásobníku.
Nastav P-FLAG na OVER 1.
Tiskni
mezeru.
Obnov původní hodnotu
pro P-FLAG.
Poznámka: Programátor zapomněl na návrat přes PO-STORE.
PODPROGRAM "NÁVRATU VOZÍKU"
Jestliže se jedná o výstup na tiskárnu, provede se vyprázdnění bafru. Při výstupu na obrazovku
se bude testovat rolování obrazovky před snížením čísla řádku.
0A4F
PO-ENTER
BIT
JP
LD
CALL
DEC
JP
1,(IY+1) (FLAGS)
NZ,#0ECD,COPY-BUFF
C,#21
#0C55,PO-SCR
B
#0DD9,CL-SET
Při obsluze tiskárny
skok dopředu.
Nastav levý krajní sloupec.
Je-li potřeba roluj obrazovku.
Nyní o řádek dolů.
Nepřímý návrat přes CL-SET & PO-STORE.
PODPROGRAM TISKNI ČÁRKU
Současná sloupcová hodnota je manipulována a registr A je nastaven na #00 pro TAB 0, nebo #10
pro TAB 16.
0A5F
PO-COMMA
CALL
LD
DEC
DEC
AND
JR
#0B03,PO-FETCH
A,C
A
A
#10
#0AC3,PO-FILL
Proč znovu?
Číslo sloupce.
Posun doprava o dva sloupce a test.
V registru A bude nyní #00 nebo #10.
Výstup přes PO-FILL.
PODPROGRAM TISK OTAZNÍKU
Kdykoliv dojde k pokusu o tisk znaku, který tisknout nelze, vytiskne se místo něj otazník.
0A69
PO-QUEST
LD
JR
A,#3F
#0AD9,PO-ABLE
Kód pro otazník.
Tisk znaku.
PODPROGRAM PRO TISK ŘÍDÍCÍCH ZNAKŮ S OPERANDY
Řídící znaky od INK do OVER vyžadují jeden operand, zatímco řídící znaky AT & TAB musí být
následovány dvěma operandy. Tento podprogram v případě jednoho operandu uloží kód řídícího znaku do
TVDATA-lo a operand je v registru A. V případě dvou operandů je prvý operand uložen do TVDATA-hi a
druhý v registru A.
0A6D
PO-TV-2
LD
LD
JR
DE,#0A87
Změna adresy pro "výstupní podprogram" na #0A87,PO-CONT.
(#5C0F),A (TVDATA-hi) Ulož první operand do TVDATA-hi.
#0A80,PO-CHANGE
Pro AT a TAB je vstupní bod zde.
0A75
PO-2-OPER
LD
JR
DE,#0A6D
#0A7D,PO-TV-1
Změna adresy pro "výstupní podprogram" na #0A6D,PO-TV-2.
a ulož kód znaku do TVDATA-lo.
Komentovaný výpis paměti ROM
41
Vstupní bod pro řídící znaky barev INK až OVER.
0A7A
0A7D
PO-1-OPER
PO-TV-1
LD
LD
DE,#0A87
Změna adresy pro "výstupní podprogram" na #0A87,PO-CONT.
(#5C0E),A (TVDATA-lo) Ulož kód řídícího znaku.
Adresa "výstupního" podprogramu je změněna přechodně.
0A80
PO-CHANGE
LD
LD
INC
LD
RET
HL,(#5C51) (CHURCHL)
(HL),E
HL
(HL),D
HL ukazuje na adresu výstupního podprogramu.
Vložení této nové adresy způsobí, že další kód bude
považován za operand.
Jakmile jsou operandy uloženy, podprogram pokračuje.
0A87
PO-CONT
LD
CALL
LD
LD
LD
CP
JP
JR
DE,#09F4
#0A80,PO-CHANGE
HL,(#5C0E) (TVDATA)
D,A
A,L
#16
C,#2211,CO-TEMPS
NZ,#0AC2,PO-TAB
Obnovení původní adresy pro PRINT-OUT (#09F4).
Vyzvedni řídící kód
a prvý operand,
(jestli budou dva operandy)
"poslední" operand a řídící kód jsou přesunuty.
Jedná-li se o INK až OVER,
pak skok dopředu.
Skok dopředu jde-li o TAB.
Nyní zpracuj řídící charakter AT.
0AAC
0ABF
PO-AT-ERR
PO-AT-SET
LD
LD
LD
SUB
JR
ADD
LD
BIT
JR
LD
SUB
JP
INC
LD
INC
BIT
JP
CP
JP
JP
B,H
C,D
A,#1F
C
C,#0AAC,PO-AT-ERR
A,#02
C,A
1,(IY+1) (FLAGS)
NZ,#0ABF,PO-AT-SET
A,#16
B
C,#1E9F,REPORT-B
A
B,A
B
0,(IY+2) (TV-FLAG)
NZ,#0C55,PO-SCR
(IY+49) (DF-SZ)
C,#0C86,REPORT-5
#0DD9,CL-SET
Číslo řádku.
Číslo sloupce.
Převrácení čísla sloupce t.j. #00 až
#1F se změní na #1F až #00.
Musí být v rozsahu.
Přičtení doplňku, aby C obsahoval #21 až #22.
Při obsluze tiskárny
skok dopředu.
Převrácení čísla řádku.
t.j. #00 až #15 se změní na #16 až #01.
Je-li vše v pořádku skok dopředu.
Rozsah #16 až #01 se změní na #17 až #02
A nyní na #18 až #03.
Jedná-li se o tisk v dolní části obrazovky, proveď
případné rolování obrazovky.
Vyvolej chybové hlášení při nedostatku místa.
Návrat přes CL-SET & PO-STORE.
Zde zpracuj řídící znak TAB.
0AC2
0AC3
42
PO-TAB
PO-FILL
LD
CALL
ADD
DEC
AND
RET
LD
SET
A,H
#0B03,PO-FETCH
A,C
A
#1F
Z
D,A
0,(FLAGS)
Vyzvedni prvý operand.
Aktuální tisková pozice.
Přičtení aktuální sloupcové hodnoty.
Zjisti kolik mezer, modulo 32
je zapotřebí a vrať
se, je-li výsledek nula.
Použij D jako čítač.
Potlač "úvodní mezeru".
Komentovaný výpis paměti ROM
0AD0
PO-SPACE
LD
CALL
DEC
JR
RET
A,#20
#0C3B,PO-SAVE
D
NZ,#0AD0,PO-SPACE
Vytiskni D * mezer.
Konec.
ZNAKY KTERÉ LZE TISKNOUT.
Požadovaný znak (nebo znaky) je vytisknut voláním PO-ANY následované podprogramem PO-STORE.
0AD9
PO-ABLE
CALL #0B24,PO-ANY
Vytiskni znak(y) a pokračuj přes PO-STORE.
PODPROGRAM ÚSCHOVA POZICE
Nové hodnoty pro řádek, sloupec a adresa "bodu" jsou uschovány
proměnných.
0ADC
0AF0
0AFC
PO-STORE
PO-ST-E
PO-ST-PR
BIT
JR
BIT
JR
LD
LD
RET
LD
LD
LD
RET
LD
LD
RET
1,(IY+1) (FLAGS)
NZ,#0AFC,PO-ST-PR
0,(IY+2) (TV-FLAG)
NZ,#0AF0,PO-ST-E
(#5C88),BC (S-POSN)
(#5C84),HL (DF-CC)
(#5C8A),BC (S-POSNL)
(#5C82),BC (ECHO-E)
(#5C86),HL (DF-CCL)
(IY+69),C (P-POSN)
(#5C80),HL (PR-CC)
v příslušných systémových
Skok dopředu při obsluze tiskárny.
Skok při obsluze dolní části obrazovky.
Uschovej hodnoty,
které se vztahují k hlavní části obrazovky
a vrať se.
Uschovej hodnoty,
které se vztahují k dolní části obrazovky a
vrať se.
Uschovej hodnoty,
které se vztahují k bafru tiskárny
a vrať se.
PODPROGRAM VYZVEDNUTÍ POZICE
Parametry aktuální tiskové pozice jsou vyzvednuty z příslušných systémových proměnných.
0B03
0B1D
PO-FETCH
PO-F-PR
BIT
JR
LD
LD
BIT
RET
LD
LD
RET
LD
LD
RET
1,(IY+1) (FLAGS)
NZ,#0B1D,PO-F-PR
BC,(#5C88) (S-POSN)
HL,(#5C84) (DF-CC)
0,(IY+2) (TV-FLAG)
Z
BC,(#5C8A) (S-POSNL)
HL,(#5C86) (DF-CCL)
C,(IY+69) (P-POSN)
HL,(#5C80) (PR-CC)
Skok dopředu při obsluze tiskárny.
Vyzvedni hodnoty,
které se vztahují k hlavní části
obrazovky a vrať se,
pokud toto bylo úmyslem.
Jinak vyzvedni hodnoty, které se
vztahují k dolní části obrazovky a
vrať se.
Vyzvedni hodnoty,
které se vztahují k bafru tiskárny a
vrať se.
PODPROGRAM TISKU JAKÉHOKOLIV ZNAKU
Obyčejné znaky, token, grafické znaky a UDG znaky jsou pojednány odděleně.
0B24
PO-ANY
CP
JR
CP
JR
LD
CALL
#80
C,#0B65,PO-CHAR
#90
NC,#0B52,PO-T&UDG
B,A
#0B38,PO-GR-1
Při obyčejném znaku
skok dopředu.
Při UDG znaku
skok dopředu.
Přesun grafického znaku.
Vytvoření grafické formy.
Komentovaný výpis paměti ROM
43
CALL #0B03,PO-FETCH
LD
DE,#5C92 (MEMBOT)
JR
#0B7F,PO-ALL
Obnovení HL.
DE ukazuje na začátek grafické formy.
Skok dopředu a tisk grafického znaku.
Grafické znaky jsou konstruovány pouze pro tento případ v oblasti paměti pro kalkulátor t.j.
MEM-0 až MEM-1.
0B38
PO-GR-1
0B3E
PO-GR-2
0B4C
PO-GR-3
LD
CALL
RR
SBC
AND
LD
RR
SBC
AND
OR
LD
LD
INC
DEC
JR
RET
HL,# 5C92 (MEMBOT)
#0B3E,PO-GR-2
B
A,A
#0F
C,A
B
A,A
#F0
C
C,#04
(HL),A
HL
C
NZ,#0B4C,PO-GR-3
Ve skutečnosti volej následující podprogram dvakrát.
Určení bitu 0 (a později i bitu 2) grafického kódu.
A bude obsahovat #00, nebo
#0F podle hodnoty bitu v kódu.
Uschovej výsledek v C.
Určení bitu 1 (a později i bitu 3) grafického kódu.
A bude obsahovat #00, nebo
#0F podle hodnoty bitu v kódu.
Oba výsledky jsou kombinovány.
A obsahuje polovinu znakové formy
a bude použito čtyřikrát.
Po horní polovině znakové formy přijde dolní polovina.
Nyní se oddělí znaky UDG a tokens.
0B52
PO-T&UDG
0B5F
PO-T
0B65
PO-CHAR
0B6A
PO-CHAR-2
0B76
PO-CHAR-3
SUB
JR
ADD
PUSH
LD
JR
CALL
JP
PUSH
LD
EX
LD
RES
CP
JR
SET
LD
LD
ADD
ADD
ADD
ADD
POP
EX
#A5
NC,#0B5F,PO-T
A,#15
BC
BC,(#5C7B) (UDG)
#0B6A,PO-CHAR-2
#0C10,PO-TOKENS
#0B03,PO-FETCH
BC
BC,(#5C36) (CHARS)
DE,HL
HL,#5C3B (FLAGS)
0,(HL)
#20
NZ,#0B76,PO-CHAR-3
0,(HL)
H,#00
L,A
HL,HL
HL,HL
HL,HL
HL,BC
BC
DE,HL
Skok dopředu při
tokens.
Znaky UDG jsou nyní od #00 do #0F.
Uschovej hodnoty aktuální tiskové pozice.
Vyzvedni bázovou adresu oblasti UDG
a skoč dopředu.
Vytiskni token a
vrať se přes PO-FETCH.
Uschovej hodnoty současné pozice.
Vyzvedni bázovou adresu oblasti CHARS
a uschovej tiskovou adresu v HL.
Umožni
úvodní mezeru.
Jestliže se nejedná o mezeru, potom
skoč dopředu.
Ale potlač úvodní mezeru, jestliže už existuje.
Převedení
kódu znaku do HL.
HL=HL*8
Nalezení bázové adresy znaku.
Je vyzvednuta aktuální tisková pozice
a bázová adresa převedena do DE.
PODPROGRAM TISK VŠECH ZNAKŮ
Tento podprogram tiskne osmibitové matice všech znaků. Na vstupu obsahuje DE bázovou adresu
znakové formy, HL cílovou adresu a v BC je aktuální tisková pozice pro řádek a sloupec.
0B7F
44
PR-ALL
LD
DEC
A,C
A
Vezmi číslo sloupce
a posuň se o jednu pozici doprava.
Komentovaný výpis paměti ROM
0B93
PR-ALL-1
LD
JR
DEC
LD
BIT
JR
PUSH
CALL
POP
LD
CP
PUSH
CALL
POP
A,#21
NZ,#0893,PR-ALL-1
B
C,A
1,(IY+1) (FLAGS)
Z,#0B93,PR-ALL-1
DE
#0ECD,COPY-BUFF
DE
A,C
C
DE
Z,#0C55,PO-SCR
DE
Nejde-li o nový řádek
skoč dopředu.
Posuň o jednu pozici dolů.
Při obsluze obrazovky
skok dopředu.
Uschovej bázovou adresu během
vyprazdňování bafru
a obnov ji.
Vezmi číslo nového sloupce.
Testuj zda-li byl použit nový řádek.
Jestliže ano, podívej se jestli není
potřeba rolovat displej.
Nyní posuď současný stav INVERSE & OVER.
0BA4
0BB6
PR-ALL-2
PR-ALL-3
PUSH
PUSH
LD
LD
RRA
JR
INC
RRA
RRA
SBC
LD
LD
AND
BIT
JR
SET
SCF
EX
BC
HL
A,(#5C91) (P-FLAG)
B,#FF
C,#0BA4,PR-ALL-2
B
A,A
C,A
A,#08
A
1,(IY+1) (FLAGS)
Z,#0BB6,PR-ALL-3
1,(IY+48) (FLAGS2)
DE,HL
Uschovej poziční
a cílové hodnoty.
Vyzvedni P-FLAG.
Připrav masku #FF pro OVER 1.
Testuj bit 0
a proveď skok při OVER 1.
Uprav masku na #00 pro OVER 0.
Rotuj bit 2 P-FLAG do CY
a připrav masku #00 pro INVERSE 0
a masku #FF pro INVERSE 1.
Ulož masku do registru C.
Nastav registr A jako čítač mikrořádků.
Nuluj CY flag.
Při obsluze obrazovky
skoč dopředu.
Signál: bafr již není prázdný.
Nastav CY jako signál: používá se tiskárna.
Před vstupem do smyčky zaměň bázovou a cílovou adresu.
Zde bude během osmi průchodů smyčkou proveden tisk znaku.
0BB7
PR-ALL-4
0BC1
PR-ALL-5
EX
LD
AND
XOR
XOR
LD
EX
JR
INC
INC
DEC
JR
EX
DEC
BIT
CALL
POP
POP
DEC
INC
AF,AF’
A,(DE)
B
(HL)
C
(DE),A
AF,AF’
C,#0BD3,PR-ALL-6
D
HL
A
NZ,#0BB7,PR-ALL-4
DE,HL
H
1,(IY+1) (FLAGS)
Z,#0BDB,PO-ATTR
HL
BC
C
HL
Uschovej CY flag v registru F'.
Vyzvedni stávající mikrořádek.
Použij masku pro OVER a výsledek
XORuj s mikrořádkem.
Proveď XOR také s maskou pro INVERSE
a vlož na cílovou adresu.
Vyzvedni CY flag
a skoč, je-li nastaven pro tiskárnu.
Uprav cílovou adresu.
Posuň se na další řádek zdrojové matice.
Zmenši čítač
a skoč zpět, pokud není nulový.
HL musí obsahovat
správnou vyšší adresu znakové oblasti.
Při obsluze obrazovky
nastav příslušný bajt atributů.
Obnov původní cílovou
a poziční adresu.
Snížení čísla sloupce.
Zvýšení cílové adresy.
Komentovaný výpis paměti ROM
45
RET
Návrat.
Při obsluze tiskárny musí být cílová adresa zvětšována po přírůstcích #20.
0BD3
PR-ALL-6
EX
LD
ADD
LD
EX
JR
AF,AF’
A,#20
A,E
E,A
AF,AF’
#0BC1,PR-ALL-5
Opět uschovej CY flag.
Přírůstek.
Přičtení
do registru E.
Vyzvednutí CY flagu.
Skok zpět do smyčky.
PODPROGRAM NASTAVENÍ ATRIBUTU
Je nalezen příslušný bajt. Starý obsah je modifikován podle stavu ATTR-T, MASK-T a P-FLAG a
tato nová hodnota je vložena zpět.
0BDB
PO-ATTR
0BFA
PO-ATTR-1
0C08
PO-ATTR-2
LD
RRCA
RRCA
RRCA
AND
OR
LD
LD
LD
XOR
AND
XOR
BIT
JR
AND
BIT
JR
XOR
BIT
JR
AND
BIT
JR
XOR
LD
RET
A,H
Vyšší bajt
cílové adresy
je dělen osmi.
#03
#58
H,A
(#5C8F) (ATTR-T)
A,(HL)
E
D
E
6,(IY+87) (P-FLAG)
Z,#0BFA,PO-ATTR-1
#C7
2,A
NZ,#0BFA,PO-ATTR-1
#38
4,(IY+87) (P-FLAG)
Z,#0C08,PO-ATTR-2
#F8
5,A
NZ,#0C08,PO-ATTR-2
#07
(HL),A
AND #03 určí, která třetina obrazovky je adresována.
Nyní je formován
vyšší bajt adresy atributu.
D obsahuje ATTR-T a E obsahuje MASK-T.
Hodnota "starého" atributu do A.
Maskování.
Pokud není PAPER 9,
skoč dopředu.
Původní barva PAPER se ignoruje a podle
odstínu INK bude nová barva PAPER
bud černá (000),
nebo bílá (111).
Pokud není INK 9,
skoč dopředu.
Původní barva INK se ignoruje a podle
odstínu PAPER bude nová barva INK
bud černá (000),
nebo bílá (111).
Vlož novou hodnotu atributu
a vrať se.
PODPROGRAM TISKU HLÁŠENÍ
Tento podprogram se používá pro tisk hlášení a tokens. Na vstupu obsahuje registr A číslo
hlášení nebo token v tabulce a v DE je bázová adresa této tabulky.
0C0A
PO-MSG
PUSH
LD
EX
JR
HL
H,#00
(SP),HL
#0C14,PO-TABLE
Vyšší bajt poslední úložky na zásobníku
je vynulován pro potlačení koncových mezer
viz.dále v programu.
Skok dopředu.
Zde je vstupní bod pro rozvinutí tokens. (#00 až #5A = RND až COPY).
0C10
46
PO-TOKENS
LD
DE,#0095
PUSH AF
Bázová adresa pro tabulku tokens.
Uschovej kód na zásobníku.
Komentovaný výpis paměti ROM
Tabulka je prohledána a správný vstup vytisknut.
0C14
PO-TABLE
CALL
JR
LD
BIT
CALL
#0C41,PO-SEARCH
C,#0C22,PO-EACH
A,#20
0,(IY+1) (FLAGS)
Z,#0C3B,PO-SAVE
Nalezení požadované položky.
Skok na tisk, není-li požadována
úvodní mezera.
Jednotlivé znaky hlášení nebo tokens jsou postupně vytisknuty.
0C22
PO-EACH
LD
AND
CALL
LD
INC
ADD
JR
A,(DE)
#7F
#0C3B,PO-SAVE
A,(DE)
DE
A,A
NC,#0C22,PO-EACH
Vyzvedni kód a
zruš "invertovaný" bit.
Tiskni znak.
Opět vyzvedni kód
a posuň ukazatel dopředu.
Invertovaný bit jde do CY jako signál posledního znaku.
Skok, pokud nejsi u konce hlášení nebo token.
Nyní se posoudí potřeba závěrečné mezery.
0C35
PO-TRSP
POP
CP
JR
CP
RET
LD
CP
RET
LD
DE
#48
Z,#0C35,PO-TRSP
#82
C
A,D
#03
C
A,#20
Pro hlášení obsahuje D #00 a pro tokens #00 až #5A.
Jestliže poslední byl znak $,
pak skok dopředu.
Jestliže poslední byl kterýkoliv znak před invertovaným
"A", pak se vrať.
Prozkoumej hodnotu v D a jestliže
indikuje, že bylo tisknuto hlášení,RND,INKEY$ nebo PI,
vrať se.
Všechny ostatní případy vyžadují následnou mezeru.
PODPROGRAM PO-SAVE
Tento podprogram umožňuje tzv. rekursivní tisk (tím, že volá sám
uschovány.
0C3B
PO-SAVE
PUSH DE
EXX
RST #10,PRINT-A-1
EXX
POP DE
RET
Uschovej
Uschovej
Vytiskni
Obnovení
Obnovení
Hotovo.
sebe). Obsahy registrů jsou
DE.
HL a BC.
jeden znak.
HL a BC.
DE.
PODPROGRAM PROHLEDÁVANÍ TABULEK
Tento podprogram vrací DE jako ukazatel na první znak požadované položky a CY=0, má-li být
posouzena úvodní mezera.
0C41
PO-SEARCH
0C44
PO-STEP
PUSH
EX
INC
BIT
INC
JR
DEC
JR
EX
POP
CP
AF
DE,HL
A
7,(HL)
HL
Z,#0C44,PO-STEP
A
NZ,#0C44,PO-STEP
DE,HL
AF
#20
Uschovej číslo položky.
Bázová adresa do HL.
Uprav rozsah na #01 až "?"
Čekej na invertovaný znak
a pokud není,
vracej se do smyčky.
Počítej položky,
dokud nenalezneš tu požadovanou.
DE ukazuje na první znak.
Vyzvedni číslo položky a pro prvních
32 čísel
Komentovaný výpis paměti ROM
47
RET
LD
SUB
RET
C
A,(DE)
#41
se vracej s CY=1.
Testuj první znak
a je-li to písmeno
bude zapotřebí úvodní mezera.
PODPROGRAM TESTOVÁNÍ SCROLL
Kdykoliv by mohlo dojít k potřebě rolování displeje, volá se tento podprogram. K tomu dochází ve
třech případech:
a)Při zpracování řídícího znaku CR (carriage return).
b)Je-li použito AT v INPUT řádku.
c)Jestliže výpis přesáhne aktuální řádek a bude zapotřebí pokračovat na dalším řádku.
Na vstupu obsahuje B číslo řádku, který má být testován.
0C55
PO-SCR
0C86 REPORT-5
BIT
RET
LD
PUSH
LD
BIT
JP
CP
JR
RET
BIT
JR
LD
DEC
JR
LD
CALL
LD
RES
RET
1,(IY+1) (FLAGS)
NZ
DE,#0DD9
DE
A,B
0,(IY+2) (TV-FLAG)
NZ,#0D02,PO-SCR-4
(IY+49) (DF-SZ)
C,#0C86,REPORT-5
NZ
4,(IY+2) (TV-FLAG)
Z,#0C88,PO-SCR-2
E,(IY+45) (BREG)
E
Z,#0CD2,PO-SCR-3
A,#00
#1601,CHAN-OPEN
SP,(#5C3F) (LIST-SP)
4,(IY+2) (TV-FLAG)
RST #08,ERROR-1
DEFB #04
Jestliže obsluhuješ
tiskárnu, vrať se.
Adresa CL-SET
na zásobník.
Číslo řádku do A.
Jedná-li se o INPUT
...AT,skok dopředu.
Je-li číslo řádku nižší než DF-SZ,
skoč do podprogramu chybového hlášení a
je-li vyšší, vrať se přes CL-SET.
Pokud neobsluhuješ automatický výpis
skoč dopředu.
Vyzvedni čítač řádků,
dekrementuj ho a
skoč dopředu, je-li potřeba rolovat.
Jinak otevři
kanál "K",
obnov zásobník,
signalizuj konec automatického výpis
a vrať se přes CL-SET.
Ohlaš:
5-Out of screen
Nyní posuď, je-li potřeba vypsat sdělení "scroll?".
0C88
48
PO-SCR-2
DEC
JR
LD
SUB
LD
LD
PUSH
LD
PUSH
LD
CALL
XOR
LD
CALL
SET
LD
SET
(IY+82) (SCR-CT)
NZ,#0CD2,PO-SCR-3
A,#18
B
(#5C8C),A (SCR-CT)
HL,(#5C8F) (ATTR-T)
HL
A,(#5C91) (P-FLAG)
AF
A,#FD
#1601,CHAN-OPEN
A
DE,#0CF8
#0C0A,PO-MSG
5,(IY+2) (TV-FLAG)
HL,#5C3B
3,(HL)
Dekrementuj skrolovací čítač.
Není-li nulový, ke sdělení nedojde.
Čítač je nastaven.
na novou
hodnotu.
Aktuální hodnoty ATTR-T a MASK-T
jsou uschovány.
Aktuální hodnota P-FLAG
je uschována.
Kanál "K"
je otevřen.
Sdělení "scroll?" má číslo 0.
Báze.
Vypsání na obrazovku.
Signál: čistit dolní část obrazovky po stisku klávesy.
Toto je FLAGS.
Signál: " L mod ".
Komentovaný výpis paměti ROM
RES
EXX
CALL
EXX
CP
JR
CP
JR
OR
CP
JR
LD
CALL
POP
LD
POP
LD
5,(HL)
#15D4,WAIT-KEY
#20
Z,#0D00,REPORT-D
#E2
Z,#0D00,REPORT-D
#20
#6E
Z,#0D00,REPORT-D
A,#FE
#1601,CHAN-OPEN
AF
(#5C91),A (P-FLAG)
HL
(#5C8F),HL (ATTR-T)
Signál: zatím žádná klávesa.
Poznámka: Zde měl být také uschován DE.
Vyzvedni kód stisknuté klávesy.
Obnov registry.
Při stisku BREAK,
skoč na chybové hlášení.
Při stisku STOP,
skoč na chybové hlášení.
Při stisku n
nebo N,
skoč na chybové hlášení.
Ostatní znaky vyvolávají rolování.
Otevření kanálu "S".
Vyzvednutí
a obnovení P-FLAG.
Vyzvednutí
a obnovení ATTR-T a MASK-T.
Nyní je displej odrolován.
0CD2
PO-SCR-3
CALL
LD
INC
LD
PUSH
CALL
LD
RRCA
RRCA
RRCA
AND
OR
LD
#0DFE,CL-SC-ALL
B,(IY+49) (DF-SZ)
B
C,#21
BC
#0E9B,CL-ADDR
A,H
#03
#58
H,A
Celý displej je skrolován.
Jsou nalezena čísla řádku
a sloupce
nad dolní částí obrazovky
a uschována.
Je nalezena
adresa
odpovídajícího
atributu
a tato
je
uložena
do HL.
Řádek o který se jedná, obdrží atributy z dolní části obrazovky a nový řádek na nejspodnějším
okraji displeje bude mít hodnoty z ATTR-P. Stačí tedy hodnoty atributů zaměnit.
0CF0
PO-SCR-3A
LD
LD
LD
LD
EX
LD
LD
INC
INC
DJNZ
POP
DE,#5AE0
A,(DE)
C,(HL)
B,#20
DE,HL
(DE),A
(HL),C
DE
HL
#0CF0,PO-SCR-3A
BC
RET
DE ukazuje na první atribut nejspodnějšího řádku.
Hodnota bajtu do A.
Bajt z řádku nad dolní částí obrazovky do C.
32 bajtů je ve hře.
Záměna ukazatelů.
Proveď první
záměnu
a pokračuj se
stejnými hodnotami
pro celý řádek.
Vyzvedni číslo nejspodnějšího řádku a sloupce horní
části obrazovky a
vrať se.
Sdělení "scroll?"
0CF8
0D00
REPORT-D
DEFB #80
DEFB #73,#63,#72,#6F
DEFB #6C,#6C,#BF
Úvodní značka – bude přeskočena.
s c r o
l l ? (invertovaný).
RST
Ohlaš:
#08,ERROR-1
Komentovaný výpis paměti ROM
49
DEFB #0C
D-BREAK-CONT repeats
Dolní část obrazovky je ošetřena následovně.
0D02
PO-SCR-4
CP
JR
ADD
SUB
RET
NEG
PUSH
LD
LD
PUSH
LD
PUSH
CALL
LD
#02
C,#0C86,REPORT-5
A,(IY+49) (DF-SZ)
#19
NC
BC
B,A
HL,(#5C8F) (ATTR-T)
HL
HL,(#5C91) (P-FLAG)
HL
#0D4D,TEMPS
A,B
Je-li příliš velká,
skok na chybové hlášení.
Jestliže není
potřeba rolovat,
provede se návrat.
V A je počet skrolů které se mají vykonat.
Uschování čísla řádku a sloupce.
Počet rolování,
ATTR-T a MASK-T
jsou uschovány.
Rovněž P-FLAG
jde na zásobník.
Budou použity "permanentní" barvy.
Počet rolování do A.
Nyní je dolní část obrazovky skrolována A krát.
0D1C
PO-SCR-4A
0D2D
PO-SCR-4B
PUSH
LD
LD
LD
INC
LD
LD
CP
JR
INC
LD
CALL
POP
DEC
JR
POP
LD
POP
LD
LD
RES
CALL
AF
HL,#5C6B
B,(HL)
A,B
A
(HL),A
HL,#5C89
(HL)
C,#0D2D,PO-SCR-4B
(HL)
B,#18
#0E00,CL-SCROLL
AF
A
NZ,#0D1C,PO-SCR-4A
HL
(IY+87),L (P-FLAG)
HL
(#5C8F),HL (ATTR-T)
BC,(#5C88) (S-POSN)
0,(IY+2) (TV-FLAG)
#0DD9,CL-SET
SET
POP
RET
0,(IY+2) (TV-FLAG)
BC
Ulož počet.
Hodnota v DF-SZ
jde do B
a do A,
je inkrementována
a vrácena do DF-SZ.
Toto je S-POSN-hi.
Skok se provede jedině tehdy, když
B=původní hodnota DF-SZ, tedy rolování pouze dolní části.
Zvětšení S-POSN-hi
Hodnota pro rolování celého displeje.
Roluj B krát.
Vyzvednutí a zmenšení
počtu rolování.
Skok zpět, není-li skončeno.
Vyzvedni
a obnov P-FLAG.
Vyzvedni
a obnov ATTR-T a MASK-T.
V případě změny S-POSN
volej CL-SET, aby se do DF-CC uložila odpovídající
hodnota.
Signál: obsluha dolní částí obrazovky.
Vyzvedni číslo řádku a sloupce
a vrať se.
PODPROGRAM BAREVNÝCH POLOŽEK
Toto je jeden z nejdůležitějších podprogramů. Je používán kdykoliv je zapotřebí, aby
permanentní barevné hodnoty byly zkopírovány do přechodných systémových proměnných. Nejprve jsou
zpracovávány ATTR-T a MASK-T.
0D4D
50
TEMPS
XOR
LD
BIT
JR
A
HL,(#5C8D) (ATTR-P)
0,(IY+2) (TV-FLAG)
Z,#0D5B,TEMPS-1
Registr A je vynulován.
Jsou vyzvednuty současné hodnoty ATTR-P a MASK-P.
Jedná-li se o hlavní část obrazovky,
skoč dopředu.
Komentovaný výpis paměti ROM
0D5B
TEMPS-1
LD
LD
LD
H,A
L,(IY+14) (BORDCR)
(#5C8F),HL (ATTR-T)
Jinak použij hodnotu #00 a hodnotu
systémové proměnné BORDER.
Obě pak ulož na ATTR-T a MASK-T.
Další na řadě je P-FLAG.
0D65
TEMPS-2
LD
JR
LD
RRCA
XOR
AND
XOR
LD
RET
HL,#5C91
NZ,#0D65,TEMPS-2
A,(HL)
(HL)
#55
(HL)
(HL),A
Toto je P-FLAG.
Skoč dopředu, jestliže je to dolní část obrazovky A=#00.
Jinak vyzvedni hodnotu P-FLAG a
přesuň liché bity na místa sudých.
Pokračuj v kopírování
sudých bitů
do registru A a do
systémové proměnné P-FLAG.
PODPROGRAM CLS
Hned na začátku je smazán celý displej - "body" jsou vynulovány a atributové bajty jsou
nastaveny na hodnotu, která odpovídá systémové proměnné ATTR-P. Potom bude smazána také nižší část
obrazovky.
0D6B
0D6E
CLS
CLS-LOWER
CALL
LD
RES
SET
CALL
LD
CALL
#0DAF,CL-ALL
HL,#5C3C
5,(HL)
0,(HL)
#0D4D,TEMPS
B,(IY+49) (DF-SZ)
#0E44,CL-LINE
Hlavní část displeje je smazána.
Toto je TV-FLAG.
Signál: nemaž spodní část obrazovky po stisknutí tlačítka
Signál: spodní část obrazovky.
Nastav barevné hodnoty, tzn. nastav ATTR-T podle BORDCR.
Dolní část obrazovky je pak vyčištěna
za pomocí těchto hodnot.
S výjimkou atributových bajtů pro řádky 22 a 23 jsou všechny atributové bajty nastaveny podle
hodnot v ATTR-P.
0D87
0D89
CLS-1
CLS-2
0D8E
CLS-3
LD
LD
DEC
JR
LD
DEC
LD
DEC
JR
DJNZ
HL,#5AC0
A,(#5CBD) (ATTR-P)
B
#0D8E,CLS-3
C,#20
HL
(HL),A
C
NZ,#0D89,CLS-2
#0D87,CLS-1
Adresa 1.atributového bajtu pro řádek 22.
Vyzvedni ATTR-P.
Čítač řádků.
Skoč dopředu do smyčky.
32 znaků na řádek.
Vracej se zpět po řádku a nastavuj
atributové bajty.
Opakuj smyčku.
Velikost spodní části obrazovky bude nastavena.
LD
(IY+49),#02 (DF-SZ)
Její velikost jsou dva řádky.
Nyní ještě zbývají další "úklidové práce".
0D94
CL-CHAN
0DA0
CL-CHAN-A
LD
CALL
LD
LD
AND
LD
INC
LD
INC
A,#FD
#1601,CHAN-OPEN
HL,(#5C51) (CURCHL)
DE,#09F4
A
(HL),E
HL
(HL),D
HL
Kanál "K"
bude otevřen.
Vyzvedni adresu současného kanálu a
jako výstupní adresu použij #09F4.
(=PRINT-OUT) a vstupní adresa
#10A8 (=KEY-INPUT).
Komentovaný výpis paměti ROM
51
LD
CCF
JR
LD
JR
DE,#10A8
C,#0DA0,CL-CHAN-A
BC,#1721
#0DD9,CL-SET
První je uložena výstupní adresa,
pak adresa vstupní.
Protože se jedná o dolní část displeje bude nejnižší
tiskový řádek číslo 23. Vrať se přes CL-SET.
PODPROGRAM MAZÁNÍ CELÉHO DISPLEJE
Tato podprogram je volán:
a) příkazem CLS
b) hlavním prováděcím podprogramem
c) automatickým výpisem.
0DAF
CL-ALL
LD
LD
RES
CALL
LD
CALL
CALL
LD
CALL
LD
LD
LD
INC
LD
LD
LD
HL,#0000
(#5C7D),HL (COORDS)
0,(IY+48) (FLAGS-2)
#0D94,CL-CHAN
A,#FE
#1601,CHAN-OPEN
#0D4D,TEMPS
B,#18
#0E44,CL-LINE
HL,(#5C51) (CHURCHL)
DE,#09F4
(HL),E
HL
(HL),D
(IY+82),#01 (SCR-CT)
BC,#1821
Jsou uloženy nuly
do systémové proměnné COORDS.
Signál: obrazovka je čistá.
Proveď "úklidové práce".
Kanál "S"
bude otevřen.
Permanentní barvy budou nastaveny.
24 řádků displeje
bude smazáno.
Zajisti,
že současná výstupní adresa je #09F4 (PRINT-OUT).
Nastav rolovací čítač.
Protože se jedná o horní část obrazovky, bude nejvyšší
tisknutý řádek "řádek 0". Pokračuj do podprogramu CL-SET.
PODPROGRAM CL-SET
Na vstupu do tohoto podprogramu obsahuje registrový pár BC číslo řádku a sloupce na obrazovce,
nebo registr C obsahuje číslo sloupce v bafru tiskárny a pak je nalezena příslušná adresa bitu prvního
znaku. Podprogram se vrací přes PO-STORE tak, aby byly uloženy všechny potřebné hodnoty.
0DD9
CL-SET
0DEE
CL-SET-1
0DF4
CL-SET-2
52
LD
BIT
JR
LD
BIT
JR
ADD
SUB
PUSH
LD
CALL
POP
LD
SUB
LD
LD
ADD
JP
HL,#5B00
11,(IY+1) (FLAGS)
NZ,#0DF4,CL-SET-2
A,B
0,(IY+2) (TV-FLAG)
Z,#0DEE,CL-SET-1
A,(IY+49) (DF-SZ)
#18
BC
B,A
#0E9B,CL-ADDR
BC
A,#21
C
E,A
D,#00
HL,DE
#0ADC,PO-STORE
Adresa 1.bajtu bafru tiskárny.
Obsluhuješ-li bafr tiskárny,
skoč dopředu.
Okopíruj číslo řádku.
Obsluhuješ-li hlavní část obrazovky,
skoč dopředu.
První řádek dolní části obrazovky se nazývá "řádek #18"
a to musí být převedeno.
Číslo řádku a sloupce jsou uschována
a číslo řádku je převedeno do reg. B.
V HL je nyní adresa začátku řádku a
čísla řádku a sloupce jsou opět uložena do BC.
Číslo sloupce
je nyní převráceno
převedeno do registrového
páru DE a
na závěr je v HL vytvořena požadovaná adresa.
Tyto hodnoty jsou uschovány podprogramem PO-STORE.
Komentovaný výpis paměti ROM
ROLOVACÍ PODPROGRAM
Počet řádků, který má být rolován, vstupuje do podprogramu v registru B.
0DFE
CL-SC-ALL
LD
B,#17
Vstupní bod po dotazu "scroll?".
Hlavní vstupní bod z předcházejícího a nebo z příkazu INPUT AT.
0E00
CL-SCROLL
CALL #0E9B,CL-ADDR
LD
C,#08
Najdi počáteční adresu řádku.
8 mikrořádků tvoří kompletní znakový řádek.
Nyní přichází hlavní rolovací smyčka. Registr B obsahuje počet rolovaných řádků, HL ukazuje na
adresu 1.rolovaného bajtu a registr C je využit jako počítadlo mikrořádků.
0E05
CL-SCR-1
PUSH
PUSH
LD
AND
LD
JR
BC
HL
A,B
#07
A,B
NZ,#0E19,CL-SCR-3
Uschovej oba čítače.
Uschovej adresu.
Nejedná-li se o přechod na
další třetinu
displeje,
skoč dopředu.
Mikrořádky prvního znakového řádku každé třetiny musí být přeneseny přes 2K hranici (každá
třetina má 2KB).
0E0D
CL-SCR-2
EX
LD
ADD
EX
LD
DEC
LDIR
DE,HL
HL,#F8E0
HL,DE
DE,HL
BC,#0020
A
Po skončení těchto
operací zůstává v
HL původní hodnota
a DE ukazuje na novou cílovou adresu.
Jedná se o 32 znaků.
Zmenši počítadlo za každý přenesený řádek
a přenes požadovaných 32 bajtů.
Pixlové řádky uvnitř třetin mají být nyní rolovány. Registr A obsahuje při prvním průběhu
hodnoty #01 až #07, #09 až #0F nebo #11 až #17.
0E19
CL-SCR-3
EX
LD
ADD
EX
LD
AND
RRCA
RRCA
RRCA
LD
LD
LD
LDIR
LD
ADD
AND
JR
DE,HL
HL,#FFE0
HL,DE
DE,HL
B,A
#07
Znovu je DE nastaven tak,
aby ukazoval na
požadovanou cílovou
adresu, ale tentokrát pouze o 32 pozic dále.
Uschovej číslo řádku v registru B.
Nyní zjisti,
kolik znaků zůstává
v této třetině.
C,A
A,B
B,#00
Předej celkový počet znaků do registru C.
Vyzvedni číslo řádku.
A nyní již obsahuje celkový počet znaků i BC
a mikrořádek každého znaku je rolován.
Připrav pro zvětšení adresu, na kterou se bude
ukládat při třetinové hranici a zvětši HL o #0700.
Nejsou-li zde již žádné další zvažované třetiny,
skoč zpět.
B,#07
HL,BC
#F8
NZ,#0E0D,CL-SCR-2
Nyní zjisti zda byla smyčka použita 8 krát; tj. pro 8 mikrořádků.
POP
INC
POP
DEC
HL
H
BC
C
Vyzvedni adresu originálu.
Adresuj další mikrořádek.
Vyzvedni čítače.
Zmenši čítač mikrořádků a pokud nebylo
Komentovaný výpis paměti ROM
53
JR
NZ,#0E05,CL-SR-1
přeneseno všech 8 mikrořádků skákej zpět.
Dále jsou rolovány atributové bajty. Povšimněte si, že registr B obsahuje stále počet řádků,
které mají být rolovány, a registr C obsahuje nulu.
CALL
LD
ADD
EX
LDIR
#0E88,CL-ATTR
HL,#FFE0
HL,DE
DE,HL
Je nalezena požadovaná adresa v oblasti proměnných a
počet znaků v "B" řádcích.
Přemísťovací konstanta pro všechny atributové bajty je
32 míst.
Atributové bajty jsou nyní rolovány.
Zbývá ještě vyčistit spodní řádky displeje.
LD
B,#01
B obsahuje 1, se kterou vstoupí do dalšího podprogramu.
PODPROGRAM SMAZÁNÍ ŘÁDKU
Tento podprogram vyčistí spodní řádky obrazovky, jejichž počet je v registru B.
0E44
CL-LINE
PUSH BC
CALL #0E9B,CL-ADDR
LD
C,#08
Číslo řádku je během podprogramu uschováno.
V HL je vytvořena počáteční adresa řádku.
Znovu je C nastaveno jako čítač 8 mikrořádků.
Zde přichází smyčka, která vyčistí všechny "pixlové" řádky.
0E4A
CL-LINE-1
0E4D
CL-LINE-2
PUSH
PUSH
LD
AND
RRCA
RRCA
RRCA
LD
LD
LD
DEC
LD
LD
LD
INC
LDIR
LD
ADD
DEC
AND
LD
JR
BC
HL
A,B
#07
C,A
A,B
B,#00
C
D,H
E,L
(HL),#00
DE
DE,#0701
HL,DE
A
#F8
B,A
NZ,#0E4D,CL-LINE-2
Uschovej číslo řádku a čítač mikrořádků.
Uschovej adresu.
Uschovej číslo řádku v registru A.
Zjisti, o kolik se jedná znaků nebo-li
"B mod 8" řádků
a tuto hodnotu
předej do registru
C (který bude obsahovat #00 pro novou třetinu).
Vyzvedni číslo řádku a nastav
registr BC tak, aby
číslo které obsahuje bylo o jednu menší než počet znaků.
Nastav DE tak, aby
ukazoval na první znak, vyčisti
bajt prvního znaku,
nastav DE na druhý znak a vyčisti celý
mikrořádek.
Pro každou třetinu displeje bude HL
zvýšeno o konstantu #0701.
Dekrementuj čítač řádků.
Předej číslo třetiny
do registru B.
Skoč zpět, jsou-li zde ještě nějaké třetiny k ošetření.
Zde se zjistí, jestli smyčka proběhla 8 krát.
POP
INC
POP
DEC
JR
HL
H
BC
C
NZ,#0E4A,CL-LINE-1
Připrav adresu pro
každý mikrořádek.
Vyzvedni čítače.
Zmenši čítač mikrořádků a
skoč zpět, pokud není konec.
Nyní musí být nastaveny atributové bajty. Hodnota ATTR-P bude požita při obsluze hlavní části
displeje a hodnota BORDCR při dolní části displeje.
54
Komentovaný výpis paměti ROM
CALL #0E88,CL-ATTR
0E80
CL-LINE-3
LD
LD
INC
LD
BIT
JR
LD
LD
DEC
LDIR
H,D
L,E
DE
A,(#5C8D) (ATTR-P)
0,(IY+2) (TV-FLAG)
Z,#0E80,CL-LINE-3
A,(#5C48) (BORDCR)
(HL),A
BC
POP
LD
RET
BC
C,#21
Je nalezen počet atributových bajtů a adresa prvního
z nich.
HL tedy ukazuje na první atributový
bajt a
DE na druhý.
Vyzvedni hodnotu ATTR-P.
Jedná-li se o hlavní část obrazovky,
skoč dopředu, jinak
použij hodnotu BORDCR.
Nastav atributový bajt.
Jeden bajt už je hotov.
A nyní bude jeho hodnota okopírována do všech ostatních
bajtů.
Obnov si číslo řádku.
Nastav číslo sloupce na nejkrajnější levou pozici a
vrať se.
PODPROGRAM CL-ATTR
Tento podprogram má dvě rozdílné funkce:
a) Vypočítat adresu atributového bajtu pro danou adresu v paměti a uložit ji do DE. Povšimněte
si, že hodnoty na vstupu ukazují na devátý mikrořádek znaku.
b) Pro daný počet řádků v registru B je v registrovém páru BC navrácen počet znaků připadající na
tyto řádky.
0E88
CL-ATTR
LD
RRCA
RRCA
RRCA
DEC
OR
LD
EX
LD
LD
ADD
ADD
ADD
ADD
ADD
LD
LD
RET
A,H
Vyzvedni vyšší bajt
adresy a
vynásob toto číslo číslem 32.
A
#50
H,A
DE,HL
H,C
L,B
HL,HL
HL,HL
HL,HL
HL,HL
HL,HL
B,H
C,L
Jdi zpátky na 8. mikrořádek.
Adresuj oblast atributů.
Vytvoř nový vyšší bajt
a celou adresu převeď do DE.
Zde je vždy nula a
toto je číslo řádku.
Hodnotu vynásobenou číslem 32 převeď
zpět do registrového
páru BC před
návratem.
PODPROGRAM CL-ADR
Pro zadané číslo řádku v registru B vytvoří v HL tento podprogram odpovídající adresu obrazové
paměti.
0E9B
CL-ADDR
LD
A,#18
SUB B
LD
D,A
RRCA
RRCA
RRCA
Číslo řádku
je převráceno a
výsledek je uložen do registru D.
Ve skutečnosti (A mod 8)*32.
V každé třetině displeje má nižší bajt tyto hodnoty:
Komentovaný výpis paměti ROM
55
AND
LD
LD
AND
OR
LD
RET
#E0
L,A
A,D
#18
#40
H,A
1. řádek = #00, 2. řádek = #20,atd.
Nižší bajt je uložen do L.
Skutečné číslo řádku je vyzvednuto,
ve skutečnosti se jedná o 64 + 8 * INT(A/8)
Vyšší bajt horní třetiny displeje má hodnotu #40, bajt
střední třetiny je #48 a nižší třetina je #50. Tyto
hodnoty jsou uloženy do registru H a provede se návrat.
PODPROGRAM PŘÍKAZU COPY
Tento podprogram obslouží 176 mikrořádků obrazovky, a to jeden po druhém.
0EAC
COPY
DI
LD
LD
B,#B0
HL,#4000
Po dobu provádění tohoto podprogramu je zakázáno
maskované přerušení.
Konstanta 176 řádků.
Bázová adresa obrazovky.
Zde se vstupuje do smyčky.
0EB2
COPY-1
PUSH
PUSH
CALL
POP
POP
INC
LD
AND
JR
HL
BC
#0EF4,COPY-LINE
BC
HL
H
A,H
#07
NZ,#0EC9,COPY-2
Uschovej bázovou adresu a
počet řádků.
Tento podprogram bude zavolán 176 krát.
Vyzvedni číslo řádku
a bázovou adresu.
Bázová adresa je posunuta na další mikrořádek.
Nebylo-li přeneseno ještě všech 8
mikrořádků,
skoč dopředu.
Pro každý nový znakový řádek musí být bázová adresa upravena.
0EC9
COPY-2
LD
ADD
LD
A,L
A,#20
L,A
CCF
SBC
AND
A,A
#F8
ADD
LD
DJNZ
JR
A,H
H,A
#0EB2,COPY-1
#0EDA,COPY-END
Vyzvedni nižší bajt.
Zvyš ho o #20.
CY flag bude nulový pohybuješ-li se uprostřed třetiny
obrazovky.
Neguj CY flag.
Registr A bude obsahovat #F8,
pokud jsi uvnitř třetiny, ale #00 pokud jdeš do nové
třetiny.
Vyšší bajt adresy
je nyní upraven.
Skoč zpět,dokud jsi nevytiskl 176 mikrořádků.
Skoč na konec podprogramu COPY.
PODPROGRAM COPY-BUFF
Tento podprogram je volán, kdykoliv je zapotřebí vyvolat obsah bafru na tiskárnu.
0ECD
0ED3
COPY-BUFF
COPY-3
DI
LD
LD
PUSH
CALL
POP
DJNZ
HL,#5B00
B,#08
BC
#0EF4,COPY-LINE
BC
#0ED3,COPY-3
Maskované přerušení je zakázáno.
Adresa prvního bajtu bafru.
Je zde osm mikrořádků.
Uschovej číslo řádku.
Tento podprogram je volán 8-krát.
Vyzvedni číslo řádku.
Opakuj do vytištění osmi mikrořádků.
Pokračuj přes podprogram COPY-END.
56
Komentovaný výpis paměti ROM
0EDA
COPY-END
LD
OUT
EI
A,#04
(#FB),A
Zastav motor tiskárny.
Povol nemaskovatelné přerušení a pokračuj přes podprogram
CLEAR-PRB.
PODPROGRAM "VYČISTI BUFFER TISKÁRNY"
Při zavolání tohoto podprogramu je vyčištěn bafr tiskárny.
0EDF
CLEAR-PRB
0EE7
PRB-BYTES
LD
LD
XOR
LD
LD
INC
DJNZ
RES
LD
JP
HL,#5B00
(IY+70),L (PR-CC-lo)
A
B,A
(HL),A
HL
#0EE7,PRB-BYTES
1,(IY+48) (FLAGS2)
C,#21
#0DD9,CL-SET
Adresa prvního bajtu bafru tiskárny.
Nastav tiskový sloupec na nulu.
Vynuluj registr A a
registr B (ve skutečnosti obsahuje dekadicky 256).
Nyní je vyčištěno 256 bajtů bafru tiskárny,
jeden po druhém.
Signál: bafr je prázdný.
Nastav tiskovou pozici
a vrať se přes CL-SET a PO-STORE.
PODPROGRAM COPY-LINE
Na vstupu do tohoto podprogramu obsahuje registrový pár HL adresu 32 bajtů, které představují
mikrořádek a B obsahuje číslo mikrořádku.
0EF4
COPY-LINE
LD
CP
SBC
AND
OUT
LD
A,B
#03
A,A
#02
(#FB),A
D,A
Okopíruj číslo řádky.
Registr A bude obsahovat #00 dokud se nebudou
obsluhovat poslední dva řádky.
Zpomal motor, ale pouze pro poslední
dva mikrořádky.
Registr D bude obsahovat buďto #00 nebo #02.
Před vykonáním jakéhokoliv tisku se musí provést tři testy.
0EFD
0F0C
COPY-L-1
COPY-L-2
CALL
JR
LD
OUT
EI
CALL
RST
DEFB
IN
ADD
RET
JR
LD
#1F54,BREAK-KEY
C,#0F0C,COPY-L-2
A,#04
(#FB),A
#0EDF,CLEAR-PRB
#08,ERROR-1
#0C
A,(#FB)
A,A
M
NC,#0EFD,COPY-L-1
C,#20
Nebyl-li stlačen BREAK,
skoč dopředu.
Signál: motor stop.
Povol maskované přerušení.
Vyčisti bafr tiskárny a
Ohlaš:
D-BREAK-CONT repeats.
Zjisti v jakém stavu
se nachází tiskárna.
Proveď okamžitý návrat, není-li tiskárna připojena.
Počkej na jehlu.
Konstanta pro 32 bajtů.
Nyní vstup do smyčky, která obsluhuje tyto bajty.
0F14
COPY-L-3
0F18
COPY-L-4
0F1E
COPY-L-5
LD
INC
LD
RL
RL
RR
IN
RRA
E,(HL)
HL
B,#08
D
E
D
A,(#FB)
Vyzvedni bajt.
Posuň ukazatel.
V jednom bajtu je 8 bitů.
Posuň D doleva.
Každý bit posuň do CY.
Posuň D zpět a naber CY z E.
Znovu otestuj stav tiskárny
Komentovaný výpis paměti ROM
57
JR
LD
OUT
NC,#0F1E,COPY-L-5
A,D
(#FB),A
a čekej na signál.
Nyní pokračuj a předej
bit tiskárně.
Poznámka: bit 2=0 signál: zapni motor, bit 1=1 signál: zpomal motor, bit 7=1 signál: vlastní
tisk.
DJNZ #0F18,COPY-L-4
DEC C
JR
NZ,#0F14,COPY-L-3
RET
58
Tiskni každý bit.
Sniž čítač bajtů.
Skoč zpět, jestli jsou zde ještě nějaké bajty.
Jinak se vrať.
Komentovaný výpis paměti ROM
PODPROGRAMY EDITORU
Editor se volá při dvou příležitostech:
a) Z hlavní prováděcí procedury tak, aby mohl uživatel vložit řádek do programu.
b) Z podprogramu příkazu INPUT.
Nejprve je uložen chybový zásobník a podvržena alternativní adresa.
0F2C
EDITOR
0F30
ED-AGAIN
LD
PUSH
LD
PUSH
LD
HL,(#5C3D) (ERR-SP)
HL
HL,#107F
HL
(#5C3D),SP (ERR-SP)
Na zásobník je
uložena aktuální adresa.
Toto je adresa ED-ERRORu.
Jakákoliv událost,
která by vedla ke spuštění podpr. chybových hlášení,
způsobí návrat do podprogramu ED-ERROR.
Nyní se vstupuje do smyčky, která obslouží každý úder na klávesu
0F38
ED-LOOP
CALL
PUSH
LD
LD
LD
CALL
POP
LD
PUSH
#15D4,WAIT-KEY
AF
D,#00
E,(IY-1) (PIP)
HL,#00C8
#03B5,BEEPER
AF
HL,#0F38
HL
Z tohoto programu se vrať po stištění klávesy.
Přechodně si uschovej kód.
Vynuluj registr D a
vyzvedni si trvání klávesového
cvaknutí, jeho výšku
a udělej píp.
Obnov si kód a
ulož na zásobník adresu
ED-LOOP.
Nyní analyzuj získaný kód.
CP
JR
CP
JR
CP
JR
#18
NC,#0F81,ADD-CHAR
#07
C,#0F81,ADD-CHAR
#10
C,#0F92,ED-KEYS
Akceptuj všechny znakové kódy, grafický kód a
a všechny tokens.
Také akceptuj čárku "," (tisk v druhé polovině řádku).
Akceptuj všechny editační klávesy.
Nyní jsou posouzeny klávesy od INK po TAB.
LD
LD
CP
JR
BC,#0002
D,A
#16
C,#0F6C,ED-CONTR
INK a PAPER vyžadují dvě místa.
Okopíruj kód do D.
Skoč dopředu pro INK a PAPER.
Zde budou posuzovány AT a TAB:
INC
BIT
JP
CALL
LD
BC
7,(IY+55) (FLAGX)
Z,#101E,ED-IGNORE
#15D4,WAIT-KEY
E,A
Jsou požadována tři místa.
Skoč dopředu, neobsluhuješ-li
INPUT LINE ...
Vezmi druhý kód
a dej ho do E.
Jsou vyzvednuty ostatní bajty pro řídící znaky.
0F6C
ED-CONTR
CALL
PUSH
LD
RES
CALL
#15D4,WAIT-KEY
DE
HL,(#5C5B) (K-CUR)
0,(IY+7) (MODE)
#1655,MAKE-ROOM
Vyzvedni další kód.
Uschovej oba kódy.
Vyzvedni K-CUR.
Signál "K" mode.
Vytvoř prostor dvou nebo tří bajtů.
Komentovaný výpis paměti ROM
59
POP
INC
LD
INC
LD
BC
HL
(HL),B
HL
(HL),C
JR
#0F8B,ADD-CH-1
Obnov předchozí kódy.
Ukazuj na první místo a
vlož tam první kód.
Vlož druhý kód. Druhý kód bude přepsán, jedná-li
se o INK a PAPER.
Skoč dopředu.
PODPROGRAM ADD-CHAR
Tento podprogram ve skutečnosti přidává kód znaku do současného EDIT nebo INPUT řádku.
0F81
ADD-CHAR
0F8B
ADD-CH-1
RES
LD
CALL
LD
INC
LD
RET
0,(IY+7) (MODE)
HL,(#5C5B) (K-CUR)
#1652,ONE-SPACE
(DE),A
DE
(#5C5B),DE (K-CUR)
Signál "K mode".
Vyzvedni pozici kurzoru.
Udělej jednu mezeru.
Vlož kód do této mezery a signalizuj,
že kurzor se musí
postavit na další místo.
Pak se vrať do ED-LOOP.
Editační tlačítka jsou zpracována takto:
0F92
ED-KEYS
LD
LD
LD
ADD
LD
ADD
PUSH
LD
RET
E,A
D,#00
HL,#0F99
HL,DE
E,(HL)
HL,DE
HL
HL,(#5C5B) (K-CUR)
Kód je převeden do registrového páru DE.
Bázová adresa tabulky editačních kláves do HL.
Vstupní bod je adresován a
vyzvednut do E.
Adresa obslužného podprogramu
je uschována na zásobníku a
do HL je uložena posice kurzoru.
Je proveden nepřímý skok do žádaného podprogramu.
TABULKA EDITAČNÝCH KLÁVES
adresa
0FA0
0FA1
0FA2
0FA3
0FA4
0FA5
0FA6
0FA7
0FA8
doplněk
09
66
6A
50
B5
70
7E
CF
D4
znak
EDIT
kurzor vlevo
kurzor vpravo
kurzor dolů
kurzor nahoru
DELETE
ENTER
SYMBOL SHIFT
GRAPHICS
PODPROGRAM TLAČÍTKA EDIT
Je-li systém v editačním modu, způsobí stištění klávesy EDIT snesení aktuálního basicového
řádku (tj. řádku, na který ukazuje programový kurzor). Je-li systém v modu INPUT je po stištění
klávesy EDIT vymazán text, vložený uživatelem.
0FA9
60
ED-EDIT
LD
BIT
JP
CALL
CALL
LD
OR
HL,(#5C49) (E-PPC)
5,(IY+55) (FLAGX)
NZ,#1097,CLEAR-SP
#196E,LINE-ADDR
#1695,LINE-NO
A,D
E
Vyzvedni číslo současného řádku,
ale skoč do předu,
jestliže jsi v modu INPUT.
Nalezni adresu začátku řádku a s ní
i jeho číslo.
Je-li obdržené číslo řádku nula,
Komentovaný výpis paměti ROM
JP
PUSH
INC
LD
INC
LD
LD
ADD
LD
LD
CALL
CALL
LD
EX
PUSH
LD
CALL
POP
DEC
DEC
Z,#1097,CLEAR-SP
HL
HL
C,(HL)
HL
B,(HL)
HL,#000A
HL,BC
B,H
C,L
#1F05,TEST-ROOM
#1097,CLEAR-SP
HL,(#5C51) (CURCHL)
(SP),HL
HL
A,#FF
#1601,CHAN-OPEN
HL
HL
(IY+15) (E-PPC-lo)
CALL #1855,OUT-LINE
INC (IY+15) (E-PPC-lo)
vyčisti jen editační oblast.
Uschovej adresu tohoto řádku.
Ulož si do BC
jeho délku.
Pak k této délce
přičti 10 a
výsledek opět
ulož do BC.
Testuj, je-li zde dostatek místa pro tento řádek.
Nyní vyčisti editační oblast.
Vyzvedni současnou adresu kanálu a
zaměň ji s adresou tohoto řádku.
Přechodně si ji ulož.
Aby mohl být řádek okopírován do editační oblasti,
otevři kanál "R".
Vyzvedni adresu řádku a postup
jeden bajt před řádek.
Zmenši číslo současného řádku, aby se zabránilo
vytisknutí kurzoru
a vytiskni basicový řádek.
Zvětši číslo řádku.
Poznámka: tyto úpravy někdy nesplní svou funkci a kurzor je vytisknut.
LD
INC
INC
INC
INC
LD
POP
CALL
RET
HL,(#5C59) (E-LINE)
HL
HL
HL
HL
(#5C5B),HL (K-CUR)
HL
#1615,CHAN-FLAG
Vyzvedni adresu řádky v editační oblasti a
přeskoč číslo řádku
a délku řádku tak,
abys nalezl pozici kurzoru.
Vyzvedni dřívější kanálovou adresu a
nastav příslušné vlajky.
Výstup do ED-LOOP.
EDITAČNÍ PODPROGRAM KURZOR DOLŮ
0FF3
ED-DOWN
1001
ED-STOP
BIT
JR
LD
CALL
JR
LD
JR
5,(IY+55) (FLAGX)
NZ,#1001,ED-STOP
HL,#5C49
#190F,LN-FETCH
#106E,ED-LIST
(IY+0),#10 (ERR-NR)
#1024,ED-ENTER
V INPUT modu
skoč dopředu.
Toto je E-PPC.
Je nalezeno číslo dalšího řádku a
je proveden nový automatický výpis.
Hlášení "STOP in INPUT".
Skoč dopředu.
EDITAČNÍ PODPROGRAM KURZOR DOLEVA
1007
ED-LEFT
CALL #1031,ED-EDGE
JR
#1011,ED-CUR
Kurzor je posunut.
Skok dopředu.
EDITAČNÍ PODPROGRAM KURZOR DOPRAVA
100C
ED-RIGHT
LD
CP
A,(HL)
#0D
Současný znak je testován a
jednalo-li se o ENTER,
Komentovaný výpis paměti ROM
61
1011
ED-CUR
RET
INC
LD
RET
Z
HL
(#5C5B),HL (K-CUR)
je proveden návrat.
Postav kurzor za znak.
Nastav systémovou proměnnou K-CUR.
PODPROGRAM DELETE V EDITU
1015
ED-DELETE
CALL #1031,ED-EDGE
LD
BC,#0001
JP
#19E8,RECLAIM-2
Posuň kurzor doleva.
zruš současný
znak.
PODPROGRAM ED-IGNORE
101E
ED-IGNORE
CALL #15D4,WAIT-KEY
CALL #15D4,WAIT-KEY
Další dva znaky z klávesnicového
vstupního podprogramu budou ignorovány.
PODPROGRAM ENTER EDIT
1024
ED-ENTER
1026
ED-END
POP
POP
POP
LD
BIT
RET
LD
RET
HL
HL
HL
(#5C3D),HL (ERR-SP)
7,(IY+0) (ERR-NR)
NZ
SP,HL
Návratové adresy
ED-LOOP a ED-ERROR jsou odhozeny.
Původní hodnota
ERR-SP je obnovena.
Jestliže nebyly
žádné chyby, vrať se.
Jinak proveď
nepřímý skok do chybového podprogramu.
PODPROGRAM ED-EDGE
Adresa je v registrovém páru HL a bude zmenšena v případě, že kurzor nebude stát mezi řídícími
znaky a jejich parametry.
1031
ED-EDGE
SCF
CALL
SBC
ADD
INC
POP
RET
PUSH
LD
LD
#1195,SET-DE
HL,DE
HL,DE
HL
BC
C
BC
B,H
C,L
DE obsahuje E-LINE (při editaci), nebo
WORKSP (při INPUTu).
CY flag bude nastaven, má-li být
kurzor na začátku řádku.
Oprava po odečtení.
Odhoď návratovou adresu
a vrať se přes ED-LOOP, bylo-li nastaveno CY.
Obnov návratovou adresu.
Ulož současnou adresu
kurzoru do registrového páru BC.
Tato smyčka zajistí, že řídící znaky nebudou odděleny od svých parametrů.
103E
62
ED-EDGE-1
LD
LD
INC
LD
H,D
L,E
HL
A,(DE)
AND
CP
JR
INC
LD
#F0
#10
NZ,#1051,ED-EDGE-2
HL
A,(DE)
HL bude ukazovat na
znak, který stojí
za znakem, na který ukazuje DE.
Vyzvedni kód znaku, který je adresován registrovým
párem DE.
Nejedná-li se o
znaky od INK až TAB
skoč dopředu.
Překroč jeden znak
a opět vyzvedni jeho kód.
Komentovaný výpis paměti ROM
SUB
ADC
#17
A,#00
Poznámka: Touto
instrukcí
implementovány, takže to nevadí.
1051
ED-EDGE-2
CY flag je při TAB.
nulován.
jsou
JR
INC
AND
SBC
ADD
NZ,#1051,ED-EDGE-2
HL
A
HL,BC
HL,BC
EX
JR
RET
DE,HL
C,#103E,ED-EDGE-1
odděleny
AT
a
TAB,
ale
ty
stejně
nejsou
v
této
formě
Skoč dopředu, pokud se nejedná o AT a TAB, které jsou-li
použity, mají dva parametry.
Připrav se na
pravdivé odečtení.
CY flag bude nastaven na nulu, když posouvaný ukazatel
dosáhne K-CUR.
Pro další smyčku použij posunutý ukazatel, ale
skoč zpět, jestliže jsi překročil K-CUR.
Poznámka: Bude to řídící znak, který bude vymazán použitím DELETE.
PODPROGRAM EDITAČNÍ KURZOR NAHORU
1059
106E
ED-UP
ED-LIST
BIT
RET
LD
CALL
EX
CALL
LD
CALL
CALL
LD
JP
5,(IY+55) (FLAGX)
NZ
HL,(#5C49) (E-PPC)
#196E,LINE-ADDR
DE,HL
#1695,LINE-NO
HL,#5C4A
#191C,LN-STORE
#1795,AUTO-LIST
A,#00
#1601,CHAN-OPEN
Vrať se, když jsi v modu INPUT.
Zjisti číslo současného řádku a
jeho počáteční adresu.
HL nyní ukazuje na předchozí řádek.
Číslo řádku je vyzvednuto.
Toto je systémová proměnná E-PPC.
Číslo řádku je uloženo.
Automatický listing je znovu zavolán a
potom
otevřen kanál "K" před návratem do ED-LOOP.
PODPROGRAM ED-SYMBOL
Jestliže byly použity kódy SYMBOL & GRAPHIC, budou ošetřeny následovně:
1076
ED-SYMBOL
107C
ED-GRAPH
BIT
JR
JP
7,(IY+55) (FLAGX)
Z,#1024,ED-ENTER
#0F81,ADD-CHAR
Skoč zpět, pokud
nejsi v INPUT LINE.
Skoč zpět.
PODPROGRAM ED-ERROR
Toto je vstupní bod, došlo-li k nějaké chybě.
107F
ED-ERROR
BIT
JR
LD
LD
LD
LD
CALL
JP
4,(IY+48) (FLAGS2)
Z,#1026,ED-END
(IY+0),#FF (ERR-NR)
D,#00
E,(IY-2) (RASP)
HL,#1A90
#03B5,BEEPER
#0F30,ED-AGAIN
Skoč zpět, používáš-li
jiný kanál než "K".
Zruš číslo chyby a
proveď zavrčení, než
se vrátíš do
editoru.
PODPROGRAM CLEAR-SP
Editační oblast nebo WORKSPACE jsou vyčištěny.
Komentovaný výpis paměti ROM
63
1097
CLEAR-SP
PUSH
CALL
DEC
CALL
LD
LD
POP
RET
HL
#1190,SET-HL
HL
#19E5,RECLAIM-1
(#5C5B),HL (K-CUR)
(IY+7),#00 (MODE)
HL
Uschovej ukazatel prostoru.
DE bude ukazovat na první bajt a HL na poslední.
Uprav hodnotu.
Nyní se zruší potřebný počet bajtů.
Systémové proměnné K-CUR a
MODE "K mode" jsou nastaveny před
vyzvednutím ukazatele a provedením
návratu.
PODPROGRAM PRO VSTUP KLÁVESY
Tento důležitý podprogram vrací kód poslední stištěné klávesy, ale povšimněte si, že klávesa
CAPS LOCK, změny modů a změny barevných parametrů jsou v tomto podprogramu také zpracovány.
10A8
KEY-INPUT
BIT
CALL
AND
BIT
RET
LD
RES
PUSH
BIT
CALL
POP
CP
JR
CP
JR
CP
JR
3,(IY+2) (TV-FLAG)
NZ,#111D,ED-COPY
A
5,(IY+1) (FLAGS)
Z
A,(#5C08) (LAST-K)
5,(IY+1) (FLAGS)
AF
5,(IY+2) (TV-FLAG)
NZ,#0D6E,CLS-LOWER
AF
#20
NC,#111B,KEY-DONE
#10
NC,#10FA,KEY-CONTR
#06
NC,#10DB,KEY=M&CL
Okopíruj editační nebo inputový řádek
na obrazovku, jestliže byl změněn mód.
Vrať se s CY flag=0 a Z flag=0,
jestliže nebyla stištěna žádná nová klávesa
Jestliže byla, vyzvedni kód a poznač vyzvednutí.
Přechodně si uschovej kód a smaž dolní část obrazovky
a vyčisti
dolní část obrazovky, pokud je třeba (např. po “scroll?“)
Vyzvedni kód a
akceptuj všechny znaky a kódy pro tokens.
Skoč dopředu při téměř všech kódech pro řídící znaky.
Skoč dopředu s kódem pro CAPS LOCK nebo pro změnu "mode".
Nyní se vypořádej s FLASH, BRIGHT a INVERSE.
LD
AND
LD
LD
RRA
ADD
JR
B,A
#01
C,A
A,B
A,#12
#1105,KEY-DATA
Ulož si kód.
Ponech si pouze bit 0.
C obsahuje #00 (=off) nebo #01
Vyzvedni kód.
Jednou ho rotuj, čím přijdeš o
Přičti #12 kvůli BRIGHT, FLASH
a pokračuj dále s parametrem v
(=on).
bit 0.
a INVERSE
C.
Kód pro CAPS LOCK a kód modů jsou ošetřeny místně.
10DB
KEY-M&CL
10E6
KEY-MODE
64
JR
LD
LD
XOR
LD
JR
CP
RET
SUB
LD
CP
LD
JR
LD
NZ,#10E6,KEY-MODE
HL,#5C6A
A,#08
(HL)
(HL),A
#10F4,KEY-FLAG
#0E
C
#0D
HL,#5C41
(HL)
(HL),A
NZ,#10F4,KEY-FLAG
(HL),#00
Skoč s kódy modů.
Toto je FLAGS2.
Flipuj
bit 3 FLAGS2.
Jedná se o vlajku CAPS LOCK.
Skoč dopředu.
Zkontroluj dolní limit.
Sniž rozsah.
Toto je MODE.
Bylo změněno?
Vlož kód nového
mode a skoč, když bylo změněno.
Jinak nastav "L" mode.
Komentovaný výpis paměti ROM
10F4
KEY-FLAG
SET
CP
RET
3,(IY+2) (TV-FLAG)
A
Signál mode mohlo být změněno.
Nuluj CY flag a
vrať se.
Nyní jsou zpracovány kódy řídících znaků (mimo FLASH, BRIGHT a INVERSE) pro barvy (16-23 INK a
24-31 PAPER).
10FA
KEY-CONTR
LD
AND
LD
LD
BIT
JR
INC
B,A
#07
C,A
A,#10
3,B
NZ,#1105,KEY-DATA
A
Uschovej kód.
Nastav registr C na
#00 až #07.
Registr A nyní obsahuje kód pro INK.
Ale nebyl-li kód definován pomocí SHIFTu,
nastav registr A na hodnotu PAPER.
Parametr je nyní uschován v proměnné K-DATA a kanálová adresa je změněna z KEY-INPUT na
KEY-NEXT.
1105
KEY-DATA
LD
LD
JR
(IY-45),C (K-DATA)
DE,#110D
#1113,KEY-CHAN
Ulož parametr.
Toto je KEY-NEXT.
Skoč dopředu.
Poznámka: Při prvním průchodu přes KEY-INPUT je v registru A vrácena hodnota kontrolního kódu.
Při dalším vstupu přes KEY-NEXT se vrací parametr.
110D
KEY-NEXT
LD
LD
A,(#5C0D) (K-DATA)
DE,#10A8
Vyzvedni parametr.
Toto je KEY-INPUT.
Nyní nastav vstupní adresu na první kanálovou oblast.
1113
KEY-CHAN
LD
INC
INC
LD
INC
LD
HL,(#5C40) (CHANS)
HL
HL
(HL),E
HL
(HL),D
Vyzvedni kanálovou adresu.
Nyní nastav vstupní adresu.
Konečně výstup s požadovaným kódem v registru A.
111B
KEY-DONE
SCF
RET
Signalizuj, že kód byl nalezen a
vrať se.
PODPROGRAM PRO OKOPÍROVÁNÍ DOLNÍ ČÁSTI OBRAZOVKY
Tento podprogram je volán kdykoli má být řádek z editační oblasti nebo z oblasti INPUTu
vytisknut na obrazovku.
111D
ED-COPY
CALL
RES
RES
LD
PUSH
LD
PUSH
LD
PUSH
LD
LD
PUSH
#0D4D,TEMPS
3,(IY+2) (TV-FLAG)
5,(IY+2) (TV-FLAG)
HL,(#5C8A) (S-POSNL)
HL
HL,(#5C3D) (ERR-SP)
HL
HL,#1167
HL
(#5C3D),SP (ERR-SP)
HL,(#5C82) (ECHO-E)
HL
Použij permanentní barvy.
Signál: mód nezměněn
Signál: Nečistit dolní část obrazovky.
Uschovej současnou hodnotu S-POSNL.
Uschovej současnou hodnotu ERR-SP.
Toto je ED-FULL.
Uschovej tuto hodnotu na zásobník
a tím se tato hodnota stane vstupním bodem při chybě.
Ulož na zásobník hodnotu ECHO-E.
Komentovaný výpis paměti ROM
65
SCF
CALL
EX
CALL
EX
CALL
LD
EX
EX
CALL
#1195,SET-HL
DE,HL
#187D,OUT-LINE2
DE,HL
#18E1,OUT-CURS
HL,(#5C8A) (S-POSNL)
(SP),HL
DE,HL
#0D4D,TEMPS
Zbytek řádku, který
permanentního PAPERu.
1150
ED-BLANK
115E
ED-SPACES
LD
SUB
JR
JR
LD
SUB
JR
LD
PUSH
CALL
POP
JR
byl
právě
HL bude ukazovat na začátek prostoru a
DE na jeho konec.
Zaměň ukazatele.
Vytiskni řádek.
Opět zaměň ukazatele a
vytiskni kurzor.
Potom vyzvedni současnou hodnotu S-POSNL a
zaměň ji s ECHO-E.
Předej ECHO-E do DE.
Opět vyzvedni permanentní barvy.
obsluhován
A,(#5C8B)(S-POSNL-hi)
D
C,#117C,ED-C-DONE
NZ,#115E,ED-SPACES
A,E
(IY+80) (S-POSNL-lo)
NC,#117C,ED-C-DONE
A,#20
DE
#09F4,PRINT-OUT
DE
#1150,ED-BLANK
je
nyní
vyplněn
mezerami,
tištěnými
v
barvách
Vyzvedni číslo současného řádku a
odečti číslo starého řádku.
Skoč vpřed, není-li třeba dodat mezery.
Skoč vpřed, jestliže se nenacházíš na stejném řádku.
Vyzvedni staré číslo sloupce a
odečti ho od nového čísla sloupce.
Skoč, když není zapotřebí mezerovat.
Toto je mezera.
Uschovej staré hodnoty.
Vytiskni mezeru.
Vyzvedni staré hodnoty.
A skoč opět zpět.
Nyní ošetři jakoukoli chybu.
1167
ED-FULL
LD
LD
LD
CALL
LD
LD
JR
D,#00
E,(IY-2) (RASP)
HL,#1A90
#03B5,BEEPER
(IY+0),#FF (ERR-NR)
DE,(#5C8A) (S-POSNL)
#117E,ED-C-END
Zavrč.
Zruš číslo chyby.
Vyzvedni současnou hodnotu S-POSNL a
skoč dopředu.
Zde je normální výstup po dokončení kopírování editačního řádku.
117C
ED-C-DONE
POP
POP
DE
HL
Hodnota nové pozice.
a adresa chyby.
Sem ale přijde po chybě.
117E
ED-C-END
POP
LD
POP
PUSH
CALL
POP
LD
LD
RET
HL
(#5C3D),HL (ERR-SP)
BC
DE
#0DD9,CL-SET
HL
(#5C82),HL (ECHO-E)
(IY+38),#00(X-PRT-hi)
Stará hodnota ERR-SP
je obnovena.
Vyzvedni starou hodnotu S-POSNL a
uschovej hodnoty nové pozice.
Nastav systémové proměnné a starou
hodnotu S-POSNL dej
do ECHO-E.
X-PRT-hi je vynulována a je proveden
návrat.
PODPROGRAM NA NASTAVENÍ "HL" A "DE"
Tyto podprogramy vrací registry HL a DE tak, že HL ukazuje na první a DE na poslední lokaci
editačního prostoru nebo WORKSPACE.
66
Komentovaný výpis paměti ROM
1190
SET-HL
1195
SET-DE
LD
DEC
AND
LD
BIT
RET
LD
RET
LD
RET
HL,(#5C61) (WORKSP)
HL
A
DE,(#5C59) (E-LINE)
5,(IY+55) (FLAGX)
Z
DE,(#5C61) (WORKSP)
C
HL,(#5C63) (STKBOT)
Ukazuj na poslední lokaci editační
oblasti.
Nuluj CY flag.
Ukazuj na začátek editační oblasti a
jsi-li v editačním
módu, vrať se.
Jinak změň DE a
vrať se, bylo-li to úmyslem.
Vyzvedni STKBOT
a vrať se.
PODPROGRAM ODSTRANĚNÍ FP
Tento podprogram odstraňuje skryté floating point formy z BASICového řádku.
11A7
REMOVE-FP
LD
CP
LD
CALL
LD
INC
CP
JR
RET
A,(HL)
#0E
BC,#0006
Z,#19E8,RECLAIM-2
A,(HL)
HL
#0D
NZ,#11A7,REMOVE-FP
Všechny znaky jsou postupně ohledány.
Je to značka čísla?
Číslo zabírá šest míst.
Zrušení FP čísla pokud je třeba.
Vyzvedni opět tento kód.
Posuň ukazatel.
Je to CR? (=ENTER)
Opakuj když ne,
jinak proveď návrat.
Komentovaný výpis paměti ROM
67
PROVÁDĚCÍ PODPROGRAMY
INICIAČNÍ PODPROGRAM
Hlavní vstupní bod do tohoto podprogramu je na START/NEW (#11CB). Při vstupu ze startu (#0000),
například je-li do systému při zapojení poprvé přivedeno napětí, registr A obsahuje #00 a registr DE
obsahuje #FFFF. Nicméně vstupní bod může být též dosažen při vykonání příkazu NEW.
PODPROGRAM PŘÍKAZU NEW
11B7
NEW
DI
LD
LD
EXX
LD
LD
LD
EXX
Zakázáno maskované přerušení.
Signál: NEW.
Existující hodnota systémové proměnné RAMTOP vyzvednuta.
Zrcadlové registry
BC,(#5CB4) (P-RAMT)
jsou naplněny
DE,(#5C38) (RASP/PIP) těmito systémovými
HL,(#5C7B) (UDG)
proměnnými, které mají být rovněž
uschovány.
A,#FF
DE,(#5CB2) (RAMTOP)
Hlavní vstupní bod.
11CB
START/NEW
LD
LD
OUT
LD
LD
DEFB
DEFB
B,A
A,#07
(#FE),A
A,#3F
I,A
#00,#00,#00
#00,#00,#00
Uschovej signál pro
pozdější použití.
Barva pro BORDER: bílá.
Nastav registr I na hodnotu #3F.
Čekej 24 T stavů.
Nyní se bude kontrolovat paměť.
11DA
RAM-CHECK
11DC
RAM-FILL
11E2
RAM-READ
11EF
RAM-DONE
LD
LD
LD
DEC
CP
JR
AND
SBC
ADD
INC
JR
DEC
JR
H,D
L,E
(HL),#02
HL
H
NZ,#11DC,RAM-FILL
A
HL,DE
HL,DE
HL
NC,#11EF,RAM-DONE
(HL)
Z,#11EF,RAM-DONE
DEC
JR
DEC
(HL)
Z,#11E2,RAM-READ
HL
Přenes hodnotu v
registrovém páru DE do HL (START = #FFFF, NEW = RAMTOP).
Ulož hodnotu #02 do
všech paměťových
míst nad #3FFF.
Připrav se pro
pravdivý odečet.
CY flag=0 při dosažení konce,
Uprav ukazatel.
Skoč, jsi-li na konci.
#02 se mění na #01.
Ale je-li zde nula, znamená to že paměť je vadná.
Použij současnou hodnotu HL jako nejvyšší možnou adresu.
#01 se mění na #00.
Průchod dalším testem, dokud nedošlo k selhání.
HL ukazuje na poslední provozuschopné místo.
Nyní budou obnoveny původní uschované systémové proměnné (což nemá žádný smysl jestliže program
běží od STARTu).
EXX
LD
LD
LD
EXX
INC
JR
68
Přepni registry.
(#5CB4),BC (P-RAMT)
Obnov P-RAMT
(#5C38),DE (RASP/PIP) RASP/PIP a
(#5C7B),HL (UDG)
UDG.
Přepni registry.
B
Testuj signál START/NEW.
Z,#1219,RAM-SET
Skoč dopředu, přicházíš-li z podprogramu NEW.
Komentovaný výpis paměti ROM
Přepiš systémové proměnné, jestliže přicházíš od STARTu, a inicializuj oblast UDG.
LD
LD
LD
EX
LDDR
EX
INC
LD
DEC
LD
LD
(#5CB4),HL (P-RAMT)
DE,#3EAF
BC,#00A8
DE,HL
To je maximální fyzická adresa RAM.
Poslední bajt písmene "U" ve znakovém souboru.
Toto je počet bajtů pro 21 písmen.
Přepni ukazatele.
Nyní okopíruj znakové formy písmen "A" až "U".
Přepni zpět.
Ukazuj na první bajt
a nastav UDG.
O jedno místo dolů.
DE,HL
HL
(#5C7B),HL (UDG)
HL
BC,#0040
(#5C38),BC (RASP/PIP) Nastav systémové proměnné RASP a PIP.
Zbytek tohoto podprogramu je společný jak pro START, tak pro NEW.
1219
RAM-SET
LD
LD
LD
(#5CB2),HL (RAMTOP)
HL,#3C00
(#5C36),HL (CHARS)
Nastav RAMTOP a
systémovou
proměnnou CHARS.
Nyní nastav zásobník.
LD
LD
DEC
LD
DEC
DEC
LD
HL,(#5CB2) (RAMTOP)
(HL),#3E
HL
SP,HL
HL
HL
(#5C3D),HL (ERR-SP)
Jeho nejvyšší místo bude obsahovat
hodnotu #3E.
Další místo je ponecháno, aby obsahovalo nulu.
Tato dvě místa reprezentující poslední úložku.
Přeskoč dvě místa,
abys získal správnou hodnotu pro ERR-SP.
Iniciační podprogram pokračuje takto:
IM
LD
EI
1
IY,#5C3A
LD
LD
LD
LD
EX
LDIR
EX
DEC
LD
INC
LD
LD
LD
INC
LD
LD
HL,#5CB6
(#5C4F),HL (CHANS)
DE,#15AF
BC,#0015
DE,HL
INC
LD
INC
LD
HL
(HL),#80
HL
(#5C61),HL (WORKSP)
DE,HL
HL
(#5C57),HL
HL
(#5C53),HL
(#5C4B),HL
(HL),#80
HL
(#5C59),HL
(HL),#0D
(DATDD)
Přerušovací mód IM 1.
IY obsahuje vždy hodnotu ERR-NR.
Maskované přerušení bude povoleno, hodiny nastaveny a
každou 1/50 sec. test klávesnice.
Bázová adresa
oblasti kanálových informací.
Počáteční kanálová data jsou přesunuta z tabulky
(na adrese #15AF)
do oblasti kanálových informací.
Systémová proměnná DATADD je nastavena tak, aby ukazovala
na poslední místo
oblasti kanálových dat.
A proměnné PROG a VARS na místo za ní.
(PROG)
(VARS)
(E-LINE)
Ulož koncový znak této oblasti.
Jedno místo dopředu
pro správnou hodnotu E-LINE.
Zajisti, aby v editační oblasti byl pouze znak CR
(=ENTER).
Nyní vlož další
koncový bajt a
pohni se znovu dopředu, abys získal
hodnoty pro WORKSP,
Komentovaný výpis paměti ROM
69
LD
LD
LD
LD
LD
LD
LD
LD
DEC
DEC
LD
LD
LD
LDIR
SET
CALL
LD
CALL
XOR
LD
CALL
SET
JR
(#5C63),HL (STKBOT)
(#5C65),HL (STKEND)
A,#38
(#5C8D),A (ATTR-P)
(#5C8F),A (ATTR-T)
(#5C48),A (BORDCR)
HL,#0523
(#5C09),HL (REPDEL)
(IY-58) (KASTATE-0)
(IY-54) (KASTATE-4)
HL,#15C6
DE,#5C10
BC,#000E
STKBOT a STKEND.
Inicializuj systémové proměnné pro
barvy na: BORDER 7,
INK 0, PAPER 7,
BRIGHT 0 a FLASH 0.
Hodnota pro systémové proměnné
REPDEL a REPPER.
Na KSTATE-0 ulož hodnotu #FF
Na KSTATE-4 #FF
Přenes data z tab. proudových dat do
informační oblasti
proudových dat.
1,(IY+1) (FLAGS)
#0EDF,CLEAR-PRB
(IY+49),#02 (DF-SZ)
#0D6B,CLS
A
DE,#1538
#0C0A,PO-MSG
5,(IY+2)
(TV-FLAG)
#12A9,MAIN-1
Signál: používá se tiskárna.
Nuluj bafr tiskárny.
Nastav velikost dolní části obrazovky a smaž
celý displej.
Tiskni sdělení
'© 1982 Sinclair Research Ltd'
na spodní řádek obrazovky.
Signál: spodní část obrazovky bude třeba smazat.
Skok do hlavní prováděcí smyčky.
HLAVNÍ PROVÁDĚCÍ SMYČKA
Tato smyčka se v paměti rozkládá od adresy #12A2 až do adresy #15AE a řídí editační mod,
provádění přímých příkazů a výpisy sdělení.
12A2
MAIN-EXEC
12A9
MAIN-1
12AC
MAIN-2
LD
(IY+49),#02 (DF-SZ)
CALL #1795,AUTO-LIST
CALL #16B0,SET-MIN
LD
CALL
CALL
CALL
BIT
JR
BIT
JR
LD
CALL
LD
JR
A,#00
#1601,CHAN-OPEN
#0F2C,EDITOR
#1B17,LINE-SCAN
7,(IY+0) (ERR-NR)
NZ,#12CF,MAIN-3
4,(IY+48) (FLAGS-2)
Z,#1303,MAIN-4
HL,(#5C59) (E-LINE)
#11A7,REMOVE-FP
(IY+0),#FF (ERR-NR)
#12AC,MAIN-2
Dolní část obrazovky bude velká dva řádky.
Je proveden automatický výpis.
Všechny oblasti od E-LINE dopředu budou mít minimální
velikost.
Kanál "K"
je otevřen.
Je zavolán editor, aby uživatel mohl vytvořit nový řádek,
ve kterém je následovně ošetřena syntaxe.
Je-li v pořádku,
skok dopředu.
Při použití jiného kanálu než "K" je
proveden skok dopředu.
Ukazuj na začátek řádku kde je chyba.
Odstraň FP formy z tohoto řádku, nastav
ERR-NR na "OK" a
skoč na MAIN-2, aniž by se ve výpisu cokoliv změnilo.
Editovaný řádek prošel syntaxí a nyní je třeba rozlišit tři různé typy řádků.
12CF
70
MAIN-3
LD
LD
CALL
LD
OR
JR
RST
CP
JR
HL,(#5C59) (E-LINE)
(#5C5D),HL (CH-ADD)
#19FB,E-LINE-NO
A,B
C
NZ,#155D,MAIN-ADD
#18
#0D
Z,#12A2,MAIN-EXEC
Ukazuj na začátek řádku a tam také
nastav CH-ADD.
Vyzvedni jakékoliv číslo řádku do BC a
je-li to platné číslo řádku,
skoč dopředu a zařaď jej do programu.
Vyzvedni první znak tohoto řádku a
podívej se, jestli jde o řádek nebo o pouhý CR (=ENTER).
Skoč zpět, bylo-li tomu tak.
Komentovaný výpis paměti ROM
Editovaný řádek musí začínat přímým basicovým příkazem, takže tento se stává prvním, který bude
interpretován.
BIT
CALL
CALL
LD
SUB
LD
SET
LD
LD
CALL
0,(IY+48) (FLAGS2)
NZ,#0DAF,CL-ALL
#0D6E,CLS-LOWER
A,#19
(IY+79) (S-POSN-hi)
(#5C8C),A (SCR-CT)
7,(IY+1) (FLAGS)
(IY+0),#FF (ERR-NR)
(IY+10),#01 (NSPPC)
#1B8A,PROG-RUN
Celá obrazovka bude
smazána v případě potřeby,
jinak jen spodní část.
Nastav příslušné
hodnoty pro
rolovací čítač.
Signál: vykonání řádku.
Zajištění hodnoty "OK", na ERR-NR a
ošetření prvního příkazu v řádku.
Nyní proveď tento řádek.
Poznámka: na zásobník bude uložena hodnota #1303 a bude adresována systémovou proměnnou ERR-SP.
Po interpretaci řádku a po vykonání všech z toho vyplývajících akcí se program vrací do MAIN-4,
aby mohlo být vytisknuto hlášení.
1303
1313
133C
MAIN-4
MAIN-G
MAIN-5
HALT
RES
BIT
CALL
LD
INC
PUSH
LD
LD
LD
LD
LD
LD
CALL
5,(IY+1) (FLAGS)
1,(IY+48) (FLAGS2)
NZ,#0ECD,COPY-BUFF
A,(#5C3A) (ERR-NR)
A
AF
HL,#0000
(IY+55),H (FLAGX)
(IY+38),H (X-PTR-hi)
(#5C0B),HL (DEFADD)
HL,#0001
(#5C16),HL (STRMS-6)
#16B0,SET-MIN
RES
CALL
SET
POP
LD
CP
JR
ADD
CALL
LD
RST
LD
LD
CALL
XOR
LD
CALL
LD
CALL
LD
RST
LD
LD
CALL
5,(IY+55) (FLAGX)
#0D6E,CLS-LOWER
5,(IY+2) (TV-FLAG)
AF
B,A
#0A
C,#133C,MAIN-5
A,#07
#15EF,OUT-CODE
A,#20
#10,PRINT-A-1
A,B
DE,#1391
#0C0A,PO-MSG
A
DE,#1536
#0C0A,PO-MSG
BC,(#5C45) (PPC)
#1A1B,OUT-NUM1
A,#3A
#10,PRINT-A-1
C,(IY+13) (SUBPPC)
B,#00
#1A1B,OUT-NUM1
Musí být obnoveno maskované přerušení.
Signál: možno další klávesu.
Byl-li použit bafr tiskárny, bude
vyčištěn.
Vyzvedni číslo chyby
a zvětši ho.
Uschovej si tuto novu hodnotu.
Nuluj systémové proměnné FLAGX,
X-PTR-hi a DEFADD.
Zajisti, aby proud #00
ukazoval na kanál "K".
Vyčisti všechny pracovní oblasti a kalkulátorový
zásobník.
Signál editační mód.
Vyčisti dolní část obrazovky.
Dolní část obrazovky bude potřeba vyčistit.
Vyzvedni hodnotu hlášení,
okopíruj ji do B a
s čísly hlášení 0-9
skoč dopředu.
Přičti doplněk ASCII znaku.
Vytiskni kód sdělení
a vlož mezeru.
Vyzvedni znovu hodnotu sdělení
a použij ji k
identifikaci sdělení.
Vytiskni sdělení a udělej za ním čárku a mezeru.
Vyzvedni číslo aktuálního řádku a
také ho vytiskni.
Dále vytiskni ":".
Vyzvedni číslo aktuálního příkazu
do registru BC a
vytiskni ho.
Komentovaný výpis paměti ROM
71
1373
1376
1384
1386
MAIN-6
MAIN-7
MAIN-8
MAIN-9
CALL
LD
INC
JR
CP
JR
CP
JR
INC
LD
LD
LD
#1097,CLEAR-SP
A,(#5C3A) (ERR-NR)
A
Z,#1386,MAIN-9
#09
Z,#1373,MAIN-6
#15
NZ,#1376,MAIN-7
(IY+13) (SUBPPC)
BC,#0003
DE,#5C70
HL,#5C44
BIT
JR
ADD
LDDR
LD
RES
JP
7,(HL) (NSPPC)
Z,#1384,MAIN-8
HL,BC
(IY+10),#FF (NS-PPC)
3,(IY+1) (FLAGS)
#12AC,MAIN-2
Vyčisti editační oblast.
Vyzvedni opět číslo chyby a zvětši
ho jako obvykle.
Skoč dopředu, nedošlo-li k chybě.
Byl-li program zastaven příkazem STOP či BREAK,
skoč dopředu.
Jinak bude proměnná SUBPPC nezměněna.
Zvyš SUBPPC na následující příkaz.
Systémové proměnné OLDPPC a OSPPC musí být upraveny
tak, aby ukazovaly na číslo příkazu ve správném řádku,
kde se bude pokračovat. Hodnoty, které budou použity,
budou nalezeny v
PPC a SUBPPC, pokud ovšem NSPPC neukazuje, že k BREAKu
došlo při skoku (např. GOTO).
NSPPC je nastavena tak, aby ukazovala "žádný skok".
Je nastaven "K" mod a je proveden skok,ale tak, aby nebyl
proveden programový výpis, pokud to není třeba.
CHYBOVÁ HLÁŠENÍ
Poslední znak každého hlášení je "invertován" (+#80).
1391
1392
1394
13A4
13B6
13C6
13D2
13DF
13ED
1401
140C
141A
142A
143E
144F
1463
146E
147F
148F
149C
14AC
14BE
14CC
14DE
14EC
14FA
1508
1516
1525
DEFB #80
Report 0
Report 1
Report 2
Report 3
Report 4
Report 5
Report 6
Report 7
Report 8
Report 9
Report A
Report B
Report C
Report D
Report E
Report F
Report G
Report H
Report I
Report J
Report K
Report L
Report M
Report N
Report O
Report P
Report Q
Report R
-
zde se překročí počáteční bajt
"OK"
“NEXT without FOR“
“Variable not found“
"Subscript wrong"
"Out of memory"
"Out of screen"
"Number too big"
"RETURN without GOSUB"
"End of file"
"STOP statement"
"Invalid argument"
"Integer out of range"
"Nonsense in BASIC"
"BREAK - CONT repeats"
"Out of DATA"
"Invalid file name"
"No room for line"
"STOP in INPUT"
"FOR without NEXT"
"Invalid I/O device"
"Invalid colour"
"BREAK into program"
"RAMTOP no good"
"Statement lost"
"Invalid stream"
"FN without DEF"
"Parameter error"
"Tape loading error"
Jsou zde také ještě následující dvě sdělení:
1537
72
", "
-"čárka" a "mezera"
Komentovaný výpis paměti ROM
1539
"© 1982 Sinclair Research Ltd"
1555
REPORT-G
LD
LD
JP
A,#10
BC,#0000
#1313,MAIN-G
"G" má kód "10+07+30"
Nuluj BC.
Skoč zpět na tisk hlášení G.
PODPROGRAM MAIN-ADD
Tento podprogram umožňuje basicovému řádku, aby mohl být přidán do existujícího basicového
programu v programové oblasti. Existuje-li jak nová, tak i stará verze řádku se stejným číslem, pak
bude starý řádek zničen. Pokud nový řádek obsahuje pouze svoje číslo, nebude do programu zařazen.
155D
157D
MAIN-ADD
MAIN-ADD1
LD
LD
EX
LD
PUSH
(#5C49),BC (E-PPC)
HL,(#5C5D) (CH-ADD)
DE,HL
HL,#1555
HL
LD
SCF
SBC,
PUSH
LD
LD
CALL
JR
CALL
CALL
POP
LD
DEC
OR
JR
PUSH
INC
INC
INC
INC
DEC
LD
PUSH
CALL
POP
LD
POP
PUSH
INC
LD
DEC
DEC
LDDR
LD
EX
POP
LD
DEC
LD
HL,(#5C61) (WORKSP)
HL,DE
HL
H,B
L,C
#196E,LINE-ADDR
NZ,#157D,MAIN-ADD1
#19B8,NEXT-ONE
#19E8,RECLAIM-2
BC
A,C
A
B
Z,#15AB,MAIN-ADD2
BC
BC
BC
BC
BC
HL
DE,(#5C53) (PROG)
DE
#1655,MAKE-ROOM
HL
(#5C53),HL (PROG)
BC
BC
DE
HL,(#5C61) (WORKSP)
HL
HL
HL,(#5C49) (E-PPC)
DE,HL
BC
(HL),B
HL
(HL),C
Nechť je číslo nového řádku aktuálním číslem.
Vyzvedni CH-ADD a
uschovej její adresu v DE.
Uschovej adresu hlášení "G" na zásobník, kam
ukazuje i ERR-SP.
Vyzvedni WORKSP.
Najdi délku řádku
od místa za číslem řádku až po znak CR (=ENTER) a tuto
délku uschovej.
Přenes číslo řádku
do HL.
Existuje již číslo takového řádku?
Skoč, když ne.
Najdi délku starého
řádku a znič ho.
Vyzvedni délku nového řádku, ale
jednalo-li se pouze
o číslo řádku +CR,
skoč dopředu.
Uschovej délku.
Jsou zapotřebí
čtyři místa navíc.
Dvě pro číslo a
dvě pro délku.
Nastav HL tak, aby ukazovalo před místo určení.
Uschovej současnou hodnotu PROG, aby
se zabránilo zhroucení po přidání jednoho řádku.
Místo pro přidání jednoho řádku je vytvořeno.
Stará hodnota PROG je vyzvednuta a
obnovena.
Kopie délky řádku (bez parametrů)
je vyzvednuta.
DE ukazuje na poslední místo nové oblasti a HL na
CR (=ENTER) v
novém řádku, který
je v editační oblasti.
Nyní překopíruj celý řádek.
Vyzvedni číslo nového řádku.
Adresa určení jde do HL a číslo do DE.
Vyzvedni délku nového řádku a
ulož její vyšší a
nižší bajt.
Komentovaný výpis paměti ROM
73
Nyní si povšimněte, že dvoubajtová hodnota udávající číslo řádku zde na rozdíl od systému
procesoru Z80 ukládána v opačném pořadí.
15AB
MAIN-ADD2
DEC
LD
DEC
LD
POP
JP
HL
(HL),E
HL
(HL),D
AF
#12A2,MAIN-EXEC
Nižší bajt čísla řádku !!
Vyšší bajt čísla řádku !!
Odhoď adresu hlášení "G" a po
odskoku zpět proveď i automatický výpis.
POČÁTEČNÍ KANÁLOVÉ INFORMACE
Na počátku existují čtyři kanály "K", "S", "R" a "P" pro komunikaci s klávesnicí, obrazovkou,
pracovním prostorem a tiskárnou. Data jsou uložena v tomto pořadí: adresa vstupního podprogramu,
adresa výstupního podprogramu a kód kanálu.
15AF
15C3
DEFW
DEFW
DEFB
DEFW
DEFW
DEFB
DEFW
DEFW
DEFB
DEFW
DEFW
DEFB
DEFB
09F4
10A8
4B
09F4
15C4
53
0F81
15C4
52
09F4
15C4
50
80
15C4
REPORT-J
RST #08,ERROR-1
DEFB #12
15B4
15B9
15BE
PRINT-OUT
KEY-INPUT
'K'
PRINT-OUT
REPORT-J
'S'
ADD-CHAR
REPORT-J
'R'
PRINT-OUT
REPORT-J
'P'
Koncový znak.
Ohlaš:
J-Invalid I/O device
POČÁTEČNÍ PROUDOVÁ DATA
Na počátků existuje sedm proudů: od #FD do #03.
15C6
15C8
15CA
15CC
15CE
15D0
15D2
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
#01,
#06,
#0B,
#01,
#01,
#06,
#10,
#00
#00
#00
#00
#00
#00
#00
proud
proud
proud
proud
proud
proud
proud
#FD
#FE
#FF
#00
#01
#02
#03
směřuje
směřuje
směřuje
směřuje
směřuje
směřuje
směřuje
ke
ke
ke
ke
ke
ke
ke
kanálu
kanálu
kanálu
kanálu
kanálu
kanálu
kanálu
'K'
'S'
'R'
'K'
'K'
'S'
'P'
PODPROGRAM ČEKEJ NA KLÁVESU
Tento podprogram je řídící podprogram pro volání aktuálních vstupních podprogramů.
15D4
WAIT-KEY
15DE
WAIT-KEY1
BIT
JR
SET
CALL
RET
JR
5,(IY+2) (TV-FLAG)
NZ,#15DE,WAIT-KEY1
3,(IY+2) (TV-FLAG)
#15E6,INPUT-AD
C
Z,#15DE,WAIT-KEY1
Není-li třeba čistit dolní část obrazovky
skoč dopředu.
Jinak signál: "posuzuj mód jako kdyby se změnil".
Volej vstupní podprogram nepřímo přes INPUT-AD.
Vrať se s akceptovatelnými kódy.
Skoč, nebyla-li stištěna žádná klávesa.
Jsou-li CY i Z nastaveny na nulu, znamená to, že nebylo stištěno žádné tlačítko a došlo k
nějaké chybě.
74
Komentovaný výpis paměti ROM
15E4
REPORT-8
RST #08,ERROR-1
DEFB #07
Ohlaš:
8-End of file.
PODPROGRAM INPUT-AD
Registry jsou uschovány a HL ukazuje na adresu vstupního podprogramu.
15E6
INPUT-AD
EXX
PUSH
LD
INC
INC
JR
Uschovej registry.
HL
HL,(#5C51) (CURCHL)
HL
HL
#15F7,CALL-SUB
Vyzvedni bázovou adresu aktuální kanálové informace.
Překroč výstupní adresu a
skoč dopředu.
HLAVNÍ TISKOVÝ PODPROGRAM
Tento podprogram je volán buď s absolutní hodnotou nebo řádným znakovým kódem v registru A.
15EF
OUT-CODE
15F2
PRINT-A-2
LD
ADD
EXX
PUSH
LD
E,#30
A,E
HL
HL,(#5C51) (CURCHL)
Hodnota v registru A je zvýšena o #30.
Uschovej registry.
Vyzvedni bázovou adresu aktuální kanálové informace.
Tato ukazuje na výstupní podprogram.
Nyní volej skutečný podprogram. HL ukazuje na adresu vstupního nebo výstupního podprogramu.
15F7
CALL-SUB
LD
INC
LD
EX
CALL
POP
EXX
RET
E,(HL)
HL
D,(HL)
DE,HL
#162C,CALL-JUMP
HL
Vyzvedni nižší bajt.
Vyzvedni vyšší bajt.
Přenes adresu do HL.
Zavolej požadovaný podprogram.
Obnov registry.
Odtud bude proveden návrat, pokud cestou nedošlo k chybě.
PODPROGRAM CHAN-OPEN
Do tohoto podprogramu vstupuje v registru A platné číslo proudu (normálně #FD až #03) a v
závislosti na tomto čísle je otevřen příslušný kanál.
1601
160E
CHAN-OPEN
REPORT-O
ADD
ADD
LD
LD
LD
INC
LD
LD
OR
JR
RST
DEFB
A,A
A,#16
L,A
H,#5C
E,(HL)
HL
D,(HL)
A,D
E
NZ,#1610,CHAN-OP-1
#08,ERROR-1
#17
Hodnota v registru A je zdvojena a
dále zvětšena o #16.
Výsledek je předán do L.
Adresa #5C16 je bázovou adresou pro proud #00.
Vyzvedni první a
druhý bajt požadovaných kanálových dat.
Skoč dopředu, nejsou-li oba bajty nulové, jinak
ohlaš:
O-Invalid stream
S použitím proudových dat nyní najdi bázovou adresu kanálové informace, která souvisí s daným
kanálem.
1610
CHAN-OP-1
DEC
DE
Sniž proudová data.
Komentovaný výpis paměti ROM
75
LD
ADD
HL,(#5C4F) (CHANS)
HL,DE
Toto je bázová adresa informační oblasti kanálových dat
v níž bude nyní nalezena požadovaná adresa.
PODPROGRAM CHAN-FLAG
Tento podprogram nastavuje příslušné vlajky pro různé kanály.
1615
162C
CHAN-FLAG
CALL-JUMP
LD
RES
INC
INC
INC
INC
LD
LD
CALL
RET
LD
LD
ADD
JP
(#5C51),HL (CURCHL)
4,(IY+48) (FLAGS2)
HL
HL
HL
HL
C,(HL)
HL,#162D
#16DC,INDEXER
NC
D,#00
E,(HL)
HL,DE
(HL)
V HL je bázová adresa daného kanálu.
Signál: používá se jiný kanál než "K".
Překroč výstupní a
vstupní adresy.
Vyzvedni kód kanálu.
Toto je bázová adresa tabulky kanálových kódů.
Hledej v této tabulce a urči vhodný doplněk, ale
vrať se v případě, že jsi nenalezl vhodný kanálový kód.
Předej doplněk
do registrového páru DE a
skoč dopředu na
příslušný podprogram, nastavující flag.
TABULKA KANÁLOVÝCH KÓDŮ
162D
162F
1631
1633
DEFB
DEFB
DEFB
DEFB
4B 06 kanál 'K' ofset #06
53 12 kanál 'S' ofset #12
50 1B kanál 'P' ofset #1B
00
koncová značka.
adresa #1634
adresa #1642
adresa #164D
PODPROGRAM FLAG KANÁLU " K "
1634
CHAN-K
SET
RES
SET
JR
0,(IY+2) (TV-FLAG)
5,(IY+1) (FLAGS)
4,(IY+48) (FLAGS2)
#1646,CHAN-S-1
Signál: užita dolní část obrazovky.
Signál: připraven přijmout další klávesu.
Signál: použit kanál "S".
Skok dopředu.
PODPROGRAM FLAG KANÁLU " S "
1642
1646
CHAN-S
CHAN-S-1
RES
RES
JP
0,(IY+2) (TV-FLAG)
1,(IY+1) (FLAGS)
#0D4D,TEMPS
Signál: užita hlavní část obrazovky.
Signál: tiskárna není právě používána.
Vrať se přes TEMPS, aby byly nastaveny správné barvy.
PODPROGRAM FLAG KANÁLU " P "
164D
76
CHAN-P
SET
RET
1,(IY+1) (FLAGS)
Signál: nyní bude použita tiskárna.
Komentovaný výpis paměti ROM
PODPROGRAM "VYTVOŘ PROSTOR"
Toto je velmi důležitý podprogram. Je volán při mnoha příležitostech, aby vytvořil nějaký
prostor. Proto musí HL ukazovat na adresu za prvním bajtem požadovaného prostoru a v BC musí být délka
požadovaného prostoru. Je-li vyžadován prostor o velikosti jediného bajtu, vstupuje se do tohoto
podprogramu v bodě ONE-SPACE.
1652
1655
ONE-SPACE
MAKE-ROOM
LD
BC,#0001
PUSH HL
CALL #1F05,TEST-ROOM
POP
CALL
LD
EX
LDDR
RET
HL
#1664,POINTERS
HL,(#5C65) (STKEND)
DE,HL
Pouze jeden bajt.
Uschovej ukazatel.
Zjisti, zda je zde dost volné paměti pro požadovaný
prostor.
Obnov ukazatel.
Změň všechny ukazatele, než vytvoříš žádaný prostor.
Ulož do HL hodnotu STKEND.
Zaměň "staré" a "nové".
Nyní vytvoř prostor
a vrať se.
Poznámka: Po návratu z tohoto podprogramu ukazuje registr HL na místo před novým prostorem a
registr DE ukazuje na poslední bajt nově vytvořeného prostoru. Nový prostor může být popsán takto: od
(HL)+1 až do (DE) včetně. Nicméně "nové místa" mají i své "staré adresy" a tak je možno popsat nový
prostor také takto: od (HL)+2 až do (DE)+1. Ve skutečnosti se zdá, že programátor dával přednost
druhému popisu, a to může být matoucí.
PODPROGRAM "UKAZATELÉ"
Kdykoliv je vytvářen nebo rušen nějaký prostor, musí být všechny ukazatele, které nějak souvisí
s tímto prostorem, nastaveny. Na vstupu obsahuje registrový pár BC počet bajtů, o které se bude
jednat, a registrový pár HL adresu místa před novým prostorem.
1664
POINTERS
PUSH
PUSH
LD
LD
AF
HL
HL,#5C4B
A,#0E
Tyto registry jsou uschovány.
Kopíruj adresu "pozice".
Toto je VARS, první
ze čtrnácti systémových ukazatelů (proměnných).
Tato smyčka sice obslouží všechny ukazatele, ale změněny budou jenom ty, které ukazují za danou
"pozici".
166B
167F
PTR-NEXT
PTR-DONE
LD
INC
LD
EX
AND
SBC
ADD
EX
JR
PUSH
EX
ADD
EX
LD
DEC
LD
INC
POP
INC
DEC
JR
E,(HL)
HL
D,(HL)
(SP),HL
A
HL,DE
HL,DE
(SP),HL
NC,#167F,PTR-DONE
DE
DE,HL
HL,BC
DE,HL
(HL),D
HL
(HL),E
HL
DE
HL
A
NZ,#166B,PTR-NEXT
Vyzvedni dva bajty současného ukazatele.
Zaměň systémové proměnné s adresou "pozice".
CY flag bude, nastaven
jestliže má být hodnota této proměnné pozměněna.
Obnov "pozici".
Skoč dopředu, jestliže se nemá tento ukazatel měnit.
Jinak uschovej starou hodnotu.
Nyní k ní přičti hodnotu v BC
a vlož tuto novou hodnotu do systémové proměnné.
Nejprve vyšší bajt,
pak nižší.
Ukazuj znovu na první bajt.
Vyzvedni starou hodnotu.
Ukazuj na další systémovou proměnou
a jestliže nebylo posouzeno všech 14 syst. proměnných,
vracej se zpět do smyčky.
Komentovaný výpis paměti ROM
77
Nalezení velikosti bloku, který se bude přesouvat.
EX
POP
POP
AND
SBC
LD
LD
INC
ADD
EX
RET
DE,HL
DE
AF
A
HL,DE
B,H
C,L
BC
HL,DE
DE,HL
Stará hodnota STKEND jde do HL
a hodnoty
ostatních registrů jsou obnoveny.
Nyní nalezni rozdíl mezi starou hodnotou STKEND
a "pozicí".
Převeď výsledek
do BC
a zvyš o 1 pro bajt navíc.
Uprav zpět na starou hodnotu STKEND
a převeď ji do DE
před návratem.
PODPROGRAM VYZVEDNUTÍ ČÍSLA ŘÁDKU
Na vstupu ukazuje HL na místo, které má být posouzeno. Jestliže se na tomto místě nachází
bajt, jehož hodnota je vyšší bajt čísla řádku, vrací se toto číslo v DE. V opačném případě se stejným
způsobem otestuje lokace adresovaná DE a jestliže ani tato nesplňuje podmínku, vrací se číslo řádku 0.
168F
LINE-ZERO
1691
LINE-NO-A
DEFB
DEFB
EX
LD
#00
#00
DE,HL
DE,#168F
Číslo řádku 0.
Posuzuj druhý ukazatel.
Použij řádek číslo 0.
Obvyklý vstupní bod je na LINE-NO.
1695
LINE-NO
LD
AND
JR
LD
INC
LD
RET
A,(HL)
#C0
NZ,#1691,LINE-NO-A
D,(HL)
HL
E,(HL)
Vyzvedni vyšší bajt
a testuj.
Skoč, je-li nevhodný.
Vyzvedni vyšší bajt.
Vyzvedni nižší bajt.
Vrať se.
PODPROGRAM "REZERVUJ MÍSTO"
Tento podprogram je většinou volán použitím RST #30,BC-SPACES. V tomto vstupním bodě se však
předpokládá, že na zásobníku je uložen WORKSP a pod
ním počet míst, která mají být rezervována.
Podprogram vytváří prostor mezi pracovním prostorem a zásobníkem kalkulátoru.
169E
RESERVE
LD
DEC
HL,(#5C63) (STKBOT)
HL
CALL
INC
INC
POP
LD
POP
EX
INC
RET
#1655,MAKE-ROOM
HL
HL
BC
(#5C61),BC (WORKSP)
BC
DE,HL
HL
Vyzvedni aktuální hodnotu STKBOT
a zmenši ji k získání poslední lokace pracovního
prostoru.
Vytvoř BC míst.
Ukazuj na druhý
bajt nového prostoru.
Vyzvedni starou hodnotu WORKSP
a obnov ji.
Obnov BC, tedy počet míst.
Zaměň ukazatele.
HL ukazuje na první z přemístěných bajtů.
Návrat.
Poznámka: Lze také tvrdit, že po návratu z podprogramu ukazuje DE na první bajt "navíc" a HL na
poslední bajt "navíc", když tyto bajty navíc byly přidány za původní místo (HL)+1.
78
Komentovaný výpis paměti ROM
PODPROGRAM SET-MIN
Tento podprogram nastavuje editační oblast a následné oblasti na jejich minimální hodnoty, tedy
je vlastně "čistí".
16B0
SET-MIN
LD
LD
LD
INC
LD
INC
LD
HL,(#5C59) (E-LINE)
(HL),#0D
(#5C5B),HL (K-CUR)
HL
(HL),#80
HL
(#5C61),HL (WORKSP)
Vyzvedni E-LINE.
Editační oblast bude obsahovat pouze znak CR
následovaný
koncovým
bajtem.
Další pozice bude
začátek WORKSP a pokračujeme čištěním.
Vstup zde způsobí "vyčištění" pracovního prostoru a zásobníku kalkulátoru.
16BF
SET-WORK
LD
LD
HL,(#5C61) (WORKSP)
(#5C63),HL (STKBOT)
Vyzvedni WORKSP.
Toto čistí pracovní prostor.
Vstup zde způsobí "vyčištění" pouze zásobníku kalkulátoru.
16C5
SET-STK
LD
LD
HL,(#5C63) (STKBOT)
(#5C65),HL (STKEND)
Vyzvedni STKBOT.
Toto "čistí" zásobník.
Ve všech případech nastav permanentní hodnotu MEM.
PUSH
LD
LD
POP
RET
HL
HL,#5C92
(#5C68),HL (MEM)
HL
Uschovej STKEND.
Na tuto adresu
nastav MEM.
Obnov STKEND do HL.
Vrať se.
ZNIČENÍ EDITAČNÍHO ŘÁDKU
16D4
REC-EDIT
LD
JP
DE,(#5C59) (E-LINE)
#19E5,RECLAIM-1
Vyzvedni E-LINE.
Proveď "zničení".
PODPROGRAM "INDEXER"
Tento podprogram se používá ve více případech a slouží k prohledávání tabulek. Vstupní bod je
INDEXER.
16DB
16DC
INDEXER-1
INDEXER
INC
LD
AND
RET
CP
INC
JR
SCF
RET
HL
A,(HL)
A
Z
C
HL
NZ,#16DB,INDEXER-1
Postup na posouzení dalšího páru.
Vyzvedni první pár
a je-li to koncový znak #00,
vrať se.
Porovnej s dodaným znakem.
Ukazatel na další položku.
Skákej zpět, když nebyla nalezena správná položka.
Při úspěšném nálezu je nastaven CY
a provede se návrat.
PODPROGRAM PŘÍKAZU CLOSE#
Tento příkaz dává uživateli možnost zavírat proudy. Pro proudy #00 až #03 jsou jejich data
neustále systémem obnovována, a proto je nelze zavřít.
16E5
CLOSE
CALL #171E,STR-DATA
Jsou vyzvednuta existující data proudu.
Komentovaný výpis paměti ROM
79
16FC
CLOSE-1
CALL
LD
LD
EX
ADD
JR
LD
ADD
LD
INC
LD
EX
LD
INC
LD
RET
#1701,CLOSE-2
BC,#0000
DE,#A3E2
DE,HL
HL,DE
C,#16FC,CLOSE-1
BC,#15D4
HL,BC
C,(HL)
HL
B,(HL)
DE,HL
(HL),C
HL
(HL),B
Ověř kód kanálu tohoto proudu.
Připrav si nuly pro vynulování proudu.
Připrav si hodnoty pro identifikaci
použití proudů #00 až #03.
Testuj.
Pro proudy #04 až #OF se nastaví CY a provede skok.
Jinak nalezni správné hodnoty
v tabulce iniciačních proudových dat.
Vyzvedni
iniciační data
pro proudy #00 až #03.
Nyní vlož data, a to buď obě nuly,
nebo
iniciační
hodnoty
a vrať se.
PODPROGRAM CLOSE-2
Kód kanálu připojeného k zavíranému proudu musí být "K", "S", nebo "P".
1701
CLOSE-2
PUSH
LD
ADD
INC
INC
INC
LD
EX
LD
CALL
LD
LD
ADD
JP
HL
HL,(#5C4F) (CHANS)
HL,BC
HL
HL
HL
C,(HL)
DE,HL
HL,#1716
#16DC,INDEXER
C,(HL)
B,#00
HL,BC
(HL)
Uschovej adresu proudových dat.
Vyzvedni bázovou adresu oblasti
kanálových informací
a nalezni kanálová data
pro proud,
který je právě
zavírán.
Uschovej ukazatel.
Báze tabulky uzavírání proudů.
Nalezni správný doplněk.
Převeď doplněk
do BC,
přičti ho k bázi
a skoč do příslušného podprogramu.
TABULKA UZAVÍRÁNÍ PROUDŮ
1716
1718
171A
DEFB #4B #05
DEFB #53 #03
DEFB #50 #01
kanál 'K', doplněk #05, adresa 171C
kanál 'S', doplněk #03, adresa 171C
kanál 'P', doplněk #01, adresa 171C
Poznámka: Tato tabulka nemá koncový bajt.
PODPROGRAM ZAVŘI PROUD
171C
CLOSE-STR
POP
RET
HL
Vyzvedni ukazatel oblasti kanálových dat
a vrať se.
PODPROGRAM PROUDOVÁ DATA
Podprogram vrací proudová data pro daný proud v registrovém páru DE.
171E
80
STR-DATA
CALL #1E94,STK-TO-A
CP
#10
JR
C,#1727,STR-DATA1
Číslo proudu jde ze zásobníku kalkulátoru do registru A.
Jestliže je číslo proudu větší než #0F,
vyvolá se chybové hlášení.
Komentovaný výpis paměti ROM
1725
REPORT-O
RST #08,ERROR-1
DEFB #17
Ohlaš:
O-Invalid stream.
Zde se pokračuje s platnými čísly proudů.
1727
STR-DATA1
ADD
RLCA
LD
LD
LD
ADD
LD
INC
LD
DEC
RET
A,#03
Úprava na rozsah #03 až #12.
Úprava na rozsah #06 až #24.
Bázová adresa oblasti proudových dat.
Kode proudu
jde do BC.
Výpočet adresy v oblasti proudových dat
a přenesení
nalezených dat
do BC.
Ukazatel zpět na první bajt dat.
Návrat.
HL,#5C10
C,A
B,#00
HL,BC
C,(HL)
HL
B,(HL)
HL
PODPROGRAM PŘÍKAZU OPEN#
Tento příkaz poskytuje uživateli možnost otevírat proudy. Musí být udán kód kanálu, a to "K",
"k", "S", "s", "P", nebo "p". Povšimněte si, že není snaha přidělit proudům #00 až #03 jejich
iniciační hodnoty.
1736
1756
OPEN
OPEN-1
RST
DEFB
DEFB
CALL
LD
OR
JR
EX
LD
ADD
INC
INC
INC
LD
EX
CP
JR
CP
JR
CP
JR
CALL
LD
INC
LD
RET
#28,FP-CALC
#01,záměna
#38, konec výpočtu
#171E,STR-DATA
A,B
C
Z,#1756,OPEN-1
DE,HL
HL,(#5C4F) (CHANS)
HL,BC
HL
HL
HL
A,(HL)
DE,HL
#4B
Z,#1756,OPEN-1
#53
Z,#1756,OPEN-1
#50
NZ,#1725,REPORT-O
#175D,OPEN-2
(HL),E
HL
(HL),D
PODPROGRAM OPEN-2
Podprogram nalezne
otevíranému proudu.
175D
OPEN-2
příslušné
Použij kalkulátor.
Záměna čísla proudu
a kód kanálu.
Vyzvedni data pro proud.
Jsou-li datové bajty
nulové, znamená to že proud byl uzavřen
a provede se skok.
Uschovej DE.
Vyzvedni bázovou adresu
oblasti kanálových informací
a nalezni
kód kanálu,
který je připojen
k právě otevíranému proudu.
Obnov DE.
Získaný kód musí být "K",
nebo "S",
nebo "P",
jinak skok na chybové hlášení.
Vyzvedni příslušná data do DE.
Vlož tyto data
do dvou bajtů
v oblasti proudových dat
a vrať se.
proudové
PUSH HL
CALL #2BF1,STK-FETCH
datové
bajty
pro
kanál,
který
je
připojen
k
právě
Uschovej HL.
Vyzvedni parametry kódu kanálu.
Komentovaný výpis paměti ROM
81
1765
REPORT-F
LD
OR
JR
RST
DEFB
A,B
C
NZ,#1767,OPEN-3
#08,ERROR-1
#0E
Jestliže výraz
má nulovou hodnotu,
vyvolej chybové hlášení.
Ohlaš:
F-Invalid file name.
Pokračuj zde, pokud se nevyskytla žádná chyba.
1767
OPEN-3
PUSH
LD
AND
LD
LD
CALL
JR
LD
LD
ADD
POP
JP
BC
A,(DE)
#DF
C,A
HL,#177A
#16DC,INDEXER
NC,#1765,REPORT-F
C,(HL)
B,#00
HL,BC
BC
(HL)
Je uschována délka výrazu.
Vyzvedni první znak.
Převeď malá písmena na velká
a přenos kódu do C.
Bázová adresa tabulky otevírání proudů.
Vyhledej požadovaný doplněk.
Skoč zpět, nebyl-li nalezen.
Převeď
doplněk do BC.
HL nyní ukazuje na začátek příslušného podprogramu.
Vyzvedni délku výrazu
a skoč do příslušného podprogramu.
DEFB
DEFB
DEFB
DEFB
#4B #06
#53 #08
#50 #0A
#00
kanál 'K', doplněk #06, adresa 1781
kanál 'S', doplněk #08, adresa 1785
kanál 'P', doplněk #0A, adresa 1789
koncový znak.
LD
JR
E,#01
#178B,OPEN-END
Datové bajty budou #01 a #00.
LD
JR
E,#06
#178B,OPEN-END
Datové bajty budou #06 a #00.
LD
DEC
LD
OR
JR
LD
POP
RET
E,#10
BC
A,B
C
NZ,#1765,REPORT-F
D,A
HL
Datové bajty budou #10 a #00.
Zkrať délku výrazu
a pokud se nejednalo
o jediný znak,
skoč na chybové hlášení.
Vynuluj D,
vyzvedni HL
a vrať se.
TABULKA OTVÍRÁNÍ PROUDŮ
177A
177C
177E
1780
PODPROGRAM OPEN-K
1781
OPEN-K
PODPROGRAM OPEN-S
1785
OPEN-S
PODPROGRAM OPEN-P
1789
178B
OPEN-P
OPEN-END
PŘÍKAZY CAT, ERASE, FORMAT & MOVE
V systému standardního SPECTRA vede použití těchto příkazů k vyvolání chybového hlášení.
Podrobné informace lze najít v knize "Komentovaný výpis strojového kódu stínové ROM v Interface 1".
82
Komentovaný výpis paměti ROM
1793
CAT-ETC
JR
#1725,REPORT-O
Skok na chybové hlášení.
PŘÍKAZY LIST & LLIST
Podprogramy v této části monitoru produkují výpis aktuálního programu. U každého řádku je
posouzeno číslo, jsou expandovány tokens a umístěn aktuální programový kurzor. Vstupní bod AUTOLIST
je používán jak podprogramem hlavní prováděcí smyčky, tak editorem k vytvoření jedné stránky výpisu.
Ukazatel zásobníku je uschován, což umožňuje opětné nastavení zásobníkové paměti po vykonání
výpisu (viz. PO-SCR,#0C55).
1795
AUTO-LIST
LD
LD
CALL
SET
LD
CALL
RES
SET
LD
LD
AND
SBC
ADD
JR
(#5C3F),SP (LIST-SP)
(IY+2),#10 (TV-FLAG)
#0DAF,CL-ALL
0,(IY+2) (TV-FLAG)
B,(IY+49) (DF-SZ)
#0E44,CL-LINE
0,(IY+2) (TV-FLAG)
0,(IY+48) (FLAGS2)
HL,(#5C49) (E-PPC)
DE,(#5C6C) (S-TOP)
A
HL,DE
HL,DE
C,#17E1,AUTO-L-2
Uschovej ukazatel zásobníku.
Signál: automatický výpis na hlavní obrazovce.
Vyčisti tuto část obrazovky.
Přepni na editační oblast.
Vyčisti také
dolní část obrazovky.
Přepni zpět z editační oblasti.
Signál: obrazovka je čistá.
Vyzvedni číslo aktuálního řádku
a číslo "automatického" řádku.
Jestliže číslo
aktuálního řádku
je menší než číslo "automatického" řádku,
skoč dopředu.
Je třeba upravit "automatické" číslo tak, aby se aktuální řádek objevil na spodní části hlavní
obrazovky.
PUSH
CALL
LD
EX
SBC
EX
DE
#196E,LINE-ADDR
DE,#02C0
DE,HL
HL,DE
(SP),HL
CALL #196E,LINE-ADDR
POP BC
Uschovej "automatické" číslo.
Najdi adresu začátku aktuálního řádku
a vytvoř adresu zhruba
jednu "obrazovku"
před ním a výsledek
uschovej na zásobníku a vyzvedni číslo "automatického"
řádku.
Adresa "automatického" řádku do HL.
"Výsledek" jde do BC.
Vstup do smyčky. Při každém průchodu smyčkou je zvýšeno číslo "automatického" řádku dokud se
aktuální řádek neobjeví ve výpisu.
17CE
AUTO-L-1
PUSH BC
CALL #19B8,NEXT-ONE
POP
ADD
JR
EX
LD
INC
LD
DEC
LD
JR
BC
HL,BC
C,#17E4,AUTO-L-3
DE,HL
D,(HL)
HL
E,(HL)
HL
(#5C6C),DE (S-TOP)
#17CE,AUTO-L-1
Uschovej "výsledek".
Najdi adresu řádku následujícího za "automatickým"
řádkem (v DE).
Vyzvedni výsledky,
proveď výpočet
a skoč dopředu, je-li hotovo.
Převeď adresu dalšího řádku do HL
a vyzvedni
jeho
číslo do DE.
Nastav S-TOP
a pokračuj s tímto dalším řádkem.
Nyní může dojít k automatickému výpisu.
Komentovaný výpis paměti ROM
83
17E1
17E4
AUTO-L-2
AUTO-L-3
17ED
AUTO-L-4
LD
LD
CALL
JR
EX
CALL
RES
RET
(#5C6C),HL (S-TOP)
HL,(#5C6C) (S-TOP)
#196E,LINE-ADDR
Z,#17ED,AUTO-L-4
DE,HL
#1833,LIST-ALL
4,(IY+2) (TV-FLAG)
Pro případ, že E-PPC je menší než S-TOP.
Vyzvedni číslo nejvyššího řádku
a jeho adresu.
Nebyla-li nalezena,
použij adresu v DE.
Výpis.
Do tohoto místa se provede návrat, pokud nebylo
zapotřebí rolování k vypsání aktuálního řádku.
VSTUPNÍ BOD LLIST
Je nutné otevření kanálu pro tiskárnu.
17F5
LLIST
LD
JR
A,#03
#17FB,LIST-1
Proud #03
a skok dopředu.
VSTUPNÍ BOD LIST
Je nutné otevření kanálu pro obrazovku.
17F9
17FB
LIST
LIST-1
1814
LIST-2
181A
LIST-3
181F
1822
LIST-4
LIST-5
1833
LIST-ALL
LD
LD
CALL
CALL
RST
CALL
JR
RST
CP
JR
CP
JR
RST
CALL
JR
CALL
JR
CALL
CALL
CALL
LD
AND
LD
LD
LD
CALL
LD
A,#02
(IY+2),#00 (TV-FLAG)
#2530,SYNTAX-Z
NZ,#1601,CHAN-OPEN
#18,GET-CHAR
#2070,STR-ALTER
C,#181F,LIST-4
#18,GET-CHAR
#3B
Z,#1814,LIST-2
#2C
NZ,#181A,LIST-3
#20,NEXT-CHAR
#1C82,EXPT-1NUM
#1822,LIST-5
#1CE6,USE-ZERO
#1822,LIST-5
#1CDE,FETCH-NUM
#1BEE,CHECK-END
#1E99,FIND-INT
A,B
#3F
H,A
L,C
(#5C49),HL (E-PPC)
#196E,LINE-ADDR
E,#01
Proud #02
a signál: Obyčejný výpis v hlavní části obrazovky.
Při kontrole syntaxe
kanál neotvírej.
Vyzvedni aktuální znak do A
a podívej se, je-li nutné měnit proud.
Skoč, když proud nebyl změněn.
Vyzvedni aktuální znak do A.
Je-li to středník,
skoč.
Je-li to čárka,
neskoč.
Vyzvedni další znak a zvyš CH-ADD.
Musí následovat číselný výraz (například LIST #5,20).
Skoč s tímto dopředu.
Použij nulu
a skoč dopředu.
Vyzvedni jakýkoliv řádek pokud nebyl zadán.
V případě kontroly syntaxe, přejdi na další příkaz.
Číslo řádku do BC.
Vyšší bajt do A.
Limitace vyššího bajtu na správnou velikost
a převedení celého
čísla řádku do HL.
Nastav E-PPC.
Najdi adresu tohoto nebo nejbližšího existujícího řádku.
Signál: "před aktuálním řádkem".
Vstup do řídící smyčky pro výpis série řádků.
1835
84
LIST-ALL-1
CALL
RST
BIT
JR
LD
SUB
JR
XOR
#1855,OUT-LINE
#10,PRINT-A-1
4,(IY+2) (TV-FLAGS)
Z,#1835,LIST-ALL-1
A,(#5C6B) (DF-SZ)
(IY+79) (S-POSN-hi)
NZ,#1835,LIST-ALL-1
E
Vypiš celý basicový řádek.
"Návrat vozíku".
Pokud neprovádíš automatický výpis
skoč zpět.
Zbývá-li ještě místo
v hlavní části obrazovky,
rovněž skoč.
Jestliže obrazovka je již plná a aktuální řádek
Komentovaný výpis paměti ROM
RET
PUSH
PUSH
LD
CALL
POP
POP
JR
Z
HL
DE
HL,#5C6C
#190F,LN-FETCH
DE
HL
#1835,LIST-ALL-1
byl vytištěn, vrať se.
Nicméně pokud aktuální řádek vytištěn nebyl,
je potřeba
zvýšit S-TOP
a tisknout
další řádek
při použití rolování.
Skok zpět do smyčky.
VYPSÁNÍ CELÉHO BASICOVÉHO ŘÁDKU
Na vstupu ukazuje HL na začátek řádku, tedy na vyšší bajt čísla řádku. Než bude číslo vypsáno,
zjistí se, zdali řádek stojí před a nebo za aktuálním řádkem.
1855
OUT-LINE
1865
OUT-LINE1
187D
1881
OUT-LINE2
OUT-LINE3
LD
CALL
LD
JR
LD
BC,(#5C49) (E-PPC)
#1980,CP-LINES
D,#3E
Z,#1865,OUT-LINE1
DE,#0000
RL
E
LD
LD
CP
POP
RET
PUSH
CALL
INC
INC
INC
RES
LD
AND
JR
RST
SET
PUSH
EX
RES
LD
RES
BIT
JR
SET
(IY+45),E (BREG)
A,(HL)
#40
BC
NC
BC
#1A28,OUT-NUM-2
HL
HL
HL
0,(IY+1) (FLAGS)
A,D
A
Z,#1881,OUT-LINE3
#10,PRINT-A-1
0,(IY+1) (FLAGS)
DE
DE,HL
2,(IY+48) (FLAGS2)
HL,#5C3B
2,(HL)
5,(IY+55) (FLAGSX)
Z,#1894,OUT-LINE4
2,(HL)
Vyzvedni číslo aktuálního řádku
a porovnávej.
Kurzor aktuálního řádku do D.
Skok dopředu, tiskneš aktuální řádek.
Nuly do DE a E na #01, jestliže řádek stojí před
aktuálním řádkem a
E na #00,stojí-li na něm nebo za
(CY flag přichází z CP-LINES).
Uschovej značku.
Vyzvedni vyšší bajt čísla řádku
a je-li výpis u konce,
zahoď návratovou adresu
a proveď plný návrat.
Vrať návratovou adresu
a tiskni číslo řádku včetně úvodních mezer.
Posuň
ukazatel
na první příkazový kód v řádku.
Signál: Úvodní mezera povolena.
Vyzvedni kód kurzoru
a pokud jej není třeba tisknout,
skoč dopředu.
Tiskni kurzor.
Signál: už žádná mezera.
Úschova DE.
Ukazatel do DE.
Signál: ne v uvozovkách.
Toto je FLAGS.
Signál: tisk v modu K.
Pokud nejsi v inputu,
skoč dopředu.
Signál: tisk v modu L.
Zde je vstup do smyčky, která tiskne všechny znaky až do konce basicového řádku a v případě
potřeby přeskočí čísla v FP formě.
1894
OUT-LINE4
18A1
OUT-LINE5
LD
AND
SBC
JR
LD
CALL
CALL
EX
LD
HL,(#5C5F) (X-PTR)
A
HL,DE
NZ,#18A1,OUT-LINE5
A,#3F
#18C1,OUT-FLASH
#18E1,OUT-CURS
DE,HL
A,(HL)
Vyzvedni ukazatel syntaktické chyby
a v případě, že není
potřeba tisknout chybový znak,
skoč dopředu.
Nyní tiskni chybový znak.
Je to blikající otazník.
Případný tisk kurzoru.
Ukazatel do HL.
Vyzvedni znak.
Komentovaný výpis paměti ROM
85
CALL
INC
CP
JR
EX
CALL
JR
#18B6,NUMBER
HL
#0D
Z,#18B4,OUT-LINE6
DE,HL
#1937,OUT-CHAR
#1894,OUT-LINE4
Jedná-li se o FP identifikační bajt,nebude číslo vypsáno.
Posuň ukazatel pro další průchod.
Je-li aktuální znak "CR",
skoč dopředu.
Ukazatel do DE.
Tiskni znak.
Zpět do smyčky.
Řádek byl vytisknut.
18B4
OUT-LINE6
POP
RET
PODPROGRAM "NUMBER"
Jestliže registr
reprezentaci čísla.
18B6
NUMBER
CP
RET
INC
INC
INC
INC
INC
INC
LD
RET
DE
A
Obnovení DE
a návrat.
obsahuje
příznak
#0E
NZ
HL
HL
HL
HL
HL
HL
A,(HL)
čísla
t.j.
#0E,
potom
bude
HL
ukazovat
za
vnitřní
Je to příznak čísla ?
Pokud ne vrať se.
Posuň ukazatel o šest bajtů dopředu.
Tím se přeskočí příznak čísla
a pět bajtů vnitřní reprezentace čísla
v pohyblivé řádová čárce.
Před návratem vyzvedni kód za číslem.
PODPROGRAM PRO TISK BLIKAJÍCÍHO ZNAKU
Tímto podprogramem jsou tisknuty kurzory - normální i chybový.
18C1
OUT-FLASH
EXX
LD
PUSH
RES
SET
LD
LD
LD
PUSH
LD
CALL
POP
LD
POP
LD
EXX
RET
HL,(#5C8F) (ATTR-T)
HL
7,H
7,L
(#5C8F),HL
HL,#5C91
D,(HL)
DE
(HL),#00
#09F4,PRINT-OUT
HL
(IY+87),H (P-FLAG)
HL
(#5C8F),HL (ATTR-T)
Schovej registry.
Ulož ATTR-T a MASK-T
na zásobník.
Poznač blikání jako
aktivní.
Tyto hodnoty dej jako aktivní do ATTR-T a MASK-T.
Tahle adresa je P-FLAG.
Ulož P-FLAG
na zásobník.
Nastav standardní hodnoty
Vytiskni znak.
Obnov hodnotu P-FLAG.
Obnov hodnoty ATTR-T a MASK-T.
Obnov registry.
Návrat.
PODPROGRAM PRO TISK KURZORU
Pokud je nastavena správná pozice pro tisk kurzoru, vytiskne
'C','E','G','K' nebo 'L'. V případě nesprávné pozice se provede návrat.
18E1
86
OUT-CURS
LD
AND
HL,(#5C5B) (K-CUR)
A
se
jeden
z
kurzorů
Vyzvedni adresu kurzoru
a pokud není na správném
Komentovaný výpis paměti ROM
18F3
OUT-C-1
1909
OUT-C-2
SBC
RET
LD
RLC
JR
ADD
JR
LD
RES
LD
BIT
JR
SET
INC
BIT
JR
LD
PUSH
CALL
POP
RET
HL,DE
NZ
A,(#5C41) (MODE)
A
Z,#18F3,OUT-C-1
A,#43
#1909,OUT-C-2
HL,#5C3B
3,(HL)
A,#4B
2,(HL)
Z,#1909,OUT-C-2
3,(HL)
A
3,(IY+72) (FLAGS)
Z,#1909,OUT-C-2
A,#43
DE
#18C1,OUT-FLASH
DE
místě,
proveď návrat.
Vyzvedni platnou hodnotu režimu
a vynásob ji 2.
Skoč dopředu pokud není režim EXTEND nebo GRAPHICS.
Přičti ofset - získá se znak 'E' nebo 'G'.
Jdi ho vytisknout.
Tohle je adresa FLAGS.
Režim 'K'.
Vezmi znak "K".
Skoč vytisknout "K", pokud je ovšem
nastaven režim 'K'.
Je tedy režim 'L' nebo 'C'.
Uprav znak na "L".
Pokud je nastaven režim 'C',
vezmi jako kurzor
znak "C".
Ulož DE registr.
Tiskni blikající znak kurzoru.
Obnov DE.
Vrať se.
PODPROGRAM VYZVEDNUTÍ ČÍSLA ŘÁDKU
Na vstupu adresuje HL systémovou proměnnou S-TOP nebo E-PPC. Po návratu obsahuje S-TOP nebo
E-PPC číslo následujícího řádku.
190F
LN-FETCH
LD
INC
LD
PUSH
EX
INC
CALL
CALL
POP
E,(HL)
HL
D,(HL)
HL
DE,HL
HL
#196E,LINE-ADDR
#1695,LINE-NO
HL
Vyzvedni
číslo řádku
z dané systémové proměnné
a uschovej ukazatel.
Nalezená hodnota jde do HL
a je zvětšena.
Je nalezena adresa tohoto, nebo následujícího řádku
a jeho číslo.
Obnovení ukazatele na systémovou proměnnou.
Tento vstupní bod je používán editorem.
191C
LN-STORE
BIT
RET
LD
DEC
LD
RET
5,(IY+55) (FLAGX)
NZ
(HL),D
HL
(HL),E
Pokud jsi v modu INPUT,
vrať se.
Ulož
číslo řádku
na požadovanou systémovou proměnnou
a vrať se.
TISK ZNAKŮ BASICOVÉHO ŘÁDKU
Opakovaným voláním tohoto podprogramu je zajištěn tisk všech znaků a tokens v basicovém řádku.
Vstupní bod OUT-SP-NO se používá pro tisk čísel řádků, která vyžadují úvodní mezery.
1925
OUT-SP-2
192A
OUT-SP-NO
LD
AND
RET
JR
XOR
A,E
A
M
#1937,OUT-CHAR
A
A obsahuje #20 pro mezeru a #FF pro "mezeru".
Testuj tuto hodnotu
a vrať se, nemá-li být mezera.
Skoč na vytisknutí mezery.
Vynuluj A.
HL obsahuje číslo řádku a BC hodnotu pro opakované odčítání. (BC=-1000, -100 nebo -10).
Komentovaný výpis paměti ROM
87
192B
OUT-SP-1
ADD
INC
JR
SBC
DEC
JR
JP
HL,BC
A
C,#192B,OUT-SP-1
HL,BC
A
Z,#1925,OUT-SP-2
#15EF,OUT-CODE
Pokusné odečtení.
Počítej každý pokus.
Skoky zpět do vyčerpání.
Vrať poslední odečet
a nepočítej ho.
Jestliže nebylo možné provést odečítání, skoč zpět
na případný tisk mezery. Jinak vytiskni číslici.
Vstupní bod OUT-CHAR se používá pro tisk znaků, tokens a řídících znaků.
1937
OUT-CHAR
195A
OUT-CH-1
1968
196C
OUT-CH-2
OUT-CH-3
CALL
JR
CP
JR
RES
CP
JR
CP
JR
BIT
JR
BIT
JR
JR
CP
JR
PUSH
LD
XOR
LD
POP
SET
RST
RET
#2D1B,NUMERIC
NC,#196C,OUT-CH-3
#21
C,#196C,OUT-CH-3
2,(IY+1) (FLAGS)
#CB
Z,#196C,OUT-CH-3
#3A
NZ,#195A,OUT-CH-1
5,(IY+55) (FLAGX)
NZ,#1968,OUT-CH-2
2,(IY+48) (FLAGS2)
Z,#196C,OUT-CH-3
#1968,OUT-CH-2
#22
NZ,#1968,OUT-CH-2
AF
A,(#5C6A) (FLAGS2)
#04
(#5C6A),A (FLAGS2)
AF
2,(IY+1) (FLAGS)
#10,PRINT-A-1
CY=0, jednalo-li se o číslici.
Skoč dopředu a tiskni číslici.
Také všechny řídící znaky
a mezeru.
Signál: tisk v modu K.
Jedná-li se o token THEN,
skoč dopředu.
Pokud se nejedná o dvojtečku,
skoč dopředu.
Jsi-li v modu INPUT
skoč dopředu a tiskni dvojtečku.
Pokud dvojtečka není v uvozovkách,
skoč dopředu (jedná se o oddělovač příkazů).
Skoč na tisk dvojtečky, která byla v uvozovkách.
Akceptuj všechny znaky,
kromě " (uvozovka).
Uschovej kód znaku.
Otoč bit 2
systémové proměnné FLAGS2.
Obnov kód znaku.
Signál: další znak bude vytisknut v modu L.
Vlastní tisk znaku.
Vrať se.
Poznámka: Je to právě toto pořadí testů, které určuje, v jakém modu má být vytištěn následující
znak. Také si povšimněte, že program neobsahuje dvojtečky v řádcích REM.
ADRESA ŘÁDKU
Pro dané číslo řádku v HL vrací tento podprogram počáteční adresu tohoto nebo následujícího
řádku v HL a v DE adresu předchozího řádku. Pokud hledané číslo řádku existuje bude Z flag=1, avšak
při nahrazování číslem následujícího řádku bude Z flag=0.
196E
LINE-ADDR
PUSH
LD
LD
LD
HL
HL,(#5C53) (PROG)
D,H
E,L
Uschovej číslo řádku.
Vyzvedni hodnotu PROG
a převeď ji do DE.
Nyní vstup do smyčky, která testuje čísla všech programových řádků, dokud nenalezne shodné nebo
vyšší číslo.
1974
88
LINE-AD-1
POP
CALL
RET
PUSH
CALL
BC
#1980,CP-LINES
NC
BC
#19B8,NEXT-ONE
Dané číslo řádku.
Porovnej číslo daného řádku s číslem adresovaného řádku
a vrať se když CY=0.
Jinak adresuj číslo
dalšího řádku.
Komentovaný výpis paměti ROM
EX
JR
DE,HL
#1974,LINE-AD-1
Zaměň ukazatele a skoč zpět
na posouzení dalšího programového řádku.
PODPROGRAM POROVNÁNÍ ŘÁDKU
Číslo řádku v BC se porovná s číslem řádku jehož adresa je v HL.
1980
CP-LINES
LD
CP
RET
INC
LD
DEC
CP
RET
A,(HL)
B
NZ
HL
A,(HL)
HL
C
Vyzvedni vyšší bajt adresovaného
čísla řádku a porovnej.
Vrať se pokud se neshodují.
Dále porovnej
nižší bajt
a vrať se s CY=1, jestliže nebylo dosaženo hledané číslo.
NALEZENÍ JEDNOTLIVÝCH PŘÍKAZŮ
Tento podprogram plní dvě rozličné funkce.
a) Může být použit k nalezení "D-tého" příkazu v basicovém řádku, kdy v HL bude adresa před
začátkem tohoto příkazu a Z=1.
b) Vyhledá adresu příkazu, jehož token je v registru E. (Pokud takový příkaz existuje).
1988
198B
EACH-STMT
INC
INC
INC
LD
LD
HL
HL
HL
(#5C5D),HL (CH-ADD)
C,#00
Nevyužito.
Nastav CH-ADD na aktuální bajt.
Nastav signál: " uvozovky pryč ".
Vstup do smyčky, která zkoumá každý příkaz v řádku.
1990
EACH-S-1
DEC
RET
RST
CP
JR
AND
RET
D
Z
#20,NEXT-CHAR
E
NZ,#199A,EACH-S-3
A
Dekrementuj D
a vrať se, jestliže byl nalezen požadovaný příkaz.
Vyzvedni kód dalšího znaku
a pokud neodpovídá danému token,
skoč dopředu.
V případě shody nuluj CY
a vrať se též s nulovým Z flag.
Tato smyčka posuzuje jednotlivé znaky v řádku, aby nalezla kde příkaz končí.
1998
EACH-S-2
199A
EACH-S-3
19A5
EACH-S-4
19AD
EACH-S-5
19B1
EACH-S-6
INC
LD
CALL
LD
CP
JR
DEC
CP
JR
CP
JR
BIT
JR
CP
JR
HL
A,(HL)
#18B6,NUMBER
(#5C5D),HL (CH-ADD)
#22
NZ,#19A5,EACH-S-4
C
#3A
Z,#19AD,EACH-S-5
#CB
NZ,#19B1,EACH-S-6
0,C
Z,#1990,EACH-S-1
#0D
NZ,#1998,EACH-S-2
Posuň ukazatel
a vyzvedni další kód.
Překračuj všechna čísla
a obnovuj CH-ADD.
Jestliže znak není uvozovka,
skoč dopředu.
Nastav signál: "uvozovky ano".
Jestliže znak je dvojtečka,
skoč dopředu.
Jestliže znak není token pro THEN,
skoč dopředu.
Přečti signál "uvozovky"
a skoč na konci každého příkazu. (A to i po THEN ).
Pokud se nenacházíš na konci řádku,
skoč zpět.
Komentovaný výpis paměti ROM
89
DEC
SCF
RET
D
Zmenši čítač příkazů
a nastav CY=1.
Vrať se.
PODPROGRAM NEXT-ONE
Tento podprogram umí nalézt další řádek v programu, nebo další proměnnou v oblasti VARS.
19B8
NEXT-ONE
19C7
NEXT-O-1
19CE
NEXT-O-2
PUSH
LD
CP
JR
BIT
JR
ADD
JP
CCF
LD
JR
LD
RLA
INC
LD
JR
JR
INC
INC
LD
INC
LD
INC
HL
A,(HL)
#40
C,#19D5,NEXT-O-3
5,A
Z,#19D6,NEXT-O-4
A,A
M,#19C7,NEXT-O-1
BC,#0005
NC,#19CE,NEXT-O-2
C,#12
HL
A,(HL)
NC,#19CE,NEXT-O-2
#19DB,NEXT-O-5
HL
HL
C,(HL)
HL
B,(HL)
HL
Uschovej adresu aktuálního řádku nebo proměnné.
Vyzvedni první bajt.
Jestliže hledáš řádek,
skoč dopředu.
Jedná-li se o řetězec nebo pole,
skoč dopředu.
Jedná-li se o jednopísmennou číselnou proměnnou
a proměnnou FOR-NEXT, skoč dopředu.
Pouze číselné proměnné s dlouhými názvy.
Číselná proměnná zabírá pět míst,
ale řídící proměnná FOR-NEXT potřebuje 18 míst.
CY bude 0 pro proměnné s dlouhými názvy, dokud nebude
nalezen poslední znak. Zvyš ukazatel a
vyzvedni další znak.
Skok zpět, pokud nejsi na konci.
Skok dopředu (BC=#0005 nebo #0012).
Krok za nižší bajt čísla řádku.
Nyní ukazuj na nižší bajt délky.
Vyzvedni
délku řádku
do BC.
Ukazuj na obsah Basicového řádku/proměnné.
19D5
19D6
NEXT-O-3
NEXT-O-4
19DB
"Další" adresa je nalezena ve všech případech.
NEXT-O-5
ADD HL,BC
Ukazuj na první bajt dalšího řádku nebo proměnné.
POP DE
Vyzvedni adresu předchozího a pokračuj.
PODPROGRAM DIFERENCE
V registru BC se vrací délka mezi dvěma ukazateli. Ukazatele se vrací zaměněné.
19DD
DIFFER
AND
SBC
LD
LD
ADD
EX
RET
A
HL,DE
B,H
C,L
HL,DE
DE,HL
Příprava pravdivého
odečítání.
Nalezenou délku
předej do BC
a obnov ukazatel.
Zaměň ukazatele
a vrať se.
PODPROGRAM RECLAIMING
Vstupní bod RECLAIM-1 se používá v případě, kdy DE ukazuje na první místo, které má být
"zrušeno" a HL ukazuje na první místo, které má být ponecháno. Vstupní bod RECLAIM-2 se používá v
případě, kdy HL ukazuje na první místo, které má být "zrušeno" a v BC je počet bajtů, které mají být
"zrušeny".
19E5
19E8
90
RECLAIM-1
RECLAIM-2
CALL
PUSH
LD
CPL
LD
#19DD,DIFFER
BC
A,B
B,A
K získání potřebných hodnot použij DIFFERENCE.
Uschovej počet bajtů.
Všechny systémové ukazatele
nad touto oblastí musí být
sníženy o "BC",
Komentovaný výpis paměti ROM
LD
CPL
LD
INC
CALL
EX
POP
ADD
PUSH
LDIR
POP
RET
A,C
C,A
BC
#1664,POINTERS
DE,HL
HL
HL,DE
DE
HL
a proto je jeho
obsah
komplementován.
Vrať adresu prvního místa
do DE
a vypočti adresu prvního místa,
které má být ponecháno.
Uschovej adresu prvního místa
po dobu reklamace
vyzvedni ji do HL
a vrať se.
PODPROGRAM E-LINE-NO
Podprogram vyzvedne číslo řádku v editační oblasti. Pokud řádek nemá číslo (přímý příkaz), bude
se považovat za řádek 0. Ve všech případech se číslo řádku vrací v BC.
19FB
E-LINE-NO
1A15
E-L-1
LD
DEC
LD
RST
LD
LD
CALL
CALL
JR
LD
ADD
JP
JP
HL,(#5C59) (E-LINE)
HL
(#5C5D),HL (CH-ADD)
#20,NEXT-CHAR
HL,#5C92
(#5C65),HL (STKEND)
#2D3B,INT-TO-FP
#2DA2,FP-TO-BC
C,#1A15,E-L-1
HL,#D8F0
HL,BC
C,#1C8A,REPORT-C
#16C5,SET-STK
Vyzvedni ukazatel editovaného řádku.
Nastav ukazatel CH-ADD tak, aby ukazoval
před číslo.
Vyzvedni první kód.
Předtím ale inicializuj
zásobník kalkulátoru.
Nyní přečti číslice čísla řádky. Z=0 pokud číslo není.
Převeď číslo řádky do registru BC.
Skoč na chybu pokud je číslo řádky větší než 65535.
Jinak porovnej s číslem 10000 tj.
přičti -10000.
Chybné číslo řádky (větší než 9999).
Obnovit kalkulátorový zásobník.
PODPROGRAM PRO TISK HLÁŠENÍ A ČÍSLA ŘÁDKU
Vstupní bod OUT-NUM-1 vyžaduje číslo v registru BC. Pokud bude hodnota čísla větší než 9999,
nebude správně vytištěno.
Vstupní bod OUT-NUM-2 vyžaduje číslo v paměti, adresované registrem HL. I v tomto případě nelze
tisknout číslo větší než 9999.
1A1B
1A28
OUT-NUM-1
OUT-NUM-2
PUSH
PUSH
XOR
BIT
JR
LD
LD
LD
JR
DE
HL
A
7,B
NZ,#1A42,OUT-NUM-4
H,B
L,C
E,#FF
#1A30,OUT-NUM-3
PUSH
LD
INC
LD
PUSH
EX
LD
DE
D,(HL)
HL
E,(HL)
HL
DE,HL
E,#20
Ulož registry.
Vynuluj registr A.
Pokud je číslo záporné
tiskni raději nulu.
Přesuň číslo do HL.
Poznač že zatím nebudou úvodní mezery.
Jdi vytisknout číslo.
Ulož DE.
Vyzvedni číslo do DE.
Uschovej ukazatel.
Číslo do HL.
Poznač že se bude tisknout úvodní mezera.
Komentovaný výpis paměti ROM
91
Nyní se vytiskne celé číslo obsažené v registru HL.
1A30
OUT-NUM-3
LD
CALL
LD
CALL
LD
CALL
LD
1A42
OUT-NUM-4
CALL #15EF,OUT-CODE
POP HL
POP DE
RET
92
BC,#FC18
#192A,OUT-SP-NO
BC,#FF9C
#192A,OUT-SP-NO
C,#F6
#192A,OUT-SP-NO
A,L
Tohle je -1000.
Tiskni první číslici.
Tohle je -100.
Tiskni druhou číslici.
Tohle je -10.
Tiskni třetí číslici.
Vezmi zbytek do A.
Tiskni číslici.
Obnov registry HL a DE.
Návrat.
Komentovaný výpis paměti ROM
INTERPRETACE PŘÍKAZŮ V BASICOVÉM ŘÁDKU
SYNTAKTICKÉ TABULKY
a) TABULKA DOPLŇKŮ:
V této tab.je doplňková hodnota pro každý z 50 Basic. příkazů.
1A48
1A49
1A4A
1A4B
1A4C
1A4D
1A4E
1A4F
1A50
1A51
1A52
1A53
1A54
1A55
1A56
1A57
1A58
1A59
1A5A
1A5B
1A5C
1A5D
1A5E
1A5F
1A60
token
příkaz
adr.
DEFB #B1
DEFB #CB
DEFB #BC
DEFB #BF
DEFB #C4
DEFB #AF
DEFB #B4
DEFB #93
DEFB #91
DEFB #92
DEFB #95
DEFB #98
DEFB #98
DEFB #98
DEFB #98
DEFB #98
DEFB #98
DEFB #98
DEFB #7F
DEFB #81
DEFB #2E
DEFB #6C
DEFB #6E
DEFB #70
DEFB #48
DEF FN
CAT
FORMAT
MOVE
ERASE
OPEN#
CLOSE#
MERGE
VERIFY
BEEP
CIRCLE
INK
PAPER
FLASH
BRIGHT
INVERSE
OVER
OUT
LPRINT
LLIST
STOP
READ
DATA
RESTORE
NEW
1AF9
1B14
1B06
1B0A
1B10
1AFC
1B02
1AE2
1AE1
1AE3
1AE7
1AEB
1AEC
1AED
1AEE
1AEF
1AF0
1AF1
1AD9
1ADC
1A8A
1AC9
1ACC
1ACF
1AA8
1A61
1A62
1A63
1A64
1A65
1A66
1A67
1A68
1A69
1A6A
1A6B
1A6C
1A6D
1A6E
1A6F
1A70
1A71
1A72
1A73
1A74
1A75
1A76
1A77
1A78
1A79
token
příkaz
adr.
DEFB #94
DEFB #56
DEFB #3F
DEFB #41
DEFB #2B
DEFB #17
DEFB #1F
DEFB #37
DEFB #77
DEFB #44
DEFB #0F
DEFB #59
DEFB #2B
DEFB #43
DEFB #2D
DEFB #51
DEFB #3A
DEFB #6D
DEFB #42
DEFB #0D
DEFB #49
DEFB #5C
DEFB #44
DEFB #15
DEFB #5D
BORDER
CONTINUE
DIM
REM
FOR
GO TO
GO SUB
INPUT
LOAD
LIST
LET
PAUSE
NEXT
POKE
PRINT
PLOT
RUN
SAVE
RANDOMIZE
IF
CLS
DRAW
CLEAR
RETURN
COPY
1AF5
1AB8
1AA2
1AA5
1A90
1A7D
1A86
1A9F
1AE0
1AAE
1A7A
1AC5
1A98
1AB1
1A9C
1AC1
1AAB
1ADF
1AB5
1A81
1ABE
1AD2
1ABB
1A8D
1AD6
b) TABULKA PARAMETRŮ
V této je až 8 položek pro každý z 50 Basic. příkazů. Tyto položky obsahuji údaje o třídě
příkazu, o požadovaných separátorech a je-li to potřeba, též adresy příkazových podprogramů.
1A7A
P-LET
1A7D
P-GO-TO
1A81
P-IF
1A86
P-GO-SUB
1A8A
P-STOP
1A8D
P-RETURN
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
#01
#3D
#02
#06
#00
#67,#1E
#06
#CB
#05
#F0,#1C
#06
#00
#ED,#1E
#00
#EE,#1C
#00
#23,#1F
CLASS-01
rovnítko '='
CLASS-02
CLASS-06
CLASS-00
GO-TO,1E67
CLASS-06
THEN
CLASS-05
IF,1CF0
CLASS-06
CLASS-00
GO-SUB,1EED
CLASS-00
STOP,1CEE
CLASS-00
RETURN,1F23
Komentovaný výpis paměti ROM
93
1A90
P-FOR
1A98
P-NEXT
1A9C
P-PRINT
1A9F
P-INPUT
1AA2
P-DIM
1AA5
P-REM
1AA8
P-NEW
1AAB
P-RUN
1AAE
P-LIST
1AB1
P-POKE
1AB5
P-RANDOM
1AB8
P-CONT
1ABB
P-CLEAR
1ABE
P-CLS
1AC1
P-PLOT
1AC5
P-PAUSE
1AC9
P-READ
1ACC
P-DATA
1ACF
P-RESTORE
1AD2
P-DRAW
1AD6
P-COPY
1AD9
P-LPRINT
1ADC
P-LLIST
1ADF
1AE0
P-SAVE
P-LOAD
94
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
#04
#3D
#06
#CC
#06
#05
#03,#1D
#04
#00
#AB,#1D
#05
#CD,#1F
#05
#89,#20
#05
#02,#2C
#05
#B2,#1B
#00
#B7,#11
#03
#A1,#1E
#05
#F9,#17
#08
#00
#80,#1E
#03
#4F,#1E
#00
#5F,#1E
#03
#AC,#1E
#00
#6B,#0D
#09
#00
#DC,#22
#06
#00
#3A,#1F
#05
#ED,#1D
#05
#27,#1E
#03
#42,#1E
#09
#05
#82,#23
#00
#AC,#0E
#05
#C9,#1F
#05
#F5,#17
#0B
#0B
CLASS-04
rovnítko '='
CLASS-06
TO
CLASS-06
CLASS-05
FOR,1D03
CLASS-04
CLASS-00
NEXT,1DAB
CLASS-05
PRINT,1FCD
CLASS-05
INPUT,2089
CLASS-05
DIM,2C02
CLASS-05
REM,1BB2
CLASS-00
NEW,11B7
CLASS-03
RUN,1EA1
CLASS-05
LIST,17F9
CLASS-08
CLASS-00
POKE,1E80
CLASS-03
RANDOMIZE,1E4F
CLASS-00
CONTINUE,1E5F
CLASS-03
CLEAR,1EAC
CLASS-00
CLS,0D6B
CLASS-09
CLASS-00
PLOT,22DC
CLASS-06
CLASS-00
PAUSE,1F3A
CLASS-05
READ,1DED
CLASS-05
DATA,1E27
CLASS-03
RESTORE,1E42
CLASS-09
CLASS-05
DRAW,2382
CLASS-00
COPY,0EAC
CLASS-05
LPRINT,1FC9
CLASS-05
LLIST,17F5
CLASS-0B
CLASS-0B
Komentovaný výpis paměti ROM
1AE1
1AE2
1AE3
P-VERIFY
P-MERGE
P-BEEP
1AE7
P-CIRCLE
1AEB
1AEC
1AED
1AEE
1AEF
1AF0
1AF1
P-INK
P-PAPER
P-FLASH
P-BRIGHT
P-INVERSE
P-OVER
P-OUT
1AF5
P-BORDER
1AF9
P-DEF-FN
1AFC
P-OPEN
1B02
P-CLOSE
1B06
P-FORMAT
1B0A
P-MOVE
1B10
P-ERASE
1B14
P-CAT
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
#0B
#0B
#08
#00
#F8,#03
#09
#05
#20,#23
#07
#07
#07
#07
#07
#07
#08
#00
#7A,#1E
#06
#00
#94,#22
#05
#60,#1F
#06
#2C
#0A
#00
#36,#17
#06
#00
#E5,#16
#0A
#00
#93,#17
#0A
#2C
#0A
#00
#93,#17
#0A
#00
#93,#17
#00
#93,#17
CLASS-0B
CLASS-0B
CLASS-08
CLASS-00
BEEP,03F8
CLASS-09
CLASS-05
CIRCLE,2320
CLASS-07
CLASS-07
CLASS-07
CLASS-07
CLASS-07
CLASS-07
CLASS-08
CLASS-00
OUT,1E7A
CLASS-06
CLASS-00
BORDER,2294
CLASS-05
DEF-FN,1F60
CLASS-06
čárka ','
CLASS-0A
CLASS-00
OPEN,1736
CLASS-06
CLASS-00
CLOSE,16E5
CLASS-0A
CLASS-00
CAT,atd,1793
CLASS-0A
čárka ','
CLASS-0A
CLASS-00
CAT,atd,1793
CLASS-0A
CLASS-00
CAT,atd,1793
CLASS-00
CAT atd.,1793
Poznámka: Požadavky různých tříd jsou tyto:
CLASS-00
01
02
03
04
05
06
07
08
09
0A
0B
bez dalších operandů
použito pro LET, vyžaduje se proměnná
"
, musí následovat výraz numerický či řetězcový
může následovat numerický výraz, použije se nula pokud není
musí následovat jednoznaková proměnná
může následovat soubor položek
musí následovat numerický výraz
pro obsluhu barevných položek
musí následovat 2 numerické výrazy, oddělené čárkou
jako 08, ale mohou předcházet barevné položky
musí následovat řetězcový výraz
obsluha kazetového MGF
Komentovaný výpis paměti ROM
95
HLAVNÍ "VĚTNÝ ROZBOR" V BASICOVÉM INTERPRETU
Do tohoto podprogramu se vstupuje v bodě LINE-SCAN při kontrole syntaxe a v bode LINE-RUN,
jestliže má být proveden Basicový program, nebo jeden, či více příkazů. Každý příkaz je posuzován
postupně a systémová proměnná CH-ADD je použita jako ukazatel na jednotlivé kódy příkazů tak, jak se
vyskytují v programové, či editační zóně.
1B17
LINE-SCAN
RES
CALL
XOR
LD
DEC
LD
JR
7,(IY+1) (FLAGS)
#19FB,E-LINE-NO
A
(#5C47),A (SUBPPC)
A
(#5C3A),A (ERR-NR)
#1B29,STMT-L-1
Signál: kontrola syntaxe.
CH-ADD nastaven na první znak za jakýmkoliv číslem řádku
SUBPPC nastav na
hodnotu #00
a ERR-NR na #FF.
Skoč na posouzení prvního příkazu v řádce.
PŘÍKAZOVÁ SMYČKA
Jsou posouzeny všechny příkazy, dokud není dosaženo konce řádky.
1B28
1B29
STMT-LOOP
STMT-L-1
RST
CALL
INC
JP
RST
LD
CP
JR
CP
JR
#20,NEXT-CHAR
#16BF,SET-WORK
(IY+13) (SUBPPC)
M,#1C8A,REPORT-C
#18,GET-CHAR
B,#00
#0D
Z,#1BB3,LINE-END
#3A
Z,#1B28,STMT-LOOP
Posun CH-ADD po řádce.
Pracovní prostor je vyčištěn.
Každým průchodem smyčkou je zvětšena proměnná SUBPPC,
ale v jednom řádku je povoleno pouze 127 příkazů.
Vyzvedni znak
a vyčisti registr B.
Je to CR? (ENTER).
ANO: skoč.
Je to ":"?
ANO: vrať se do smyčky.
Příkaz je identifikován, takže nyní se posoudí jeho 1.část.
LD
PUSH
LD
RST
LD
SUB
JP
LD
LD
ADD
LD
ADD
JR
HL,#1B76
HL
C,A
#20,NEXT-CHAR
A,C
#CE
C,#1C8A,REPORT-C
C,A
HL,#1A48
HL,BC
C,(HL)
HL,BC
#1B55,GET-PARAM
Návratová adresa STMT-RET
je uložena na TOP.
Ulož si přechodně příkaz do registru C,
zatímco opět posuneš CH-ADD
redukuj kód příkazu.
Konst. #CE,tím dosáhneš rozsah od 0 do #31 pro 50 příkazů
Chyba, není-li kód příkazem.
Kód příkazu do registrového páru BC.
Bázová adresa tabulky syntaxe.
Požadovaný doplněk
je předán do registru C
a použit k výpočtu báz. adr. pro položky v tab. parametrů
a s touto adresou skoč do prohlížecí smyčky.
Všechny programy pro posouzení třídy daného příkazu jsou postupně vykonány a všechny požadované
separátory jsou též posouzeny.
1B52
1B55
96
SCAN-LOOP
GET-PARAM
LD
LD
INC
LD
LD
PUSH
LD
HL,(#5C74) (T-ADDR)
A,(HL)
HL
(#5C74),HL (T-ADDR)
BC,#1B52
BC
C,A
Přechodný ukazatel na položku v tabulce parametrů.
Vyzvedni postupně všechny položky.
Posuň ukazatel
na položku pro další průchod.
Ulož na TOP návratovou
adresu SCAN-LOOP.
Okopíruj položku do C.
Komentovaný výpis paměti ROM
CP
JR
LD
LD
ADD
LD
ADD
PUSH
RST
DEC
RET
#20
NC,#1B6F,SEPARATOR
HL,#1C01
B,#00
HL,BC
C,(HL)
HL,BC
HL
#18,GET-CHAR
B
Je položka separátor?
ANO:skoč.
Bázová adresa tabulky příkazových tříd.
Vynuluj registr B a
hledej v této tabulce
a doplněk do registru C.
Vypočítej startovní adresu požadovaného podprogramu
a ulož ji na TOP.
Před nepřímým skok. do podpr. pro zjišťování tříd příkazů
předej příkazový kód do reg.A a nastav reg.B na #FF.
PODPROGRAM SEPARÁTOR
Hlášení "Nonsens in BASIC" je vypsáno, jestliže požadovaný separátor není přítomen.
povšimněte si, že při kontrole syntaxe není toto hlášení tištěno, pouze se objeví blikající "?".
1B6F
SEPARATOR
RST
CP
JP
RST
RET
#18,GET-CHAR
C
NZ,#1C8A,REPORT-C
#20,NEXT-CHAR
Ale
Aktuální znak je
vyzvednut a porovnán s parametrem v tabulce.
Chyba při neshodě.
Postup na správný znak
a vrať se.
PODPROGRAM STMT-RET
Po správné interpretaci příkazu se program navrací na toto místo.
1B76
STMT-RET
1B7B
REPORT-L
CALL
JR
RST
DEFB
#1F54,BREAK-KEY
C,#1B7D,STMT-R-1
#08,ERROR-1
#14
Po každém příkazu je otestována klávesa BREAK.
NE: skok.
ANO: ohlaš
L-BREAK into program.
Zde se pokračuje, nebyl-li BREAK stisknut.
1B7D
STMT-R-1
BIT
JR
LD
BIT
JR
7,(IY+10) (NSPPC)
NZ,#1BF4,STMT-NEXT
HL,(#5C42) (NEWPPC)
7,H
Z,#1B9E,LINE-NEW
Není-li potřeba žádný "skok",
pokračuj na NEXT.
Číslo nového řádku
a pokud neobsluhuješ další příkaz v editační oblasti,
skoč dopředu.
VSTUPNÍ BOD LINE-RUN
Tento vstupní bod je používán, kdykoliv má být řádek v editační oblasti spuštěn příkazem RUN.
V tomto případě bude nastaven bit 7 ve FLAGS jako signál, že se provádí RUN (a ne SYNTAX). Tento
vstupní bod je též používán pří kontrole řádku v editační oblasti, který obsahuje víc než jeden příkaz
(bit 7 FLAGS=0).
1B8A
LINE-RUN
LD
LD
LD
DEC
LD
DEC
LD
JR
HL,#FFFE
(#5C45),HL (PPC)
HL,(#5C61) (WORKSP)
HL
DE,(#5C59) (E-LINE)
DE
A,(#5C44) (NSPPC)
#1BD1,NEXT-LINE
Řádek v editační oblasti je posuzován jako
řádek "-2".
HL=koncový byte v
editační oblasti
a DE na
byte před editační oblastí.
Vezmi číslo dalšího příkazu, který má být zpracován,
než skočíš dopředu.
Komentovaný výpis paměti ROM
97
PODPROGRAM LINE NEW
V programu byl proveden skok a počáteční adresa nového řádku bude nalezena.
1B9E
LINE-NEW
1BB0
REPORT-0
CALL
LD
JR
AND
JR
LD
LD
AND
LD
JR
RST
DEFB
#196E,LINE-ADDR
A,(#5C44) (NSPPC)
Z,#1BBF,LINE-USE
A
NZ,#1BEC,REPORT-N
B,A
A,(HL)
#C0
A,B
Z,#1BBF,LINE-USE
#08,ERROR-1
#FF
Je nalezena adresa následujícího řádku.
Vezmi číslo příkazu.
Skoč, byl-li požadovaný řádek nalezen, jinak zkontroluj
platnost čísla příkazu.
Musí to být 0.
Zkontroluj není-li
"následující" řádek
za skutečným
"koncem" programu.
Skoč s platnými adresami,
jinak ohlaš :
0-OK
Poznámka: toto není chyba v normálním smyslu chápání, ale skok na konec programu.
PODPROGRAM PŘÍKAZU REM
Návratová adresa do STMT-RET je odložena, čímž je program donucen ignorovat konec řádku.
1BB2
REM
POP
BC
Odhoď adresu STMT-RET.
PODPROGRAM "KONEC ŘÁDKU"
Při kontrole syntaxe se provede jednoduchý návrat, ale pokud je program v běhu, musí být
zkontrolována adresa na NXTLIN než bude použita.
1BB3
LINE-END
CALL
RET
LD
LD
AND
RET
XOR
#2530,SYNTAX-Z
Z
HL,(#5C55) (NXTLIN)
A,#C0
(HL)
NZ
A
Při kontrole syntaxe
se vrať,
jinak vyzvedni adresu na NXTLIN a
je-li tato za
koncem programu
vrať se též, čímž je příkaz RUN vykonán.
Signál: příkaz 0, než postoupíš dále.
PODPROGRAM POUŽITÍ ŘÁDKU
Tato krátký podprogram má 3 funkce:
a) změní příkaz "0" na "1"
b) najde číslo nového řádku a vloží do systémové proměnné PPC
c) vytvoří adresu začátku následujícího řádku
1BBF
98
LINE-USE
CP
ADC
LD
INC
LD
LD
INC
LD
INC
LD
EX
#01
A,#00
D,(HL)
HL
E,(HL
(#5C45),DE (PPC)
HL
E,(HL)
HL
D,(HL)
DE,HL
Z příkazu "0" se
stává příkaz "1".
Číslo aktuálního
řádku se vyzvedne
a předá do PPC.
Nyní je nalezena
délka řádku.
Záměna hodnot a
Komentovaný výpis paměti ROM
ADD
INC
HL,DE
HL
vytvoření adresy následujícího řádku v HL přičemž
pozice před 1.znakem následujícího řádku je v DE.
PODPROGRAM DALŠÍ ŘÁDEK
Na vstupu ukazuje HL za poslední místo "dalšího" řádku a DE ukazuje na místo před prvním bajtem
tohoto řádku. Týká se řádků, které jsou v programové oblasti a též řádků v editační oblasti, kdy
"další řádek" je ten samý řádek a zbývají zde ještě příkazy, které je nutno přeložit.
1BD1
NEXT-LINE
1BEC
REPORT-N
LD
EX
LD
LD
LD
LD
DEC
LD
JP
INC
CALL
JR
RST
DEFB
(#5C55),HL (NXTLIN)
DE,HL
(#5C5D),HL (CH-ADD)
D,A
E,#00
(IY+10),#FF (NSPPC)
D
(IY+13),D
(SUBPPC)
Z,#1B28,STMT-LOOP
D
#198B,EACH-STMT
Z,#1BF4,STMT-NEXT
#08,ERROR-1
#16
Nastav NXTLIN pro další použití.
CH-ADD ukazuje jako obvykle na pozici před znakem,
který má být posouzen.
Číslo příkazu je vyzvednuto.
Nulován E při použití EACH-STMT.
Signál: žádný skok.
Číslo příkazu - 1
jde do SUBPPC.
Nyní může být posouzen 1.příkaz.
Avšak pro další
příkaz musí být nalezena počáteční adresa.
Existuje-li - skoč.
Ohlaš:
N-Statement lost
PODPROGRAM "KONTROLA KONCE"
Toto je velmi důležitý podprogram, který je volán z mnoha míst monitorového programu při
kontrole syntaxe, nebo editačního řádku. Úkolem tohoto podprogramu je vypsat chybové hlášení,
jestliže nebyl nalezen konec příkazu a přesunout se na další příkaz, byla-li syntaxe O.K.
1BEE
CHECK-END
CALL
RET
POP
POP
#2530,SYNTAX-Z
NZ
BC
BC
Nepokračuj, dokud nezkontroluješ syntaxi.
Odhoď adresy SCAN-LOOP
a STMT-RET před pokračováním do STMT-NEXT.
PODPROGRAM "DALŠÍ PŘÍKAZ"
Jestliže aktuální znak je CR (ENTER), pak "další příkaz" je na "dalším řádku". Je-li to ":", je
další příkaz na tom samém, ale je-li zde jakýkoliv jiný znak, jedná se o syntaktickou chybu.
1BF4
STMT-NEXT
RST
CP
JR
CP
JP
JP
#18,GET-CHAR
#0D
Z,#1BB3,LINE-END
#3A
Z,#1B28,STMT-LOOP
#1C8A,REPORT-C
Vyzvedni aktuální znak a jedná-li se o
ENTER, jdi
na "další řádek".
Je-li to ":" jdi
na "další příkaz",
jinak je syntaktická chyba.
TABULKY TŘÍD PŘÍKAZŮ
1C01
1C02
1C03
1C04
1C05
1C06
0F
1D
4B
09
67
0B
CLASS-00-1C10
CLASS-01-1C1F
CLASS-02-1C4E
CLASS-03-1C0D
CLASS-04-1C6C
CLASS-05-1C11
1C07
1C08
1C09
1C0A
1C0B
1C0C
7B
8E
71
B4
81
CF
Komentovaný výpis paměti ROM
CLASS-06-1C82
CLASS-07-1C96
CLASS-08-1C7A
CLASS-09-1CBE
CLASS-0A-1C8C
CLASS-0B-1CDB
99
PŘÍKAZOVÉ TŘÍDY 00, 03 A 05
Příkazy, které mají třídu 03 mohou, ale nemusí být následovány číslem (např. RUN a RUN 200)
1C0D
CLASS-03
CALL #1CDE,FETCH-NUM
Číslo je zjištěno, ale neexistuje-li použije se 0.
Příkazy třídy 00 nesmí být následovány operandy (COPY ap.)
1C10
CLASS-00
CP
A
Nastav Z flag pro pozdější využití.
Příkazy třídy 05 mohou být následovány parametry (PRINT ap.)
1C11
CLASS-05
POP BC
CALL Z,#1BEE,CHECK-END
Ve všech případech odhoď adresu SCAN-LOOP.
U přík.třídy 00 a 03 se po kontrole syntaxe pokračuje v posouzení dalšího příkazu.
EX
DE,HL
Do DE uschovej ukazatel řádku.
PODPROGRAM "SKOK C-R"
Po posouzení všech tříd příkazů a všech oddělovacích znaků se provede skok do příslušného
příkazového podprogramu.
1C16
JUMP-C-R
LD
LD
INC
LD
EX
PUSH
RET
HL,(#5C74)
C,(HL)
HL
B,(HL)
DE,HL
BC
(T-ADDR)
Vyzvedni ukazatel na položku v tabulce parametrů a
vyzvedni adresu
požadovaného příkazového
podprogramu.
Zaměň ukazatele a
proved nepřímý
skok do příkazového podprogramu.
PŘÍKAZOVÉ TŘÍDY 01,02 A 04
Tyto třídy jsou používány pro příkazy, které pracují s proměnnými (LET, FOR,.. a nepřímo též
READ, INPUT). Příkaz třídy 01 je volán při identifikaci proměnné pro přík. LET, READ a INPUT.
1C1F
CLASS-01
CALL #28B2,LOOK-VARS
Urči, zda proměnná již byla či nebyla definována.
PROMĚNNÁ V PŘIDĚLENÍ
Tento podprogram vytváří příslušné hodnoty pro systémové proměnné DEST a STRLEN.
1C22
VAR-A-1
1C2E
REPORT-2
LD
JR
SET
JR
RST
DEFB
(IY+55),#00 (FLAGX)
NC,#1C30,VAR-A-2
1,(IY+55) (FLAGX)
NZ,#1C46,VAR-A-3
#08,ERROR-1
#01
Nastav FLAGX.
Skoč, když proměnná už existuje.
Signál: nová proměnná.
Ohlaš chybu, jestliže dochází k pokusu užít nedim. pole.
Ohlaš:
2-Variable not found
Zde pokračuj, jestliže obsluhuješ existující proměnnou.
1C30
100
VAR-A-2
CALL
BIT
JR
XOR
CALL
CALL
LD
Z,#2996,STK-VARS
6,(IY+1) (FLAGS)
NZ,#1C46,VAR-A-3
A
#2530,SYNTAX-Z
NZ,#2BF1,STK-FETCH
HL,#5C71
Parametry řetězců a všech polí jsou předány na kalkul.
zásobník (STK-VARS odkrojí konec řetězce,je-li to třeba)
Skoč dopředu, obsluhuješ-li číselnou proměnnou.
Vynuluj registr A.
Parametry řetězce nebo řetězcového pole jsou vyzvednuty
v případě, že se nekontroluje syntaxe.
Toto je FLAGX.
Komentovaný výpis paměti ROM
OR
LD
EX
(HL)
(HL),A
DE,HL
Bit 0 je nastaven v tom případě, kdy se jedná o úplný
jednoduchý řetězec, což signalizuje: smazat starou kopii.
HL nyní ukazuje na řetězec nebo část pole.
Obě cesty programu se zde opět stýkají, aby STRLEN a DEST byly nastaveny na požadované hodnoty.
Pro všechny numerické proměnné a nové řetězce a řetězcová pole obsahuje STRLEN-lo znak názvu proměnné.
Ale pro staré řetězce a řetězcová pole, ať už jsou seříznuty nebo kompletní, obsahuje tato systémová
proměnná délku přidělení.
1C46
VAR-A-3
DEST
proměnné.
LD
obsahuje
(#5C72),BC (STRLEN)
"cílovou"
LD
RET
adresu
(#5C4D),HL (DEST)
Nastav STRLEN na požadovanou hodnotu.
"staré"
proměnné,
ale
zároveň
i
"zdrojovou"
adresu
"nové"
Nastav DEST na požadovanou hodnotu
a vrať se.
Příkazy třídy 02 jsou doplněny aktuálním výpočtem hodnoty, která je přidělena v příkazu LET.
1C4E
CLASS-02
POP BC
CALL #1C56,VAL-FET-1
CALL #1BEE,CHECK-END
RET
Adresa SCAN-LOOP je odhozena.
Je provedeno přidělení.
Přesun na další příkaz, bud přes CHECK-END při kontrole
syntaxe, nebo přes STMT-RET při programovém běhu.
PODPROGRAM "VYZVEDNI HODNOTU"
Tento podprogram se využívá pro LET, READ a INPUT, aby ohodnotil a přidělil hodnoty deklarovaným
proměnným. Vstupní bod VAL-FET-1 je používán příkazy LET a READ a posuzuje FLAGS, zatímco vstupní bod
VAL-FET-2 je využíván příkazem INPUT a posuzuje FLAGX.
1C56
1C59
VAL-FET-1
VAL-FET-2
LD
PUSH
CALL
POP
LD
XOR
AND
JR
BIT
JP
RET
A,(#5C3B) (FLAGS)
AF
#24FB,SCANNING
AF
D,(IY+1) (FLAGS)
D
#40
NZ,#1C8A,REPORT-C
7,D
NZ,#2AFF,LET
Použij FLAGS.
Uschovej hodnocení dalšího příkazu.
Proveď hodnocení dalšího příkazu.
Vyzvedni starou hodnotu FLAGS nebo FLAGX.
Vyzvedni novou hodnotu FLAGS.
Typ proměnné numerické nebo řetězcové se musí shodovat
s typem výrazu,
není-li tomu tak, vypiš hlášení C.
Pokud nekontroluješ syntaxi,
skoč dopředu k provedení vlastního přidělení,
jinak se vrať.
PŘÍKAZY TŘÍDY 04
Tento vstupní bod se používá pro příkazy FOR a NEXT.
1C6C
CLASS-04
CALL
PUSH
LD
OR
INC
JR
POP
JR
#28B2,LOOK-VARS
AF
A,C
#9F
A
NZ,#1C8A,REPORT-C
AF
#1C22,VAR-A-1
Zjisti zda je tato proměnná používána.
Uschovej registrový pár AF
zatímco budeš testovat
diskriminační bajt.
Ověř si také, že se jedná o smyčku FOR NEXT.
Obnov podmínkový registr a skoč zpět,
abys zjistil, že nalezená proměnná bude přidělena.
Komentovaný výpis paměti ROM
101
PODPROGRAM "OČEKÁVEJ ČÍSELNÝ NEBO ŘETĚZCOVÝ VÝRAZ"
Toto jsou sledy krátkých podprogramů, které jsou používány k vyzvednutí výsledků dalšího
ohodnoceného výrazu. Výsledek jednoduchého výrazu je vrácen jako poslední hodnota na zásobníku
kalkulátoru. Vstupní bod NEXT-2NUM se používá, když je třeba upravit CH-ADD tak, aby ukazovala na
začátek prvního výrazu.
1C79
NEXT-2NUM
RST
#20,NEXT-CHAR
Posuň CH-ADD.
Vstupní bod EXPT-2NUM (odpovídá třídě 8) umožňuje dvěma číselným výrazům odděleným čárkou, aby
byly ohodnoceny.
1C7A
EXPT-2NUM
(CLASS-08)
CALL #1C82,EXPT-1NUM
Ohodnoť oba výrazy po sobě.
CP
JR
RST
Není-li separátor čárka,
ohlaš chybu.
Posuň CH-ADD
#2C
NZ,#1C8A,REPORT-C
#20,NEXT-CHAR
Vstupní bod EXPT-1NUM (odpovídá třídě 6) umožňuje ohodnocení jednoho číselného výrazu.
1C82
1C8A
EXPT-1NUM
(CLASS-06)
REPORT-C
CALL #24FB,SCANNING
Ohodnoť další výraz.
BIT
RET
RST
DEFB
Byl-li výsledek číselný
vrať se, jinak
ohlaš:
C-Nonsense in BASIC.
6,(IY+1) (FLAGS)
NZ
#08,ERROR-1
#0B
Vstupní bod EXPT-EXP (odpovídá třídě 0A) umožňuje ohodnocení jednoho řetězcového výrazu.
1C8C
EXPT-EXP
(CLASS-0A)
CALL #24FB,SCANNING
Ohodnoť další výraz.
BIT
RET
JR
Je-li indikován řetězec,
vrať se,
jinak ohlaš chybu.
6,(IY+1) (FLAGS)
Z
#1C8A,REPORT-C
PODPROGRAM "NASTAVENÍ PERMANENTNÍCH BAREV" (= TŘÍDA 07)
Tento podprogram
umožňuje nastavení aktuálních přechodných barev. Jakožto příkaz třídy 07
představuje ve skutečnosti příkazový podprogram pro šest barevných příkazů.
1C96
PERMS
(CLASS-07)
BIT
RES
CALL
POP
LD
SUB
CALL
CALL
LD
LD
LD
LD
7,(IY+1) (FLAGS)
0,(IY+2) (TV-FLAG)
NZ,#0D4D,TEMPS
AF
A,(#5C74) (T-ADDR)
#13
#21FC,CO-TEMP-4
#1BEE,CHECK-END
HL,(#5C8F) (ATTR-T)
(#5C8D),HL (ATTR-P)
HL,#5C91
A,(HL)
Je testována vlajka "syntaxe/run".
Signál: hlavní obrazovka.
V případě RUN uprav podle přech. barev barvy obrazovky.
Odhoď návratovou adresu SCAN-LOOP.
Vyzvedni nižší bajt T-ADDR a
odečti #13 - rozsah #D9 až #DE což jsou INK až OVER.
Skoč dopředu k výměně barev podle basicového příkazu.
Přesuň se na další příkaz, jestliže kontroluješ syntaxi.
Nyní se přechodné barvy stanou
permanentními. A to jak ATTR-T tak i MASK-P.
Toto je P-FLAG a ten
musí být také posouzen.
Následující instrukce velmi rafinovaně okopírují liché bity na místa sudých bajtů, což ve
skutečnosti způsobí, že permanentní barvy budou mít hodnoty přechodných barev.
RLCA
XOR (HL)
AND #AA
102
Posuň masku doleva a
výsledek nechť se projeví pouze na
lichých bitech tohoto bajtu.
Komentovaný výpis paměti ROM
XOR
LD
RET
(HL)
(HL),A
Obnov výsledek
a vrať se.
PODPROGRAM PŘÍKAZŮ TŘÍDY 09
Tento podprogram se používá pro příkazy PLOT, DRAW a CIRCLE, aby určil konstantní hodnoty pro
"FLASH 8, BRIGHT 8 a PAPER 8", které jsou nastaveny ještě předtím, než budou posouzeny případné
barevné položky.
1CBE
1CD6
CLASS-09
CL-09-1
CALL
JR
RES
CALL
LD
LD
OR
LD
RES
RST
CALL
JR
#2530,SYNTAX-Z
Z,#1CD6,CL-09-1
0,(IY+2) (TV-FLAG)
#0D4D,TEMPS
HL,#5C90
A,(HL)
#F8
(HL),A
6,(IY+87) (P-FLAG)
#18,GET-CHAR
#21E2,CO-TEMP
#1C7A,EXPT-2NUM
Skoč dopředu při kontrole syntaxe.
Signál: hlavní obrazovka.
Nastav přechodné barvy pro hlavní obrazovku.
Toto je MASK-T.
Vyzvedni jeho hodnotu a
vezmi z ní pouze část odpovídající nemaskovanému INK.
Obnov hodnotu, která indikuje FLASH 8,INK 8,PAPER 8.
Také zajisti, že nebude PAPER 9.
Vyzvedni znak před obsluhou dalších barevných položek.
Zpracuj místně dominantní barevnou položku.
Nyní vyzvedni první dva operandy pro PLOT, DRAW a CIRCLE.
PŘÍKAZY TŘÍDY 0B
Tento podprogram je používán příkazy SAVE, LOAD, VERIFY a MERGE.
1CDB
CLASS-0B
JP
#0605,SAVE-ETC
Skoč do kazetových podprogramů.
PODPROGRAM "VYZVEDNUTÍ ČÍSLA"
Tento podprogram způsobí, že následující číselný výraz bude vyhodnocen, ale jestliže neexistuje,
bude nahrazen nulou.
1CDE
FETCH-NUM
CP
JR
CP
JR
#0D
Z,#1CE6,USE-ZERO
#3A
NZ,#1C82,EXPT-1NUM
Jedná-li se o konec řádku
skoč dopředu.
Nejde-li o konec příkazu
skoč na EXPT-1NUM.
Nyní je použit kalkulátor, aby uložil nulu na zásobník.
1CE6
USE-ZERO
CALL
RET
RST
DEFB
DEFB
RET
#2530,SYNTAX-Z
Z
#28,FP-CALC
#A0,stk-nula
#38,konec výpočtu
Neprováděj tuto operaci při kontrole syntaxe.
Použij kalkulátor.
"Poslední hodnota" je nyní nula.
Návrat s nulou na zásobníku kalkulátoru.
Komentovaný výpis paměti ROM
103
PŘÍKAZOVÉ PODPROGRAMY
Tato sekce 16k monitorového programu od adresy #1CEE až do adresy #23FA obsahuje většinu
příkazových programů pro basicový interpret.
PŘÍKAZ "STOP"
Podprogram příkazu STOP obsahuje pouze volání chybového hlášení.
1CEE
STOP
(REPORT-9)
RST #08,ERROR-1
DEFB #08
Ohlaš:
9-STOP statement
PŘÍKAZ "IF"
Hodnota výrazu mezi IF a THEN se stane "poslední hodnotou" na kalkulátorovém zásobníku. Je-li
logicky pravdivá, bude se posuzovat další výraz a v ostatních případech je řádek považován za
skončený.
1CF0
IF
POP BC
CALL #2530,SYNTAX-Z
JR
Z,#1D00,IF-1
Odhoď návratovou adresu STMT-RET.
Skoč dopředu při kontrole syntaxe.
Nyní použij kalkulátor k vymazání poslední položky na zásobníku kalkulátoru, ale nech DE, aby
adresoval první bajt této hodnoty.
1D00
IF-1
RST
DEFB
DEFB
EX
CALL
JP
JP
#28,FP-CALC
#02,výmaz
#38,konec výpočtu
DE,HL
#34E9,TEST-ZERO
C,#1BB3,LINE-END
#1B29,STMT-L-1
Použij kalkulátor.
Poslední hodnota je vymazána.
HL ukazuje na první bajt a
je zavolán TEST-ZERO.
Byla-li hodnota "nepravda", skoč na další řádek.
Ale byla-li "pravda" skoč na další příkaz po THEN.
PŘÍKAZ "FOR"
Do tohoto příkazového podprogramu se vstupuje s hodnotami VALUE a LIMIT již na zásobníku
kalkulátoru.
1D03
FOR
CP
JR
RST
CALL
CALL
JR
#CD
NZ,#1D10,F-USE-1
#20,NEXT-CHAR
#1C82,EXPT-1NUM
#1BEE,CHECK-END
#1D16,F-REORDER
Pokud není udán krok
skoč dopředu.
Posuň CH-ADD a
vyzvedni hodnotu pro krok.
Při kontrole syntaxe se posuň na další příkaz, jinak
skoč dopředu.
Nebyl-li specifikován krok, použij hodnotu "1".
1D10
F-USE-1
CALL
RST
DEFB
DEFB
#1BEE,CHECK-END
#28,FP-CALC
#A1,stk-jedna
#38,konec výpočtu
Další příkaz jestliže kontroluješ syntaxi, jinak
použij kalkulátor a ulož
hodnotu "1" na jeho zásobník.
Tři hodnoty na zásobníku kalkulátoru jsou nyní VALUE(v), LIMIT(l) a STEP(s). Tyto hodnoty budou
nyní posouzeny.
1D16
104
F-REORDER
RST #28,FP-CALC
DEFB #C0,st-mem-0
DEFB #02,výmaz
v,l,s
v,l,s (paměť č.0=s)
v,l
Komentovaný výpis paměti ROM
DEFB
DEFB
DEFB
DEFB
#01,výměna
#E0,get-mem-0
#01,výměna
#38,konec výpočtu
l,v
l,v,s
l,s,v
Řídící proměnná FOR je nyní vytvořena a považována za přechodnou oblast kalkulátorové paměti.
CALL #2AFF,LET
LD
(#5C68),HL (MEM)
Proměnná je nalezena nebo vytvořena (má hodnotu v).
Udělej z ní paměťovou oblast.
Proměnná, která byla nalezena může být pouze jednoduchá číselná proměnná používající pouze šest
míst a nyní pro ni bude vyhrazeno místo.
DEC
LD
SET
LD
ADD
RLCA
JR
LD
CALL
INC
HL
A,(HL)
7,(HL)
BC,#0006
HL,BC
C,#1D34,F-L&S
C,#0D
#1655,MAKE-ROOM
HL
Vyzvedni jednopísmenný název proměnné.
Zajisti, že bit 7 v názvu je nastaven.
Bude třeba šest míst.
HL nechť ukazuje za ně.
Rotuj název a
skoč byla-li to již proměnná FOR.
V opačném případě
vytvoř dalších 13 míst.
HL ukazuje opět za pozici LIMIT.
Počáteční hodnoty pro LIMIT a STEP jsou nyní sečteny.
1D34
F-L&S
PUSH
RST
DEFB
DEFB
DEFB
POP
EX
LD
LDIR
HL
#28,FP-CALC
#02,výmaz
#02,výmaz
#38,konec výpočtu
HL
DE,HL
C,#0A
Je uschován ukazatel.
l,s
l
DE stále ukazuje na "l".
Ukazatel je obnoven a
ukazatele zaměněny.
Deset bajtů LIMITu a STEPu je
přesunuto.
Nyní jsou vložena čísla "smyčkovacího" řádku a příkazu.
LD
EX
LD
INC
LD
LD
INC
INC
LD
HL,(#5C45) (PPC)
DE,HL
(HL),E
HL
(HL),D
D,(IY+13) (SUBPPC)
D
HL
(HL),D
Číslo aktuálního řádku.
Zaměň registry
před přidáním
čísla řádku
k řídící proměnné FOR.
"Smyčkovací" příkaz je vždy
dalším příkazem
ať již existuje,
nebo ne.
Podprogram NEXT-LOOP se volá aby testoval možnost "průběhu" a jestliže je to možné, provede se
návrat. Jinak se identifikuje příkaz za smyčkou FOR-NEXT.
CALL
RET
LD
LD
LD
LD
NEG
#1DDA,NEXT-LOOP
NC
B,(IY+56) (STRLEN-lo)
HL,(#5C45) (PPC)
(#5C42),HL (NEWPPC)
A,(#5C47) (SUBPPC)
Je "průběh" možný?
Jestliže ano vrať se.
Vyzvedni název proměnné.
Kopíruj číslo aktuálního řádku
do NEWPPC.
Vyzvedni číslo aktuálního příkazu
a kompletuj ho.
Komentovaný výpis paměti ROM
105
LD
LD
LD
D,A
HL,(#5C5D) (CH-ADD)
E,#F3
Převeď výsledek do D.
Vyzvedni hodnotu CH-ADD.
Bude se hledat "NEXT".
Nyní se vzestupně prohledává programová oblast, dokud není nalezen první NEXT následovaný
správnou proměnnou.
1D64
F-LOOP
PUSH
LD
CALL
LD
POP
JR
RST
OR
CP
JR
RST
JR
BC
BC,(#5C55) (NXTLIN)
#1D86,LOOK-PROG
(#5C55),BC (NXTLIN)
BC
C,#1D84,REPORT-I
#20,NEXT-CHAR
#20
B
Z,#1D7C,F-FOUND
#20,NEXT-CHAR
#1D64,F-LOOP
Uschovej název proměnné.
Vyzvedni aktuální hodnotu NXTLIN.
Programová oblast je prohledávána
a BC se bude měnit s každým novým řádkem.
Obnov název proměnné.
Nebylo-li NEXT nalezeno, skoč na chybové hlášení.
Přejdi za nalezené NEXT.
Akceptuj malá i velká písmena.
Testuj název proměnné
a skoč dopředu v případě shody.
Opět posuň CHADD a nejedná-li se o správnou proměnnou,
skoč zpět.
NEWPPC obsahuje číslo řádku, ve kterém byl nalezen příkaz NEXT. Musí být nalezena pozice
příkazu v řádku a uložena v NSPPC.
1D7C
F-FOUND
1D84
REPORT-I
RST
LD
SUB
LD
RET
RST
DEFB
#20,NEXT-CHAR
A,#01
D
(#5C44),A (NSPPC)
#08,ERROR-1
#11
Posuň CH-ADD.
Počítadlo příkazů v registru D počítalo příkazy od nuly
a proto musí být odečteno od jedné.
Výsledek je uschován.
Vrať se do STMT-RET.
Ohlaš:
I-FOR without NEXT
PODPROGRAM "LOOK-PROG"
Tento podprogram se používá k vyhledávání příkazů DATA, DEF FN nebo NEXT.
příslušný kód tokenu v registru E a HL ukazuje na začátek prohledávané oblasti.
1D86
LOOK-PROG
LD
CP
JR
A,(HL)
#3A
Z,#1DA3,LOOK-P-2
Na
vstupu
je
Vyzvedni aktuální znak,
je-li to dvojtečka, (více příkazů v řádku)
skoč dopředu.
Vstup do smyčky, která prozkoumá každý další řádek.
1D8B
106
LOOK-P-1
INC
LD
AND
SCF
RET
LD
INC
LD
LD
INC
LD
INC
LD
PUSH
ADD
LD
HL
A,(HL)
#C0
Vyzvedni vyšší bajt čísla řádku a
nejsou-li v programu další řádky
NZ
B,(HL)
HL
C,(HL)
(#5C42),BC
HL
C,(HL)
HL
B,(HL)
HL
HL,BC
B,H
vrať se s CY=1.
Číslo řádku je vyzvednuto a
(NEWPPC)
předáno do NEWPPC.
Pak je vyzvednuta jeho délka.
Ukazatel je uschován
zatímco adresa konce řádku
Komentovaný výpis paměti ROM
1DA3
LOOK-P-2
LD
POP
LD
PUSH
CALL
POP
RET
JR
C,L
HL
D,#00
BC
#198B,EACH-STMT
BC
NC
#1D8B,LOOK-P-1
je vytvořena v BC.
Ukazatel je obnoven.
Nastav počítadlo příkazů na nulu.
Ukazatel na konec řádku je uschován
zatímco jsou prozkoumávány příkazy v řádku.
Obnovení ukazatele.
Vrať se nebyl-li zde žádný výskyt,
jinak posuzuj další řádek.
PŘÍKAZ "NEXT"
Proměnná "v přidělení" byla již stanovena (viz TŘÍDA 04,#1C6C) a zbývá změnit její hodnotu, jak
je požadováno.
1DAB
NEXT
BIT
JP
LD
BIT
JR
1,(IY+55) (FLAGX)
NZ, #1C2E,REPORT-2
HL,(#5C4D) (DEST)
7,(HL)
Z, #1DD8,REPORT-1
Nebyla-li proměnná nalezena
ohlaš chybu.
Adresa proměnné je vyzvednuta a
její název je dále testován.
Pokud je špatný typ proměnné, ohlaš chybu.
VALUE (hodnota) a STEP (krok) jsou upravovány pomocí kalkulátoru.
INC
LD
RST
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
HL
(#5C68),HL (MEM)
#28,FP-CALC
#E0,get-mem-0
#E2,get-mem-2
#0F,sčítání
#C0,st-mem-0
#02,výmaz
#38,konec výpočtu
Překroč jméno a
vytvoř z proměnné přechodnou "paměťovou oblast".
v
v,s
v+s
v+s
-
Výsledek sečtení hodnot VALUE + STEP je nyní porovnán s hodnotou LIMIT voláním podprogramu
NEXT-LOOP.
CALL #1DDA,NEXT-LOOP
RET C
Testuj novou hodnotu VALUE proti hodnotě LIMIT.
Byla-li smyčka FOR-NEXT již dokončena, vrať se.
Jinak vyzvedni "číslo smyčkovacího řádku a příkazu".
LD
LD
ADD
LD
INC
LD
INC
LD
EX
JP
1DD8
REPORT-1
HL,(#5C68) (MEM)
DE,#000F
HL,DE
E,(HL)
HL
D,(HL)
HL
H,(HL)
DE,HL
#1E73,GO-TO-2
RST #08,ERROR-1
DEFB #00
Nalezni adresu
nižšího bajtu
čísla "smyčkovacího řádku".
Nyní toto číslo
vyzvedni do DE.
Vyzvedni také číslo příkazu.
Zaměň čísla před
skokem dopředu, kde budou zpracovány jako GO-TO.
Ohlaš:
1-NEXT without FOR
Komentovaný výpis paměti ROM
107
PODPROGRAM "NEXT-LOOP"
Tento podprogram testuje, byl-li překročen LIMIT hodnotou VALUE. Musí se přihlédnout
znaménku hodnoty STEP. Tento podprogram nastaví CY flag na hodnotu 1, byl-li LIMIT překročen.
1DDA
NEXT-LOOP
RST
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
#28,FP-CALC
#E1,get-mem-1
#E0,get-mem-0
#E2,get-mem-2
#36,<0
#00,skok-pravda
#02,na NEXT-1
#01,záměna
l
l,v
l,v,s
l,v,(1 nebo 0)
l,v,(1 nebo 0)
l,v,(1 nebo 0)
v,l
1DE2
NEXT-1
DEFB
DEFB
DEFB
DEFB
DEFB
AND
RET
#03,odečítání
#37,>0
#00,skok-pravda
#04,na NEXT-2
#38,konec výpočtu
A
v-l nebo l-v
(1 nebo 0)
(1 nebo 0)
Vyčisti CY flag a
vrať se-smyčka je možná.
ke
Ovšem, není-li možné smyčku provést, nastav CY flag.
1DE9
NEXT-2
DEFB #38,konec výpočtu
SCF
RET
Nastav CY flag a
vrať se.
PODPROGRAM PŘÍKAZU READ
Příkaz READ umožňuje načítání seznamů dat a ve skutečnosti je podobný sérii příkazů LET.
Systémová proměnná X-PTR se využívá k úschově ukazatele na příkaz READ, zatímco CHADD slouží ke
krokování seznamu DATA.
1DEC
1DED
READ-3
READ
1E08
REPORT-E
RST
CALL
CALL
JR
RST
LD
LD
LD
CP
JR
LD
CALL
JR
RST
DEFB
#20,NEXT-CHAR
#1C1F,CLASS-01
#2530,SYNTAX-Z
Z,#1E1E,READ-2
#18,GET-CHAR
(#5C5F),HL (X-PTR)
HL,(#5C57) (DATADD)
A,(HL)
#2C
Z,#1E0A,READ-1
E,#E4
#1D86,LOOK-PROG
NC,#1E0A,READ-1
#08,ERROR-1
#0D
Posun na další znak a jeho vyzvednutí v A.
Zjištění zdali proměnná existuje a její vyhledání.
Při kontrole syntaxe
skok dopředu.
Vyzvedni znak.
Úschova CHADD v X-PTR.
Vyzvedni ukazatel na seznam DATA,
načti další znak
a pokud nebyl nalezen nový příkaz DATA,
skoč dopředu.
Hledá se
token DATA.
Skoč dopředu při úspěšném nálezu.
Ohlaš:
E-Out of DATA
Pokračování - vybírání hodnot ze seznamu DATA.
1E0A
108
READ-1
CALL
CALL
RST
LD
LD
LD
CALL
#0077,TEMP-PTR1
Posunuj ukazatel po seznamu a nastav CHADD.
#1C56,VAL-FET-1
Vyzvedni hodnotu a přiděl ji proměnné.
#18,GET-CHAR
Vyzvedni aktuální hodnotu CHADD
(#5C57),HL (DATADD) a ulož ji v DATADD.
HL,(#5C5F) (X-PTR)
Vyzvedni ukazatel příkazu READ
(IY+38),#00 (X-PTR-hi) a vynuluj X-PTR.
#0078,TEMP-PTR2
CHADD ještě jednou ukazuje na příkaz READ.
Komentovaný výpis paměti ROM
1E1E
READ-2
RST
CP
JR
#18,GET-CHAR
#2C
Z,#1DEC,READ-3
CALL #1BEE,CHECK-END
RET
Vyzvedni aktuální znak
a testuj na čárku.
Je-li to čárka, skoč zpět, protože existují další
položky.
Při kontrole syntaxe se vrať přes CHECK-END,
anebo do STMT-RET.
PODPROGRAM PŘÍKAZU DATA
Při kontrole syntaxe je příkaz DATA testován, zdali obsahuje sérii platných výrazů, oddělených
čárkami. Ale při běhu programu se tento příkaz vynechá.
1E27
DATA
1E2C
DATA-1
CALL
JR
CALL
CP
CALL
RST
JR
#2530,SYNTAX-Z
NZ,#1E37,DATA-2
#24FB,SCANNING
#2C
NZ,#1BEE,CHECK-END
#20,NEXT-CHAR
#1E2C,DATA-1
Pokud nekontroluješ syntaxi,
skoč dopředu.
Kontroluj další výraz
a správný oddělovač.
Posuň se na další příkaz, pokud nesouhlasí.
Další znak.
Pokračuj ve smyčce.
Při běhu programu se příkaz data překročí.
1E37
DATA-2
LD
A,#E4
Token DATA.
PODPROGRAM VYNECHÁNÍ
Na vstupu je v registru A kód příkazu, který má být vynechán. (DATA nebo DEF FN, podle
momentálního použití tohoto podprogramu).
1E39
PASS-BY
LD
B,A
CPDR
LD
DE,#0200
JP
#198B,EACH-STMT
BC ať obsahuje nějaké dosti vysoké číslo.
Vzestupné hledání token.
Nyní najdi
následující příkaz. (D mínus prvý).
PODPROGRAM PŘÍKAZU RESTORE
Operand pro RESTORE se považuje za číslo řádku a pokud není uveden, dosadí se nula. Vstupní bod
TEST-RUN se použije za chodu.
1E42
1E45
RESTORE
REST-RUN
CALL
LD
LD
CALL
DEC
LD
RET
#1E99,FIND-INT2
H,B
L,C
#196E,LINE-ADDR
HL
(#5C57),HL (DATADD)
Kompresuj operand do BC.
Převeď výsledek
do HL.
Najdi adresu tohoto nebo následujícího řádku.
DATADD bude ukazovat
na jednu pozici před řádek.
Hotovo - vrať se.
PODPROGRAM PŘÍKAZU RANDOMIZE
Operand je kompresován do BC a uložen do příslušné systémové proměnné. Není-li operand uveden,
použijí se hodnoty z FRAMES 1 a FRAMES 2.
1E4F
RANDOMIZE
1E5A
RAND-1
CALL
LD
OR
JR
LD
LD
#1E99,FIND-INT2
A,B
C
NZ,#1E5A,RAND-1
BC,(#5C78) (FRAMES1)
(#5C76),BC (SEED)
Vyzvedni operand do BC
a pokud se nejedná
o nulovou hodnotu,
skoč dopředu.
Vyzvedni dva nižší bajty FRAMES
a ulož je do systémové proměnné SEED.
Komentovaný výpis paměti ROM
109
RET
Vrať se.
PODPROGRAM PŘÍKAZU CONTINUE
Příslušná čísla řádku a příkazu se stanou předmětem skoku.
1E5F
CONTINUE
LD
LD
JR
HL,(#5C6E) (OLDPPC)
D,(IY+54)
(OSPCC)
#1E73,GO-TO-2
Číslo řádku.
Číslo příkazu.
Skok dopředu.
PODPROGRAM PŘÍKAZU GO TO
Operandem musí být číslo řádku v rozsahu 1 až 9999. Ale vzhledem k "obrácené" logice číslování
se testuje na číslo 61439.
1E67
GO-TO
CALL
LD
LD
LD
LD
CP
JR
#1E99,FIND-INT2
H,B
L,C
D,#00
A,H
#F0
NC,#1E9F,REPORT-B
Vyzvedni operand
převeď jej
do HL.
Nastav číslo příkazu na nulu.
Jestliže hodnota
přesahuje 61439,
skoč na chybové hlášení.
Vstupní bod GO-TO-2 se používá v četných případech při určování čísla následujícího řádku.
1E73
GO-TO-2
LD
LD
RET
(#5C42),HL (NEWPPC)
(IY+10),D (NSPPC)
Vlož číslo řádku
a číslo příkazu.
Vrať se.
PODPROGRAM PŘÍKAZU OUT
Oba parametry jsou vyzvednuty ze zásobníku kalkulátoru a vyslány.
1E7A
OUT
CALL #1E85,TWO-PARAM
OUT (C),A
RET
Vyzvedni operandy.
Skutečná instrukce OUT.
Hotovo.
PODPROGRAM PŘÍKAZU POKE
POKE se provede obdobně.
1E80
POKE
CALL #1E85,TWO-PARAM
LD
(BC),A
RET
Vyzvedni operandy.
Skutečná instrukce POKE.
Hotovo.
PODPROGRAM TWO-PARAM
První parametr na zásobníku kalkulátoru musí být kompresovatelný do jednoduchého registru a
je-li záporný, bude komplementován. Druhý parametr na zásobníku kalkulátoru musí být kompresovatelný
do registrového páru.
1E85
TWO-PARAM
1E8E
TWO-P-1
110
CALL
JR
JR
NEG
PUSH
CALL
POP
#2DD5,FP-TO-A
C,#1E9F,REPORT-B
Z,#1E8E,TWO-P-1
AF
#1E99,FIND-INT2
AF
Vyzvedni parametr
a skoč na chybu,je-li příliš vysoký.
Skoč dopředu s kladnými čísly,
ale komplementuj záporná čísla.
Uschovej první parametr
a vyzvedni druhý.
Vyzvedni první parametr
Komentovaný výpis paměti ROM
RET
a vrať se.
PODPROGRAMY NALEZENÍ INTEGERŮ
"Poslední hodnota" na zásobníku
registru nebo registrového páru.
1E94
FIND-INT1
1E99
1E9C
FIND-INT2
FIND-I-1
1E9F
REPORT-B
CALL
JR
CALL
JR
RET
RST
DEFB
kalkulátoru
#2DD5,FP-TO-A
#1E9C,FIND-I-1
#2DA2,FP-TO-BC
C,#1E9F,REPORT-B
Z
#08,ERROR-1
#0A
je
vyzvednuta
a
kompresována
RUN
CALL
LD
CALL
JR
#1E67,GO-TO
BC,#0000
#1E45,REST-RUN
#1EAF,CLEAR-1
jednoduchého
Vyzvedni hodnotu do A
a skoč.
Vyzvedni hodnotu do BC
a v obou případech skoč na chybu, je-li CY = 1.
Vrať se s pozitivními čísly, která jsou v rozsahu.
Ohlaš:
B-Integer out of range
PODPROGRAM PŘÍKAZU RUN
Parametry příkazu RUN jsou předány do NEWPPC voláním příkazového
návratem se provede RESTORE 0 a CLEAR 0.
1EA1
do
podprogramu GO TO. Před
Nastav NEWPPC na hodnotu operandu.
Proveď RESTORE 0.
Výstup přes příkaz CLEAR.
PODPROGRAM PŘÍKAZU CLEAR
Podprogram způsobí vyčištění oblasti proměnných, obrazovky a nastavení RAMTOP. Následkem této
poslední operace je znovu nastaven zásobník a tím také vyčištěn zásobník GO SUB.
1EAC
1EAF
CLEAR
CLEAR-RUN
1EB7
CLEAR-1
CALL
LD
OR
JR
LD
PUSH
LD
LD
DEC
CALL
CALL
#1E99,FIND-INT2
A,B
C
NZ,#1EB7,CLEAR-1
BC,(#5CB2) (RAMTOP)
BC
DE,(#5C4B) (VARS)
HL,(#5C59) (E-LINE)
HL
#19E5,RECLAIM-1
#0D6B,CLS
Vyzvedni operand a použij 0, neexistuje-li.
Pokud operand
není nulový,
skoč dopředu. (Při volání z RUN, ke skoku nedojde).
Použij stávající hodnotu RAMTOP.
Uschovej ji.
Zruš
oblast
proměnných.
Vyčisti obrazovku.
Hodnota v BC je testována na přípustné minimum a maximum.
1EDA
REPORT-M
LD
LD
ADD
POP
SBC
JR
LD
AND
SBC
JR
RST
DEFB
HL,(#5C65) (STKEND)
DE,#0032
HL,DE
DE
HL,DE
NC,#1EDA,REPORT-M
HL,(#5CB4) (P-RAMT)
A
HL,DE
NC,#1EDC,CLEAR-2
#08,ERROR-1
#15
Aktuální hodnota zásobníku
je zvýšena
o 50 bajtů,
což bude představovat
dolní limit.
RAMTOP je příliš nízký.
Je vyzvednuta hodnota P-RAMT
a testována
proti RAMTOP.
Skok dopředu, je-li hodnota přijatelná.
Ohlaš:
M-RAMTOP no good
Pokračuj operací CLEAR.
Komentovaný výpis paměti ROM
111
1EDC
CLEAR-2
EX
LD
POP
POP
LD
DEC
LD
PUSH
LD
EX
JP
DE,HL
(#5CB2),HL
DE
BC
(HL),#3E
HL
SP,HL
BC
(#5C3D),SP
DE,HL
(HL)
(RAMTOP)
(ERR-SP)
Skutečné
nastavení RAMTOP.
Vyzvedni adresu STMT-RET.
Vyzvedni "chybovou" adresu.
Vlož koncový znak pro zásobník GO SUB.
Vynech jedno místo.
Nastav ukazatel zásobníku na prázdný zásobník GO SUB.
Ulož "chybovou" adresu na zásobník
a uschovej jeho adresu do ERR-SP.
Zaměň adresy
a proveď nepřímý návrat do STMT-RET.
Poznámka: Je-li CLEAR volán příkazem RUN, je třeba najít další řádek skokem do STMT-RET,
protože hodnoty NEWPPC a NSPPC byly již změněny.
PODPROGRAM PŘÍKAZU GO SUB
Aktuální hodnota PPC a zvýšená hodnota SUBPPC jsou uloženy na zásobník GO SUB.
1EED
GO-SUB
POP
LD
INC
EX
INC
LD
PUSH
PUSH
LD
PUSH
CALL
LD
DE
H,(IY+13)
(SUBPPC)
H
(SP),HL
SP
BC,(#5C45) (PPC)
BC
HL
(#5C3D),SP (ERR-SP)
DE
#1E67,GO-TO-1
BC,#0014
Vyzvedni návratovou adresu k uschování v DE.
Vyzvedni číslo příkazu
a zvětši jej.
Zaměň "chybovou adresu" s číslem příkazu
a reklamuj tuto lokaci.
Dále ulož
číslo aktuálního řádku.
Vrať "chybovou" adresu na zásobník
a nastav ERR-SP, aby na ní ukazoval.
Vrať adresu STMT-RET.
Nyní nastav NEWPPC & NSPPC na potřebné hodnoty.
Připrav hodnotu na testování prostoru.
PODPROGRAM TESTOVÁNÍ PROSTORU
Provádí řadu testů je-li dostatečný prostor volné paměti pro vykonání prováděného úkolu.
1F05
TEST-ROOM
LD
ADD
JR
EX
LD
ADD
JR
SBC
RET
HL,(#5C65) (STKEND)
HL,BC
C, #1F15,REPORT-4
DE,HL
HL, #0050
HL,DE
C, #1F15,REPORT-4
HL,SP
C
Vezmi hodnotu STKEND
a zvyš ji o hodnotu vstupující v BC.
Skoč na chybové hlášení, došlo-li k přetečení.
Další pokus
s přičtením
80 bajtů.
Skoč na chybové hlášení, došlo-li k přetečení.
Testuj proti adrese zásobníku
a vrať se, pokud vyhovuje.
1F15
REPORT-4
LD
JP
L, #03
#0055,ERROR-3
Toto je chyba za běhu a proto nikdy
nebude použit chybový znak (otazník)
ZJIŠTĚNÍ VOLNÉ PAMĚTI
SPECTRUM sice nemá basicový příkaz "FREE", ale protože zde existuje tento podprogram, lze
velikost volné paměti zjistit použitím : PRINT 65536-USR 7962.
1F1A
112
FREE-MEM
LD
BC, #0000
CALL #1F05,TEST-ROOM
LD
B,H
Nepovoluje se "nic navíc".
Vlastní test.
Převedení
Komentovaný výpis paměti ROM
LD
RET
C,L
do BC
a návrat.
PODPROGRAM PŘÍKAZU RETURN
Ze zásobníku GO SUB se vyzvedne číslo řádku a příkazu.
1F23
RETURN
POP
POP
POP
LD
CP
JR
DEC
EX
EX
LD
PUSH
JP
BC
HL
DE
A,D
#3E
Z, #1F36,REPORT-7
SP
(SP),HL
DE,HL
(#5C3D),SP (ERR-SP)
BC
#1E73,GO-TO-2
Vyzvedni adresu STMT-RET.
Vyzvedni "chybovou" adresu.
Vyzvedni poslední položku ze zásobníku GO SUB.
Testuj, jestli se jedná
o koncový znak zásobníku GO SUB,
a v tom případě skoč do podprogramu chybových hlášení.
Celý údaj potřebuje tři bajty.
Zaměň číslo příkazu za "chybovou" adresu
a převeď do DE.
Nastav chybový ukazatel.
Vrať adresu STMT-RET na zásobník.
Skok na změnu NEWPPC & NSPPC.
1F36
REPORT-7
PUSH
PUSH
RST
DEFB
DE
HL
#08,ERROR-1
#06
Vlož koncový znak
a chybovou adresu.
Ohlaš:
7-RETURN without GOSUB
PODPROGRAM PŘÍKAZU PAUSE
Trvání pauzy je dáno čítáním maskovaných přerušení, ke kterým dochází každou 1/50 tinu sekundy.
PAUSE je ukončena buď po načtení příslušného počtu přerušení, nebo při stisku některé klávesy.
1F3A
1F3D
PAUSE
PAUSE-1
1F49
PAUSE-2
1F4F
PAUSE-END
CALL
HALT
DEC
LD
OR
JR
LD
AND
INC
JR
INC
BIT
JR
RES
RET
#1E99,FIND-INT2
BC
A,B
C
Z, #1F4F,PAUSE-END
A,B
C
A
NZ,#1F49,PAUSE-2
BC
5,(IY+1)
(FLAGS)
Z,#1F3D,PAUSE-1
5,(IY+1)
(FLAGS)
Vyzvedni operand.
Čekej na maskované přerušení.
Zmenši čítač.
Je-li nulový,
příkaz PAUSE
končí.
Jestliže byl operand nula,
BC bude obsahovat #FFFF
a tato je opět upravena na nulu.
Skok se všemi ostatními hodnotami.
Nebyla-li stištěna žádná klávesa,
skok zpět.
Signál: nebyla stištěna žádná klávesa.
Návrat do STMT-RET.
PODPROGRAM BREAK
Podprogram zjistí stištění klávesy BREAK, což signalizuje nastavením CY=0.
1F54
BREAK-KEY
LD
IN
RRA
RET
LD
IN
RRA
RET
A, #7F
A,(#FE)
C
A, #FE
A,(#FE)
Vytvoř adresu portu #7FFE
a načti bajt.
Testuj pouze bit 0, jeho rotací do CY.
Vrať se, pokud klávesa BREAK nebyla stištěna.
Vytvoř adresu portu #FEFE
a načti bajt.
Testuj pouze bit 0, jeho rotací do CY.
Vrať se s CY=0, pokud došlo k současnému stištění.
Komentovaný výpis paměti ROM
113
PODPROGRAM PŘÍKAZU DEF FN
Při kontrole syntaxe se testuje, zdali má příkaz správnou formu. Také se vytvoří prostor pro
výsledek ohodnocení funkce. Ale pokud je program v běhu, tento příkaz se vynechá.
1F60
DEF-FN
CALL
JR
LD
JP
#2530,SYNTAX-Z
Z, #1F6A,DEF-FN-1
A, #CE
#1E39,PASS-BY
Při kontrole syntaxe
skok dopředu.
Jinak
vynechání příkazu.
Nejdříve se posuzuje proměnná této funkce.
1F6A
DEF-FN-1
1F7D
DEF-FN-2
SET
CALL
JR
RST
CP
JR
RES
RST
CP
JR
RST
CP
JR
6,(IY+1)
(FLAGS)
#2C8D,ALPHA
NC,#1F89,DEF-FN-4
#20,NEXT-CHAR
#24
NZ,#1F7D,DEF-FN-2
6,(IY+1)
(FLAGS)
#20,NEXT-CHAR
#28
NZ,#1FBD,DEF-FN-7
#20,NEXT-CHAR
#29
Z,#1FA6,DEF-FN-6
Signál: číselná proměnná.
Je aktuální znak v registru A písmeno?
Skok dopředu, jestliže ne.
Vyzvedni další znak.
Nejedná-li se o $,
skoč dopředu.
Změň bit 6, protože se jedná o řetězcovou proměnnou.
Vyzvedni další znak.
Závorka musí následovat za názvem proměnné. "(".
Skok na chybu.
Vyzvedni další znak.
Test na závorku ")".
Skoč, jestliže funkce nemá parametry.
Zde se vstupuje do smyčky, která postupně ošetří všechny parametry.
1F86
1F89
DEF-FN-3
DEF-FN-4
1F94
DEF-FN-5
CALL
JP
EX
RST
CP
JR
EX
RST
EX
LD
CALL
INC
INC
LD
CP
JR
RST
JR
#2C8D,ALPHA
NC,#1C8A,REPORT-C
DE,HL
#20,NEXT-CHAR
#24
NZ,#1F94,DEF-FN-5
DE,HL
#20,NEXT-CHAR
DE,HL
BC,#0006
#1655,MAKE-ROOM
HL
HL
(HL),#0E
#2C
NZ,#1FA6,DEF-FN-6
#20,NEXT-CHAR
#1F86,DEF-FN-3
Je aktuální znak v registru A písmeno?
Skok na chybu, jestliže ne.
Uschovej ukazatel v DE.
Vyzvedni další znak.
Nejedná-li se o $,
skoč dopředu.
Uschovej nový ukazatel v DE.
Vyzvedni další znak.
Předej ukazatel na poslední písmeno názvu do HL
a vytvoř prostor 6 bajtů
za tímto posledním znakem názvu.
Do první
z nových lokací
ulož znak uvádějící FP číslo.
Není-li aktuální znak čárka,
opusť smyčku, protože nejsou další parametry.
Vyzvedni další znak
a skoč zpět pro další parametry.
Dále je posouzena definice funkce.
1FA6
114
DEF-FN-6
CP
JR
RST
CP
JR
RST
LD
PUSH
#29
NZ,#1FBD,DEF-FN-7
#20,NEXT-CHAR
#3D
NZ,#1FBD,DEF-FN-7
#20,NEXT-CHAR
A,(#5C3B)
(FLAGS)
AF
Kontrola, že závorka ")" skutečně existuje.
Skok na chybu.
Vyzvedni další znak
a není-li to rovnítko,
skoč na chybu.
Vyzvedni další znak.
Vyzvedni jeho typ (číselná/řetězcová proměnná)
a uschovej.
Komentovaný výpis paměti ROM
1FBD
DEF-FN-7
CALL
POP
XOR
AND
JP
CALL
#24FB,SCANNING
AF
(IY+1)
(FLAGS)
#40
NZ,#1C8A,REPORT-C
#1BEE,CHECK-END
Posuď definici jako výraz.
Vyzvedni typ proměnné
a testuj je-li stejného typu
jako proměnná nalezená pro definici.
Pokud je to třeba, skoč na chybu.
Výstup přes CHECK-END a tím posun na hodnocení dalšího
příkazu.
PODPROGRAM UNSTACK-Z
Tento podprogram je volán v mnoha případech k provedení "dřívějšího" návratu z podprogramu při
kontrole syntaxe. Tím se zabrání nežádoucím tiskům a přesouvání hodnot na zásobníku kalkulátoru.
1FC3
UNSTACK-Z
CALL
POP
RET
JP
#2530,SYNTAX-Z
HL
Z
(HL)
Jde o kontrolu syntaxe?
Vyzvedni návratovou adresu
a ignoruj ji při kontrole syntaxe.
Za běhu programu proveď obyčejný návrat.
PODPROGRAMY PŘÍKAZU LPRINT & PRINT
Otevře se příslušný kanál a potom se postupně zkoumají jednotlivé položky, které mají být
vytisknuty.
1FC9
LPRINT
1FCD
1FCF
PRINT
PRINT-1
LD
JR
LD
CALL
CALL
CALL
CALL
CALL
RET
A, #03
#1FCF,PRINT-1
A, #02
#2530,SYNTAX-Z
NZ,#1601,CHAN-OPEN
#0D4D,TEMPS
#1FDF,PRINT-2
#1BEE,CHECK-END
Příprava na otevření kanálu P.
Skok dopředu.
Příprava na otevření kanálu S.
Pokud nekontroluješ syntaxi,
skoč na otevření kanálu.
Nastav přechodné barvy.
Volej tiskový podprogram.
Při kontrole syntaxe se posuň na další příkaz.
Vrať se.
Tiskový podprogram je volán z programu PRINT, LPRINT & INPUT.
1FDF
PRINT-2
RST #18,GET-CHAR
CALL #2045,PR-END-Z
JR
Z,#1FF2,PRINT-4
Vyzvedni první znak
a jsi-li již na konci seznamu položek,
skoč dopředu.
Nyní vstup do smyčky, která obsluhuje poziční znaky a tiskové položky.
1FE5
PRINT-3
1FF2
PRINT-4
CALL
JR
CALL
CALL
JR
CP
RET
#204E,PR-POSN-1
Z,#1FE5,PRINT-3
#1FFC,PR-ITEM-1
#204E,PR-POSN-1
Z,#1FE5,PRINT-3
#29
Z
Obsluž všechny následovné poziční znaky.
Obsluž jednoduché tiskové položky.
Testuj, jestli jsou další položky
a tiskni všechny až do konce
Je-li aktuální znak závorka ")",
vrať se. Jinak postup do podprogramu CR.
PODPROGRAM "CR - NÁVRAT VOZÍKU"
1FF5
PRINT-CR
CALL #1FC3,UNSTACK-Z
LD
A,#0D
RST #10,PRINT-A-1
RET
Vrať se při kontrole syntaxe.
Proveď CR
a vrať se.
Komentovaný výpis paměti ROM
115
PODPROGRAM TISKU POLOŽEK
Podprogram je volán z programu PRINT, LPRINT & INPUT.
1FFC
PR-ITEM-1
200E
PR-ITEM-2
RST
CP
JR
CALL
CALL
CALL
LD
JR
CP
JR
RST
CALL
CALL
CALL
LD
#18,GET-CHAR
#AC
NZ,#200E,PR-ITEM-2
#1C79,NEXT-2NUM
#1FC3,UNSTACK-Z
#2307,STK-TO-BC
A,#16
#201E,PR-AT-TAB
#AD
NZ,#2024,PR-ITEM-3
#20,NEXT-CHAR
#1C82,EXPT-1NUM
#1FC3,UNSTACK-Z
#1E99,FIND-INT2
A,#17
Vyzvedni první znak.
Pokud to není token AT,
skoč dopředu.
Předej dva parametry na zásobník kalkulátoru.
Návrat při kontrole syntaxe.
Parametry do BC.
Řídící znak AT do registru A
a skok na provedení.
Pokud to není token TAB,
skoč dopředu.
Vyzvedni další znak.
Předej jeden parametr na zásobník kalkulátoru.
Návrat při kontrole syntaxe.
Parametr do BC.
Řídící znak TAB do registru A.
AT a TAB se provedou třemi voláními PRINT-OUT.
201E
PR-AT-TAB
RST
LD
RST
LD
RST
RET
#10,PRINT-A-1
A,C
#10,PRINT-A-1
A,B
#10,PRINT-A-1
Tiskni řídící znak.
Následuje hodnota
prvního parametru.
A hodnota
druhého parametru.
Vrať se.
Dále posuzuj "implantované informace" o barvách.
2024
PR-ITEM-3
CALL
RET
CALL
RET
#21F2,CO-TEMP-3
NC
#2070,STR-ALTER
NC
Pokud je taková informace obsažena,
vrať se CY=0.
Posuzuj, má-li být změněn proud.
Pokračuj, pokud ne.
Tisková informace musí být číselný nebo řetězcový výraz.
CALL
CALL
BIT
CALL
JP
#24FB,SCANNING
#1FC3,UNSTACK-Z
6,(IY+1)
(FLAGS)
Z,#2BF1,STK-FETCH
NZ,#2DE3,PRINT-FP
Proveď hodnocení výrazu,
ale vrať se, pokud provádíš kontrolu syntaxe.
Test typu výrazu.
Je-li to řetězec, vyzvedni potřebné parametry.
Je-li to číslo, vystup přes PRINT-FP.
Následující smyčka zpracuje postupně všechny znaky v řetězci.
203C
PR-STRING
LD
OR
DEC
RET
LD
INC
RST
JR
A,B
C
BC
Z
A,(DE)
DE
#10,PRINT-A-1
#203C,PR-STRING
Pokud jsou všechny
znaky
vypsány,
vrať se.
Vyzvedni kód
a posuň ukazatel.
Tiskni znak.
A skoč na další posouzení.
PODPROGRAM "KONEC TISKU"
Z flag = 1, není-li co tisknout.
116
Komentovaný výpis paměti ROM
2045
PR-END-Z
2048
PR-ST-END
CP
RET
CP
RET
CP
RET
#29
Z
#0D
Z
#3A
Je-li znak závorka ")",
vrať se.
Je-li znak CR,
vrať se.
Před návratem testuj znak dvojtečky.
PODPROGRAM "TISK POZICE"
Tento podprogram zpracuje různé znaky řídící tiskovou pozici.
204E
PR-POSN-1
2061
PR-POSN-2
2067
PR-POSN-3
206E
PR-POSN-4
RST
CP
JR
CP
JR
CALL
JR
LD
RST
JR
CP
RET
CALL
RST
CALL
JR
POP
CP
RET
#18,GET-CHAR
#3B
Z,#2067,PR-POSN-3
#2C
NZ,#2061,PR-POSN-2
#2530,SYNTAX-Z
Z,#2067,PR-POSN-3
A,#06
#10,PRINT-A-1
#2067,PR-POSN-3
#27
NZ
#1FF5,PR-CR
#20,NEXT-CHAR
#2045,PR-END-Z
NZ,#206E,PR-POSN-4
BC
A
Vyzvedni aktuální znak.
Je-li to středník,
skoč dopředu.
Je-li to čárka,
skoč dopředu.
Ale při kontrole syntaxe
znak netiskni.
Dej do A řídící kód čárky
vytiskni ji
a skoč dopředu.
Testuj apostrof " ' "
a vrať se pokud to nebyl některý z pozičních znaků.
Pokud nekontroluješ syntaxi, tiskni CR.
Vyzvedni další znak.
Nejsi-li na konci tiskového příkazu,
skoč dopředu.
Jinak se vrať do volajícího podprogramu.
Nebylo-li dosaženo konce příkazu,
nastaví se Z flag=0.
PODPROGRAM "ZMĚNA PROUDU"
Kdykoliv je třeba posoudit, jestli uživatel chce použít odlišný proud, volá se tento podprogram.
2070
STR-ALTER
CP
SCF
RET
RST
CALL
AND
CALL
CALL
CP
JP
CALL
AND
RET
#23
NZ
#20,NEXT-CHAR
#1C82,EXPT-1NUM
A
#1FC3,UNSTACK-Z
#1E94,FIND-INT1
#10
NC,#160E,REPORT-O
#1601,CHAN-OPEN
A
Testuj znak " # "
a pokud není,
vrať se s CY=1.
Vyzvedni další znak.
Parametr na zásobník kalkulátoru.
CY=0.
Vrať se při kontrole syntaxe.
Vyzvedni hodnotu do A.
Pokud je hodnota větší než #0F,
skoč na chybové hlášení.
Otevři kanál pro daný proud.
CY=0
a vrať se.
PODPROGRAM PŘÍKAZU INPUT
Tento podprogram umožňuje přidělení hodnot vstupujících z klávesnice do dané proměnné. Současně
zajišťuje aby tisková informace se zobrazovala do dolní části obrazovky.
2089
INPUT
CALL
JR
LD
CALL
#2530,SYNTAX-Z
Z,#2096,INPUT-1
A,#01
#1601,CHAN-OPEN
Při kontrole syntaxe
skoč dopředu.
Kanál K
a jeho otevření.
Komentovaný výpis paměti ROM
117
2096
INPUT-1
20AD
INPUT-2
CALL
LD
CALL
CALL
LD
LD
CP
JR
LD
LD
LD
LD
SUB
LD
RES
CALL
JP
#0D6E,CLS-LOWER
(IY+2),#01 (TV-FLAG)
#20C1,IN-ITEM-1
#1BEE,CHECK-END
BC,(#5C88) (S-POSN)
A,(#5C6B)
(DF-SZ)
B
C,#20AD,INPUT-2
C,#21
B,A
(#5C88),BC (S-POSN)
A,#19
B
(#5C8C),A (SCR-CT)
0,(IY+2)
(TV-FLAG)
#0DD9,CL-SET
#0D6E,CLS-LOWER
Smazání dolní části obrazovky.
Nastav dolní část obrazovky na velikost jednoho řádku.
Volej obsluhu vložených tisků.
Při kontrole syntaxe postup na další příkaz.
Vyzvedni aktuální tiskovou pozici
a pokud se tato
nachází nad dolní částí obrazovky,
skoč dopředu.
Jinak nastav tiskovou pozici
na nejvyšší řádek
dolní části obrazovky.
Nyní
nastav
čítač rolování.
Signál: hlavní obrazovka.
Nastav systémové proměnné
a proveď výstup přes CLS-LOWER.
Tato smyčka se zabývá položkami INPUT a PRINT.
20C1
IN-ITEM-1
CALL
JR
CP
JR
RST
CALL
RST
CP
JP
RST
JP
#204E,PR-POSN-1
Z,#20C1,IN-ITEM-1
#28
NZ,#20D8,IN-ITEM-2
#20,NEXT-CHAR
#1FDF,PRINT-2
#18,GET-CHAR
#29
NZ,#1C8A,REPORT-C
#20,NEXT-CHAR
#21B2,IN-NEXT-2
Nejprve posuzuj poziční znaky.
Jestliže aktuální znak není závorka " ( ",
skoč dopředu.
Vyzvedni další znak.
Vytiskni položky uvnitř závorek.
Vyzvedni znak
a pokud to není závorka " ) ",
skoč na chybové hlášení.
Vyzvedni další znak
a skoč na posouzení dalších případných položek.
Nyní posuzuj, je-li použito INPUT LINE.
20D8
IN-ITEM-2
CP
JR
RST
CALL
SET
BIT
JP
JR
#CA
NZ,#20ED,IN-ITEM-3
#20,NEXT-CHAR
#1C1F,CLASS-01
7,(IY+55)
(FLAGX)
6,(IY+1)
(FLAGS)
NZ,#1C8A,REPORT-C
#20FA,IN-PROMPT
Nejedná-li se o LINE,
skoč dopředu.
Vyzvedni další znak.
Určení cílové adresy pro proměnnou.
Signál: INPUT LINE.
Nejedná-li se o řetězcovou proměnnou,
skoč dopředu.
Skok na vypsání náznaku.
Zpracování proměnných INPUT.
20ED
IN-ITEM-3
20FA
IN-PROMPT
118
CALL
JP
CALL
RES
CALL
JP
CALL
LD
RES
SET
LD
BIT
JR
#2C8D,ALPHA
NC,#21AF,IN-NEXT-1
#1C1F,CLASS-01
7,(IY+55)
(FLAGX)
#2530,SYNTAX-Z
Z,#21B2,IN-NEXT-2
#16BF,SET-WORK
HL,#5C71
6,(HL)
5,(HL)
BC,#0001
7,(HL)
NZ,#211C,IN-PR-2
Není-li aktuální znak písmeno,
skoč zpět do smyčky.
Určení cílové adresy proměnné.
Signál: Nejedná se o INPUT LINE.
Jestliže kontroluješ syntaxi,
skoč dopředu.
Pracovní prostor je nastaven na nulu.
Toto je FLAGX.
Signál: řetězcový výsledek.
Signál: INPUT mode.
Náznak zabere jedno místo.
Při použití LINE
skoč dopředu.
Komentovaný výpis paměti ROM
211A
IN-PR-1
211C
IN-PR-2
2129
IN-PR-3
LD
AND
JR
LD
OR
LD
RST
LD
LD
RRCA
RRCA
JR
LD
LD
DEC
LD
LD
A,(#5C3B)
(FLAGS)
#40
NZ,#211A,IN-PR-1
C,#03
(HL)
(HL),A
#30,BC-SPACES
(HL),#0D
A,C
NC,#2129,IN-PR-3
A,#22
(DE),A
HL
(HL),A
(#5C5B),HL (K-CUR)
Očekáváš-li
číselný vstup,
skoč dopředu.
Řetězcová náznak zabere tři místa.
Pro číselnou položku
bude nastaven bit 6 FLAGX.
Je vytvořen požadovaný prostor.
Znak CR na poslední místo.
Testováním bitu 6
registru C se zjistí
bylo-li vytvořeno pouze jedno místo
a v tom případě se provede skok.
Znak uvozovek
přijde na první
a druhé
místo.
Je uschována pozice kurzoru.
V případě INPUT LINE může být editor volán bez další přípravy, ale pro ostatní typy INPUTů musí
být pozměněn chybový zásobník, aby zachytával případně chyby.
213A
IN-VAR-1
2148
IN-VAR-2
215E
IN-VAR-3
BIT
JR
LD
PUSH
LD
PUSH
LD
PUSH
BIT
JR
LD
LD
CALL
LD
CALL
RES
CALL
JR
CALL
7,(IY+55)
(FLAGX)
NZ,#215E,IN-VAR-3
HL,(#5C5D) (CH-ADD)
HL
HL,(#5C3D) (ERR-SP)
HL
HL,#213A
HL
4,(IY+48)
(FLAGS2)
Z,#2148,IN-VAR-2
(#5C3D),SP (ERR-SP)
HL,(#5C61) (WORKSP)
#11A7,REMOVE-FP
(IY+0),#FF (ERR-NR)
#0F2C,EDITOR
7,(IY+1)
(FLAGS)
#21B9,IN-ASSIGN
#2161,IN-VAR-4
#0F2C,EDITOR
Pokud jde o INPUT LINE,
skok dopředu.
Uschovej aktuální hodnotu CH-ADD
na zásobníku.
Uschovej aktuální hodnotu ERR-SP
na zásobníku.
Toto bude bod návratu
v případe výskytu chyby.
Pokud používáš kanál K,
přeskoč dopředu.
Nastav ukazatel chyby.
Nastav HL na začátek řádku INPUT
a odstraň FP formy.
Signál: zatím žádná chyba.
Nyní vezmi INPUT
a nastav signál : kontrola syntaxe.
Testuj INPUT na chyby
a skoč, je-li vše v pořádku.
Vem LINE.
Všechny systémové proměnné musí být nastaveny, než se provede skutečné přidělení hodnoty.
2161
IN-VAR-4
2174
IN-VAR-5
LD
CALL
JR
CALL
LD
CALL
LD
RES
BIT
RES
JR
POP
POP
LD
POP
(IY+34),#00 (K-CUR-hi) Adresa kurzoru je resetována.
#21D6,IN-CHAN-K
Pokud se používá jiný kanál než K
NZ,#2174,IN-VAR-5
provede se skok.
#111D,ED-COPY
Inputový řádek je vypsán na obrazovku
BC,(#5C82) (ECHO-E) a pozice z ECHO-E se stane aktuální tiskovou pozicí
#0DD9,CL-SET
v dolní části obrazovky.
HL,#5C71
Toto je FLAGX.
5,(HL)
Signál: edit mode.
7,(HL)
Pokud se jedná
7,(HL)
o INPUT LINE,
NZ,#219B,IN-VAR-6
skoč dopředu.
HL
Zahoď adresu IN-VAR-1.
HL
Vyzvedni
(#5C3D),HL (ERR-SP) a obnov původní adresu pro ERR-SP.
HL
Vyzvedni původní adresu CH-ADD
Komentovaný výpis paměti ROM
119
219B
IN-VAR-6
LD
SET
CALL
LD
LD
LD
JR
LD
LD
SCF
SBC
LD
LD
CALL
CALL
JR
(#5C5F),HL (X-PTR)
a uschovej ji v X-PTR.
7,(IY+1)
(FLAGS)
Signál: běh programu.
#21B9,IN-ASSIGN
Proveď přidělení.
HL,(#5C5F) (X-PTR)
Původní adresa CH-ADD do HL.
(IY+38),#00 (X-PTR-hi) Vynulování X-PTR-hi
(#5C5D),HL (CH-ADD) a obnovení CH-ADD.
#21B2,IN-NEXT-2
Skok na posouzení případných dalších položek.
HL,(#5C63) (STKBOT) Konec LINE do HL.
DE,(#5C61) (WORKSP) Začátek LINE do DE.
HL,DE
B,H
C,L
#2AB2,STK-ST-$
#2AFF,LET
#21B2,IN-NEXT-2
Výpočet délky
a převod
do BC.
Tyto parametry jdou na zásobník
a provede se přidělení.
Skok na posouzení případných dalších položek.
Jsou posuzovány další položky.
21AF
21B2
IN-NEXT-1
IN-NEXT-2
CALL #1FFC,PR-ITEM-1
CALL #204E,PR-POSN-1
JP
Z,#20C1,IN-ITEM-1
RET
Ošetři jakoukoliv tiskovou položku.
Ošetři jakoukoliv poziční položku.
Případný skok na posouzení dalších položek.
Návrat.
PODPROGRAM "IN ASIGN"
Tento podprogram je volán dvakrát pro každý INPUT. Jednou při "kontrole syntaxe" a jednou za
běhu programu.
21B9
IN-ASSIGN
21CE
REPORT-C
LD
LD
RST
CP
JR
LD
CALL
RST
CP
RET
RST
DEFB
HL,(#5C61) (WORKSP)
(#5C5D),HL (CH-ADD)
#18,GET-CHAR
#E2
Z,#21D0,IN-STOP
A,(#5C71)
(FLAGX)
#1C59,VAL-FET-2
#18,GET-CHAR
#0D
Z
#08,ERROR-1
#0B
Nastav CH-ADD, aby ukazovala
na první místo pracovního prostoru.
Vyzvedni znak.
Je to token STOP?
Skoč, jestliže ano.
Jinak přiřaď
proměnné její hodnotu.
Vyzvedni znak
a pokud se jedná o CR,
vrať se.
Ohlaš:
C-Nonsence in BASIC.
Do tohoto bodu se skočí v případě, že INPUT začíná příkazem STOP.
21D0
IN-STOP
21D4
REPORT-H
CALL
RET
RST
DEFB
#2530,SYNTAX-Z
Z
#08,ERROR-1
#10
Ale při kontrole syntaxe
nebude ohlášena "chyba".
Ohlaš:
H-Stop in INPUT.
PODPROGRAM "IN-CHAN-K"
Podprogram vrací Z flag=0, jedině když se používá kanál K.
21D6
120
IN-CHAN-K
LD
INC
INC
INC
INC
HL,(#5C51)
HL
HL
HL
HL
(CURCHL)
Je vyzvednuta
bázová adresa
kanálových informací
a kód aktuálního
kanálu
Komentovaný výpis paměti ROM
LD
CP
RET
A,(HL)
#4B
je testován
proti znaku K.
Návrat.
PODPROGRAMY "BAREVNÝCH POLOŽEK"
Tento soubor podprogramů lze rozdělit na dvě části:
a) Část obsluhující "implementované" barevné informace.
b) Část obsluhující systémové proměnné ATTR-T,MASK-T a P-FLAG.
Barevné informace budou zpracovány postupně. Vstupní bod je CO-TEMP-2.
21E1
21E2
CO-TEMP-1
CO-TEMP-2
21F2
CO-TEMP-3
RST
CALL
RET
RST
CP
JR
CP
JR
JP
CP
RET
CP
CCF
RET
PUSH
RST
POP
#20,NEXT-CHAR
#21F2,CO-TEMP-3
C
#18,GET-CHAR
#2C
Z,#21E1,CO-TEMP-1
#3B
Z,#21E1,CO-TEMP-1
#1C8A,REPORT-C
#D9
C
#DF
C
AF
#20,NEXT-CHAR
AF
Vyzvedni další znak.
Posuď, je-li tento znak vloženou barevnou informací.
Vrať se s CY=1, pokud není.
Vyzvedni aktuální znak.
Je-li to čárka,
skoč zpět.
Je-li to středník,
skoč zpět.
Jinak ohlaš chybu.
Jestliže testovaný kód není
v rozsahu
#D9 až #DD (INK až OVER),
vracej se
s CY=1.
Uschovej kód barevné informace
a posuň ukazatel na parametr.
Obnov kód.
Kód barevné informace a jeho parametry jsou nyní vytisknuty voláním podprogramu PRINT-OUT.
21FC
CO-TEMP-4
SUB
#C9
PUSH
CALL
POP
AND
CALL
PUSH
CALL
LD
POP
RST
LD
RST
RET
AF
#1C82,EXPT-1NUM
AF
A
#1FC3,UNSTACK-Z
AF
#1E94,FIND-INT1
D,A
AF
#10,PRINT-A-1
A,D
#10,PRINT-A-1
Kód token je snížen na hodnotu řídícího znaku
(#10 až #15).
Uschovej kód.
Předej parametr na zásobník kalkulátoru.
Obnov kód
a pokud kontroluješ syntaxi,
vrať se pomocí UNSTACK-Z.
Uschovej kód.
Vyzvedni parametr
a převeď do D.
Obnov kód
a vytiskni jej.
Parametr do A
a vytiskni jej.
Vrať se.
B) Barevné systémové proměnné (ATTR-T, MASK-T & P-FLAG) jsou upraveny na požadované hodnoty.
Podprogram je volán z podprogramu PRINT-OUT. Na vstupu je kód řídícího znaku v registru A a jeho
parametr v registru D. Všechny změny barev jsou pouze "přechodné".
2211
CO-TEMP-5
SUB
ADC
JR
SUB
ADC
JR
#11
A,#00
Z,#2234,CO-TEMP-7
#02
A,#00
Z,#2273,CO-TEMP-C
Snižuj rozsah
a skoč dopředu
při INK & PAPER.
Ještě sniž rozsah
a skoč dopředu
při FLASH & BRIGHT.
Komentovaný výpis paměti ROM
121
Kód řídícího znaku je nyní #01 pro INVERSE a #02 pro OVER. Podle toho bude nastavena systémová
proměnné P-FLAG.
2228
CO-TEMP-6
CP
LD
LD
JR
RLCA
RLCA
LD
LD
LD
CP
JR
LD
LD
JR
#01
A,D
B,#01
NZ,#2228,CO-TEMP-6
B,#04
C,A
A,D
#02
NC,#2244,REPORT-K
A,C
HL,#5C91
#226C,CO-CHANGE
Příprava na skok pro OVER.
Vyzvedni parametr.
Připrav masku pro OVER.
Skoč, jde-li o OVER.
Pro INVERSE 0 musí být bit 2 registru A nastaven na nulu.
Pro INVERSE 1 musí být bit 2 reg. A nastaven na jedničku.
Maska má bit 2 nastaven na jedničku.
Uschovej obsah A.
Povolený rozsah parametru
je pouze #00 až #01.
Skok na chybu, jeli mimo rozsah.
Vyzvedni zpět A.
Toto je P-FLAG, který se bude měnit.
Výstup přes CO-CHANGE se změnou P-FLAG maskou
v registru B.
V této části se zpracuje PAPER a INK. Na vstupu je CY=1 pro INK.
2234
CO-TEMP-7
223E
CO-TEMP-8
2244
REPORT-K
LD
LD
JR
RLCA
RLCA
RLCA
LD
LD
LD
CP
JR
RST
DEFB
A,D
B,#07
C,#223E,CO-TEMP-8
Vyzvedni parametr.
Připrav masku pro INK.
Skoč dopředu s INK.
Vynásob parametr osmi.
B,#38
C,A
A,D
#0A
C,#2246,CO-TEMP-9
#08,ERROR-1
#13
Připrav masku pro PAPER.
Uschovej parametr v C.
Povolený rozsah parametru.
je pouze #00 až #09.
Skoč, je-li rozsah dodržen.
Ohlaš:
K-Invalid colour
Pokračuj zpracováním řádek PAPER & INK.
2246
2257
CO-TEMP-9
CO-TEMP-A
LD
CP
JR
LD
JR
OR
CPL
AND
JR
LD
LD
HL,#5C8F
#08
C,#2258,CO-TEMP-B
A,(HL)
Z,#2257,CO-TEMP-A
B
#24
Z,#2257,CO-TEMP-A
A,B
C,A
Příprava na změnu ATTR-T, MASK-T & P-FLAG.
Skoč dopředu
s PAPER/INK 0 až 7.
Vyzvedni hodnotu ATTR-T a pokud je PAPER/INK 8,
skoč dopředu (barva se nemění).
Ale pro PAPER/INK 9
budou barvy černá a bílá.
Skoč s černými INK/PAPER.
Pokračuj s bílými INK/PAPER.
Převeď hodnotu do C.
Nyní jsou použity maska B a hodnota C ke změně ATTR-T.
2258
122
CO-TEMP-B
LD
CALL
LD
CP
SBC
CALL
A,C
#226C,CO-CHANGE
A,#07
D
A,A
#226C,CO-CHANGE
Hodnota zpět do A.
Změna ATTR-T.
Bity MASK-T
se budou měnit
pouze pro
PAPER/INK 8 nebo 9.
Komentovaný výpis paměti ROM
RLCA
RLCA
AND
LD
LD
CP
SBC
#50
B,A
A,#08
D
A,A
Pro P-FLAG
je příslušná maska
vytvořena
v registru B.
Bit 4 a 6 bude změněn
jedině v případě že
PAPER/INK je 9. Pokračuj přes CO-CHANGE na zpracování
P-FLAG.
PODPROGRAM "CO-CHANGE"
Tento podprogram předá systémové proměnné bity vstupující v registru A. Maska v B ukazuje,
které bity z A mají být kopírovány na (HL).
226C
CO-CHANGE
XOR
AND
XOR
LD
INC
LD
RET
(HL)
B
(HL)
(HL),A
HL
A,B
Bity specifikované
registrem B
jsou změněny
a výsledek jde do systémové proměnné.
Přejdi na adresu další systémové proměnné.
Vrať se s maskou
v registru A.
Nyní se zpracuje FLASH & BRIGHT.
2273
CO-TEMP-C
227D
CO-TEMP-D
2287
CO-TEMP-E
SBC
LD
RRCA
LD
JR
RRCA
LD
LD
LD
CP
JR
CP
JR
LD
LD
CALL
LD
RRCA
RRCA
RRCA
JR
A,A
A,D
B,#80
NZ,#227D,CO-TEMP-D
B,#40
C,A
A,D
#08
Z,#2287,CO-TEMP-E
#02
NC,#2244,REPORT-K
A,C
HL,#5C8F (ATTR-T)
#226C,CO-CHANGE
A,C
#226C,CO-CHANGE
Pro BRIGHT bude Z - flag = 0.
Parametr je vyzvednut
a rotován.
Připrav masku pro FLASH.
Skoč dopředu jde-li o FLASH.
Další rotace
a příprava masky pro BRIGHT.
Uschovej hodnotu v C.
Vyzvedni parametr a testuj jeho rozsah.
Povoleno je pouze #08,
#01
a #02.
Skoč na chybové hlášení pokud tomu tak není.
Obnov uschovanou hodnotu do A.
Toto je ATTR-T.
Proveď změnu této systémové proměnné.
Obnov uschovanou hodnotu do A.
Rotuj, aby bit nastavený
pro FLASH/BRIGHT 8 přešel na místo
bitu 7 pro FLASH nebo bitu 6 pro BRIGHT.
Vystup přes CO-CHANGE.
PODPROGRAM PŘÍKAZU BORDER
Parametr příkazu BORDER je proveden instrukcí OUT a uschován v systémové proměnné BORDCR.
2294
BORDER
CALL
CP
JR
OUT
RLCA
RLCA
RLCA
BIT
JR
#1E94,FIND-INT1
#08
NC,#2244,REPORT-K
(#FE),A
5,A
NZ,#22A6,BORDER-1
Vyzvedni parametr
a testuj jeho rozsah.
Skok na chybu, je-li parametr větší než 7.
Nastav barvu BORDER
násob
parametr
osmi.
Je-li barva BORDER světlá,
skoč dopředu (INK bude černý).
Komentovaný výpis paměti ROM
123
22A6
BORDER-1
XOR
LD
RET
#07
(#5C48),A (BORDCR)
Změna barvy INK.
Nastav systémovou proměnnou.
Vrať se.
PODPROGRAM "ADRESA OBRAZOVÉHO BODU"
Je používán podprogramy POINT a PLOT. Na vstupu obsahuje BC souřadnice x,y. Na výstupu je v HL
adresa bajtu obrazovky, ve kterém je daný bod obsažen a registr A ukazuje na jeho pozici uvnitř tohoto
bajtu.
22AA
PIXEL-ADD
LD
SUB
JP
LD
AND
RRA
SCF
RRA
AND
RRA
XOR
AND
XOR
LD
LD
RLCA
RLCA
RLCA
XOR
AND
XOR
RLCA
RLCA
LD
LD
AND
RET
A,#AF
B
C,#24F9,REPORT-B
B,A
A
A
B
#F8
B
H,A
A,C
Testuj, zdali souřadnice y
není větší než 175
a jestliže ano, skoč na ohlášení
B nyní obsahuje 175-y.
A obsahuje bity: 7 6 5 4 3 2 1 0
A obsahuje: 00 a bity: 7 6 5 4 3
CY=1
A obsahuje: 01 00 a bity 7 6 5 4
CY=0
A obsahuje: 00 01 00 a bity: 7 6
chyby.
bajtu z reg. B + CY=0.
2 1.
3 2.
5 4 3.
A obsahuje: 00 01 00 a bity: 7 6 2 1 0.
Takže H bude obsahovat 64+8*INT (b/64)+(b mod 8)
což je vyšší bajt adresy bodu.
A obsahuje bity:7 6 5 4 3 2 1 0 bajtu z reg. C.
A obsahuje bity: 2 1 0 7 6 5 4 3.
B
#C7
B
A obsahuje bity: 2 1 5 4 3 5 4 3.
L,A
A,C
#07
A obsahuje bity: 5 4 3 7 6 5 4 3.
Takže L bude 32*INT (b/(b mod 64)/8)+INT (x/8).
A obsahuje x (mod 8).
Takže bod je bit (0 až 7) uvnitř daného bajtu.
PODPROGRAM POINT
Je používán podprogramem příkazu POINT při prohledávání. Na vstupu jsou souřadnice x, y uloženy
na zásobníku kalkulátoru a na výstupu je na zásobníku 1, pokud má bod barvu INK a 0, je-li to barva
PAPER.
22CB
POINT-SUB
22D4
POINT-LP
124
CALL
CALL
LD
INC
LD
RLCA
DJNZ
AND
JP
#2307,STK-TO-BC
#22AA,PIXEL-ADD
B,A
B
A,(HL)
#22D4,POINT-LP
#01
#2D28,STACK-A
Y do reg.B a x do reg. C.
Adresa bodu do HL.
B bude počítat A+1 krát
aby se požadovaný bit převedl do bitu 0.
Vyzvedni bajt z videoram.
Rotuj doleva a zároveň do CY.
Bit=1 pro inkoust, 0 pro papír.
Výsledek je uložen na zásobník kalkulátoru.
Komentovaný výpis paměti ROM
PODPROGRAM PŘÍKAZU PLOT
Je využíván také programy CIRCLE a DRAW. Na vstupu jsou souřadnice x, y uloženy na zásobníku
kalkulátoru. Po nalezení adresy se bere v úvahu stav INVERSE a OVER a nakreslí příslušný bod.
22DC
PLOT
22E5
PLOT-SUB
22F0
PLOT-LOOP
22FD
PL-TST-IN
2303
PLOT-END
CALL
CALL
JP
LD
CALL
LD
INC
LD
RRCA
DJNZ
LD
LD
LD
BIT
JR
AND
BIT
JR
XOR
CPL
LD
JP
#2307,STK-TO-BC
#22E5,PLOT-SUB
#0D4D,TEMPS
(#5C7D),BC (COORDS)
#22AA,PIXEL-ADD
B,A
B
A,#FE
#22F0,PLOT-LOOP
B,A
A,(HL)
C,(IY+87) (P-FLAG)
0,C
NZ,#22FD,PL-TST-IN
B
2,C
NZ,#2303,PLOT-END
B
(HL),A
#0BDB,PO-ATTR
Y do reg. B a x do reg. C.
Volání podprogramu.
Výstup s nastavením přechodných barev.
Nastav systémovou proměnnou.
Adresa bodu do HL.
B bude počítat A+1 krát,
aby se log. 0 dostala na správné místo v A.
Vložení nuly
a její nastavení
do bitu, který odpovídá pozici bodu
kopie do B.
Bajt obrazovky do A.
Test na OVER 1
a přeskok, když ano
OVER 0 způsobí, že bod bude mít hodnotu 0.
Test na INVERSE 1
a přeskok, když ano
INVERSE 0 překlopí
logickou hodnotu bodu.
Bajt je vložen na obrazovku.
Výstup s nastavením atributu.
PODPROGRAM STK-TO-BC
Tento podprogram uloží dvě FP čísla do registrového páru BC a je používán k vyzvednutí
parametrů v rozsahu #00 až #FF. Zároveň však ukládá do registrového páru DE tzv. diagonální hodnoty
(+-1,+-1), které jsou používány v podprogramu DRAW.
2307
STK-TO-BC
CALL
LD
PUSH
CALL
LD
POP
LD
LD
RET
#2314,STK-TO-A
B,A
BC
#2314,STK-TO-A
E,C
BC
D,C
C,A
První číslo do A.
Potom do B.
Chvilková úschova.
Druhé číslo do A a
jeho znaménko do E.
Obnov první číslo.
Jeho znaménko do D.
Druhé číslo do C.
BC a DE jsou nastaveny tak, jak bylo požadováno.
PODPROGRAM STK-TO-A
Tento podprogram uloží do registru A FP číslo z vrcholu kalkulátorového zásobníku. Číslo musí
být v rozsahu #00 až #FF.
2314
STK-TO-A
CALL
JP
LD
RET
LD
RET
#2DD5,FP-TO-A
C,#24F9,REPORT-B
C,#01
Z
C,#FF
Modul zaokrouhlené poslední hodnoty do registru A,
není-li to možné, ohlaš chybu.
#01 do C jako signál: pozitivní hodnota.
Vrať se, byla-li hodnota pozitivní.
V ostatních případech změň hodnotu v C na #FF (= -1).
Hotovo.
Komentovaný výpis paměti ROM
125
PŘÍKAZ CIRCLE
Tento podprogram narýsuje přibližnou kružnici se středem v bodě X,Y o poloměru Z. Parametry
jsou před použitím převedeny na tvar INTEGER. Proto Z musí být menší než 87.5, i když střed kružnice
leží ve středu obrazovky. Použitá metoda nakreslí sérii přímek aproximujících oblouk. Program CIRCLE
má čtyři části:
a) Test poloměru. Je-li poloměr menší než jedna, je narýsován pouze bod o souřadnicích X,Y.
b) Je zavolána CD-PRMS1 na adrese #247D, která se používá k nastavení počátečních parametrů pro
CIRCLE a DRAW.
c) Jsou nastaveny zbývající parametry pro CIRCLE včetně počátečního umístění prvního “oblouku“.
d) Skok do DRAW, kde je využito programu pro narýsování oblouku (na adrese #2420).
Nyní budou popsány postupně části a) až c).
ad a) #2320 až #233A. Poloměr Z je vyzvednut z kalkulátorového zásobníku a jeho hodnota je
převedena na vhodný tvar. Je-li Z menší než jedna, je vymazáno ze zásobníku a je proveden odskok pro
narýsování bodu o souřadnicích X,Y.
2320
CIRCLE
RST
CP
JP
RST
CALL
CALL
RST
DEFB
DEFB
#18,GET-CHAR
#2C
NZ,#1C8A,REPORT-C
#20,NEXT-CHAR
#1C82,EXPT-1NUM
#1BEE,CHECK-END
#28,FP-CALC
#2A,abs
#3D,re-stack
DEFB
LD
CP
JR
RST
DEFB
DEFB
JR
#38,konec výpočtu
A,(HL)
#81
NC,#233B,C-R-GRE-1
#28,FP-CALC
#02,výmaz
#38,konec výpočtu
#22DC,PLOT
Vyzvedni aktuální znak a
otestuj ho.
Ohlaš chybu, není-li to čárka.
Vyzvedni další znak (poloměr) a
ulož ho na zásobník kalkulátoru.
Přejdi na další příkaz při kontrole syntaxe.
Kalkulátor.
X,Y,Z
Tvar Z je převeden z INTEGERu na FP a ponechán na
zásobníku;
proto je jeho exponent k dispozici.
Vezmi exponent poloměru.
Testuj, jestli je menší než jedna.
Jestliže ne, skoč.
Je-li menší,
vymaž ho ze zásobníku.
Zásobník nyní obsahuje X,Y.
Narýsuj bod na souřadnicích X,Y.
ad b) #233B až #2346 a volání CD-PRMS1. 2*PI je uloženo do paměti č.5 a je zavoláno CD-PRMS1.
Tento program uloží do registru B počet křivek, které jsou potřebné pro kruh viz. A=4*INT(PI*SQR Z/4)+4,
což je 4,8,12 ... až do maxima 32. Také ukládá do paměti č.0 až č.4 hodnoty 2*PI/A, SIN(PI/A), 0, COS
(2*PI/A) a SIN (2*PI/A).
233B
C-R-GRE-1
RST
DEFB
DEFB
LD
RST
DEFB
DEFB
DEFB
CALL
#28,FP-CALC
#A3,stk-pi/2
#38,konec výpočtu
(HL),#83
#28,FP-CALC
#C5,st-mem-5
#02,výmaz
#38,konec výpočtu
#247D,CD-PRMS1
X,Y,Z,PI/2
Nyní dochází ke změně exponentu
na #83, čímž dochází ke změně PI/2 na 2*PI.
X,Y,Z,2*PI.
2*PI do mem-5.
X,Y,Z
Nastav počáteční parametry.
ad c) #2347 až #2381: zbývající parametry a skok na DRAW. Testuje se, jestli je délka
počátečního oblouku menší než jedna. Je-li tomu tak, provede se skok na prosté narýsování bodu o
souřadnicích X,Y. Jinak jsou nastaveny tyto parametry: X+Z a Y-Z* SIN (PI/A) jako počáteční a koncový
bod, a okopírovány do COORDS. Nula a hodnota 2*Z*SIN (PI/A) jsou uschovány v mem-1 a mem-2 jako
počáteční přírůstky. Smyčka příkazu DRAW, která zajišťuje rýsování oblouku, také zajistí, že všechny
narýsované body zůstanou na stejné kružnici, a přírůstkový úhel bude 2*PI/A.
126
Komentovaný výpis paměti ROM
2347
235A
C-ARC-GE1
PUSH
RST
DEFB
DEFB
DEFB
DEFB
LD
CP
JR
RST
DEFB
DEFB
DEFB
POP
JP
RST
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
BC
#28,FP-CALC
#31,zdvojení
#E1,get-mem-1
#04,násobení
#38,konec výpočtu
A,(HL)
#80
NC,#235A,C-ARC-GE1
#28,FP-CALC
#02,výmaz
#02,výmaz
#38,konec výpočtu
BC
#22DC,PLOT
#28,FP-CALC
#C2,st-mem-2
#01,záměna
#C0,st-mem-0
#02,výmaz
#03,odečítání
#01,záměna
#E0,get-mem-0
#0F,sčítání
#CO,st-mem-0
#01,záměna
#31,zdvojení
#E0,get-mem-0
#01,záměna
#31,zdvojení
#E0,get-mem-0
#A0,stk-nula
#C1,st-mem-1
#02,výmaz
#38,konec výpočtu
Úschova počítadla oblouků do B.
X,Y,Z
X,Y,Z,Z
X,Y,Z,Z,SIN (PI/A)
X,Y,Z,Z*SIN (PI/A)
Z*SIN (PI/A) je polovinou délky počátečního oblouku,
a tato hodnota je testována, aby se zjistilo,
jestli je menší než 0.5.
Když ne, provede se skok.
Jinak jsou Z a “polooblouk“ vymazány
ze zásobníku kalkulátoru.
Strojový zásobník je také vyčištěn a
provede se skok na vytištění bodu o souřadnicích X,Y.
X,Y,Z,Z*SIN (PI/A)
Z * SIN (PI/A) do mem-2.
X,Y,Z*SIN (PI/A),Z
X,Y,Z*SIN (PI/A),Z
X,Y,Z*SIN (PI/A)
X,Y-Z*SIN (PI/A)
Y-Z*SIN (PI/A),X
Y-Z*SIN (PI/A),X,Z
Y-Z*SIN (PI/A),X+Z
X+Z do mem-0.
X+Z,Y-Z*SIN (PI/A)
X+Z,Y-Z*SIN (PI/A), Y-Z*SIN (PI/A)
sa,sb,sb,sa
sa,sb,sa,sb
sa,sb,sa,sb,sb
sa,sb,sa,sb,sb,sa
sa,sb,sa,sb,sb,sa,0
mem-1 nastavena na nulu.
sa,sb,sa,sb,sb,sa
Zde “sa“ znamená X+Z a “sb“ znamená Y-Z*SIN (PI/A).
INC
CALL
LD
PUSH
CALL
POP
LD
LD
POP
JP
(IY+28) (mem-2-1-st)
#1E94,FIND-INT1
L,A
HL
#1E94,FIND-INT1
HL
H,A
(#5C7D),HL (COORDS)
BC
#2420,DRW-STEPS
Exponent v mem-2 je změněn-vzniká tvar 2*Z*SIN (PI/A).
Poslední hodnota X + Z je
předána ze zásobníku do registru A, a
je uschována v HL.
Y-Z*SIN (PI/A) jde ze zásobníku do A
a je kopírováno do H.
HL ukazuje na počáteční bod a ten jde do COORDS.
Je obnoveno počítadlo oblouků a
provede se skok na DRAW.
Nyní jsou na zásobníku hodnoty X+Z, Y-Z*SIN (PI/A), Y-Z*SIN (PI/A), X+Z.
Komentovaný výpis paměti ROM
127
PODPROGRAM PŘÍKAZU DRAW
Do tohoto podprogramu se vstupuje se souřadnicemi bodů, řekněme X0,Y0 v systémové proměnné
COORDS. Jsou-li pro příkaz DRAW udány pouze dva parametry X,Y, potom podprogram narýsuje přímku z bodu
X0,Y0 do bodu X0+X,Y0+Y. Je-li udán třetí parametr G, potom podprogram rýsuje aproximaci kruhového
oblouku z bodu o souřadnicích X0,Y0 do bodu X0+X,Y0+Y, jehož středový úhel je G rad.
Podprogram má čtyři části:
a) jsou-li udány pouze dva parametry nebo parametr poloměru je menší než jedna, je narýsována
prostá přímka.
b) volá CD-PRMS1 na #247D k nastavení počátečních parametrů.
c) nastavuje zbývající parametry a to včetně počátečních rozmístnění pro první oblouk.
d) vstupuje do smyčky pro rýsování oblouků na #24B7.
Dva podprogramy CD-PRMS1 a DRAW-LINE následují za
postupně popsány všechny čtyři části hlavního podprogramu.
tímto
hlavním
podprogramem.
Nyní
budou
ad a) Jsou-li udány pouze dva parametry provede se skok na LINE-DRAW na adrese #2477. Přímka se
rýsuje také v tom případě, je-li hodnota Z menší než jedna. Z leží jedním až jedenapůltým násobkem
průměru zamýšlené kružnice. V této části je nastavena mem-0 na SIN (G/2), mem-1 na Y a mem-5 na G.
2382
DRAW
238D
DR-3-PRMS
23A3
DR-SIN-NZ
128
RST
CP
JR
CALL
JP
RST
CALL
CALL
RST
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
JP
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
#18,GET-CHAR
#2C
Z,#238D,DR-3-PRMS
#1BEE,CHECK-END
#2477,LINE-DRAW
#20,NEXT-CHAR
#1C82,EXPT-1NUM
#1BEE,CHECK-END
#28,FP-CALC
#C5,st-mem-5
#A2,stk-polovinu
#04,násobení
#1F,sin
#31,zdvojení
#30,not
#30,not
#00,skok-pravda
#06,na DR-SIN-NZ
#02,výmaz
#38,konec výpočtu
#2477,LINE-DRAW
#C0,st-mem-0
#02,výmaz
#C1,st-mem-1
#02,výmaz
#31,zdvojení
#2A,abs
#E1,get-mem-1
#01,záměna
#E1,get-mem-1
#2A,abs
#0F,sčítání
#E0,get-mem-0
#05,dělení
#2A,abs
#E0,get-mem-0
#01,záměna
Vyzvedni aktuální znak.
Je-li to čárka,
skoč.
Při kontrole syntaxe se posuň na další příkaz.
Skoč na pouhé rýsování přímky.
Vyzvedni další znak (úhel),
který je uložen na zásobníku kalkulátoru.
Při kontrole syntaxe se posuň na další příkaz.
X,Y,G jsou na zásobníku.
G jde do mem-5
X,Y,G,0.5
X,Y,G/2
X,Y,SIN (G/2)
X,Y,SIN (G/2),SIN (G/2)
X,Y,SIN (G/2), (0 nebo 1)
X,Y,SIN (G/2), (1 nebo 0)
X,Y,SIN (G/2)
Jestli SIN (G/2)=0 tj. G=2*N*PI
narýsuj přímku.
X,Y
Přímka z bodu X0,Y0 do X0+X,Y0+Y.
SIN (G/2) jde do mem-0.
X,Y jsou nyní na zásobníku
Y jde do mem-1
X
X,X
X,X' (X'=ABS X)
X,X',Y
X,Y,X'
X,Y,X',Y
X,Y,X',Y' (Y'=ABS Y)
X,Y,X'+Y'
X,Y,X'+Y',SIN (G/2)
X,Y,(X'+Y')/SIN (G/2) (dále pouze Z')
X,Y,Z (Z=ABS Z')
X,Y,Z,SIN (G/2)
X,Y,SIN (G/2),Z
Komentovaný výpis paměti ROM
DEFB
DEFB
LD
CP
JR
RST
DEFB
DEFB
DEFB
JP
#3D,re-stack
#38,konec výpočtu
A,(HL)
#81
NC,#23C1,DR-PRMS
#28,FP-CALC
#02,delete
#02,delete
#38,konec výpočtu
#2477,LINE-DRAW
Z je v zásobníku převedeno tak,
aby byl k dispozici jeho exponent.
Vyzvedni exponent Z.
Je-li Z větší nebo rovno jedné,
skoč.
X,Y,SIN (G/2),Z
X,Y,SIN (G/2)
X,Y
Narýsuj přímku z bodu X0,Y0 do X0+X,Y0+Y.
ad b) Pouhé volání CD-PRMS1. Tento podprogram uchová v registru B počet kratších oblouků, které
jsou potřeba pro kompletní oblouk. Podprogram také ukládá v mem-0 až v mem-4 hodnoty G/A, SIN (G/2*A),
0, COS (G/A), SIN (G/A).
23C1
DR-PRMS
CALL #247D,CD-PRMS1
Podprogram je volán.
ad c) Nastaví se zbytek parametrů jak je třeba. Zásobník bude obsahovat tyto čtyři položky
čteno zdola: X0+X a Y0+Y jako koncový bod posledního oblouku, pak X0 a Y0 jako počátečný bod prvního
oblouku. Mem-0 bude obsahovat X0 a mem-5 Y0. Mem-1 a mem-2 budou obsahovat počáteční umístění pro
první oblouk U a V a mem-3 a mem-4 budou obsahovat COS (G/A) a SIN (G/A) pro potřeby smyčky rýsující
oblouky. Formule pro výpočet U a V se dá vysvětlit následovně: Místo aby se postupovalo po závěrečné
tětivě řekněme délky L, s přírůstky X a Y, chceme postupovat po počáteční tětivě (která může být
delší) délky L*W, kde W=SIN (G/2*A)/SIN (G/2), s přírůstky X*W a Y*W, ale pootočené o úhel
(G/2-G/2*A), tedy s pravdivými přírůstky:
U=Y*W*SIN (G/2-G/2*A)+X*W*COS (G/2-G/2*A)
V=Y*W*COS (G/2-G/2*A)-X*W*SIN (G/2-G/2*A)
Tyto formule mohou být kontrolovány z diagramu, při použití normálních rozkladů pro COS (P-Q)
a SIN (P-Q), kde Q=G/2-G/2*A.
23C4
PUSH
RST
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
BC
#28,FP-CALC
#02,výmaz
#E1,get-mem-1
#01,záměna
#05,dělení
#C1,st-mem-1
#02,výmaz
#01,záměna
#31,zdvojení
#E1,get-mem-1
#04,násobení
#C2,st-mem-2
#02,výmaz
#01,záměna
#31,zdvojení
#E1,get-mem-1
#04,násobení
#E2,get-mem-2
#E5,get-mem-5
#E0,get-mem-0
#03,odčítání
#A2,stk-polovina
#04,násobení
#31,zdvojení
#1F,sin
Uschovej počítadlo oblouků v regist. B.
X,Y,SIN (G/2),Z
X,Y,SIN (G/2)
X,Y,SIN (G/2),SIN (G/2*A)
X,Y,SIN (G/2*A),SIN (G/2)
X,Y,SIN (G/2*A)/SIN (G/2)=W
W do mem-1.
X,Y
Y,X
Y,X,X
Y,X,X,W
Y,X,X*W
X*W do mem-2.
Y,X
X,Y
X,Y,Y
X,Y,Y,W
X,Y,Y*W
X,Y,Y*W,X*W
X,Y,Y*W,X*W,G
X,Y,Y*W,X*W,G,G/A
X,Y,Y*W,X*W,G-G/A
X,Y,Y*W,X*W,G-G/A,1/2
X,Y,Y*W,X*W,G/2-G/2*A (dále pouze F)
X,Y,Y*W,X*W,F,F
X,Y,Y*W,X*W,F,SIN F
Komentovaný výpis paměti ROM
129
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
LD
CP
POP
JP
PUSH
RST
DEFB
DEFB
LD
CALL
RST
DEFB
DEFB
DEFB
DEFB
LD
CALL
RST
DEFB
DEFB
DEFB
DEFB
DEFB
POP
130
#C5,st-mem-5
#02,výmaz
#20,cos
#C0,st-mem-0
#02,výmaz
#C2,st-mem-2
#02,výmaz
#C1,st-mem-1
#E5,get-mem-5
#04,násobení
#E0,get-mem-0
#E2,get-mem-2
#04,násobení
#0F,sčítání
#E1,get-mem-1
#01,záměna
#C1,st-mem-1
#02,výmaz
#E0,get-mem-0
#04,násobení
#E2,get-mem-2
#E5,get-mem-5
#04,násobení
#03,odečítání
#C2,st-mem-2
#2A,abs
#E1,get-mem-1
#2A,abs
#0F,sčítání
#02,výmaz
#38,konec výpočtu
A,(DE)
#81
BC
C,#2477,LINE-DRAW
BC
#28,FP-CALC
#01,záměna
#38,konec výpočtu
A,(#5C7D) (COORDS-lo)
#2D28,STACK-A
#28,FP-CALC
#C0,st-mem-0
#0F,sčítání
#01,záměna
#38,konec výpočtu
A,(#5C7E) (COORDS-hi)
#2D28,STACK-A
#28,FP-CALC
#C5,st-mem-5
#0F,sčítání
#E0,get-mem-0
#E5,get-mem-5
#38,konec výpočtu
BC
SIN F do mem-5.
X,Y,Y*W,X*W,F
X,Y,Y*W,X*W,COS F
COS F do mem-0.
X,Y,Y*W,X*W
X*W do mem-2.
X,Y,Y*W
Y*W do mem-1.
X,Y,Y*W,SIN F
X,Y,Y*W*SIN F
X,Y,Y*W*SIN F,X*W
X,Y,Y*W*SIN F,X*W,COS F
X,Y,Y*W*SIN F,X*W*COS F
X,Y,Y*W*SIN F+X*W*COS F (dále U)
X,Y,U,Y*W
X,Y,Y*W,U
U do mem-1.
X,Y,Y*W
X,Y,Y*W,COS F
X,Y,Y*W*COS F
X,Y,Y*W*COS F,X*W
X,Y,Y*W*COS F,X*W,SIN F
X,Y,Y*W*COS F,X*W*SIN F
X,Y,Y*W*COS F-X*W*SIN F (dále V)
V do mem-2.
X,Y,V' (V'=ABS V)
X,Y,V',U
X,Y,V',U' (U'=ABS U)
X,Y,V'+U'
X,Y
DE nyní ukazuje na U'+V'.
Vem exponent U'+V'.
Jestliže platí U'+V' < 1, pak
pouze ukliď zásobník.
Přímka z bodu X0,Y0 do X0+X,Y0+Y.
Jinak pokračuj s parametry X,Y
na zásobníku.
Y,X
Dej X0 do A a
tím dále na zásobník.
Y,X,X0
X0 do mem-0.
Y,X0+X
X0+X,Y
Dej Y0 do A a
tím i na zásobník.
X0+X,Y,Y0
Y0 do mem-5.
X0+X,Y0+Y
X0+X,Y0+Y,X0
X0+X,Y0+Y,X0,Y0
Obnov počítadlo oblouků v registru B.
Komentovaný výpis paměti ROM
ad d) Smyčka pro rýsování oblouků. Do této smyčky se vstupuje na adrese #2439 s souřadnicemi
počátečního bodu na vrcholu zásobníku a s umístěním prvního oblouku v mem-1 a mem-2. Je zajištěno
pomocí jednoduché trigonometrie, že všechny následující body X1, Y1 a X2, Y2 leží na kružnici a jsou
tětivami středového úhlu N, který je též původem těchto souřadnic, potom X2=X1*COS(N)-Y1*SIN(N),
Y2=X1*SIN N+Y1*COS N. Ale protože původ je zde ve spodním levém rohu obrazovky, musí se pro dosažení
požadovaného efektu zahrnout tyto vztahy do přírůstků, řekněme Un=Xn+1-Xn a Vn=Yn+1-Yn, ve smyčce pro
rýsování oblouků. V následujícím komentáři jsou ukázány hodnoty zásobníku pro n+1 průběh smyčkou, kdy
Xn a Yn jsou už zvětšeny o hodnoty Un a Vn poté, co byly obdrženy z Un-1 a Vn-1. Čtyři hodnoty na
vrcholu zásobníku na #2425 jsou u DRAW, čteno zdola, X0+X, Y0+Y, Xn, Yn ale pro ušetření místa nejsou
tyto hodnoty ukázány až do bodu #2439. Zajímají-li vás hodnoty pro příkaz CIRCLE, jsou vidět na konci
podprogramu CIRCLE. Pro CIRCLE platí, že úhel G musí mít hodnotu 2*PI.
2420
DRW-STEPS
2425
ARC-LOOP
2439
ARC-START
DEC
JR
JR
RST
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
PUSH
RST
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
LD
CALL
RST
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
LD
CALL
RST
DEFB
B
Z,#245F,ARC-END
#2439,ARC-START
#28,FP-CALC
#E1,get-mem-1
#31,zdvojení
#E3,get-mem-3
#04,násobení
#E2,get-mem-2
#E4,get-mem-4
#04,násobení
#03,odčítání
#C1,st-mem-1
#02,výmaz
#E4,get-mem-4
#04,násobení
#E2,get-mem-2
#E3,get-mem-3
#04,násobení
#0F,sčítání
#C2,st-mem-2
#02,výmaz
#38,konec výpočtu
BC
#28,FP-CALC
#C0,st-mem-0
#02,výmaz
#E1,get-mem-1
#0F,sčítání
#31,zdvojení
#38,konec výpočtu
A,(#5C7D) {COORDS-lo}
#2D28,STACK-A
#28,FP-CALC
#03,odčítání
#E0,get-mem-0
#E2,get-mem-2
#0F,sčítání
#C0,st-mem-0
#01,záměna
#E0,get-mem-0
#38,konec výpočtu
A,(#5C7E) {COORDS-hi}
#2D28,STACK-A
#28,FP-CALC
#03,odčítání
B počítá průchody smyčkou.
Skok, když B dosáhlo nuly.
Skok na začátek smyčky.
Viz. text o zásobníku.
Un-1
Un-1,Un-1
Un-1,Un-1,COS (G/A)
Un-1,Un-1*COS (G/A)
Un-1,Un-1*COS (G/A),Vn-1
Un-1,Un-1*COS (G/A),Vn-1,SIN (G/A)
Un-1,Un-1*COS (G/A),Vn-1*SIN (G/A)
Un-1,Un-1*COS (G/A)-Vn-1*SIN (G/A)=Un
Un do mem-1.
Un-1
Un-1,SIN (G/A)
Un-1*SIN (G/A)
Un-1*SIN (G/A),Vn-1
Un-1*SIN (G/A),Vn-1,COS (G/A)
Un-1*SIN (G/A),Vn-1*COS (G/A)
Un-1*SIN (G/A)+Vn-1*COS (G/A)=Vn
Vn do mem-2.
Jak bylo řečeno v textu, zásobník ve skutečnosti
obsahuje hodnoty X0+X,Y0+Y,Xn a Yn.
Uschovej čítač oblouků.
X0+X,Y0+y,Xn,Yn
Yn do mem-0.
X0+X,Y0+Y,Xn
X0+X,Y0+Y,Xn,Un
X0+X,Y0+Y,Xn+Un (Xn+Un=Xn+1)
X0+X,Y0+Y,Xn+1,Xn+1
Dále Xn' přibližná hodnota dosažená podprogramem
pro rýsování přímek je uložena do registru A a
uložena na zásobník.
X0+X,Y0+Y,Xn+1,Xn+1,Xn'
X0+X,Y0+Y,Xn+1,Xn+1-Xn'=Un'
X0+X,Y0+Y,Xn+1,Un',Yn
X0+X,Y0+Y,Xn+1,Un',Yn,Vn
X0+X,Y0+Y,Xn+1,Un',Yn+Vn=Yn+1
Yn+1 do mem-0.
X0+X,Y0+Y,Xn+1,Yn+1,Un'
X0+X,Y0+Y,Xn+1,Yn+1,Un',Yn+1
Yn' je aproximováno podobně jako Xn'
je okopírováno do A
a uloženo na zásobník.
X0+X,Y0+Y,Xn+1,Yn+1,Un',Yn+1,Yn'
X0+X,Y0+Y,Xn+1,Yn+1,Un',Vn'
Komentovaný výpis paměti ROM
131
245F
2477
ARC-END
LINE-DRAW
DEFB
CALL
POP
DJNZ
RST
DEFB
DEFB
DEFB
DEFB
LD
CALL
RST
DEFB
DEFB
DEFB
LD
CALL
RST
DEFB
DEFB
CALL
JP
#38,konec výpočtu
#24B7,DRAW-LINE
BC
#2425,ARC-LOOP
#28,FP-CALC
#02,výmaz
#02,výmaz
#01,záměna
#38,konec výpočtu
A,(#5C7D) {COORDS-lo}
#2D28,STACK-A
#28,FP-CALC
#03,odčítání
#01,záměna
#38,konec výpočtu
A,(#5C7E) {COORDS-hi}
#2D28,STACK-A
#28,FP-CALC
#03,odčítání
#38,konec výpočtu
#24B7,DRAW-LINE
#0D4D,TEMPS
Je narýsován další oblouk.
Obnovení počítadla oblouků.
Mají-li se rýsovat ještě další oblouky provede se skok.
Souřadnice konce oblouku, který byl narýsován,
jsou nyní
vymazány ze zásobníku.
Y0+Y,X0+X
X-ová souřadnice posledního oblouku, řekněme Xz',
je nyní okopírována na zásobník.
Y0+Y,X0+X,Xz'
Y0+Y,X0+X-Xz'
X0+X-Xz',Y0+Y
Obdrží se Y-ová souřadnice.
X0+X-Xz',Y0+Y,Yz'
X0+X-Xz',Y0+Y-Yz'
Závěrečný oblouk je narýsován do bodu X0+X,Y0+Y,
nebo uzavření kružnice. Nastav barvy.
PODPROGRAM PRO NASTAVENÍ PARAMETRŮ
Tento podprogram je využíván jak příkazem CIRCLE, tak příkazem DRAW, aby jim nastavila počáteční
parametry. Příkaz CIRCLE ji volá s parametry X,Y a poloměrem Z na vrcholu zásobníku, čteno zdola.
Příkaz DRAW má své X,Y,SIN (G/2) a Z, (jak je definováno v DRAW ad a)), na vrcholu zásobníku. V
následujícím komentáři je obsah zásobníku ukázán pouze od Z dále. Podprogram vrací v registru B počet
oblouků, registr A byl již popsán v příkazech CIRCLE a DRAW, a v mem-0 až mem-5 jsou hodnoty G/A,SIN
(G/2*A),0, COS (G/A),SIN (G/A) a G. Pro kružnici se musí G rovnat hodnotě 2*PI.
247D
2495
2497
132
CD-PRMS1
USE-252
DRAW-SAVE
RST
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
CALL
JR
AND
ADD
JR
LD
PUSH
CALL
RST
DEFB
DEFB
DEFB
DEFB
#28,FP-CALC
#31,zdvojení
#28,odmocnina
#34,stk-data
#32,exponent #82
#00,#00,#00,#00
#01,záměna
#05,dělení
#E5,get-mem-5
#01,záměna
#05,dělení
#2A,abs
#38,konec výpočtu
#2DD5,FP-TO-A
C,#2495,USE-252
#FC
A,#04
NC,#2497,DRAW-SAVE
A,#FC
AF
#2D28,STACK-A
#28,FP-CALC
#E5,get-mem-5
#01,záměna
#05,dělení
#31,zdvojení
Z
Z,Z
Z,SQR Z
Z,SQR Z,2
Z,2,SQR Z
Z,2/SQR Z
Z,2/SQR Z,G
Z,G,2/SQR Z
Z,G*SQR Z/2
Z,G'*SQR Z/2 (G'=MOD G)
Z,G'*SQR Z/2 = A1
Hodnota A1 je uložena ze zásobníku do A, je-li to možno.
Je-li A1 > 256, použij 252.
4*INT (A1/4) do registru A.
Přičti k počtu oblouků v A čtyři.
Je-li to stále méně než 256, skoč.
Zde použij 252.
Nyní uschovej počet oblouků.
A okopíruj tuto hodnotu také na zásobník kalkulátoru.
Z,A
Z,A,G
Z,G,A
Z,G/A
Z,G/A,G/A
Komentovaný výpis paměti ROM
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
POP
RET
#1F,sin
#C4,st-mem-4
#02,výmaz
#31,zdvojení
#A2,stk-polovina
#04,násobení
#1F,sin
#C1,st-mem-1
#01,záměna
#C0,st-mem-0
#02,výmaz
#31,zdvojení
#04,násobení
#31,zdvojení
#0F,sčítání
#A1,stk-1
#03,odčítání
#1B,negace
#C3,st-mem-3
#02,výmaz
#38,konec výpočtu
BC
Z,G/A,SIN (G/A)
SIN (G/A) do mem-4.
Z,G/A
Z,G/A,G/A
Z,G/A,G/A,0.5
Z,G/A,G/2*A
Z,G/A,SIN (G/2*A)
SIN (G/2*A) do mem-1.
Z,SIN (G/2*A),G/A
G/A do mem-0.
Z,SIN (G/2*A)=S
Z,S,S
Z,S*S
Z,S*S,S*S
Z,2*S*S
Z,2*S*S,1
Z,2*S*S-1
Z,1-2*S*S=COS (G/A)
COS (G/A) do mem-3.
Z
Obnov počet oblouků do B.
Konec.
PODPROGRAM “NARÝSUJ PŘÍMKU“
Tento podprogram je volán příkazem DRAW k narýsování přímky vedoucí z bodu X0,Y0 (v COORDS) do
bodu X0+X,Y0+Y, kde přírůstky X a Y jsou uloženy na vrcholu kalkulátoru. Podstatou této metody je
rozmístit co možná nejvíce horizontálních nebo vertikálních kroků mezi základní rozsah diagonálních
kroků, s využitím algoritmu, který rozmisťuje vertikální kroky co možná nejrovnoměrněji.
24B7
DRAW-LINE
24C4
DL-X-GE-Y
24CB
DL-LARGER
CALL
LD
CP
JR
LD
PUSH
XOR
LD
JR
OR
RET
LD
LD
PUSH
LD
LD
#2307,STK-TO-BC
A,C
B
NC,#24C4,DL-X-GE-Y
L,C
DE
A
E,A
#24CB,DL-LARGER
C
Z
L,B
B,C
DE
D,#00
H,B
ABS Y do B;ABS X do C; SGN Y do D;SGN X do E.
Je-li ABS X > =
ABS Y,
skoč dopředu.
Menší jde do L a větší jde do H.
Uschovej diagonální krok (+-1,+-1).
Vlož vertikální krok (+-1,0)
do DE a (D=SGN Y)
skoč pro nastavení registru H.
Jsou-li ABS X i ABS Y nulové,
vrať se.
Menší (zde je to ABS Y) jde do L.
ABS X jde do B pro H.
Uschovej diagonální krok (+-1,+-1).
Vlož horizontální krok (0,+-1) do DE.
Větší z ABS X,ABS Y jde do H.
Zde začíná algoritmus. Větší z ABS X a ABS Y, řekněme H, je uloženo do A a redukováno na INT
(H/2). Nyní se provede H-L horizontálních nebo vertikálních kroků a L diagonálních kroků, kdy L je
menší z ABS X a ABS Y, tímto způsobem: L se přičte do A; jestliže nyní je A >= H, je sníženo o H a
provedou se diagonální kroky, jinak se provedou horizontální nebo vertikální kroky. Toto se opakuje
H-krát (B také obsahuje H). Povšimněte si, že se též využívají zrcadlové registry HL k uschování
hodnoty COORDS.
24CE
D-L-LOOP
LD
RRA
ADD
A,B
A,L
B jde do A stejně jako do H.
A začíná s hodnotou INT (H/2).
L se přičte do A.
Komentovaný výpis paměti ROM
133
24D4
D-L-DIAG
24DB
D-L-HR-VT
24DF
D-L-STEP
24EC
D-L-PLOT
24F7
24F9
134
D-L-RANGE
REPORT-B
JR
CP
JR
SUB
LD
EXX
POP
PUSH
JR
LD
PUSH
EXX
POP
LD
LD
ADD
LD
LD
INC
ADD
JR
JR
DEC
LD
CALL
EXX
LD
DJNZ
POP
RET
JR
RST
DEFB
C,#24D4,D-L-DIAG
H
C,#24DB,D-L-HR-VT
H
C,A
BC
BC
#24DF,D-L-STEP
C,A
DE
BC
HL,(#5C7D) {COORDS}
A,B
A,H
B,A
A,C
A
A,L
C,#24F7,D-L-RANGE
Z,#24F9,REPORT-B
A
C,A
#22E5,PLOT-SUB
A,C
#24CE,D-L-LOOP
DE
Z,#24EC,D-L-PLOT
#08,ERROR-1
#0A
Je-li to víc než 256 provede se skok na diagonální krok.
Jestliže A < H provede se skok na horizontální, nebo
vertikální krok.
Sniž A o H a
obnov jej do C.
Nyní použij zrcadlové registry.
Diagonální krok do B'C'.
A úschova.
Skok k provedení kroku.
Uschovej A (nesníženo) v C.
Uschovej krátce na zásobníku.
Zaměň registrové páry.
Vyzvedni krok.
Nyní prováděj krok, nejdříve dej COORDS do H'L'.
Krok Y z B' do A.
Přičti H'.
Výsledek ulož do B'.
Nyní bude testován na rozsah X-ový
krok (Y-ový krok se otestuje v podprogramu PLOT).
Přičti L' do A a
proveď skok při CY=1 na další test.
Z=0 a CY=0 X-ová pozice -1 je mimo rozsah.
Obnov pravdivou hodnotu v A.
Hodnota do C' pro rýsování.
Narýsuj tento krok.
Obnov hlavní registry.
C jde zpět do A pro pokračování algoritmu.
Skok na start smyčky po B-kroku (tedy po H-kroku).
Vyčisti strojový zásobník.
Konec.
Z=0 a CY=1 znamená X-ová souřadnice 255, v rozsahu.
Ohlaš:
B-Integer out of range.
Komentovaný výpis paměti ROM
HODNOCENÍ VÝRAZŮ
PODPROGRAM SCANNING
Tento podprogram se používá, aby ohodnotil výsledky dalšího výrazu. Výsledek se vrací jako
"poslední hodnota“ na zásobníku kalkulátoru. Pro numerické výsledky bude "poslední hodnota“ skutečné
FP číslo, nicméně výsledkem hodnocení řetězců je soubor parametrů představující poslední hodnotu.
První z pěti bajtů není specifikován, druhý a třetí bajt obsahují adresu začátku řetězce a čtvrtý a
pátý bajt jeho délku. Bit 6 systémové proměnné FLAGS je nastaven pro číselné výsledky a je nulový pro
řetězce. Jestliže se výraz skládá pouze z jediného operandu, např. A ... RND ... A$(4,3 TO 7) ...,
potom "poslední hodnota“ představuje hodnotu, která se získá ohodnocením daného operandu. V případě,
že výraz obsahuje jako operand funkci, např. CHR$ A, ... NOT A, ... SIN 1, je operační kód této funkce
uložen na zásobníku, dokud není vypočtena poslední hodnota operandu. Potom se tato hodnota použije
v příslušné operaci, aby se získala nová "poslední hodnota“. V případě, že se mají vykonat aritmetické
nebo logické operace, např. A+B, ..., A*B, ..., A=B, potom se musí uschovat operační kód a poslední
hodnota prvního argumentu, dokud není nalezena poslední hodnota druhého argumentu. A vskutku výpočet
poslední hodnoty druhého argumentu v sobě může zahrnovat uložení posledních hodnot a operačních kódů
na zásobník po dobu průběhu vlastního výpočtu. Proto lze zpracovat i složitější hierarchii operací.
Například CHR$ (T+A)-26*INT ((T+A)/26+65) se bude provádět tak dlouho, až se dosáhne bodu, z kterého
již lze mezivýsledky "demontovat“, a takto může být teprve získána konečná "poslední“ hodnota. Každý
operační kód má přidělenou prioritu a operace s vyšší prioritou jsou vždy uskutečněny před operacemi s
prioritou nižší. Podprogram začíná s registrem A obsahujícím první znak souboru a počáteční prioritou
nula, která je uložena na zásobníku.
24FB
SCANNING
24FF
S-LOOP-1
RST
LD
PUSH
LD
LD
CALL
LD
JP
LD
LD
ADD
JP
#18,GET-CHAR
B,#00
BC
C,A
HL,#2596
#16DC,INDEXER
A,C
NC,#2684,S-ALPHNUM
B,#00
C,(HL)
HL,BC
(HL)
Vyzvedni první znak.
Číslo priority
jde na zásobník.
Hlavní bod opětovného vstupu.
Hledej v tabulce funkcí, kdy kód je v registru C.
Obnov kód do A.
Skoč, nebyl-li kód nalezen v tabulce.
Použij položku nalezenou v tabulce
k vytvoření požadované adresy a skoč
na tuto adresu.
Následují čtyři podprogramy, které jsou volány podprogramy pro tabulku funkcí. První z nich s
názvem "SCANNING QUOTE SUBRUTINE“ ("TESTOVÁNÍ UVOZOVEK“) je použita podprogramem S-QUOTE aby zjistil,
jestli každá řetězcová uvozovka má další uvozovku do páru.
250F
S-QUOTE-S
CALL
INC
CP
JP
CP
JR
CALL
CP
RET
#0074,CH-ADD+1
BC
#0D
Z,#1C8A,REPORT-C
#22
NZ,#250F,S-QUOTE-S
#0074,CH-ADD+1
#22
Ukazuj na další znak.
Zvyš délku o jednu.
Je to CR? (=ENTER?)
Ohlaš chybu, jestliže ano.
Existuje další uvozovka?
Skoč zpět, jestliže ne.
Ukazuj na další znak a
nastav Z flag jestliže se jedná o další uvozovku.
Konec.
Další podprogram, který lze nazvat: "testování dvou souřadnic“, je používán programy S-SCREEN$,
S-ATTR a S-POINT, aby se zajistilo, že požadované souřadnice budou udány v náležité formě.
2522
S-2-COORD
RST
CP
JR
CALL
RST
#20,NEXT-CHAR
#28
NZ,#252D,S-RPORT-C
#1C79,NEXT-2NUM
#18,GET-CHAR
Vyzvedni další znak.
Je to závorka "("?
Ohlaš chybu, jestliže ne.
Souřadnice na zásobníku kalkulátoru.
Vyzvedni aktuální znak.
Komentovaný výpis paměti ROM
135
252D
S-RPORT-C
CP
JP
#29
NZ,#1C8A,REPORT-C
Je to závorka ")“?
Ohlaš chybu, jestliže ne.
PODPROGRAM "SYNTAX-Z“
V tomto bodě je vložen podprogram SYNTAX-Z, který je z jiných částí programu volán 32 krát. A
protože instrukce BIT 7,(IY+1) má oproti instrukci CALL o jeden bajt více, ušetří se na každém volání
této instrukce jeden bajt. Jednoduchý test bitu 7 FLAGS nastaví Z flag na nulu při běhu programu a na
jedničku při kontrole syntaxe.
2530
SYNTAX-Z
BIT
RET
7,(IY+1) (FLAGS)
Testuj bit 7 FLAGS.
Konec.
Další podprogram je testovací podprogram SCREEN$, který je používán z podprogramu S-SCREEN$ pro
nalezení znaku na souřadnicích řádek X a sloupec Y obrazovky. Prohledává pouze znaky, na které je
nastavena systémová proměnná CHARS.
Poznámka: Běžně se jedná o znaky od #20 (mezera) do #7F. Uživatel však může změnou systémové
proměnné CHARS testovat také další znaky (včetně uživatelské grafiky).
2535
S-SCRN$-S
254F
S-SCRN-LP
255A
S-SC-MTCH
255D
S-SC-ROWS
136
CALL
LD
LD
ADD
LD
RRCA
RRCA
RRCA
AND
XOR
LD
LD
AND
XOR
LD
LD
PUSH
PUSH
PUSH
LD
XOR
JR
INC
JR
DEC
LD
LD
INC
INC
LD
XOR
XOR
JR
DJNZ
POP
POP
POP
LD
SUB
#2307,STK-TO-BC
HL,(#5C36) (CHARS)
DE,#0100
HL,DE
A,C
#E0
B
E,A
A,C
#18
#40
D,A
B,#60
BC
DE
HL
A,(DE)
(HL)
Z,#255A,S-SC-MTCH
A
NZ,#2573,S-SCR-NXT
A
C,A
B,#07
D
HL
A,(DE)
(HL)
C
NZ,#2573,S-SCR-NXT
#255D,S-SC-ROWS
BC
BC
BC
A,#80
B
X do C a Y do B (kde 0<=X<23 a O<=Y<=31 dekadicky)
CHARS+256 dekadicky
vytvoří v HL bázovou adresu znakového souboru.
X je okopírována do A.
Číslo 32 dekadicky*X mod 8+Y se formuje v A a
je kopírováno do E.
Toto je nižší bajt požadované adresy obrazovky.
X je opět okopírována do A.
Nyní je opět dekadicky 64+8*INT (X/8)
uloženo do D.
DE nyní obsahuje požadovanou adresu na obrazovce.
B spočítá 96 znaků.
Uschovej počet.
Uschovej ukazatel obrazovky a
ukazatel na znakový soubor.
Vyzvedni první bitový řádek znaku z obrazovky.
Testuj s řádkem ze znakového souboru.
Byla-li nalezena přímá shoda, skoč.
Testuj shodu s inverzním znakem (z #FF vytvoř v A #00).
Skoč, nebyla-li ani tato shoda nalezena.
Obnov #FF v A.
Inverzní status (#00 nebo #FF) do C.
B počítá dalších 7 bitových řádků.
Posuň DE na další bitový řádek (přičti 256 dekadicky).
Posuň HL na další řádek (tedy na další bajt).
Vyzvedni řádek z obrazovky,
porovnej jej s řádkem v ROM.
Přidej inverzní status a
skoč, nedochází-li k celkové shodě.
Skoč zpět, pokud nejsou porovnány všechny bitové řádky.
Zbav se ukazatele na soubor znakových matic a
ukazatele obrazovky.
Závěrečný počet do BC.
Kód posledního znaku +1.
A nyní obsahuje požadovaný kód.
Komentovaný výpis paměti ROM
2573
257D
LD
RST
LD
JR
POP
LD
ADD
POP
POP
DJNZ
LD
JP
S-SCR-NXT
S-SCR-STO
BC,#0001
#30,BC-SPACES
(DE),A
#257D,S-SCR-STO
HL
DE,#0008
HL,DE
DE
BC
#254F,S-SCRN-LP
C,B
#2AB2,STK-STO-$
Nyní bude potřeba jedno místo v pracovním prostoru.
Vytvoř toto místo.
Vlož do něj znak.
Skoč na uložení znaku na zásobník.
Obnov ukazatel na znakový soubor.
Posuň jej o 8 bajtů tedy na další matici tohoto souboru.
Obnov ukazatel obrazovky.
Obnov čítač.
Skok zpět, protože znaků je 96.
Signál: prázdný řetězec. Nebyl-li znak nalezen,
skoč k uložení nulového řetezce. Jinak ulož nalezený znak
Poznámka: Výstup přes STK-STO-$ je chybou, která způsobí, že nalezený výsledek je uložený
dvakrát. Zde měla být instrukce RET.
Poslední z těchto čtyř podprogramů je podprogram prohledávající atributy. Je volán programem
S-ATTR, aby vrátil hodnotu ATTR (X,Y), udávající hodnotu atributu pro znak nacházející se na
souřadnicích X,Y obrazovky.
2580
S-ATTR-S
CALL
LD
RRCA
RRCA
RRCA
LD
AND
XOR
LD
LD
AND
XOR
LD
LD
JP
#2307,STK-TO-BC
A,C
C,A
#E0
B
L,A
A,C
#03
#58
H,A
A,(HL)
#2D28,STACK-A
X do C, Y do B (opět 0<=X<=23 a 0<=Y<=31 dekadicky)
X je okopírováno do A a číslo
32 * (X mod 8) + Y
je formováno v A a okopírováno do L.
Hodnota 32 * (X mod 8) + INT (X/8) je také v C
L obsahuje nižší bajt atributové adresy.
Hodnota 32*(X mod 8)+INT(X/8) je zpět okopírována do A.
Hodnota INT (X/8)+#58 je
formována v A a okopírována do H,
které pak obsahuje vyšší bajt adresy atributu.
Atributový bajt je okopírován do A a
je proveden odskok a uložení daného bajtu na zásobník.
TABULKA TESTOVACÍCH FUNKCÍ
Tato tabulka obsahuje 8 funkcí a 4 operátory. Zahrnuje v sobě tedy pět nových funkcí SPEKTRA a
umožňuje elegantním způsobem dosahovat některých funkcí a operátorů, které již existovaly v počítači
ZX-81.
adresa
kód
doplněk
jméno
adress prováděcího podprogramu
2596
2598
259A
259C
259E
25A0
25A2
25A4
25A6
25A8
25AA
25AC
25AE
22
28
2E
2B
A8
A5
A7
A6
C4
AA
AB
A9
00
1C
4F
F2
12
56
57
84
8F
E6
BF
C7
CE
S-QUOTE
S-BRACKET
S-DECIMAL
S-U-PLUS
S-FN
S-AND
S-PI
S-INKEY$
S-BIN [EQU.S-DECIMAL]
S-SCREEN$
S-ATTR
S-POINT
Koncový znak
Komentovaný výpis paměti ROM
25B3
25E8
268D
25AF
25F5
25F8
2627
2634
268D
2668
2672
267B
137
PODPROGRAM PRO VYHODNOCENÍ FUNKCÍ
25AF
S-U-PLUS
RST
JP
#20,NEXT-CHAR
#24FF,S-LOOP-1
Pro obyčejné plus se pouze přesuň na další znak a
skoč zpět na hlavní opětovný vstup programu SCANNING.
Podprogram na prohledávání uvozovek: Tento podprogram zpracovává řetězce s uvozovkami, např.
obyčejné jako "jméno", nebo složitější "téměř ""nevinná"" lež" nebo viditelně nadbytečné jako VAL$
"""A""".
25B3
S-QUOTE
25BE
S-Q-AGAIN
25CB
S-Q-COPY
25D9
S-Q-PRMS
RST
INC
PUSH
LD
CALL
JR
CALL
JR
CALL
JR
RST
POP
PUSH
LD
INC
LD
INC
CP
JR
LD
INC
CP
JR
DEC
#18,GET-CHAR
HL
HL
BC,#0000
#250F,S-QUOTE-S
NZ,#25D9,S-Q-PRMS
#250F,S-QUOTE-S
Z,#25BE,S-Q-AGAIN
#2530,SYNTAX-Z
Z,#25D9,S-Q-PRMS
#30,BC-SPACES
HL
DE
A,(HL)
HL
(DE),A
DE
#22
NZ,#25CB,S-Q-COPY
A,(HL)
HL
#22
Z,#25CB,S-Q-COPY
BC
Vyzvedni aktuální znak.
Ukazuj na začátek řetězce.
Uschovej počáteční adresu.
Nastav délku na nulu.
Volej porovnávací podprogram.
Skoč,jestliže je Z = 0, což znamená: další uvozovka není
Znovu volej pro třetí uvozovku.
A dále pro pátou sedmou a tak dále.
Testuješ-li syntax,
skoč na reset bitu č. 6 FLAGS a pokračuj v prohledávání.
Vytvoř místo pro řetězec a závěrečnou uvozovku.
Vyzvedni ukazatel na start a
ulož ukazatel na první místo.
Vyzvedni znak z řetězce,
posuň ukazatel na další.
Okopíruj poslední znak do pracovního prostoru a
posuň ukazatel na další místo.
Je poslední znak uvozovka?
Jestliže ne, skok na přenos další uvozovky.
Je-li však další znak uvozovka, okopíruj až tu další
Jinak ukonči kopírování.
Vytvoř v BC skutečnou délku.
Poznámka: Povšimněte si, že první uvozovka nebyla započítána do délky. Koncová uvozovka ale
byla a proto je nyní i tato vynechána. První, třetí, pátá, ... uvozovka uvnitř řetězce byla počítána,
ale druhá, čtvrtá, šestá, ... počítány nebyly.
25DB
S-STRING
POP
LD
RES
BIT
CALL
JP
DE
HL,#5C3B
6,(HL)
7,(HL)
NZ,#2AB2,STK-STO-$
#2712,S-CONT-2
Obnov start kopírovaného řetězce.
Toto je FLAGS a tento vstupní bod se používá,
kdykoliv má být bit 6 FLAGS resetován a
parametry řetězce
uloženy na zásobník pokud se provádí řádek.
Skok na pokračování prohledávání řádku.
Poznámka: Povšimněte si, že při kopírování řetězců do pracovního prostoru každý pár uvozovek
uvnitř řetězce ("") byl snížen na jedny uvozovky (").
25E8
S-BRACKET
25F5
S-FN
RST
CALL
CP
JP
RST
JP
JP
#20,NEXT-CHAR
#24FB,SCANNING
#29
NZ,#1C8A,REPORT-C
#20,NEXT-CHAR
#2712,S-CONT-2
#27BD,S-FN-SBRN
Při prohledávání závorek vyzvedne další znak a
volá rekurzivně SCANNING.
Nebyla-li nalezena správná závorka,
bude ohlášena chyba.
Jinak se pokračuje v prohledávání.
Podprogram prohledávání funkcí.
Tento podprogram pro uživatelem definované funkce pokračuje do podprogramu prohledávání funkcí.
138
Komentovaný výpis paměti ROM
25F8
2625
S-RND
S-RND-END
CALL
JR
LD
CALL
RST
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
CALL
LD
LD
AND
JR
SUB
LD
JR
#2530,SYNTAX-Z
Z,#2625,S-RND-END
BC,(#5C76) (SEED)
#2D2B,STACK-BC
#28,FP-CALC
#A1,stk-jedna
#0F,přičtení
#34,stk-data
#37,exponent #87
#16,(#00,#00,#00)
#04,násobení
#34,stk-data
#80,(čtyři bajty)
#41,exponent #91
#00,#00,#80,(#00)
#32,n-mod-m
#02,výmaz
#A1,stk-jedna
#03,odečtení
#31,zdvojení
#38,konec výpočtu
#2DA2,FP-TO-BC
(#5C76),BC (SEED)
A,(HL)
A
Z,#2625,S-RND-END
#10
(HL),A
#2630,S-PI-END
Pokud se nekontroluje syntaxe,
skoč na výpočet náhodného čísla.
Vyzvedni aktuální hodnotu SEED a
ulož ji na zásobník kalkulátoru.
Nyní použij kalkulátoru.
Poslední hodnotou
je nyní SEED + 1.
Ulož na zásobník číslo 75 (dekadicky).
(SEED + 1) * 75
Nyní jsou bajty expandovány,
takže na zásobník jde číslo 65537.
(SEED+1)*75/65537 abys dosáhl "zbytku“ a "odpovědi“.
Vymaž odpověď.
Poslední hodnota je nyní zbytek - 1.
Zdvoj tuto poslední hodnotu a
ukonči výpočet.
Užij poslední hodnotu jako
nový údaj pro SEED.
Vyzvedni exponent poslední hodnoty
a jestliže je nulový
skoč dopředu.
Sniž exponent, což znamená: vyděl hodnotou 65536,
aby se dosáhlo požadovaného rozsahu hodnot.
Odskoč přes podprogram PI.
Podprogram "hledání PI“: nalezne výraz PI a pokud se nekontroluje syntaxe, uloží na zásobník
hodnotu PI jako "poslední hodnotu“.
2627
S-PI
2630
S-PI-END
2634
S-INKEY$
CALL
JR
RST
DEFB
DEFB
INC
RST
JP
#2530,SYNTAX-Z
Z,#2630,S-PI-END
#28,FP-CALC
#A3,stk-PI/2
#38,konec výpočtu
(HL)
#20,NEXT-CHAR
#26C3,S-NUMERIC
LD
RST
CP
JP
LD
RES
BIT
JR
CALL
LD
JR
CALL
JR
DEC
LD
BC,#105A
#20,NEXT-CHAR
#23
Z,#270D,S-PUSH-PO
HL,#5C3B
6,(HL)
7,(HL)
Z,#2665,S-INK$-EN
#028E,KEY-SCAN
C,#00
NZ,#2660,S-IK$-STK
#031E,K-TEST
NC,#2660,S-IK$-STK
D
E,A
Test na kontrolu syntaxe.
Skoč, jestliže kontroluješ syntaxi.
Nyní použij kalkulátor.
PI/2 je uloženo na zás. kalk. jako "poslední hodnota“.
Exponent je zvětšen, čímž se dosáhne výsledku PI.
Přesun na další znak.
Skok dopředu.
Priorita #10 operační kód #5A pro podprogram READ-IN.
Je-li další znak křížek,
skoč, neboť bude následovat číselný argument.
Toto je FLAGS.
Resetuj bit 6 pro řetězcový výsledek
a testuj bit 7 na kontrolu syntaxe.
Skoč, je-li to potřeba.
Vyzvedni hodnotu klávesy do DE.
Připrav prázdný řetězec a
vlož jej na zásobník, bylo-li stisknuto více kláves.
Testuj hodnotu klávesy a ulož hodnoty
prázdného řetězce, jestliže hodnoty kláves nevyhovují.
#FF do D pro L mod (set bit 3).
Hodnota klávesy do registru E pro dekódování.
Komentovaný výpis paměti ROM
139
CALL
PUSH
LD
RST
POP
LD
LD
LD
CALL
JP
#0333,K-DECODE
AF
BC,#0001
#30,BC-SPACES
AF
(DE),A
C,#01
B,#00
#2AB2,STK-STO-$
#2712,S-CONT-2
Dekóduj hodnotu klávesy.
Uschovej hodnotu ASCII.
Je potřeba jedno místo v pracovním prostoru.
Vytvoř toto místo.
Obnov hodnotu ASCII.
Připrav jeho uschování na zásobník jakožto řetězce.
Jeho délka je 1.
Dokonči parametr délky a
ulož požadovaný řetězec.
Skoč dopředu.
2660
S-IK$-STK
2665
S-INK$-EN
2668
S-SCREEN$
CALL
CALL
RST
JP
#2522,S-2-COORD
NZ,#2535,S-SCRN$-S
#20,NEXT-CHAR
#25DB,S-STRING
Testuj, zda byly udány 2 souřadnice.
Pokud nekontroluješ syntaxi, volej podprogram.
Vyzvedni další znak
a skoč zpět.
2672
S-ATTR
CALL
CALL
RST
JR
#2522,5-2-COORD
NZ,#2580,S-ATTR-S
#20,NEXT-CHAR
#26C3,S-NUMERIC
Testuj, zda byly udány 2 souřadnice.
Pokud nekontroluješ syntaxi, volej podprogram.
Vyzvedni další znak
a skoč zpět.
267B
S-POINT
CALL
CALL
RST
JR
#2522,S-2-COORD
NZ,#22CB,POINT-SUB
#20,NEXT-CHAR
#26C3,S-NUMERIC
Testuj, zda byly udány 2 souřadnice.
Pokud nekontroluješ syntaxi, volej podprogram.
Vyzvedni další znak
a skoč zpět.
2684
S-ALPHNUM
CALL
JR
CP
JR
#2C88,ALPHANUM
NC,#26DF,S-NEGATE
#41
NC,#26C9,S-LETTER
Je znak alfanumerický ?
Skoč, jestliže ne.
Nyní skoč, je-li to písmeno, jinak pokračuj do S-DECIMAL.
Tento podprogram zpracovává číselné výrazy začínající desetinnou čárkou nebo číslicí. Také se
stará o příkaz BIN, který je zpracováván podprogramem "decimal na FP“.
268D
S-DECIMAL CALL
(EQU.S-BIN) JR
#2530,SYNTAX-Z
NZ,#26B5,S-STK-DEC
Skoč dopředu, jestliže se provádí řádek.
Akce, která se nyní zahájí se značně odlišuje pro kontrolu syntaxe a pro běh programu.
Kontroluje se syntaxe, je vypočítána FP forma a okopírována do aktuálního basicovského řádku.
Provádí-li se program, bude FP vždy k dispozici, takže je okopírována na zásobník kalkulátoru aby
vytvořila "poslední hodnotu“.
Během kontroly syntaxe:
CALL
RST
LD
CALL
INC
LD
INC
EX
LD
LD
AND
SBC
LD
LDIR
140
#2C9B,DEC-TO-FP
#18,GET-CHAR
BC,#0006
#1655,MAKE-ROOM
HL
(HL),#0E
HL
DE,HL
HL,(#5C65) (STKEND)
C,#05
A
HL,BC
(#5C65),HL (STKEND)
Je nalezena FP forma.
HL se nastaví, aby ukazoval za poslední číslici.
Je potřeba 6 míst.
Vytváří se prostor v basicovém řádku.
HL ukazuje na první volné místo.
Vloží se značka FP čísla a
postoupí se na další číslo.
Nyní bude ukazatel potřeba v DE.
Vyzvedni STKEND.
Jedná se o 5 bajtů, které budou přeneseny.
Vyčisti CY flag.
Nový STKEND = starý STKEND - 5.
Přenes FP číslo ze zásobníku kalkulátoru
do basicového řádku.
Komentovaný výpis paměti ROM
EX
DEC
CALL
JR
DE,HL
HL
#0077,TEMP-PTR1
#26C3,S-NUMERIC
Obnov ukazatel v HL
a ukazuj na poslední přidaný bajt.
Tento podprogram nastaví CH-ADD.
Skoč dopředu.
Za chodu programu:
26B5
26B6
S-STK-DEC
S-SD-SKIP
RST
INC
LD
CP
JR
INC
CALL
LD
#18,GET-CHAR
HL
A,(HL)
#0E
NZ,#26B6,S-SD-SKIP
HL
#33B4,STACK-NUM
(#5C5D),HL (CH-ADD)
Vyzvedni aktuální znak.
Nyní se přesuň na další znak, dokud
není nalezena
značka pro FP číslo.
Ukazuj na 1. bajt čísla a
přenes toto číslo na zásobník.
Nastav CH-ADD.
Číselný výsledek musí být identifikován, když přichází z RND, PI, ATTR, POINT nebo dekadického
čísla, nastavením bitu 6 ve FLAGS.
26C3
S-NUMERIC
SET
JR
6,(IY+1) (FLAGS)
#26DD,S-CONT-1
Nastav signál: numerická hodnota.
Skoč dopředu.
PODPROGRAM HODNOCENÍ PROMĚNNÝCH
Po identifikaci názvu proměnné a zavolání LOOK-VARS, kde byla zjištěna existence proměnné v
oblasti proměnných nebo programové oblasti (DEF FN pro uživatelem definované funkce FN), uloží se
nalezená číselná hodnota na zásobník kalkulátoru pomocí podprogramu STACK-NUM. Řetězcové pole však
musí být předáno na zásobník podprogramem STK-VAR, nebo při uživatelem definované funkci podprogramem
STK-F-ARG (který je volán z podprogramu LOOK-VARS).
26C9
S-LETTER
26DD
S-CONT-1
CALL
JP
CALL
LD
CP
JR
INC
CALL
JR
#28B2,LOOK-VARS
C,#1C2E,REPORT-2
Z,#2996,STK-VARS
A,(#5C3B) (FLAGS)
#C0
C,#26DD,S-CONT-1
HL
#33B4,STACK-NUM
#2712,S-CONT-2
V případě, že proměnná neexistuje,
vypiš chybové hlášení.
Jinak ulož par. řet. a vrať adresu číselného elementu.
Vyzvedni FLAGS.
Testuj bit 6 a 7 současně.
Jeden nebo oba jsou vynulovány.
Číselná hodnota musí být uložena na zásobník.
Přenes tam číslo.
Skoč dopředu.
Znak je testován na kód pro "-", čímž se identifikuje "unární mínus“. Před provedením testu je
registr B nastaven na prioritu #09 a registr C na hodnotu #D8, což je kód této operace.
26DF
S-NEGATE
LD
CP
JR
BC,#09DB
#2D
Z,#270D,S-PUSH-PO
Priorita #09, operační kód #D8.
Je to "-" ?
Skoč dopředu, když ano.
Nyní se testuje znak na kód "VAL$“ s prioritou #10 a operačním kódem #18.
LD
CP
JR
BC,#1018
#AE
Z,#270D,S-PUSH-PO
Priorita #10, operační kód #18.
Je to VAL$ ?
Skoč dopředu je-li to VAL$.
Aktuální znak musí nyní představovat některou z funkcí CODE až NOT s kódem #AF až #C3.
SUB
JP
#AF
C,#1C8A,REPORT-C
Rozsah funkcí je změněn a #AF až #C3 na #00 až #14.
Ohlaš chybu, jsou-li mimo rozsah.
Komentovaný výpis paměti ROM
141
Funkce NOT je identifikována a zpracována odděleně od ostatních.
LD
CP
JR
JP
BC,#04F0
#14
Z,#270D,S-PUSH-PO
NC,#1C8A,REPORT-C
Priorita #04, operační kód #F0.
Je to funkce NOT?
Skoč, jestliže ano.
Znovu testuj rozsah.
Zbývající funkce mají prioritu 16. Operační kódy pro tyto funkce jsou nyní vypočítány. Funkce,
které operují na řetězcích potřebují mít bit 6 nulový a funkce, které vracejí řetězcové výsledky
potřebují mít bit 7 nulový ve svých operačních kódech.
2707
S-NO-TO-$
LD
ADD
LD
CP
JR
RES
CP
JR
RES
B,#10
A,#DC
C,A
#DF
NC,#2707,S-NO-TO-$
6,C
#EE
C,#270D,S-PUSH-PO
7,C
Priorita 16.
Funkční rozsah je nyní #DC až #EF.
Převeď operační kód do C.
Odděl CODE, VAL a LEN, které operují
na řetězcích pro dosažení numerických hodnot.
Odděl STR$ a CHR$, které operují na číslech a dávají
řetězcové výsledky.
Poznač operační kód. Ostatní operační kódy mají
bit 7 a 6 = 1.
Prioritní a operační kódy pro funkci, která se právě posuzuje, jsou nyní uloženy na strojový
zásobník, kde se vytváří určitá posloupnost těchto operací.
270D
S-PUSH-PO
PUSH BC
RST #20,NEXT-CHAR
JP
#24FF,S-LOOP-1
Ulož na zásobník prioritní a operační kód
než se posuneš na posouzení další části výrazu.
Zde pokračuje hodnocení řádku. Aktuální argument může být následován "(", binárním operátorem,
nebo je-li to konec výrazu, pak znakem CR, oddělovačem nebo THEN.
2712
2713
S-CONT-2
S-CONT-3
RST
CP
JR
#18,GET-CHAR
#28
NZ,#2723,S-OPERTR
Vyzvedni aktuální
znak a
skoč, není-li to "(", která indikuje výraz se závorkami.
Jestliže je poslední hodnota číselná, potom výraz v závorkách je pravdivým podvýrazem a musí být
ohodnocen samostatně. Je-li však poslední hodnota řetězec, potom výraz v závorkách představuje
element pole nebo část řetězce. Potom zavoláním podprogramu SLICING je tento výraz upraven tak jak je
potřeba.
BIT
JR
CALL
RST
JR
6,(IY+1) (FLAGS)
NZ,#2734,S-LOOP
#2A52,SLICING
#20,NEXT-CHAR
#2713,S-CONT-3
Skoč dopředu, když obsluhuješ číselný výraz v závorkách.
Modifikuj parametry "poslední hodnoty“.
Přesuň se k posouzení dalšího znaku.
Jestliže aktuální znak je skutečně binární operátor, bude mít operační kód v rozsahu #C3 až #CF
a příslušný kód priority.
2723
142
S-OPERTR
LD
LD
LD
CALL
JR
LD
LD
B,#00
C,A
HL,#2795
#16DC,INDEXER
NC,#2734,SLOOP
C,(HL)
HL,#26ED
Původní kód do BC pro hledání v tabulce operátorů.
Ukazatel na tabulku.
Hledej v tabulce.
Skoč dopředu, nebyla-li operace nalezena.
Vyzvedni příslušný kód z tabulky.
Ukazatel na tabulku priorit: #26ED+#C3=#27B0 je
první adresa.
Komentovaný výpis paměti ROM
ADD
LD
HL,BC
B,(HL)
Hledej v tabulce.
Vyzvedni příslušnou prioritu.
Nyní se vstupuje do hlavní smyčky tohoto programu. V této fázi již je:
a) Poslední hodnota na zásobníku kalkulátoru.
b) Počáteční prioritní znak na zásobníku pod "hromadou“ funkcí a binárních operačních kódů
neznámé velikosti. Ovšem tato "hromada“ může být též nulová.
c) BC obsahuje aktuální operaci a prioritu, která při dosažení konce bude mít hodnotu nula.
Konečně jsou ze zásobníku sejmuty poslední hodnoty a porovnány oproti aktuální operaci a
prioritě. Jestliže aktuální priorita je vyšší než poslední priorita, potom se provede výstup ze
smyčky, protože aktuální priorita je považována za vyšší než priorita operace poslední. Takže je-li
aktuální priorita považována za nižší, potom je provedena tato poslední operace. Aktuální operace a
priorita jde zpátky na zásobník, aby mohla být dále zpracována smyčkou. Tímto způsobem se hierarchie
funkcí a binárních operací, které čekají v jakési frontě, zpracovává ve správném pořadí.
2734
S-LOOP
POP
LD
CP
JR
AND
JP
DE
A,D
B
C,#2773,S-TIGHTER
A
Z,#0018,GET-CHAR
Vyzvedni poslední operaci a její prioritu.
Priorita jde do registru A.
Porovnej "poslední“ oproti "aktuálnímu“.
Výstup na čekání na argument.
Jsou obě priority nulové? Jestliže ano
výstup přes GET-CHAR, čímž se "poslední hodnota“ stane
výslednou.
Než je provedena poslední operace, je funkce USR rozdělena na "USR číslo“ nebo "USR řetězec“
podle logické hodnoty bitu 6 FLAGS, nastaveného již dříve při ukládání argumentu funkce USR jako
"poslední hodnoty“.
274C
S-STK-LST
PUSH
LO
LD
CP
JR
BIT
JR
LD
PUSH
CALL
JR
LD
AND
LD
RST
DEFB
DEFB
JR
BC
HL,#5C3B
A,E
#ED
NZ,#274C,S-STK-LST
6,(HL)
NZ,#274C,S-STK-LST
E, #99
DE
#2530,SYNTAX-Z
Z,#275B,S-SYNTEST
A,E
#3F
B,A
#28,FP-CALC
#3B,FP-calc-2
#38,Konec výpočtu
#2764,S-RUNTEST
Ulož aktuální hodnotu na zásobník.
Toto je FLAGS.
Poslední operace se testuje na kód pro USR,
dá USR číslo, nebylo-li modifikováno.
Skoč, nebylo-li to USR.
Testuj bit 6 FLAGS.
Skoč, byl-li nastaven (USR číslo).
Změň poslední kód: doplněk #19+#80 pro řetězec či číslo
Ulož přechodně poslední hodnoty
a nedělej nic, kontroluješ-li syntax.
Poslední oper.kód.
Vymaž bity 6 a 7,
aby se převedlo op.kód na kalkulátorový doplněk.
Užij kalkulátor.
Proveď aktuální operaci.
Konec.
Skoč dopředu.
Důležitou částí kontroly syntaxe je též testování operace aby se zajistilo, že povaha poslední
hodnoty je správného typu pro posuzovanou operaci.
275B
S-SYNTEST
2761
S-RPORT-C
LD
XOR
AND
JP
A,E
(IY+1) (FLAGS)
#40
NZ,#1C8A,REPORT-C
Vyzvedni poslední operační kód.
Testuj typ poslední hodnoty oproti požadavkům na funkci.
Aby byla syntaxe správná, musí se shodovat.
Skoč, jestliže syntaxe selhala.
Komentovaný výpis paměti ROM
143
Před návratem projdi smyčkou, aby se povaha poslední hodnoty zaznamenala do systémové proměnné
FLAGS.
2764
S-RUNTEST
2770
S-LOOPEND
POP
LD
SET
BIT
JR
RES
POP
JR
DE
HL,#5C3B
6,(HL)
7,E
NZ,#2770,S-LOOPEND
6,(HL)
BC
#2734,S-LOOP
Vyzvedni poslední operační kód.
Toto je FLAGS.
Předpokládej, že výsledek je číselný.
Je-li povaha poslední hodnoty číselná,
skoč dopředu.
Je to řetězec.
Vyzvedni aktuální hodnotu do BC a
Skoč zpět.
Kdykoliv je "aktuální“ operace“ s vyšší prioritou, potom poslední a aktuální hodnoty jdou zpátky
na zásobník. Nicméně, když aktuální operace pracuje s řetězci, je operační kód modifikován aby se
signalizoval tento požadavek.
2773
S-TIGHTER
2788
S-NOT-AND
2790
S-NEXT
PUSH
LD
BIT
JR
AND
ADD
LD
CP
JR
SET
JR
JR
CP
JR
SET
PUSH
RST
JP
DE
A,C
6,(IY+1) (FLAGS)
NZ,#2790,S-NEXT
#3F
A,#08
C,A
#10
NZ,#2788,S-NOT-AND
6,C
#2790,S-NEXT
C,#2761,S-RPORT-C
#17
Z,#2790,S-NEXT
7,C
BC
#20,NEXT-CHAR
#24FF,S-LOOP-1
Poslední hodnoty jdou na zásobník.
Vyzvedni aktuální operační kód.
Jedná-li se o číselný operand,
neupravuj tento kód.
Nuluj bit 6 a 7.
Zvyš kód o #08 a
vrať ho v registru C.
Je to operace AND?
Skoč, jestliže ne.
AND vyžaduje číselný operand.
Skoč dopředu.
Operace -,*,/,^,OR nelze provádět mezi řetězci.
Jedná se o "+“?
Skoč, jestliže ano.
Další operace produkují číselný výsledek.
Aktuální hodnoty jdou na zásobník.
Posuzuj další znak
a skoč zpět do smyčky.
TABULKA OPERÁTORŮ
lokace
2795
2797
2799
279B
279D
279F
27A1
kód op.kód operátor
2B
CF
+
2D
C3
2A
C4
*
2F
C5
/
5E
C6
^
3D
CE
=
3E
CC
>
lokace kód op.kód operátor
27A3
3C
CD
<
27A5
C7
C9
<=
27A7
C8
CA
>=
27A9
C9
CB
<>
27AB
C5
C7
OR
27AD
C6
C8
AND
27AF
00
koncový znak
TABULKA PRIORIT
lokace
27B0
27B1
27B2
27B3
27B4
27B5
27B6
144
priorita
06
08
08
0A
02
03
05
operátor
*
/
^
OR
AND
<=
lokace
27B7
27B8
27B9
27BA
27BB
27BC
priorita
05
05
05
05
05
06
operátor
>=
<>
>
<
=
+
Komentovaný výpis paměti ROM
PODPROGRAM HODNOCENÍ FUNKCÍ
Tento podprogram je volán z podprogramu "vyhodnocení FN“, aby vyhodnotila funkce definované
uživatelem v basicovém řádku. Podprogram lze rozdělit na čtyři části :
a) Kontrola syntaxe příkazu FN během kontroly syntaxe.
b) Při běhu programu se provede hledání příkazu DEF FN v programové oblasti a porovnávají se
jména funkcí dokud se nenalezne shoda. Jinak je ohlášena chyba.
c) Jsou ohodnoceny argumenty funkce voláním podprogramu SCANNING.
d) Je ohodnocena samotná funkce (SCANNINGem, který zase volá LOOK-VARS a tím i "SF-ARGMTS“).
27BD
S-FN-SBRN
27D0
SF-BRKT-1
27D9
SF-ARGMTS
27E4
27E6
27E9
SF-BRKT-2
SF-RPRT-C
SF-FLAG-6
27F4
SF-SYN-EN
CALL
JR
RST
CALL
JP
RST
CP
PUSH
JR
RST
CP
JR
RST
CP
JR
CALL
RST
CP
JR
RST
JR
CP
JP
RST
LD
RES
POP
JR
SET
JP
#2530,SYNTAX-Z
NZ,#27F7,SF-RUN
#20,NEXT-CHAR
#2C8D,ALPHA
NC,#1C8A,REPORT-C
#20,NEXT-CHAR
#24
AF
NZ,#27D0,SF-BRKT-1
#20,NEXT-CHAR
#28
NZ,#27E6,SF-RPRT-C
#20,NEXT-CHAR
#29
Z,#27E9,SF-FLAG-6
#24FB,SCANNING
#18,GET-CHAR
#2C
NZ,#27E4,SF-BRKT-2
#20,NEXT-CHAR
#27D9,SF-ARGMTS
#29
NZ,#1C8A,REPORT-C
#20,NEXT-CHAR
HL,#5C3B
6,(HL)
AF
Z,#27F4,SF-SYN-EN
6,(HL)
#2712,S-CONT-2
Pokud se nekontroluje
syntaxe, skoč na SF-RUN.
Vyzvedni první znak názvu.
Není-li alfanumerický,
ohlaš chybu.
Vyzvedni další znak.
Je to "$“ ?
Uschovej Z flag na zásobník
a skoč, nebyl-li to "$“.
Jinak vyzvedni další znak.
Nejedná se o závorku
ohlaš chybu.
Vyzvedni další znak.
Je to závorka ")“ ?
Skoč jestliže ano, neboť nejsou žádné argumenty.
Volej SCANNING, který kontroluje syntax arg. a vloží FP.
Vyzvedni znak, který následuje za argumentem.
Není-li to čárka ",“,
skoč, neboť nejsou žádné argumenty.
První znak dalšího argumentu.
Zpátky do smyčky k prozkoumání dalšího argumentu.
Je současný znak závorka ")“ ?
Ohlaš chybu, není-li to závorka ")“.
Ukazuj na další znak v basicovém řádku.
Toto je FLAGS.
Předpokládá se řetězcová funkce.
Obnov Z flag a skoč
je-li výsledek funkce řetězcového typu.
Jinak nastav bit 6 ve FLAGS.
Skoč zpět při vyhodnocování řádku.
ad b) Při běhu programu se musí najít příslušný příkaz DEF FN.
27F7
SF-RUN
2802
SF-ARGMT-1
RST
AND
LD
RST
SUB
LD
JR
RST
RST
PUSH
#20,NEXT-CHAR
#DF
B,A
#20,NEXT-CHAR
#24
C,A
NZ,#2802,SF-ARGMT-1
#20,NEXT-CHAR
#20,NEXT-CHAR
HL
Vyzvedni první znak jména.
Resetuj bit 5 pro velká písmena.
Okopíruj jméno do B.
Vyzvedni další znak.
Odečti #24, což je kód pro znak "$“.
Výsledek ulož do C (nula pro řetězce, jinak číselná fce).
Skoč, jedná-li se o číselnou funkci.
Vyzvedni další znak. Je to závorka "(".
Vezmi první znak prvního argumentu.
Uschovej ukazatel na zásobník a
Komentovaný výpis paměti ROM
145
2808
SF-FND-DF
2812
REPORT-P
LD
DEC
LD
PUSH
CALL
POP
JR
RST
DEFB
HL,(#5C53) (PROG)
HL
DE,#00CE
BC
#1D86,LOOK-PROG
BC
NC,#2814,SF-CP-DEF
#08,ERROR-1
#18
ukazuj na začátek programu
Zpět o jedno místo.
Hledat se bude DEF FN.
Uschovej název a řetězcový statut.
Nyní prohledávej program.
Obnov název a řetězcový statut.
Skoč, byl-li příkaz DEF FN nalezen.
Jinak ohlaš:
P-FN without DEF
Po nalezení příkazu DEF FN je testováno jméno a status obou funkcí. Neshodují-li se, pokračuje
se v hledání.
2814
SF-CP-DEF
2825
SF-NOT-FD
PUSH
CALL
AND
CP
JR
CALL
SUB
CP
JR
POP
DEC
LD
PUSH
CALL
POP
JR
HL
#28AB,FN-SKPOVR
#DF
B
NZ,#2825,SF-NOT-FD
#28AB,FN-SKPOVR
#24
C
Z,#2831,SF-VALUES
HL
HL
DE,#0200
BC
#198B,EACH-STMT
BC
#2808,SF-FND-DF
Má-li se hledat dál, uschovej ukazatel na znak DEF FN.
Vyzvedni název funkce DEF FN.
Resetuj bit 5 pro velká písmena.
Shoduje se název pro hledanou FN?
Skoč, jestliže ne.
Vyzvedni další znak v příkazu DEF FN.
Odečti #24 což je znak "$“.
Porovnej status funkce.
Při kompletní shodě skoč.
Obnov ukazatel na DEF FN.
Krok zpět.
Připrav se na další prohledávání a k
nalezení konce příkazu použij porovnávací podprogram.
Mezitím bylo uloženo jméno a status.
Skoč zpět na další hledání.
ad c) Nyní je nalezen správný příkaz DEF FN. Argumenty příkazu FN budou ohodnoceny opakovaným
voláním SCANNINGu a 5 bajtů jejich hodnoty (nebo parametry pro řetězce) budou uloženy do příkazu DEF
FN, do míst vytvořených při kontrole syntaxe. HL bude použit jako ukazatel na příkaz DEF FN (v případě
volání podprogramu FN-SKPOVR), zatímco CH-ADD ukazuje na příkaz FN (a volá si RST #20 v případě
potřeby).
2831
SF-VALUES
2843
SF-ARG-LP
2852
146
SF-ARG-VL
AND
CALL
POP
POP
LD
CALL
PUSH
CP
JR
INC
LD
CP
LD
JR
DEC
CALL
INC
LD
INC
PUSH
PUSH
CALL
A
Z,#28AB,FN-SKPOVR
DE
DE
(#5C5D),DE (CH-ADD)
#28AB,FN-SKPOVR
HL
#29
Z,#2885,SF-R-BR-2
HL
A,(HL)
#0E
D,#40
Z,#2852,SF-ARG-VL
HL
#28AB,FN-SKPOVR
HL
D,#00
HL
HL
DE
#24FB,SCANNING
Ukazuje-li HL na znak "$“, přesuň se
na znak "(".
Odhoď ukazatel na DEF FN.
Vyzvedni ukazatel na první argument
FN a okopíruj ho do CH-ADD.
Přeskoč "(",
uschovej tento ukazatel na zásobník.
Ukazuje na závorku?
Jestliže ano, skoč, protože funkce nemá argumenty.
Ukazuj na další
kód a dej ho do A.
Je to značka pro FP číslo?
Nastav bit 6 v registru D pro numerický argument.
Skoč, jednalo-li se o numer.argument.
HL bude ukazovat na znak "$“ a ne na řídící kód.
HL nyní ukazuje na značku FP čísla.
Bit 6 je vynulován, signál: řetězec.
Ukazuj na první z pěti bajtů v DEF FN.
Uschovej tento ukazatel na zásobník.
Uschovej "řetězcový status“ argumentu.
Ohodnoť argument.
Komentovaný výpis paměti ROM
2885
SF-R-BR-2
288B
REPORT-Q
POP
XOR
AND
JR
POP
EX
LD
LD
SBC
LD
LDIR
EX
DEC
CALL
CP
JR
PUSH
RST
CP
JR
RST
POP
CALL
JR
PUSH
RST
CP
JR
RST
DEFB
AF
(IY+1) (FLAGS)
#40
NZ,#288B,REPORT-Q
HL
DE,HL
HL,(#5C65) (STKEND)
BC,#0005
HL,BC
(#5C65),HL (STKEND)
DE,HL
HL
#28AB,FN-SKPOVR
#29
Z,#2885,SF-R-BR-2
HL
#18,GET-CHAR
#2C
NZ,#288B,REPORT-Q
#20,NEXT-CHAR
HL
#28AB,FN-SKPOVR
#2843,SF-ARG-LP
HL
#18,GET-CHAR
#29
Z,#288D,SF-VALUE
#08,ERROR-1
#19
Dej vlajku "číslo/řetězec“ do A.
Testuj bit 6 oproti
výsledku ze SCANNINGu
a vypiš hlášení Q jestliže se neshodují.
Vyzvedni ukazatel na první z pěti bajtů v DEF FN a
dej ho do DE.
HL nechť ukazuje na STKEND.
BC je použito jako počítadlo 5 bajtů které se přenesou.
Zmenši STKEND o 5 a
tak vymaž poslední hodnotu ze zásobníku.
Okopíruj pět bajtů do míst v DEF FN.
HL ukazuje na další kód.
Zajisti, aby HL ukazovalo na znak nad pěti bajty.
Je to závorka ")“?
Skoč jestliže ano, neboť nejsou další argumenty pro DEFFN
Je to čárka ",“, uschovej tedy její ukazatel.
Vyzvedni znak za posledním argumentem příkazu FN.
Není-li to čárka,
skoč, neboť jsou to popletené argumenty pro FN a DEF FN.
Posuň CH-ADD na další argument FN.
Vyzvedni ukazatel na ",“ v příkazu DEF FN.
Posuň HL na další argument v DEF FN.
Skoč zpět k posouzení tohoto argumentu.
Uschovej ukazatel na závorku ")“ v DEF FN.
Vyzvedni znak po posledním argumentu v FN.
Je to závorka ")“ ?
Jestliže ano, skoč k ohodnocení funkce,
jinak ohlaš:
Q-Parameter error
d) Konečně je funkce sama ohodnocena voláním SCANNING, když předtím DEFADD obsahovala adresu
argumentů tak, jak se vyskytovaly v příkazu DEF FN. Tím je zajištěno, že při zavolání SCANNINGu LOOKVARS budou prohledány nejprve tyto argumenty a pak teprve proměnné.
288D
SF-VALUE
POP
EX
LD
LD
EX
LD
PUSH
RST
RST
CALL
POP
LD
POP
LD
RST
JP
DE
DE,HL
(#5C5D),HL (CH-ADD)
HL,(#5C0B) (DEFADD)
(SP),HL
(#5C0B),HL (DEFADD)
DE
#20,NEXT-CHAR
#20,NEXT-CHAR
#24FB,SCANNING
HL
(#5C5D),HL (CH-ADD)
HL
(#5C0B),HL (DEFADD)
#20,NEXT-CHAR
#2712,S-CONT-2
Obnov ukazatel na ")“ v DEF FN.
Dej tento ukazatel
do HL a uschovej ho v CH-ADD.
Vyzvedni starou hodnotu DEFADD.
Ulož ji na zásobník a současně vyzvedni
adresu DEF FN a ulož ji do DEFADD.
Uschovej adresu ")“ v příkazu FN.
Posuň CH-ADD na poslední ")“ a "=“
na začátku výrazu pro DEF FN.
Nyní ohodnoť funkci.
Obnov adresu závorky v příkazu FN a
uschovej ji v CH-ADD.
Obnov původní hodnotu
DEFADD a ulož ji zpět.
Vyzvedni další znak v basicovém řádku.
Skoč zpět do SCANNINGu.
PODPROGRAM "FN-SKPOVR“ (SKOKY VE FUNKCI)
Tento podprogram se používá z podprogramů FN a STK-F-ARG aby posouval HL po příkazu DEF FN,
aniž by byla CH-ADD změněna, neboť tato ukazuje na příkaz FN.
28AB
FN-SKPOVR
INC
HL
Ukazuj na další kód v příkazu.
Komentovaný výpis paměti ROM
147
LD
CP
JR
RET
A,(HL)
#21
C,#28AB,FN-SKPOVR
Dej ho do A a je-li
to řídící znak nebo
mezera, přeskoč ho.
Jinak se vrať.
PODPROGRAM "PROHLEDEJ PROMĚNNÉ“
Tento podprogram se volá kdykoliv je potřeba prohledávat oblast proměnných, nebo argumentů DEF
FN, jak je třeba. Vstupuje se do ní se systémovou proměnnou CH-ADD nastavenou na první písmeno názvu
proměnné, jejíž umístění se hledá. Jméno se bude nacházet v programové nebo pracovní oblasti. Nejprve
bude v registru C vytvořen označovací bajt jehož povaha je založena na prvním písmenu názvu
proměnné. Bity 5 a 6 tohoto bajtu indikují typ použité proměnné. Registr B je používán jako bitová
vlajka (flag).
28B2
LOOK-VARS
SET
RST
CALL
JP
PUSH
AND
LD
RST
PUSH
CP
JR
SET
CP
JR
SET
CALL
JR
6,(IY+1) (FLAGS)
#18,GET-CHAR
#2C8D,ALPHA
NC,#1C8A,REPORT-C
HL
#1F
C,A
#20,NEXT-CHAR
HL
#28
Z,#28EF,V-RUN/SYN
6,C
#24
Z,#28DE,V-STR-VAR
5,C
#2C88,ALPHANUM
NC,#28E3,V-TEST-FN
Předpokládej číselnou proměnnou.
Vyzvedni první znak do A.
Je alfanumerický ?
Ohlaš chybu jestliže ne.
Uschovej ukazatel na první znak.
Převeď bity 0-4 do registru C.
Bity 5-7 jsou vždy nulové.
Vyzvedni další znak do A.
Uschovej jeho ukazatel.
Je druhým znakem závorka "(" ?
Odděl pole a čísla.
Nyní nastav bit 6.
Je druhým znakem "$“ ?
Odděl všechny řetězce.
Nyní nastav bit 5.
Jestliže délka názvu proměnné je pouze jeden znak, skoč
dopředu.
Nyní bude nalezen koncový znak názvů majících více než jeden znak.
28D4
V-CHAR
CALL
JR
RES
RST
JR
#2C88,ALPHANUM
NC,#28EF,V-RUN/SYN
6,C
#20,NEXT-CHAR
#28D4,V-CHAR
Je znak alfanumer.?
Vyskoč ze smyčky jestliže byl nalezen konec názvu.
Označ rozlišovací bajt.
Vyzvedni další znak.
Jdi zpět a testuj jej.
Obyčejné řetězce a řetězcová pole vyžadují, aby bit 6 systémové proměnné FLAGS byl vynulován.
28DE
V-STR-VAR
RST
RES
#20,NEXT-CHAR
6,(IY+1) (FLAGS)
Posuň CH-ADD za značku "$“.
Nuluj bit 6 jako signál:řetězec.
Není-li DEFADD-HI nula, znamená to, že se bude zpracovávat fce ("FN“), je-li však program v
běhu, budou se hledat argumenty příkazu DEF FN.
28E3
V-TEST-FN
LD
AND
JR
CALL
JP
A,(#5C0C) (DEFADD-HI)
A
Z,#28EF,V-RUN/SYN
#2530,SYNTAX-Z
NZ,#2951,STK-F-ARG
Je DEFADD-HI nula?
Jestliže ano, skoč dopředu.
Je program v běhu?
Jestliže ano, skoč dopředu k prohledání příkazu DEF FN.
Jinak (nebo když proměnná nebyla nalezena v příkazu DEF FN) se provede hledání v oblasti
proměnných, pokud se ovšem nekontroluje syntaxe.
28EF
148
V-RUN/SYN
LD
B,C
Kopíruj rozlišovací bajt do registru B.
Komentovaný výpis paměti ROM
CALL
JR
LD
AND
SET
LD
JR
#2530,SYNTAX-Z
NZ,#28FD,V-RUN
A,C
#E0
7,A
C,A
#2934,V-SYNTAX
Je-li program v běhu, skoč dopředu.
Převeď rozlišovací bajt do A.
Vymaž část znakového kódu.
Indikuj syntaxi nastavením bitu 7.
Obnov značkový bajt
a pokračuj.
Provádí se basicový řádek a proto se provede prohledání oblasti proměnných.
28FD
V-RUN
LD
HL,(#5V4B) (VARS)
Vyzvedni ukazatel VARS.
Nyní vstup do smyčky, která posoudí názvy existujících proměnných.
2900
V-EACH
LD
AND
JR
CP
JR
RLA
ADD
JP
JR
A,(HL)
#7F
Z,#2932,V-80-BYTE
C
NZ,#292A,V-NEXT
A,A
P,#293F,V-FOUND-2
C,#293F,V-FOUND-2
První písmeno každé existující proměnné
porovnávej na bitech 0-6.
Skoč při bajtu #80 (koncový znak oblasti proměnných).
Vlastní porovnání.
Jestliže se první znaky neshodují, skoč dopředu.
Rotuj A doleva a
pak je zdvoj, abys otestoval bity 5,6.
Řetězcové proměnné a pole.
Jednoduché číselné a "FOR NEXT“ proměnné.
Dlouhé názvy vyžadují aby byly porovnány celé.
2912
2913
V-MATCHES
V-SPACES
POP
PUSH
PUSH
INC
LD
INC
CP
JR
OR
CP
JR
OR
CP
JR
LD
CALL
JR
DE
DE
HL
HL
A,(DE)
DE
#20
Z,#2913,V-SPACES
#20
(HL)
Z,#2912,V-MATCHES
#80
(HL)
NZ,#2929,V-GET-PTR
A,(DE)
#2C88,ALPHANUM
NC,#293E,V-FOUND-1
Pořiď kopii ukazatele na druhý znak.
Uschovej ukazatel na první znak.
Posuzuj další znak.
Vyzvedni postupně všechny znaky
a ukazuj na další znak.
Je to mezera?
Ignoruj mezery.
Nastav bit 5 tak,
abys testoval velká i malá písmena.
Jestliže se shodují, skoč zpět pro další znak.
Budou se shodovat při nastaveném bitu 7 ?
Zkus to.
Jestliže se poslední znaky neshodují, skoč dopředu.
Kontrola konce
názvu před odskokem
dopředu.
Ve všech případech neshody názvů se musí HL upravit tak, aby ukazoval na další proměnnou v
oblasti proměnných.
2929
292A
V-GET-PTR
V-NEXT
POP
PUSH
CALL
EX
POP
JR
HL
BC
#19B8,NEXT-ONE
DE,HL
BC
#2900,V-EACH
Vyzvedni ukazatel.
Krátce uschovej B & C.
Nyní DE ukazuje na další proměnnou.
Zaměň oba ukazatele
vyzvedni zpět B&C a
skoč znovu do smyčky.
Nebyla-li nalezena žádná položka se správným názvem, skoč sem.
2932
V-80-BYTE
SET
7,B
Signál: proměnná nenalezena.
Komentovaný výpis paměti ROM
149
A při kontrole syntaxe skočíš sem.
2934
V-SYNTAX
POP
RST
CP
JR
SET
JR
DE
#18,GET-CHAR
#28
Z,#2943,V-PASS
5,B
#294B,V-END
Znič ukazatel na druhý znak.
Vyzvedni aktuální znak.
Je to závorka "(" ?
Skoč dopředu.
Signál:nejedná se o pole.
Skoč dopředu.
Sem přijdeš po nalezení položky s odpovídajícím jménem.
293E
293F
V-FOUND-1
V-FOUND-2
POP
POP
POP
PUSH
RST
DE
DE
DE
HL
#18,GET-CHAR
Odhoď uschovaný ukazatel na proměnnou.
Znič ukazatel na 2. znak proměnné.
Znič ukazatel na 1. znak proměnné.
Uschovej ukazatel na poslední znak názvu proměnné.
Vyzvedni aktuální znak.
Má-li jméno proměnné více než jeden znak, musí být převedeny i další znaky.
Poznámka: Zdá se však, že to už bylo uděláno v části V-CHAR.
2943
V-PASS
CALL
JR
RST
JR
#2C88,ALPHANUM
NC,#294B,V-END
#20,NEXT-CHAR
#2943,V-PASS
Je znak alfanumerický?
Byl-li nalezen konec názvu proměnné, skoč.
Vyzvedni další znak
a jdi zpět na jeho test.
Nyní jsou nastaveny výstupní parametry.
294B
V-END
POP
RL
BIT
RET
HL
B
6,B
HL ukazuje na poslední znak názvu.
Rotuj celý registr,
otestuj jeho bit 6.
Hotovo.
Výstupní parametry tohoto podprogramu mohou být shrnuty následovně: Systémová proměnná CH-ADD
ukazuje na první místo za názvem proměnné v basicovém řádku.
Pokud proměnná nebyla nalezena:
a) CY=1
b) Z flag je nastaven jenom při hledání pole.
c) Registrový pár HL ukazuje na první znak názvu proměnné tak, jak se vyskytuje v basicovém
řádku.
Pokud proměnná byla nalezena:
a) CY=0
b) Z flag=1 jak pro jednoduché řetězcové proměnné, tak pro pole.
c) Registrový pár HL ukazuje na písmeno krátkého jména, nebo na poslední znak u vícepísmenných
názvů, existující položky v oblasti proměnných.
Ve všech případech bity 5 a 6 registru C indikují typ zpracovávané proměnné. Bit 7 je
komplementem "SYNTAX/RUN flag“. Bity 0-4 budou obsahovat kód znaku nalezené proměnné pouze tehdy,
byl-li program v běhu.
Pokud byl podprogram volán při kontrole syntaxe, bude se vždy vracet s CY=0. Z flag bude
nastaven na 1 pro pole, nebo na 0 pro všechny proměnné kromě řetězcových názvů nesprávně
následovaných závorkou "(“, což nastaví Z flag na jedna, ale v případě že se bude provádět SAVE
"jméno" DATA a$(), bude se syntaxe považovat za správnou.
150
Komentovaný výpis paměti ROM
PODPROGRAM "ULOŽ ARGUMENTY FUNKCÍ NA ZÁSOBNÍK“
Podprogram je volán z LOOK-VARS když není DEFADD-hi nula, aby v oblasti argumentů byl nalezen
příkaz DEF FN, před prohledáním programové oblasti. Byla-li proměnná nalezena v příkaze DEF FN, budou
parametry řetězcové proměnné uloženy na zásobník a bude dán signál: nevolej STK/VAR. Ale to už zůstává
na programu SCANNING, který uloží hodnoty číselné proměnné obvyklým způsobem (viz. adresa #26DA).
2951
STK-F-ARG
295A
SFA-LOOP
296B
SFA-CP-VR
LD
LD
CP
JP
LD
OR
LD
INC
LD
CP
JR
DEC
CALL
INC
RES
LD
CP
JR
INC
INC
INC
INC
INC
CALL
CP
JP
CALL
JR
HL,(#5C0B) (DEFADD)
A,(HL)
#29
Z,#28EF,V-RUN/SYN
A,(HL)
#60
B,A
HL
A,(HL)
#0E
Z,#296B,SFA-CP-VR
HL
#28AB,FN-SKPOVR
HL
5,B
A,B
C
Z,#2981,SFA-MATCH
HL
HL
HL
HL
HL
#28AB,FN-SKPOVR
#29
Z,#28EF,V-RUN/SYN
#28AB,FN-SKPOVR
#295A,SFA-LOOP
Ukazuj na 1.znak oblasti argumentů
a převeď jej do A.
Je to závorka ")“ ?
Jestliže ano, skoč k prohledání oblasti proměnných.
Vyzvedni další argument ve smyčce.
Nastav bity 5 a 6,jako signál: obyčejná číselná proměnná.
Okopíruj je do B.
Ukazuj na další kód.
Vyzvedni jej do A.
Je to #0E (značka FP čísla) ?
Jestliže ano, skoč (je to číselná proměnná).
Nastav HL aby ukazovalo na značku
"$“ a ne na mezeru nebo řídící znak.
HL nyní ukazuje na značku FP čísla.
Nuluj bit 5 v B což je signál: řetězcová proměnná.
Vyzvedni název proměnné do A.
Je to ta, kterou hledáme ?
Jestli ano, skoč.
Nyní překroč 5 bajtů
FP čísla nebo
parametru řetězce,
aby mohl být nalezen
další argument.
Posuň se na další znak.
Je to závorka ")“ ?
Jestliže ano, skoč na prohledání oblasti proměnných.
Ukazuj na další
argument a skoč zpět na jeho posouzení.
Byla nalezena shoda. Parametry řetězcové proměnné jdou nyní na zásobník, čímž se předejde
potřebě volání programu STK-VAR.
2981
SFA-MATCH
2991
SFA-END
BIT
JR
INC
LD
CALL
EX
LD
POP
POP
XOR
INC
RET
5,C
NZ,#2991,SFA-END
HL
DE,(#5C65) (STKEND)
#33C0,MOVE-FP
DE,HL
(#5C65),HL (STKEND)
DE
DE
A
A
Jedná se o číselnou
proměnnou, skoč, a SCANNING už ji uloží na zásobník.
Ukazuj na 1. z pěti ukládaných bajtů.
DE ukazuje na STKEND.
Ulož těchto 5 bajtů.
HL ukazuje na novou pozici STKEND, jejíž
hodnota je uložena do STKEND.
Odhoď ukazatele pro
LOOK-VARS (1. a 2. znakový ukazatel).
Vrať se s CY i Z flag nulovými, což
je signál: nevolat STK-VAR.
Hotovo.
Komentovaný výpis paměti ROM
151
PODPROGRAM STK-VAR
Tento podprogram se obyčejně používá k nalezení parametrů, které definují existující řetězec v
oblasti proměnných nebo vrací v HL bázovou adresu určitého elementu nebo polem. Je-li volána z DIM
slouží pouze ke kontrole syntaxe basicového příkazu. Parametry definující řetězec ale mohou být
pozměněny voláním programu SLICING, je-li to potřeba.
2996
STK-VAR
XOR
LD
BIT
JR
A
B,A
7,C
NZ,#29E7,SV-COUNT
Nastav vlajku: pole.
Vynuluj B.
Skoč dopředu při
kontrole syntaxe.
Dále odděl jednoduché řetězce od polí.
29A1
SV-SIMPLE$
29AE
SV-ARRAYS
BIT
JR
INC
INC
LD
INC
LD
INC
EX
CALL
RST
JP
INC
INC
INC
LD
BIT
JR
7,(HL)
NZ,#29AE,SV-ARRAYS
A
HL
C,(HL)
HL
B,(HL)
HL
DE,HL
#2AB2,STK-STORE
#18,GET-CHAR
#2A49,SV-SLICE?
HL
HL
HL
B,(HL)
6,C
Z,#29C0,SV-PTR
Jedná-li se o pole,
skoč dopředu.
Signál: jednoduchý řetězec.
Posuň ukazatel.
Vyzvedni
délku
řetězce.
Posuň ukazatel.
Převeď ukazatel na aktuální řetězec.
Předej parametry na zásobník kalkulátoru.
Vyzvedni aktuální
znak a skoč na test "krácení“.
Posuň ukazatel
za délku
pole.
Vyzvedni počet dimenzí.
Jedná se o číselné pole
skoč dopředu.
Jestliže řetězcové pole má počet dimenzí 1, lze jej považovat za obyčejný řetězec.
DEC
JR
B
Z,#29A1,SV-SIMPLE$
Zmenši počet
dimenzí a skoč, byl-li počet 1.
Dále se provede kontrola indexu.
EX
RST
CP
JR
EX
DE,HL
#18,GET-CHAR
#28
NZ,#2A20,REPORT-3
DE,HL
Uschovej ukazatel v DE.
Vyzvedni aktuální znak.
Je to závorka "(" ?
Skoč podat chybové hlášení, jestliže ne.
Obnov ukazatel v HL.
Pro oba typy polí se nyní ohodnotí index.
29C0
SV-PTR
EX
JR
DE,HL
#29E7,SV-COUNT
Dej ukazatel do DE.
Skoč dopředu.
Následující smyčka má za úkol nalézt parametry daného elementu pole. Do smyčky se vstupuje v
bodě SV-COUNT. Smyčka se vykoná B krát, což u číselných polí odpovídá počtu použitých dimenzí. Pro
řetězcová pole se smyčka vykoná B-1 krát, protože poslední index se použije ke stanovení "výřezu“ z
řetězce.
29C3
152
SV-COMMA
PUSH HL
RST #18,GET-CHAR
POP HL
Uschovej čítač.
Vyzvedni aktuální znak.
Obnov čítač.
Komentovaný výpis paměti ROM
CP
JR
BIT
JR
BIT
JR
CP
JR
RST
RET
#2C
Z,#29EA,SV-LOOP
7,C
Z,#2A20,REPORT-3
6,C
NZ,#29D8,SV-CLOSE
#29
NZ,#2A12,SV-RPT-C
#20,NEXT-CHAR
Je aktuální znak čárka ",“ ?
Skoč dopředu na posouzení dalšího indexu.
Při běhu programu
skoč ohlásit chybu.
Jedná-li se o
řetězcové pole, skoč dopředu.
Je aktuální znak závorka ")“ ?
Skoč ohlásit chybu, jestliže no.
Vyzvedni další znak.
Syntaxe je v pořádku - vrať se.
Pro řetězcové pole může již tento index znamenat "řez“, anebo je ještě dále v basicovém řádku.
29D8
SV-CLOSE
29E0
SV-CH-ADD
CP
JR
CP
JR
RST
DEC
LD
JR
#29
Z,#2A48,SV-DIM
#CC
NZ,#2A12,SV-RPT-C
#18,GET-CHAR
HL
(#5C5D),HL (CH-ADD)
#2A45,SV-SLICE
Je aktuální znak závorka ")“?
Jestliže ano, skoč na kontrolu dalšího indexu.
Je aktuální znak TO ?
Skoč ohlásit chybu, jestliže ne.
Vyzvedni aktuální znak.
Ukazuj na předchozí
znak a nastav CH-ADD.
Skoč na hodnocení "řezu“.
Zde je vstup do smyčky.
29E7
29EA
SV-COUNT
SV-LOOP
29FB
SV-MULT
LD
PUSH
RST
POP
LD
CP
JR
RST
CP
JR
CP
JR
PUSH
PUSH
CALL
EX
EX
CALL
JR
DEC
HL,#0000
HL
#20,NEXT-CHAR
HL
A,C
#C0
NZ,#29FB,SV-MULT
#18,GET-CHAR
#29
Z,#2A48,SV-DIM
#CC
Z,#29E0,SV-CH-ADD
BC
HL
#2AEE,DE,(DE+1)
(SP),HL
DE,HL
#2ACC,INT-EXP1
C,#2A20,REPORT-3
BC
CALL
ADD
POP
POP
DJNZ
#2AF4,GET-HL*DE
HL,BC
DE
BC
#29C3,SV-COMMA
Nastav čítač elementů na nulu.
Krátce jej uschovej.
Vyzvedni další znak.
Obnov čítač.
Vyzvedni rozlišovací bajt.
Pokud nekontroluješ
syntaxi, skoč vpřed.
Vyzvedni aktuální znak.
Je aktuální znak závorka ")“ ?
Čítání elementů skončeno - skoč dopředu.
Je aktuální znak TO ?
Skoč zpět - jedná se o "řez“.
Uschovej počet dimenzí a rozlišovací bajt.
Uschovej čítač elementů.
Vyzvedni velikost dimenze do DE.
Čítač do HL a ukazatel na zásobník.
Záměna.
Ohodnoť další index.
Je-li mimo rozsah, ohlaš chybu.
Dekrementuj výsledek ohodnocení, protože čítač má
počítat elementy vyskytující se před specifikovaným
elementem.
Vynásob čítač velikostí dimenze.
Přičti výsledek z INT-EXP1 k aktuálnímu čítači.
Vyzvedni ukazatel proměnné.
Vyzvedni počet dimenzí a rozlišovací bajt.
Pokračuj v průchodech smyčkou, dokud B není nula.
Než se odliší číselná a řetězcová pole, testuje se vlajka SYNTAX/RUN.
2A12
SV-RPT-C
BIT 7,C
JR
NZ,#2A7A,SL-RPT-C
PUSH HL
BIT
6,C
Jestliže
syntaxi,
Uschovej
Jedná-li
Komentovaný výpis paměti ROM
kontroluješ
skoč ohlásit chybu.
čítač.
se o řetězcové
153
JR
NZ,#2A2C,SV-ELEM$
pole, skoč dopředu.
Při zpracování číselného pole musí být aktuální znak závorka ")“.
2A20
REPORT-3
LD
LD
RST
CP
JR
RST
DEFB
B,D
C,E
#18,GET-CHAR
#29
Z,#2A22,SV-NUMBER
#08,ERROR-1
#02
Převeď ukazatel
proměnné do BC.
Vyzvedni aktuální znak.
Je aktuální znak závorka ")“ ?
Přeskoč chybové hlášení, jestliže jo.
Ohlaš:
3-Subscript out of range.
Nyní může být vypočtena adresa skutečné FP formy.
2A22
SV-NUMBER
RST
POP
LD
CALL
ADD
RET
#20,NEXT-CHAR
HL
DE,#0005
#2AF4,GET-HL*DE
HL,BC
Vyzvedni další znak.
Vyzvedni čítač.
Číselný element má délku 5 bajtů.
Vypočti celkový počet bajtů před požadovaným elementem.
HL nyní ukazuje před požadovaný element.
Vrať se s touto adresou.
Při zpracování řetězcového pole je velikost elementu dána hodnotou "poslední dimenze“. Jsou
vypočteny příslušné parametry a předány na zásobník kalkulátoru.
2A2C
SV-ELEM$
CALL
EX
CALL
POP
ADD
INC
LD
LD
EX
CALL
#2AEE,DE,(DE+1)
(SP),HL
#2AF4,GET-HL*DE
BC
HL,BC
HL
B,D
C,E
DE,HL
#2AB1,STK-ST-0
Vyzvedni rozměr poslední dimenze.
Ukazatel proměnné jde na zásobník a čítač do HL.
Vynásob čítač velikostí dimenze.
Vyzvedni ukazatel proměnné.
HL nyní ukazuje na jedno místo před element.
A nyní na začátek elementu.
Převeď velikost
poslední dimenze do BC, což bude délka.
Začátek do DE.
Parametry na zásobník kalkulátoru.
Poznámka: První parametr je nula, což indikuje element pole a tedy signál : nemazat existující
element.
Zápis indexu je možný třemi způsoby: A$(2,4 TO 8) nebo A$(2)(4 TO 8) anebo pokud se požaduje
celý řetězec A$(2).
2A45
2A48
2A49
SV-SLICE
SV-DIM
SV-SLICE?
RST
CP
JR
CP
JR
CALL
RST
CP
JR
#18,GET-CHAR
#29
Z,#2A48,SV-DIM
#2C
NZ,#2A20,REPORT-3
#2A52,SLlCING
#20,NEXT-CHAR
#28
Z,#2A45,SV-SLICE
Vyzvedni aktuální znak.
Je to závorka ")“ ?
Skoč, jestliže ano.
Je to čárka ",“ ?
Skoč na ohlášení chyby, jestliže ne.
Použij SLICING pro úpravu souboru parametrů.
Vyzvedni další znak.
Je to závorka "(“ ?
Skoč zpět, je-li třeba posoudit "řez“.
Po posouzení posledního indexu se provede návrat, přičemž parametry požadovaného řetězce jsou
uloženy na zásobníku kalkulátoru.
RES
RET
154
6,(IY+1) (FLAGS)
Signál: řetězcový výsledek.
Návrat.
Komentovaný výpis paměti ROM
PODPROGRAM "SLICING“
Tento podprogram provede "řez“ z aktuálního řetězce. Na vstupu jsou parametry řetězce uloženy
na zásobníku kalkulátoru a v registrech A B C D E. Parametry jsou vyzvednuty pouze při exekuci řádku.
2A52
SLICING
CALL
CALL
RST
CP
JR
PUSH
XOR
PUSH
PUSH
LD
RST
POP
#2530,SYNTAX-Z
NZ,#2BF1,STK-FETCH
#20,NEXT-CHAR
#29
Z,#2AAD,SL-STORE
DE
A
AF
BC
DE,#0001
#18,GET-CHAR
HL
Testuj vlajku.
Při běhu programu vyzvedni parametry.
Vyzvedni další znak.
Je to závorka ")“ ?
Skoč dopředu, jestli ano.
Začátek jde na zásobník.
Nuluj registr A a
uschovej.
Uschovej délku.
Předpoklad, že "řez“ začne 1.znakem.
Vyzvedni 1.znak.
Délka do HL.
Nyní se ohodnotí první parametr pro řez.
2A7A
SL-RPT-C
CP
JR
POP
CALL
PUSH
LD
LD
PUSH
RST
POP
CP
JR
CP
JP
#CC
Z,#2A81,SL-SECOND
AF
#2ACD,INT-EXP2
AF
D,B
E,C
HL
#18,GET-CHAR
HL
#CC
Z,#2A81,SL-SECOND
#29
NZ,#1C8A,REPORT-C
Je aktuální znak TO ?
První parametr je tedy považován za 1 a skoč testovat 2.
Obnov A, které je #00.
1.parametr do BC, A bude #FF, byla-li chyba v rozsahu.
Uschovej tuto hodnotu.
Převeď 1.parametr
do DE.
Uschovej délku.
Vyzvedni aktuální znak.
Obnov délku.
Je aktuální znak TO ?
Skoč na test 2.parametru.
Je to závorka ")“ ?
Skoč ohlásit chybu, jestliže ne.
V tomto bodě již byl identifikován řez o délce jednoho znaku. Například A$(4).
LD
LD
JR
H,D
L,E
#2A94,SL-DEFINE
Poslední znak řezu
je tedy také prvním znakem.
Skoč dopředu.
Zde se hodnotí druhý parametr.
2A81
SL-SECOND
PUSH
RST
POP
CP
JR
POP
CALL
PUSH
RST
LD
LD
CP
JR
HL
#20,NEXT-CHAR
HL
#29
Z,#2A94,SL-DEFINE
AF
#2ACD,INT-EXP2
AF
#18,GET-CHAR
H,B
L,C
#29
NZ,#2A7A,SL-RPT-C
Uschovej délku.
Vyzvedni další znak.
Obnov délku.
Je to závorka ")“ ?
Skoč, jestliže není druhý parametr.
Jestliže 1.parametr byl v rozsahu, A je #00, jinak #FF.
BC obsahuje 2.parametr.
Uschovej "chybový registr“.
Vyzvedni aktuální znak.
Předej výsledek
z INT-EXP2 do HL.
Je to závorka ")“ ?
Jestliže ne, skoč ohlásit chybu.
Budou definovány "nové“ parametry.
Komentovaný výpis paměti ROM
155
2A94
SL-DEFINE
2AA8
SL-OVER
2AAD
SL-STORE
POP
EX
ADD
DEC
EX
AND
SBC
LD
JR
INC
AND
JP
LD
LD
POP
RES
CALL
RET
AF
(SP),HL
HL,DE
HL
(SP),HL
A
HL,DE
BC,#0000
C,#2AA8,SL-OVER
HL
A
M,#2A20,REPORT-3
B,H
C,L
DE
6,(IY+1) (FLAGS)
#2530,SYNTAX-Z
Z
Vyzvedni "chybový“ registr.
Druhý parametr jde na zásobník a současně start je v HL.
Přičti první parametr ke startu.
Jdi zpět o jedno místo, aby hodnota v HL byla správná.
Nový start jde na zásobník a 2.parametr zpět do HL.
Odečti první parametry od druhých k
nalezení délky řezu.
Inicializuj novou délku.
Negativní řez nezpůsobí chybu, ale nulový řetězec.
Umožni jedno místo pro uzavírací bajt.
Nyní testuj chybový registr.
Byl-li některý parametr mimo rozsah, skoč.
Převeď novou délku
do BC.
Vyzvedni nový start
a zajisti, že se stále signalizuje řetězec.
V tomto místě se vrať, jestliže kontroluješ syntaxi,
jinak pokračuj do podprogramu STK-STORE.
PODPROGRAM "STK-STORE“
Tento podprogram předává hodnoty v registrech A B C D E na zásobník kalkulátoru. S každým
zavoláním tohoto programu se tedy zásobník zvětší o 5 bajtů. Podprogram se normálně používá k předání
řetězcových parametrů, ale je i využíván podprogramy STACK-BC a LOG (2^A) k ukládání "malých celých
čísel“ na zásobník kalkulátoru. Všimněte si, že při ukládání parametrů řetězce první hodnota (přichází
v registru A) bude nulová, jestliže řetězec je součástí pole nebo je řezem nějakého delšího řetězce.
Pro kompletní jednoduchý řetězec bude hodnota #01. Tato vlajka se používá v příkazu LET, kde #01
signalizuje, že stará kopie má být zničena.
2AB1
2AB2
2AB6
STK-ST-0
STK-STO-$
STK-STORE
XOR
RES
PUSH
CALL
POP
LD
LD
INC
LD
INC
LD
INC
LD
INC
LD
INC
LD
RET
A
6,(IY+1) (FLAGS)
BC
#33A9,TEST-5-SP
BC
HL,(#5C65) (STKEND)
(HL),A
HL
(HL),E
HL
(HL),D
HL
(HL),C
HL
(HL),B
HL
(#5C65),HL (STKEND)
Signál: řetězec jako část pole nebo jeho řez.
Zajisti, že vlajka indikuje řetězcový výsledek.
Uschovej krátce BC.
Je místo 5 bajtů? Nevracej se pokud není toto místo.
Obnov BC.
Vyzvedni adresu prvního místa nad aktuálním zásobníkem.
Převeď 1.bajt.
Postup.
Převeď 2. a 3.bajt, což je u řetězců start.
Postup.
Převeď 4. a 5.bajt, což je u řetězců délka.
Posuň ukazatel tak, aby ukazoval nad zásobník.
Ulož tuto adresu do STKEND a
vrať se.
PODPROGRAM "INT-EXP“
Tento podprogram vrací výsledek ohodnocení "dalšího výrazu“, jako například hodnotu integer v
registrovém páru BC. Také testuje výsledek proti limitujícím hodnotám předávaným v registrovém páru
HL. CY se bude rovnat 1, jestliže došlo k chybě "out of range“ (mimo rozsah). Registr A se používá
jako "chybový registr“. Obsahuje #00 nedošlo-li k chybě a #FF došlo-li k chybě.
2ACC
2ACD
156
INT-EXP1
INT-EXP2
XOR A
PUSH DE
PUSH HL
Nuluj chybový registr.
Uschovej registr DE,
HL a také
Komentovaný výpis paměti ROM
PUSH
CALL
POP
CALL
JR
PUSH
CALL
POP
LD
OR
SCF
JR
POP
PUSH
AND
SBC
AF
#1C82,EXPT-1NUM
AF
#2530,SYNTAX-Z
Z,#2AEB,I-RESTORE
AF
#1E99,FIND-INT2
DE
A,B
C
chybový registr.
Hodnota dalšího výrazu je přenesena na zásobník kalk.
Obnov chybový registr.
Z,#2AE8,I-CARRY
HL
HL
A
HL,BC
takže je-li tomu tak, skoč.
Udělej kopii limitu. Toto bude rozměr, limit pro DIM
nebo délka řetězce.
Nyní porovnej
výsledek oproti tomuto limitu.
Při kontrole syntaxe skoč dopředu.
Uschovej opět chybový registr.
Poslední hodnota je kompresována do BC.
Chybový registr do D.
Další výraz, který dává nulu je vždy chybový
Stav CY a hodnota v registru D jsou nyní manipulovány tak, aby daly příslušnou hodnotu pro
chybový registr.
2AE8
I-CARRY
2AEB
I-RESTORE
LD
SBC
POP
POP
RET
A,D
A,#00
HL
DE
Vrať se: chybový registr je A.
PODPROGRAM DE, (DE+1)
Tento podprogram provádí
adresované hodnotou (DE+2).
2AEE
DE,(DE+1)
EX
INC
LD
INC
LD
RET
Vyzvedni hodnotu "staré chyby“, vytvoř "novou“ chybu.
#00 = nedošlo k chybě. #FF nebo méně je mimo rozsah.
Obnov registry před návratem.
pseudoinstrukci
DE,HL
HL
E,(HL)
HL
D,(HL)
LD
DE,(DE+1)
a
vrací
HL
jako
ukazatel
na
místo
Použij HL pro konstrukci.
Ukazuj na "DE+1“.
Ve skutečnosti LD E,(DE+1).
Ukazuj na "DE+2“.
Ve skutečnosti LD D,(DE+2).
Hotovo.
PODPROGRAM "GET-HL*DE“
Tento
podprogram
volá
HL=HL*DE,
pokud
se
nekontroluje
syntaxe,
čímž
se
dosahuje
požadované funkce. Přetečení ze 16-tého bitu dává hlášení "out of memory“. Není to sice úplně pravda,
ale předpokládá se, že není dost paměti pro úkol, který je uvažován.
2AF4
GET-HL*DE
CALL
RET
CALL
JP
RET
#2530,SYNTAX-Z
Z
#30A9,HL=HL*DE
C,#1F15,REPORT-4
Při kontrole syntaxe se vrať okamžitě.
Proveď násobení.
Hlášení "out of memory“.
Hotovo.
Komentovaný výpis paměti ROM
157
PODPROGRAM PŘÍKAZU LET
Toto je skutečný podprogram přidělování, používaný příkazy LET, READ a INPUT. Jestliže cílová
proměnná je nově deklarovaná proměnná, potom systémová proměnná DEST bude ukazovat na první písmeno
názvu proměnné, tak jak se vyskytuje v hadicovém řádku. Bit 1 systémové proměnné FLAGX bude nastaven
na jedničku. Jestliže však cílová proměnná již existuje, potom bit 1 ve FLAGX bude nulový a systémová
proměnná DEST bude ukazovat na místo před pěti bajty starého čísla; a pro řetězec na první místo
starého řetězce. Použití systémové proměnné DEST tímto způsobem se vztahuje na jednoduché proměnné a
části polí. Bit 0 systémové proměnné FLAGX je roven jedné, jestliže cílová proměnná je kompletní
jednoduchá řetězcová proměnná (což je signál: smaž starou kopii). Na začátku se vyzvedne aktuální
hodnota v systémové proměnné DEST a testuje se bit 1 proměnné FLAGS.
2AFF
LET
LD
BIT
JR
HL,(#5C4D) (DEST)
1,(IY+55) (FLAGX)
Z,#2B66,L-EXISTS
Vyzvedni aktuální adresu v DEST.
Obsluhuješ-li proměnnou, která již existuje, skoč.
Jde o nově deklarovanou proměnnou. Proto musí být nejdříve nalezena délka jejího názvu.
LD
BC,#0005
Předpokládej, že se jedná o číselnou proměnnou-5 bajtů.
Zde je vstup do smyčky, která obslouží znaky dlouhého názvu. Jakékoliv mezery nebo barevné kódy
v názvu jsou ignorována.
2B0B
2B0C
L-EACH-CH
L-NO-SP
INC
INC
LD
CP
JR
JR
CP
JR
BC
HL
A,(HL)
#20
Z,#2B0C,L-NO-SP
NC,#2B1F,L-TEST-CH
#10
C,#2B29,L-SPACES
CP
JR
INC
JR
#16
NC,#2B29,L-SPACES
HL
#2B0C,L-NO-SP
Přičti jedničku do čítače za znak názvu.
Posuň se po názvu proměnné.
Vyzvedni aktuální kód.
Je-li to mezera,
skoč zpět. Takto jsou ignorovány mezery.
Je-li kód v rozsahu #21 až #FF, skoč dopředu.
Vezmi jako výslední kód ty, které jsou v rozsahu
#00 až #0F.
Také akceptuj rozsah #16 až #1F.
Překroč řídící kód za jakýmkoliv znakem pro INK až OVER.
Skoč zpět, protože tyto kódy jsou považována za mezery.
Odděl "číselné“ a "řetězcové“ názvy.
2B1F
L-TEST-CH
CALL
JR
CP
JP
#2C88,ALPHANUM
C,#2B0B,L-EACH-CH
#24
Z,#2BC0,L-NEW$
Je znak alfanumerický?
Je-li tomu tak, akceptuj ho jako kód dlouhého názvu.
Je to znak "$“?
Obsluhuješ-li nově deklarovaný obyčejný řetězec,
skoč dopředu.
Nově deklarovaná proměnná, která byla výše zpracována, potřebuje nyní prostor o velikosti BC v
oblasti proměnných pro uložení svého názvu a své hodnoty. Tento prostor se vytvoří, potom se do něj
okopíruje název proměnné, přičemž znaky tohoto názvu jsou už označeny tak, jak je potřeba.
2B29
L-SPACES
LD
LD
DEC
CALL
A,C
HL,(#5C59) (E-LINE)
HL
#1655,MAKE-ROOM
Okopíruj délku do A.
Nastav HL tak, aby
ukazovalo na #80-kový bajt na konci oblasti proměnných.
Nyní otevři oblast proměnných.
Je vytvořen prostor o velikosti "BC“ před #80-kovým bajtem.
INC
INC
EX
158
HL
HL
DE,HL
Ukazuj na první
nový bajt.
DE bude ukazovat na druhý nový bajt.
Komentovaný výpis paměti ROM
PUSH
LD
DEC
SUB
LD
JR
DE
HL,(#5C4D) (DEST)
DE
#06
B,A
Z,#2B4F,L-SINGLE
Uschovej tento ukazatel.
Vyzvedni ukazatel na začátek jména.
DE ukazuje na první nový bajt.
B bude obsahovat
počet znaků, které byly nalezeny v dlouhém názvu navíc.
Obsluhuješ-li proměnnou s krátkým názvem, skoč dopředu.
Znaky navíc dlouhého názvu jsou předány do oblasti proměnných.
2B3E
L-CHAR
INC
LD
CP
JR
OR
INC
LD
DJNZ
HL
A,(HL)
#21
C,#2B3E,L-CHAR
#20
DE
(DE),A
#2B3E,L-CHAR
Ukazuj na každý znak "navíc".
Vyzvedni jej.
Akceptuj znaky od #21 do #FF a ignoruj od #00 do #20.
Nastav bit 5 pro malá písmena.
Převáděj znaky
postupně od druhého nového bajtu dále.
Pokračuj znovu do smyčky pro všechny znaky "navíc".
Poslední znak dlouhého názvu musí být ORován hodnotou #80.
OR
LD
#80
(DE),A
Označ znak tak jak
je třeba a přepiš poslední kód.
První znak názvu zpracovávané proměnné je nyní posouzen.
2B4F
L-SINGLE
LD
LD
XOR
OR
POP
A,#C0
HL,(#5C4D) (DEST)
(HL)
#20
HL
Připrav se na označení "dlouhý název".
Vyzvedni ukazatel na znak.
A obsahuje #80 pro krátký název a #CO pro dlouhý název.
Nastav bit 5 pro malá písmena.
Nyní odhoď ukazatel.
Podprogram L-FIRST je nyní volán pro vložení "písmene" na příslušné místo.
CALL #2BEA,L-FIRST
Vlož "písmeno" - HL ukazuje na nový #80-kový bajt.
Poslední hodnota může být nyní převedena do oblasti proměnných. Všimněte si, že v tomto bodě HL
vždy ukazuje na pozici za pěti bajty, které jsou přiděleny tomuto číslu. Instrukce RST #28 je použita
k zavolání kalkulátoru a poslední hodnota je pak "vymazána", ale nepřepsána.
2B59
L-NUMERIC
PUSH
RST
DEFB
DEFB
POP
LD
AND
SBC
JR
HL
#28,FP-CALC
#02,výmaz
#38,konec výpočtu
HL
BC,#0005
A
HL,BC
#2BA6,L-ENTER
Uschovej cílový ukazatel.
Použij kalkulátor.
Takto je posunut STKEND zpět o pět bajtů.
Obnov ukazatel.
Nechť Číslo je dlouhé pět bajtů.
HL ukazuje na první z pěti lokací.
Skoč dopředu k provedení skutečného převedení.
Při zjištění, že proměnná již existuje, vstup do tohoto bodu. Nejprve otestuj bit 6 ve FLAGS,
abys oddělil číselné proměnné od řetězcových nebo řetězcová pole.
2B66
L-EXISTS
BIT
JR
6,(IY+1) (FLAGS)
Z,#2B72,L-DELETE$
Při zpracování jakéhokoliv druhu
řetězcové proměnné skoč dopředu.
Pro číselné proměnné "nové" číslo přepíše "staré" číslo. Takže HL musí ukazovat na místo za pět
bajtů existující položky. Nyní ovšem HL ukazuje na místo před těmito pěti bajty.
Komentovaný výpis paměti ROM
159
LD
ADD
JR
DE,#0006
HL,DE
#2B59,L-NUMERIC
Pět bajtů pro číslo + jeden pro znak FP čísla.
Nyní HL ukazuje na místo "za".
Skoč zpět k provedení skutečného přenesení.
Parametry řetězcové proměnné jsou vyzvednuty a kompletní jednoduché řetězce jsou odděleny od
krácených řetězců a polí.
2B72
L-DELETE$
LD
LD
BIT
JR
HL,(#5C4D) (DEST)
BC,(#5C72) (STRLEN)
0,(IY+55) (FLAGX)
NZ,#2BAF,L-ADD$
Vyzvedni start. Poznámka: tento řádek je nadbytečný.
Vyzvedni délku.
Při zpracování kompletního obyčejného
řetězce skoč dopředu. Starý řetězec bude potřeba vymazat
pouze v tomto případě.
Při zpracováni řezu existující řetězcové proměnné, nebo řezu nebo kompletní části řetězcového
pole, prochází program dvěma fázemi. Nejprve se v pracovním prostoru musí vytvořit nový řetězec, který
je podle potřeby zkrácen nebo prodloužen, a v druhé fázi je pak tento řetězec okopírován na své místo
v oblasti proměnných. Ovšem, pokud má řetězec nulovou délku, neděje se nic.
LD
OR
RET
A,B
C
Z
Jedná-li se o nulový řetězec, vrať se.
Jinak vytvoř požadovaný počet míst v pracovním prostoru.
PUSH
RST
PUSH
PUSH
LD
LD
INC
LD
LDDR
HL
#30,BC-SPACES
DE
BC
D,H
E,L
HL
(HL),#20
Uschovej start (DEST).
Vytvoř potřebné místo v pracovním prostoru.
Uschovej ukazatel na první místo.
Uschovej délku pro pozdější použití.
DE ukazuje na
poslední místo a
HL ukazuje o bajt dále.
Je vložen znak mezery a po jeho
okopírování do všech nových pozic ukazuje HL na první
nový znak.
Nyní jsou ze zásobníku kalkulátoru vyzvednuty parametry právě zpracovávaného řetězce.
PUSH HL
CALL #2BF1,STK-FETCH
POP HL
Krátce uschovej ukazatel.
Vyzvedni nové parametry
a obnov ukazatel.
Poznámka: V tomto bodě již bylo v pracovním prostoru vytvořeno místo pro právě "přidělovanou
proměnnou", například při příkazu LET a$(4 TO 8)="abcdefg" bylo vytvořeno pět míst. Parametry
vyzvednuté jako poslední hodnota reprezentují řetězec, který má být kopírován do nových míst s
použitím Prokrustova pravidla krácení nebo prodlužování podle potřeby. Délka nového řetězce je
porovnávána s délkou možného prostoru.
2B9B
160
L-LENGTH
EX
(SP),HL
AND
SBC
ADD
JR
LD
LD
EX
A
HL,BC
HL,BC
NC,#2B9B,L-LENGTH
B,H
C,L
(SP),HL
Délka nové oblasti do HL a ukazatel nové oblasti
na zásobník.
Porovnej dvě délky
a pasuje-li nový řetězec do prostoru
(a tedy není-li potřeba žádného krácení),
skoč dopředu.
Jinak uprav novou
délku neboť je příliš dlouhá.
Délka nové oblasti na zásobník a ukazatel nové oblasti
do HL.
Komentovaný výpis paměti ROM
Pokud nemá nový řetězec nulovou délku je kopírován do pracovního prostoru. Prokrustovo pravidlo
se provádí automaticky, jestliže je nový řetězec kratší, než pro něj vytvořené místo, a je ho třeba
"natáhnout".
EX
LD
OR
JR
LDIR
DE,HL
A,B
C
Z,#2BA3,L-IN-W/S
Start nového řetězce do HL a ukazatel nové oblasti do DE.
Je-li nový řetězec nulový, skoč dopředu.
Jinak přesuň nový řetězec do pracovního prostoru.
Hodnoty, které byly uschovány na zásobníku, jsou nyní obnoveny.
2BA3
L-IN-W/S
POP
POP
POP
BC
DE
HL
Délka nové oblasti.
Ukazatel nové oblasti.
Start, ukazatel na proměnnou (původně v DEST), nyní je
v L-ENTER použit k předání "nového" řetězce do oblasti
proměnných.
PODPROGRAM "L-ENTER“
Tento krátký podprogram se používá buď k předání číselné hodnoty ze zásobníku kalkulátoru, nebo
řetězce z pracovního prostoru, na své nové místo v oblasti proměnných. Podprogram je tedy používán pro
všechny řetězce kromě nově deklarovaných a existujících kompletních řetězců.
2BA6
L-ENTER
EX
LD
OR
RET
PUSH
LDIR
POP
RET
DE,HL
A,B
C
Z
DE
HL
Zaměň ukazatele.
Opět kontroluj nulovou délku.
Vrať se při nulovém výsledku.
Uschovej cílový ukazatel.
Přenes číselnou hodnotu nebo řetězec.
HL ukazuje na první bajt číselné hodnoty nebo řetězce.
Vrať se.
PODPROGRAM " 'LET' POKRAČUJE ZDE"
Při zpracování kompletních s existujících řetězců vstupuje nový řetězec "pod maskou" nově
deklarovaného před tím, než je zničena jeho původní verze.
2BAF
L-ADD$
DEC
DEC
DEC
LD
PUSH
PUSH
CALL
HL
HL
HL
A,(HL)
HL
BC
#2BC6,L-STRING
POP
POP
INC
INC
INC
JP
BC
HL
BC
BC
BC
#19E8,RECLAIM-2
HL ukazuje na znak
písmene názvu proměnné.
Tzn. DEST-3.
Vyzvedni znak.
Uschovej ukazatel na existující verzi.
Uschovej délku existujícího řetězce.
Použij L-STRING k přičtení nového řetězce do oblasti
proměnných.
Obnov délku a
ukazatel.
Přidej jeden bajt pro písmeno a
dva bajty pro délku.
Odejdi přes "zničení" celé původně existující verze.
Nově deklarované jednoduché řetězce jsou zpracovány následovně:
2BC0
L-NEW$
LD
LD
AND
A,#DF
HL,(#5C4D) (DEST)
(HL)
Připrav se na označení názvu proměnné.
Vyzvedni ukazatel na písmeno a
patřičně jej poznač. Pak použij L-STRING (viz dále).
Komentovaný výpis paměti ROM
161
PODPROGRAM "L-STRING"
Paramety nového řetězce jsou vyzvednuty. Pak se vytvoří potřebný prostor a řetězec je přenesen.
2BC6
L-STRING
PUSH
CALL
EX
ADD
PUSH
DEC
LD
INC
INC
INC
LD
DEC
CALL
AF
#2BF1,STK-FETCH
DE,HL
HL,BC
BC
HL
(#5C4D),HL (DEST)
BC
BC
BC
HL,(#5C59) (E-LINE)
HL
#1655,MAKE-ROOM
Uschovej znak názvu proměnné.
Vyzvedni start a délku nového řetězce.
Převeď start do HL.
HL ať ukazuje jedno místo za řetězec.
Uschovej délku.
HL ukazuje na konec řetězce.
Krátce uschovej ukazatel.
Přidej jeden bajt pro písmeno a
dva bajty pro délku.
HL ukazuje na #80-kový bajt
konce proměnných.
Nyní vytvoř prostor v oblasti proměnných.
Poznámka: Ve skutečnosti je #80-kový bajt posunut (a s ním všechny důležité ukazatele) tak, že
vznikne BC míst.
LD
POP
PUSH
INC
LDDR
EX
INC
POP
LD
DEC
LD
POP
HL,(#5C4D) (DEST)
BC
BC
BC
DE,HL
HL
BC
(HL),B
HL
(HL),C
AF
Obnov ukazatel na konec nového řetězce.
Proveď kopii délky nového řetězce,
přidej jednu na délku, i v případě délky řetězce 0.
Pak okopíruj nový řetězec plus jeden bajt.
HL nechť ukazuje na vyšší bajt délky.
Vyzvedni délku.
Vlož její vyšší a
pak nižší bajt.
Vyzvedni znak názvu proměnné.
PODPROGRAM "L-FIRST"
Do tohoto podprogramu se vstupuje s již patřičně označeným písmenem názvu proměnné v registru
A. Tento znak přepíše starý #80-kový bajt v oblasti proměnných. Při výstupu z tohoto podprogramu je
registrový pár HL nastaven na nový #80-kový bajt.
2BEA
L-FIRST
DEC
LD
LD
DEC
RET
HL
(HL),A
HL,(#5C59) (E-LINE)
HL
Nechť HL ukazuje na starý #80-kový bajt.
Ulož tam písmeno názvu proměnné.
Nechť HL ukazuje
na nový #80-kový bajt.
Skončeno s nově deklarovanou proměnnou.
PODPROGRAM "STK-FETCH"
Tento důležitý podprogram vyzvedne poslední hodnotu ze zásobníku kalkulátoru. Těchto pět bajtů
může vyjadřovat buď FP formu, "krátkou" nebo "dlouhou" formu, nebo to mohou být parametry řetězce.
2BF1
162
STK-FETCH
LD
DEC
LD
DEC
LD
DEC
HL,(#5C65) (STKEND)
HL
B,(HL)
HL
C,(HL)
HL
Vyzvedni STKEND.
Zpět o jedno místo.
5. hodnota.
Zpět o jedno místo.
4. hodnota.
Zpět o jedno místo.
Komentovaný výpis paměti ROM
LD
DEC
LD
DEC
LD
LD
RET
D,(HL)
HL
E,(HL)
HL
A,(HL)
(#5C65),HL (STKEND)
3. hodnota.
Zpět o jedno místo.
2. hodnota.
Zpět o jedno místo.
1. hodnota.
Obnov hodnotu STKEND na novou pozici.
Hotovo.
PODPROGRAM PŘÍKAZU DIM
Tento podprogram vytváří nová pole v oblasti proměnných. Podprogram začíná vyhledáním existující
proměnné v oblasti proměnných, aby se zjistilo zda pole s tímto názvem již existuje, a případně bylo
toto pole zničeno před vytvořením pole nového. Nové číselné pole bude mít všechny prvky nastaveny na
nulu a nové řetězcové pole bude vyplněno mezerami.
2C02
2C05
DIM
D-RPORT-C
CALL
JP
CALL
JR
RES
CALL
CALL
#28B2,LOOK-VARS
NZ,#1C8A,REPORT-C
#2530,SYNTAX-Z
NZ,#2C15,D-RUN
6,C
#2996,STK-VAR
#1BEE,CHECK-END
Prohledej oblast proměnných.
Ohlaš chybu C, pokud se nejedná o pole.
Při běhu programu skoč dopředu.
Testuj syntaxi řetězcových polí jako by byli číselné.
Kontroluj syntaxi výrazů v závorkách a posuzuj
další výrazy, když je syntaxe v pořádku.
Existující pole je zničeno.
2C15
D-RUN
JR
PUSH
CALL
CALL
POP
C,#2C1F,D-LETTER
BC
#19B8,NEXT-ONE
#19E8,RECLAIM-2
BC
Neexistuje-li žádné pole skoč dopředu.
Uschovej rozlišovací bajt.
Nalezni začátek další proměnné a
znič existující pole.
Obnov rozlišovací bajt.
Jsou nalezeny počáteční parametry nového pole.
2C1F
D-LETTER
2C2D
D-SIZE
SET
LD
PUSH
LD
BIT
JR
LD
EX
7,C
B,#00
BC
HL,#0001
6,C
NZ,#2C2D,D-SIZE
L,#05
DE,HL
Nastav bit 7 rozlišovacího bajtu.
Čítač rozměrů na nulu.
Uschovej čítač a rozlišovací bajt.
Registr HL bude obsahovat délku elementu v poli.
(1 pro řetězec a
5 pro číslo).
Délka elementu do DE.
Do následující smyčky se vstoupí pro každý rozměr, který je specifikován v závorkách po příkazu
DIM. Celkový počet bajtů pro elementy pole bude vytvořen v registrovém páru DE.
2C2E
D-NO-LOOP
RST
LD
CALL
JP
POP
PUSH
INC
PUSH
LD
LD
CALL
EX
RST
#20,NEXT-CHAR
H,#FF
#2ACC,INT-EXP1
C,#2A20,REPORT-3
HL
BC
H
HL
H,B
L,C
#2AF4,GET-HL*DE
DE,HL
#18,GET-CHAR
Posuň CH-ADD při každém průchodu.
Nastav limitní hodnotu.
Ohodnoť parametr.
Ohlaš chybu je-li parametr mimo rozsah.
Vyzvedni čítač dimenzí a rozlišovací bajt.
Uschovej parametr při každém průchodu smyčkou.
Inkrementuj čítač rozměrů při každém průběhu.
Obnov čítač dimenzí a rozlišovací bajt.
Parametry jsou přeneseny do registrového páru HL.
Celkový počet bajtů se vytváří v registrovém páru HL.
Potom je převeden do DE.
Vyzvedni aktuální znak a
Komentovaný výpis paměti ROM
163
CP
JR
#2C
Z,#2C2E,D-NO-LOOP
skoč znovu do smyčky, je—li to další rozměr.
Poznámka: V tomto bodě obsahuje registrový pár DE počet bajtů požadovaných pro elementy nového
pole. Velikost každého rozměru je uschována na zásobník.
Nyní zkontroluj, že skutečně existuje závorka ")" za danými výrazy.
CP
JR
RST
#29
NZ,#2C05,D-REPORT-C
#20,NEXT-CHAR
Je to ")"?
Jestliže ne, skoč zpět.
Posuň CH-ADD za ni.
Nyní budou rozměrům přiděleny velikosti.
POP
LD
LD
LD
INC
INC
ADD
ADD
JP
PUSH
PUSH
PUSH
LD
LD
BC
A,C
L,B
H,#00
HL
HL
HL,HL
HL,DE
C,#1F15,REPORT-4
DE
BC
HL
B,H
C,L
Vyzvedni čítač rozměrů a rozlišovací bajt.
Pro pozdější použití předej rozlišovací bajt do reg. A.
Přenes čítač do L.
Vyčisti registr H.
Zvětši čítač rozměrů o dvě a
vynásob ho dvěma. Vytvoř správnou délku pro proměnnou
přičtením celkového počtu bajtů.
Ohlaš "out of memory" je-li třeba.
Uschovej celkový počet bajtů pole,
čítač dimenzí a rozlišovací bajt.
Uschovej také počet všech bajtů nutných k vytvoření pole
a zároveň ho přenes
do BC.
Požadovaný prostor pro nové pole je vytvořen na konci oblasti proměnných.
LD
DEC
CALL
INC
HL,(#5C59) (E-LINE)
HL
#1655,MAKE-ROOM
HL
HL ukazuje na
#80-kový bajt.
Je vytvořen prostor a
HL ukazuje na jeho první místo.
Nyní jsou vloženy parametry.
LD
POP
DEC
DEC
DEC
INC
LD
INC
LD
POP
LD
INC
LD
(HL),A
BC
BC
BC
BC
HL
(HL),C
HL
(HL),B
BC
A,B
HL
(HL),A
Řádně označené písmeno je vloženo první.
Je vyzvednuta celková délka a
je snížena o tři.
Posuň HL.
Vlož nižší a
vyšší bajt délky.
Vyzvedni čítač rozměrů.
Převed jej do registru A.
Posuň HL.
Vlož počet rozměrů.
Elementy nového pole jsou nyní vyčištěny.
LD
LD
DEC
LD
164
H,D
L,E
DE
(HL),#00
HL ukazuje na poslední místo pole a
DE o jedno místo před ním.
Vlož nulu na poslední místo.
Komentovaný výpis paměti ROM
2C7C
DIM-CLEAR
BIT
JR
LD
POP
LDDR
6,C
Z,#2C7C,DIM-CLEAR
(HL),#20
BC
Ale pokud se jedná o řetězcové pole
budou místo nul vloženy "mezery".
Vyzvedni celkový počet bajtů pole a
vyčisti pole plus jedno místo navíc.
Nyní jsou vloženy velikosti rozměrů.
2C7F
DIM-SIZES
POP
LD
DEC
LD
DEC
DEC
JR
RET
BC
(HL),B
HL
(HL),C
HL
A
NZ,#2C7F,DIM-SIZES
Vyzvedni velikost rozměru.
Vlož vyšší a
nižší bajt.
Zmenši čítač dimenzí a
opakuj operaci, dokud nebyly posouzeny všechny dimenze
Jinak se vrať.
PODPROGRAM "ALFANUM"
Je-li v registru A uložen znak platné číslice nebo písmene, vrací tento podprogram CY flag
nastaven na hodnotu jedna.
2C88
ALPHANUM
CALL #2D1B,NUMERIC
CCF
RET C
Test na číslici.
CY bude jedna pro platnou číslici a
v tom případě se vrať.
PODPROGRAM "ALFA"
Je-li v registru A uložen znak platného písmene vrací tento podprogram CY flag nastaven na
hodnotu jedna.
2C8D
ALPHA
CP
CCF
RET
CP
RET
CP
CCF
RET
CP
RET
#41
NC
#5B
C
#61
NC
#7B
Testuj oproti #41, což je kód pro písmeno "A".
Komplementuj CY a
vrať se nebyl-li to platný kód znaku.
Testuj oproti #5B, což je o jednu více než kód písmene Z.
Vrať se jestliže se jedná o znak.
Testuj oproti #61, což je kód pro písmeno "a".
Komplementuj CY a
vrať se nebyl-li to platný kód znaku.
Testuj oproti #7B, což je o jednu více než kód písmene z.
Hotovo.
PODPROGRAM "DECIMAL TO FLOATING POINT"
Součástí kontroly syntaxe je převádění dekadických čísel uložených v basicovém řádku na
floating point formu. Tento podprogram načte dekadické číslo (číslici za číslicí) a výsledek
zpracování uloží na zásobník kalkulátoru. Nejdříve je však obsloužen případný výskyt příkazu BIN,
který je následován sérií jedniček a nul.
2C9B
DEC-TO-FP
2CA2
BIN-DIGIT
CP
JR
LD
RST
SUB
ADC
#C4
NZ,#2CB8,NOT-BIN
DE,#0000
#20,NEXT-CHAR
#31
A,#00
JR
EX
NZ,#2CB3,BIN-END
DE,HL
Jedná se o znak BIN?
Jestliže ne, skoč.
Nastav hodnotu výsledku na hodnotu 0.
Vyzvedni další znak.
Odečti znakový kód pro jedničku.
Nula nyní dává nulu s CY=1 a jednička dává nulu s CY=0.
Jakýkoliv jiný znak
vyvolá skok na BIN-END, a zkontroluje se znovu syntaxe.
Výsledek do HL.
Komentovaný výpis paměti ROM
165
2CB3
BIN-END
CCF
ADC
JP
EX
JR
LD
LD
JP
HL,HL
C,#31AD,REPORT-6
DE,HL
#2CA2,BIN-DIGIT
B,D
C,E
#2D2B,STACK-BC
Komplementuj CY.
Posuň výsledek do leva s načtením CY do bitu 0.
Ohlaš přetečení, je-li výsledek větší než 65535.
Vrať výsledek do DE.
Skoč zpět na další nulu nebo jedničku.
Okopíruj výsledek
do BC
pro uložení na zásobník.
Pro ostatní čísla se nejdříve převede celá část a jestliže je další znak desetinná tečka,
posoudí se i zlomková část.
2CB8
NOT-BIN
2CCB
DECIMAL
2CCF
DEC-RPT-C
2CD5
DEC-STO-1
2CDA
NXT-DGT-1
CP
JR
CALL
CP
JR
RST
CALL
JR
JR
RST
CALL
JP
RST
DEFB
DEFB
RST
DEFB
DEFB
DEFB
DEFB
RST
CALL
JR
RST
DEFB
DEFB
DEFB
DEFB
DEFN
DEFB
DEFB
RST
JR
#2E
Z,#2CCB,DECIMAL
#2D3B,INT-TO-FP
#2E
NZ,#2CEB,E-FORMAT
#20,NEXT-CHAR
#2D1B,NUMERIC
C,#2CEB,E-FORMAT
#2CD5,DEC-STO-1
#20,NEXT-CHAR
#2D1B,NUMERIC
C,#1C8A,REPORT-C
#28,FP-CALC
#A0,stk-nula
#38,konec výpočtu
#28,FP-CALC
#A1,stk-jedna
#C0,st-mem-0
#02,výmaz
#38,konec výpočtu
#18,GET-CHAR
#2D22,STK-DIGIT
C,#2CEB,E-FORMAT
#28,FP-CALC
#E0,get-mem-0
#A4,stk-deset
#05,dělení
#C0,st-mem-0
#04,násobení
#0F,sčítání
#38,konec výpočtu
#20,NEXT-CHAR
#2CDA,NXT-DGT-1
Je první znak "."?
Jestliže ano, skoč dopředu.
Jinak vytvoř poslední hodnotu jako typ integer.
Je další znak "."?
Jestliže ano, skoč dopředu, neboť to může být exponent.
Vyzvedni další znak.
Jestliže to není číslice,
skoč (např 1.E4 je povoleno).
Skoč dopředu na obsluhu číslic za desetinnou tečkou.
Jestliže číslo začínalo desetinnou tečkou,
podívej se zda je následující znak číslice.
Není-li tomu tak, ohlaš chybu.
Použij kalkulátor a
ulož nulu jako celou část těchto čísel.
Použij opět kalkulátor.
Nalezni FP formu dekadického čísla jedna a
uschovej ji v paměťové oblasti číslo nula.
Vyzvedni aktuální znak.
Je-li to číslice ulož ji na zásobník.
Jinak skoč dopředu.
Nyní použij kalkulátor.
Při každém průchodu smyčkou je číslo vyzvednuto z paměti
vyděleno deseti
a obnoveno v paměti (asi takto 0.1,0.01,0.001 atd.).
Aktuální číslice je násobena aktuálním číslem
a přičtena k poslední hodnotě.
Vyzvedni další znak.
Skoč zpět (o jeden bajt více než je třeba) k posouzení.
Dále posuzuj jakoukoliv notaci E, např. formátu x E m nebo x e m, kde m je kladné nebo záporné
celé číslo.
2CEB
E-FORMAT
2CF2
SIGN-FLAG
166
CP
JR
CP
RET
LD
RST
CP
JR
CP
#45
Z,#2CF2,SIGN-FLAG
#65
NZ
B,#FF
#20,NEXT-CHAR
#2B
Z,#2CFE,SIGN-DONE
#2D
Je aktuálním znakem "E"?
Jestliže ano, pak skoč dopředu.
Je to "e"?
Konec jestliže ne.
Použij B jako vlajku pro znaménko (#FF je plus "+").
Vyzvedni další znak.
Je-li to plus,
skoč dopředu.
Není-li to ani minus,
Komentovaný výpis paměti ROM
2CFE
2CFF
SIGN-DONE
ST-E-PART
2D18
E-FP-JUMP
JR
INC
RST
CALL
JR
PUSH
CALL
CALL
POP
JP
AND
JP
INC
JR
NEG
JP
NZ,#2CFF,ST-E-PART
B
#20,NEXT-CHAR
#2D1B,NUMERIC
C,#2CCF,DEC-RPT-C
BC
#2D3B,INT-TO-FP
#2DD5,FP-TO-A
BC
C,#31AD,REPORT-6
A
M,#31AD,REPORT-6
B
Z,#2D18,E-FP-JUMP
#2D4F,E-TO-FP
skoč dopředu.
Změň znaménko.
Ukazuj na první číslici.
Není-li to číslice
ohlaš chybu.
Uschovej vlajku v registru B.
Ulož na zásobník hodnotu ABS m, kde m je exponent.
Převed ABS m do A.
Obnov znaménkovou vlajku do B.
Ohlaš přetečení je-li ABS m>255
nebo skutečně větší než 127
(hodnoty větší než 39 budou vyloučeny později).
Testuj znaménkovou vlajku v registru B.
Plus (tedy #FF) nastaví Z flag a pak se odskočí.
Neguj m je-li znaménko mínus.
Skoč k přidělení poslední hodnoty, výsledek x*10^m.
PODPROGRAM "NUMERIC"
Představuje-li aktuální hodnota v registru A znak platné číslice vrací tento podprogram CY flag
nastaven na nulu.
2D1B
NUMERIC
CP
RET
CP
CCF
RET
#30
C
#3A
Testuj oproti #30 což je kód pro nulu.
Jestliže se nejedná o platný znakový kód, vrať se.
Testuj oproti hornímu limitu.
Komplementuj CY a
hotovo.
PODPROGRAM "STK-DIGIT"
Nepředstavuje-li hodnota v registru A platnou číslici, podprogram se prostě vrátí, jinak je
znaku přiřazena jeho hodnota a uložena na zásobník kalkulátoru.
2D22
STK-DIGIT
CALL #2D1B,NUMERIC
RET C
SUB #30
Není-li znak číslo,
vrať se.
Nahraď kód aktuální číslicí.
PODPROGRAM "STACK-A"
Tento podprogram vytváří z absolutní binární hodnoty v registru A hodnotu ve tvaru floating
point a ukládá ji na zásobník.
2D28
STACK-A
LD
LD
C,A
B,#00
Převeď hodnotu do registru C a
vynuluj registr B.
PODPROGRAM "STACK-BC"
Tento podprogram vytváří z absolutní binární hodnoty v registru BC hodnotu ve tvaru floating
point a ukládá ji na zásobník. Forma používaná v tomto a tím pádem i v předchozích dvou podprogramech,
je forma malých celých čísel. Prvý a pátý bajt jsou nulové, třetí a čtvrtý bajt je nižší a vyšší bajt
16-ti bitového čísla v komplementovaném tvaru (tedy -n = 65536 +n) a druhý bajt je znaménkový, tedy
#00 pro plus a #FF pro mínus.
2D2B
STACK-BC
LD
XOR
LD
LD
LD
LD
IY,#5C3A
A
E,A
D,C
C,B
B,A
Nastav IY na ERR-NR.
Vynuluj registr A a
registr E, aby indikoval +.
Kopíruj méně významný bajt do D a
významnější bajt do C.
Vyčisti registr B.
Komentovaný výpis paměti ROM
167
CALL
RST
DEFB
AND
RET
#2AB6,STK-STORE
#28,FP-CALC
#38,konec výpočtu
A
Nyní ulož číslo.
HL nechť ukazuje na STKEND -5.
Vynuluj CY flag.
Hotovo.
PODPROGRAM "INTEGER TO FLOATING POINT"
Tento podprogram převede číslo z basicového řádku, tedy celou část dekadického čísla nebo čísla
řádku, na zásobník kalkulátoru jako poslední hodnotu v FP tvaru. Opakované volání na CH-ADD+1
vyzvedne postupně všechny číslice celočíselné části. Výstup se provede v případě nalezení
nenumerického znaku.
2D3B
INT-TO-FP
PUSH
RST
DEFB
DEFB
POP
AF
#28,FP-CALC
#A0,stk-nula
#38,konec výpočtu
AF
Uschovej první číslici v A.
Použij kalkulátor.
Poslední hodnota je nyní nula.
Obnov původní číslici.
Nyní se vstupuje do smyčky. Představuje-li kód číslici, nalezne se její FP forma uloží se pod
poslední položku. Ta je potom vynásobena deseti a přičtena k číslici, aby byla vytvořena nová poslední
hodnota a ta pak přenesena opět na začátek smyčky.
2D40
168
NXT-DGT-2
CALL
RET
RST
DEFB
DEFB
DEFB
DEFB
DEFB
CALL
JR
#2D22,STK-DIGIT
C
#28,FP-CALC
#01,záměna
#A4,stk-deset
#04,násobení
#0F,sčítání
#38,konec výpočtu
#0074,CH-ADD+1
#2D40,NXT-DGT-2
Představuje-li kód číslici, ulož její FP formu na zás.
kalkulátoru. Jinak se vrať.
Použij kalkulátor.
Číslice jde pod poslední hodnotu.
Je uloženo číslo 10.
Poslední hodnota = poslední hodnota * 10.
Poslední hodnota = poslední hodnota + číslice.
Další znak jde do A.
Skok zpět do smyčky s tímto znakem.
Komentovaný výpis paměti ROM
ARITMETICKÉ PODPROGRAMY
E-FORMAT TO FLOATING POINT FORMAT
(Doplněk: #3C - "e-to-fp“)
Tento podprogram převádí číslo zapsané ve tvaru xEm, kde m je kladné nebo záporné celé číslo,
na zásobník kalkulátoru tak, že hodnota x je poslední hodnotou a hodnota m je v registru A. Metoda
používaná k nalezení absolutní hodnoty m, řekněme čísla p, je dána dělením nebo násobením čísla x
hodnotou 10^p podle toho, je-li m kladné nebo záporné. Pro dosažení tohoto výsledku se postupuje
následovně: p je posouváno doprava dokud není nulové a x je násobeno nebo děleno hodnotou 10^(2^n) pro
každý nastavený bit hodnoty p. Jelikož p nikdy nepřesáhne hodnotu větší než 39, budou bity 6 a 7
hodnoty p normálně nulové.
2D4F
2D55
2D60
E-TO-FP
E-SAVE
E-LOOP
RLCA
RRCA
JR
CPL
INC
PUSH
LD
CALL
RST
DEFB
DEFB
POP
SRL
JR
PUSH
RST
NC,#2D55,E-SAVE
A
AF
HL,#5C92
#350B,FP-0/1
#28,FP-CALC
#A4,stk-deset
#38,konec výpočtu
AF
A
NC,#2D71,E-TST-END
AF
#28,FP-CALC
Testuj znaménko m rotacemi bitu 7 do CY
a zpět aniž by došlo ke změně A.
Je-li m pozitivní, skoč.
Neguj m v registru A
bez porušení CY.
Uschovej krátce registr A.
Toto je MEMBOT.
Znaménkový bajt je nyní uložen v 1.
bajtu mem-0,#00= +, #01= -.
Na zásobníku je hodnota x.
x,10
x,10
Obnov m v registru A.
Ve smyčce posunuj další bit m - nastaví CY a Z jak třeba.
Je-li CY rovno nule skoč.
Uschovej zbytek m a vlajky.
Na zásobníku je nyní x' (což je přechodná fáze násobení x*10^m) a 10^(2^n), kde n=0,1,..,5.
2D6D
2D6E
E-DIVSN
E-FETCH
2D71
E-TST-END
2D7B
E-END
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
POP
JR
PUSH
RST
DEFB
DEFB
DEFB
POP
JR
RST
DEFB
DEFB
RET
#C1,st-mem-1
#E0,get-mem-0
#00,skoč-pravda
#04,na E-DIVSN
#04,násobení
#33,skoč
#02,na E-FETCH
#05,dělení
#E1,get-mem-1
#38,konec výpočtu
AF
Z,#2D7B,E-END
AF
#28,FP-CALC
#31,zdvojení
#04,násobení
#38,konec výpočtu
AF
#2D60,E-LOOP
#28,FP-CALC
#02,výmaz
#38,konec výpočtu
10^(2^n) do mem-1
x',10^(2^n),1/0
x',10^(2^n)
x',10^(2^n)
x'*10^(2^n)= x''
x''
x''
x'/10^(2^n)=x'' (x*10^(2^n) či x'/10^/(2^n))
x'',10^(2^n)
x'',10^(2^n)
Obnov zbytek m v registru A a podmínkové vlajky.
Bylo-li m sníženo na nulu, skoč.
Uschovej zbytek m v registru A.
x'',10^(2^n)
x'',10^(2^n),10^(2^n)
x'',10^(2^(n+1))
x'',10^(2^(n+1))
Obnov zbytek m v registru A.
Skoč zpět pro všechny bity hodnoty m.
Použij kalkulátor k
vymazání výsledné mocniny deseti.
Poslední hodnota je tedy x*10^m.
Komentovaný výpis paměti ROM
169
PODPROGRAM "VYZVEDNUTÍ CELÉHO ČÍSLA"
Tento podprogram načte do DE hodnotu "malého" celého čísla z místa adresovaného registrovým
párem HL. Tedy n je běžně prvním (nebo druhým) číslem na zásobníku kalkulátoru, ale HL může (po
záměně s DE) dosáhnout i čísla, které už bylo ze zásobníku kalkulátoru "vymazáno". Podprogram sám o
sobě nevymaže číslo ze zásobníku a vrací HL tak, Že ukazuje na čtvrtý bajt čísla v jeho původní
pozici.
Poznámka: "malé celé číslo" je každé číslo n, pro které platí -65535<=n<=65535.
2D7F
INT-FETCH
INC
LD
HL
C,(HL)
Ukazuj na znaménkový bajt čísla a
vyzvedni ho do C.
Následující mechanismus provede dvojkový doplněk čísla jestliže je záporné (C obsahuje #FF).
Jinak ho nechá být (C obsahuje #00).
INC
LD
XOR
SUB
LD
INC
LD
ADC
XOR
LD
RET
HL
A,(HL)
C
C
E,A
HL
A,(HL)
A,C
C
D,A
Ukazuj na méně významný bajt a
vyzvedni ho do A.
Je-li číslo záporné, proveď jedničkový doplněk.
Přičti 1 pro záporná čísla a nestav CY, pokud není nula.
Méně významný bajt do E.
Ukazuj na významnější bajt
a vyzvedni jej do A.
Dokonči dvojkovou komplementaci v
případě negativního čísla. CY je vždy rovno nule.
Významnější bajt do D a
hotovo.
PODPROGRAM "ULOŽENÍ CELÉHO ČÍSLA"
Tento podprogram ukládá hodnotu "malého" celého čísla na místo adresované registrovým párem HL
a čtyři další místa. Tedy n nahradí první (nebo druhé) číslo na zásobníku kalkulátoru. HL se vrací s
hodnotou adresy prvního bajtu čísla n na zásobníku kalkulátoru.
2D8C
2D8E
P-INT-STO
INT-STORE
LD
PUSH
LD
INC
LD
C,#00
HL
(HL),#00
HL
(HL),C
Tento vstupní bod je použit pro ukládání celých čísel.
Ukazatel na první místo je uschován.
První bajt je nastaven na nulu.
Ukazuj na druhé místo a
vlož znaménkový bajt.
Nyní je použit stejný způsob vytváření dvojkových doplňků pro negativní čísla jako v podprogramu
"ULOŽENÍ CELÉHO ČÍSLA". Toto je zapotřebí například před nebo po násobení malých celých čísel. Ovšem
sčítání se provádí bez jakýchkoliv úprav.
INC
LD
XOR
SUB
LD
INC
LD
ADC
XOR
LD
INC
LD
POP
RET
170
HL
A,E
C
C
(HL),A
HL
A,D
A,C
C
(HL),A
HL
(HL),#00
HL
Ukazuj na třetí místo.
Vyzvedni nižší bajt,
proveď jeho dvojkový doplněk, je-li to třeba.
Ulož tento bajt.
Ukazuj na čtvrté místo,
vyzvedni vyšší bajt,
opět proveď odpovídající úpravy.
Ulož i tento bajt.
Ukazuj na páté místo a
vlož tam nulu.
Vrať se s adresou prvního bajtů ukládaného čísla v HL.
Komentovaný výpis paměti ROM
PODPROGRAM "FP D0 BC"
Tento podprogram se volá ze čtyř různých míst pro různé účely a je používán ke kompresi FP
hodnoty na zásobníku kalkulátoru do registrového páru BC. Je-li výsledek větši než 65535, potom
program nastaví CY na hodnotu jedna. Je-li poslední hodnota negativní, potom je Z flag roven nule.
Nižší bajt výsledku je také okopírováno do registru A.
2DA2
2DAD
FP-TO-BC
FP-DELETE
RST
DEFB
LD
AND
JR
RST
DEFB
DEFB
DEFB
DEFB
RST
DEFB
DEFB
PUSH
PUSH
EX
LD
CALL
XOR
SUB
BIT
LD
LD
LD
POP
POP
RET
#28,FP-CALC
#38,konec výpočtu
A,(HL)
A
Z,#2DAD,FP-DELETE
#28,FP-CALC
#A2,stk-polovina
#0F,sčítání
#27,int
#38,konec výpočtu
#28,FP-CALC
#02,delete
#38,konec výpočtu
HL
DE
DE,HL
B,(HL)
#2D7F,INT-FETCH
A
B
7,C
B,D
C,E
A,E
DE
HL
Použij kalkulátor, aby HL ukazovalo na STKEND-5.
Vyzvedni exponentový bajt.
Je-li nulový,
skoč, neboť se jedná o malé číslo.
Použij kalkulátor
k zaokrouhlení poslední hodnoty na nejbližší
celé číslo, což ho převede na malé celé číslo,
je-li to možné.
Použij kalkulátor
k vymazání čísla ze zásobníku.
DE stále ukazuje na číslo v paměti (na STKEND).
Uschovej oba zásobníkové ukazatele.
HL nyní ukazuje na číslo.
Kopíruj první bajt do B.
Kopíruj bajty 2,3 a 4 do C, E a D.
Vynuluj registr A.
CY je nula pokud je B různé od nuly.
Z flag je nastaven, jestliže číslo je kladné.
Vyšší bajt do B.
Nižší bajt do C a
do A.
Obnov ukazatele.
Hotovo.
PODPROGRAM "LOG(2^A)"
Tento podprogram se volá z podprogramu PRINT-FP aby vypočítal přibližný počet číslic před
desetinnou tečkou pro x (číslo, které má být vytištěno). Nejsou-li před desetinnou tečkou žádné
číslice, spočte přibližný počet úvodních nul za desetinnou tečkou. Do podprogramu se vstupuje s
číslem e' v registru A, což je pravý exponent x, nebo e'-2 a počítá se z=LOG při základu 10 z
hodnoty (2^A). A se pak nastaví na hodnotu ABS INT (z+0.5) jak je požadováno. Pro tento účel se
použije FP-TO-A.
2DC1
LOG(2^A)
LD
RLA
SBC
LD
LD
XOR
LD
CALL
RST
DEFB
DEFB
DEFB
DEFB
DEFB
D,A
A,A
E,A
C,A
A
B,A
#2AB6,STK-STORE
#28,FP-CALC
#34,stk-data
#EF,exponent #7F
#1A,#20,#9A,#85
#04,násobení
#27,int
Hodnota A je uložena ve tvaru: 00 00 A 00 00 pro A>0
nebo 00 FF A FF 00 pro A<0.
Tyto bajty jsou nejprve uloženy do A E D C B a později
na zásobník kalkulátoru.
Použij kalkulátor.
LOG 2 je nyní uložen na zásobník.
Zásobník obsahuje A a LOG 2
A*LOG 2, čili LOG (2^A)
INT LOG(2^A)
Komentovaný výpis paměti ROM
171
DEFB #38,konec výpočtu
Podprogram pokračuje do FP-TO-A k dokončení výpočtu.
PODPROGRAM "FLOATING POINT TO A"
Tento krátký ale velice důležitý podprogram je volán v osmi případech pro různé účely. Používá
mimo jiné, FP-TO-BC k převedení poslední hodnoty do registru A kdykoliv je to možné. Proto také
testuje modulus čísla a jestliže je toto číslo větší než 255, je nastaveno CY. Jinak se vrací modul
čísla zaokrouhlený na nejbližší celé číslo v registru A. Z flag se používá k rozlišení kladného nebo
záporného čísla.
2DD5
FP-TO-A
2DE1
FP-A-END
CALL
RET
PUSH
DEC
INC
JR
POP
SCF
RET
POP
RET
#2DA2,FP-TO-BC
C
AF
B
B
Z,#2DE1,FP-A-END
AF
AF
Kompresuj poslední hodnotu do BC.
Bylo-li to mimo rozsah, vrať se.
Uschovej výsledek a podmínkové příznaky a
opět je chyba,
není-li v registru B nula.
Je-li vše O.K., skoč.
Vyzvedni výsledek a podmínkové příznaky.
Signál, že výsledek je mimo rozsah.
Konec-neúspěšně.
Vyzvedni výsledek a podmínkové příznaky.
Konec-úspěšně.
PODPROGRAM "VYPSÁNÍ FP ČÍSLA"
Tento podprogram se volá podprogramem příkazu PRINT na adrese #2039 a STR$ na adrese #3630,
které převádí číslo na řetězec tak, jako kdyby byl vypsán. Tento podprogram vytiskne x, které je
uloženo jako poslední hodnota na zásobníku kalkulátoru. Tiskový formát nikdy nezabere více než čtrnáct
míst. Osm nejvýznamnějších číslic x správně zaokrouhlených je uschováno v tiskovém bafru vytvořeném
speciálně pro tento účel v pamětech zásobníkové paměti mem-3 a mem-4. Malá čísla numericky menší než
jedna a čísla větší než 2^27 jsou zpracována samostatně. Menší jsou násobena hodnotou 10^n, kde n je
přibližný počet úvodních nul za desetinnou čárkou, zatímco větší čísla jsou dělena hodnotou 10^(n-7),
kde n je přibližný počet číslic před desetinnou čárkou. Tímto se všechna čísla dostávají do středního
rozsahu a počet číslic požadovaných před desetinnou čárkou je uložen v druhém bajtu paměti mem-5.
Nakonec je vše vytisknuto s použitím E-formátu, jestliže bylo více než osm číslic před desetinnou
tečkou nebo více než čtyři nuly za desetinnou tečkou.
Následující program v basicu ukazuje na rozsah tiskových formátů:
10 FOR a=-11 TO 12: PRINT SGN a*9^a,: NEXT a
a) Nejprve je ošetřeno znaménko čísla x:
x<0 - podprogram skočí na PF-NEGATIVE, kde se před hodnotu ABS x vytiskne znaménko mínus.
x=0 - x je vymazáno ze zásobníku kalkulátoru, je vytištěna nula a převeden návrat.
x>0 - podprogram jenom pokračuje.
2DE3
172
PRINT-FP
RST
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
LD
RST
RET
#28,FP-CALC
#31,zdvojení
#36, <0
#00,skok-pravda
#0B,na PF-NEGTVE
#31,zdvojení
#37, >0
#00,skok-pravda
#0D,na PF-POSTVE
#02,výmaz
#38,konec výpočtu
A,#30
#10,PRINT-A-1
Použij kalkulátor.
x,x
x, (1/0) (logická hodnota x)
x
x
x,x
x, (1/0) (logická hodnota x)
x
x kde již x' bude ABS x
Vlož znak nula "0" a
vytiskni ho.
Konec a poslední hodnota je nula.
Komentovaný výpis paměti ROM
2DF2
PF-NEGTVE
2DF8
PF-POSTVE
DEFB
DEFB
LD
RST
RST
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
EXX
PUSH
EXX
#2A,abs
#38,konec výpočtu
A,#2D
#10,PRINT-A-1
#28,FP-CALC
#A0,stk-nula
#C3,st-mem-3
#C4,st-mem-4
#C5,st-mem-5
#02,výmaz
#38,konec výpočtu
HL
x'=ABS x
x'
Vlož znak "-" a
vytiskni ho.
Opět použij kalkulátor.
15 bajtů pamětí mem-3 až 5
je nastaveno na nuly
potřebné pro tiskový bafr a
dvě počítadla.
Zásobník je vyčištěn až na x'.
x'
HL', který bude obsahovat kalkulátorové
doplňky (např. pro STR$), je uložen
na zásobník procesoru (SP).
b) Toto je start smyčky, která zpracovává větší čísla. Nicméně každé číslo x je rozděleno na
svou celou část (i) a zlomkovou část (f). Jedná-li se o malé číslo, tedy -65535 až 65535, je uloženo
v registrovém páru DE' před vložením do tiskového bafru.
2E01
PF-LOOP
2E1E
PF-SAVE
RST
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
LD
AND
JR
CALL
LD
LD
AND
JR
OR
JR
LD
LD
PUSH
EXX
POP
EXX
JR
#28,FP-CALC
#31,zdvojení
#27,int
#C2,st-mem-2
#03,odečet
#E2,get-mem-2
#01,záměna
#C2,st-mem-2
#02,výmaz
#38,konec výpočtu
A,(HL)
A
NZ,#2E56,PF-LARGE
#2D7F,INT-FETCH
B,#10
A,D
A
NZ,#2E1E,PF-SAVE
E
Z,#2E24,PF-SMALL
D,E
B,#08
DE
DE
#2E7B,PF-BITS
Opět použij kalkulátor.
x',x'
x',INT(x')=i
x',i do mem-2
x'-i=f
f,i
i,f
i,f do mem-2
i
i
Jestliže i je malé číslo (1.bajt) je nulový a
tedy ABS i<=65535,
pak neskákej a
okopíruj i do DE (i jako x'>=0).
B je nastaveno jako počítadlo 16-ti bitů.
D je okopírováno do A.
Není-li D nulové,
skoč.
Nyní testuj E a jestliže DE je nula,
skoč, neboť x je čistý zlomek.
Přenes E do D.
Nastav B na osm bitů.
Přenes za pomoci zásobníku DE do DE', aby
jeho hodnoty mohly být
přeneseny do tiskového bafru
v bodě PF-BITS.
Skoč dopředu.
c) Čisté zlomky jsou násobeny hodnotou 10^n, kde n je přibližný počet úvodních nul za
desetinnou čárkou, -n je přičteno k druhému bajtu mem-5, který obsahuje počet číslic před desetinnou
čárkou. Záporná čísla indikují počet nul za desetinnou čárkou.
2E24
PF-SMALL
RST #28,FP-CALC
DEFB #E2,get-mem-2
DEFB #38,konec výpočtu
i (i je zde nula)
i,f
i,f
Poznámka: Povšimněte si, že zásobník je nyní nevyvážen. K tomu by bylo potřeba další bajt DEFB
#02, výmaz na adrese #2E25 hned za instrukcí RST #28. Proto nyní výraz jako např. "2“+STR$ 0.5 je
nesprávně ohodnocen jako 0.5: nula ponechaná na zásobníku nahradí dvojku a vše je považováno za nulový
Komentovaný výpis paměti ROM
173
řetězec. Tím pádem i řetězcová porovnání mohou vést k nesprávným hodnotám, když druhý řetězec má formu
STR$ x a x<1, tedy např. výraz "50"<STR$ 0.1 dává logickou hodnotu pravda, neboť místo "50" je opět
použit nulový řetězec.
LD
SUB
CALL
LD
LD
SUB
LD
LD
CALL
RST
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
CALL
PUSH
LD
DEC
RLA
SBC
INC
LD
LD
INC
ADD
LD
POP
JP
A,(HL)
#7E
#2DC1,LOG(2^A)
D,A
A,(#5CAC) (mem-5-2nd)
D
(#5CAC),A (mem-5-2nd)
A,D
#2D4F,E-TO-FP
#28,FP-CALC
#31,zdvojení
#27,int
#C1,st-mem-1
#03,odečet
#E1,get-mem-1
#38,konec výpočtu
#2DD5,FP-TO-A
HL
(#5CA1),A (mem-3-1st)
A
A,A
A
HL,#5CAB
(HL),A
HL
A,(HL)
(HL),A
HL
#2ECF,PF-FRACTN
Exponentový bajt E čísla f je kopírován do A.
A obsahuje E-126 tedy E'+2 kde E' je skutečný exponent f.
Konstrukce A=ABS INT(LOG(2^A)) je nyní vytvořena.
A=n takže: n okopírováno z A do D.
Aktuální počet je vyzvednut z druhého bajtu mem-5 a
je od něj odečteno n.
n je okopírováno z D do A.
Na zásobník je uložena hodnota y=f*10^n.
i,y
i,y,y
i,y,INT y=i2
i2 do mem-1
i,y-i2
i,y-i2,i2
i,f2,i2 (f2=y-i2)
i2 je převedeno ze zásobníku do A.
Ukazatel na f2 je uschován.
i2 je uschováno v prvním bajtu mem-3. Tedy pro tisk.
Ovšem je-li i2 nula, nebude se počítat jako číslice pro
tisk. A je manipulováno tak, že nula způsobí nulu,
ale nenulová hodnota způsobí jedničku.
Toto je 1.bajt mem-5, kam je vložena hodnota
nula nebo jedna (tedy počet číslic pro tisk)
a přičtena k druhému bajtu mem-5,
což je počet číslic před desetinnou čárkou.
Ukazatel na f2 je obnoven.
Skok na umístění f2 do bafru (HL ukazuje na f2,DE na i2).
d) Čísla větší než 2^27 jsou násobena hodnotou 2^(-n+7) což snižuje
desetinnou čárkou na osm a je proveden opětovný vstup do smyčky v bodě PF-LOOP.
2E56
PF-LARGE
SUB
CP
JR
CALL
SUB
LD
LD
ADD
LD
LD
NEG
CALL
JR
#80
#1C
C,#2E6F,PF-MEDIUM
#2DC1,LOG(2^A)
#07
B,A
HL,#5CAC
A,(HL)
(HL),A
A,B
#2D4F,E-TO-FP
#2E01,PF-LOOP
počet
číslic
před
E-#80=E' je skutečný exponent i.
je-li E' menší než 28
skoč.
V registru A je vytvořena hodnota n a
snížena na n-7.
Pak je okopírována do B a
přičtena k druhému bajtu mem-5, což je počet číslic
požadovaný před desetinnou čárkou pro tisk čísla x.
Potom je i vynásobeno hodnotou 10^(-n+7) a tím
převedeno pro střední rozsah.
Skok zpět do smyčky pro zpracování středně velikého čís.
e) Celá část hodnoty x je uložena v tiskovém bafru, který je tvořen 10 bajty mem-3 a mem-4.
2E6F
174
PF-MEDIUM
EX
DE,HL
CALL #2FBA,FETCH-TWO
EXX
SET 7,D
DE nyní ukazuje na i, HL na f.
Mantisa i je nyní DE', DE.
Vyzvedni zrcadlové registry.
Pravdivý numerický bit 7 do D'.
Komentovaný výpis paměti ROM
LD
EXX
SUB
LD
A,L
#80
B,A
Exponentový bajt E čísla i do registru A.
Zpět na hlavní registry.
Skutečný exponent do registru A.
Tím se dosáhne požadovaného počtu bitů.
V případě, že i je malé celé číslo (menší než 65535), provede se opětovný vstup v tomto bodě.
2E7B
2E8A
PF-BITS
PF-BYTES
SLA
RL
EXX
RL
RL
EXX
LD
LD
LD
ADC
DAA
LD
DEC
DEC
JR
DJNZ
E
D
E
D
HL,#5CAA
C,#05
A,(HL)
A,A
(HL),A
HL
C
NZ,#2E8A,PF-BYTES
#2E7B,PF-BITS
Mantisa i je nyní rotována doleva a
všechny bity posouvány do mem-4 a
každý bajt mem-4 je dekadicky upraven
po každém posunu.
Všechny čtyři bajty čísla i.
Zpět na hlavní registry.
Adresa 5.bajtu mem-4 do HL.
Počet bajtů do C.
Vyzvedni bajt z mem-4.
Posuň jej doleva a přiber i nový bit.
Pak proveď dekadickou korekci a
výsledek opět ulož do mem-4.
Ukazuj na další bajt mem-4.
Sniž počítadlo bajtů o jeden.
Skoč pro každý bajt v mem-4.
Skoč pro každý bit hodnoty INT x.
Dekadická korekce každého bajtu mem-4 dává dvě desítkové číslice na bajt, čímž vznikne nejvíce
9 číslic. Vzniklá číslice budou nyní převedeny, jedna na bajt, v pamětech mem-3 a mem-4 použitím
instrukce RLD.
2EA1
PF-DIGITS
2EA9
PF-INSERT
2EB3
PF-TEST-2
2EB8
PF-ALL-9
2ECB
PF-MORE
XOR
LD
LD
LD
RLD
LD
RLD
JR
DEC
INC
JR
LD
INC
INC
INC
LD
BIT
JR
INC
DJNZ
LD
SUB
JR
DEC
LD
CP
JR
RST
DEFB
DEFB
A
HL,#5CA6
DE,#5CA1
B,#09
C,#FF
NZ,#2EA9,PF-INSERT
C
C
NZ,#2EB3,PF-TEST-2
(DE),A
DE
(IY+113) (mem-5-1st)
(IY+114) (mem-5-2nd)
C,#00
0,B
Z,#2EB8,PF-ALL-9
HL
#2EA1,PF-DIGITS
A,(#5CAB) (mem-5-1st)
#09
C,#2ECB,PF-MORE
(IY+113) (mem-5-1st)
A,#04
(IY+111) (mem-4-4th)
#2F0C,PF-ROUND
#28,FP-CALC
#02,výmaz
#E2,get-mem-2
Registr A je vyčištěn, aby mohl převzít číslice.
Zdrojová adresa 1.bajtu mem-4.
Cílová adresa 1.bajt mem-3.
Existuje maximálně 9 číslic.
Levá slabika mem-4 je odhozena.
Hodnota #FF v C je signál: úvodní nula, #00 bez úvodní.
Levá slabika hodnoty v (HL) do A, pravá sl. (HL) doleva.
Skoč, jestliže číslice v A není nulová.
Test na úvodní nulu.
Jednalo-li se o úvodní nulu, skoč.
Vlož číslici.
Ukazuj na další cílovou adresu.
Další číslice pro tisk a
další před desetinnou tečkou.
Změň signál z úvodní nuly na jinou nulu.
Zdrojový ukazatel má být inkrementován při každém druhém
průchodu smyčkou, kdy B je liché.
Skoč zpět pro všech devět číslic.
Vyzvedni čítač.
Nebylo-li zde devět číslic bez úvodních nul,
skoč pro další čísla.
Příprava na zaokrouhlení: sniž počet na osm.
Porovnej devátou číslici, se čtyřkou
k nastavení CY pro zaokrouhlení.
Skoč na zaokrouhlení.
Použij opět kalkulátor.
i je nyní vymazáno.
f
Komentovaný výpis paměti ROM
175
DEFB #38,konec výpočtu
f
f) Zlomková část K je nyní převedena do tiskového bafru.
2ECF
PF-FRACTN
2EDF
PF-FRN-LP
2EEC
2EEF
PF-FR-DGT
PF-FR-EXX
EX
CALL
EXX
LD
SUB
LD
SET
EXX
CALL
LP
CP
JR
EXX
RL
EXX
JR
LD
LD
CALL
LD
LD
CALL
LD
PUSH
EXX
POP
DJNZ
LD
LD
LD
ADD
LD
INC
JR
DE,HL
#2FBA,FETCH-TWO
DE nyní ukazuje na f.
Mantisa f je převedena DE', DE.
Přepni na zrcadlové registry.
A,#80
Exponent f je snížen na nulu,
L
posunutím bitů hodnoty f, #80-E posune doprava
L,#00
hodnotu E uloženou v registru L'.
7,D
Skutečný numerický bit 7 do D'.
Obnov hlavní registry.
#2FDD,SHIFT-FP
Nyní proveď posun.
A,(IY+113) (mem-5-1st) Vyzvedni počet číslic.
#08
Nebylo-li osm číslic,
C,#2EEC,PR-FR-DGT
skoč dopředu.
Bylo-li osm číslic, použij k zaokrouhlení nahoru rotaci
D
D' doleva,čímž se nastaví CY.
Obnov hlavní registry a
#2F0C,PF-ROUND
skoč dopředu k zaokrouhlení.
BC,#0200
Počáteční nula do C a počet dvou do B.
A,E
D',E',D a E se násobí deseti
#2F8B,CA=10*A+C
ve dvou fázích nejprve DE a pak D'E',
E,A
každý bajt bajtem ve dvou krocích.
A,D
#2F8B,CA=10*A+C
Celočíselná část výsledku je potom v C aby mohla být
D,A
převedena do tiskového bafru.
BC
Počet a výsledek jsou uloženy do obou párů BC a B'C'.
BC
#2EEF,PF-FR-EXX
Jednou skoč zpět přes výměnu registrů.
HL,#5CA1
Start 1.bajt mem-3.
A,C
Výsledek do A pro uložení.
C,(IY+113) (mem-5-1st) Počet číslic do C.
HL,BC
Adresuj první prázdný bajt.
(HL),A
Ulož další číslici.
(IY+113) (mem-5-1st) Zvyš počet číslic.
#2EDF,PF-FRN-LP
Dokud není všech osm číslic, skákej zpět.
g) Číslice uložené v tiskovém bafru jsou zaokrouhleny na maximum osmi číslic pro tisk.
2F0C
PF-ROUND
2F18
PF-RND-LP
2F25
PF-R-BACK
176
PUSH
LD
LD
LD
ADD
LD
POP
DEC
LD
ADC
LD
AND
JR
CP
CCF
JR
DJNZ
AF
Uschovej CY pro zaokrouhlení.
HL,#5CA1
Bázová adresa čísla mem-3 1.bajt.
C,(IY+113) (mem-5-1st) Doplněk (počet číslic v čísle) do BC.
B,#00
HL,BC
Adresuj poslední bajt čísla.
B,C
Kopíruj C do B jako čítač.
AF
Obnov CY.
HL
Toto je poslední bajt čísla.
A,(HL)
Vyzvedni ho do A.
A,#00
Přičti CY,tedy zaokrouhli.
(HL),A
Ulož zaokrouhlený bajt do bafru.
A
Byla-li to nula, nebo desítka,
Z,#2F25,PF-R-BACK
bude B zaokrouhleno a závěrečná nula nebo desítka,
#0A
nebude započtena do tisku.
Nuluj CY pro platnou číslici.
NC,#2F2D,PF-COUNT
Je-li CY=0, skoč.
#2F18,PF-RND-LP
Skoč zpět pro další zaokr. nebo další závěrečné nuly.
Komentovaný výpis paměti ROM
2F2D
PF-COUNT
LD
INC
INC
LD
RST
DEFB
DEFB
EXX
POP
EXX
(HL),#01
Toto je přetečení doleva.
B
Zde je zapotřebí další jedničky.
(IY+114) (mem-5-2nd) Je to také další extra číslice před desetinnou tečkou.
(IY+113),B (mem-5-1st) B nyní nastaví počet tištěných číslic mimo záv. nul.
#28,FP-CALC
f musí být o vymazáno.
#02,výmaz
#38,konec výpočtu
Kalkulátorový doplněk, který byl uschován na
HL
zásobníku je obnoven v zrcadlovém HL.
h) Nyní může být číslo vytištěno. Nejdříve bude do C uložen počet tištěných číslic, mimo
závěrečných nul, a B bude obsahovat počet číslic před desetinnou tečkou.
2F46
PF-NOT-E
LD
LD
LD
CP
JR
CP
JR
AND
CALL
BC,(#5CAB) (mem-5-1st) Čítače jsou nastaveny.
HL,#5CA1
Adresa první číslice.
A,B
Jestliže je více než 9 nebo méně než -4
#09
číslic před desetinnou tečkou,
C,#2F46,PF-NOT-E
je použit formát E.
#FC
Měně než -4 před desetinnou tečkou
C,#2F6C,PF-E-FRMT
znamená více než čtyři nuly za desetinou tečkou.
A
Jestliže nejsou žádná čísla před desetinnou tečkou,
Z,#15EF,OUT-CODE
vytiskni počáteční nulu.
Další vstupní bod se používá k vytištění čísla ve formátu E.
2F4A
PF-E-SBRN
2F52
PF-OUT-LP
2F59
PF-OUT-DT
2F5E
PF-DC-OUT
2F64
PF-DEC-0S
2F6C
PF-E-FRMT
XOR
SUB
JR
LD
JR
LD
AND
JR
LD
INC
DEC
CALL
DJNZ
LD
AND
RET
INC
LD
RST
LD
DJNZ
LD
JR
LD
DEC
LD
CALL
LD
RST
LD
LD
AND
A
B
M,2F52,PF-OUT-LP
B,A
#2F5E,PF-DC-OUT
A,C
A
Z,#2F59,PF-OUT-DT
A,(HL)
HL
C
#15EF,OUT-CODE
#2F52,PF-OUT-LP
A,C
A
Z
B
A,#2E
#10,PRINT-A-1
A,#30
#2F64,PF-DEC-0S
B,C
#2F52,PF-OUT-LP
D,B
D
B,#01
#2F4A,PF-E-SBRN
A,#45
#10,PRINT-A-1
C,D
A,C
A
Nastav A na nulu.
Odečti B. Minus znamená, že existují číslice
před desetinnou tečkou, a proto je vytiskni.
A je nyní použito jako čítač.
Skoč dopředu k vytištění části za desetinnou tečkou.
Kopíruj počet číslic, které mají být vytištěny, do A.
Pokud A=0, pak ještě existují závěrečné nuly, které
je třeba vytisknout (skoč neboť B je nenulové).
Vyzvedni číslici z tiskového bafru.
Ukazuj na další číslici.
Dekrementuj počet o jednu.
Vytiskni příslušnou číslici.
Skákej zpět,dokud B není nulové.
Je třeba vytisknout desetinnou tečku.
Pokud ovšem C není nulové.
V tom případě se vrať, neboť je všechno hotovo.
Přičti jedničku do B (toto přičte desetinnou tečku).
Dej kód pro "." do A.
Vytiskni tečku.
Vlož kód pro nulu.
Skoč zpět k vytištění všech potřebných nul.
Nastav čítač pro všechny zbývající číslice.
Proveď jejich vytištění.
Počet číslic je kopírován do D a
okamžitě zmenšen, aby byl dán i exponent.
Je zapotřebí jedna číslice před des. tečkou pro E formát
Celá část čísla před E je nyní vytištěna.
Vlož kód pro E a
vytiskni ho.
Exponent do C pro vytištěni a
do A pro otestování.
Je testováno znaménko a
Komentovaný výpis paměti ROM
177
2F83
2F85
PF-E-POS
PF-E-SIGN
JP
NEG
LD
LD
JR
LD
RST
LD
JP
P,#2F83,PF-E-POS
C,A
A,#2D
#2F85,PF-E-SIGN
A,#2B
#10,PRINT-A-1
B,#00
#1A1B,OUT-NUM
Je-li kladné, skoč.
Jinak neguj A.
Kopíruj A zpět do C pro tisk.
Vlož kód pro mínus a
vytiskni znaménko.
Vlož kód pro "+".
Nyní vytiskni znaménko ("+" nebo "-")
BC obsahuje exponent;
Vytiskni ho.
PODPROGRAM "CA=10*A+C"
Tento program je volán podprogramem PRINT-FP k vynásobení každého bajtu D',E',D a E deseti tak,
že vrací celočíselnou část výsledku v registru C. Na vstupu registr A obsahuje bajt, který má být
násoben deseti a registr C obsahuje CY z předchozího bajtu. Při návratu obsahuje A výsledný bajt a v
registru C je logická hodnota CY flag pro další bajt.
2F8B
CA=10*A+C
PUSH
LD
LD
LD
LD
ADD
ADD
ADD
ADD
LD
ADD
LD
LD
POP
RET
DE
L,A
H,#00
E,L
D,H
HL,HL
HL,HL
HL,DE
HL,HL
E,C
HL,DE
C,H
A,L
DE
Uschovej kterýkoliv pár DE (může to být D'E'nebo DE).
Kopíruj násobence do HL.
Okopíruj jej také
do DE.
Dvakrát zdvoj HL.
Přičti DE (což už 5*A) a
nakonec zdvoj HL (konečně 10*a).
Kopíruj C do DE (D je nulové) pro sčítání.
Nyní se HL rovné 10*A+C.
H je kopírováno do C a
L je kopírováno do A, čímž je úkol hotov.
Obnov DE a vrať se.
PODPROGRAM "PŘÍPRAVY NA SČÍTANÍ"
Tento podprogram je první ze čtyř podprogramů používaných hlavními aritmetickými
pro: odčítání, sčítání, násobení a dělení. Podprogram připraví FP-ČÍSLO pro sčítání tím,
jeho znaménkový bit skutečným číselným bitem logické úrovně 1 a provede negaci čísla
komplementací) je-li záporné. Exponent se vrací v registru A a první bajt je nastaven
kladné číslo a #FF pro záporné číslo.
2F9B
PREP-ADD
2FAF
NEG-BYTE
178
LD
LD
AND
RET
INC
BIT
SET
DEC
RET
PUSH
LD
ADD
LD
LD
SCF
DEC
LD
CPL
A,(HL)
(HL),#00
A
Z
HL
7,(HL)
7,(HL)
HL
Z
BC
BC,#0005
HL,BC
B,C
C,A
HL
A,(HL)
podprogramy
že nahradí
(dvojkovou
na #00 pro
Převeď exponent do A.
Předpokládej kladné číslo.
Je-li číslo nulové
je příprava skončena.
Nyní ukazuj na znaménkový bajt.
Nastav Z flag pro pozitivní číslo.
Obnov skutečný číselný bit 7.
Ukazuj znovu na první bajt.
Kladná čísla jsou o.k., ale záporná se musí invertovat.
Uschovej jakýkoliv dřívější doplněk.
Bude zpracováno pět bajtů.
Ukazuj jedno místo za poslední bajt.
Převed 5 do B.
Uschovej exponent v C.
Nastav CY=1.
Ukazuj postupně na všechny bajty.
Vyzvedni každý bajt.
Jedničkový doplněk bajtu.
Komentovaný výpis paměti ROM
ADC
LD
DJNZ
LD
POP
RET
A,#00
(HL),A
#2FAF,NEG-BYTE
A,C
BC
Přičti CY pro negaci.
Obnov bajty.
Smyčka proběhne 5-krát.
Obnov exponent v A.
Obnov jakékoliv dřívější exponenty.
Hotovo.
PODPROGRAM "FETCH TWO NUMBERS"
Podprogram je volán z programů ADDITION MULTIPLICATION a DIVISI0N k vyzvednutí dvou čísel ze
zásobníku kalkulátoru a jejich uložení do registrů včetně zrcadlových. Na vstupu ukazuje HL na první
bajt prvého čísla a DE ukazuje na první bajt druhého čísla. Pří násobení nebo dělení je znaménko
výsledku umístěno v druhém bajtu prvního čísla.
2FBA
FETCH-TWO
PUSH
PUSH
HL
AF
Uschovej HL.
Uschovej AF.
Pět bajtů prvního čísla bude:
M1, M2, M3, M4 a M5.
LD
INC
LD
LD
INC
LD
LD
PUSH
INC
LD
INC
LD
EX
LD
LD
PUSH
INC
LD
INC
LD
PUSH
EXX
POP
POP
POP
EXX
INC
LD
INC
LD
POP
POP
RET
C,(HL)
HL
B,(HL)
(HL),A
HL
A,C
C,(HL)
BC
HL
C,(HL)
HL
B,(HL)
DE,HL
D,A
E,(HL)
DE
HL
D,(HL)
HL
E,(HL)
DE
DE
HL
BC
HL
D,(HL)
HL
E,(HL)
AF
HL
Pět bajtů druhého čísla bude:
N1, N2, N3, N4 a N5.
M1 do C.
Další.
M2 do B.
Kopíruj znaménko výsledku do (HL).
Další.
M1 do A.
M3 do C.
Uschovej M2 a M3 na zásobník.
Další.
M4 do C.
Další.
M5 do B.
HL nyní ukazuje na N1.
M1 do D.
N1 do E.
Uschovej M1 a N1 na zásobník.
Další.
N2 do D.
Další.
N3 do E.
Uschovej N2 a N3 na zásobník.
Přepni na zrcadlové registry.
N2 do D' N3 do E'
M1 do H' N1 do L'
M2 do B' M3 do C'
Přepni na původní registry.
Další.
N4 do D.
Další.
N5 do E.
Obnov AF.
Obnov HL.
Vrať se.
Shrnutí: M1 - M5 jsou v H',B',C',C,B
N1 - N5 jsou v L',D',E',D,E
HL ukazuje na první bajt prvního čísla.
Komentovaný výpis paměti ROM
179
PODPROGRAM "SHIFTOVANÝ SČÍTANEC"
Tento podprogram posunuje FP-číslo až o 32 míst doprava, čímž ho správně nastaví do pozice
potřebné pro sčítání. Číslo s menším exponentem již bylo takto ošetřeno před zavoláním tohoto
podprogramu. Jakékoliv přečtení doprava (do CY) je přičteno zpět k číslu. Je-li rozdíl exponentů vetší
než 32, nebo CY přetéká na začátek čísla, je toto číslo nastaveno na nulu tak, aby sčítání nezměnilo
druhého sčítance.
2FDD
SHIFT-FP
2FE5
ONE-SHIFT
2FF9
ADDEND-0
2FFB
ZEROS-4/5
AND
RET
CP
JR
PUSH
LD
EXX
SRA
RR
RR
EXX
RR
RR
DJNZ
POP
RET
CALL
RET
EXX
XOR
LD
LD
LD
EXX
LD
RET
A
Z
#21
NC,#2FF9,ADDEND-0
BC
B,A
L
D
E
D
E
#2FE5,ONE-SHIFT
BC
NC
#3004,ADD-BACK
NZ
A
L,#00
D,A
E,L
Při nulovém rozdílu exponentů
se vrať.
Je-li rozdíl exponentů větší než #20,
skoč dopředu.
Krátce uschovej BC.
Rozdíl exponentů do B jako čítač posunů.
Přepni zrcadlové registry.
Posuň aritmeticky doprava L' a zachovej znaménkový bit.
Rotuj doprava s CY
registry D',E'
a dále D a E.
Tímto se všech pět bajtů čísla posune B-krát doprava.
Skákej zpět do vynulování B.
Obnov původní BC.
Hotovo, nedošlo-li k přetečení.
Přičti zpět CY.
Vrať se, pokud CY nepřepadlo hned zpět.
Přepni zrcadlové registry.
Vynuluj A.
Nastav sčítance na nulu v
D’,E‘,D a E včetně znaménkového bajtu L'.
Při zavolání z #3160 se vynulují
pouze čtyři bajty.
DE,#0000
PODPROGRAM "ADD BACK" (=ZPĚTNÉ PŘIČTENÍ)
Podprogram přičítá zpět k číslu každé CY, které přeteklo doprava. V extrémním případě se CY
vrací nalevo do čísla. Pokud je podprogram volán během sčítání, znamená tento extrém, že mantisa 0.5
byla posunuta o 32 míst doprava a sčítanec bude nastaven na nulu. Při zavolání z podprogramu
MULTIPLICAT10N znamená tento extrém, že exponent musí být inkrementován, což může způsobit přetečení.
3004
300D
180
ADD-BACK
ALL-ADDED
INC
RET
INC
RET
EXX
INC
JR
INC
EXX
RET
E
NZ
D
NZ
E
NZ,#300D,ALL-ADDED
D
Přičti CY k poslednímu bajtu.
Vrať se, nedošlo-li k přetečení doleva.
Pokračuj na další bajt.
Vrať se, nedošlo-li k přetečení doleva.
Pokračuj na další bajt.
Také jej inkrementuj.
Skoč nedošlo-li k přetečení doleva.
Inkrementuj poslední bajt.
Obnov hlavní registry.
Vrať se.
Komentovaný výpis paměti ROM
OPERACE SUBTRACTION (=ODEČÍTÁNÍ)
Doplněk: #03 "subtract"
Tento podprogram jednoduše mění znaménko menšitele a pokračuje dále do ADDITION. Povšimněte si,
že HL ukazuje na menšence a DE na menšitele.
300F
SUBTRACT
EX
CALL
EX
DE,HL
#346E,NEGATE
DE,HL
Zaměň ukazatele.
Změň znaménko menšitele.
Zaměň ukazatele zpět a pokračuj do ADDITION.
OPERACE ADDITION (=SČÍTÁNÍ)
Doplněk: #OF "addition"
První ze tří hlavních aritmetických podpogramů provádí sčítání dvou čísel v FP formě, každé s
čtyřbajtovou adresou a jednobajtovým exponentem. V těchto třech podprogramech jsou dvě čísla na
vrcholku zásobníku kalkulátoru sečtena, násobena nebo dělena. Výsledkem je pak jedno číslo na vrcholku
zásobníku kalkulátoru, čili "poslední hodnota". HL ukazuje na druhé číslo odshora, což je buďto
sčítanec, násobitel nebo dělenec. DE ukazuje na číslo na vrcholu zásobníku, což je sčítanec, násobenec
nebo dělitel. Po ukončení podprogramu HL ukazuje na výsledek, což je poslední hodnota, jejíž hodnota
může být považována za STKEND-5. Ale podprogram sčítání nejdříve testuje, zda následující dvě sčítaná
čísla jsou "malá celá číslice". Je-li tomu tak, je jednoduše sečteno HL a BC, a výsledek je uložen na
zásobník. Před nebo po sčítání není prováděna dvojková komplementace, neboť čísla, která tuto
komplementaci vyžadují, už jsou uložena na zásobníku v potřebném tvaru a připravená ke sčítání.
3014
ADDITION
LD
OR
JR
PUSH
INC
PUSH
INC
LD
INC
LD
INC
INC
INC
LD
INC
LD
INC
LD
POP
EX
ADD
EX
ADC
RRCA
ADC
JR
SBC
LD
INC
LD
INC
LD
DEC
DEC
DEC
A,(DE)
(HL)
NZ,#303E,FULL-ADDN
DE
HL
HL
HL
E,(HL)
HL
D,(HL)
HL
HL
HL
A,(HL)
HL
C,(HL)
HL
B,(HL)
HL
DE,HL
HL,BC
DE,HL
A,(HL)
Nejsou-li oba první bajty
sčítaných čísel nulové,
skoč na plné sčítání.
Uschovej ukazatel na druhé číslo.
Ukazuj na druhý bajt prvního čísla a
uschovej i tento ukazatel.
Ukazuj na méně významný bajt.
Vyzvedni ho do E a
A,#00
NZ,#303C,ADDN-OFLW
A,A
(HL),A
HL
(HL),E
HL
(HL),D
HL
HL
HL
Nenulové A indikuje přetečení.
Obnov ukazatele proveď plné sečtení.
Nastav správný znaménkový bajt pro výsledek.
Ulož jej do zásobníku.
Ukazuj na další místo.
Ulož nižší a
Vyzvedni významější bajt.
Posuň se na další bajt druhého čísla
Vyzvedni ho do A (znaménkový bajt).
Vyzvedni méně a
více významné bajty.
Vyzvedni ukazatel na znaménkový bajt prvního čísla.
Vlož jej do DE a číslo do HL.
Proveď sečtení s výsledkem v HL.
Výsledek do DE a adresa znaménkového bajtu do HL.
Přičti znaménkové bajty a CY do registru A.
vyšší bajt výsledku.
Přesuň ukazatel zpět na pozici prvního bajtu.
Komentovaný výpis paměti ROM
181
POP
RET
DE
Obnov STKEND do registru DE
Hotovo.
Poznámka: Povšimněte si, že číslo -65536 zde může nabýt tvaru 00 FF 00 00 00 jako výsledek
sčítání dvou menších záporných celých čísel, např: -65000-536 je jednoduše uložen v této formě, což je
chyba. Systém SPECTRA nemůže zpracovat toto číslo. Většina funkcí je považuje za nulu a číslo je
vypsáno jako -1E-38 nebo-li jako -O v tomto nevhodném formátu.
303C
ADDN-OFLW
303E
FULL-ADDN
DEC
POP
CALL
HL
DE
#3293,RE-ST-TWO
Obnov ukazatel na první číslo.
Obnov ukazatel na druhé číslo.
Proveď opětovné uložení obou čísel na zásobník.
Podprogram "plného sčítání" nejprve volá PRED-ADD pro každé číslo, potom vezme dvě čísla ze
zásobníku kalkulátoru a uloží číslo s menším exponentem na pozici sčítance, dále volá SHIFT-FP k
posunutí sčítance až o 32 míst doprava pro nastavení správné pozice ke sčítání. Vlastní součet
proběhne v několika bajtech a při přetečení je proveden jednoduchý posun. Výsledek je dvojkově
komplementován při záporném čísle a v případě, že nebylo hlášeno aritmetické přeplnění, jinak
podprogram pokračuje do TEST-NORM, aby byl normalizován výsledek před jeho uložením na zásobník se
správným znaménkovým bitem vloženým do druhého bajtu.
3055
182
SHIFT-LEN
EXX
PUSH
EXX
PUSH
PUSH
CALL
LD
EX
CALL
LD
CP
JR
LD
LD
EX
PUSH
SUB
CALL
CALL
POP
POP
LD
PUSH
LD
LD
ADD
EXX
EX
ADC
EX
LD
ADC
LD
RRA
XOR
EXX
EX
POP
HL
DE
HL
#2F9B,PREP-ADD
B,A
DE,HL
#2F9B,PREP-ADD
C,A
B
NC,#3055,SHIFT-LEN
A,B
B,C
DE,HL
AF
B
#2FBA,FETCH-TWO
#2FDD,SHIFT-FP
AF
HL
(HL),A
HL
L,B
H,C
HL,DE
DE,HL
HL,BC
DE,HL
A,H
A,L
L,A
Zaměň registry.
Uschovej adresu dalšího literálu.
Zaměň registry.
Uschovej ukazatel na 2.sčítanec.
Uschovej ukazatel na 1.sčítanec.
Připrav 1.sčítanec
a uschovej jeho exponent v B.
Zaměň ukazatele.
Připrav 2.sčítanec
a uschovej jeho exponent v C.
Jestliže první exponent je menší
ponech první číslo na pozici 2.sčítance, jinak
zaměň exponenty a
ukazatele.
Uschovej větší z exponentů v A.
Rozdíl mezi exponenty je délkou pro posun doprava.
Vyzvedni dvě čísla ze zásobníku.
Posuň 2.sčítanec doprava.
Obnov vetší exponent a
HL ukazuje na výsledek.
Ulož exponent výsledku.
Opět uschovej ukazatel.
M4 do H a
M5 do L (viz FETCH-TWO).
Přičti dva pravé bajty
N2 do H' a N3 do L' (viz FETCH-TWO).
L
Přičti levé bajty plus CY.
Výsledek zpět do D',E'.
Sečti H'L' a CY: tento mechanismus zajistí,
že bude zavolán jeden posuv doprava
pokud součet kladných čísel způsobil přetečení doleva,
nebo součet dvou záporných čísel nezpůsobil přetečení
doleva.
DE,HL
HL
Výsledek jde nyní do DE a DE'.
Vyzvedni ukazatel na exponent.
Komentovaný výpis paměti ROM
307C
TEST-NEG
309F
ADD-REP-6
30A3
END-COMPL
30A5
GO-NC-MLT
RRA
JR
LD
CALL
INC
JR
EXX
LD
AND
EXX
INC
LD
DEC
JR
LD
NEG
CCF
LD
LD
CPL
ADC
LD
EXX
LD
CPL
ADC
LD
LD
CPL
ADC
JR
RRA
EXX
INC
JP
EXX
LD
EXX
XOR
JP
NC,#307C,TEST-NEG
A,#01
#2FDD,SHIFT-FP
(HL)
Z,#309F,ADD-REP-6
A,L
#80
HL
(HL),A
HL
Z,#30A5,GO-NC-MLT
A,E
Test na posun (H'L' byly #00 pro kladná čísla a #FF pro
záporná čísla).
A je čítač jednoho posunu doprava.
Zavolej posun.
Přičti jedničku k exponentu; toto může způsobit
aritmetické přetečení.
Test na negativní výsledek.
Vyzvedni znaménkový bit z L' do A (což správně indikuje
znaménko výsledku).
(HL)
Z,#31AD,REPORT-6
Ulož jej do druhého bajtu výsledku na zásobníku
kalkulátoru.
Byl-li nulový neprováděj dvojkový doplněk výsledku.
Vyzvedni 1.bajt.
Neguj jej.
Komplementuj CY pro pokračující negaci
a uschovej tento bajt.
Vezmi další bajt a
proveď dvojkový doplněk.
Přičti CY pro negaci.
Uschovej tento bajt.
Vyzvedni další bajt do A
z E.
Proveď komplementaci.
Přičti CY pro negaci.
Uschovej bajt.
Vyzvedni poslední bajt a
komplementuj ho.
Přičti CY pro negaci.
Pokud nedošlo k přetečení, je hotovo.
Dej 0.5 do mantisy
a přičti jedničku k exponentu (to je třeba tehdy,
je-li výsledek součtu dvou čísel přesný násobek dvou).
Ohlaš chybu, je-li třeba.
D,A
Uschovej poslední bajt.
A
#3155,TEST-NORM
Vynuluj CY.
Vrať se přes TEST-NORM.
E,A
A,D
A,#00
D,A
A,E
A,#00
E,A
A,D
A,#00
NC,#30A3,END-COMPL
PODPROGRAM "HL=HL*DE"
Podprogram je volán podprogramem "GET-HL*DE" a MULTIPLICATION, aby provedl
násobení. Každé přetečení na 16.bitu se zpracuje po návratu z tohoto podprogramu.
30A9
HL=HL*DE
30B1
HL-LOOP
PUSH
LD
LD
LD
LD
ADD
JR
RL
RLA
JR
ADD
JR
BC
B,#10
A,H
C,L
HL,#0000
HL,HL
C,#30BE,HL-END
C
NC,#30BC,HL-AGAIN
HL,DE
C,#30BE,HL-END
16-ti
bitové
Uschovej BC.
Jedná se o 16-bitové násobení.
A obsahuje vyšší bajt.
C obsahuje nižší bajt.
Nastav výsledek na nulu.
Zdvojení výsledku.
Skok při přetečení.
Rotuj bit 7 registru C do CY.
Rotuj CY do bitu 0 registru A a bit 7 do CY.
Při nulovém CY skoč.
Jinak přičti DE a
skoč při přetečení.
Komentovaný výpis paměti ROM
183
30BC
30BE
HL-AGAIN
HL-END
DJNZ #30B1,HL-LOOP
POP BC
RET
Dokud neproběhlo 16 průchodů, pokračuj.
Obnov BC.
Hotovo.
PODPROGRAM PŘÍPRAVY NA NÁSOBENI NEBO DĚLENÍ
Tento podprogram připravuje FP-číslo pro násobení nebo dělení a vrací CY=1 bylo-li číslo
nulové. Znaménko výsledku je v registru A a znaménkový bit čísla je nahrazen skutečným numerickým
bitem s hodnotou 1.
30C0
PREP-M/D
CALL
RET
INC
XOR
SET
DEC
RET
#34E9,TEST-ZERO
C
HL
(HL)
7,(HL)
HL
Jestli-že číslo je nulové,
vrať se s CY=1.
Ukazuj na znaménkový bajt,
vyzvedni znaménko výsledku do A a současně nuluj CY.
Nastav pravdivý numerický bit.
Opět ukazuj na exponent.
Vrať se s nulovým CY.
OPERACE NÁSOBENÍ
Doplněk: #04 "multiply"
Tento podprogram nejprve zjistí, zda násobená čísla jsou malá celá čísla, a je-li to pravda,
použije se k vyzvednutí těchto čísel ze zásobníku podprogram INT-FETCH. Pak se provede HL=HL*DE a
INT-STORE k uložení výsledku na zásobník. Každé přetečení při tomto "krátkém" násobení (tedy pokud již
výsledek není "malé" celé číslo) způsobí skok na násobení v pětibajtové FP formě.
30CA
MULTIPLY
30E5
30EA
MULT-RSLT
30EF
30F0
MULT-OFLW
MULT-LONG
LD
OR
JR
PUSH
PUSH
PUSH
CALL
EX
EX
LD
CALL
LD
XOR
LD
POP
CALL
EX
POP
JR
LD
OR
JR
LD
CALL
POP
RET
POP
CALL
A,(DE)
(HL)
NZ,#30F0,MULT-LONG
DE
HL
DE
#2D7F,INT-FETCH
DE,HL
(SP),HL
B,C
#2D7F,INT-FETCH
A,B
C
C,A
HL
#30A9,HL=HL*DE
DE,HL
HL
C,#30EF,MULT-OFLW
A,D
E
NZ,#30EA,MULT-RSLT
C,A
#2D8E,INT-STORE
DE
DE
#3293,RE-ST-TWO
Nejsou-li první bajty obou čísel nulové,
skoč na "dlouhé" násobení.
Uschovej ukazatel na druhé,
první a
opět na druhé číslo.
Vyzvedni znaménko v registru C a číslo v registru DE.
Číslo do HL a
hned na zásobník, druhý ukazatel do HL.
Uschovej první znaménko v B.
Vyzvedni druhé znaménko do C a číslo v registru DE.
Vytvoř znaménko výsledku v registru A.
Ulož je do C.
Obnov první číslo v HL.
Proveď skutečné násobení.
Uschovej výsledek v DE.
Obnov ukazatel na první číslo.
Pokud došlo k přetečení, skoč na plné násobení.
Těchto 5 bajtů zajistí, že 00 FF 00 00 00
je nahrazeno nulou (nebylo by třeba, pokud by toto číslo
bylo vyloučeno ze systému).
Nyní ulož výsledek na zásobník.
Obnov STKEND do DE.
Hotovo.
Obnov ukazatele na druhé číslo.
Proveď "znovu uložení" čísel v plné FP formě (5 bajtů).
Podprogram "plného násobení připraví první číslo pro násobení voláním PREP-M/D, s návratem v
případě nuly. Jinak se také připraví druhé číslo voláním PREP-M/D a jestliže je nulové, podprogram
nastaví hodnotu výsledku na nulu. Dále se vyzvednou dvě čísla ze zásobníku kalkulátoru a jejich
184
Komentovaný výpis paměti ROM
mantisy jsou vynásobeny obvyklým způsobem, tj. rotací prvního čísla (což je násobitel) doprava a
přičtením druhého čísla (což je násobenec) k výsledku v případě, že bit násobitele byl nastaven. Potom
jsou sečteny exponenty a testuje se přetečení a podtečení (což dává výsledek nula). Na závěr je
výsledek normalizován a uložen na zásobník kalkulátoru se správným znaménkovým bitem v druhém bajtu.
XOR
CALL
RET
EXX
PUSH
EXX
PUSH
EX
CALL
EX
JR
PUSH
CALL
LD
AND
SBC
EXX
PUSH
SBC
EXX
LD
JR
A
#30C0,PREP-M/D
C
HL
DE
DE,HL
#30C0,PREP-M/D
DE,HL
C,#315D,ZERO-RSLT
HL
#2FBA,FETCH-TWO
A,B
A
HL,HL
HL
HL,HL
B,#21
#3125,STRT-MLT
A=0, takže znaménko prvního čísla jde do A.
Připrav první číslo a jestliže je nulové,
vrať se (výsledek je již nula).
Zaměň registry.
Uschovej adresu dalšího literálu.
Zaměň registry.
Uschovej ukazatel na násobenec.
Zaměň ukazatele.
Připrav druhé číslo
a opět zaměň ukazatele.
Byl-li výsledek nula, skoč dopředu.
Uschovej ukazatel na výsledek.
Vyzvedni dvě čísla ze zásobníku.
M5 do A (viz FETCH-TWO).
Příprava na odečítání.
Nuluj HL pro výsledek.
Zaměň registry.
Uschovej M1 a N1 (viz FETCH-TWO).
Nuluj H'L' pro výsledek.
Zaměň registry.
B obsahuje #21 pro 33 posunů.
Proveď smyčku.
Zde začíná smyčka pro násobitel.
3114
311B
3125
MLT-LOOP
NO-ADD
STRT-MLT
JR
ADD
EXX
ADC
EXX
EXX
RR
RR
EXX
RR
RR
EXX
RR
RR
EXX
RR
RRA
DJNZ
EX
EXX
EX
EXX
NC,#311B,NO-ADD
HL,DE
Nedošlo-li k přetečení, skoč na NO-ADD.
Jinak přičti násobenec D'E',DE (FETCH-TWO) do výsledku
který je vytvářen v H'L' a HL.
HL,DE
H
L
Ať už byl nebo nebyl násobenec přičten,
posuň výsledek v H'L'HL doprava tak, že každý
bit, který ukápne do CY je okamžitě přijat
dalším bajtem a
H
L
posun pokračuje do B'C' a CA (viz FETCH-TWO a dále).
B
C
C
#3114,MLT-LOOP
DE,HL
Poslední bit, který zůstane v CY vyvolá další přičtení
násobence k výsledku.
Proveď 33-krát tuto smyčku čímž se posoudí všechny bity.
Přenes výsledek z
DE,HL
H'L'HL do D'E'DE.
Sečti oba exponenty.
POP
POP
LD
BC
HL
A,B
Obnov exponenty M1 a N1.
Obnov ukazatel na exponentový bajt.
Vytvoř součet dvou exponentů v A a
Komentovaný výpis paměti ROM
185
313B
MAKE-EXPT
ADD
JR
AND
DEC
CCF
A,C
NZ,#313B,MAKE-EXPT
A
A
oprav CY tak,
že nebyl-li součet nulový, nech CY být.
Jinak CY vynuluj.
Připrav se na
zvětšení exponentu o #80.
Zbytek podprogramu je společný jak pro násobení tak pro dělení.
313D
3146
3151
DIVN-EXPT
OFLW-1-CLR
OFLW-2-CLR
Zbytek
podprogramy.
RLA
CCF
RRA
JP
JR
AND
INC
JR
JR
EXX
BIT
EXX
JR
LD
EXX
LD
EXX
tohoto
3155
TEST-NORM
3159
NEAR-ZERO
315D
315E
ZERO-RSLT
SKIP-ZERO
JR
LD
AND
LD
JR
XOR
EXX
AND
CALL
RLCA
LD
JR
INC
LD
DEC
JR
P,#3146,OFLW-1-CLR
NC,#31AD,REPORT-6
A
A
NZ,#3151,OFLW-2-CLR
C,#3151,OFLW-2-CLR
7,D
NZ,#31AD,REPORT-6
(HL),A
A,B
podprogramu
ošetřuje
Těchto pár bajtů rafinovaně vytváří správný exponentový
bajt. Rotací registru A doleva a
doprava vznikne exponent (skutečný exponent + #80) v A.
Je-li P flag nulový není třeba hlásit žádnou chybu.
Ohlaš přetečení, jestliže CY=0.
Vynuluj CY.
Exponentový bajt je kompletní.
Je-li A nulové, je potřebný další test na přetečení.
Je-li CY=0 a výsledek je již v norm. formě (bit7 D' je
nastaven), pak došlo k přet., které je nutno ohlásit
Ale když bit 7 registru D'=0,
pak je výsledek v rozsahu, tj. pod hodnotou 2^127.
Ulož exponentový bajt.
Předej pátý bajt výsledku pro normal. sekvenci, tedy
přetečení z L do B'.
normalizaci
a
je
společný
pro
všechny
aritmetické
NC,#316C,NORMALISE
A,(HL)
A
A,#80
Z,#315E,SKIP-ZERO
A
Je-li CY=0, normalizuj.
Jinak ošetři podtečení (nulový výsledek) nebo
téměř podtečení (výsledek 2^-128).
Vrať exponent do A a testuj, je-li
registr A nulový (pro případ 2^-128) Je-li to pravda,
vytvoř 2^-128 v případě normálního čísla, nebo
D
#2FFB,ZEROS-4/5
produkuj nuly.
Exponent musí byt nulový (pro nulu) nebo 1 (pro 2^-128).
(HL),A
C,#3195,OFLOW-CLR
HL
(HL),A
HL
#3195,OFLOW-CLR
Obnov exponentový bajt.
Skoč v případě 2^-128.
Jinak do druhého bajtu výsledku na kalkulátorovém
zásobníku vlož nulu
a převeď výsledek.
Aktuální normalizační operace.
316C
316E
186
NORMALISE
SHIFT-ONE
LD
EXX
BIT
EXX
JR
RLCA
RL
RL
EXX
RL
B,#20
7,D
NZ,#3186,NORML-NOW
E
D
E
Normalizuj výsledek až 32 posuny doleva v D'E'D E
přidáním A dokud
bit 7 v registru D' není nastaven na nulu.
Registr A obsahuje nulu po sčítání a proto
nedojde k žádné změně přesnosti.
A obsahuje 5.bajt z registru B'
po násobení nebo dělení,
ale protože se bere v úvahu vždy jen 32 bitů,
nedojde k žádné změně přesnosti.
Povšimněte si, že
Komentovaný výpis paměti ROM
RL
EXX
DEC
JR
DJNZ
JR
D
(HL)
Z,#3159,NEAR-ZERO
#316E,SHIFT-ONE
#315D,ZERO-RSLT
A je rotováno kruhově s odbočkou při přetečení ....
eventuálně náhodný proces.
Při každém posunu je dekrementován exponent.
Je-li exponent=0, je 2^-129 zaokrouhleno na 2^-128.
32-krát do smyčky.
Nebyl-li bit 7 registru D' nikdy 1 je celý výsledek nula.
Ukonči normalizaci posouzením CY.
3186
NORML-NOW
RLA
JR
CALL
JR
EXX
LD
EXX
INC
JR
NC,#3195,OFLW-CLR
#3004,ADD-BACK
NZ,#3195,OFLW-CLR
Po normalizaci přičti zpět jakékoliv závěrečné CY,
které vstoupilo do A.
Nepřetéká-li CY hned zpět,
skoč dopředu.
V opačném případě nastav mantisu na 0.5
D,#80
(HL)
Z,#31AD,REPORT-6
a inkrementuj exponent.
Tato akce může vést k aritmetickému přetečení.
Závěrečná část tohoto podprogramu slouží k předání výsledku do bajtů rezervovaných pro výsledek
na zásobníku kalkulátoru a k opětovnému nastavení ukazatelů.
3195
31AD
OFLOW-CLR
REPORT-6
PUSH
INC
EXX
PUSH
EXX
POP
LD
RLA
RL
RRA
LD
INC
LD
INC
LD
INC
LD
POP
POP
EXX
POP
EXX
RET
RST
DEFB
HL
HL
Uschovej ukazatel výsledku.
Ukazuj na znaménkový bajt výsledku.
Výsledek je přesunut z registrů D'E'D E
DE
BC
A,B
(HL)
(HL),A
HL
(HL),C
HL
(HL),D
HL
(HL),E
HL
DE
HL
#08,ERROR-1
#05
do BCDE a pak
do ACDE.
Znaménkový bit je vyzvednut ze svého předchozího uložení
a přenese na správnou pozici v bitu 7 1. bajtu mantisy.
Je vložen 1.bajt.
Další.
Je vložen 2.bajt.
Další.
Je vložen 3.bajt.
Další.
Je vložen 4.bajt.
Obnov ukazatel na výsledek.
Obnov ukazatel na druhé číslo.
Zaměň registry.
Obnov adresu dalšího literálu.
Zaměň registry.
Hotovo.
Ohlaš:
6-Number too big
OPERACE DĚLENÍ
Doplněk: #05 "division"
Tento podprogram nejprve připraví dělitel voláním PREP-M/D a hlásí aritmetické přeplnění, je-li
dělitel nulový, dále připraví dělenec opětovným voláním PREP-M/D, s návratem v případě nuly. Dále
vyzvedne dvě čísla ze zásobníku kalkulátoru a dělí jejich mantisy pomoci běžného dělení tj. zkušebním
odečtem dělitele od dělence a jejich obnovením při přetečení. Jinak se přičte jednička k podílu.
Maximální přesnost se dosahuje u čtyřbajtového dělení. Po odečtení exponentu se podprogram napojuje v
místě, které je společné pro dělení a násobení a je na adrese #313D DIVN-EXPT.
Komentovaný výpis paměti ROM
187
31AF
31D2
31DB
31E2
31F2
31F9
31FA
188
DIVISION
CALL
EX
XOR
CALL
JR
EX
CALL
RET
EXX
PUSH
EXX
PUSH
PUSH
CALL
EXX
PUSH
LD
LD
EXX
LD
LD
XOR
LD
JR
#3293,RE-ST-TWO
DE,HL
A
#30C0,PREP-M/D
C,#31AD,REPORT-6
DE,HL
#30C0,PREP-M/D
C
HL
DE
HL
#2FBA,FETCH-TWO
HL
H,B
L,C
H,C
L,B
A
B,#DF
#31E2,DIV-START
Zde začíná dělící smyčka.
DIV-LOOP
RLA
RL
C
EXX
RL
C
RL
B
EXX
DIV-34TH
ADD HL,HL
EXX
ADC HL,HL
EXX
JR
C,#31F2,SUBN-ONLY
DIV-START
SBC HL,DE
EXX
SBC HL,DE
EXX
JR
NC,#31F9,NO-RSTORE
ADD HL,DE
EXX
ADC HL,DE
EXX
AND A
JR
#31FA,COUNT-ONE
SUBN-ONLY
AND A
SBC HL,DE
EXX
SBC HL,DE
EXX
NO-RSTORE
SCF
COUNT-ONE
INC B
JP
M,#31D2,DIV-LOOP
PUSH AF
JR
Z,#31E2,DIV-START
Použij FP formy.
Zaměň ukazatele.
A je vynulováno a znaménko 1.čísla jde do A.
Připrav dělitele a ohlaš
aritmetické přeplnění v případě, že dělitel je nulový.
Zaměň ukazatele.
Připrav dělence a
je-li nulový, vrať se.
Zaměň registry.
Uschovej adresu dalšího literálu.
Zaměň registry.
Uschovej ukazatel na dělitel.
Uschovej ukazatel na dělenec.
Vyzvedni dvě čísla ze zásobníku.
Zaměň registry.
Uschovej H1 a N1 na zásobník.
Kopíruj čtyři bajty dělence z registrů B'C'C B
(tedy M2,M3,M4 a M5) do
registrů H'L'H L.
Nuluj registry A a CY.
B bude počítat od -33 do -1 dvojkové doplňky.
Skoč do dělící smyčky pro první zkušební odečet.
Posuň výsledek doleva v B'C'C A za pomoci CY.
Posuň zbytek dělence zprava doleva v H'L'HL
před dalším pokusným odečtem.
Jestliže bit přetekl do CY,
skoč dopředu.
Zkušební odečet dělitele v D'E'DE
od zbytku dělence v H'L'HL (je zajištěno CY=0 před prvním
odečtem, viz předchozí krok).
Nedošlo-li k přetečení, skoč dopředu.
Jinak obnov tj. přičti zpět dělitel
Protože dělitel nepasuje,
vynuluj CY, aby nebyl žádný bit pro podíl.
Skoč dopředu.
Proveď pouhé odečtení bez obnovení a
pokračuj na nastavení CY, protože ztracený bit dělence
musí být obnoven a
použit pro podíl.
Jednička pro podíl B'C'C A.
Inkrementace čítače pro každý průchod smyčkou,
které je provedena 32-krát pro všechny bity.
Uschovej každý 33.bit pro přesnost (aktuální CY).
Ještě jeden zkušební odečet pro každý 34.bit
Komentovaný výpis paměti ROM
Poznámka: Skok je proveden do špatného místa. 34.bit se nikdy nezíská pokud se nebude posouvat
dělenec. Proto například důležité výsledky jako 1/10 a 1/1000 nejsou zaokrouhleny tak, jak by měli
být. Zaokrouhlení se nikdy neprovede pokud záleží na 34.bitu. Skok měl být na #31DB DIV-34TH tedy bajt
#3200 měl, obsahovat hodnotu #DA místo hodnoty #E1.
LD
LD
EXX
LD
LD
POP
RR
POP
RR
EXX
POP
POP
LD
SUB
JP
E,A
D,C
Nyní přesuň čtyři bajty tvořící mantisu výsledku
z B'C'C A do D'E'D E.
E,C
D,B
AF
B
AF
B
Potom ulož 34. a 33. bit do B' aby
byly později při normalizaci vyzvednuty.
BC
HL
A,B
C
#313D,DIVN-EXPT
Obnov exponentové bajty M1 a N1.
Obnov ukazatel na výsledek.
Vlož do A rozdíl mezi dvěma exponentovými
bajty s nastavením CY v případě potřeby.
Výstup přes DIVN-EXPT.
ODŘÍZNUTÍ DESETINNÉ ČÁSTI ČÍSLA
Doplněk: #3A "truncate"
Podprogram vrací výsledek po odříznutí desetinné části čísla x jako poslední hodnotu na
zásobníku kalkulátoru. Například T(2.4)=2 a také T(-2.4)=-2. Podprogram se okamžitě vrací v tom
případě, kdy x je ve formě "malého" celého čísla. Nula je použita jako výsledek, jestliže exponentový
bajt je menší než #81 (neboť ABS x < 1). Jestliže x je "malé" celé číslo, nebo exponentový bajt je
větší než #AO, pak je x podprogramem vráceno ve své původní formě. V ostatních případech je nastaven
správný počet bajtů čísla x na nulu a v případe potřeby je další bajt rozdělen maskou.
3214
TRUNCATE
3221
T-GR-ZERO
LD
AND
RET
CP
JR
LD
LD
JR
CP
JR
A,(HL)
A
Z
#81
NC,#3221,T-GR-ZERO
(HL),#00
A,#20
#3272,NIL-BYTES
#91
NZ,#323F,T-SMALL
Vyzvedni exponentový bajt čísla x do registru A.
Je-li A nula,
vrať se, neboť x je již "malé" celé číslo.
Je-li exponent větší než #80,
skoč.
Jinak nastav exponent na nulu.
Ulož 32 do registru A.
Za pomoci NIL-BYTES vynuluj všechny bajty čísla x.
Jestliže se exponent nerovná #91,
skoč.
Dalších 26 bajtů je zde proto, aby otestovalo, zda x náhodou není rovno číslu -65536 (#: 91 80
00 00 00). V případě pozitivního výsledku porovnaní jsou tyto bajty přepsány na #: 00 FF 00 00 00. A
to je CHYBA! Jak již bylo řečeno okolo adresy #303B, není systém SPECTRA schopen takové číslo
zpracovat. Zde je vlastně provedeno INT(-65536) a jako výsledek je vytvořena hodnota -1. To je škoda,
protože kdyby se s číslem nic nedělalo, bylo by vše v perfektním pořádku. Jednoduchou nápravou by bylo
vynechání 28 bajtů od adresy #3223 do adresy #323E.
INC
INC
INC
LD
AND
DEC
OR
DEC
HL
HL
HL
A,#80
(HL)
HL
(HL)
HL
HL ukazuje na 4. bajt x kde končí 17 bitů celočíselné
časti čísla x za prvním bitem.
První bit je vyzvednut do registru A s použitím
masky #80.
Tento a předchozích 5 bitů je společně testováno na nulu.
HL ukazuje na druhý bajt x.
Komentovaný výpis paměti ROM
189
3233
T-FIRST
JR
LD
XOR
DEC
JR
LD
INC
LD
DEC
LD
JR
NZ,#3233,T-FIRST
A,#80
(HL)
HL
NZ,#326C,T-EXPNENT
(HL),A
HL
(HL),#FF
HL
A,#18
#3272,NIL-BYTES
Test končí, nebyla-li nalezena nula.
Jinak test na hodnotu -65536: sled čísel #:91 80 00 00 00
je ukončen a ponechá Z flag nastaven.
HL ukazuje na první bajt x.
Je-li Z flag nulový, provede se skok.
První bajt je nastaven na nulu a
HL ukazuje na druhý bajt.
Druhý bajt bude #FF a
HL opět ukazuje na první bajt.
Je vynulováno posledních 24 bitů
pomocí NIL-BYTES, se dokončí stvoření 00 FF 00 00 00.
Leží-li exponentový bajt čísla x v rozsahu #81 až #90 včetně, potom T(x) je "malým" celým
číslem a bude kompresováno do jednoho nebo dvou bajtů. ALe nejdříve se otestuje velikost x.
323F
T-SMALL
3252
T-NUMERIC
325E
T-TEST
3261
T-SHIFT
3267
T-STORE
JR
NC,#326D,X-LARGE
PUSH
CPL
ADD
INC
LD
INC
LD
DEC
DEC
LD
BIT
JR
DEC
SET
LD
SUB
ADD
JR
LD
LD
SUB
JR
LD
SRL
RR
DJNZ
CALL
POP
RET
DE
A,#91
HL
D,(HL)
HL
E,(HL)
HL
HL
C,#00
7,D
Z,#3252,T-NUMERIC
C
7,D
B,#08
B
A,B
C,#325E,T-TEST
E,D
D,#00
B
Z,#3267,T-STORE
B,A
D
E
#3261,T-SHIFT
#2D8E,INT-STORE
DE
Skoč s exponentovým bajtem #92 a více (bylo by lepší
testovat hodnotu#91).
Uschovej STKEND v DE.
Rozsah 129<=A<=144 je převeden na 126>=A>=111.
Rozsah je nyní 15>=A>=0.
HL ukazuje na druhý bajt a
ten je přenesen do D.
Třetí bajt do E.
HL opět ukazuje na první bajt.
Předpokládej kladné číslo.
Testuj záporné číslo (bit 7 registru D je 1)
Při kladném čísle skoč.
Změň znaménko.
Vlož skutečný numerický bit do registru D.
Testuj, zda A>=8 (jen jeden bajt), nebo je-li třeba dvou
bajtů.
Ponech A nezměněné.
Skoč, jsou-li potřeba dva bajty.
Dej jeden bajt do E
Nastav D na nulu.
Nyní 1<=A<=7 počítá potřebné posuny.
Není-li nutný posun skoč.
B bude počítat posuvy.
Posunuj B-krát doprava D a E.
aby vzniklo správné číslo.
Opakuj do vynulování B.
Uschovej výsledek na zásobník.
Obnov STKEND v DE.
Hotovo.
Zbývá posoudit velké hodnoty čísla x.
326C
326D
T-EXPNENT
X-LARGE
LD
SUB
RET
NEG
A,(HL)
#A0
P
Vyzvedni exponentový bajt čísla x do registru A.
Odečti 160=#A0 od exponentu.
Při plus se vrať - x má nevýznamnou celočíselnou část.
Jinak neguj zbytek, čímž získáš počet nulových bitů.
Zde budou vynulovány bity mantisy.
3272
190
NIL-BYTES
PUSH DE
EX
DE,HL
Uschovej aktuální hodnotu DE (STKEND).
HL ukazuje jedno místo za pátý bajt.
Komentovaný výpis paměti ROM
327E
BYTE-ZERO
3283
BITS-ZERO
328A
LESS-MASK
3290
IX-END
DEC
LD
SRL
SRL
SRL
JR
LD
DEC
DJNZ
AND
JR
LD
LD
SLA
DJNZ
AND
LD
EX
POP
RET
HL
B,A
B
B
B
Z,#3283,BITS-ZERO
(HL),#00
HL
#327E,BYTE-ZERO
#07
Z,#3290,IX-END
B,A
A,#FF
A
#328A,LESS-MASK
(HL)
(HL),A
DE,HL
DE
a následovně přímo na pátý bajt čísla x.
Vezmi do registru B počet bitů, které mají být
vynulovány, a vyděl jej osmi, abys získal počet bajtů,
kterých se to týká.
Jestliže výsledek je nulový,
skoč dopředu.
Nastav B bajtů na nulu.
Vezmi A (mod 8) - počet bitů, které mají být nulovány.
Ale v případě, že se nemá už nic dělat, skoč na konec.
B bude počítat bity.
Připrav masku.
Při každém průchodu smyčkou je zprava do A vsunuta nula,
čímž se vytváří správná maska.
Nepotřebné bity
jsou pomocí masky vynulovány.
Vrať ukazatel do HL.
Vrať STKEND do DE.
Hotovo.
PODPROGRAM "RE-STACK TWO"
Tento podprogram vytváří ze dvou "malých" celých čísel plnohodnotná čísla v FP formě. Toho je
dosaženo voláním následujícího podprogramu dvakrát.
3293
3296
RE-ST-TWO
RESTK-SUB
CALL #3269,RESTK-SUB
EX
DE,HL
Volej podprogram a pokračuj do něj jako druhé zavolání
Při každém volání zaměň ukazatele.
PODPROGRAM "RE-STACK"
Doplněk: #3D "re-stack"
Tento podprogram vyzvedne a opět uloží jedno číslo, které se ovšem změní z "malého" celého
čísla na číslo v plnohodnotném pětibajtovém FP vyjádření. Pro jedno číslo je používán programem
ARCTAN a přes kalkulátorový doplněk funkcemi EXP, LN a "get-argt".
3297
32B1
32B2
RE-STACK
RS-NRMLSE
RSTK-LOOP
LD
AND
RET
PUSH
CALL
XOR
INC
LD
DEC
LD
LD
LD
AND
JR
OR
LD
JR
LD
LD
LD
EX
DEC
A,(HL)
A
NZ
DE
#2D7F,INT-FETCH
A
HL
(HL),A
HL
(HL),A
B,#91
A,D
A
NZ,#32B1,RS-NRMLSE
E
B,D
Z,#32BD,RS-STORE
D,E
E,B
B,#89
DE,HL
B
Není-li první bajt nulový
vrať se neboť číslo určitě není "malé" celé číslo.
Uschovej ukazatel z DE.
Vyzvedni znaménko do C a číslo do DE.
Vyčisti registr A.
Ukazuj na 5.místo.
Nastav 5.bajt na nulu.
Ukazuj na 4.místo.
Nastav 4.bajt=0. Bajty 2 a 3 budou obsahovat mantisu.
Nastav B=145 pro exponent, tedy až šestnáct bitů čísla.
Jestliže je D nulové,
bude potřeba maximálně 8 bitů.
Je zapotřebí více než 8 bitů.
Je otestováno také E.
Nuluj B (=nulový exponent v případě, že E je také nula)
Je-li E skutečně nulové, skoč.
Přenes E do D (D bylo nulové, ale E ne).
Nastav E na nulu.
Dej do B exponent 137 - ne více než 8 bitů.
Ukazatel do DE, číslo do HL.
Dekrementuj exponent při každém posunu.
Komentovaný výpis paměti ROM
191
32BD
192
RS-STORE
ADD
JR
RRC
RR
RR
EX
DEC
LD
DEC
LD
DEC
LD
POP
RET
HL,HL
NC,#32B2,RSTK-LOOP
C
H
L
DE,HL
HL
(HL),E
HL
(HL),D
HL
(HL),B
DE
Posuň číslo doprava o jednu pozici.
Dokud CY=0, skákej zpět do smyčky.
Dej znaménkový bit do CY a
vlož jej na své místo do čísla,
které je právě posunuto o jedno místo.
Ukazatel na čtvrtý bajt zpět do HL.
Ukazuj na 3.místo.
Uschovej 3.bajt.
Ukazuj na 2.místo.
Uschovej 2.bajt.
Ukazuj na 1.místo.
Uschovej exponentový bajt.
Obnov původní ukazatel v DE.
Hotovo.
Komentovaný výpis paměti ROM
FLOATING POINT KALKULÁTOR
TABULKA KONSTANT
Tato první tabulka obsahuje pět užitečných a často používaných čísel: nula, jedna, polovina,
polovina PI a deset. Čísla jsou uložena ve staženém tvaru, který je expandován podprogramem STACK
LITERALS na požadovaný tvar floating-point (=FP tvar).
data
32C5
stk-zero
32C8
stk-one
32CC
stk-half
32CE
stk-pi/2
32D3
stk-ten
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
#00
#B0
#00
#40
#B0
#00
#01
#30
#00
#F1
#49
#0F
#DA
#A2
#40
#B0
#00
#0A
konstanta
expandovaný tvar
nula
00 00 00 00 00
jedna
00 00 01 00 00
polovina
80 00 00 00 00
polovina pi 81 49 0F DA A2
deset
00 00 0A 00 00
TABULKA ADRES
Druhá tabulka slouží k vyhledávání adres 66ti operačních podprogramů kalkulátoru. Doplňky,
které umožňují indexování v této tabulce jsou odvozeny bud z řídících kódů, použitých v podprogramu
SCANNING viz. #2734, nebo z literálů, které následují po instrukci RST #28.
doplněk
32D7
32D9
32DB
32DD
32DF
32E1
32E3
32E5
32E7
32E9
32EB
32ED
32EF
32F1
32F3
32F5
32F7
32F9
32FB
32FD
32FF
00
01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
0E
0F
10
11
12
13
14
název
adresa
skok-pravda
záměna
výmaz
odečtení
násobení
dělení
umocnění
číslo OR číslo
číslo AND číslo
číslo <= číslo
číslo >= číslo
číslo <> číslo
číslo >
číslo
číslo <
číslo
číslo =
číslo
sčítání
řetězec AND číslo
řetězec <= řetězec
řetězec >= řetězec
řetězec <> řetězec
řetězec > řetězec
368F
343C
33A1
300F
30CA
31AF
3851
351B
3524
353B
353B
353B
353B
353B
353B
3014
352D
353B
353B
353B
353B
doplněk
3319
331B
331D
331F
3321
3323
3325
3327
3329
332B
332D
332F
3331
3333
3335
3337
3339
333B
333D
333F
3341
21
22
23
24
25
26
27
28
29
2A
2B
2C
2D
2E
2F
30
31
32
33
34
35
název
adresa
tan
37DA
asn
3833
acs
3843
atn
37E2
ln
3713
exp
36C4
int
36AF
sqr
384A
sgn
3492
abs
346A
peek
34AC
in
34A5
usr-no
34B3
str$
361F
chr$
35C9
not
3501
zdvojení
33C0
n-mod-m
36A0
relativní skok 3686
stk-data
33C6
dec-jr-nz
367A
Komentovaný výpis paměti ROM
193
3301
3303
3305
3307
3309
330B
330D
330F
3311
3313
3315
3317
15
16
17
18
19
1A
1B
1C
1D
1E
1F
20
řetězec < řetězec
řetězec = řetězec
řetězec + řetězec
val$
usr$
načtení do A
negace
code
val
len
sin
cos
353B
353B
359C
35DE
34BC
3645
346E
3669
35DE
3674
37B5
37AA
3343
3345
3347
3349
334B
334D
334F
3351
3353
3355
3357
3359
36
37
38
39
3A
3B
3C
3D
3E
3F
40
41
číslo < 0
číslo > 0
konec výpočtu
get-argument
int se zaokr.
fp-calc-2
e-na-fp
re-stack
serie 06 atd.
stk-nula atd.
stk-mem-0 atd.
get-mem-0 atd.
3506
34F9
369B
3783
3214
33A2
2D4F
3297
3449
341B
342D
340F
Poznámka: Poslední čtyři podprogramy jsou víceúčelové a vstupuje se do nich s parametrem, který
je kopií bitů 0 až 4 původního literálu:
Doplněk #3E: série#06, série#08 a série#OC odpovídá literálům: #86,#88 a #8C.
Doplněk #3F: stk-nula, stk-jedna, stk-polovina, stk-pi/2, stk-deset odpovídá literálům #A0 až
#A4.
Doplněk #40: st-mem-0 až st-mem-5 odpovídá literálům #C0 až #C5.
Doplněk #41: get-mem-0 až get-mem-5 odpovídá literálům #EO až #E5.
PODPROGRAM "CALCULATE“
Tento podprogram provádí výpočty s čísly ve formě s pohyblivou řádovou tečkou. (Dále jen FP).
Výpočty lze rozdělit do tří skupin:
a) Binární operace například sčítaní, kdy dvě FP čísla jsou sečtena a výsledek pak tvoří
"poslední hodnotu".
b) Unární operace například sin, kdy "poslední hodnota" je změněna tak, že je výsledkem dané
operace.
c) Manipulační operace například stm-mem-0, kde "poslední hodnota“ je okopírována do prvních
pěti bajtů paměti kalkulátoru.
Operace, které se mají provést jsou specifikovány sledem datových bajtů takzvaných literálů,
které následují po instrukci RST#28 a tento sled musí být zakončen literálem #38 - konec výpočtu. V
případě potřeby vykonání jediné početní operace je možné vložit doplněk do registru B a vyvolat
operaci jediného výpočtu pomocí literálu #3B.
Také je možné volat tento podprogram rekursivně, tedy ze sama sebe, a v takovém případě lze
použít systémovou proměnou BREG jako čítač, který řídí počet operací před návratem. První část tohoto
podprogramu nastavuje registry na požadované hodnoty, vypočítává doplňky a případné parametry z
literálů, které jsou testovány. Doplněk slouží k vyhledání adresy příslušného podprogramu v tabulce
konstant. Parametry jsou použity při volání víceúčelových podprogramu.
Poznámka: FP číslo může být ve skutečnosti také soubor řetězcových parametrů.
335B
CALCULATE
CALL #35BF,STK-PNTRS
335E
GEN-ENT-1
LD
A,B
GEN-ENT-2
LD
EXX
EX
(#5C67),A (BREG)
3362
194
(SP),HL
Předpokládej unární operaci a proto nastav HL tak, aby
ukazovalo na 1.bajt "poslední hodnoty" a DE na STKEND.
Jinak předej doplněk jednoduché operace do BREG, při
rekurzívním
volání se nejedná o doplněk, ale o parametr (=čítač).
Návr. adr. podprogramu je uložena v zrcadlovém HL. Toto
číslo je také ukaz. na 1.literál. Vstup v tomto místě
Komentovaný výpis paměti ROM
3365
336C
3380
338C
338E
33A1
RE-ENTRY
SCAN-ENT
FIRST-3D
DOUBLE-A
ENT-TABLE
delete
EXX
LD
EXX
LD
INC
PUSH
AND
JP
LD
AND
RRCA
RRCA
RRCA
RRCA
ADD
LD
LD
AND
JR
CP
JR
EXX
LD
LD
LD
ADD
EXX
RLCA
LD
LD
LD
ADD
LD
INC
LD
LD
EX
PUSH
EXX
LD
RET
(#5C65),DE (STKEND)
A,(HL)
HL
HL
A
P,#3380,FIRST-3D
D,A
#60
A,#7C
L,A
A,D
#1F
#338E,ENT-TABLE
#18
NC,#338C,DOUBLE-A
BC,#FFFB
D,H
E,L
HL,BC
L,A
DE,#32D7
H,#00
HL,DE
E,(HL)
HL
D,(HL)
HL,#3365
(SP),HL
DE
se používá, když BREG je čítač a nemá se zničit.
Zde začíná smyčka obsl. všechny literály následující
za volací instrukcí. Přepni zrcadlové registry a
vyzvedni literál pro tuto smyčku.
H'L' ukazuje na další literál a
je krátce uschováno na zásobníku. Tento bod je používán
pro podprogram SINGLE CALCULATION nalezení pož. podpr.
Testuj registr A a odděl
jed. liter. od víceúčelových. Skoč s literálem #00-#3D
Uschovej literál v registru D.
Pokračuj pouze s bity 5 a 6 a
čtyřmi posuny z nich udělej bity 1 a 2.
Požadované doplňky jsou #3E-#41 a
L obsahuje požadovaný doplněk.
Vytvoř parametr M tak, že
použiješ bity 1,2,3 a 4 z původního literálu.
Najdi adresu požadovaného programu.
Při odskoku proveď unární operaci.
Všechny podpr., které jsou binárními operacemi vyžadují,
aby HL ukazovalo na první operand a
DE na druhý ("poslední hodnotu") tak, jak jsou na zásob.
kalkulátoru.
Protože každá položka v tabulce je dvoubajtová,
je vytvořený doplněk zdvojnásoben.
Bázová adresa tabulky.
Adresa požadované položky v tabulce
je vytvořena v HL a
adresa požadovaného podprogramu
je vyzvednuta do DE.
Adresa opětovného vstupu
je uložena na zásobníku pod
adresu požadovaného podprogramu.
Přepni na hlavní registry.
BC,(#5C66)(STKEND-hi) BREG je uložena do B, čímž se vrací dopl. jediné operace.
Nyní je proveden nepřímý skok do požadovaného podpr.
PODPROGRAM "DELETE“
Doplněk: #02 "delete"
Tento podprogram obsahuje pouze instrukci RET. Literál #02 způsobí, že tento program je
považován za binární operaci. Proto se do něj vstupuje s prvním číslem adresovaným HL a druhým číslem
adresovaným DE a vytvořený výsledek bude opět adresován registrovým párem HL. Instrukce RET tedy
způsobí, že první číslo je považováno za "poslední hodnotu" a druhé číslo je vymazáno. Druhé číslo
samozřejmě není vymazáno z paměti, ale stává se pouze neaktivním a pravděpodobně bude brzy přepsáno.
PODPROGRAM "SINGLE OPERATION"
Doplněk: #3B "fp-calc-2"
Tento podprogram je volán z podprogramu SCANNING na adrese #2757 a používá se k provedení
jednoduché aritmetické operace. Doplněk uvažované operace se předává kalkulátoru v registru B odkud je
předán do systémové proměnné BREG.
Komentovaný výpis paměti ROM
195
Výsledkem provedení tohoto podprogramu je zejména provedení skoku do příslušného podprogramu
pro jedinou operaci.
33A2
FP-CALC-2
POP
LD
EXX
JR
AF
A,(#5C67) (BREG)
#336C,SCAN-ENT
Odhoď návratovou adresu.
Převeď doplněk do A.
Přepni na zrcadlové registry.
Nalezni požadovanou adresu, ulož ji na zásobník a proveď
příslušnou operaci.
PODPROGRAM "TEST 5-SPACES"
Podprogram testuje, zda je v paměti dostatek místa pro pět bajtů FP čísla, které má být přidáno
na zásobník kalkulátoru.
33A9
TEST-5-SP
PUSH
PUSH
LD
CALL
POP
POP
RET
DE
HL
BC,#0005
#1F05,TEST-ROOM
HL
DE
Krátce uschovej DE
a také HL.
Test bude na 5 bajtů
Proveď test.
Obnov HL a
také DE.
Hotovo.
PODPROGRAM "STACK NUMBER"
Tento podprogram je volán z příkazu BEEP a z podprogramu SCANNING dvakrát, aby okopíroval STKEND
do DE, přenesl FP číslo na zásobník kalkulátoru a opět nastavil STKEND na hodnotu v DE. Pro skutečný
přesun je použit podprogram MOVE-FP.
33B4
STACK-NUM
LD
DE,(#5C65) (STKEND)
CALL #33C0,MOVE-FP
LD
(#5C65),DE (STKEND)
RET
Okopíruj STKEND do DE jako cílovou adresu.
Přesuň číslo.
Obnov hodnotu STKEND.
Hotovo.
PODPROGRAM "MOVE A FLOATING - POINT NUMBER"
Doplněk: #31 "duplicate"
Tento program přenese FP číslo na vrchol zásobníku kalkulátoru (ve třech případech) nebo z
vrcholu kalkulátoru do paměti kalkulátoru (v jednom případě).
Je také používán kalkulátorem pro obyčejné zdvojení čísla na vrcholu kalkulátoru, čímž se
zásobník kalkulátoru rozšíří o pět bajtů.
33C0
MOVE-FP
CALL #33A9,TEST-5-SP
LDIR
RET
Testuje se místo.
Přenes.
Hotovo.
PODPROGRAM "STACK LITERALS"
Doplněk: #34 "stk-data"
Tento podprogram vytvoří z dodaného čísla 2,3,4 nebo 5 literálů a umístí je jako poslední
hodnotu na zásobník kalkulátoru. Je-li tento podprogram vyvolán literálem #34, jsou uvažované
literály uloženy za touto konstantou, je-li volán podprogramem SERIES GENERATOR, jsou literály dodány
podprogramem vytvářejícím postoupnosti čísel a je-li volán podprogramy SKIP CONSTANS nebo STACK A
CONSTANS, jsou literály získány z tabulky konstant na adrese #32C5-#32D6. V každém případě je první
literál vydělen hodnotou #40 a celočíselná hodnota podílu plus 1 určí zda bude použito 1, 2, 3 nebo 4
následujících literálů jako čísla mantisy. Každý nevyplněný bajt z pěti bajtů pro FP číslo je nastaven
na nulu.
196
Komentovaný výpis paměti ROM
První literál se také používá k určení exponentu po snížení modulo #40 pokud ovšem zbytek není
nulový.
V tom případě se požije druhý literál tak jak je, bez snižování modulo #40. V každém případě se
k literálu přičte #50, čímž se vytvoří zvětšený exponentový bajt e (skutečný exponent e' plus #80).
Zbývajících pět bajtů je uloženo na zásobník včetně potřebných nul a podprogram vrací zpět.
33C6
STK-DATA
LD
LD
H,D
L,E
33C8
STK-CONST
CALL
EXX
PUSH
EXX
EX
PUSH
LD
AND
RLCA
RLCA
LD
#33A9,TEST-5-SP
INC
LD
AND
JR
INC
LD
ADD
LD
LD
SUB
INC
INC
LD
LDIR
POP
EX
EXX
POP
EXX
LD
XOR
DEC
RET
LD
INC
JR
C
A,(HL)
#3F
NZ,#33DE,FORM-EXP
HL
A,(HL)
A,#50
(DE),A
A,#05
C
HL
DE
B,#00
33DE
33F1
FORM-EXP
STK-ZEROS
HL
(SP),HL
BC
A,(HL)
#C0
C,A
BC
(SP),HL
HL
B,A
A
B
Z
(DE),A
DE
#33F1,STK-ZEROS
Tento podprogram vykoná
manipulační operaci přičtení poslední hodnoty na zásobník
kalkulátoru a HL ukazuje za poslední hodnotu (výsledek).
Testuj potřebný prostor.
Přepni na zrcadlové registry.
Uschovej ukazatel na další literál.
Přepni zpět.
Zaměň výsledný ukazatel a ukazatel na další literál.
Uschovej krátce BC.
Vyzvedni první literál do A.
Vyděl ho hodnotou #40 pro dosažení hodnot 0,1,2 nebo 3.
Celočíselná část e je předána do C a zvětšena pro
dosažení hodnoty 1,2,3 nebo 4 (= počet liter. mantisy).
Opět je vyzvednut
literál, snížen o hodnotu modulo #40
a bude použit při nenulovém zbytku.
Jinak bude použit další neredukovaný literál.
Exponent e je formován přičtením hodnoty #50 a předán
na zásobník DE kalkulátoru jako 1. z 5 hodnot výsledku.
C literálů je
vyzvednuto ze zdroje
a uloženo do bajtů
výsledku.
Obnov BC.
Zaměň zpět ukazatel
výsledku a ukazatel
literálu ze
zásobníku do H'L'.
Počet nulových
bajtů je udán hodnotou 5-C-1
a tento počet nul
je přidán k výsledku,
aby byl doplněn požadovaný počet
bajtů.
PODPROGRAM "SKIP KONSTANTS"
Do tohoto podprogramu se vstupuje s registrovým párem HL obsahujícím bázovou adresu
kalkulátorové tabulky konstant a registr A obsahuje parametr určující jednu z pěti konstant.
Podprogram provádí nulové operace přenášením pěti bajtů každé nepotřebné konstanty na adresy #0000,
#0001, #0002, #0003 a #0004 v paměti ROM až do nalezení požadované konstanty. Na výstupu obsahuje HL
bázovou adresu požadované konstanty v tabulce konstant.
33F7
33F8
SKIP-CONS
SKIP-NEXT
AND A
RET Z
PUSH AF
Je-li parametr nula
nebo byla-li nalezena potřebná konstanta, vrať se.
Uschovej parametr
Komentovaný výpis paměti ROM
197
PUSH
LD
CALL
POP
POP
DEC
JR
DE
DE,#0000
#33C8,STK-CONST
DE
AF
A
#33F8,SKIP-NEXT
a ukazatel výsledku.
Mrtvá adresa.
Proveď imaginární uložení expandované konstanty.
Obnov ukazatel
výsledku a parametr.
Počítej smyčky a posuď další
hodnoty čítače.
PODPROGRAM "MEMORY LOCATION"
Podprogram nalezne bázovou adresu každých pěti bajtů v paměťové oblasti kalkulátoru na kterou
nebo z které má být přeneseno FP číslo do nebo ze zásobníku kalkulátoru. Tato operace se provede
pětinásobným přičtením dodaného parametru k bázové adrese pro oblast jejíž adresa je v registrovém
páru HL. Povšimněte si, že při zpracování proměnné FOR-NEXT jsou ukazatele zaměněny tak, aby proměnná
byla považována za oblast kalkulátoru (viz #1D20).
3406
LOC-MEM
LD
RLCA
RLCA
ADD
LD
LD
ADD
RET
C,A
A,C
C,A
B,#00
HL,BC
Kopíruj parametr do C.
Zdvoj parametr.
Zdvoj výsledek.
Přičti hodnotu parametru, což dá 5 násobek původní hodn.
Převeď výsledek do registrového páru BC.
Vytvoř novou bázovou adresu.
Hotovo.
PODPROGRAM "GET FROM MEMORY AREA"
Doplňky: #E0 až #E5 "get-mem-0" až "get-mem-5"
Podprogram je volán použitím literálů #E0 až #E5 a parametry odvozené z těchto literálů jsou v
registru A. Podprogram volá MEMORY LOCATION k uložení požadované zdrojové adresy do HL a MOVE A
FLOATING-POINT NUMBER k okopírování příslušných pěti bajtů z paměti kalkulátoru, aby vytvořil novou
"poslední hodnotu".
340F
GET-MEM-0
etc.
PUSH
LD
CALL
CALL
POP
RET
DE
HL,(#5C68) (MEM)
#3406,LOC-MEM
#33C0,MOVE-FP
HL
Uschovej ukazatel výsledku.
Vyzvedni ukazatel na aktuální paměťovou oblast.
Bázová adresa je nalezena.
Pět bajtů přeneseno.
Ukazatel výsledku nastaven.
Hotovo.
PODPROGRAM "STACK A KONSTAT"
Doplněk: #A0 až #A4 "stk-nula" , "stk-jedna" , "stk-půl"
"stk-pi/2" , "stk-deset".
Tento podprogram používá SKIP KONSTANTS k nalezení bázové adresy požadované konstanty z tabulky
konstant a potom STACK LITERALS, aby se dosáhlo expandované formy konstanty jako "poslední hod." na
zásobníku kalkulátoru.
341B
198
STK-ZERO
etc.
LD
LD
EXX
PUSH
LD
EXX
CALL
CALL
EXX
POP
H,D
L,E
Nastav HL jako ukazatel výsledku.
#33F7,SKIP-CONS
#33C8,STK-CONST
Přepni na zrcadlové registry.
Uschovej adresu dalšího literálu.
Bázová adresa tabulky konstant.
Zpět na hlavní registry.
Nalezni požadovanou bázovou adresu.
Expanduj konstantu.
HL
Obnov ukazatel na další literál.
HL
HL,#32C5
Komentovaný výpis paměti ROM
EXX
RET
Hotovo.
PODPROGRAM "STORE IN MEMORY AREA"
Doplněk: #CO až #C5 "st-mem-0" až "st-mem-5"
Tento podprogram se volá použitím literálů #C0 až #C5 a parametry odvozené z těchto literálů
jsou v registru A. Podprogram je velmi podobný podprogramu GET FROM MEMORY, ale zdrojové a cílové
ukazatele jsou zaměněny.
342D
ST-MEM-0
etc.
PUSH
EX
LD
CALL
EX
CALL
EX
POP
RET
HL
DE,HL
HL,(#5C68) (MEM)
#3406,LOC-MEM
DE,HL
#33C0,MOVE-FP
DE,HL
HL
Uschovej ukazatel výsledku.
Zdroj krátce do DE.
Vyzvedni ukazatel na aktuální paměťovou oblast.
Je nalezena bázová adresa.
Je zaměněn zdrojový a cílový ukazatel.
Přenes pět bajtů.
STKEND do DE.
Ukazatel výsledku do HL.
Hotovo.
Povšimněte si, že ukazatele HL a DE zůstávají tak jak byly, ukazujíce na STKEND-5 a STKEND,
takže poslední hodnota zůstává na zásobníku kalkulátoru. Je-li to třeba, může být vyřazena použitím
"delete".
PODPROGRAM "EXCHANGE" (ZÁMĚNA)
Doplněk: #01 "exchange"
Tato binární operace zamění první a druhé číslo na vrcholu zásobníku kalkulátoru.
343C
343E
EXCHANGE
SWAP-BYTE
LD
LD
LD
EX
LD
LD
INC
INC
DJNZ
EX
RET
B,#05
A,(DE)
C,(HL)
DE,HL
(DE),A
(HL),C
HL
DE
#343E,SWAP-BYTE
DE,HL
Jde o pět bajtů.
Každý bajt druhého
čísla a každý bajt prvního čísla.
Přepni zdroj na cíl.
Na první a
na druhé číslo.
Přesuň se na
posouzení dalšího páru bajtů.
Zaměň pět bajtů.
Dej do pořádku ukazatele, protože číslo 5 je liché.
Hotovo.
PODPROGRAM "SERIES GENERATOR" (GENERÁTOR ŘAD)
Doplňky: #86, #88 a #8C "series-06", "series-08" a "series-0C"
Tento důležitý podprogram generuje řady rozvojem podle Čebyševových polynomů a jejich hodnoty
jsou pak použity k výpočtu hodnot funkcí SIN, ATN, LN a EXP a tím pádem i dalších aritmetických
funkcí, které jsou s předchozími v nějakém aritmetickém vztahu (COS, TAN ,ASN, ACS ....SQR).
Polynomy jsou generovány pro n=1,2,...,rekurentním vztahem : T n+1(z)=2*z*T n(z)-T n-1(z), kde
Tn(z) je n-tý prvek Čebyševova polynomu argumentu (z). Řada ve skutečnosti vypadá takto : T0, 2*T1,
2*T2,.... 2*Tn-1, kde n je 6 pro SIN, 8 pro EXP a 12 pro LN a ATN.
Koeficienty mocnin hodnoty (z) v těchto polynomech mohou být nalezeny v knize Handbook of
Mathemetical Functions od M. Abramovitze a I. A. Steguna (V Doveru 1965), strana 795. Jednoduše
řečeno, podprogram je volán s poslední hodnotou na zásobníku kalkulátoru, řekněme Z, což je číslo
mající nějaký jednoduchý vztah k argumentu, řekněme X, např. pro funkci SIN X. Volající podprogram
také dodává seznam požadovaných konstant (např. 6 konstant pro SIN).
SERIES GENERÁTOR pak pracuje s těmito daty a vrací volajícímu podprogramu "poslední hodnotu",
která obsahuje jednoduchý výsledek pro požadovanou funkci např. SIN X.
Komentovaný výpis paměti ROM
199
Podprogram může být rozdělen na čtyři části :
1) Nastavení čítače průchodů smyčkou :
Volající podprogram předá své parametry v registru A pro použití jako čítač. Do kalkulátoru se
vstoupí v bodě GEN-ENT-1, takže čítač může být nastaven.
3449
SERIES-06
etc.
LD
CALL
B,A
#335E,GEN-ENT-1
Předej parametr do B.
Toto je ve skutečnosti RST #28, ale s nastavením čítače.
2) Práce s poslední hodnotou Z :
Smyčka generátoru vyžaduje, aby hodnota 2*Z byla uložena v mem-0, v mem-2 má být uložena nula,
která má být zároveň poslední hodnotou.
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
#31,zdvojení
#0F,součet
#C0,st-mem-0
#02,výmaz
#A0,stk-nula
#C2,st-mem-2
Z,Z
2*Z
2*Z mem-0 obsahuje 2*Z.
0
0 mem-2 obsahuje 0.
3) Hlavní smyčka :
Řada je generována ve smyčce s použitím BREG jako čítače. Konstanty z volajícího podprogramu
jsou postupně ukládány na zásobník podprogramem STK-DATA. Je proveden opětovný vstup do kalkulátoru
v bodě GEN-ENT-2, tak aby se nezničila hodnota BREG a řada se vytváří v této formě:
B(R)=2*Z*B(R-1)-B(R-2)+A(R), pro R=1,2,...,N, kde A(1),A(2),.....,A(N) jsou konstanty dodané volajícím
podprogramem (SIN,ATN,LN a EXP) a B(0)=0=B(-1). (R+1)ní smyčka začíná s B(R) na zásobníku a s
2*Z, B(R-2) a B(R-1) v mem-0, mem-1 a mem-2.
3453
G-LOOP
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
#31,zdvojení
#E0,get-mem-0
#04,násobení
#E2,get-mem-2
#C1,st-mem-1
#03,odečet
#38,konec výpočtu
B(R),B(R)
B(R),B(R),2*Z
B(R),2*B(R)*Z
B(R),2*B(R)*Z,B(R-1)
B(R-1) do mem-1
B(R),2*B(R)*Z-B(R-1)
Na zásobník kalkulátoru je umístěna další konstanta.
CALL
#33C6,STK-DATA
B(R),2*B(R)*Z-B(R-1),A(R+1)
Toto je opětovný vstup do kalkulátoru bez poškození BREG.
CALL
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
#3362,GEN-ENT-2
#0F,součet
B(R),2*B(R)*Z-B(R-1)+A(R+1)
#01,záměna
2*B(R)*Z-B(R-1)+A(R+1),B(R)
#C2,st-mem-2
B(R) do mem-2
#02,výmaz
2*B(R)*Z-B(R-1)+A(R+1)=B(R+1)
#35,dec-jr-nz
B(R+1)
#EE,na #3453,G-LOOP
4) Odečtení čísla B(N-2) :
Smyčka ponechává B(N) na zásobníku a požadovaný výsledek je dán hodnotou B(N)-B(N-2).
DEFB
DEFB
DEFB
RET
200
#E1,get-mem-1
#03,odečet
#38,konec výpočtu
B(N),B(N-2)
B(N)-B(N-2)
Hotovo.
Komentovaný výpis paměti ROM
FUNKCE "ABSOLUTE MAGNITUDE"
Doplněk: #2A "abs"
Tento podprogram provede unární operaci tím, že zajistí, aby znaménkový bit FP čísla byl
vynulován. "Malá celá čísla" musí být posouzena odděleně. Většinu práce však vykoná následující
podprogram "unární mínus".
346A
ABS
LD
JR
B,#FF
#3474,NEG-TEST
B je nastaveno na #FF.
Je provedeno
unární mínus.
OPERACE UNARY MINUS
Doplněk: #1B "negate"
Tento podprogram provede unární operaci tím, že změní znaménko poslední hodnoty na zásobníku
kalkulátoru. Nula zůstává nezměněna. FP čísla jsou zpracována tak, že jejich znaménkový bit je
nulován pro "abs" nebo překlopen pro "negate". "Malá celá čísla" mají vynulován znaménkový bajt pro
"abs" nebo změněn pro "negate".
346E
NEGATE
CALL
RET
LD
#34E9,TEST-ZERO
C
B,#00
Je-li číslo nula,
návrat s bajty 00 00 00 00 00 zůstanou nezměněny.
B je nastaveno na #00 pro "negate".
Zde je vstup pro "ABS".
3474
NEG-TEST
LD
AND
JR
INC
LD
AND
OR
RLA
CCF
RRA
LD
DEC
RET
A,(HL)
A
Z,#3483,INT-CASE
HL
A,B
#80
(HL)
Jestliže první bajt je nulový, provede
se
zpracovaní "malého celého čísla".
Ukazuj na druhý bajt.
Vyzvedni #FF pro "abs" a #00 pro "negate".
Změň na #80 pro "abs" a #00 pro "negate".
Nastaví se bit 7 pro "abs", nic se nezmění pro "negate".
Nyní je změněn
bit 7, což způsobí, že bit 7 2.bajtu je nulován.
(HL),A
HL
Nový bajt je uložen.
HL ukazuje opět na první bajt.
Hotovo.
V případě celého čísla dochází k podobné operaci se znaménkovým bajtem.
3483
INT-CASE
PUSH
PUSH
CALL
POP
LD
OR
CPL
LD
CALL
POP
RET
DE
HL
#2D7F,INT-FETCH
HL
A,B
C
C,A
#2D8E,INT-STORE
DE
Ulož STKEND v DE.
Uschovej ukazatel na číslo v HL.
Vyzvedni znaménko do C a číslo do DE.
Obnov ukazatel na číslo v HL.
Vlož #FF pro "abs" a #00 pro "negate".
#FF pro "abs",žádná změna pro "negate".
#00 pro "abs" a změněný bajt pro
"negate" uschovej v C.
Uschovej výsledek na zásobníku a
vrať STKEND do DE.
Hotovo.
Komentovaný výpis paměti ROM
201
FUNKCE "SIGNUM" (ZNAMÉNKO)
Doplněk: #29 "sgn"
Tento podprogram provádí funkci SGN X a proto vrací jako poslední hodnotu 1 když X>0, O když
X=0 a -1 když X<0.
3492
SGN
CALL
RET
PUSH
LD
INC
RL
DEC
SBC
LD
CALL
POP
RET
#34E9,TEST-ZERO
C
DE
DE,#0001
HL
(HL)
HL
A,A
C,A
#2D8E,INT-STORE
DE
Je-li X nulové
vrať se s poslední hodnotou nula.
Uschovej ukazatel na STKEND.
Vlož do DE jedničku.
Ukazuj na další bajt čísla X.
Rotuj bit 7 do CY a
ukazuj na původní adresu.
C bude obsahovat #00 pro kladné X a
#FF pro záporné X.
Ulož 1 nebo -1 podle potřeby.
Obnov ukazatel na STKEND.
Hotovo.
FUNKCE "IN"
Doplněk: #2C "in"
Tento podprogram provádí funkci IN X. Provede vstup na úrovni procesoru z portu X, jehož hodnota
je v BC, a provede instrukci IN A,(C).
34A5
IN
CALL
IN
JR
#1E99,FIND-INT2
A,(C)
#34B0,IN-PK-STK
"Poslední hodnota" X kompresována do BC.
Signál je přijat.
Skok na uložení výsledku na zásobník kalkulátoru.
FUNKCE "PEEK"
Doplněk: #2B "peek"
Tento podprogram provádí funkci PEEK X. "Poslední hodnota" je odebrána ze zásobníku za pomoci
FIND-INT2 a nahrazena hodnotou uloženou na příslušném paměťovém místě.
34AC
PEEK
34B0
IN-PK-STK
CALL
LD
JP
#1E99,FIND-INT2
A,(BC)
#2D28,STACK-A
"Poslední hodnota" je kompresována do BC.
Vyzvedni požadovaný bajt.
Výstup přes stack A.
FUNKCE "USR"
Doplněk: #2D "usr-no"
Tento podprogram ("USR číslo" je něco jiného než "USR řetězec"), obsluhuje funkci USR X, kde X
je číslo. Hodnota čísla X je uložena do BC, návratová adresa je uložena na zásobník a program je
proveden od adresy X.
34B3
USR-NO
CALL
LD
PUSH
PUSH
RET
#1E99,FIND-INT2
HL,#2D2B
HL
BC
"Poslední hodnota" je kompresována do BC.
Vlož návratovou adresu podprogramu STACK-BC.
Ulož návratovou adresu a
proveď nepřímý skok na tento podprogram.
Hotovo.
Poznámka: Je zajímavé, že registrovaný pár IY je znovu nastaven na svou původní hodnotu po
návratu pres STACK-BC, ale důležitý ukazatel na poslední literát, který je v H’L‘, obnoven není. Proto
pro úspěšný návrat do BASICu musí zrcadlové HL obsahovat adresu instrukce "end-calc" v podprogramu
SCANNING, která je na adrese #2758.
202
Komentovaný výpis paměti ROM
FUNKCE "USR STRING"
Doplněk: #19 "usr-$"
Podprogram provede funkci USR X$, kde X$ je řetězec, a v BC vrací adresu bitové matice znaku
uživatelsky definované grafiky, odpovídající znaku uloženému v X$. Podprogram hlásí chybu A, když X$
není jediné písmeno v rozsahu od "a" do "u" nebo znak uživatelsky definované grafiky.
34BC
USR-$
34D3
USR-RANGE
34E4
34E7
USR-STACK
REPORT-A
CALL
DEC
LD
OR
JR
LD
CALL
JR
SUB
JR
CP
JR
INC
DEC
ADD
ADD
ADD
CP
JR
LD
ADD
LD
JR
INC
JP
RST
DEFB
#2BF1,STK-FETCH
BC
A,B
C
NZ,#34E7,REPORT-A
A,(DE)
#2C8D,ALPHA
C,#34D3,USR-RANGE
#90
C,#34E7,REPORT-A
#15
NC,#34E7,REPORT-A
A
A
A,A
A,A
A,A
#A8
NC,#34E7,REPORT-A
BC,(#5C7B) (UDG)
A,C
C,A
NC,#34E4,USR-STACK
B
#2D2B,STACK-BC
#08,ERROR-1
#09
Vyzvedni parametry řetězce X$.
Sniž délku o jedna pro test.
Nebyla-li délka
jedna,
skoč a ohlaš chybu.
Jinak vyzvedni jediné kód řetězce.
Jestliže představuje písmeno,
skoč na vyzvednutí jeho adresy.
Sniž adresu na skutečných 0 - 20 a
ohlaš chybu A, je-li znak mimo rozsah.
Opět testuj rozsah
a ohlaš chybu A, je-li znak mimo rozsah.
Uprav rozsah na 1 - 21, jako rozsah pro "a" až "u".
Nyní je rozsah 0-20
Vynásobením osmi
se získá doplněk
pro adresu.
Testuj rozsah doplňku a
ohlaš chybu A, jeli mimo rozsah.
Vyzvedni adresu 1. bajtu uživ. definované grafiky do
BC a přičti C k doplňku.
Výsledek vlož zpět do C.
Nedošlo-li k přenosu, skoč,
jinak zvětši B.
Ulož adresu.
Ohlaš:
A-invalid argument.
PODPROGRAM "TEST-ZERO" (TEST-NULA)
Podprogram je volán přinejmenším devětkrát k otestování FP čísla je-li nulové. Tento test
vyžaduje, aby první čtyři bajty čísla byly nulové. Podprogram se vrací s CY=1 bylo-li číslo skutečně
nula.
34E9
TEST-ZERO
PUSH
PUSH
LD
LD
INC
OR
INC
OR
INC
OR
LD
POP
POP
RET
SCF
RET
HL
BC
B,A
A,(HL)
HL
(HL)
HL
(HL)
HL
(HL)
A,B
BC
HL
NZ
Uschovej HL a
také BC.
Uschovej hodnotu A v registru B.
Vyzvedni 1. bajt.
Ukazuj na 2. bajt.
Proveď logické OR.
Ukazuj na 3. bajt.
Proveď logické OR.
Ukazuj na 4. bajt.
Proveď logické OR.
Obnov původní hodnotu v registru A,
v registrech BC a
v registrech HL.
Vrať se s CY=0, pokud byl kterýkoliv ze čtyř bajtů<>0.
Nastav CY=1 jako signál, že číslo bylo nula a
vrať se.
Komentovaný výpis paměti ROM
203
OPERACE "GREATER THAN ZERO" (VĚTŠÍ NEŽ NULA)
Doplněk: #37 "greater-0"
Podprogram vrací jako "poslední hodnotu" číslo 1, byla-li aktuální "poslední hodnota" větší než
nula, jinak vrací číslo 0. Je také využíván jinými podprogramy, při skoku "při plus".
34F9
GREATER-0
CALL
RET
LD
JR
#34E9,TEST-ZERO
C
A,#FF
#3507,SIGN-TO-C
Je poslední hodnota nula ?
Vrať jestliže ano.
Proveď LESS THAN ZERO, ale
signalizuj, že je potřeba provést opačnou akci.
FUNKCE "NOT"
Doplněk: #30 "not"
Podprogram vrací jako "poslední hodnotu" číslo 1 jestliže byla aktuální "poslední hodnota"
nulová, jinak vrací číslo nula. Je také využíván jinými podprogramy pro "skok při nule".
3501
NOT
CALL
JR
#34E9,TEST-ZERO
#350B,FP-0/1
CY bude 1 jediné když poslední hodnota byla 0, což
už je správný výsledek.
OPERACE "LESS THAN ZERO" (MENŠÍ NEŽ NULA)
Doplněk: #36 "less-0"
Podprogram vrací jako "poslední hodnotu" číslo 1, byla-li aktuální "poslední hodnota" menší než
nula, jinak vrací číslo 0. Je také využíván jinými podprogramy při skoku "při mínus".
3506
3507
LESS-0
SIGN-TO-C
XOR
INC
XOR
DEC
RLCA
A
HL
(HL)
HL
Vynuluj registr A.
Ukazuj na znaménkový bajt.
CY=0 pro kladná čísla a CY=1 pro záporná čísla.
Při vstupu z GREATER-0 jde do CY opačné znaménko.
PODPROGRAM "ZERO OR ONE" (NULA NEBO JEDNA)
Tento podprogram nastaví poslední hodnotu na nulu jestliže CY=0 nebo na jedničku jestliže CY=1.
Při zavolání z "E-TO-FP" vytváří tuto nulu nebo jedničku v mem-0.
350B
204
FP-0/1
PUSH
LD
LD
INC
LD
INC
RLA
LD
RRA
INC
LD
INC
LD
POP
RET
HL
A,#00
(HL),A
HL
(HL),A
HL
(HL),A
HL
(HL),A
HL
(HL),A
HL
Uschovej ukazatel na výsledek.
Vynuluj A bez porušení CY.
Nastav 1.bajt na 0.
Ukazuj na 2. bajt.
Nastav 2.bajt na 0.
Ukazuj na 3. bajt.
Rotuj CY do A, takže A bude 1, bylo-li CY=1, jinak A=0.
Nastav třetí bajt na tuto hodnotu a
zajisti opět nulové A.
Ukazuj na 4. bajt.
Nastav jej na nulu.
Ukazuj na 5. bajt.
Nastav jej na nulu.
Obnov ukazatel výsledku.
Hotovo.
Komentovaný výpis paměti ROM
OPERACE "OR"
Doplněk: #07 "or"
Podprogram provádí binární operaci "X OR Y" a vrací X, jestliže Y bylo nulové, a jinak hodnotu
nula.
351B
OR
EX
CALL
EX
RET
SCF
JR
DE,HL
#34E9,TEST-ZERO
DE,HL
C
#350B,FP-0/1
HL ukazuje na Y, tedy druhé číslo.
Testuj jestli je Y nulové.
Obnov ukazatele.
Jestliže Y=0, vrať se; X je nyní poslední hodnotou.
Nastav CY a
nastav "poslední hodnotu" na jedna.
OPERACE "NUMBER AND NUMBER“
Doplněk: #08 "no-&-no"
Podprogram provádí binární operaci "X AND Y" a vrací X jestliže Y není nula, v ostatních
případech hodnotu nula.
3524
NO-&-NO
EX
CALL
EX
RET
AND
JR
DE,HL
#34E9,TEST-ZERO
DE,HL
NC
A
#350B,FP-0/1
HL ukazuje na Y, tedy druhé číslo.
Testuj, zda Y je nulové.
Zaměň ukazatele zpět.
Vrať se s X jako poslední hodnotou, nebylo-li Y nula.
Nuluj CY a
nastav poslední hodnotu na nulu.
OPERACE "STRING AND NUMBER“
Doplněk: #10 "str-&-no"
Podprogram provádí binární operaci "X$ AND Y" a vrací X$ jestliže Y je nenulové, jinak vrací
nulový řetězec.
352D
STR-&-NO
EX
CALL
EX
RET
PUSH
DEC
XOR
LD
DEC
LD
POP
RET
DE,HL
#34E9,TEST-ZERO
DE,HL
NC
DE
DE
A
(DE),A
DE
(DE),A
DE
HL ukazuje na Y, DE na X$.
Testuj, zda Y je nulové.
Zaměň ukazatele zpět.
Vrať se s X$ jako poslední hodnotou, když Y nebylo nula.
Uschovej ukazatel na číslo.
Ukazuj na 5. bajt param. řetěz. = vyšší bajt délky.
Nuluj registr A.
Vyšší bajt délky je nyní nastaven na 0.
Ukazuj na nižší bajt délky.
Také jej nastav na nulu.
Obnov ukazatele.
Vrať se s parametry řetězce jako "poslední hodnotou".
OPERACE "COMPARISON“
Doplňky: #09 až #OE a #11 až #16 "no-l-eql", "no-gr-eq",
"nos-neql", "no-grtr", "no-less", "nos-eql", "str-l-eql",
"str-gr-eq", "strs-neql", "str-grtr", "str-less" a "strs-eql".
353B
NO-L-EQL
etc.
3543
EX-OR-NOT
LD
SUB
BIT
JR
DEC
RRCA
JR
A,B
#08
2,A
NZ,#3543,EX-OR-NOT
A
NC,#354E,NU-OR-STR
Doplněk do registru A.
Rozsah je #01 - #06 a #09 - #0E.
Tento rozsah je změněn na #00 - #02,#04 - #06,#08 - #0A
a #0C - #0E.
Dále je snížen na #00 - #07 a CY=1 pro ">=" a "<".
Operace s CY=1
Komentovaný výpis paměti ROM
205
354E
3559
3564
356B
NU-OR-STR
STRINGS
BYTE-COMP
SECND-LOW
3572
BOTH-NULL
3575
SEC-PLUS
3585
FRST-LESS
3588
STR-TEST
358C
END-TESTS
206
PUSH
PUSH
CALL
POP
EX
POP
BIT
JR
RRCA
PUSH
CALL
JR
RRCA
PUSH
CALL
PUSH
PUSH
CALL
POP
LD
OR
EX
LD
JR
OR
POP
JR
POP
CCF
JR
POP
JR
OR
JR
LD
SUB
JR
JR
DEC
INC
INC
EX
DEC
JR
POP
POP
AND
PUSH
RST
DEFB
DEFB
POP
PUSH
CALL
POP
PUSH
CALL
POP
AF
HL
#343C,EXCHANGE
DE
DE,HL
AF
2,A
NZ,#3559,STRINGS
AF
#300F,SUBTRACT
#358C,END-TESTS
AF
#2BF1,STK-FETCH
DE
BC
#2BF1,STK-FETCH
HL
A,H
L
(SP),HL
A,B
NZ,#3575,SEC-PLUS
C
BC
Z,#3572,BOTH-NULL
AF
#3588,STR-TEST
AF
#3588,STR-TEST
C
Z,#3585,FRST-LESS
A,(DE)
(HL)
C,#3585,FRST-LESS
NZ,#356B,SECND-LOW
BC
DE
HL
(SP),HL
HL
#3564,BYTE-COMP
BC
AF
A
AF
#28,FP-CALC
#A0,stk-nula
#38,konec výpočtu
AF
AF
C,#3501,NOT
AF
AF
NC,#34F9,GREATER-0
AF
jsou považovány za své komplementární operace
jakmile jsou hodnoty zaměněny.
Číselná porovnání jsou oddělena od řetězcových porovnání
otestováním bitu 2.
Číselné oper. mají rozsah #00-#01 s CY=1 pro "=" a "<>".
Uschovej doplněk.
Čísla jsou odečtena
pro závěrečné testy.
Řetězc. porov. mají rozsah #02-#03 s CY=1 pro "=" a "<>".
Uschovej doplněk.
Délky a počáteční adresy
řetězců jsou vyzvednuty ze zásobníku kalkulátoru.
Délka 2. řetězce.
Skoč pokud druhý řetězec není nulový.
Zde je 2. řetězec buď nulový nebo menší než 1. řetězec.
CY je komplementováno
k dosažení správného výsledku testu.
Zde je CY použito tak, jak je.
První řetězec je nyní nulový, 2. ne.
Ani jeden řetězec není nulový
takže mohou být porovnány jejich další bajty.
První
Druhý
Bajty
takže
bajt je menší.
bajt je menší.
se rovnají,
délky jsou dekrementovány a
provede se skok na BYTE-COMP k porovnání dalších bajtů.
CY je vynulováno pro dosažení správných výsledků testu.
Pro řetězcové testy je na zás. kalkulátoru uložena 0.
Tyto tři testy, dávají správné výsledky
pro všech dvanáct porovnání.
Počáteční CY je =1 pro "<>" a "=" a výsledné
Komentovaný výpis paměti ROM
RRCA
CALL
RET
CY je nastaveno pro ">”, “<” a “=”.
NC,#3501,NOT
Hotovo.
OPERACE "STRING CONCATENATION“
Doplněk: #17 "strs-add"
Tento podprogram provádí binární operaci A$+B$. Parametry obou řetězců jsou vyzvednuty a je
vypočtena celková délka. V pracovním prostoru je vytvořen dostatečný prostor pro oba řetězce, které
jsou pak do něj překopírovány. Výsledkem tohoto podprogramu je proto vytvoření přechodné proměnné
A$+B$, která se nachází v pracovním prostoru.
359C
35B7
STRS-ADD
OTHER-STR
CALL
PUSH
PUSH
CALL
POP
PUSH
PUSH
PUSH
ADD
LD
LD
RST
CALL
POP
POP
LD
OR
JR
LDIR
POP
POP
LD
OR
JR
LDIR
#2BF1,STK-FETCH
DE
BC
#2BF1,STK-FETCH
HL
HL
DE
BC
HL,BC
B,H
C,L
#30,BC-SPACES
#2AB2,STK-STORE
BC
HL
A,B
C
Z,#35B7,OTHER-STR
BC
HL
A,B
C
Z,#35BF,STK-PNTRS
Parametry druhého řetězce jsou vyzvednuty a uschovány.
Parametry prvního řetězce jsou vyzvednuty.
Délky jsou nyní v registrových párech HL a BC.
Parametry 1. řetězce jsou uschovány.
Je vypočtena celková délka obou řetězců a
uložena do BC.
Je vytvořen pracovní prostor.
Param. nového řetězce jsou předány na zásobník kalkul.
Jsou obnoveny parametry 1. řetězce a
pokud není nulový,
je okopírován do pracovního prostoru.
Identická procedura následuje pro druhý řetězec,
čímž se dosáhne
výsledku A$+B$.
PODPROGRAM "STK-PNTRS"
Podprogram vrací HL jako ukazatel na první bajt poslední hodnoty, tedy STKEND-5 a DE ukazuje
jedno místo za poslední hodnotu, tedy na STKEND.
35BF
STK-PNTRS
LD
LD
PUSH
ADD
POP
RET
HL,(#5C65) (STKEND) Vyzvedni aktuální hodnotu STKEND.
DE,#FFFB
Nastav DE na -5.
HL
Uschovej STKEND.
HL,DE
Vypočti STKEND - 5.
DE
Vyzvedni STKEND do DE.
Vrať se.
FUNKCE "CHR$"
Doplněk #2F: "chrs"
Podprogram zpracuje funkci CHR$ X a vytvoří příslušný znak v pracovním prostoru.
35C9
CHRS
CALL
JR
JR
#2DD5,FP-TO-A
C,#35DC,REPORT-B
NZ,#35DC,REPORT-B
Poslední hodnota do A.
Je-li x>255, ohlaš chybu.
Je-li x záporné číslo, ohlaš chybu.
Komentovaný výpis paměti ROM
207
PUSH
LD
RST
POP
LD
CALL
EX
RET
35DC
REPORT-B
AF
BC,#0001
#30,BC-SPACES
AF
(DE),A
#2AB2,STK-STORE
DE,HL
RST #08,ERROR-1
DEFB #0A
Uschovej hodnotu x
a vytvoř jedno místo
v pracovním prostoru.
Vyzvedni x
a vlož jej do místa v pracovním prostoru.
ULOŽ parametry tohoto řetězce na zásobník kalkulátoru.
Zaměň ukazatele
a vrať se.
Ohlaš:
B-Integer out of range
FUNKCE "VAL" A "VAL$"
Doplněk #1D: "val".
Doplněk #18: "val$".
Podprogram provádí funkce VAL X$ a VAL$ X$. Při obsluze VAL X$ se provede číselné ohodnocení
výrazu a výsledek se uloží jako poslední hodnota na zásobník kalkulátoru. Při obsluze VAL$ X$ se
provede řetězcové ohodnocení výrazu a parametry řetězce se uloží jako poslední hodnota na zásobník
kalkulátoru. Doplněk vstupuje v registru B.
35DE
VAL
360C
V-RPORT-C
208
LD
PUSH
LD
ADD
SBC
PUSH
CALL
PUSH
INC
RST
POP
LD
PUSH
LDIR
EX
DEC
LD
RES
CALL
RST
CP
JR
POP
POP
XOR
AND
JP
LD
SET
CALL
POP
LD
JR
HL,(#5C5D) (CH-ADD)
HL
A,B
A,#E3
A,A
AF
#2BF1,STK-FETCH
DE
BC
#30,BC-SPACES
HL
(#5C5D),DE (CH-ADD)
DE
Aktuální hodnota CH-ADD
je uschována na zásobníku.
Doplněk do A.
Vytvoř #00 a CY=1 pro "val" nebo #FB a CY=0 pro "val$".
Vytvoř #FF (bit 6=1) pro "val" nebo #00 (bit 6=0) "val$"
Uschovej vlajku.
Vyzvedni parametry řetězce,
uschovej jeho začátek,
zvětši délku
a vytvoř místo v pracovním prostoru.
Obnov začátek řetězce v HL.
Ukazatel na první nově vytvořené místo jde do CH-ADD
a na zásobník.
Kopíruj řetězec do vytvořeného prostoru.
DE,HL
Zaměň ukazatele.
HL
Bajt "navíc"
(HL),#0D
je nahrazen znakem "CR" (ENTER).
7,(IY+1) (FLAGS)
Nuluj vlajku "syntax/run"
#24FB,SCANNING
a proveď kontrolu správnosti syntaxe.
#18,GET-CHAR
Vyzvedni znak za řetězcem.
#0D
Pokud to není znak "CR",
NZ,#360C,V-RPORT-C ohlaš chybu.
HL
Obnov začátek řetězce v HL.
AF
Vyzvedni vlajku "val/val$"
(IY+1) (FLAGS)
a testuj bit 6 oproti
#40
výsledku kontroly syntaxe.
NZ,#1C8A,REPORT-C
Ohlaš chybu, pokud se neshodují.
(#5C5D),HL (CH-ADD) Začátek řetězce do CH-ADD.
7,(IY+1) (FLAGS)
Signál: program v běhu.
#24FB,SCANNING
Řetěz je zprac. jako "další výraz" a jeho hod. uložena.
HL
Vyzvedni
(#5C5D),HL (CH-ADD) a obnov původní hodnotu v CH-ADD.
#35BF,STK-PNTRS
Vrať se přes STK-PNTRS, což nastaví systémové ukazatele.
Komentovaný výpis paměti ROM
FUNKCE "STR$"
Doplněk: #2E "str$"
Podprogram provede funkci STR$ X a vrací parametry řetězce, obsahujícího ten samý text, který by
se objevil na obrazovce při provedení příkazu PRINT X.
361F
STR$
LD
RST
LD
PUSH
LD
PUSH
LD
CALL
CALL
POP
CALL
POP
LD
AND
SBC
LD
LD
CALL
EX
RET
BC,#0001
#30,BC-SPACES
(#5C5B),HL (K-CUR)
HL
HL,(#5C51) (CURCHL)
HL
A,#FF
#1601,CHAN-OPEN
#2DE3,PRINT-FP
HL
#1615,CHAN-FLAG
DE
HL,(#5C5B) (K-CUR)
A
HL,DE
B,H
C,L
#2AB2,STK-STO-$
DE,HL
Vytvoř jedno místo
v pracovního prostoru,
kopíruj jeho adresu do K-CUR
a také ji ulož na zásobník.
Aktuální kanálová adresa
je uložena na zásobník.
Otevři kanál "R", což umožní
výtup řetězce do pracovní oblasti.
Poslední hodnota X, je vytištěna do pracovního prostoru.
Obnov adresu aktuálního kanálu do HL a
obnov také příznaky, které mu přináleží.
Obnov počáteční adresu řetězce.
Adresa kurzoru ukazuje jedno místo za řetězec
a proto
rozdíl ukazatelů je délkou řetězce,
která je
převedena do BC.
Parametry řetězce jsou uloženy na zásobník kalkulátoru.
Zaměň ukazatele
a vrať se.
PODPROGRAM "READ-IN"
Doplněk: #1A "read-in"
Tento podprogram je volán přes kalkulátor pomocí doplňku z prvního řádku podprogramu INKEY$.
Umožňuje načítání dat přes různé proudy, které jsou ve standardním SPECTRU. Stejně jako INKEY$, vrací
i tento podprogram parametry řetězce.
3645
READ-IN
365F
R-I-STORE
CALL
CP
JP
LD
PUSH
CALL
CALL
LD
JR
INC
RST
LD
CALL
POP
CALL
JP
#1E94,FIND-INT1
#10
NC,#1E9F,REPORT-B
HL,(#5C51) (CURCHL)
HL
#1601,CHAN-OPEN
#15E6,INPUT-AD
BC,#0000
NC,#365F,R-I-STORE
C
#30,BC-SPACES
(DE),A
#2AB2,STK-STO-$
HL
#1615,CHAN-FLAG
#35BF,STK-PNTRS
Kompresuj číselný parametr do A
a jestliže není menší než 16,
ohlaš chybu.
Aktuální kanálová adresa
je uložena na zásobník.
Otevři kanál specifikovaný parametrem
a přijmi jakoby "hodnotu klávesy".
Délka řetězce při "neplnění" je 0.
Skoč, jestliže nebyl žádný signál.
Nastav délku na 1,
vytvoř tento prostor,
a vlož do něj řetězec.
Předej parametry řetězce na zásobník kalkulátoru.
Vyzvedni kanálovou adresu
a obnov příslušné vlajky.
Vrať se přes STK-PNTRS, což nastaví systémové ukazatele.
FUNKCE "CODE"
Doplněk: #1C "CODE"
Podprogram provede funkci CODE A$ a vrací kód prvního znaku z řetězce A$ nebo 0, pokud byl
řetězec A$ nulový.
3669
CODE
CALL
LD
#2BF1,STK-FETCH
A,B
Vyzvedni parametry řetězce.
Testuj délku
Komentovaný výpis paměti ROM
209
3671
STK-CODE
OR
JR
LD
JP
C
Z,#3671,STK-CODE
A,(DE)
#2D28,STACK-A
a pokud je nulové,
skoč dopředu.
Vyzvedni kód prvního znaku
a před návratem jej ulož na zásobník kalkulátoru.
FUNKCE "LEN"
Doplněk: #1E "len"
Podprogram provede funkci LEN A$ a vrací délku řetězce jako poslední hodnotu na zásobníku
kalkulátoru.
3674
LEN
CALL
JP
#2BF1,STK-FETCH
#2D2B,STACK-BC
Vyzvedni parametry řetězce
a proveď návrat přes STACK-BC, který uloží posl. hodnotu.
PODPROGRAM "DECREASE THE COUNTER"
Doplněk: #35 "dec-jr-nz"
Podprogram je využíván pouze podprogramem SERIES GENERATOR a ve skutečnosti provádí instrukci
DJNZ, ale čítačem je proměnná BREG a ne registr B.
367A
DEC-JR-NZ
EXX
PUSH
LD
DEC
POP
JR
INC
EXX
RET
HL
HL,#5C67
(HL)
HL
NZ,#3687,JUMP-2
HL
Přepni na zrcadlové registry
a uschovej ukazatel na další literál.
HL ukazuje na BREG.
Dekrementace BREG.
Obnovení ukazatele na další literál.
Skoč při nenulovém BREG.
Překroč další literál.
Přepni na hlavní registry
a vrať se.
PODPROGRAM "JUMP"
Doplněk: #33 "jump"
Podprogram provede nepodmíněný skok při zavolání literálem #33. Je také používán podprogramy
DECREASE TNE COUNTER a JUMP ON TRUE.
3686
3687
JUMP
JUMP-2
EXX
LD
LD
RLA
SBC
LD
ADD
EXX
RET
E,(HL)
A,E
A,A
D,A
HL,DE
Přepni na zrcadlové registry.
Vyzvedni délku skoku do registru E'.
V registru A se vytvoří
hodnota #00 pro kladná čísla nebo
#FF pro záporná čísla
a je převedena do D'.
H'L' obsahuje cílovou adresu.
Přepni na hlavní registry.
Hotovo.
PODPROGRAM "JUMP ON TRUE"
Doplněk: #00 "jump-true"
Podprogram provede podmíněný skok, jestliže "poslední hodnota" na zásobníku kalkulátoru je
pravdivá. Její adresa je v DE.
368F
210
JUMP-TRUE
INC
INC
LD
DEC
DEC
DE
DE
A,(DE)
DE
DE
Posuň ukazatel na třetí bajt čísla,
který je buď nula nebo jedna
a vyzvedni je do A.
Opět ukazuj
na první bajt.
Komentovaný výpis paměti ROM
AND
JR
EXX
INC
EXX
RET
A
NZ,#3686,JUMP
HL
Je třetí bajt nula?
Proveď skok, jestliže není nulový (=pravda).
Přepni na zrcadlové registry.
Překroč literál udávající délku skoku.
Přepni na hlavní registry.
Hotovo.
PODPROGRAM "END-CALC"
Doplněk: #38 "end-calc"
Podprogram ukončí operaci RST #28.
369B
END-CALC
POP
EXX
EX
EXX
RET
AF
(SP).HL
Zahoď adresu zpětných návratů do kalkulátoru.
Přepni na zrcadlové registry
a ulož adresu z HL na zásobník.
Přepni na hlavní registry.
Skoč na dřívější
adresu dodanou z HL.
PODPROGRAM "MODULUS"
Doplněk: #32 "n-mod-m"
Podprogram počítá N (mod M), kde M je kladné celé číslo na vrcholu zásobníku kalkulátoru a N je
celé číslo pod vrcholem zásobníku. Podprogram vrací celočíselnou část podílu INT(N/M) na vrcholu
zásobníku (tedy jako poslední hodnotu) a pod vrchol zásobníku uloží zbytek N-INT(N/M). Podprogram se
používá při výpočtu náhodných čísel ke snížení N mod 65537.
36A0
N-MOD-M
RST
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
RET
#28,FP-CALC
#C0,st-mem-0
#02,výmaz
#31,zdvojení
#E0,get-mem-0
#05,dělení
#27,int
#E0,get-mem-0
#01,záměna
#C0,st-mem-0
#04,násobení
#03,odečítání
#E0,get-mem-0
#38,konec výpočtu
N,M
N,M (M do mem-0)
N
N,N
N,N,M
N,N/M
N,INT(N/M)
N,INT(N/M),M
N,M,INT(N/M)
INT(N/M) do mem-0.
N,M*INT(N/M)
N-M*INT(N/M)
N-M*INT(N/M),INT(N/M)
Hotovo.
FUNKCE "INT"
Doplněk: #27 "int"
Podprogram vrací jako poslední hodnotu celočíselnou část čísla, které je při vstupu na vrcholu
zásobníku kalkulátoru. Tedy INT 2.4 dává 2, ale protože podprogram zaokrouhluje směrem dolů, bude INT
-2.4 roven -3.
36AF
INT
RST
DEFB
DEFB
DEFB
DEFB
#28,FP-CALC
#31,zdvojení
#36,<0
#00,skok-pravda
#04,na #36B7,X-NEG
X
X,X
X,(1/0) (logická hodnota)
X
X
Pro případ, že X>=0, se nyní nalezne celočíselná část X.
Komentovaný výpis paměti ROM
211
DEFB
DEFB
RET
#3A,truncate
#38,konec výpočtu
I(X)
Hotovo.
Pro záporné celé číslo se vrací hodnota I(X), pro ostatní záporná čísla se vrací I(X)-1.
36B7
X-NEG
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
#31,zdvojení
#3A,truncate
#C0,st-mem-0
#03,odečítání
#E0,get-mem-0
#01,záměna
#30,not
#00,skok-pravda
#03,na #36C2,EXIT
X,X
X,I(X)
I(X) jde do mem-0.
X-I(X)
X-I(X),I(X)
I(X),X-I(X)
I(X),(1/0) (logická hodnota).
I(X)
I(X)
Pro záporná celé čísla se provede přeskok.
36C2
DEFB
DEFB
DEFB
RET
EXIT
#A1,stk-jedna
#03,odečítání
#38,konec výpočtu
I(X),1
I(X)-1
I(X) nebo I(X)-1
FUNKCE "EXPONENTIAL"
Doplněk: #26 "exp"
Podprogram provádí funkci EXP X a je prvním ze čtyř podprogramů, které
GENERATOR k vytváření Čebyševových polynomů. Aproximace INT X je nalezena takto:
a)
b)
c)
d)
e)
f)
SERIES
X je děleno LN 2 k získání Y, takže 2 na Y-tou dává požadovaný výsledek.
Je nalezena hodnota N pro kterou platí, že N=INT Y.
Je nalezena hodnota W pro kterou platí, že W=Y-N, kde 0<=W<=1.
Je vytvořen argument Z takový, že Z=2*W-1.
Použitím SERIES GENERATOR se získá hodnota 2^W.
Konečně se přičte N k exponentu, což dává 2^(N+W), neboli 2^Y a tedy požadovaný výsledek EXP X.
36C4
EXP
1.
2.
3.
4.
212
používají
RST
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
#28,FP-CALC
#3D,re-stack
#34,stk-data
#F1,exponent #81
#38,#AA,#3B,#29
#04,násobení
#31,zdvojení
#27,int 1C46
#C3,st-mem-3
#03,odečítání
#31,zdvojení
#0F,sčítání
#A1,stk-jedna
#03,odečítání
#88,serie-08
#13,exponent #63
#36,(#00,#00,#00)
#58,exponent #68
#65,#66,(#00,#00)
#9D,exponent #6D
#78,#65,#40,(#00)
#A2,exponent #72
X
X (X ve formě FP).
X,1/LN2
X/LN2 (dále jen
Y,Y
Y,INT Y
(dále
N do mem-3.
Y-N
(dále jen
W,W
2*W
2*W,1
2*W-1 (dále jen
Z
Y).
N).
W).
Z).
Komentovaný výpis paměti ROM
5.
6.
7.
8.
3703
REPORT-6
3705
N-NEGTV
370C
RESULT-OK
370E
RSLT-ZERO
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
CALL
JR
JR
ADD
JR
RST
DEFB
JR
SUB
JR
NEG
LD
RET
RST
DEFB
DEFB
DEFB
RET
#60,#32,#C9,(#00)
#E7,exponent #77
#21,#F7,#AF,#24
#EB,exponent #7B
#2F,#B0,#B0,#14
#EE,exponent #7E
#7E,#BB,#94,#58
#F1,exponent #81
#3A,#7E,#F8,#CF
#E3,get-mem-3
#38,konec výpočtu
#2DD5,FP-TO-A
NZ,#3705,N-NEGTV
C,#3703,REPORT-6
A,(HL)
NC,#370C,RESULT-OK
#08,ERROR-1
#05
C,#370E,RSLT-ZERO
(HL)
NC,#370E,RSLT-ZERO
(HL),A
#28,FP-CALC
#02,výmaz
#A0,stk-nula
#38,konec výpočtu
2^W
2^W,N
Do registru A je vložena absolutní hodnota N mod 256.
Skoč dopředu při záporném N.
Ohlaš chybu, je-li ABS N > 255.
Přičti ABS N k exponentu.
Skoč, je-li e>255.
Ohlaš:
6-Number too big.
Výsledek má být 0, jestliže n < -255.
Odečti ABS N od exponentu, protože N bylo záporné.
Výsledek bude nula pro e < 0.
Mínus e je změněno na plus e.
Vlož exponent e.
Hotovo.
Použij kalkulátor
a vlož
exponent e = 0.
Hotovo.
FUNKCE PŘIROZENÉHO LOGARITMU
Doplněk: #25 "ln"
Tento podprogram provádí funkci LN x a je druhým ze
podprogram SERIES GENERATOR k vytváření Čebyševových polynomů.
čtyř
podprogramů,
které
používají
Aproximace LN x je nalezena následovně:
a) Testuje se x a je ohlášena chyba A, pokud x není kladné.
b) Dále je x rozděleno na exponent e' a mantisu x'=x/(2^e'), kde x' >= .5 ale x' < 1.
c) Jsou formovány požadované hodnoty y1 nebo y2. Je-li x' > .8, pak y1 = e'*LN2, jinak y2 =(e'-1)*LN2.
d) Jestliže x' > .8, pak je na zásobník úložna hodnota x' -1, jinak 2*x'-1.
e) Jestliže x' > .8, pak bude argument z = 2.5*x'-3, jinak z = 5*x'-3. Vždy pak musí platit že -1 <=
z <= 1 (což je podmínka pro konvergenci řady).
f) K vytvoření požadované funkce se použije podprogram "SERIES GENERATOR".
g) Nakonec se užije obyčejné násobení a sčítání a LN x se vrací jako poslední hodnota na zásobníku
kalkulátoru.
3713
LN
RST
#28,FP-CALC
x
#3D,re-stack
#31,zdvojení
#37,>0
#00,skok-pravda
#04,na 371C,VALID
#38,konec výpočtu
x (v plné FP formě)
x,x
x,(1/0) (logická hodnota).
x
x
Proveď krok a).
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
Komentovaný výpis paměti ROM
213
371A
REPORT-A
RST
DEFB
#08,ERROR-1
#09
Ohlaš:
A-Invalid argument
#A0,stk-nula
#02,výmaz
#38,konec výpočtu
A,(HL)
(HL),#80
#2D28,STACK-A
#28,FP-CALC
#34,stk-data
#38,exponent #88
#00,(#00,#00,#00)
#03,odečítání
x,0
x
x
Exponent e jde do registru A.
x je sníženo na x'.
Na zásobníku je:x',e.
x',e
x',e,128 (dekadicky)
x',e
#01,záměna
#31,zdvojení
#34,stk-data
#F0,exponent #80
#4C,#CC,#CC,#CD
#03,odečítání
#37,>0
#00,skok-pravda
#08,na 373D,GRE.8
#01,záměna
#A1,stk-jedna
#03,odečítání
#01,záměna
#38,konec výpočtu
(HL)
#28,FP-CALC
#01,záměna
#34,stk-data
#F0,exponent #80
#31,#72,#17,#F8
#04,násobení
e',x'
e',x',x'
e',x',x',0.8
Proveď krok b).
371C
VALID
DEFB
DEFB
DEFB
LD
LD
CALL
RST
DEFB
DEFB
DEFB
DEFB
x',e'
Proveď krok c).
373D
GRE.8
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
INC
RST
DEFB
DEFB
DEFB
DEFB
DEFB
e',x',x'-0.8
e',x',(1/0)
e',x'
e',x'
x',e'
x',e',1
x',e'-1
e'-1,x'
e'-1,x'
e'-1,2*x'
postup pro x' větší
x',e'
x',e',LN2
postup pro x' menší
2*x',e'-1
2*x',e'-1,LN2
x',e'*LN2 (=y1)
2*x',(e'-1)*LN2 (=y2)
#01,záměna
#A2,stk-polovina
#03,odečítání
#A2,stk-polovina
#03,odečítání
y1,x'
y1,x',.5
y1,x'-.5
y1,x'-.5,.5
y1,x'-1
y2,2*x'
y2,2*x',.5
y2,2*x'-.5
y2,2*x'-.5,.5
y2,2*x'-1
#31,zdvojení
#34,stk-data
#32,exponent #82
#20,(#00,#00,#00)
#04,násobení
#A2,stk-polovina
#03,odečítání
y1,x'-1,x'-1
y1,x'-1,x'-1,2.5
y2,2*x'-1.2*x'-1
y2,2*x'-1,2*x'-1,2.5
y1,x'-1,2.5*x'-2.5
y1,x'-1,2.5*x'-2.5,.5
y1,x'-1,2.5*x'-3 (=z)
y2,2*x'-1,5*x'-2.5
y2,2*x'-1,5*x'-2.5,.5
y2,2*x'-1,5*x'-3 (=z)
Proveď krok d).
DEFB
DEFB
DEFB
DEFB
DEFB
Proveď krok e).
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
214
Komentovaný výpis paměti ROM
Proveď krok f).
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
#8C,série-0C
#11,exponent #61
#AC,(#00,#00,#00)
#14,exponent #64
#09,(#00,#00,#00)
#56,exponent #66
#DA,#A5,(#00,#00)
#59,exponent #69
#30,#C5,(#00,#00)
#5C,exponent #6C
#90,#AA,(#00,#00)
#9E,exponent #6E
#70,#6F,#61,(#00)
#A1,exponent #71
#CB,#DA,#96,(#00)
#A4,exponent #74
#31,#9F,#B4,(#00)
#E7,exponent #77
#A0,#FE,#5C,#FC
#EA,exponent #7A
#1B,#43,#CA,#36
#ED,exponent #7D
#A7,#9C,#7E,#5E
#F0,exponent #80
#6E,#23,#80,#93
Nyní je poslední hodnota:
y1,x'-1,z
y2,2*x'-1,z
LNx'/(x'-1)
LN(2*x')/(2*x'-1)
LN(2^e'),LNx'
LN((2^e')*x')
LN x
Poslední hodnota je LN x.
LN(2^(e'-1)),LN(2*x')
LN(2^(e'-1)*2*x')
Proveď krok g).
DEFB
DEFB
DEFB
RET
#04,násobení
#0F,sčítání
#38,konec výpočtu
PODPROGRAM "REDUKCE ARGUMENTU"
Doplněk #39: "get-argt"
Podprogram převede argument funkce SIN nebo COS na hodnotu v.
hodnotu y, pro které platí: y=x/(2*PI)-INT(x/2*PI)+.5), kde .5 > y >= -.5 .
Podprogram vrací:
a) v=4*y
pokud -1 <= 4*y <= 1
b) v=2 až 4*y
pokud
1 < 4*y < 2
c) v=4*y-2
pokud -2 <= 4*y < -1
Ve všech případech -1 <= v <= 1 a SIN (PI* v/2)=SIN x.
3783
GET-ARGT
RST
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
#28,FP-CALC
#3D,re-stack
#34,stk-data
#EE,exponent #7E
#22,#F9,#83,#6E
#04,násobení
#31,zdvojení
#A2,stk-polovina
#0F,sčítání
Program
nejprve
nalezne
x
x (v plné FP formě)
x,1/(2*PI)
x/(2*PI)
x/(2*PI),x/(2*PI)
x/(2*PI),x/(2*PI),.5
x/(2*PI),x/(2*PI)+.5
Komentovaný výpis paměti ROM
215
DEFB
DEFB
#27,int 1C46
#03,odečítání
x/(2*PI),INT(x/(2*PI)+.5)
x/(2*PI)-INT(x/(2*PI)+.5)=y
Poznámka: přičtení 0.5 a provedení INT zaokrouhlí výsledek na nejbližší celé číslo.
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
RET
#31,zdvojení
#0F,sčítání
#31,zdvojení
#0F,sčítání
#31,zdvojení
#2A,abs
#A1,stk-jedna
#03,odečítání
#31,zdvojení
#37,>0
#C0,st-mem-0
#00,skok-pravda
#04,na #37A1,ZPLUS
#02,výmaz
#38,konec výpočtu
y,y
2*y
2*y,2*y
4*y
4*y,4*y
4*y,ABS(4*y)
4*y,ABS(4*y),1
4*y,ABS(4*y)-1=z
4*y,z,z
4*y,z,(1/0)
Mem-0 obsahuje výsledek testu.
4*y,z
4*y,z
4*y
4*y=v (ad a)
Po provedení skoku pokračuj zde.
37A1
ZPLUS
37A8
YNEG
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
RET
#A1,stk-jedna
#03,odečítání
#01,záměna
#36,<0
#00,skok-pravda
#02,na #37A8,YNEG
#1B,negace
#38,konec výpočtu
4*y,z,1
4*x,z-1
z-1,4*y
z-1,(1/0)
z-1
z-1
1-z
1-z=v (ad b)
z-1=v (ad c)
FUNKCE "COS"
Doplněk #20: "cos"
Podprogram vrací poslední hodnotu jako aproximaci COS x. Používá výraz: COS x=SIN (PI*W/2), kde
-1 <= W <= 1.Při derivaci W podle x používá podprogram výsledek testu z předchozího podprogramu. Tento
je uložen v mem-0. Podprogram pokračuje skokem do podprogramu SINE v bodě C-ENT a vrací poslední
hodnotu COS x.
37AA
COS
RST
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
#28,FP-CALC
#39,get-argt
#2A,abs
#A1,stk-jedna
#03,odečítání
#E0,get-mem-0
#00,skok-pravda
#06,na #37B7,C-ENT
x
v
ABS
ABS
ABS
ABS
ABS
ABS
v
v,1
v-1
v-1,(1/0)
v-1
v-1 =W
Pokud nedošlo ke skoku, pokračuj zde.
DEFB
DEFB
DEFB
216
#1B,negace
#33,skok
#03,na #37B7,C-ENT
1-ABS v
1-ABS v
1-ABS v =W
Komentovaný výpis paměti ROM
FUNKCE "SINUS"
Doplněk #1F: "sin"
Podprogram je třetím ze čtyř, které používají podprogram
Čebyševových polynomů. Aproximace SIN x je nalezena následovně:
"SERIES
GENERATOR"
k
vytváření
a) Argument x je redukován a v tomto případe se provede přímo W=v. Povšiměte si, že -1 <= W <= 1
(pro konvergenci řady).
b) Je vytvořen argument Z, takový, že Z=2*W*W-1.
C) Použije se "SERIES GENERATOR" k získání (SIN (PI*W/2))/W.
d) Konečně prostým násobením se získá hodnota SIN x.
37B5
SIN
RST
Proveď krok a).
DEFB
#28 FP-CALC
x
#39,get-argt
W
#31,zdvojení
#31,zdvojení
#04,násobení
#31,zdvojení
#0F,sčítání
#A1,stk-jedna
#03,odečítání
W,W
W,W,W
W,W*W
W,W*W,W*W
W,2*W*W
W,2*W*W,1
W,2*W*W-1 =Z
#86,série-06
#14,exponent #64
#E6,(#00,#00,#00)
#5C,exponent #6C
#1F,#0B,(#00,#00)
#A3,exponent #73
#8F,#38,#EE,(#00)
#E9,exponent #79
#15,#63,#BB,#23
#EE,exponent #7E
#92,#0D,#CD,#ED
#F1,exponent #81
#23,#5D,#1B,#EA
W,Z
Proveď krok b).
37B7
C-ENT
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
Proveď krok c).
1.
2.
3.
4.
5.
6.
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
Po posledním průchodu smyčkou je poslední hodnota (SIN(PI*W/2))/W.
DEFB
DEFB
RET
#04,násobení
SIN (PI*W/2)=SIN x (nebo COS x)
#38,konec výpočtu
Poslední hodnota na zásobníku kalkulátoru je SIN x (nebo COS x).
FUNKCE "TAN"
Doplněk #21: "tan"
Podprogram vrací poslední hodnotu SIN x/COS x s aritmetickým přetečením, je-li COS x=0.
37DA
TAN
RST
DEFB
DEFB
DEFB
DEFB
#28,FP-CALC
#31,zdvojení
#1F,sin
#01,záměna
#20,cos
Komentovaný výpis paměti ROM
x
x,x
x,SIN x
SIN x,x
SIN x,COS x
217
DEFB #05,dělení
DEFB #38,konec výpočtu
RET
Je-li to potřeba, ohlaš aritmetické přetečení.
TAN x
Poslední hodnota na zásobníku kalkulátoru je TAN X.
FUNKCE "ARCTAN"
Doplněk #24: "atn"
Podprogram je posledním ze čtyř, které používají podprogram "SERIES GENERATOR“ k vytváření
Čebyševových polynomů. Podprogram vrací reálné číslo mezi –PI/2 a PI/2, které se rovná hodnotě v
radianech úhlu, jehož TAN je x. Aproximace ATN x je nalezena takto:
Hodnoty W a Y jsou nalezeny
a1) Jestliže -1 < x < 1 pak
a2) Jestliže 1 <=x
pak
a1) Jestliže
x<=-1 pak
pro tyto
W=0
W=PI/2
W=-PI/2
tři případy hodnoty x a argument Z je
& Y=x
b1) argument Z=2*Y*Y-1
& Y=-1/x
b2) argument Z=2*Y*Y-1
& Y=-1/x
b3) argument Z=2*Y*Y-1
pak formován takto:
=2*x*x-1
=2/(x*x)-1
=2/(x*x)-1
Ve všech případech musí být splněna podmínka pro konvergenci řad y: -1 <= Y <= 1.
c) Použije se "SERIES GENERATOR" k získání požadované funkce.
d) Konečně prostým násobením a sčítáním se získá hodnota ATN x.
Proveď krok a).
37E2
ATN
37F8
SMALL
CALL
LD
CP
JR
RST
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
RST
DEFB
#3297,RE-STACK
A,(HL)
#81
C,#37F8,SMALL
#28,FP-CALC
#A1,stk-jedna
#1B,negace
#01,záměna
#05,dělení
#31,zdvojení
#36,<0
#A3,stk-pi/2
#01,záměna
#00,skok-pravda
#06,na #37FA,CASES
#1B,negace
#33,skok
#03,na #37FA,CASES
#28,FP-CALC
#A0,stk-nula
Použij FP formu x.
Vyzvedni exponent x.
Jestliže x=Y
skoč dopředu v případě 1.
x
x,1
x,-1
-1,x
-1/x
-1/x,-1/x
-1/x,(1/0)
-1/x,(1/0),PI/2
-1/x,PI/2,(1/0)
-1/x,PI/2
Skok vpřed v případě 2.
-1/x,-PI/2
#01,záměna
#31,zdvojení
#31,zdvojení
#04,násobení
#31,zdvojení
#0F,sčítání
#A1,stk-jedna
#03,odečítání
W,Y
W,Y,Y
W,Y,Y,Y
W,Y,Y*Y
W,Y,Y*Y,Y*Y
W,Y,2*Y*Y
W,Y,2*Y*Y,1
W,Y,2*Y*Y-1=Z
Skok vpřed v případě 3.
Y
Y,0
Proveď krok b).
37FA
CASES
1.
218
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB #8C,série-0C
DEFB #10,exponent #60
DEFB #B2,(#00,#00,#00)
W,Y,Z
Komentovaný výpis paměti ROM
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
#13,exponent #63
#0E,(#00,#00,#00)
#55,exponent #65
#E4,#8D,(#00,#00)
#58,exponent #68
#39,#BC,(#00,#00)
#5B,exponent #6B
#98,#FD,(#00,#00)
#9E,exponent #6E
#00,#36,#75,(#00)
#A0,exponent #70
#DB,#E8,#B4,(#00)
#63,exponent #73
#42,#C4,(#00,#00)
#E6,exponent #76
#B5,#09,#36,#BE
#E9,exponent #79
#36,#73,#1B,#5D
#EC,exponent #7C
#D8,#DE,#63,#BE
#F0,exponent #80
#61,#A1,#B3,#0C
Po posledním průchodu smyčkou je poslední hodnota:
1.) ATN X/X
2.) ATN (-1/X)/(-1/X)
3.) ATN(-1/X)/(-1/X)
Proveď krok d).
DEFB #04,násobení
DEFB #0F,sčítání
DEFB #38,konec výpočtu
RET
1.) W,ATN X
ATN X
2.) W,ATN(-1/X)
3.) W,ATN(-1/X)
Poslední hodnota na zásobníku kalkulátoru je ATN X.
FUNKCE "ARCSIN"
Doplněk #22: "asn"
Podprogram vrací reálné číslo mezi -PI/2 a PI/2, které se rovní hodnotě úhlu v rad,jehož SIN je
x. Jestliže y=ASN x, potom x=SIN y. Podprogram používá trigonometrickou identitu:
TAN (y/2)=SIN y/1*(1+COS y)
3833
ASN
RST
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
RET
#28,FP-CALC
#31,zdvojení
#31, "
#04,násobení
#A1,stk-jedna
#03,odčítání
#1B,negace
#28,sqr
#A1,stk-jedna
#0F,sčítání
#05,dělení
#24,atn
#31,zdvojení
#0F,sčítání
#38,konec výpočtu
x
x,x
x,x,x
x,x*x
x,x*x,1
x,x*x-1
x,1-x*x
x,SQR(1-x*x)
x,SQR(1-x*x),1
x,1+SQR(1-x*x)
x/(1+SQR(1-x*x)) =TAN(y/2)
y/2
y/2,y/2
y=ASN x
Komentovaný výpis paměti ROM
219
Poslední hodnota na zásobníku kalkulátoru je ASN x.
FUNKCE "ARCCOS"
Doplněk #23: "acs"
Podprogram provede ACS x a vrací reálné číslo od 0 do PI včetně, které je rovno velikosti úhlu
v rad, jehož COS je x. Podprogram používá vztah: ACS x = PI/2 - ASN x.
3843
ACS
RST
DEFB
DEFB
DEFN
DEFB
DEFB
RET
#28,FP-CALC
#22,asn
#A3,stk-pi/2
#03,odčítání
#1B,negace
#38,konec výpočtu
x
ASN x
ASN x,PI/2
ASN x-PI/2
PI/2-ASN x=ACS x
FUNKCE "SQUARE ROOT" (=druhá odmocnina)
Doplněk #28: "sqr"
Podprogram provede SQR x a vrací kladnou druhou odmocninu reál. čísla x, je-li x kladné a nulu,
je-li x nula. Záporné x vyvolá chybové hlášení A-Invalid argument (v podpr.EXPONEBTETION). Podprogram
provádí SQR jako x^0.5 a proto po uložení konstanty 0.5 pokračuje přímo podprogram EXPONENTATION.
384A
SQR
RST
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
#28,FP-CALC
#31,zdvojení
#30,not
#00,skok-pravda
#1E,na #386C,LAST
#A2,stk-polovina
#38,konec výpočtu
x
x,x
x,(1/0)
x
x
x,.5
OPERACE "EXPONENTATION"
Doplněk #06: "to-power"
Podprogram provádí binární operaci x na y, kterou považuje za ekvivalentní EXP (Y * LN
x).
Pokud x=0, výsledek je 1 pokud y=0 (0^0=1), vrací 0 když je y kladné. Při záporném y je hlášena chyba.
3851
TO-POWER
RST
DEFB
DEFB
DEFB
DEFB
DEFB
#28,FP-CALC
#01,záměna
#31,zdvojení
#30,not
#00,skok-pravda
#07,na #385D,XIS0
x,y
y,x
y,x,x
y,x,(1/0)
y,x
y,x
Je-li x=0, provede se skok.
DEFB
DEFB
DEFB
JP
#25,ln
#04,násobení
#38,konec výpočtu
#36C4,EXP
y,LN x (pro x<0 chybové hlášení)
y*LN x
Zde se posoudí 3 případy pro nulové x.
385D
220
XIS0
DEFB #02,výmaz
DEFB #31,zdvojení
DEFB #30,not
y
y,y
y,(1/0)
Komentovaný výpis paměti ROM
DEFB #00,skok-pravda
DEFB #09,na #386A,ONE
y
y
Skoč je-li x=0 a y=0.
DEFB
DEFB
DEFB
DEFB
DEFB
#A0,stk-nula
#01,záměna
#37,>0
#00,skok-pravda
#06,na #386C,LAST
y,0
0,y
0,(1/0)
0
Skoč je-li x=0 a y kladné.
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
RET
#A1,stk-jedna
#01,záměna
#05,dělení
#02,výmaz
#A1,stk-jedna
#38,konec výpočtu
0,1
1,0
Dělení nulou-chyba.
386E ..... 3CFF
DEFB
#FF,#FF,......
ROM Spectrum 48 nevyužívá
3D00 až 3FFF
DEFB matice znakového souboru ASCII #20-#7F.
386A
ONE
386C
LAST
1
Př. písmeno "A" je zde uloženo takto:
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
DEFB
#00
#3C
#42
#42
#7E
#42
#42
#00
00000000
00111100
01000010
01000010
01111110
01000010
01000010
00000000
Komentovaný výpis paměti ROM
221
Přehled systémových proměnných:
Písmena ve sloupci Pozn. mají následující význam:
X Pokud změníte obsah této proměnné, systém se může zhroutit.
M Změnou hodnoty této proměnné nezískáte žádný efekt.
Číslice ve sloupci Pozn. udávají velikost proměnné v bajtech.
Ve sloupci Obsah je uvedena hodnota proměnné po zapnutí počítače. Pokud není hodnota
uvedena, nemá tato proměnná po zapnutí rozumný obsah.
Pozn.
N8
N1
1
1
N2
N1
N2
X38
2
1
1
1
X1
X2
N2
N1
2
1
2
1
1
2
X2
N2
X2
X2
X2
X2
X2
X2
2
X2
2
X2
X2
X2
N1
N2
1
X1
2
2
1
222
Adresa
5C00
5C08
5C09
5C0A
5C0B
5C0D
5C0F
5C10
5C36
5C38
5C39
5C3A
5C3B
5C3D
5C3F
5C41
5C42
5C44
5C45
5C47
5C48
5C49
5C4B
5C4D
5C4F
5C51
5C53
5C55
5C57
5C59
5C5B
5C5D
5C5F
5C61
5C63
5C65
5C67
5C68
5C6A
5C6B
5C6C
5C6E
5C70
23552
23560
23561
23562
23563
23565
23566
23568
23606
23608
23609
23610
23611
23613
23615
23617
23618
23620
23621
23623
23624
23625
23627
23629
23631
23633
23635
23637
23639
23641
23643
23645
23647
23649
23651
23653
23655
23656
23658
23659
23660
23662
23664
Jméno
Obsah
Význam
KSTATE
LAST K
REPDEL
REPPER
DEFADD
K DATA
TVDATA
STRMS
CHARS
RASP
PIP
ERR NR
FLAGS
ERR SP
LISTSP
MODE
NEWPPC
NSPPC
PPC
SUBPPC
BORDCR
E PPC
VARS
DEST
CHANS
CURCHL
PROG
NXTLIN
DATADD
E LINE
K CUR
CH ADD
X PTR
WORKSP
STKBOT
STKEND
BREG
MEM
FLAGS2
DF SZ
S TOP
OLDPPC
OSPPC
DEFS
DEFB
DEFB
DEFB
DEFW
DEFB
DEFB
DEFS
DEFW
DEFB
DEFB
DEFB
DEFS
DEFW
DEFW
DEFB
DEFS
DEFS
DEFS
DEFS
DEFB
DEFS
DEFW
DEFS
DEFW
DEFW
DEFW
DEFS
DEFS
DEFW
DEFS
DEFS
DEFS
DEFW
DEFW
DEFW
DEFS
DEFW
DEFS
DEFB
DEFS
DEFS
DEFS
Pracovní místo je využíváno při čtení kláves.
Zde je uložen kód naposledy stisknuté klávesy.
Čas (v 1/50 sekundy), po kterém se začne klávesa opakovat,
Čas (v 1/50 sekundy), mezi opakováním kláves.
Adresa argumentu uživatelské funkce.
Druhý bajt řízení barev (vložený z klávesnice).
Bajty barvy, AT a TAB při výstupu na obrazovku.
Adresy kanálů.
Adresa generátoru znaků zmenšená o 256.
Délka varovného bzučáku.
Délka pípnutí klávesnice.
O jednu méně než číslo hlášení (chyby).
Různé příznaky pro řízení systému BASIC.
Adresa položky na zásobníku, která se používá při chybě.
Adresa návratu z automatického výpisu programu.
Určuje režim kurzoru (K, L, C, E nebo G).
Číslo řádky, na kterou se má skočit.
Číslo přikážu v řádce určené NEWPPC,
Číslo řádky, která se právě vykonává.
Číslo právě vykonávaného příkazu.
Barva pozadí*8; dále obsahuje atributy pro dolní část obr.
Číslo aktivní řádky (ta na které je kurzor).
Adresa začátku proměnných.
Adresa proměnné, do které se přiřazuje.
Adresa, kde jsou uložené informace o kanálech.
Adresa kanálu, který používán pro vstup a výstup.
Adresa začátku programu v BASICu.
Adresa další řádky v programu.
Adresa ukončení poslední položky v příkazu DATA.
Adresa právě napsaného příkazu.
Adresa kurzoru.
Adresa znaku, který se bude interpretovat.
Adresa výskytu syntaktické chyby (t.j. před znakem ?).
Adresa dočasné pracovní paměti.
Adresa dna zásobníku kalkulátoru.
Adresa vrcholu zásobníku a začátek volné paměti.
Registr b kalkulátoru.
Adresa pamětí kalkulátoru.
Další příznaky.
Počet řádek v dolní oblasti obrazovky (editační řádek).
Počet řádek při automatickém výpisu programu.
Číslo řádky, na kterou skočí příkaz CONTINUE.
Číslo příkazu, na který skočí příkaz CONTINUE.
8
0
35
5
0
0
0,0
2*28
#3C00
64
0
255
1
#FF54
#FF54
0
2
2
2
2
%00111000
2
#5CCB
2
#5CB6
#5CBB
#5CCB
2
2
#5CCC
2
2
2
#5D08
#5D08
#5D08
1
#5C92
1
2
2
2
1
Komentovaný výpis paměti ROM
N1
N2
N2
2
3
2
1
1
1
1
1
2
2
2
X1
X1
X1
X1
1
1
1
N1
N1
1
N30
2
2
2
5C71
5C72
5C74
5C76
5C78
5C7B
5C7D
5C7E
5C7F
5C80
5C81
5C82
5C84
5C86
5C88
5C89
5C8A
5C8B
5C8C
5C8D
5C8E
5C8F
5C90
5C91
5C92
5CB0
5CB2
5CB4
23665
23666
23668
23670
23672
23675
23677
23678
23679
23680
23681
23682
23684
23686
23688
23689
23690
23691
23692
23693
23694
23695
23696
23697
23698
23728
23730
23732
FLAGX
STRLEN
T ADDR
SEED
FRAMES
UDG
COORDS
P POSN
PR CC
ECHO E
DF CC
DFCCL
S POSN
SPOSNL
SCR CT
ATTR P
MASK P
ATTR T
MASK T
P FLAG
MEMBOT
NMI
RAMTOP
P-RAMT
DEFS
DEFS
DEFS
DEFW
DEFS
DEFW
DEFS
DEFS
DEFS
DEFS
DEFS
DEFW
DEFS
DEFS
DEFS
DEFS
DEFS
DEFB
DEFS
DEFB
DEFB
DEFB
DBEF
DEFS
DEFS
DEFS
DEFW
DEFW
1
2
2
0
3
#FF58
1
1
1
1
1
23*256+33
2
2
1
1
1
23
1
%00111000
0
%00111000
0
1
30
2
#FF57
#FFFF
Různé příznaky.
Délka pravé vyhodnocovaného řetězce (před přiřazením).
Adresa další položky v tabulce syntaxe.
Násada pro generování náhodných čísel.
Čítač snímků. Je zvětšen každých 20ms.
Adresa prvního uživatelsky definovaného znaku.
Souřadnice x posledně vykresleného bodu.
Souřadnice y posledně vykresleného bodu.
Pozice tisku na ZX-Printer.
Dolní bajt adresy bajtu při výstupu řádky na ZX-Printer
Není využito.
Adresa ve spodní části obr., za kterou nelze dát kurzor
Adresa výstupu znaku na obrazovku.
Jako DF CC, ale pro dolní část obrazovky.
Pozice sloupce pro výstup znaku příkazem PRINT.
Pozice řádky pro výstup znaku příkazem PRINT.
Jako S POSN, ale pro dolní část obrazovky.
Pozice řádky jako S POSN, ale pro dolní část obrazovky.
Počet řádků+1, po jejichž vypsání se výpis zastaví.
Nastavené barvy.
Příznak transparentních barev.
Dočasně platné barvy.
Jako MASK P, ale dočasné.
Další příznaky.
Oblast vyhrazená pro kalkulátor.
Používá podprogram pro obsluhu NMI.
Adresa posledního bajtu, který používá BASIC.
Adresa posledního bajtu fyzické paměti.
Komentovaný výpis paměti ROM
223
REJSTŘÍK
ÚVOD . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
PODPROGRAMY
0000
0008
0010
0018
0020
0028
0030
0038
0053
0066
0074
007D
RESTARTŮ A
START . .
ERROR-1 .
PRINT-A-1
SET-CHAR .
NEXT-CHAR
FP-CALC .
BC-SPACES
MASK-INT .
ERROR-2 .
RESET . .
CH-ADD+1 .
SKIP-OVER
TABULKY
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
7
7
7
7
7
7
7
8
8
8
8
9
9
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
12
12
13
14
14
15
PODPROGRAMY PRO OVLÁDÁNÍ REPRODUKTORU . . . . . . . . . .
03B5 BEEPER . . . . . . . . . . . . . . . . . . . .
03FB BEEP . . . . . . . . . . . . . . . . . . . . .
18
18
19
PODPROGRAMY
04C2
053F
0556
05E3
0605
07CB
0802
0808
08B6
092C
0970
SAVE - LOAD
SA-BYTES . .
SA/LD-RET .
LD-BYTES . .
LD-EDGE-2 .
SAVE-ETC . .
VR-CONTRL .
LD-BLOCK . .
LD-CONTRL .
ME-CONTRL .
ME-ENTER . .
SA-CONTRL .
PODPROGRAMY
09F4
0A23
0A3D
0A4F
0A5F
0A69
0A6D
0AD9
0ADC
OB03
0B24
0B7F
0BDB
0C0A
OBSLUHUJÍCÍ TISK
PRINT-OUT . . .
PO-BACK-1 . . .
PO-RIGHT . . . .
PO-ENTER . . . .
PO-COMMA . . . .
PO-QUEST . . . .
PO-TV-2 . . . .
PO-ABLE . . . .
PO-STORE . . . .
PO-FETCH . . . .
PO-ANY . . . . .
PR-ALL . . . . .
PO-ATTR . . . .
PO-MSG . . . . .
KLÁVESNICOVÉ PODPROGRAMY
028E KEY-SCAN . .
02BF KEYBOARD . .
0310 K-REPEAT . .
031E K-TEST . . .
0333 K-DECODE . .
224
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
VERIFY
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
22
22
24
24
26
27
32
33
33
35
37
38
NA OBRAZOVKU A TISKÁRNU
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
40
40
40
41
41
41
41
41
43
43
43
43
44
46
46
Komentovaný výpis paměti ROM
0C3B
0C41
0C55
0D4D
0D6B
0DAF
0DD9
0DFE
0E44
0E88
0E9B
0EAC
0ECD
0EDF
0EF4
PO-SAVE .
PO-SEARCH
PO-SCR . .
TEMPS . .
CLS . . .
CL-ALL . .
CL-SET . .
CL-SC-ALL
CL-LINE .
CL-ATTR .
CL-ADDR .
COPY . . .
COPY-BUFF
CLEAR-PRB
COPY-LINE
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
47
47
48
50
51
52
52
53
54
55
55
56
56
57
57
EDITORU .
EDITOR . .
ADD-CHAR .
ED-EDIT .
ED-DOWN .
ED-LEFT .
ED-RIGT .
ED-DELETE
ED-IGNORE
ED-ENTER .
ED-EDGE .
ED-UP . .
ED-SYMBOL
ED-ERROR .
SLEAR-SP .
KEY-INPUT
ED-COPY .
SET-HL . .
REMOVE-FP
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
59
59
60
60
61
61
61
62
62
62
62
63
63
63
64
64
65
67
67
PROVÁDĚCÍ PODPROGRAMY
11B7 NEW . . .
12A2 MAIN-EXEC
155D MAIN-ADD .
15D4 WAIT-KEY .
15E6 INPUT-AD .
15EF OUT-CODE .
1601 CHAN-OPEN
1615 CHAN-FLAG
1634 CHAN-K . .
1642 CHAN-S . .
164D CHAN-P . .
1652 ONE-SPACE
1664 POINTERS .
168F LINE-ZERO
169E RESRVE . .
16B0 SET-MIN .
16D4 REC-EDIT .
16DB INDEXER-1
16E5 CLOSE . .
1701 CLOSE-2 .
171C CLOSE-STR
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
68
68
70
73
74
75
75
75
76
76
76
76
77
77
78
78
79
79
79
79
80
80
PODPROGRAMY
0F2C
0F81
0FA9
0FF3
1007
100C
1015
101E
1024
1031
1059
1076
107F
1097
10A8
111D
1190
11A7
Komentovaný výpis paměti ROM
225
171E
1736
175D
1781
1785
1789
1793
1795
17F5
17F9
1855
18B6
18C1
18E1
190F
1925
196E
1980
198B
19B9
19DD
19E5
19FB
1A1B
STR-DATA .
OPEN . . .
OPEN-2 . .
OPEN-K . .
OPEN-S . .
OPEN-P . .
CAT-ETC .
AUTO-LIST
LLIST . .
LIST . . .
OUT-LINE .
NUMBER . .
OUT-FLASH
OUT-CURS .
LN-FETCH .
OUT-SP-2 .
LIN-ADDR .
CP-LINES .
EACH-STMT
NEXT-ONE .
DIFFER . .
RECLAIM-1
E-LINE-NO
OUT-NUM-1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
80
81
81
82
82
82
83
83
84
84
85
86
86
86
87
87
88
89
89
90
90
90
91
91
INTERPRETACE PŘÍKAZŮ V
1B17 LINE-SCAN
1B28 STMT-LOOP
1B6F SEPARATOR
1B76 STMT-RET .
1B8A LINE-RUN .
1B9E LINE-NEW .
1BB2 REM . . .
1BB3 LINE-END .
1BBF LINE-USE .
1BD1 NEXT-LINE
1BEE CHECK-END
1BF4 STMT-NEXT
1C0D CLASS-03 .
1C10 CLASS-00 .
1C16 JUMP-C-R .
1C1F CLASS-01 .
1C22 VAR-A-1 .
1C56 VAL-FET-1
1C6C CLASS-04 .
1C79 NEXT-2NUM
1C96 PERMS . .
1CBE CLASS-09 .
1CDB CLASS-0B .
1CDE FETCH-NUM
BASICOVÉM
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
ŘÁDKU
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
93
96
96
97
97
97
98
98
98
98
99
99
99
100
100
100
100
100
101
101
102
102
103
103
103
PŘÍKAZOVÉ PODPROGRAMY
1CEE STOP . . .
1CF0 IF . . . .
1D03 FOR . . .
1D86 LOOK-PROG
1DAB NEXT . . .
1DDA NEXT-LOOP
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
104
104
104
104
106
107
108
226
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Komentovaný výpis paměti ROM
1DED
1E27
1E39
1E42
1E4F
1E5F
1E67
1E7A
1E80
1E85
1E94
1EA1
1EAC
1EED
1F05
1F1A
1F23
1F3A
1F54
1F60
1FC3
1FC9
1FCD
1FF5
1FFC
2045
204E
2070
2089
21B9
21D0
21D6
21E1
226C
2294
22AA
22CB
22DC
2307
2314
2320
2382
247D
24B7
READ . . .
DATA . . .
PASS-BY .
RESTORE .
RANDOMIZE
CONTINUE .
GO-TO . .
OUT . . .
POKE . . .
TWO-PARAM
FIND-INT1
RUN . . .
CLEAR . .
GO-SUB . .
TEST-ROOM
FREE-MEM .
RETURN . .
PAUSE . .
BREAK-KEY
DEF-FN . .
UNSTACK-Z
LPRINT . .
PRINT . .
PRINT-CR .
PR-ITEM-1
PR-END-Z .
PR-POSN-1
STR-ALTER
INPUT . .
IN-ASIGN .
IN-STOP .
IN-CHAN-K
CO-TEMP-1
CO-CHANGE
BORDER . .
PIXEL-ADD
POINT-SUB
PLOT . . .
STK-TO-BC
STK-TO-A .
CIRCLE . .
DRAW . . .
CD-PRMS-1
DRAW-LINE
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
108
109
109
109
109
110
110
110
110
110
111
111
111
112
112
112
113
113
113
114
115
115
115
115
116
117
117
117
117
120
120
120
121
123
123
124
124
125
125
125
126
128
132
133
HODNOCENÍ VÝRAZŮ . . .
24FB SCANNING .
2530 SYNTAX-Z .
25AF S-U-PLUS .
25B3 S-QUOTE .
25E8 S-BRACKET
25F8 S-RND . .
2627 S-PI . . .
2634 S-INKEY$ .
2668 S-SCREEN$
2672 S-ATTR . .
267B S-POINT .
26C9 S-LETTER .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
135
135
136
138
138
138
139
139
139
140
140
140
141
Komentovaný výpis paměti ROM
227
27BD
28AB
28B2
2951
2996
2A52
2AB6
2ACC
2AEE
2AF4
2AFF
2BA6
2BAF
2BC6
2BEA
2BF1
2C02
2C88
2C8D
2C9B
2D1B
2D22
2D28
2D2B
2D3B
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
145
147
148
151
152
155
156
156
157
157
158
161
161
162
162
162
163
165
165
165
167
167
167
167
168
PODRPOGRAMY
E-TO-FP . .
INT-FETCH .
P-INT-STO .
FP-TO-BC . .
LOG(2^A) . .
FP-TO-A . .
PRINT-FP . .
CA=10*A+C .
PREP-ADD . .
FETCH-TWO .
SHIFT-FP . .
ADD-BACK . .
SUBTRACT . .
ADDITION . .
HL=HL*DE . .
PREP-M/D . .
MULTIPLY . .
DIVISION . .
TRUNCATE . .
RE-ST-TWO .
RE-STACK . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
169
169
170
170
171
171
172
172
178
178
179
180
180
181
181
183
184
184
188
189
191
191
FLOATING POINT KALKULÁTOR
335B CALCULATE . .
33A2 FP-CALC-2 . .
33A9 TEST-5-SP . .
33C0 MOVE-FP . . .
33C6 STK-DATA . . .
33F7 SKIP-CONS . .
3406 LOC-MEM . . .
340F GET-MEM-0 . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
193
194
196
196
196
197
197
198
198
ARITMETICKÉ
2D4F
2D7F
2D8C
2DA2
2DC1
2DD5
2DE3
2F8B
2F9B
2FBA
2FDD
3004
300F
3014
30A9
30C0
30CA
31AF
3214
3293
3297
228
S-FN-SBRN
FN-SKPOVR
LOOK-VARS
STK-F-ARG
STK-VAR .
SLICING .
STK-STORE
INT-EXP1 .
DE,(DE+1)
GET-HL*DE
LET . . .
L-ENTER .
L-ADD$ . .
L-STRING .
L-FIRST .
STK-FETCH
DIM . . .
ALPHANUM .
ALPHA . .
DEC-TO-FP
NUMERIC .
STK-DIGIT
STACK-A .
STACK-BC .
INT-TO-FP
Komentovaný výpis paměti ROM
341B
342D
343C
3449
346A
346E
3492
34A5
34AC
34B3
34BC
34E9
34F9
3501
3506
350B
351B
3524
352D
353B
359C
35BF
35C9
35DE
361F
3645
3669
3674
367A
3686
368F
369B
36A0
36AF
36C4
3713
3783
37AA
37B5
37DA
37E2
3833
3843
384A
3851
STK-ZERO .
ST-MEM-0 .
EXCHANGE .
SERIES-06
ABS . . .
NEGATE . .
SGN . . .
IN . . . .
PEEK . . .
USR-NO . .
USR-$ . .
TEST-ZERO
GREATER-0
NOT . . .
LESS-0 . .
FP-0/1 . .
OR . . . .
NO-&-NO .
STR-&-NO .
NO-L-EQL .
STRS-ADD .
STK-PNTRS
CHRS . . .
VAL . . .
STR$ . . .
READ-IN .
CODE . . .
LEN . . .
DEC-JR-NZ
JUMP . . .
JUMP-TRUE
END-CALC .
N-MOD-M .
INT . . .
EXP . . .
LN . . . .
GET-ARGT .
COS . . .
SIN . . .
TAN . . .
ATN . . .
ASN . . .
ACS . . .
SQR . . .
TO-POWER .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
198
199
199
200
201
201
202
202
202
202
203
203
204
204
204
204
205
205
205
205
207
207
207
208
209
209
209
210
210
210
210
211
211
211
212
213
215
216
217
217
218
219
220
220
220
Přehled systémových proměnných . . . . . . . . . . . . . .
222
REJSTŘÍK . . . . . . . . . . . . . . . . . . . . . . . . .
224
Komentovaný výpis paměti ROM
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
229
Elektronická verzia: 28.12.2008
Peter Turányi alias Softhouse
http://softhouse.speccy.cz
Ďakujem
Lukášovi Macurovi za pomoc s OCR a korektúrami
Zdeňkovi Starému za skeny

Podobné dokumenty

Rekonstrukce dětského hřiště Brázdim

Rekonstrukce dětského hřiště Brázdim k přidání do zemrny na ze-|en(ippgly do vrchni VrStVy - cca 3 cm ROUNDUP KLASTK trerOicia totatni poTlii66 Přesun hmot pro sadovnické;Tanlúpravy do slrm

Více

Spectrum 2/90

Spectrum 2/90 REM N návrat z chybového hlášení do normálního stavu. Musí být provedeno před návratem do BASICu. REM O,a,n, takto se simuluje BASICová funkce "OnnGOTO" Musí být pouze jednoduchá proměnná a je-li v...

Více

Technický manuál

Technický manuál diskety firmy ELSACO Kolín a ři\te se pokyny, které jsou uvedeny v textovém souboru CTIMNE.TXT na této disketě. Dále pak pokyny na obrazovce monitoru vašeho PC. Instalace se provádí běžně z DOSu, a...

Více

D-Writer

D-Writer mezi dvě slova, řádky a odstavce. Můžete také rozdělit řádku na dvě tak, že umístíte kurzor doprostřed řádky a ENTER. Druhá část řádky (vpravo od kurzoru) se následující

Více

Zde - ZX Magazín

Zde - ZX Magazín nesmyslně na INT, ani RFSH není použit pro refresh paměti (ta si ho musí zajišťovat sama) a je zapojen do tvorby obrazu. Jen při refresh cyklu může totiž A6 přerušení vyvolat. V dolním bajtu adreso...

Více

转基因商业化骤然加速 俞桑丽

转基因商业化骤然加速  俞桑丽 +¸CQC6,!34)*„l` *!% "â } ,''* # G u ‚ !8 W v GwNc6Ixy!ÖdN]3 £ k œ ¸ O #z { Ô ô #Œ | P Q £0)12# .Ӝ}œ¸O#~ k ~  #~ ¼ #[ € à ¬ ä g + „ l" Øê›^`‚q˜åg¢! }¢Æ () ƒC6,!,"& <&>( 01l!Îêøkœ¸Oäg+ 6EFx!iåq_...

Více

Pulsn. vstupy - Jet Service sro

Pulsn. vstupy - Jet Service sro V kapitole 7 je uveden seznam dat (hodnotových klíčů) pro TC-9/K v tabulkové formě. Text je zobrazován pro určitá data za účelem zlepšení čitelnosti displeje. V tomto případě, fyzikální symbol (nap...

Více

Komentovaný výpis ROM – Znakový generátor (Odehnal, Veverka)

Komentovaný výpis ROM – Znakový generátor (Odehnal, Veverka) obálka: ak.mal. Karel Čapek Vydalo (c) ZENITCENTRUM HZ ÚV SSM, Hostímská 1, 26601 Beroun jako součást souboru kursu základního programového vybaveni mikropočítače SHARP MZ 800. Samostatně neprodejn...

Více