erstellt am / farita je 1999-01-24


Kiel mem konstrui kompililon per la Esperanto-Programlingvo E


Antaŭrimarko: Mi origine planis fari tion kurson en la
"Forstwissenschaftliche Fakultät" en Freising kadre de la
unua Bavara studadsesio de la Akademio Internacia de San Marino
(AIS) en Oktobro 1988.
Pro familiaj kaŭzoj la kurso ne povis okazi. Tial mi nun
iom post iom publikigos la kurs-materialon en mia hejmpaĝo.

Informojn pri AIS vi povas atingi je
"http://www.forst.uni-muenchen.de/OTHERS/AIS"


ENHAVO
La komputilo - simpla modelo

- La lingvo de la komputilo - la maŝina lingvo
- Programoj kaj datenoj
- La programlingvo inter la natura lingvo kaj la maŝina lingvo
- La kompililo - programo por traduki programlingvon al maŝina lingvo


La Esperanto-programlingvo E

- Kelkaj ekzemploj


La strukturo de la E-kompililo

- La kerno
- La biblioteko (vortaro)


Konstruado de nova kompililo per E

Leciono 1
- Skribi fontotekston
- Prilabori fontotekston
Leciono 2
Leciono 3
Leciono 4
Leciono 5
Leciono 6
Leciono 7

La komputilo - simpla modelo


Antaŭ ni komencas konstrui kompililon, ni devas deklari kelkajn fundamentajn aferojn: Kiel funkcias komputilo? Kio estas la maŝina lingvo?
La bildo eble respondas tiujn demandojn. 
La bildo bezonas 26 K !
Simpla modelo de komputilo

 
Vi vidas simpligitan strukturon de komputilo konsistanta el procesilo kaj memoro. Por ke la komputilo povas labori ĝi bezonas programon en la memoro. 
Programo konsistas el pluraj instrukcioj kiuj priskribas, kion la komputilo devas fari. Tiuj priskriboj ne estas en homa lingvo, sed estas skribitaj en 
la tiel nomata maŝina lingvo ( do vico de nombroj inter 00000000 kaj
11111111 binare aŭ 0 kaj 255 decimale).
Sed tiun lingvon la maŝino (komputilo) "komprenas".
Kiam oni startas la komputilon, la procesilo metas startadreson en la
programmontrilon (en nia ekzemplo adreson 0000). La programmontrilo montras nun al la adreso 0000. La procesilo prenas
la enhavon de tio memorloko (00000000) kaj interpretas gin kiel instrukcio. 0000000 signifas en la masina lingvo "faru nenion".
La procesilo faras nenion kaj poste inkrementas la programmontrilon.
Ĝi montras nun al la adreso 0001 kaj la tuta afero ripetadas. Post kvar paŝoj la programmontrilo montras al la adreso 0100 (4).
Tie estas la instrukcio 10110000 (176). Tio instrukcio signifas :
"Prenu la sekvan bajton el la memoro kaj transportu gin al la A-registro". 
La sekva bajto estas 01000101 (69). kaj estas transportata al la akuo.
Poste la programmontrilo montras sur la adreso 0110 (6). Tio estas la situacio, kion la bildo montras.

Ĉu vi rimarkis ke la bajto 01000101 (69) estas io alia ol la 
instrukcio 10110000 (176)? 
01000101 estis dateno kiun la instrukcio 10110000 prilaboris. 
Do oni diferencas pri du fundamentaj tipoj de informoj: programoj kaj 
datenoj
Kiam la procesiloj povas plenumi la instrukcioj de la programoj, la datenoj
aliflanke tute ne havas sencon por ĝi. 
La sencon al la datenoj donas nur la homo kiam li difinas kodojn 
ĉu la datenoj estas literoj, tekstoj, bildoj aŭ voĉoj ktp.
En nia ekzemplo la dateno 01000101 estas la ASCII-kodo por la litero "E".    

La maŝina lingvo estas tre abstrakta por homoj - sed tamen ĝi estas la
sola lingvo kiun la komputilo komprenas!

Anstataŭ programi

00000000 00000000 0000000 00000000 10110000 01000101

estus pli bone se ni povus skribi:

Faru certan tempon nenion kaj poste transportu la literon E al la akuo!

La solvo de la problemo estas la programlingvo, kio estas unuflanke sufiĉe proksime al la homa lingvo kaj kio estas aliflanke formale, ke programo povas aŭtomate traduki tion lingvon en maŝinan lingvon. La programon kiu tradukas fontotekston de la formala programlingvo al ma%#254;inan kodon oni nomas kompililo. La formala programlingvo en tio kurso estas la lingvo E. Unu el la fundamentaj konceptoj de tio lingvo estas ke oni povas anstataŭi pecon da maŝina lingvo per vorto en natura lingvo. Do la suba maŭina kodo povus esti skribita en E:

faru-nenion faru-nenion faru-nenion faru-nenion A= "E"

Vi vidas ke tio priskribo de la programada problemo estas nun sufiĉe homeca - tamen ankoraŭ relative proksima al la maŝina lingvo! En E estas 10 instrukcioj kiuj rilatas rekte al maŝina kodo: A= A<- A-> A+ A- IRU IR0 IRT IRS kaj RE Detalajn priskribojn vi trovas en la ĉapitro: "La Esperanto-programlingvo E koncize" Ĝis nun mi ne priskribis kiel komputilo komunikas kun la ekstera mondo. Tion vi vidas en la sekva bildo.
La bildo bezonas 26 K !
Simpla modelo de PC, BIOS kaj mastruma sistemo



Komputilo konsistas kutime el la komputilo mem (procesilo + memoro), 
la klavaro por enigi informojn kaj la ekrano por eligi informojn.
Krome ekzistas disketilo (au dura disko) por stori permanente informojn.

Ĉar preskaŭ ĉiuj programoj bezonas en- kaj elig-procedurojn oni havas en la
PC-komputilo la tielnomata BIOS (baza enigo - eligo sistemo), tio estas
aro de programoj, kiujn aliaj programoj povas uzi. La uzo de BIOS ŝparas tempon.

Ofte en komputiloj ekzistas krom la "BIOS" sistemo de programoj kiuj 
superrigardas la aplikon de aliaj programoj, kaj permesas la kreadon,
en- eligadon, kopiadon kaj renomadon de dosierojn. Tion oni nomas
mastruma sistemo (angle: operating system). 
E estas ankaŭ mastruma sistemo.

Por la komunikado kun la klavaro, ekrano kaj disketiloj E uzas
la ordonojn EN EL EN-D kaj EL-D.

La Esperanto-programlingvo E


Detalajn priskribojn pri la Esperanto-programlingvo E vi trovas en
la capitroj "Enkonduko" kaj "La Esperanto-Programlingvo E koncize".

- Kelkaj ekzemploj


Kiel vi tie lernis E konsistas el vortoj kiujn oni povas uzi en difinoj de novaj vortoj ktp. Tio preskaŭ devigas nin difini unue la bazajn vortojn kaj fini per la lasta vorto. En la ekzemplo en la "Enkonduko" ni do unue difinis "eligu-E nova-linio 1E" kaj "4E" antaŭ ol ni difinis la ĉefprogramon "granda-E". Tio programstilo estas iomete kontraŭ la homa pensmaniero. Ni kutimas vidi problemojn unue ĝenerale kaj poste ni okupiĝas pri la detaloj. En E oni ankaŭ povas programi tiamaniere (de supre al malsupre - angle: top down). Ni supozu ke ni volas programi iun ĝeneralan ideon kaj ni scias ke tio konsistas el paŝo-A kaj paŝo-B. Sed pri detaloj pri paŝo-A kaj paŝo-B ni ankoraŭ ne pensis. Tamen ni volas vidi ĉu programo ĝenerala_ideo funkcias. Simple skribi D ĝenerala_ideo paŝo-A paŝo-B RE . ne funkcias, ĉar la kompililo nek konas paŝo-A nek paŝo-B. Tial ni skribu D paŝo-A A= 65 EL RE . D paŝo-B A= 66 EL RE . ( 65 kaj 66 estas ASCII-Kodoj por A kaj B ) D ĝenerala_ideo paŝo-A paŝo-B RE . Nun la programo funkcias kaj donas AB kiel rezulto. Ni povas nun trankvile trakti la problemojn paŝo-A kaj paŝo-B ĝis ni iras al la plej bazaj partoj de la programo.

La strukturo de la E-kompililo


La bildo bezonas 30 K !
Strukturo de E-kompililo



La bildo montras E-kompililon konsistante el la kerno, kaj la biblioteko
kun la vortoj D . kaj eligu-e .
La kerno enhavas diversajn subprogramojn, kiuj ebligas difini kaj apliki 
la vortojn en la biblioteko.
Ĉiuj vortoj estas ligitaj per ligadresoj. La ligadreso de la vorto D estas
0000. Tio montras, ke ĝi estas la unua vorto. La aliaj ligadresoj montras
al la antaŭa vorto.
(En kazo de la vorto eligu-e tio adreso estas  177*256+203=45515.)
Tiamaniere ĉiuj vortoj estas ligitaj kun la aliaj.
Post la ligadreso sekvas la vortnomo finita per la ascii-kodo 13. 
Tio desegnas la finon de la vortnomon. Post la vortnomo troviĝas la 
adreso de la kompiliga kodo de la vorto. 
Kiam oni uzas vorton en difino de nova vorto la kompililo saltas al la 
kodo al kio montras tio adreso.
(En kazo de la vorto eligu-e tio adreso estas  164*256+172=42156.) 
Poste sekvas la apliko-kodo. Tio kodo estas aplikata kiam oni tajpas 
la vortnomon. 
(En kazo de la vorto eligu-e tio kodo estas 176 69 180 14 205 16 203 
kiel en la difino. )  

Konstruado de nova kompililo per E



La bildo bezonas 13 K !
La ĉefa banto de la kompililo



Leciono 1

Nun ni vidis kiel komputilo funkcias, kio programlingvo kaj kompilio estas
kaj kiel la interna strukturo de E-kompililo estas.
Nun ni povas fine skribi la kompililon mem.

Sed por skribi ĝin ni bezonas alian e-kompililon!
Se vi ankoraŭ ne havas tion, vi ricevos en la ĉapitro:
"La E-kompililo kaj la mastruma sistemo E 0.9"

Por konstrui kompililon ni iras de la ĝeneralo al la detaloj kiel antaŭe priskribita:
Ĝenerale la kompililo estas programo kun banto kio havas du subprogramojn:
skribu_tekston kaj prilaboru_tekston.

Ni skribu la kvar fontotekstojn kaj storu ilin sur la spuroj 10, 17, 18 kaj 19:

( 10 E-kompililo leciono 1         enigu per EN-D 48 10 0 0 INIT EIN    ) 
EN-D 0 17 0 0   KOMPILU
EN-D 0 18 0 0   KOMPILU
EN-D 0 19 0 0   KOMPILU 
AUS 
FERMU 

( 17 )
D skribu_tekston    A= 83 EL RE . ( Eligas "S" por testi )
FERMU 

( 18 )
D prilaboru_tekston A= 80 EL RE . ( Eligas "P" por testi )
FERMU 

( 19 ) 
D e-kompililo LOKO 0  skribu_tekston prilaboru_tekston IRU ADR 0 . 
FERMU 

La tuton ni kompilu per:
EN-D 48 10 0 0 INIT EIN

La vorto e-kompililo donas nun senfine SPSPSPSPSPSPS .

Tio devas esti, ĉar la E-kompililo estas ja samtempe mastruma-sistemo,
kaj mastruman sistemon oni ne povas forlasi.
Sed por la konstruado de la kompililo ĝenas, ke ni ne povas fini la
programon.

Tial ni aldonu sekvan linion:

( 19 )
D e-kompililo LOKO 0 skribu_tekston prilaboru_tekston IRU ADR 0 .
D e-kompililo        skribu_tekston prilaboru_tekston RE        . 
FERMU  

Post rekompilado la nova vorto e-kompililo donas nur unufoje SP.

Tio estis la unua leciono
Se vi ne ŝatas tajpi mem la fontotekstojn vi povas alŝuti la
mem-malpakantan dosieron     lec-001.exe (3K)
(Startu poste dosieron 1.bat !)
La bildo bezonas 14 K !
Skribu tekston



Leciono 2


Ni skribu la kvin fontotekstojn kaj storu ilin sur la spuroj 10, 16, 17, 
18 kaj 19. Poste ni kompilu la tuton per EN-D 48 10 0 0 INIT EIN .

( 10 E-kompililo leciono 2         enigu per EN-D 48 10 0 0 INIT EIN    ) 
EN-D 0 16 0 0   KOMPILU 
EN-D 0 17 0 0   KOMPILU
EN-D 0 18 0 0   KOMPILU
EN-D 0 19 0 0   KOMPILU 
AUS 
FERMU 

( 16 ) 
D tk->at     A= 32 EL A= 84 EL A= 65 EL RE . ( Eligas "TA" por testi )
D nova_linio A= 32 EL A= 78 EL A= 76 EL RE . ( Eligas "NL" por testi ) 
D en<-sig    A= 32 EL A= 69 EL A= 83 EL RE . ( Eligas "ES" por testi ) 
D sig=13?    A= 32 EL A= 63 EL A= 49 EL A= 51 EL LOKO 0 EN IR0 ADR 0 A- 13 RE . 
D sig=8?     A= 32 EL A= 63 EL A= 56 EL          LOKO 0 EN IR0 ADR 0 A- 08 RE . 
D sig->el    A= 32 EL A= 83 EL A= 69 EL RE . ( Eligas "SE" por testi ) 
D a->at      A= 32 EL A= 65 EL A= 65 EL RE . ( Eligas "AA" por testi ) 
D at+1       A= 32 EL A= 65 EL A= 43 EL RE . ( Eligas "A+" por testi ) 
D at-1       A= 32 EL A= 65 EL A= 45 EL RE . ( Eligas "A-" por testi ) 
FERMU 

( 17 ) 
D skribu_tekston 
       tk->at 
       nova_linio 
LOKO 0 en<-sig 
       sig=13?   IR0 ADR 1 
       sig->el 
       a->at at+1 
       sig=8?    IR0 ADR 2
       IRU ADR 0 
LOKO 2 at-1 at-1 IRU ADR 0 
LOKO 1 A= 32 a->at at+1 
       A= 13 a->at at+1 RE . 
FERMU 

( 18 ) 
D prilaboru_tekston A= 80 EL RE . 
FERMU 

( 19 ) 
D E-KOMPILILO LOKO 0 skribu_tekston prilaboru_tekston IRU ADR 0 . 
D E-KOMPILILO skribu_tekston prilaboru_tekston RE . 
FERMU 


Tio estis la dua leciono
Se vi ne ŝatas tajpi mem la fontotekstojn vi povas alŝuti la
mem-malpakantan dosieron     lec-002.exe (3K)
(Startu poste dosieron 2.bat !)

Leciono 3

Ni skribu la sep fontotekstojn kaj storu ilin sur la spuroj 10, 14, 15, 
16, 17, 18 kaj 19. Poste ni kompilu la tuton per EN-D 48 10 0 0 INIT EIN .

( 10 E-kompililo leciono 3         enigu per EN-D 48 10 0 0 INIT EIN    ) 
EN-D 0 14 0 0   KOMPILU 
EN-D 0 15 0 0   KOMPILU
EN-D 0 16 0 0   KOMPILU 
EN-D 0 17 0 0   KOMPILU
EN-D 0 18 0 0   KOMPILU
EN-D 0 19 0 0   KOMPILU 
AUS 
FERMU 

( 14 ) 
D variabloj LOKO 127 EN RE 0 0 0 0 0 0 ( standarda enigo ) 
            LOKO 126 EL RE 0 0 0 0 0 0 ( standarda eligo ) 
            LOKO 125 0 0 0 0 0         ( sig = provizora storo por signo ) 
            LOKO 124 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ( teksto-bufro ) 
                     0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
                     0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
                     0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
            LOKO 123 ADR 124           ( tk = komenco de la teksto-bufro ) 
            .  
FERMU 

( 15 ) 
D a->at A-> LOKO 122 00 RE . ( at = aktuala pozicio en la teksto ) 
FERMU 

( 16 ) 
D tk->at     A<- MADR 123 A-> MADR 122 
             A<- AADR 123 A-> AADR 122 RE . 
D nova_linio A= 13 IRS ADR 126 A= 10 IRS ADR 126 RE . 
D en<-sig    LOKO 0 IRS ADR 127 IR0 ADR 0 A-> ADR 125 RE . 
D sig=13?    A= 9 A- 0 A<- ADR 125 A- 13 RE . 
D sig=8?     A= 9 A- 0 A<- ADR 125 A-  8 RE . 
D sig->el    A<- ADR 125 IRS ADR 126 RE . 
D at+1       A= 0 A+ 0 A<- MADR 122 A+ 1 A-> MADR 122 
                       A<- AADR 122 A+ 0 A-> AADR 122 RE . 
D at-1       A= 9 A- 0 A<- MADR 122 A- 1 A-> MADR 122 
                       A<- AADR 122 A- 0 A-> AADR 122 RE .  
FERMU 

( 17 ) 
D skribu_tekston 
       tk->at 
       nova_linio 
LOKO 0 en<-sig 
       sig=13?   IR0 ADR 1 
       sig->el 
       a->at at+1 
       sig=8?    IR0 ADR 2
       IRU ADR 0 
LOKO 2 at-1 at-1 IRU ADR 0 
LOKO 1 A= 32 a->at at+1 
       A= 13 a->at at+1 RE . 
FERMU 

( 18 ) 
D prilaboru_tekston A= 80 EL RE . 
FERMU 

( 19 ) 
D E-KOMPILILO LOKO 0 skribu_tekston prilaboru_tekston IRU ADR 0 . 
D E-KOMPILILO skribu_tekston prilaboru_tekston RE . 
FERMU

Tio estis la tria leciono
Se vi ne ŝatas tajpi mem la fontotekstojn vi povas alŝuti la
mem-malpakantan dosieron     lec-003.exe (3K)
(Startu poste dosieron 3.bat !)
La bildo bezonas 13 K !
Prilaboru tekston



Leciono 4


Ni skribu la sep fontotekstojn kaj storu ilin sur la spuroj 10, 14, 15, 
16, 17, 18 kaj 19. Poste ni kompilu la tuton per EN-D 48 10 0 0 INIT EIN .

( 10 E-kompililo leciono 4         enigu per EN-D 48 10 0 0 INIT EIN    ) 
EN-D 0 14 0 0   KOMPILU 
EN-D 0 15 0 0   KOMPILU
EN-D 0 16 0 0   KOMPILU 
EN-D 0 17 0 0   KOMPILU
EN-D 0 18 0 0   KOMPILU
EN-D 0 19 0 0   KOMPILU 
AUS 
FERMU 

( 14 ) 
D variabloj LOKO 127 EN RE 0 0 0 0 0 0 ( standarda enigo ) 
            LOKO 126 EL RE 0 0 0 0 0 0 ( standarda eligo ) 
            LOKO 125 0 0 0 0 0         ( sig = provizora storo por signo ) 
            LOKO 124 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ( teksto-bufro ) 
                     0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
                     0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
                     0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
            LOKO 123 ADR 124           ( tk = komenco de la teksto-bufro ) 
            .  
FERMU 

( 15 ) 
D a->at A-> LOKO 122 00 RE . ( at = aktuala pozicio en la teksto ) 
FERMU 

( 16 ) 
D tk->at     A<- MADR 123 A-> MADR 122 
             A<- AADR 123 A-> AADR 122 RE . 
D nova_linio A= 13 IRS ADR 126 A= 10 IRS ADR 126 RE . 
D en<-sig    LOKO 0 IRS ADR 127 IR0 ADR 0 A-> ADR 125 RE . 
D sig=13?    A= 9 A- 0 A<- ADR 125 A- 13 RE . 
D sig=8?     A= 9 A- 0 A<- ADR 125 A-  8 RE . 
D sig->el    A<- ADR 125 IRS ADR 126 RE . 
D at+1       A= 0 A+ 0 A<- MADR 122 A+ 1 A-> MADR 122 
                       A<- AADR 122 A+ 0 A-> AADR 122 RE . 
D at-1       A= 9 A- 0 A<- MADR 122 A- 1 A-> MADR 122 
                       A<- AADR 122 A- 0 A-> AADR 122 RE .  
FERMU 

( 17 ) 
D skribu_tekston 
       tk->at 
       nova_linio 
LOKO 0 en<-sig 
       sig=13?   IR0 ADR 1 
       sig->el 
       a->at at+1 
       sig=8?    IR0 ADR 2
       IRU ADR 0 
LOKO 2 at-1 at-1 IRU ADR 0 
LOKO 1 A= 32 a->at at+1 
       A= 13 a->at at+1 RE . 
( *********************** ) 
D serchu_unuan_vortkomencon A= 32 EL A= 83 EL RE . 
D av=13? A= 32 EL A= 63 EL A= 65 EL LOKO 0 EN IR0 ADR 0 A- 13 RE . 
D eraro? A= 32 EL A= 63 EL A= 69 EL LOKO 0 EN IR0 ADR 0 A- 69 RE . 
D eraroprogramo A= 32 EL A= 69 EL RE . 
D prilaboru_sekvan_vorton A= 32 EL A= 112 EL RE . 
FERMU 

( 18 ) 
D prilaboru_tekston 
       serchu_unuan_vortkomencon 
LOKO 0 av=13? IR0 ADR 1 
       prilaboru_sekvan_vorton 
       eraro? IR0 ADR 0 
       eraroprogramo RE 
LOKO 1 RE . 
FERMU 

( 19 ) 
D E-KOMPILILO LOKO 0 skribu_tekston prilaboru_tekston IRU ADR 0 . 
D E-KOMPILILO skribu_tekston prilaboru_tekston RE . 
FERMU 

Tio estis la kvara leciono
Se vi ne ŝatas tajpi mem la fontotekstojn vi povas alŝuti la
mem-malpakantan dosieron     lec-004.exe (3K)
(Startu poste dosieron 4.bat !)
La bildo bezonas 17 K !
Prilaboru sekvan vorton



Leciono 5


Ni skribu la sep fontotekstojn kaj storu ilin sur la spuroj 10, 14, 15, 
16, 17, 18 kaj 19. Poste ni kompilu la tuton per EN-D 48 10 0 0 INIT EIN .

( 10 E-kompililo leciono 5         enigu per EN-D 48 10 0 0 INIT EIN    ) 
EN-D 0 14 0 0   KOMPILU 
EN-D 0 15 0 0   KOMPILU
EN-D 0 16 0 0   KOMPILU 
EN-D 0 17 0 0   KOMPILU
EN-D 0 18 0 0   KOMPILU
EN-D 0 19 0 0   KOMPILU 
AUS 
FERMU
 
( 14 ) 
D variabloj LOKO 127 EN RE 0 0 0 0 0 0 ( standarda enigo ) 
            LOKO 126 EL RE 0 0 0 0 0 0 ( standarda eligo ) 
            LOKO 125 0 0 0 0 0         ( sig = provizora storo por signo ) 
            LOKO 124 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ( teksto-bufro ) 
                     0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
                     0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
                     0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
            LOKO 123 ADR 124           ( tk = komenco de la teksto-bufro ) 
            LOKO 121 0 0               ( vk = komenco de la aktuala vorto ) 
            LOKO 119 0                 ( eraro? = numero de la eraro  ) 
                                       ( 0 = neniu eraro ) 
            .  
FERMU 
( 15 ) 
D a->at A-> LOKO 122 00 RE . ( at = aktuala pozicio en la teksto )  
D a<-av A<- LOKO 120 00 RE . ( av = pozicio en la aktuala vorto  ) 
FERMU 
( 16 ) 
D tk->at     A<- MADR 123 A-> MADR 122 
             A<- AADR 123 A-> AADR 122 RE . 
D nova_linio A= 13 IRS ADR 126 A= 10 IRS ADR 126 RE . 
D en<-sig    LOKO 0 IRS ADR 127 IR0 ADR 0 A-> ADR 125 RE . 
D sig=13?    A= 9 A- 0 A<- ADR 125 A- 13 RE . 
D sig=8?     A= 9 A- 0 A<- ADR 125 A-  8 RE . 
D sig->el    A<- ADR 125 IRS ADR 126 RE . 
D at+1       A= 0 A+ 0 A<- MADR 122 A+ 1 A-> MADR 122 
                       A<- AADR 122 A+ 0 A-> AADR 122 RE . 
D at-1       A= 9 A- 0 A<- MADR 122 A- 1 A-> MADR 122 
                       A<- AADR 122 A- 0 A-> AADR 122 RE .  
( ***************************************************** ) 
D tk->av A= 32 EL A= 84 EL RE . 
D av=32? A= 32 EL A= 63 EL LOKO 0 EN IR0 ADR 0 A- 32 RE . 
D av->vk A= 32 EL A= 75 EL RE . 
D av+1   A= 32 EL A= 43 EL RE . 
FERMU 
( 17 ) 
D skribu_tekston 
       tk->at 
       nova_linio 
LOKO 0 en<-sig 
       sig=13?   IR0 ADR 1 
       sig->el 
       a->at at+1 
       sig=8?    IR0 ADR 2
       IRU ADR 0 
LOKO 2 at-1 at-1 IRU ADR 0 
LOKO 1 A= 32 a->at at+1 
       A= 13 a->at at+1 RE . 
( *********************** ) 
D serchu_unuan_vortkomencon 
       tk->av 
LOKO 0 av=32? IR0 ADR 1 
       av->vk RE 
LOKO 1 av+1   IRU ADR 0 . 
D av=13? A= 9 A- 0 a<-av A- 13 RE .       ( Chu aktuala signo en vorto = 13? ) 
D eraro? A= 0 A+ 0 A<- ADR 119 A+ 0 RE .  ( Chu okazis eraro ? ) 
D eraroprogramo A= 32 EL A= 33 EL RE . ( eligi !-signon kiam estas eraro )   
D prilaboru_sekvan_vorton A= 32 EL A= 112 EL RE . 
FERMU 
( 18 ) 
D prilaboru_tekston 
       serchu_unuan_vortkomencon 
LOKO 0 av=13? IR0 ADR 1 
       prilaboru_sekvan_vorton 
       eraro? IR0 ADR 0 
       eraroprogramo RE 
LOKO 1 RE . 
FERMU 
( 19 ) 
D E-KOMPILILO LOKO 0 skribu_tekston prilaboru_tekston IRU ADR 0 . 
D E-KOMPILILO skribu_tekston prilaboru_tekston RE . 
D e=1 A= 1 A-> ADR 119 RE . 
D e=0 A= 0 A-> ADR 119 RE . 
FERMU 

Tio estis la kvina leciono
Se vi ne ŝatas tajpi mem la fontotekstojn vi povas alŝuti la
mem-malpakantan dosieron     lec-005.exe (4K)
(Startu poste dosieron 5.bat !)

Leciono 6

Ni skribu la sep fontotekstojn kaj storu ilin sur la spuroj 10, 14, 15, 
16, 17, 18 kaj 19. Poste ni kompilu la tuton per EN-D 48 10 0 0 INIT EIN .

( 10 E-kompililo leciono 6         enigu per EN-D 48 10 0 0 INIT EIN    ) 
EN-D 0 14 0 0   KOMPILU 
EN-D 0 15 0 0   KOMPILU
EN-D 0 16 0 0   KOMPILU 
EN-D 0 17 0 0   KOMPILU
EN-D 0 18 0 0   KOMPILU
EN-D 0 19 0 0   KOMPILU 
AUS 
FERMU
 
( 14 ) 
D variabloj LOKO 127 EN RE 0 0 0 0 0 0 ( standarda enigo ) 
            LOKO 126 EL RE 0 0 0 0 0 0 ( standarda eligo ) 
            LOKO 125 0 0 0 0 0         ( sig = provizora storo por signo ) 
            LOKO 124 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ( teksto-bufro ) 
                     0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
                     0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
                     0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
            LOKO 123 ADR 124           ( tk = komenco de la teksto-bufro ) 
            LOKO 121 0 0               ( vk = komenco de la aktuala vorto ) 
            LOKO 119 0                 ( eraro? = numero de la eraro  ) 
                                       ( 0 = neniu eraro ) 
            .  
FERMU 

( 15 ) 
D a->at A-> LOKO 122 00 RE . ( at = aktuala pozicio en la teksto ) 
D a<-av A<- LOKO 120 00 RE . ( av = pozicio en la aktuala vorto  ) 
FERMU 

( 16 ) 
D tk->at     A<- MADR 123 A-> MADR 122 
             A<- AADR 123 A-> AADR 122 RE . 
D nova_linio A= 13 IRS ADR 126 A= 10 IRS ADR 126 RE . 
D en<-sig    LOKO 0 IRS ADR 127 IR0 ADR 0 A-> ADR 125 RE . 
D sig=13?    A= 9 A- 0 A<- ADR 125 A- 13 RE . 
D sig=8?     A= 9 A- 0 A<- ADR 125 A-  8 RE . 
D sig->el    A<- ADR 125 IRS ADR 126 RE . 
D at+1       A= 0 A+ 0 A<- MADR 122 A+ 1 A-> MADR 122 
                       A<- AADR 122 A+ 0 A-> AADR 122 RE . 
D at-1       A= 9 A- 0 A<- MADR 122 A- 1 A-> MADR 122 
                       A<- AADR 122 A- 0 A-> AADR 122 RE .  
( ***************************************************** ) 
D tk->av A<- MADR 123 A-> MADR 120 
         A<- AADR 123 A-> AADR 120 RE . 
D av=32? A= 9 A- 0 a<-av A- 32 RE . 
D av->vk A<- MADR 120 A-> MADR 121 
         A<- AADR 120 A-> AADR 121 RE . 
D av+1   A<- MADR 120 A+ 1 A-> MADR 120 
         A<- AADR 120 A+ 0 A-> AADR 120 RE . 
( ***************************************************** ) 
FERMU 

( 17 ) 
D skribu_tekston 
       tk->at 
       nova_linio 
LOKO 0 en<-sig 
       sig=13?   IR0 ADR 1 
       sig->el 
       a->at at+1 
       sig=8?    IR0 ADR 2
       IRU ADR 0 
LOKO 2 at-1 at-1 IRU ADR 0 
LOKO 1 A= 32 a->at at+1 
       A= 13 a->at at+1 RE . 
( *********************** ) 
D serchu_unuan_vortkomencon 
       tk->av 
LOKO 0 av=32? IR0 ADR 1 
       av->vk RE 
LOKO 1 av+1   IRU ADR 0 . 
D av=13? A= 9 A- 0 a<-av A- 13 RE .       ( Chu aktuala signo en vorto = 13? ) 
D eraro? A= 0 A+ 0 A<- ADR 119 A+ 0 RE .  ( Chu okazis eraro ? ) 
D eraroprogramo A= 32 EL A= 33 EL RE . ( eligi !-signon kiam estas eraro )  
D prilaboru_sekvan_vorton A= 32 EL A= 112 EL RE . 
FERMU 

( 18 ) 
D prilaboru_tekston 
       serchu_unuan_vortkomencon 
LOKO 0 av=13? IR0 ADR 1 
       prilaboru_sekvan_vorton 
       eraro? IR0 ADR 0 
       eraroprogramo RE 
LOKO 1 RE . 
FERMU 

( 19 ) 
D E-KOMPILILO LOKO 0 skribu_tekston prilaboru_tekston IRU ADR 0 . 
D E-KOMPILILO skribu_tekston prilaboru_tekston RE . 
D e=1 A= 1 A-> ADR 119 RE . 
D e=0 A= 0 A-> ADR 119 RE . 
FERMU 

Tio estis la sesa leciono
Se vi ne ŝatas tajpi mem la fontotekstojn vi povas alŝuti la
mem-malpakantan dosieron     lec-006.exe (4K)
(Startu poste dosieron 6.bat !)

Leciono 7

Ni skribu la sep fontotekstojn kaj storu ilin sur la spuroj 10, 14, 15, 
16, 17, 18 kaj 19. Poste ni kompilu la tuton per EN-D 48 10 0 0 INIT EIN .

( 10 E-kompililo leciono 7         enigu per EN-D 48 10 0 0 INIT EIN    ) 
EN-D 0 14 0 0   KOMPILU 
EN-D 0 15 0 0   KOMPILU
EN-D 0 16 0 0   KOMPILU 
EN-D 0 17 0 0   KOMPILU
EN-D 0 18 0 0   KOMPILU
EN-D 0 19 0 0   KOMPILU 
AUS 
FERMU
 
( 14 ) 
D variabloj 
LOKO 127 EN RE 0 0 0 0 0 0 ( standarda enigo ) 
LOKO 126 EL RE 0 0 0 0 0 0 ( standarda eligo ) 
LOKO 125 0 0 0 0 0         ( sig = provizora storo por signo ) 
LOKO 124 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ( teksto-bufro ) 
         0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
         0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
         0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
LOKO 123 ADR 124           ( tk = komenco de la teksto-bufro ) 
LOKO 121 0 0               ( vk = komenco de la aktuala vorto ) 
( *********************** ) 
LOKO 119 0                 ( eraro? = numero de la eraro ) 
                           ( 0 = neniu eraro )  
( *********************** ) 
LOKO 118 0                 ( ekzist? 0 = vorto ne ekzistas ) 
LOKO 117 0                 ( k-mod?  0 = aplikomodo 1 = kompilomodo ) 
LOKO 116 0                 ( nombr?  0 = ne estas nombro ) 
LOKO 115 0                 ( k-nro?  0 = ne kompilu nombron ) 
( *********************** ) 
         . 
FERMU 

( 15 ) 
D a->at A-> LOKO 122 00 RE . ( at = aktuala pozicio en la teksto ) 
D a<-av A<- LOKO 120 00 RE . ( av = posicio en la aktuala vorto  ) 
( *********************** ) 
FERMU 

( 16 ) 
D tk->at     A<- MADR 123 A-> MADR 122 
             A<- AADR 123 A-> AADR 122 RE . 
D nova_linio A= 13 IRS ADR 126 A= 10 IRS ADR 126 RE . 
D en<-sig 
LOKO 0       IRS ADR 127 IR0 ADR 0 A-> ADR 125 RE . 
D sig=13?    A= 9 A- 0 A<- ADR 125 A- 13 RE . 
D sig=8?     A= 9 A- 0 A<- ADR 125 A-  8 RE . 
D sig->el    A<- ADR 125 IRS ADR 126 RE . 
D at+1       A= 0 A+ 0 A<- MADR 122 A+ 1 A-> MADR 122 
                       A<- AADR 122 A+ 0 A-> AADR 122 RE . 
D at-1       A= 9 A- 0 A<- MADR 122 A- 1 A-> MADR 122 
                       A<- AADR 122 A- 0 A-> AADR 122 RE . 
( *********************** ) 
D tk->av     A<- MADR 123 A-> MADR 120 
             A<- AADR 123 A-> AADR 120 RE . 
D av=32?     A= 9 A- 0 a<-av A- 32 RE . 
D av->vk     A<- MADR 120 A-> MADR 121 
             A<- AADR 120 A-> AADR 121 RE . 
D av+1       A= 0 A+ 0 A<- MADR 120 A+ 1 A-> MADR 120 
                       A<- AADR 120 A+ 0 A-> AADR 120 RE . 
( *********************** ) 
D v?                         A= 0 A+ 0 A<- ADR 118 A+ 0 RE . 
D k?                         A= 0 A+ 0 A<- ADR 117 A+ 0 RE . 
D n?                         A= 0 A+ 0 A<- ADR 116 A+ 0 RE . 
D n->bf?                     A= 0 A+ 0 A<- ADR 115 A+ 0 RE .  
D komparu_chu_vorto_ekzistas A= 32 EL A= 75 EL A= 69 EL RE . ( "KE" ) 
D serchu_sekvan_vortkomencon A= 32 EL A= 83 EL A= 86 EL RE . ( "SV" ) 
D e=1                        A= 1  A-> ADR 119 RE .  
D transformu_al_nombro       A= 32 EL A= 84 EL A= 78 EL RE . ( "TN" ) 
D kompilu_nombron            A= 32 EL A= 75 EL A= 78 EL RE . ( "KN" ) 
D al_kompilokodo             A= 32 EL A= 65 EL A= 75 EL RE . ( "AK" ) 
D al_aplikokodo              A= 32 EL A= 65 EL A= 65 EL RE . ( "AA" ) 
( *********************** ) 
FERMU 
( 17 ) 
D skribu_tekston 
       tk->at 
       nova_linio 
LOKO 0 en<-sig 
       sig=13?   IR0 ADR 1 
       sig->el 
       a->at at+1 
       sig=8?    IR0 ADR 2 
       IRU ADR 0 
LOKO 2 at-1 at-1 IRU ADR 0 
LOKO 1 A= 32 a->at at+1 
       A= 13 a->at at+1 RE . 
( *********************** ) 
D serchu_unuan_vortkomencon 
       tk->av 
LOKO 0 av=32? IR0 ADR 1 
       av->vk RE 
LOKO 1 av+1   IRU ADR 0 . 
D av=13? A= 9 A- 0 a<-av A- 13 RE .      ( Chu aktuala signo en vorto =13? ) 
D eraro? A= 0 A+ 0 A<- ADR 119 A+ 0 RE . ( Chu okazis eraro? ) 
D eraroprogramo A= 32 EL A= 33 EL A= 0 A-> ADR 119 RE . ( eligi !-signon )  
( *********************** ) 
D prilaboru_sekvan_vorton 
       komparu_chu_vorto_ekzistas 
       v?      IR0 ADR 0 
       k?      IR0 ADR 1 
       al_kompilokodo 
       IRU ADR 2 
LOKO 1 al_aplikokodo 
       IRU ADR 3 
LOKO 0 transformu_al_nombro 
       n?      IR0 ADR 4 
       n->bf?  IR0 ADR 5 
       IRU ADR 6 
LOKO 5 kompilu_nombron 
LOKO 4 e=1 
LOKO 2 
LOKO 3 
LOKO 6 
LOKO 7 serchu_sekvan_vortkomencon RE . 
FERMU 
( 18 ) 
D prilaboru_tekston 
       serchu_unuan_vortkomencon 
LOKO 0 av=13? IR0 ADR 1 
       prilaboru_sekvan_vorton 
       eraro? IR0 ADR 0 
       eraroprogramo RE 
LOKO 1 RE . 
FERMU 
( 19 ) 
D E-KOMPILILO 
LOKO 0 skribu_tekston 
       prilaboru_tekston 
       IRU ADR 0 RE . 
D E-KOMPILILO 
       skribu_tekston 
       prilaboru_tekston 
       RE . 
D e=0      A= 0 A-> ADR 119 RE . 
D k=1      A= 1 A-> ADR 117 RE . 
D k=0      A= 0 A-> ADR 117 RE . 
D n=1      A= 1 A-> ADR 116 RE . 
D n=0      A= 0 A-> ADR 116 RE . 
D n->bf=1  A= 1 A-> ADR 115 RE . 
D n->bf=0  A= 0 A-> ADR 115 RE . 
D v=1      A= 1 A-> ADR 118 RE . 
D v=0      A= 0 A-> ADR 118 RE . 
FERMU 

Tio estis la sepa leciono
Se vi ne ŝatas tajpi mem la fontotekstojn vi povas alŝuti la
mem-malpakantan dosieron     lec-007.exe (4K)
(Startu poste dosieron 7.bat !)

Baldaŭ sekvas la aliaj lecionoj!

zurueck / reen!
@