1 C Loglan82 Compiler&Interpreter
2 C Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw
3 C Copyright (C) 1993, 1994 LITA, Pau
5 C This program is free software; you can redistribute it and/or modify
6 C it under the terms of the GNU General Public License as published by
7 C the Free Software Foundation; either version 2 of the License, or
8 C (at your option) any later version.
10 C This program is distributed in the hope that it will be useful,
11 C but WITHOUT ANY WARRANTY; without even the implied warranty of
12 C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 C GNU General Public License for more details. File: LICENSE.GNU
14 C ===============================================================
17 C-----------------------------------------------------------------------
21 C * * * * * * * * * * * * * * * * * * * *
23 C THE FOLLOWING FILE UNITS ARE USED :
25 C 1 - INTERACTIVE INPUT FROM THE TERMINAL ( FOR TESTING ONLY )
26 C 2 - INTERACTIVE OUTPUT TO THE TERMINAL ( FOR TESTING ONLY )
27 C 13 - LISTING OUTPUT ( TEST MESSAGES )
28 C 14 - WORKING FILE SCRATCH - CODE FROM PARSER AND L-CODE
29 C ( USED ONLY VIA SEEK,PUT,GET WITH IBUF3 )
30 C 15 - L-CODE OUTPUT ( TEXTUAL (HEXADECIMAL) REPRESENTATION
31 C OF SYMBOL TABLE AND L-CODE )
33 C * * * * * * * * * * * * * * * * * * * *
36 C 3 - BINARNY - KOD Z PARSERA
37 C LO - WYDRUKI KONTROLNE /ZNAKOWY/
38 C 3 - PRODUKOWANE CZWORKI /BINARNY/ - SEKWENCYJNIE,
39 C OD REKORDU NUMER IOP(2)+1 .
40 C /REKORD O NUMERZE IOP(2) BUFORUJE STOS "CASE"/
42 C * * * * * * * * * * * * * * * * * * * *
47 C ##### OUTPUT CODE : 200 .
54 COMMON/STREAM/ERRFLG,LINE,IBUF2(265),IBUF3(7),JUNK(260)
56 C IBUF3 - OPIS STRUMIENIA Z WCZYTYWANYM I PRODUKOWANYM KODEM POSREDNIM
62 cdeb --------------- added ------------
64 c breaklid - numer w displayu (dla interpretera) procedury breakl
66 common /debug/deb,breakt(500),brnr,maxbr
68 cdeb -----------------------------------
70 common/MJLMSG/IERC,MSG
71 cdsw ----------------------------
73 cdsw ----------------------------
75 common /stacks/ btsins, btstem
82 C WCZYTANA OPCJA WYDRUKOW KONTROLNYCH
88 C OSTATNIE ZAJETE SLOWO W BUFORZE WYJSCIOWYM / LMEM-259 .. LMEM-1 /
91 C DNO STOSU / LMEM-916 .. LMEM-516 / Z WARTOWNIKIEM = -1
95 C PUSTY STOS INSTRUKCJI "CASE" / LMEM-515 .. LMEM-260 /
97 C NAJWIEKSZY UZYTY NUMER REKORDU STRUMIENIA 3
102 cdsw ----------------- added ----------------------------------
103 c inicjalizacje zmiennych z common przeniesione z podprogramow
104 c przeniesione z sinit
120 c przeniesione z scase
122 cdsw -----------------------------------------------------------------
126 cdeb ----------------- added -------------------
127 c instrukcja L-kodu przekazujaca breaklid
128 if (.not.deb) go to 2001
130 if(breaklid.eq.0) go to 2001
131 call quadr2(210,breaklid)
133 cdeb -------------------------------------------
135 C WYPISZ ZNACZNIK KONCA PRODUKOWANEGO KODU POSREDNIEGO
137 C JESLI TRZEBA - WYPISZ BUFOR Z CZWORKAMI
138 IF(ERRFLG) GO TO 2000
139 IF(LSTWRD.EQ.LMEM-260)GO TO 1000
140 cdsw ****************************
142 cdsw CALL SEEK(IBUF3,QRECNR)
143 cdsw CALL PUT(IBUF3,IPMEM(LMEM-259))
144 cbc write(18) (ipmem(i),i=lmem-259,lmem-4)
145 call ffwrite_ints(18, ipmem(lmem-259), 256)
147 cdsw *****************************
150 C WRITE HEXADECIMAL REPRESENTATION OF SYMBOL TABLE AND L-CODE
156 C CLOSED TEMPORARY 18 should BE AUTOMATICALLY DELETED but ...
165 C.....PRZYGOTUJ DANE STATYSTYCZNE
168 IPMEM(ISFIN-3)=QRECNR-IOP(2)
169 C = LICZBA WYPRODUKOWANYCH REKORDOW Z KODEM POSREDNIM
170 IPMEM(ISFIN-4)=(400-FREE)/4
171 C = % UZYTEGO STOSU /WZOR POPRAWNY DLA ROZMIARU = 400 /
179 C PO ABORCIE /BLAD W KOMPILATORZE/
180 C7777 ERRFLG=.TRUE. CHANGED TO COMMENT 04.01.84
186 C-----------------------------------------------------------------------------
188 C PROCEDURA STERUJACA PRZEBIEGIEM 2.
189 C DWUKROTNIE PRZECHODZI PRZEZ WSZYSTKIE MODULY.
190 C FAZA 1 : WYLICZANIE WARTOSCI STALYCH /INIT=TRUE/
191 C - WYBIERA TYLKO MODULY ZAWIERAJACE STALE WYLICZANE
192 C FAZA 2 : WLASCIWA GENERACJA KODU /INIT=FALSE/
193 C - PRZECHODZI PRZEZ WSZYSTKIE MODULY ZAWIERAJACE INSTRUKCJE
194 C W OBU FAZACH PRZECHODZI KOLEJNO PRZEZ MODULY I DLA KAZDEGO MODULU
195 C WSTAWIA JEGO ADRES DO P ,WCZYTUJE PIERWSZY REKORD Z KODEM POSREDNIM,
196 C USTAWIA WB I INDEKS SYMBOLU DLA SNEXT,INICJALIZUJE STRUKTURY DANYCH,
199 C STARTUJE OD BLOKU WSKAZANEGO PRZEZ NBLUS.
200 C DLA KAZDEGO MODULU REKORDY Z KODEM POSREDNIM Z PARSERA POWIAZANE
201 C SA W LISTE : SLOWO +8 ZAWIERA NUMER PIERWSZEGO REKORDU /JESLI SLOWO
202 C +9 =0 TO LISTA JEST PUSTA/ A SLOWO +9 INDEKS PIERWSZEGO SYMBOLU
203 C W REKORDZIE. SLOWO 256 REKORDU ZAWIERA NUMER NASTEPNEGO REKORDU
204 C LISTY. KOD DLA KAZDEGO MODULU JEST ZAKONCZONY PARA <FIN,NUMER ETYKIETY>.
206 C SLOWO +2 W OPISIE MODULU ZAWIERA ADRES /W IPMEM/ NASTEPNEGO MODULU.
210 COMMON/STREAM/ERRFLG,LINE,IBUF2(265),IBUF3(7),JUNK(260)
213 COMMON/TEST/TESTC,TESTS,TESTH
214 LOGICAL TESTC,TESTS,TESTH
217 C = TRUE DLA FAZY WYLICZANIA STALYCH
219 C INTERNAL 2000 CHANGED TO COMMENT 04.01.84
220 C PUNKT POWROTU PO PRZEPELNIENIU STOSU W SPUSH
223 C................. FAZA WYLICZANIA STALYCH
224 C /PIERWSZE PRZEJSCIE PRZEZ KOD DLA MODULOW/
228 C.....USTAW P NA BLOK GLOWNY
232 C.....INICJALIZACJA DLA PROTOTYPU P
235 IF(.NOT.TESTC) GOTO 5000
236 call ffputcs(13,' ------------ PASS2 ---------- P =')
241 C POMIN,JESLI TO PROTOTYP FORMALNY/PROC.,FUN.,SYGNAL/
242 IF(IAND(ISHFT(IPMEM(P),-4),15).NE.0)GO TO 2000
244 C ... PODCZAS WYLICZANIA STALYCH POMIN,JESLI MODUL ICH NIE MA
245 IF(INIT.AND.IPMEM(P-1).EQ.0)GO TO 2000
247 C POMIN , JESLI NIE MA INSTRUKCJI
248 IF(IPMEM(P+9).EQ.0)GO TO 2500
250 C ... ODSZUKAJ PIERWSZY REKORD Z KODEM POSREDNIM
252 C WSTAW NUMER I WCZYTAJ PIERWSZY REKORD
256 IF(.NOT.TESTC) GOTO 6000
257 call ffputcs(13,' REKORD')
259 call ffputcs(13,' SYMBOL')
260 call ffputi (13,IPMEM(P+9),4)
266 C WSTAW INDEKS BIEZACEGO SYMBOLU,USTAW WB
277 C...........WEZ NASTEPNY MODUL
280 C WSZYSTKIE MODULY JUZ SKOMPILOWANE.
282 C................. FAZA GENERACJI KODU
283 C /DRUGIE PRZEJSCIE PRZEZ KOD DLA MODULOW/
290 C.....MODUL BEZ INSTRUKCJI. PREFIKS?
292 IF(IDL.EQ.0)GO TO 2600
293 C TAK. PRZEPISZ INFORMACJE O INSTRUKCJACH PO INNER
294 IPMEM(P-7)=IPMEM(IDL-7)
296 C ... BEZ PREFIKSU. DLA KLASY,REKORDU WSTAW: BRAK INSTR. PO INNER
297 2600 IF(IAND(IPMEM(P),15).NE.1)IPMEM(P-7)=0
299 if (.not. init) call stclass
305 implicit integer(a-z)
308 c not yet used as prefix
312 c begin of instructions
315 call quadr2(178, ipmem(p+23))
330 SUBROUTINE SDPDA(INICJA)
331 C-----------------------------------------------------------------------------
335 C GLOBAL JUMPS ARE CHANGED TO LOCAL JUMPS IF POSSIBLE OTHERWISE THEY ARE
336 C CHANGED TO COMPUTED JUMPS 8.5.84
338 C MAIN ROUTINE OF SEMANTIC ANALYSIS AND CODE GENERATION
339 C GLOWNA PROCEDURA ANALIZY SEMANTYCZNEJ I GENERACJI KODU POSREDNIEGO
340 C /CZWOREK/ DLA MODULU.
341 C PRACUJE JAK DETERMINISTYCZNY AUTOMAT ZE STOSEM STEROWANY SYMBOLEM
343 C W ZALEZNOSCI OD WB /SYMBOL WEJSCIOWY/ WYBIERANA JEST AKCJA DO WYKONANIA
344 C O ETYKIECIE 100*WB : OD 100 DO 7200.
345 C WB MUSI MIEC NADANA WARTOSC PRZED WYWOLANIEM SDPDA.
347 C DLA KAZDEGO MODULU WOLANA DWUKROTNIE:
348 C PIERWSZY RAZ W FAZIE WYLICZANIA STALYCH /O ILE MODUL ZAWIERAL
349 C STALE WYLICZANE/ I DRUGI RAZ W FAZIE GENERACJI KODU /O ILE
351 C W FAZIE WYLICZANIA STALYCH PO WYSTAPIENIU ZNACZNIKA PIERWSZEJ
352 C INSTRUKCJI ZASTEPUJE W PROTOTYPIE ADRES POCZATKU KODU DLA MODULU
353 C PRZEZ NUMER REKORDU I MIEJSCE W REKORDZIE ZAWIERAJACE TEN ZNACZNIK.
357 C ##### OUTPUT CODE : 15 , 23 , 31 , 33 , 34 , 35 , 36 , 41 ,
358 C 85 , 132 , 145 , 149 , 151 , 152 ,
359 C 172 , 173 , 176 , 177 , 178 , 179 ,
360 C 181 , 182 , 186 , 187 .
363 C ##### DETECTED ERROR(S) : 407 , 410 , 411 , 414 , 415 , 416 ,
364 C 418 , 420 , 421 , 422 , 423 , 424 , 426 , 427 ,
365 C 428 , 429 , 430 , 440 , 444 , 449 , 454 , 604 .
372 C STACK - STOS DLA ANALIZY SEMANTYCZNEJ. OD LEWEJ WKLADANE SA
373 C ELEMENTY,OD PRAWEJ OPISY PARAMETROW OUTPUT.
374 C KAZDY ELEMENT STOSU ZAJMUJE KILKA KOLEJNYCH SLOW
375 C OZNACZANYCH -9,...,-1,0. ZEROWE SLOWO OKRESLA RODZAJ
377 C OPISY PAR. OUTPUT ZAJMUJA ZAWSZE 12 SLOW: -9,..,+2
378 C STOS /400 SLOW + WARTOWNIK/ ZAJMUJE W TABLICY IPMEM
379 C SLOWA OD BOTTOM = LMEM-916 DO LMEM-516
385 C 4 - ELEMENT TABLICY DYN.
386 C 5 - TABLICA STATYCZNA
387 C 6 - OPIS PETLI "FOR"
391 C 10 - BLOK PREFIKSOWANY
396 C BOTTOM - WSKAZUJE DNO STOSU / WARTOWNIKA = -1 /
397 C VALTOP - CZUBEK STOSU /INDEKS ZEROWEGO SLOWA/
398 C VLPREV - INDEKS ZEROWEGO SLOWA POPRZEDNIEGO ELEMENTU
399 C STCKAG,STCKA0,STCKAP - TABLICA -1..14 APETYTOW ELEMENTOW STOSU
400 C /TZN. STCKAP(I)=APETYT ELEMENTU TYPU I/
401 C STCKAP(-1)= 0 =APETYT WARTOWNIKA DLA POP
402 C APETYT - TABLICA OKRESLAJACA DLA KAZDEGO RODZAJU TYPU JEGO
403 C APETYT. 1,2,3,4 --> 1,2,3,2
404 C LSTFOR - INDEKS OSTATNIEGO SLOWA ZAJETEGO PRZEZ PETLE FOR
405 C LSTLSE - " " LSE NA STOSIE /LSE ,TZN. LEWE STRONY
406 C PODSTAWIENIA SA UMIESZCZONE POWYZEJ LSTFOR DO LSTLSE/
407 C KIND - RODZAJ WOLANEGO MODULU: 0-ZWYKLY,1-VIRTUALNY,2-FORMALNY
408 C PHADR - ATS ADRESU FIZYCZNEGO POLA DANYCH GENEROWANEGO OBIEKTU
409 C LUB 0 ,GDY ADR.FIZYCZNY TRZEBA ODTWORZYC Z ADR.VIRT.
410 C LASTPR - JESLI NA STOSIE JEST FUNKCJA,PROCEDURA,KLASA,REKORD,
411 C SYGNAL,BLOK PREF. , DLA KTOREGO PAMIETANY JEST TYLKO
412 C ADRES POSREDNI ZAMIAST PELNEGO ADR.VIRTUALNEGO, TO
413 C LASTPR= INDEKS TEGO ELEMENTU; INACZEJ ZERO
414 C FSTOUT - INDEKS PIERWSZEGO SLOWA ZAJETEGO PRZEZ OPISY PAR.
416 C WB - BIEZACY SYMBOL /WEJSCIOWY/ KODU POSREDNIEGO
417 C RESULT - ATS WYNIKU OPERACJI
418 C CONSNR - TABLICA ZAWIERAJACA ADRESY /INDEKSY W IPMEM/ TYPOW:
419 C BOOLEAN,CHAR,INTEGER,NONE,REAL,STRING I UNIWERSALNEGO .
420 C LSTSAF - OSTATNI ELEMENT STOSU NIE WYMAGAJACY ZABEZPIECZENIA
421 C PRZEZ SAFEST ,USTAWIA SAFEST,OBNIZA SPOP.
422 C TEMPNR - POCZATEK ADRESOW W /BUDOWANEJ/ TABLICY SYMBOLI
423 C UZYWANYCH DLA ATRYBUTOW ROBOCZYCH,
424 C ADRESY WIEKSZE ZAREZERWOWANE DLA PETLI FOR,
425 C ZMNIEJSZANE O 6 NA POCZATKU, A ZWIEKSZANE NA KONCU
427 C LSTEMP - NAJMNIEJSZY UZYTY ADRES ATRYBUTU ROBOCZEGO
429 C QRECNR - OSTATNI UZYTY NUMER REKORDU W STRUMIENIU 3
430 C BUFOR NA GENEROWANY KOD POSREDNI WYSYLANY NA STRUMIEN 3
431 C ZAJMUJE 259 SLOW W TABLICY IPMEM : OD LMEM-259 DO LMEM-1 .
432 C LSTWRD - INDEKS OSTATNIEGO ZAJETEGO SLOWA W BUFORZE.
434 C ZASADA WYPELNIANIA BUFORA : SA CO NAJMNIEJ 4 WOLNE SLOWA
435 C / LSTWRD < LMEM-4 / . PROCEDURY QUADR1 .. QUADR4
436 C DOPISUJA ZA LSTWRD SWOJE ARGUMENTY I ZWIEKSZAJA LSTWRD.
437 C JESLI POZOSTANA MNIEJ NIZ 4 SLOWA - WOLAJA QDROUT.
438 C QDROUT WYPISUJE PIERWSZE 256 SLOW I OSTATNIE 3 SLOWA
439 C PRZEPISUJE NA POCZATEK, ZMNIEJSZAJAC LSTWRD O 256.
440 C FRSTTS - PIERWSZE SLOWO W IPMEM NA NOWE OPISY ATRYBUTOW
442 C ZAPELNIANIE TABLICY SYMBOLI: TSINSE --> <-- TSTEMP
443 C OBSZAR WOLNY - FRSTTS .. LSTEMP-1
444 C UNIT - RODZAJ BIEZACEGO MODULU:
447 C 3 - BLOK PREFIKSOWANY
451 C INNER = 0 - NIE BYLO "INNER",ALE JEST LEGALNY
452 C 1 - WYSTAPIENIE "INNER" BEDZIE NIELEGALNE
454 C 4 - LAST-WILL WYSTAPIENIE INNER NIELEGALNE
455 C LSTWILL - TRUE,JESLI WYSTAPILO LAST WILL
457 C TEST - OPCJA / U3 / WYDRUKOW KONTROLNYCH ,
458 C = 0 --> BEZ WYDRUKOW , <> 0 --> WYDRUKI
460 C ARG - INFORMACJA O STALYCH ARGUMENTACH /USTAWIANA PRZEZ
463 C 2 - LEWY STALY,PRAWY NIE
464 C 3 - LEWY NIE,PRAWY STALY
465 C 4 - OBA ROZNE OD STALYCH
466 C ATLINE - NUMER LINII, W KTOREJ PRZEBIEG MA SIE ZAWIESIC
468 C FILE - ADRES PLIKU NA STOSIE LUB 0 DLA OPERACJI NA PLIKU
471 C FLARGS - INFORMACJA O PRZETWORZONYCH ARGUMENTACH OPERACJI
473 C 0 - NIE WYSTAPIL ZADEN ARGUMENT
474 C 1 - WYSTAPIL TYLKO ADRES PLIKU
475 C 2 - WYSTAPIL CO NAJMNIEJ 1 ARGUMENT
476 C ( LUB READLN/WRITELN )
478 C FLREADY - TRUE, JESLI (R6-12) ZAWIERA ADRES PLIKU, ZAPALANE PRZEZ
479 C SFLADR, GASZONE PRZEZ SCALLB I DLA 'I-O-END'
481 C FLMODF - PRZELACZNIK NUMERU PROCEDURY STANDARDOWEJ UZYWANY
482 C DLA WE/WY : 1 DLA PLIKU STANDARDOWEGO
484 C NUMERY PROCEDUR WE/WY (ROZNE PUNKTY WEJSCIA) SA
491 C COMDECK OPT? 04.01.84
492 C COMMON/OPTION/OPTMEM,OPTOPT,OPTIND,OPTTYP,OPTTRC,OPTCSC,OPTCSF
493 C LOGICAL OPTOPT,OPTTYP,OPTTRC
496 C ***** OPCJE KOMPILATORA *****
498 C OPTMEM - 0 - TRZEBA ROBIC MEMBER
499 C 1 - NIE TRZEBA ROBIC MEMBER
500 C OPTOPT - .TRUE. - WOLNO OPTYMALIZOWAC
501 C .FALSE. - NIE WOLNO
502 C OPTIND - 0 - KONTROLA INDEKSOW DLA TABLIC
503 C 2 - BEZ KONTROLI INDEKSOW
504 C OPTTYP - .TRUE. - BEZ DYNAMICZNEJ KONTROLI TYPOW
506 C OPTTRC - .TRUE. - KOMPILAT POWINIEN ZAWIERAC SLEDZENIE
508 C OPTCSC - 1 - BEZ KONTROLI ZAKRESU DLA "CASE"
509 C 0 WYMAGANA KONTROLA
510 C OPTCSF - 0 - SZYBKI "CASE"
511 C 1 - PAMIECIOOSZCZEDNY
518 C COMMON /BLANK/ IOP(4),
520 C X TLDIM, TLBAS, IDL, OBJL,
521 C X TRDIM, TRBAS, IDR, OBJR,
527 C X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF ,
528 C X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT,
529 C X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS ,
530 C X LOCAL, OWN, OBJECT,
533 C INTEGER STACK(5000)
534 C EQUIVALENCE(STALER(1),IPMEM(1))
535 C EQUIVALENCE(STACK(1),IPMEM(1))
536 C......COMDECK BLANKSEM
537 C FROM LOGLAN.08 17.01.84
538 C LMEM - (=5000) ROZMIAR CALEJ PAMIECI GLOWNEJ
539 C LPMEM - PODZIAL PAMIECI NA CZESCI IPMEM I IPMEM
542 C P - PROTOTYP AKTUALNY
543 C TLDIM - LICZBA ARRAY OF W TYPIE LEWEGO ARGUMENTU
544 C TLBAS - TYP BAZOWY LEWEGO ARGUMENTU
545 C DISPL - .TRUE. JESLI LEWY ARGUMENT JEST DOSTEPNY PRZEZ
547 C OBJL - PROTOTYP OBIEKTU, Z KTOEGO POCHODZI TEN ATRYBUT
548 C IDL - IDENTYFIKATOR LEWEGO ARGUMENTU (DO SYGNALIZACJI BLE-
550 C TRDIM, TRBAS, DISPR, IDR, OBJR - ANALOGICZNIE DLA PRAWEGO ARGU-
552 C TRESLT - TYP BAZOWY WYNIKU OPERACJI ARYTMETYCZNEJ
553 C CONVL, CONVR - FLAGA KONWERSJI LEWEGO I PRAWEGO ARGUMENTU
554 C OPERACJI ARYTMETYCZNYCH LUB RELACJI
557 C 1 - KONWERSJA DO REAL
558 C 2 - KONWERSJA DO INTEGER (?)
559 C NRPAR - NUMER PARAMETRU (PROCEDURA MPKIND)
561 C IRECN - INDEKS SZCZYTU STOSU STALYCH REAL
562 C ISFIN - INDEKS SZCZYTU SLOWNIKA PROTOTYPOW
564 C LPMSYS - INDEKS PIERWSZEGO SLOWA W IPMEM OBSZARU NIEPRZEZ-
565 C NACZONEGO NA PROTOTYPY SYSTEMOWE
566 C LPML - INDEKS PIERWSZEGO SLOWA OBSZARU WOLNEGO W IPMEM
567 C LPMF - INDEKS OSTATNIEGO SLOWA WOLNEGO OBSZARU W IPMEM
569 C IDENTYFIKATORY PROTOTYPOW SYSTEMOWYCH
570 C NRINT - IDENTYFIKATOR PROTOTYPU INTEGER
576 C NRTEXT - STRING (TEXT)
577 C NRUNIV - IDENTYFIKATOR PROTOTYPU UNIWERSALNEGO
578 C NATTR - IDENTYFIKATOR PSEUDO-ATRYBUTU (Z NUMEREM -1)
579 C NRNONE - IDENTYFIKATOR PROTOTYPU TYPU NONE (UNIWERSALNY
581 C NBLSYS - IDENTYFIKATOR BLOKU SYSTEMOWEGO
582 C NBLUS - BLOKU GLOWNEGO UZYTKOWNIKA
584 C INSYS - FLAGA SPOSOBU REZERWACJI (PRZEZ MGETM) PAMIECI
585 C W IPMEM - .TRUE. JESLI REZERWACJA W CZESCI SYSTE-
587 C LOCAL - FLAGA DOSTEPU DO OBIEKTOW - .TRUE. JESLI OBIEKT
589 C OWN - FLAGA DOSTEPU DO OBIEKTOW - .TRUE. JESLI OBIEKT NIE
590 C POCHODZI Z PREFIKSOW (TYLKO Z WLASCIWEGO OBIEKTU)
591 C OBJECT - PROTOTYP OBIEKTU, Z KTOREGO POCHODZIL OSTATNIO
592 C SZUKANY IDENTYFIKATOR (OBIEKT POCHODZACY Z CIAGU SL)
595 COMMON/STREAM/ ERRFLG,LINE,IBUF23(272),JUNK(260)
597 LOGICAL MLOCTP,MDISTP
600 COMMON/TEST/TESTC,TESTS,TESTH
601 LOGICAL TESTC,TESTS,TESTH
605 equivalence (y, m(1))
607 common /stacks/ btsins, btstem
611 C INICJA=.TRUE. W FAZIE WYLICZANIA WARTOSCI STALYCH SYMBOLICZNYCH I GRANIC
612 C TABLIC STATYCZNYCH.
617 C ERROR=NUMER BLEDU DLA WSPOLNEJ SYGNALIZACJI /9900/
620 C DLA PETLI "FOR" : TRUE --> WYSTAPILO "STEP", FALSE --> NIE WYSTAPILO
624 C AUXILIARY VARIABLES
625 INTEGER ATS,ELEM,I,IND
628 cdsw&bc FRSTTS=LPMEM+1
631 C =INDEKS POCZATKU TABLICY SYMBOLI - CZESC DLA ATRYBUTOW DEKLAROWANYCH
633 C OSTATNIE SLOWO IPMEM ZAWIERA INDEKS PIERWSZEGO OD PRAWEJ WOLNEGO
634 C SLOWA NA POMOCNICZY SLOWNIK DLA WYZNACZANIA ADRESOW ATRYBUTOW
635 C DEKLAROWANYCH W TABLICY SYMBOLI.
657 cdsw&bc TEMPNR=LMEM-6
673 C.....GLOWNA PETLA. W ZALEZNOSCI OD SYMBOLU Z WEJSCIA WYBIERZ AKCJE
675 GO TO(100,200,300,400,500,600,700,800,900,1000,1100,1200,1300,
676 X 1400,1500,1600,1700,1800,1900,2000,2100,2200,2300,2400,2500,
677 X 2600,2700,2800,2900,3000,3100,3200,3300,3400,3500,3600,3700,
678 X 3800,3900,4000,4100,4200,4300,4400,4500,4600,4700,4800,4900,
679 X 5000,5100,5200,5300,5400,5500,5600,5700,5800,5900,6000,6100,
680 X 6200,6300,6400,6500,6600,6700,6800,6900,7000,7100,7200,7300,
681 X 7400,7500,7600,7700,7800,7900,8000,8100,8200,8300,8400,8500,
682 X 8600,8700,8800,8900,9000,9100,9200,9300,9400),WB
683 cbc X 8600,8700,8800,8900,9000),WB
684 cbc X 8600,8700,8800),WB
686 C---------------- AND --------------------------
691 C--------------- ARRAY OF ------------------------
693 C ZWRACA : SLOWO -2 =0 - TYP STATYCZNY (-3),(-4)
694 C SLOWO -2 >0 - ATS ZMODYFIKOWANEGO TYPU FORMALNEGO
698 C CZY NA CZUBKU JEST KLASA,REKORD LUB NAZWA TYPU?
700 IF(ELEM.EQ.0)GO TO 40
701 IF(ELEM.LT.7 .OR. ELEM.GT.9)GO TO 250
702 C OK. WPISZ LICZBE ARRAY OF
705 IF(STACK(VALTOP-2).NE.0) CALL SMODIFY(STACK(VALTOP-2),WB)
707 C.....NIEPOPRAWNY CZUBEK STOSU
711 C--------------- ASSIGN --------------------------
713 C CZUBEK STOSU POWINIEN ZAWIERAC WARTOSC,PONIZEJ SA LSE /POWYZEJ LSTFOR DO
718 C--------------- ASSIGN CONST --------------------
719 C CZUBEK STOSU POWINIEN ZAWIERAC STALA /WARTOSC WYRAZENIA DEFINIUJACEGO/,
720 C PONIZEJ CZUBKA JEST STALA DEFINIOWANA,MAJACA W SLOWIE -2 INDEKS
721 C SWOJEGO OPISU W IPMEM.
724 400 IF(STACK(VLPREV).EQ.0 .OR. STACK(VALTOP).EQ.0)GO TO 420
725 IF(STACK(VALTOP).EQ.1)GO TO 410
726 CALL SERRO2(429,VLPREV)
728 C POBIERZ ADRES OPISU STALEJ DEFINIOWANEJ
729 410 ELEM=STACK(VLPREV-2)
730 C WPISZ WARTOSC I TYP
731 IPMEM(ELEM-1)=STACK(VALTOP-2)
733 IPMEM(ELEM-3)=STACK(VALTOP-4)
737 C--------------- ATTACH --------------------------
738 C CZUBEK STOSU POWINIEN ZAWIERAC REFERENCJE
744 C--------------- BLOCK ---------------------------
745 C WYSTAPIENIE BLOKU O NUMERZE WN
747 CALL QUADR2(186,IPMEM(WB))
751 C--------------- CALL ----------------------------
752 C NA PEWNO BLAD: PROCEDURA SAMA "ZJADA" CALL.
757 C--------------- CASE ----------------------------
760 C WRACA DO ETYKIETY 30
761 C--------------- CASE LABEL ----------------------
764 C WRACA DO ETYKIETY 30
765 C--------------- COMA ----------------------------
767 C PONIZEJ CZUBKA JEST :
768 C UNIWERSALNY LUB ELEMENT TABLICY/DYN./ LUB TABLICA STATYCZNA
769 C LUB REKORD,KLASA,BLOK PREF.,PROCEDURA,FUNKCJA.
770 C NA CZUBKU JEST INDEKS LUB PARAMETR AKTUALNY.
771 C PO OBSLUZENIU WOLA SNEXT
773 1000 ELEM=STACK(VLPREV)
774 C JESLI UNIWERSALNY-OMIN
775 IF(ELEM.EQ.0)GO TO 30
777 IF(ELEM.GT.7)GO TO 1050
778 C NIE,MOZE TABLICA STATYCZNA?
779 IF(ELEM.EQ.5)GO TO 1060
780 C ZATEM TABLICA DYNAMICZNA /ELEMENT TABLICY/
788 C--------------- CONST:BOOL,CHAR,INT,NONE,REAL,STRING -----
796 C.....WSPOLNA AKCJA DLA WSZYSTKICH STALYCH,ROWNIEZ NONE
801 STACK(VALTOP-4)=CONSNR(ELEM)
804 C.....WYROZNIONY POCZATEK DLA NONE
810 C--------------- COPY ----------------------------
811 C NA CZUBKU STOSU JEST WARTOSC DO SKOPIOWANIA.
814 C JESLI UNIWERSALNY-POMIN
815 IF(STACK(VALTOP).EQ.0)GO TO 40
816 C ZBADAJ TYP. POMIN NONE.
818 IF( ELEM.EQ.NRNONE) GO TO 40
820 IF(STACK(VALTOP-3).GT.0)GO TO 1750
821 C NIE. CZY TYP PIERWOTNY?
823 IF(CONSNR(I).EQ.ELEM)GO TO 1790
827 CALL QUADR3(41,ATS,STACK(VALTOP-2))
835 C--------------- DETACH --------------------------
837 1800 CALL QUADR1(187)
841 C--------------- DOT ------------------------------
846 C WB = NAZWA PO KROPCE
848 IF(STACK(VALTOP).NE.0)GO TO 1910
849 C UNIWERSALNY.IDENT ZASTAP PRZEZ UNIWERSALNY Z NAZWA PO KROPCE
853 1910 I=STACK(VALTOP-4)
854 C I=KWALIFIKACJA WARTOSCI PRZED KROPKA
855 IND=MDOT(STACK(VALTOP-3),I,STACK(VALTOP-1),WB)
857 C ATS=WARTOSC PRZED KROPKA
859 C DALEJ JAK DLA WIDOCZNEGO IDENTYFIKATORA
861 C--------------- DOWNTO --------------------------
862 2000 CALL SFORTO(.FALSE.,FORSTP)
864 C POWROT DO ETYKIETY 40
865 C--------------- SIGN ----------------------------
869 IF(ELEM.EQ.0)GO TO 40
870 IF(STACK(VALTOP-3).GT.0)GO TO 2110
872 IF(STACK(VALTOP-4).EQ.NRINT)GO TO 2130
873 IF(STACK(VALTOP-4).EQ.NRRE)GO TO 2150
874 C ... NIEPOPRAWNY TYP ARGUMENTU SIGN
877 C ... INTEGER. STALA ?
878 2130 IF(ELEM.NE.1)GO TO 2160
883 2150 IF(ELEM.NE.1)GO TO 2160
884 cdsw&bc IF(STALER(IDL).LT. 0.0) ATS= -1
885 cdsw&bc IF(STALER(IDL).EQ. 0.0) ATS= 0
887 if(staler(idl) .lt. 0.0) ats= -1
888 if(staler(idl) .eq. 0.0) ats= 0
893 if(y .lt. 0.0) ats= -1
894 if(y .eq. 0.0) ats= 0
900 CALL QUADR3(31,ATS,IDL)
901 C ZASTAP PRZEZ WARTOSC
903 2170 STACK(VALTOP-1)=0
905 STACK(VALTOP-4)=NRINT
907 C--------------- ESAC ----------------------------
910 C--------------- FIN -----------------------------
916 C--------------- FIRSTINSTR ----------------------
918 C JESLI TO FAZA WYLICZANIA STALYCH - ZAPAMIETAJ TO MIEJSCE I KONCZ.
920 2400 IF(INICJA)GO TO 2450
922 C PIERWSZA INSTRUKCJA MODULU, WB=NUMER INSTRUKCJI
927 C ... KONIEC WYLICZANIA STALYCH DLA TEGO MODULU
928 2450 IPMEM(P+8)=IX(258)
931 C--------------- FOR END -------------------------
935 C POWROT DO ETYKIETY 30
936 C--------------- FOR VARIABLE --------------------
938 C PISZ : KONIEC BLOKU BAZOWEGO /BY UNIKNAC PONOWNEGO PRZYDZIALU
939 C TYCH SAMYCH ATRYBUTOW ROBOCZYCH W JEDNYM BLOKU/
940 2600 CALL QUADR1(176)
941 C ZAREZERWUJ 2 NUMERY DLA ATRYBUTOW ROBOCZYCH DLA PETLI FOR
943 IF(FRSTTS.GE.LSTEMP)CALL SSTOVF
949 C ... ZMIENNA PROSTA?
953 C ="OCZEKIWANA ZMIENNA PROSTA"
954 IF(IND.NE.3 .OR. STACK(VALTOP-7).NE.0)GO TO 9900
956 CALL SCHECK(411,NRINT)
959 C--------------- FROM ----------------------------
964 C--------------- IDENTYFIKATOR -------------------
965 C WB=IDENT , WN=NAZWA ZE SCANNERA
969 C..........WSPOLNE ROZPOZNANIE I OBSLUGA DLA IDENTYFIKATORA PRZEZ KROPKE
971 C IND = ADRES ZEROWEGO SLOWA OPISU ROZPOZNANEGO IDENTYFIKATORA
972 C ATS= ATS WARTOSCI PRZED KROPKA /I=KWALIFIKACJA/ LUB ZERO
975 C WLOZ NA STOS , WPISZ NAZWE , WEZ KOLEJNY SYMBOL
979 C FAZA WYLICZANIA STALYCH ?
982 C JESLI TO "UNIWERSALNY"-NIC NIE ROB
983 IF(ELEM.EQ.0)GO TO 50
984 2807 STACK(VALTOP-6)=0
988 IF(ELEM.EQ.7)GO TO 2880
989 IF(ELEM.GT.5)GO TO 2870
990 C.....STALA,ZMIENNA,TABLICA STATYCZNA. WSTAW TYP.
991 STACK(VALTOP-4)=IPMEM(IND-3)
993 IF(ELEM.NE.1)GO TO 2815
996 IF(.NOT.INICJA)STACK(VALTOP-2)=IPMEM(IND-1)
997 C WSTAWIONY TYP,WARTOSC STALEJ
999 C....."ZMIENNA","TABLICA STATYCZNA"
1000 2815 STACK(VALTOP-3)=IPMEM(IND-4)
1002 IF(ATS.EQ.0)STACK(VALTOP-2)=TSINSE(IND,LOCAL)
1004 C.....TYPU FORMALNEGO?
1005 ELEM=STACK(VALTOP-4)
1006 2820 ELEM=IAND(IPMEM(ELEM),15)
1007 C ELEM=POLE T TYPU ZMIENNEJ
1008 IF(ELEM.NE.6)GO TO 2830
1009 C A WIEC TYP FORMALNY. PRZEZ KROPKE?
1010 IF(ATS.NE.0)GO TO 2825
1012 STACK(VALTOP-6)=OBJECT
1013 C CZY TYP DOSTEPNY PRZEZ DISPLAY?
1014 IF(MDISTP(IPMEM(IND-1),STACK(VALTOP-4),ELEM))GO TO 2823
1015 C TYP NIEDOSTEPNY PRZEZ DISPLAY,WSTAW SL ZMIENNEJ
1016 STACK(VALTOP-5)= - IPMEM(IND-1)
1018 C TYP DOSTEPNY PRZEZ DISPLAY,WSTAW WARSTWE
1019 2823 STACK(VALTOP-5)=ELEM
1021 C.....PRZEZ KROPKE. TYP JEST LOKALNYM ATRYBUTEM?
1022 2825 STACK(VALTOP-5)= -1
1023 IF(MLOCTP(STACK(VALTOP-4),I))STACK(VALTOP-5)= +1
1024 C.....TYP JUZ WSTAWIONY
1025 2830 IF(STACK(VALTOP).EQ.3)GO TO 50
1026 IF(STACK(VALTOP).EQ.12)GO TO 2875
1027 C....."TABLICA STATYCZNA"
1032 C ... W FAZIE WYLICZANIA STALYCH
1033 2850 IF(ELEM.LT.2)GO TO 2860
1034 C NIELEGALNY OBIEKT W WYRAZENIU DEFINIUJACYM STALA.
1037 2860 IF(ELEM.EQ.0)GO TO 50
1038 C STALA DEFINIOWANA ? /TAK,JESLI WB = "LSE" /
1039 IF(WB.NE.39)GO TO 2865
1040 C TAK. WSTAW DO SLOWA -2 ADRES OPISU STALEJ
1043 C STALA W WYRAZENIU DEFINIUJACYM. WSTAW DO SLOWA -2 WARTOSC
1044 C / DLA REAL - NUMER STALEJ /
1045 2865 STACK(VALTOP-2)=IPMEM(IND-1)
1046 C CZY STALA MA JUZ OKRESLONA WARTOSC ?
1047 IF(IPMEM(IND-3).NE.0)GO TO 2807
1048 C TYP = 0 /SLOWO -3/ OZNACZA,ZE STALA JESZCZE NIE MIALA OKRESLONEJ
1053 C.....REKORD,KLASA,PROCEDURA,FUNKCJA,SYGNAL,OPERATOR.
1054 2870 ELEM=IPMEM(IND-3)
1058 C DLA FUNKCJI ZBADAJ CZY TYP FORMALNY
1059 GO TO (2872,2872,2872,2875,2820,2875,2890),IDR
1061 C ... KLASA,REKORD . NEW ?
1062 2872 STACK(VALTOP-2)=0
1064 IF(WB.EQ.40)GO TO 2873
1066 IF(WB.NE.36)GO TO 50
1067 C BRAK NEW PRZED LEWYM NAWIASEM
1074 C ... PROCEDURA,SYGNAL, C.D. DLA FUNKCJI
1075 C JESLI WB ROZNE OD "," LUB ")" - WYWOLAJ /INACZEJ-PODEJRZEWAJ PARAMETR/
1076 2875 IF(WB.NE.10 .AND. WB.NE.54)GO TO 2874
1078 C....."NAZWA TYPU" /PARAMETR FORMALNY "TYPE"/
1079 2880 STACK(VALTOP-3)=0
1082 IF(ATS.NE.0)GO TO 2885
1084 STACK(VALTOP-2)=TSINSE(IND,LOCAL)
1085 C ZERO ARRAY OF,TYP FORMALNY,ATS TEGO TYPU
1086 STACK(VALTOP-6)=OBJECT
1088 C.....PARAMETR "TYPE" PRZEZ KROPKE
1090 2885 STACK(VALTOP-2)=TSTEMP(2)
1091 CALL QUADR4(85,STACK(VALTOP-2),SMEMBER(VALTOP),IND)
1093 C.....OPERATOR, JESLI WB ROZNE OD "(" - BLAD
1095 C = NIELEGALNE WYSTAPIENIE NAZWY OPERATORA
1096 IF(WB.NE.36)GO TO 9901
1098 C--------------- IF-FALSE , IF-TRUE ----------------
1102 C IND= 1 DLA IF-TRUE , = 0 DLA IF-FALSE
1104 C NA CZUBKU WARTOSC TYPU BOOLEAN?
1105 CALL SCHECK(407,NRBOOL)
1107 IF(STACK(VALTOP).EQ.1)GO TO 3050
1108 CALL QUADR3(151+IND,STACK(VALTOP-2),WB)
1110 C SKOK PRZY STALEJ WARTOSCI WYRAZENIA
1111 3050 IF(IND+STACK(VALTOP-2).NE.0) GOTO 30
1112 C ZATEM TRUE, IF TRUE FALSE, IF FALSE
1116 C------ INNER --------
1117 C LOKALNE WYSTAPIENIE
1118 3100 IF (INNER.NE.0) CALL MERR(424+INNER,0)
1120 CALL QUADR2(178,IPMEM(P+23))
1121 C ZAZNACZ: INSTRUKCJE PO INNER
1126 C------- INSTREND--------
1130 CJF IF (LINE.EQ.ATLINE) CALL STOPAT(ATLINE)
1132 C JESLI BYLY BLEDY CZYSC STOS
1137 C PRZY ZGASZONEJ OPCJI "OPTIMALIZATION" LUB "SYSPP" ZAKONCZ BLOK BAZOWY
1138 IF(OPTOPT.AND.IPMEM(NBLSYS+4).EQ.0)GO TO 3250
1142 C PRZY WYLACZONEJ OPCJI "TRACE" WYPISZ UJEMNY NUMER
1144 IF(.NOT.OPTTRC)ELEM=-LINE
1145 CALL QUADR2(177,ELEM)
1147 C--------------- JUMP -----------------------------------
1149 3350 CALL QUADR2(182,WB)
1152 C--------------- KILL ----------------------------
1153 C CZUBEK POWINIEN ZAWIERAC WARTOSC REFERENCYJNA
1158 C--------------- LABEL ----------------------------
1164 C--------------- LEFT PARANTHESIS ----------------
1166 3600 IF(STACK(VALTOP).LT.8)CALL SVALUE
1170 C--------------- ----------------------------
1173 C--------------- LOWINDEX ------------------------
1174 C NA CZUBKU POWINIEN BYC ELEMENT SPROWADZALNY DO WARTOSCI INTEGER
1177 C--------------- LSE -----------------------------
1178 C NA CZUBKU POWINNA BYC LEWA STRONA PODSTAWIENIA: UNIWERSALNY,
1179 C ZMIENNA,ELEM. TABLICY,TABLICA STATYCZNA LUB - DLA INICJALIZACJI-
1183 ELEM=STACK(VALTOP)+1
1184 IF(ELEM.GT.6)GO TO 3980
1185 GO TO(40,3910,3980,40,40,40),ELEM
1186 C.....STALA. LEGALNE TYLKO PODCZAS INICJALIZACJI.
1187 3910 IF(INICJA)GO TO 40
1190 C ZASTAP PRZEZ UNIWERSALNY I OBSLUZ OD NOWA
1193 C--------------- NEW -----------------------------
1194 C NA PEWNO BLAD: KLASA /REKORD/ SAMA "ZJADA" NEW
1199 C--------------- NEWARRAY ------------------------
1204 C--------------- NOT -----------------------------
1209 C--------------- OPERATION -----------------------
1216 C--------------- OPTION --------------------------
1221 C--------------- OR ------------------------------
1223 4500 CALL SBOOLEX(0)
1226 C--------------- OTHERWISE -------------------------
1231 C--------------- PREFBLOCK -------------------------
1237 STACK(VALTOP-4)=IPMEM(WB)
1241 C--------------- PRIMITIVE TYPE ------------------
1248 STACK(VALTOP-4)=CONSNR(WB)
1251 C--------------- QUA -----------------------------
1255 IF(STACK(VALTOP).EQ.0)GO TO 40
1256 TLDIM=STACK(VALTOP-3)
1257 TLBAS=STACK(VALTOP-4)
1259 STACK(VALTOP-4)=MAQUAB(WB)
1260 CALL QUADR3(149,STACK(VALTOP-2),STACK(VALTOP-4))
1263 C--------------- I-O-END -------------------------
1265 C WYSTAPILY ARGUMENTY ?
1266 5000 IF(FLARGS.LT.2)CALL MERR(444,0)
1267 IF(FILE.NE.0)CALL SPOP
1274 C--------------- RELATION ------------------------
1281 C--------------- RESUME --------------------------
1287 C--------------- RETURN --------------------------
1294 C--------------- RIGHT PARENTHESIS -------------
1296 5400 IF(STACK(VLPREV).LT.8)GO TO 1000
1303 C--------------- START -------------------------
1308 C--------------- STEP ---------------------------
1312 c check if constant step
1313 if (stack(valtop) .ne. 1) goto 5601
1314 c yes, error if step < 0
1315 if (stack(valtop-2) .lt. 0) call serror(479)
1320 c generate code to check if step >= 0
1321 call quadr2(240, stack(valtop-2))
1325 C--------------- STOP --------------------------
1333 C--------------- THIS --------------------------
1336 C WB=NAZWA PO 'THIS'
1337 C WEZ Z DISPLAYA ADR.VIRTUALNY,WSTAW NA STOS WARTOSC
1340 STACK(VALTOP-2)=TSTEMP(4)
1341 STACK(VALTOP-4)=MTHIS(WB)
1342 CALL QUADR3(15,STACK(VALTOP-2),STACK(VALTOP-4))
1347 C--------------- TO ----------------------------
1348 5900 CALL SFORTO(.TRUE.,FORSTP)
1351 C--------------- WAIT ---------------------------
1356 C--------------- WRITE ---------------------------
1358 cdsw 6100 CALL SWRITE(*30,*40)
1359 C POWROT DO ETYKIETY 30 LUB 40
1360 cdsw -----------------------------
1361 6100 call swrite(whdsw)
1363 cdsw -----------------------------
1365 C--------------- WRITELN -------------------------
1368 CALL QUADR2(132,58+FLMODF)
1371 C--------------- BOUNDS ----------------------------
1376 C--------------- LOWER , UPPER ----------------------
1378 C CZUBEK STOSU ZAWIERA ADRES TABLICY
1381 C WARTOSC TABLICOWA?
1383 IF(STACK(VALTOP-3).EQ.0)GO TO 9900
1386 CALL QUADR3(2*WB-95+OPTMEM,RESULT,STACK(VALTOP-2))
1387 C ZASTAP PRZEZ WARTOSC INTEGER
1391 C--------------- LOCK , UNLOCK ---------------------
1395 C = NUMER PROCEDURY STANDARDOWEJ LOCK,UNLOCK
1397 C PRZEKAZ ADRES ZMIENNEJ
1398 CALL QUADR4(145,RESULT,IDL,0)
1400 CALL QUADR2(132,IDL)
1401 C ZBADAJ TYP : SEMAPHORE ?
1403 IF(STACK(VALTOP-3).GT.0.OR.IAND(IPMEM(IDR),15).NE.9)
1405 C DLA LOCK,UNLOCK TO JUZ WSZYSTKO
1406 IF(WB.NE.68)GO TO 30
1407 C ... TEST&SET . ODCZYTAJ WARTOSC
1409 CALL QUADR4(23,RESULT,IDL,1)
1410 C ZASTAP PRZEZ WARTOSC
1411 CALL SRESLT1(NRBOOL)
1413 C--------------- TEST&SET --------------------------
1417 C--------------- WIND , TERMINATE ------------------
1419 C NIELEGALNE POZA HANDLEREM
1421 7000 IF(UNIT.EQ.2)GO TO 7050
1425 7050 CALL QUADR1(103+WB)
1428 C--------------- RAISE -----------------------------
1430 C NA PEWNO BLAD: SYGNAL SAM "ZJADA" RAISE.
1431 7100 CALL SERROR(449)
1434 C--------------- LAST-WILL -------------------------
1436 C ZAKONCZ INSTRUKCJE MODULU
1439 C INNER BEDZIE NIELEGALNY
1441 C WYPISZ ETYKIETE LAST-WILL
1445 C--------------- READ ----------------------------
1446 cdsw 7300 CALL SREAD(*30,*40)
1447 cdsw -------------------------------
1448 7300 call sread(whdsw)
1450 cdsw --------------------------------
1451 C POWROT DO ETYKIETY 30 LUB 40
1452 C--------------- READLN --------------------------
1455 CALL QUADR2(132,42-FLMODF)
1458 C--------------- PUT -----------------------------
1460 cdsw 7500 CALL SPUT(*30,*40)
1461 C POWROT DO ETYKIETY 30 LUB 40
1462 cdsw ---------------------------
1463 7500 call sput(whdsw)
1465 cdsw ---------------------------
1467 C--------------- GET -----------------------------
1469 cdsw 7600 CALL SGET(*30,*40)
1470 cdsw --------------------------
1471 7600 call sget(whdsw)
1473 cdsw ---------------------------
1474 C POWROT DO ETYKIETY 30 LUB 40
1476 C--------------- OPEN2 ---------------------------
1479 C CZUBEK POWINIEN ZAWIERAC NAZWE PLIKU (arrayof char)
1480 cbc CALL SCHECK(414,NRTEXT)
1481 if (stack(valtop-3) .ne. 1) goto 7801
1483 if (n .ne. nrchr) goto 7801
1485 cfile CALL QUADR4(145,ATS,73,1)
1486 cfile -------------------------
1487 call quadr4(145,ats,73,2)
1488 cfile --------------------------
1490 C DALEJ JAK DLA OPEN1
1492 C--------------- OPEN1 ---------------------------
1493 cfile 7700 N=STACK(VALTOP)
1494 cfile ----------- added ------------------------
1496 c nowa postac OPEN: OPEN(f,T,nazwa) - proc.stand. 73
1497 c OPEN(f,T) - proc.stand. 72
1498 c T okresla rodzaj operacji. Dozwolone: integer, real ,boolean, char, text
1499 c zmiana w interpreterze dla procedur standardowych 72 i 73:
1500 c parametr 0: output, adres nowego obiektu typu file
1501 c parametr 1: rodzaj operdcji () zalezy do T):
1502 c 1-text, 2-char, 3-int, 4-real, 5-direct
1503 c parametr 2: nazwa ( tylko dla 73)
1505 c stos zawiera na czubku T, ponizej F
1508 c nazwa typu pierwotnego?
1509 if(stack(valtop).ne.7) go to 7702
1510 c legalne nazwy typu: text, char ,integer, real
1513 if(n.eq.nrtext) go to 7701
1514 if(n.eq.nrint) go to 7705
1515 if(n.eq.nrre) go to 7706
1516 if(n.eq.nrchr) go to 7708
1518 if (n .eq. -17) goto 7709
1519 c error - nie nazwa typu lub nielegalny typ
1520 7702 call serror(419)
1537 call quadr4(145,n,wb-5,1)
1541 cfile -------------------------------------
1543 IF(N.GT.2 .AND. N.LT.6)GO TO 7720
1548 CALL QUADR2(132,WB-5)
1550 CALL QUADR4(23,ATS,WB-5,0)
1551 CALL SSTORE(VALTOP,ATS)
1553 7801 call serror(416)
1556 C--------------- EOF0 ----------------------------
1562 C--------------- EOF1 ----------------------------
1565 C WRACA BEZPOSREDNIO DO ETYKIETY 40
1567 C--------------- PAR. INPUT ----------------------
1570 C PARAMETR INPUT WSTAWKI W ASSEMBLERZE
1572 C WB = NUMER REJESTRU. C.D. DLA IN-OUT
1574 C WPISZ NUMER REJESTRU DO SLOWA -1
1575 C STACK(VALTOP-1)=SREGSTR(WB)
1579 C--------------- PAR. OUTPUT ---------------------
1582 C PARAMETR OUTPUT WSTAWKI W ASSEMBLERZE
1587 C--------------- PAR. INOUT ----------------------
1590 C PARAMETR IN-OUT WSTAWKI W ASSEMBLERZE
1591 C NAJPIERW OBSLUZ JAK PAR.OUTPUT, POTEM JAK PAR.INPUT
1595 C--------------- ASSEMBLER -----------------------
1598 C WSTAWIANY TEKST W ASSEMBLERZE
1602 C--------------- EOLN0 ---------------------------
1607 C--------------- EOLN1 ---------------------------
1612 C-------- THIS-COROUTINE ----------------------------
1615 C WLOZ NA STOS 'WARTOSC'
1623 C ODCZYTAJ WARTOSC : FUNKCJA STANDARDOWA 76,77
1624 CALL QUADR2(132,WB-11)
1625 CALL QUADR4(23,ATS,WB-11,0)
1628 C--------- THIS-PROCESS ----------------------------
1633 c--------- putrec -----------------------------------
1635 8900 call spgrec(83)
1638 c--------- getrec -----------------------------------
1639 9000 call spgrec(82)
1642 cbc added concurrent statements
1643 c--------- enable -----------------------------------
1644 9100 call sconc(223)
1647 c--------- disable ----------------------------------
1648 9200 call sconc(224)
1651 c--------- accept -----------------------------------
1652 9300 call sconc(225)
1654 c--------- procedure list end -----------------------
1655 c error - skip and read next symbol
1658 C------------------------------------------------------
1660 C..........WSPOLNA OBSLUGA BLEDOW. ERROR=NUMER BLEDU.
1661 C ZASTAPIENIE CZUBKA STOSU PRZEZ UNIWERSALNY Z ZACHOWANIEM NAZWY.
1662 C WRACA NA POCZATEK PETLI.
1664 9901 CALL SERROR(ERROR)
1665 ELEM=STACK(VALTOP-1)
1668 STACK(VALTOP-1)=ELEM
1672 C------------------------------------------------------
1674 C POMOCNICZA. INICJALIZACJA SLOWNIKA ATRYBUTOW,
1675 C ZMIENNYCH UNIT,INNER,LSTWILL
1676 C NIE JEST WOLANA W FAZIE WYLICZANIA STALYCH.
1678 C DLA KLAS WSTAWIA DO SLOWA +1 ZERO.
1679 C JESLI MODUL MA PREFIKS,WSTAWIA DO SLOWA +1 PREFIKSU 1.
1681 C ##### OUTPUT CODE : 184 .
1687 INTEGER AUX0(8),AUX(7)
1688 EQUIVALENCE (AUX0(2),AUX(1))
1689 DATA AUX0/1,3,5,5,4,4,3,2/
1690 C = RODZAJ MODULU W ZALEZNOSCI OD POLA "S" ZEROWEGO SLOWA
1692 cdsw DATA STCKAG,STCKA0,STCKAP /0,8,8,8,8,8,10,4,8,8,8,8,8,8,8,8/
1693 cdsw X ,APETYT /1,2,3,2/
1696 C.....JAKI TO MODUL ?
1700 C SPRAWDZ POLE "S" : BITY 5..7
1701 UNIT=IAND(ISHFT(N,-8),7)
1703 C MOZE KLASA ? /JESLI POLE "T",BITY 12..15, <> 1 /
1704 IF(IAND(N,15).EQ.1)GO TO 100
1709 C.....ZAZNACZ : JESZCZE NIE UZYWANY JAKO PREFIKS
1711 IF(UNIT.LT.3)GO TO 200
1712 C JESLI MA PREFIKS - ZAZNACZ DLA PREFIKSU,ZE UZYWANY
1714 IF(IDL.NE.0)IPMEM(IDL+1)=1
1715 C.....WYPISZ : POCZATEK MODULU
1716 200 CALL QUADR2(184,P)
1722 C-----------------------------------------------------------------------------
1724 C DOSTARCZA KOLEJNEGO SYMBOLU KODU POSREDNIEGO WYGENEROWANEGO
1725 C PRZEZ PARSER. SYMBOL TEN WPISUJE NA WB.
1727 C CZYTA ZE STRUMIENIA "INP" , OPISANEGO W BUFORZE IBUF3 ,DO TABLICY IX .
1732 COMMON/TEST/TESTC,TESTS,TESTH
1733 LOGICAL TESTC,TESTS,TESTH
1737 C = INDEKS W BUFORZE IX OSTATNIO WCZYTANEGO SYMBOLU
1738 EQUIVALENCE (IX(257),CURRENT)
1740 C = NUMER OSTATNIO WCZYTANEGO REKORDU
1741 EQUIVALENCE (IX(258),RECORD)
1742 COMMON/STREAM/ ERRFLG,LINE,IBUF2(265),IBUF3(7),JUNK(260)
1744 C.....OSTATNI W REKORDZIE?
1745 IF(CURRENT.EQ.255)GO TO 200
1751 C1000 FORMAT(' NEXT, WB =',I6)
1755 C.....OSTATNI. WCZYTAJ KOLEJNY REKORD
1757 C SLOWO 256 ZAWIERA NUMER KOLEJNEGO REKORDU
1758 CALL SEEK(IBUF3,RECORD)
1766 C------------------------------------------------------
1768 C NA CZUBKU JEST ARGUMENT ATTACH. BADA TYP,GENERUJE KOD,
1769 C ZDEJMUJE ZE STOSU.
1771 C ##### OUTPUT CODE : 188 .
1773 C ##### DETECTED ERROR(S) : 477
1780 common /stacks/ btsins, btstem
1785 IF(STACK(VALTOP).EQ.0)RETURN
1786 IF(STACK(VALTOP-3).GT.0)GO TO 500
1787 ELEM=STACK(VALTOP-4)
1788 ELEM=IAND(IPMEM(ELEM),15)
1789 IF(ELEM.GT.7 .AND. ELEM.LT.13 .OR. ELEM.EQ.2)GO TO 500
1790 ELEM=STACK(VALTOP-2)
1792 cdsw&ail IF(STACK(VALTOP).EQ.1)ELEM=LMEM-3
1793 if (stack(valtop).eq.1) elem = btstem-3
1795 CALL QUADR2(188,ELEM)
1797 C NIEPOPRAWNY TYP ARGUMENTU ATTACH
1798 500 CALL SERROR(477)
1803 C--------------------------------------------------------------------------
1805 C OBSLUGUJE POCZATEK INSTRUKCJI "CASE".
1806 C CZUBEK STOSU ZAWIERA WARTOSC WYRAZENIA CASE,NASTEPNY SYMBOL
1807 C WEJSCIOWY JEST NUMEREM ETYKIETY BAZOWEJ.
1808 C WKLADA NA STOS W TABLICY LAB OPIS NOWEJ INSTRUKCJI CASE,
1809 C PRZY CZYM : JESLI ZAGNIEZDZENIE = 4 , WYSYLA OPIS POPRZEDNICH
1810 C 3 CASE-OW NA DYSK JAKO REKORD O NUMERZE IOP(2),USTAWIAJAC OVER=6,
1811 C JESLI JEDNAK ZAGNIEZDZENIE > 6 , ZWIEKSZA JEDYNIE LICZNIK NADMIAROWYCH
1814 C OGRANICZENIA : ZAGNIEZDZENIE MUSI BYC < 7 ,
1815 C ROZNICA MIEDZY NAJWIEKSZA A NAJMNIEJSZA ETYKIETA < 160 .
1818 C < CASE , ATS WYRAZENIA , ETYKIETA BAZOWA -1 , OPTCSC+OPTCSF >
1821 C ##### OUTPUT CODE : 189 .
1823 C ##### DETECTED ERROR(S) : 402 , 405 .
1830 COMMON/STREAM/ERRFLG,LINE,IBUF2(265),IBUF3(7),JUNK(260)
1832 C IBUF3 - OPIS STRUMIENIA Z WCZYTYWANYM I PRODUKOWANYM KODEM POSREDNIM
1835 COMMON/CASE/DEEP,OVER
1837 EQUIVALENCE(LAB(1),IPMEM(1))
1841 DATA MAXINTEGER,MININTEGER / x'7FFFFFFF' , x'80000000' /
1843 DATA MAXINTEGER,MININTEGER / x'7fff', -x'7fff' /
1846 C LAB ZAWIERA OPISY ZAGNIEZDZONYCH INSTRUKCJI CASE.
1847 C WYKORZYSTYWANYCH JEST 256 SLOW W TABLICY IPMEM :
1848 C OD LMEM-515 DO LMEM-260 .
1850 C SLOWO 0 : TYP WYRAZENIA CASE
1851 C +1 : NUMER ETYKIETY BAZOWEJ
1852 C +2 : MINIMALNA WARTOSC ETYKIETY
1853 C +3 : MAKSYMALNA WARTOSC ETYKIETY
1854 C +4 : LICZBA ETYKIET
1855 C +5..+84 : 160 BAJTOW NA WZGLEDNY NUMER ETYKIETY
1856 C OPIS BIEZACEJ INSTRUKCJI CASE WSKAZANY JEST PRZEZ ZMIENNA DEEP
1857 C PRZYJMUJACA WARTOSCI : LMEM-600 PRZY BRAKU "CASE",
1858 C LMEM-515 PRZY ZAGNIEZDZENIU = 1
1859 C LMEM-430 PRZY ZAGNIEZDZENIU = 2
1860 C LMEM-345 PRZY ZAGNIEZDZENIU = 3
1861 C LMEM-260 PRZY PRZEPELNIENIU
1862 C PRZY ZAGNIEZDZENIU 4..6 OPIS PIERWSZYCH 3 CASE-OW JEST WYSYLANY
1863 C NA DYSK JAKO REKORD O NUMERZE IOP(2), OVER PRZYJMUJE WTEDY WARTOSC 6.
1864 C PRZY ZAGNIEZDZENIACH > 6 UTRZYMYWANA JEST WARTOSC DEEP=LMEM-260 ,
1865 C OPISY NOWYCH CASE-OW SA JEDYNIE ZLICZANE NA ZMIENNEJ OVER / 7,8,.../.
1866 C LAB(LMEM-260) = NRUNIV I JEST WYKORZYSTYWANE DLA UNIKNIECIA SYGNALIZACJI
1867 C NIEZGODNOSCI TYPOW ETYKIET PRZY ZBYT ZAGNIEZDZONYCH CASE-ACH.
1868 C DLA ETYKIETY O WARTOSCI N DO BAJTU O NUMERZE /NUMERACJA 0..159/
1869 C ( N MODE 160 ) WSTAWIANA JEST ROZNICA MIEDZY ODPOWIADAJACYM
1870 C JEJ NUMEREM ETYKIETY Z PARSERA A ETYKIETA BAZOWA.
1876 C TERAZ WB = NUMER ETYKIETY BAZOWEJ
1877 IF(STACK(VALTOP).EQ.0)GO TO 150
1879 IF(STACK(VALTOP-3).GT.0)GO TO 100
1880 IF(STACK(VALTOP-4).EQ.NRRE)CALL SVINT(VALTOP)
1881 ELEM=STACK(VALTOP-4)
1882 C = TYP WYRAZENIA CASE /PO EWENT. KONWERSJI REAL->INTEGER /
1883 IF(ELEM.EQ.NRINT .OR. ELEM.EQ.NRCHR)GO TO 200
1884 C NIELEGALNY TYP WYRAZENIA CASE
1885 100 CALL SERROR(405)
1887 C.....DODAJ NOWY OPIS DO STOSU INSTRUKCJI CASE
1889 IF(DEEP.LT.LMEM-260)GO TO 500
1890 C PELNY STOS. BUFOR NA DYSKU JUZ UZYTY ?
1891 IF(OVER.GT.0)GO TO 1000
1895 CALL SEEK(IBUF3,IOP(2))
1896 CALL PUT(IBUF3,LAB(DEEP))
1901 LAB(DEEP+2)=MAXINTEGER
1902 LAB(DEEP+3)=MININTEGER
1904 C JAKO MINIMALNA I MAKSYMALNA ETYKIETA POCZATKOWO NAJWIEKSZA I NAJMNIEJSZA
1905 C LICZBA ---> POTEM KONIECZNE JEST POROWNANIE KAZDEJ ETYKIETY ZAROWNO
1906 C Z MINIMALNA JAK I MAKSYMALNA.
1910 C BAJT ROWNY ZERO OZNACZA, ZE NIE WYSTAPILA ETYKIETA O WARTOSCI
1911 C WYZNACZAJACEJ TEN BAJT.
1913 C ... JESLI STALA - WSTAW
1914 ELEM=STACK(VALTOP-2)
1915 IF(STACK(VALTOP).EQ.1)ELEM=SCONST(ELEM)
1916 C ... GENERUJ SKOK DO MIEJSCA WYBRANIA WLASCIWEJ INSTRUKCJI
1917 CALL QUADR4(189,ELEM,WB-1,OPTCSC+OPTCSF)
1919 C.....PRZEPELNIENIE : ZAGNIEZDZENIE PRZEKRACZA 6 .
1920 C NIE SYGNALIZUJ BLEDU DLA DALSZYCH ZAGNIEZDZEN
1921 1000 IF(OVER.EQ.6)CALL MERR(402,0)
1928 C-------------------------------------------------------------------------
1930 C OBSLUGUJE ETYKIETE DLA INSTRUKCJI CASE.
1931 C CZUBEK STOSU POWINIEN ZAWIERAC WARTOSC ETYKIETY,NASTEPNY SYMBOL
1932 C TO NUMER ETYKIETY WYGENEROWANEJ PRZEZ PARSER.
1933 C PROCEDURA SPRAWDZA,CZY CZUBEK STOSU ZAWIERA STALA TYPU ZGODNEGO
1934 C Z TYPEM WYRAZENIA CASE I CZY WARTOSC TA JUZ NIE WYSTAPILA
1935 C LUB CZY ROZNICA MIEDZY MAKS. I MIN. ETYKIETA < 160.
1936 C WYZNACZA NOWA WARTOSC ETYKIETY MAKS. I MIN. ORAZ DO BAJTU
1937 C WYZNACZONEGO PRZEZ WARTOSC ETYKIETY WSTAWIA ROZNICE MIEDZY
1938 C NUMEREM ODPOWIADAJACEJ ETYKIETY A ETYKIETA BAZOWA.
1939 C ZWIEKSZA LICZNIK ETYKIET.
1940 C W PRZYPADKU, GDY ROZPIETOSC ETYKIET PRZEKRACZA 160,ZMIENIA
1941 C ETYKIETE BAZOWA NA -1 /DLA UNIKNIECIA DALSZEJ SYGNALIZACJI
1945 C ##### DETECTED ERROR(S) : 401 , 403 , 404 , 406 .
1951 COMMON/CASE/DEEP,OVER
1953 EQUIVALENCE(LAB(1),IPMEM(1))
1956 C TRICK FOR HAVING 2 RIGHTMOST BYTES ADDRESSABLE
1959 cdsw EQUIVALENCE ( BYTES , BYTE(1) )
1964 C WB = NUMER ETYKIETY Z PARSERA. SPRAWDZ, CZY NA STOSIE JEST STALA
1968 C ... JAKO ETYKIETA W "CASE" WYSTAPIL OBIEKT ROZNY OD STALEJ
1972 C.....ZBADAJ ZGODNOSC TYPOW /JESLI NIE BYLO PRZEPELNIENIA/
1973 100 IF(STACK(VALTOP-4).EQ.LAB(DEEP))GO TO 200
1974 C NIEZGODNOSC TYPOW ETYKIETY I WYRAZENIA "CASE"
1975 IF(LAB(DEEP).NE.NRUNIV)CALL SERROR(406)
1978 C.....USTAL NOWE WARTOSCI ETYKIET : MINIMALNA I MAKSYMALNA.
1979 C /UWAGA: ZE WZGLEDU NA INICJALIZACJE KONIECZNE OBA POROWNANIA/
1980 200 N=STACK(VALTOP-2)
1981 IF(N.LT.LAB(DEEP+2))LAB(DEEP+2)=N
1982 IF(N.GT.LAB(DEEP+3))LAB(DEEP+3)=N
1983 IF(LAB(DEEP+3)-LAB(DEEP+2).LT.160)GO TO 300
1984 C ROZPIETOSC WARTOSCI ETYKIET PRZEKRACZA 160
1985 IF(LAB(DEEP+1).EQ.-1)RETURN
1989 C.....WYZNACZ NUMER BAJTU
1993 C = NUMER SLOWA W LAB
1995 C = WARTOSC TEGO SLOWA
1997 C ZWIEKSZ LICZNIK ETYKIET
1998 LAB(DEEP+4)=LAB(DEEP+4)+1
2000 IF(IAND(N,1).EQ.0)GO TO 500
2001 C ... NIEPARZYSTY, PRAWY BAJT. ETYKIETA JUZ WYSTAPILA ?
2002 if(iand(m,x'00ff').eq.0) go to 400
2003 C ... POWTORNE WYSTAPIENIE TEJ SAMEJ ETYKIETY
2004 350 CALL SERROR(404)
2006 C WSTAW ROZNICE : NUMER ETYKIETY - ETYKIETA BAZOWA
2007 400 lab(l) = ior(m,wb)
2009 C ... PARZYSTY, LEWY BAJT
2010 500 if(iand(ishft(m,-8),x'00ff').ne.0) go to 350
2011 lab(l) = ior(ishft(wb,8),m)
2015 C--------------------------------------------------------------------------
2017 C WOLANA PO WYSTAPIENIU "OTHERWISE" W INSTRUKCJI "CASE" .
2018 C WYPISUJE ETYKIETY /POPRZEZ SCSOUT/ I ZAZNACZA TO POPRZEZ ZMIANE
2019 C SLOWA 0 OPISU CASE NA NRUNIV.
2024 COMMON/CASE/DEEP,OVER
2026 EQUIVALENCE(LAB(1),IPMEM(1))
2029 IF(LAB(DEEP).EQ.NRUNIV)RETURN
2030 C WYPISZ ETYKIETY I ZAZNACZ TO
2036 C----------------------------------------------------------------------------
2039 C WOLANA : PRZED "OTHERWISE" /JESLI WYSTAPILO/ LUB PRZY "ESAC" .
2041 C WYPISUJE ETYKIETY DLA "CASE".
2042 C POSTAC : "ESAC" / =190 /
2044 C NUMER ETYKIETY BAZOWEJ
2045 C WARTOSC ETYKIETY MINIMALNEJ
2046 C DLA KAZDEJ ETYKIETY SLOWO ZAWIERAJACE :
2047 C LEWY BAJT = ETYKIETA - ET.MINIMALNA
2048 C PRAWY BAJT = ODLEGLOSC OD ETYKIETY BAZOWEJ
2049 C - W KOLEJNOSCI OD ETYKIETY MINIMALNEJ DO MAKSYMALNEJ.
2051 C NA KONCU DOPISUJE ETYKIETE DLA "OTHERWISE" /BAZOWA/ ,NIEZALEZNIE
2052 C OD TEGO,CZY "OTHERWISE" WYSTAPILO.
2055 C ##### OUTPUT CODE : 181 , 190 .
2060 COMMON/STREAM/ ERRFLG,LINE,IBUF2(265),IBUF3(7),JUNK(260)
2063 COMMON/CASE/DEEP,OVER
2065 EQUIVALENCE(LAB(1),IPMEM(1))
2067 C TRICK FOR HAVING 2 RIGHTMOST BYTES ADDRESSABLE
2068 cdsw INTEGER BYTES,OBYTES
2069 cdsw BYTE BYTE(4),OBYTE(4)
2070 cdsw EQUIVALENCE ( BYTES , BYTE(1) ) , ( OBYTES , OBYTE(1) )
2072 INTEGER N,NR,DIFF,L,BOUND
2077 C = ETYKIETA MINIMALNA
2080 C WYPISZ "ESAC",LICZBA ETYKIET,ETYKIETA BAZOWA I MINIMALNA
2081 CALL QUADR4(190,NR,LAB(DEEP+1),N)
2083 C.....WYPISZ DLA KAZDEJ ETYKIETY 2 BAJTY :
2084 C LEWY = ET. - ET.MIN. , PRAWY = NUMER - ETYKIETA BAZOWA
2088 C DIFF = BIEZACA ETYKIETA - ET.MINIMALNA
2089 C L = NUMER SLOWA DLA KOLEJNEJ ETYKIETY
2091 C NR = LICZBA ETYKIET DO WYPISANIA
2092 C BOUND = NUMER PIERWSZEGO SLOWA ZA OPISEM "CASE"
2097 C = NUMER BAJTU DLA ETYKIETY MINIMALNEJ , 0..159
2104 IF(IAND(N,1).NE.0)GO TO 300
2105 C ... PARZYSTY,LEWY BAJT
2108 byte = iand(ishft(bytes,-8),X'00ff')
2109 if(byte.eq.0) go to 300
2110 C WYPISZ PARE DLA TEJ ETYKIETY
2111 call quadr1(ior(byte,ishft(diff,8)))
2113 IF(NR.EQ.0)GO TO 1000
2114 C ... NIEPARZYSTY,PRAWY BAJT
2117 byte = iand(bytes,X'00ff')
2118 if(byte.eq.0) go to 400
2119 C WYPISZ PARE DLA TEJ ETYKIETY
2120 call quadr1(ior(ishft(diff,8),byte))
2122 IF(NR.EQ.0)GO TO 1000
2123 C ... ZWIEKSZ NUMER SLOWA/ ZWAZAJAC NA GRANICE / I WCZYTAJ TO SLOWO
2125 IF(L.EQ.BOUND)L=L-80
2128 C.....WYPISZ ETYKIETE DLA "OTHERWISE"
2129 1000 CALL QUADR2(181,LAB(DEEP+1))
2133 C----------------------------------------------------------------------------
2135 C OBSLUGUJE ZAKONCZENIE INSTRUKCJI "CASE".
2136 C OBNIZA STOS INSTRUKCJI CASE.
2137 C JESLI NIE WYSTAPILO "OTHERWISE" I NIE BYLO PRZEPELNIENIA
2138 C WYPISUJE ETYKIETY /PRZEZ SCSOUT/
2143 COMMON/STREAM/ERRFLG,LINE,IBUF2(265),IBUF3(7),JUNK(260)
2145 C IBUF3 - OPIS STRUMIENIA Z WCZYTYWANYM I PRODUKOWANYM KODEM POSREDNIM
2148 COMMON/CASE/DEEP,OVER
2150 EQUIVALENCE(LAB(1),IPMEM(1))
2153 C.....WYPISZ ETYKIETY / O ILE NIE WYSTAPILO "OTHERWISE" LUB PRZEPELNIENIE/
2154 IF(LAB(DEEP).NE.NRUNIV)CALL SCSOUT
2155 IF(OVER.GT.6)GO TO 500
2157 IF(DEEP.GT.LMEM-600)RETURN
2158 C POBRAC OPIS Z DYSKU ?
2160 CALL SEEK(IBUF3,IOP(2))
2161 CALL GET(IBUF3,LAB(LMEM-515))
2165 C.....PRZEPELNIENIE.
2170 C-------------------------------------------------------------------------
2172 C WOLANA PRZY END MODULU.
2173 C JESLI TRZEBA, DOPISUJE LAST-WILL.
2174 C WYPISUJE ZAKONCZENIE LAST-WILL.
2176 C ##### OUTPUT CODE : 175 , 185 , 193 .
2182 C.....BYLO LAST-WILL ?
2183 IF(LSTWILL)GO TO 1000
2184 C NIE. ZAKONCZ INSTRUKCJE MODULU
2186 C I DOPISZ LAST-WILL
2189 C.....WYPISZ ZAKONCZENIE LAST-WILL: SKOK ZA LAST-WILL PREFIKSU
2191 1000 IF(UNIT.LE.2)GO TO 2000
2193 C JESLI NIE MA PREFIKSU - BACK
2194 IF(IDL.EQ.0)GO TO 2000
2195 C PREFIKSOWANY. CZY W CIAGU PREFIKSOWYM BYLO LAST-WILL ?
2196 C /TAK, GDY SLOWO +8 PREFIKSU <> 0 /
2198 IF(IDL.EQ.0)GO TO 2000
2199 C SKOK ZA LAST-WILL W SEKWENCJI PREFIKSOWEJ
2200 CALL QUADR2(175,IDL)
2203 cdsw 2000 CALL QUADR1(193)
2204 cdsw ---------------------------------------
2205 c jesli coroutina/process to FIN (194)
2206 2000 n = iand(ipmem(p),15)
2208 if(n.eq.5.or.n.eq.7) go to 2100
2211 c coroutina/ process
2212 2100 call quadr1(194)
2213 cdsw ----------------------------------------
2215 C.....WYPISZ ZNACZNIK KONCA MODULU
2216 3000 CALL QUADR1(185)
2220 C-------------------------------------------------------------------
2222 C OBSLUGUJE KONIEC INSTRUKCJI MODULU / LAST-WILL LUB END,
2223 C JESLI LAST-WILL NIE WYSTAPILO/
2224 C KOLEJNE DWA SYMBOLE TO : NUMER ETYKIETY, NUMER LINII.
2226 C JESLI TRZEBA,DOPISUJE INNER.
2227 C DOPISUJE ETYKIETE ORAZ NUMER LINII PRZED END.
2228 C DLA MODULOW PREFIKSOWANYCH GENERUJE SKOK ZA INNER,DLA POZOSTALYCH
2229 C END BLOKU /BACKBL/ LUB END PROCEDURY,FUNKCJI /BACKPR/ LUB
2230 C END KLASY,COROUTINY /FIN/ LUB END HANDLERA /TERMINATE/.
2232 C ##### OUTPUT CODE : 172 , 177 , 178 , 181 , 183 ,
2240 DATA AUX/191,172,194,192,192,194/
2241 C POWROTY Z MODULU: BACKBL,TERMINATE,FIN,BACKPR,BACKPR,FIN .
2243 C.....DOPISAC INNER?
2244 IF(INNER.NE.0)GO TO 10
2245 CALL QUADR2(178,IPMEM(P+23))
2246 C ZAZNACZ BRAK INSTRUKCJI PO INNER /CHYBA,ZE Z PREFIKSU/
2250 IF(IDL.NE.0)IPMEM(P-7)=IPMEM(IDL-7)
2251 C.....DOPISZ ETYKIETE O NUMERZE WB
2254 C ... DOPISZ NUMER LINII
2256 IF(.NOT.OPTTRC)WB=-WB
2258 IF(UNIT.GT.2)GO TO 200
2259 C ... BLOK LUB HANDLER
2260 100 CALL QUADR1(AUX(UNIT))
2262 C ... PREFIKSOWANY ?
2264 IF(IDL.EQ.0)GO TO 100
2265 C TAK. CZY SA INSTRUKCJE PO INNER ?
2267 IF(IDL.EQ.0)GO TO 100
2268 C ... SKOK ZA INNER PREFIKSU
2269 CALL QUADR2(183,IDL)
2273 C----------------------------------------------------------------------
2275 C WYPISUJE ETYKKIETE LAST-WILL.
2276 C DLA KLASY WPISUJE DO SLOWA +8 INFORMACJE O LAST-WILL:
2277 C NUMER NAJBLIZSZEGO MODULU W CIAGU PREFIKSOWYM /Z BIEZACYM
2278 C MODULEM WLACZNIE/ MAJACEGO LAST-WILL LUB ZERO,JESLI
2279 C W CALYM CIAGU PREFIKSOWYM LAST-WILL NIE WYSTAPILO.
2281 C ##### OUTPUT CODE : 174 .
2286 C.....WYPISZ ETYKIETE LAST-WILL
2291 C JESLI JEST PREFIKS - SKOPIUJ Z PREFIKSU
2293 IF(IDL.NE.0)IDR=IPMEM(IDL+8)
2294 C JESLI W TYM MODULE WYSTAPILO LAST-WILL, TO WPISZ NUMER BIEZACEGO
2301 C-----------------------------------------------------------------
2303 C DLA WYSTAPIENIA "RETURN" GENERUJE :
2304 C DLA PROCEDUR,FUNKCJI BEZ PREFIKSU BACKPR, DLA PREFIKSOWANYCH
2305 C LUB KLAS,COROUTIN BACK, DLA BLOKOW BACKBL, DLA HANDLERA BACKHD.
2308 C ##### OUTPUT CODE : 180 , 191 , 192 , 193 .
2314 DATA AUX/191,180,193,192,192,193/
2315 C POWROTY Z MODULU : BACKBL,BACKHD,BACK,BACKPR,BACKPR,BACK
2319 cbc added concurrent statements
2321 c check if procedure or function
2322 if (unit .ne. 4 .and. unit .ne. 5) goto 100
2326 if (op .ne. 91 .and. op .ne. 92) goto 40
2327 c process next ENABLE/DISABLE list
2329 if (wb .ne. 28) goto 10
2330 c process next identifier
2334 c check if procedure or function
2335 if (elem .ne. 11 .and. elem .ne. 12) goto 30
2336 if (op .eq. 92) ind = -ind
2345 Cbc JESLI MODUL PREFIKSOWANY TO BACK
2346 cbc IF(UNIT.GT.2 .AND. IPMEM(P+21).NE.0)IDL=193
2347 100 CALL QUADR1(IDL)
2350 SUBROUTINE SFORTO(UP,STEP)
2351 C-----------------------------------------------------------------------------
2353 C OBSLUGUJE POCZATEK PETLI FOR.
2354 C WOLANA PO WYSTAPIENIU SYMBOLU "TO" LUB "DOWNTO".
2355 C UP = TRUE ,JESLI BYLO "TO"
2356 C STEP = TRUE ,JESLI WYSTAPILO "STEP"
2357 C STOS ZAWIERA: ZMIENNA STERUJACA,WARTOSC POCZATKOWA,KROK/JESLI BYL/,
2359 C NASTEPNE 2 SYMBOLE WEJSCIOWE TO NUMERY ETYKIET POCZATKU PETLI I ZA PETLA
2360 C WCZYTUJE OBA NUMERY,ZASTEPUJE 4 LUB 3 GORNE ELEMENTY STOSU PRZEZ
2362 C JESLI KROK LUB WARTOSC KONCOWA NIE SA STALE, PRZYDZIELA IM ATRYBUTY
2363 C ROBOCZE ZYWE PO WYJSCIU Z BLOKU BAZOWEGO ORAZ GENERUJE MOVE&SAFE
2367 C WSTAWIENIE WARTOSCI POCZATKOWEJ DO R5 ,
2368 C ETYKIETA POCZATKU PETLI ,
2369 C PODSTAWIENIE WARTOSCI Z R5 NA ZMIENNA STERUJACA ,
2370 C RELACJA I SKOK WARUNKOWY /WYJSCIE Z PETLI/
2374 C ##### OUTPUT CODE : 13 , 60 , 90 , 92 , 108 , 110 ,
2375 C 139 , 152 , 181 , 208 .
2380 cdsw DATA SFTHEX1,SFTHEX2,SFTHEX3 /Z8000,Z4000,Z2000 /
2382 LOGICAL UP,STEP,END1
2383 C TRUE,JESLI: BYLO "TO", BYLO "STEP" , WARTOSC KONCOWA ROZNA OD STALEJ
2384 INTEGER END2,STEP1,STEP2
2385 C ATS LUB WARTOSC STALEJ DLA WARTOSCI KONCOWEJ,RODZAJ KROKU
2386 C /1 JESLI STALY/, ATS LUB WARTOSC KROKU.
2388 cdsw ------------------------------------------------
2389 data sfthx2, sfthx3 / x'4000', x'2000' /
2390 sfthx1 = ishft(1,15)
2391 cdsw ------------------------------------------------
2393 C.....WARTOSC KONCOWA
2395 END1=STACK(VALTOP).NE.1
2396 END2=STACK(VALTOP-2)
2398 C JESLI TRZEBA - ZABEZPIECZ WARTOSC KONCOWA
2399 IF(.NOT.END1)GO TO 100
2401 CALL QUADR3(208,TEMPNR+6,END2)
2405 100 IF(STEP)GO TO 200
2411 200 STEP1=STACK(VALTOP)
2412 STEP2=STACK(VALTOP-2)
2414 C STALY KROK? JESLI NIE - ZABEZPIECZ
2415 IF(STEP1.EQ.1)GO TO 300
2416 CALL QUADR3(208,TEMPNR+3,STEP2)
2419 C.....WARTOSC POCZATKOWA. WPISZ DO "R5"
2422 C K = ATS ZMIENNEJ STERUJACEJ
2424 C ZDEJMIJ TEZ ZMIENNA STERUJACA
2427 C WPISZ WARTOSC POCZATKOWA DO R5 ( REJESTR = 4 )
2428 CALL QUADR3(139,N,4)
2431 C.....WSTAW OPIS PETLI NA STOS
2433 C POSTAC OPISU : SLOWO -1 = ATS ZMIENNEJ STERUJACEJ
2434 C SLOWO -2 = WARTOSC LUB ATS KROKU
2435 C SLOWO -3 : BIT 0 = 0 --> "TO",= 1 --> "DOWNTO"
2436 C BIT 1 = 0 --> STALY KROK,= 1 --> WYLICZONY
2437 C BIT 2 = 0 --> STALA WARTOSC KONCOWA,
2443 STACK(VALTOP-2)=STEP2
2445 C = "TO" , STALY KROK , STALA WARTOSC KONCOWA
2446 IF(.NOT.UP)N=IOR(N,SFTHX1)
2447 IF(STEP1.NE.1)N=IOR(N,SFTHX2)
2448 IF(END1)N=IOR(N,SFTHX3)
2452 C.....POCZATEK PETLI.
2454 C WB=NUMER ETYKIETY POCZATKU. GENERUJ ETYKIETE.
2457 C WB=NUMER ETYKIETY ZA PETLA
2459 C ... PODSTAW WARTOSC Z R5 NA ZMIENNA STERUJACA
2465 C ... GENERUJ POROWNANIE
2469 C STALA WARTOSC KONCOWA?
2475 C.....POROWNANIE I WYSKOK ZA PETLE
2476 500 IF(.NOT.UP)N=N-2
2477 C OPKOD "LT" = OPKOD "GT" -2 .
2478 CALL QUADR4(N,STEP1,K,END2)
2479 CALL QUADR3(152,STEP1,WB)
2483 C----------------------------------------------------------------------------
2485 C OBSLUGUJE ZAKONCZENIE PETLI FOR
2486 C ZWIEKSZA ZMIENNA STERUJACA O KROK /ZMNIEJSZA DLA "DOWNTO"/
2488 C ZMNIEJSZA LSTFOR,TEMPNR.
2489 C JESLI KROK LUB WARTOSC KONCOWA NIE BYLY STALE, ZWALNIA
2490 C ZAJMOWANE PRZEZ NIE ZMIENNE ROBOCZE /GENERUJE "RELEASE"/
2493 C WSTAWIENIE DO R5 WARTOSCI ZMIENNEJ STERUJACEJ POWIEKSZONEJ
2494 C O KROK / POMNIEJSZONEJ DLA DOWNTO / ,
2495 C SKOK NA POCZATEK PETLI
2498 C ##### OUTPUT CODE : 37 , 113 , 114 , 139 , 141 .
2505 INTEGER N,STEP,ATS,OPKOD,K
2507 cdsw DATA SFEHEX1,SFEHEX2,SFEHEX3 /Z8000,Z4000, Z2000 /
2509 cdsw ---------------------------------------------------
2510 data sfehx2, sfehx3 /x'4000', x'2000'/
2511 sfehx1 = ishft(1,15)
2512 cdsw -----------------------------------------------
2515 STEP=STACK(VALTOP-2)
2519 IF(IAND(N,SFEHX1).NE.0)GO TO 600
2523 C STALY KROK? TAK,JESLI BIT 1 = 0
2524 IF(IAND(N,SFEHX2).NE.0)GO TO 400
2529 400 CALL QUADR4(OPKOD,K,ATS,STEP)
2530 C WSTAW DO "R5" ( REJESTR = 4 )
2531 CALL QUADR3(139,K,4)
2533 C.....ZWOLNIJ ZMIENNE ROBOCZE,JESLI:
2534 C WARTOSC KONCOWA ROZNA OD STALEJ /BIT 2 = 1/
2535 IF(IAND(N,SFEHX3).NE.0)CALL QUADR2(141,TEMPNR+6)
2536 C KROK ROZNY OD STALEJ /BIT 1 = 1/
2537 IF(IAND(N,SFEHX2).NE.0)CALL QUADR2(141,TEMPNR+3)
2539 C ZWOLNIJ NUMERY ATRYBUTOW ROBOCZYCH REZERWOWANE DLA PETLI FOR
2543 C....."DOWNTO". STALY KROK?
2546 IF(IAND(N,SFEHX2).NE.0)GO TO 400
2552 C---------------------------------------------------------------
2554 C NA CZUBKU JEST ARGUMENT KILL. BADA TYP,GENERUJE KOD.
2557 C ##### OUTPUT CODE : 143 , 146 .
2559 C ##### DETECTED ERROR(S) : 415 .
2565 C JESLI UNIWERSALNY-POMIN
2566 IF(STACK(VALTOP).EQ.0)RETURN
2567 C POMIN TAKZE NONE LUB TYP UNIWERSALNY
2569 IF(IDL.EQ.NRNONE .OR. IDL.EQ.NRUNIV)RETURN
2571 C OPKOD KILL DLA TABLICY,REKORDU
2573 IF(STACK(VALTOP-3).GT.0)GO TO 50
2574 C NIE. CZY TYP PIERWOTNY?
2576 IF(IDL.EQ.CONSNR(I))GO TO 90
2578 C..... O.K. REKORD? /POLE T=2/
2579 IF(IAND(IPMEM(IDL),15) .NE.2)IDR=146
2580 C OPKOD UNIWERSALNEGO KILL
2581 50 CALL QUADR2(IDR,STACK(VALTOP-2))
2586 C------------------------------------------------------
2588 C OBSLUGUJE ZMIANE OPCJI
2590 C NASTEPNY SYMBOL TO + , - NUMER OPCJI.
2592 C NUMER I NAZWA OPCJI * ZMIENNA * WARTOSC DLA + * DLA - * ZNACZENIE DLA +
2594 C M 2 MEMBER CONTROL * OPTMEM * 0 * 1 * WYMAGANA KONTROLA
2595 C O 3 OPTIMIZATION * OPTOPT * TRUE * FALSE * WOLNO OPTYMALIZOWAC
2596 C I 4 INDEX CONTROL * OPTIND * 0 * 2 * WYMAGANA KONTROLA
2597 C T 5 TYPE CONTROL * OPTTYP * FALSE * TRUE * WYMAGANA KONTROLA
2598 C D 6 TRACE * OPTTRC * TRUE * FALSE * WYMAGANY SLAD
2599 C C 7 CASE CONTROL * OPTCSC * 0 * 1 * WYMAGANA KONTROLA
2600 C F 8 FAST CASE * OPTCSF * 0 * 2 * SZYBKI CASE
2603 C OPCJA 1 - LISTING - JEST UZYWANA TYLKO PRZEZ PARSER
2611 INTEGER OPTION(7),PLUS(7),MINUS(7)
2612 LOGICAL LPLUS(7),LMINUS(7)
2613 EQUIVALENCE (OPTION(1),OPTMEM)
2614 EQUIVALENCE (PLUS,LPLUS)
2615 EQUIVALENCE (MINUS,LMINUS)
2616 C PLUS,LPLUS - WARTOSCI ODPOWIEDNICH ZMIENNYCH DLA ZAPALONEJ OPCJI
2617 C MINUS,LMINUS - " " " " ZGASZONEJ OPCJI
2619 DATA PLUS(1),PLUS(3),PLUS(6),PLUS(7)/4*0/
2620 DATA LPLUS(2),LPLUS(4),LPLUS(5)/.TRUE.,.FALSE.,.TRUE./
2621 DATA MINUS(1),MINUS(3),MINUS(6),MINUS(7)/1,2,1,2/
2622 DATA LMINUS(2),LMINUS(4),LMINUS(5)/.FALSE.,.TRUE.,.FALSE./
2625 C.....WCZYTAJ NUMER OPCJI
2628 IF(WB.GT.0)GO TO 100
2639 cdsw subroutine sread(*,*)
2640 SUBROUTINE SREAD(where)
2641 C-----------------------------------------------------------------------
2642 cdsw where=1 - return1, where=2 - return2
2644 C OBSLUGUJE OPERACJE CZYTANIA.
2645 C NA CZUBKU STOSU ZNAJDUJE SIE ARGUMENT LUB ADRES PLIKU
2647 C WRACA DO ETYKIETY 30 LUB 40 W SDPDA
2649 C KORZYSTA Z /BEZPARAMETROWYCH/ STANDARDOWYCH FUNKCJI
2656 C ##### OUTPUT CODE : 23 , 132 .
2658 C ##### DETECTED ERROR(S) : 420 , 443 .
2667 IF(ELEM.EQ.0)GO TO 500
2669 C PIERWSZY ARGUMENT ?
2670 IF(FLARGS.GT.0)GO TO 100
2672 IF(ELEM.EQ.12)GO TO 50
2673 C NIE. ADRES PLIKU ?
2674 IF(STACK(VALTOP-3).GT.0)GO TO 200
2675 IF(IAND(IPMEM(K),15).NE.11)GO TO 100
2676 C TAK. PRZEKAZ ADRES PLIKU
2679 IF(STACK(VALTOP-3).GT.0)GO TO 200
2680 IF(IAND(IPMEM(K),15).NE.11)GO TO 100
2687 cdsw ------------------
2690 cdsw ------------------
2691 C POWROT DO PETLI W SDPDA
2694 C.....ARGUMENT. ZMIENNA ?
2695 100 IF(ELEM.LT.3 .OR. ELEM.GT.5)CALL SERROR(420)
2698 C ZBADAJ TYP, TABLICOWY ?
2699 IF(STACK(VALTOP-3).GT.0)GO TO 200
2700 C N=NUMER FUNKCJI STANDARDOWEJ ,L=APETYT, K=TYP
2704 IF(K.EQ.NRINT)GO TO 300
2707 IF(K.EQ.NRCHR)GO TO 300
2715 IF(K.EQ.NRRE)GO TO 300
2716 C.....ZATEM NIEPOPRAWNY TYP ZMIENNEJ W INSTRUKCJI READ
2717 200 CALL SERROR(443)
2720 C.....OK PRZEKAZ STEROWANIE DO FUNKCJI STANDARDOWEJ
2725 CALL QUADR4(23,K,N,0)
2727 CALL SSTORE(VALTOP,K)
2729 C POWROT DO ETYKIETY 30 W SDPDA
2732 cdsw ----------------
2735 cdsw -----------------
2737 cdsw SUBROUTINE SWRITE(*,*)
2738 subroutine swrite(where)
2739 C------------------------------------------------------------------------
2740 cdsw where = 1 - return1, where = 2 - return2
2742 C OBSLUGUJE OPERACJE PISANIA.
2743 C NA STOSIE JEST ADRES PLIKU LUB WARTOSC DO WYPISANIA, A NAD NIA 0,1 LUB 2
2744 C WARTOSCI OKRESLAJACE FORMAT.
2745 C NASTEPNY SYMBOL = LICZBA WARTOSCI OKRESLAJACYCH FORMAT /0..2/
2746 C ZDEJMUJE TE WARTOSCI ZE STOSU.
2748 C WRACA DO ETYKIETY 30 LUB 40 W SDPDA
2750 C UZYWA PROCEDUR STANDARDOWYCH :
2751 C 60,61 - WRITECHAR ( ZNAK )
2752 C 62,63 - WRITEINT ( LICZBA , SZEROKOSC POLA )
2753 C 64,65 - WRITEREAL ( LICZBA , LICZBA ZNAKOW PRZED KROPKA , PO KROPCE )
2755 C 66,67 - WRITEREAL = WRFLE. =
2756 C 68,69 - WRITEREAL = WRFLF. =
2757 C 70,71 - WRITESTRING ( ADRES TEKSTU , SZEROKOSC POLA LUB -1 )
2759 C DOZWOLONE FORMATY :
2760 C INTEGER - 0 LUB 1 , DEFAULT = 6
2762 C TEXT - 0 LUB 1 , DEFAULT = -1 /=CALY TEKST/
2763 C REAL - 0 , 1 LUB 2 , DEFAULT = 12 . 4 /=17/
2765 C UWAGA : PARAMETRY / W TYM WARTOSC FUNKCJI / SA NUMEROWANE OD ZERA .
2767 C ##### OUTPUT CODE : 132 , 145 .
2769 C ##### DETECTED ERROR(S) : 441 , 442 .
2775 INTEGER FORMAT(2),I,K,N
2779 C WB=LICZBA WYRAZEN OKRESLAJACYCH FORMAT
2780 C.....WSTAW DO TABLICY FORMAT ATS-Y FORMATOW
2783 100 IF(I.EQ.0)GO TO 200
2785 FORMAT(I)=SVATS(VALTOP)
2790 C.....TERAZ CZUBEK ZAWIERA WARTOSC DO WYPISANIA LUB ADRES PLIKU
2792 IF(STACK(VALTOP).EQ.0)GO TO 1000
2795 IF(STACK(VALTOP-3).NE.0)GO TO 400
2797 C PIERWSZY ARGUMENT ?
2798 IF(FLARGS.GT.0)GO TO 300
2799 C TAK. ADRES PLIKU ?
2800 IF(IAND(IPMEM(I),15).NE.11)GO TO 300
2801 C TAK. WYSTAPIL FORMAT ?
2802 IF(WB.NE.0)CALL SERROR(441)
2809 cdsw -------------------
2812 cdsw --------------------
2813 C POWROT DO PETLI W SDPDA
2817 IF(I.EQ.NRRE)GO TO 800
2818 C ZATEM CHAR,INTEGER,TEXT
2819 IF(I.EQ.NRINT)GO TO 500
2820 IF(I.EQ.NRTEXT)GO TO 600
2821 IF(I.EQ.NRCHR)GO TO 700
2823 C.....ZATEM NIELEGALNY TYP ARGUMENTU INSTRUKCJI WRITE
2828 C....NIELEGALNY FORMAT
2833 C.....INTEGER. DEFAULT : 6 ZNAKOW
2834 500 IF(WB.EQ.2)GO TO 420
2835 IF(WB.EQ.0)FORMAT(1)=SCONST(6)
2839 C....TEXT. -1 JESLI BRAK FORMATU
2840 600 IF(WB.EQ.2)GO TO 420
2841 IF(WB.EQ.0)FORMAT(1)=SCONST(-1)
2846 700 IF(WB.NE.0)GO TO 420
2850 C.....REAL. DEFAULT : 12 ZNAKOW PRZED KROPKA , 4 PO KROPCE.
2851 800 N=64+2*WB+FLMODF
2853 GO TO (810,820,830),WB
2854 C ... BEZ FORMATU , DEFAULT 12.4 , "WRFLT." = 8
2855 810 FORMAT(1)=SCONST(12)
2858 C ... FORMAT = SZEROKOSC POLA , 5 ZNAKOW PO KROPCE, "WRFLE." = 10
2859 820 FORMAT(2)=SCONST(5)
2861 C ... FORMAT = SZEROKOSC POLA,LICZBA ZNAKOW PO KROPCE, "WRFLF." = 11
2863 C.....WSTAWIANIE PARAMETROW : N = NUMER PROCEDURY STANDARDOWEJ
2865 C WSTAW PRAWY FORMAT DLA REAL
2866 900 CALL QUADR4(145,FORMAT(2),N,2)
2867 C WSTAW /LEWY/ FORMAT
2868 920 CALL QUADR4(145,FORMAT(1),N,1)
2870 930 CALL QUADR4(145,K,N,0)
2871 C PRZEKAZ STEROWANIE
2874 C POWROT DO ETYKIETY 30 W SDPDA
2876 cdsw -----------------
2879 cdsw -----------------
2882 C---------------------------------------------------------
2884 C SPRAWDZA, CZY ELEMENT Z CZUBKA STOSU (UNIW.,STALA,
2885 C WARTOSC,ZMIENNA,TABL.STAT.,ELEM.TABL.) JEST TYPU FILE .
2886 C 'NONE' NIE JEST AKCEPTOWANE
2888 C ##### DETECTED ERROR(S) : 413 .
2894 IF(STACK(VALTOP-3).GT.0 .OR. (N.NE.NRUNIV.AND.
2895 X IAND(IPMEM(N),15).NE.11))CALL SERROR(413)
2899 C---------------------------------------------------------
2901 C ZAPEWNIA, ZE (R6-12) ZAWIERA ADRES PLIKU
2902 C - DLA OPERACJI NA PLIKU WSKAZYWANYM
2904 C ##### OUTPUT CODE : 139 .
2909 IF(FILE.EQ.0 .OR. FLREADY)RETURN
2910 CALL QUADR3(139,STACK(FILE-2),-45)
2915 cdsw SUBROUTINE SPUT(*,*)
2916 subroutine sput(where)
2917 C---------------------------------------------------------
2918 cdsw where = 1 - return1, where = 2 - return2
2921 C CZUBEK STOSU ZAWIERA ADRES PLIKU LUB ARGUMENT.
2923 C WRACA BEZPOSREDNIO DO ETYKIETY 30 LUB 40 W SDPDA.
2925 C ##### OUTPUT CODE : 132 , 145 .
2927 C ##### DETECTED ERROR(S) : 445 .
2933 C ADRES PLIKU JUZ WYSTAPIL ?
2934 IF(FLARGS.GT.0)GO TO 100
2943 cdsw ------------------
2946 cdsw ------------------
2954 if(iand(ipmem(n),15).eq.9) go to 799
2955 if(stack(valtop-3).gt.0) go to 799
2956 IF(N.EQ.NRINT)GO TO 400
2957 IF(N.EQ.NRCHR)GO TO 300
2958 IF(N.EQ.NRRE )GO TO 500
2959 if(n.eq.nrtext) go to 799
2960 C ZATEM REFERENCJA lub nielegealny typ
2962 CPS 600 N=56 dziwne, ta etykieta nie jest uzywana !
2971 1000 CALL QUADR4(145,SVATS(VALTOP),N,0)
2975 cdsw ------------------
2978 cdsw ------------------
2980 799 call serror(445)
2984 cdsw SUBROUTINE SGET(*,*)
2985 subroutine sget(where)
2986 C---------------------------------------------------------
2987 cdsw where = 1 - return1 , where = 2 - return2
2990 C CZUBEK STOSU ZAWIERA ARGUMENT LUB ADRES PLIKU.
2992 C WRACA DO ETYKIETY 30 LUB 40 W SDPDA.
2994 C ##### OUTPUT CODE : 23 , 132 , 145 .
2996 C ##### DETECTED ERROR(S) : 420 , 446 .
3003 C ADRES PLIKU JUZ WYSTAPIL ?
3004 IF(FLARGS.GT.0)GO TO 100
3014 cdsw ------------------------
3017 cdsw ------------------------
3020 C.....ARGUMENT. ZMIENNA ?
3026 IF(IAND(IPMEM(N),15).EQ.9)GO TO 9000
3027 if(stack(valtop-3).gt.0) go to 9000
3028 IF(N.EQ.NRINT)GO TO 1000
3029 IF(N.EQ.NRCHR)GO TO 1200
3030 IF(N.EQ.NRRE )GO TO 1100
3031 IF(N.EQ.NRTEXT)GO TO 9000
3032 C ZATEM REFERENCJA.lub nielegalny typ
3034 C POWROT DO PETLI W SDPDA
3053 2000 IF(ELEM.LT.3 .OR. ELEM.GT.5)CALL SERROR(420)
3055 CALL QUADR4(23,ATS,N,0)
3056 CALL SSTORE(VALTOP,ATS)
3059 cdsw ----------------
3062 cdsw ----------------
3064 C.....NIELEGALNY TYP ARGUMENTU
3065 9000 CALL SERROR(446)
3068 cdsw ----------------
3071 cdsw -----------------
3074 C--------------------------------------------------------------
3075 cdsw procedura zostala podzielona na dwie - seof i seof0
3077 C OBSLUGUJE OPERATORY 'EOF' I 'EOLN'.
3078 C WSTAWIA NA STOS ODCZYTANA WARTOSC FUNKCJI.
3080 C WEJSCIE SEOF0 ODPOWIADA BEZPARAMETROWYM EOF, EOLN.
3081 C WEJSCIE SEOF ODPOWIADA EOF, EOLN Z PODANYM (NA CZUBKU STOSU)
3082 C ADRESEM PLIKU (JEST USUWANY).
3083 C N = NUMER ODPOWIEDNIEJ FUNKCJI STANDARDOWEJ
3084 C (39, 40 DLA EOF, 74, 75 DLA EOLN)
3087 C ###### GENEROWANY KOD : 23 , 132 , 139 .
3094 C......CZUBEK STOSU ZAWIERA ADRES PLIKU
3097 C PRZEKAZ ADRES PLIKU DO (R6-12)
3098 CALL QUADR3(139,STACK(VALTOP-2),-45)
3100 C DALEJ JAK DLA BEZPARAMETROWYCH EOF, EOLN
3106 C--------------------------------------------------------------
3107 cdsw procedura zostala podzielona na dwie - seof i seof0
3109 C OBSLUGUJE OPERATORY 'EOF' I 'EOLN'.
3110 C WSTAWIA NA STOS ODCZYTANA WARTOSC FUNKCJI.
3112 C WEJSCIE SEOF0 ODPOWIADA BEZPARAMETROWYM EOF, EOLN.
3113 C WEJSCIE SEOF ODPOWIADA EOF, EOLN Z PODANYM (NA CZUBKU STOSU)
3114 C ADRESEM PLIKU (JEST USUWANY).
3115 C N = NUMER ODPOWIEDNIEJ FUNKCJI STANDARDOWEJ
3116 C (39, 40 DLA EOF, 74, 75 DLA EOLN)
3119 C ###### GENEROWANY KOD : 23 , 132 , 139 .
3127 C...................BEZPARAMETROWE EOF , EOLN
3132 C PODCZYTAJ WARTOSC ( PARAMETR 0 )
3133 CALL QUADR4(23,ATS,N,0)
3134 C WSTAW NA STOS ODCZYTANA WARTOSC
3139 STACK(VALTOP-4)=NRBOOL
3143 INTEGER FUNCTION SVATS(ELEM)
3144 C--------------------------------------------------------------
3146 C ZWRACA ATS WARTOSCI Z MIEJSCA ELEM STOSU .
3147 C (UNIWERSALNY,STALA,WARTOSC)
3148 C DLA STALEJ GENERUJE NOWY ATS.
3154 common /stacks/ btsins, btstem
3157 IF(STACK(ELEM).NE.1)RETURN
3160 IF(N.EQ.NRRE)GO TO 100
3161 IF(N.EQ.NRNONE)GO TO 200
3162 C ZATEM : INTEGER,CHAR,BOOLEAN,TEXT
3166 100 SVATS=SCREAL(SVATS)
3169 cdsw&ail 200 SVATS=LMEM-3
3170 200 svats = btstem - 3
3174 SUBROUTINE SAVEVAR(ELEM)
3175 C-------------------------------------------------------
3177 C ZABEZPIECZA ADRES ZMIENNEJ (UOGOLNIONEJ) Z MIEJSCA
3185 GO TO (300,400,500),N
3187 C ADRES PRZED KROPKA :
3188 300 CALL SAFE(STACK(ELEM-7))
3190 C.....ELEMENT TABLICY
3192 400 CALL SAFE(STACK(ELEM-2))
3193 C I INDEKS, JESLI ROZNY OD STALEJ :
3194 IF(STACK(ELEM-2).GT.0)GO TO 300
3197 C.....TABLICA STATYCZNA
3200 SUBROUTINE SCHECK(ERROR,TYP)
3201 C--------------------------------------------------------
3203 C POMOCNICZA. JESLI CZUBEK STOSU NIE JEST TYPU PROSTEGO
3204 C TYP LUB UNIWERSALNEGO - SYGNALIZUJE BLAD ERROR.
3212 IF(STACK(VALTOP-3).NE.0 .OR. (I.NE.NRUNIV .AND. I.NE.TYP))
3213 X CALL SERROR(ERROR)
3217 C-----------------------------------------------------------------
3219 C OBSLUGUJE OPERATOR NOT. ARGUMENT JEST NA CZUBKU .
3222 C ##### OUTPUT CODE : 42 .
3224 C ##### DETECTED ERROR(S) : 417 .
3232 C JESLI UNIWERSALNY-POMIN
3233 IF(STACK(VALTOP).EQ.0)RETURN
3235 CALL SCHECK(417,NRBOOL)
3237 IF(STACK(VALTOP).EQ.1)GO TO 51
3238 C NIE. CZY WB= IF.FALSE LUB IF.TRUE ?
3239 IF(WB.EQ.29 .OR. WB.EQ.30)GO TO 60
3240 C.....NIE, WYKONAJ NOT.
3242 CALL QUADR3(42,IDL,STACK(VALTOP-2))
3246 C.....STALA, ZMIEN WARTOSC.
3247 51 STACK(VALTOP-2)=-1-STACK(VALTOP-2)
3249 C.....NOT PRZED SKOKIEM WARUNKOWYM,ZMIEN RODZAJ SKOKU
3254 C--------------------------------------------------------------------------
3258 C OBSLUGUJE 1 LUB 2 - ARGUMENTOWE OPERACJE ARYTMETYCZNE.
3259 C WB=NUMER OPERACJI, 1..8 OZNACZaJA:
3260 C ABS,MINUS UNARNY,+,-,*,/,DIV,MODE
3261 C ARGUMENT LUB 2 ARGUMENTY SA NA CZUBKU STOSU.
3262 C ARGUMENTY ZASTEPUJE PRZEZ WYNIK OPERACJI /UNIWERSALNY,STALA,WARTOSC/
3264 C WYROZNIA PRZYPADKI:
3265 C OBA ARGUMENTY STALE,
3266 C DODAWANIE,ODEJMOWANIE STALEJ
3267 C MNOZENIE PRZEZ STALE 0..10,
3268 C DZIELENIE PRZEZ 0,1,2,4,8.
3271 C ##### OUTPUT CODE : 37 , 48 , 49 , 50 , 51 , 64 , 65 , 66 ,
3272 C 67 , 68 , 69 , 70 , 71 , 72 , 73 , 74 ,
3273 C 75 , 113 , 114 , 115 , 117 , 118 , 119 ,
3274 C 120 , 121 , 122 , 140 .
3276 C ##### DETECTED ERROR(S) : 460 .
3284 equivalence (y, m(1))
3295 C........................
3297 C TERAZ WB=NUMER OPERACJI
3300 C I WSTAW TYP PRAWEGO ARGUMENTU
3301 TRDIM=STACK(VALTOP-3)
3302 TRBAS=STACK(VALTOP-4)
3304 C.....PRZESKOCZ,JESLI OPERACJA 2-ARGUMENTOWA
3305 IF(WB.GT.2)GO TO 1000
3306 C.....ABS LUB MINUS UNARNY
3307 IF(STACK(VALTOP).EQ.0)RETURN
3314 IF(STACK(VALTOP).EQ.1)GO TO 200
3316 IF(STACK(VALTOP-4).EQ.NRINT)GO TO 150
3317 C ZATEM ZMIENNA,WARTOSC TYPU REAL
3323 100 CALL QUADR3(49+WB,RESULT,STACK(VALTOP-2))
3324 C ZASTAP PRZEZ "WARTOSC" Z NOWYM RESULT
3326 STACK(VALTOP-2)=RESULT
3328 C ZMIENNA,WARTOSC TYPU INTEGER
3329 150 RESULT=TSTEMP(1)
3332 C STALA JAKO ARGUMENT ABS LUB MINUSA UNARNEGO
3333 200 IF(STACK(VALTOP-4).EQ.NRRE)GO TO 250
3334 IF((WB.EQ.1 .AND. STACK(VALTOP-2).LT.0).OR.(WB.EQ.2))
3335 X STACK(VALTOP-2)= -STACK(VALTOP-2)
3338 250 RESULT=STACK(VALTOP-2)
3339 cdsw&bc XREAL=STALER(RESULT)
3341 xreal=staler(result)
3349 IF((WB.EQ.1 .AND. XREAL.LT.0.0).OR.(WB.EQ.2))
3350 X STACK(VALTOP-2)=CREAL(-XREAL)
3353 C................ OPERACJE 2-ARGUMENTOWE.......................
3355 C ROZROZNIA PRZYPADKI : OBA ARGUMENTY STALE , JEDEN ARGUMENT STALY,
3356 C MNOZENIE LUB DZIELENIE PRZEZ WYROZNIONE STALE
3357 C /0,1,2,3,4,5,6,7,8,9,10 LUB 0,1,2,4,8/
3361 C JESLI JEDEN Z ARGUMENTOW UNIWERSALNY-ZASTAP OBA PRZEZ UNIWERSALNY
3362 IF(STACK(VALTOP)*STACK(VLPREV).EQ.0)GO TO 1400
3363 C WSTAW TYP I NAZWE LEWEGO ,SPRAWDZ TYPY
3364 TLDIM=STACK(VLPREV-3)
3365 TLBAS=STACK(VLPREV-4)
3368 C ELEM="WARTOSC",UZYWANE PO SKOKU DO 1400.
3373 C WYKONAJ EWENTUALNA KONWERSJE
3374 IF(CONVR.EQ.1)CALL SVREAL(VALTOP)
3375 IF(CONVL.EQ.1)CALL SVREAL(VLPREV)
3378 C IDL,IDR = WARTOSC LUB NUMER STALEJ LUB ATS LEWEGO,PRAWEGO ARGUMENTU.
3379 C DLA JEDNEGO ARG.STALEGO - IDR=STALA
3382 C..........STALE ARGUMENTY?
3384 GO TO (2000,4000,1600,1050),ARG
3386 C..........OBA ROZNE OD STALYCH
3388 1050 IF(TRESLT.EQ.NRRE)GO TO 1500
3392 1100 RESULT=TSTEMP(1)
3395 1300 CALL QUADR4(OPKOD+WB,RESULT,IDL,IDR)
3398 C.....ZASTAP OBA PRZEZ "WARTOSC" TYPU TRESLT
3400 1400 CALL SRESULT(ELEM)
3413 C.....PRAWY ARGUMENT STALY,LEWY NIE /DLA + , * ROWNIEZ ODWROTNIE/
3414 C JESLI REAL - WSTAW STALA I DALEJ JAK DLA OBU ROZNYCH OD STALYCH
3415 1600 IF(TRESLT.NE.NRRE)GO TO 4100
3417 C TUTAJ ROZSZERZENIE O ARGUMENT 0.0 LUB 1.0
3423 C.............OBA ARGUMENTY STALE. OBLICZ WYNIK.
3427 IF(TRESLT.NE.NRINT)GO TO 3000
3429 C.....OPERACJA NA 2 STALYCH INTEGER
3430 GO TO(2100,2200,2300,2400,2400,2500),WB
3441 2400 IF(IDR.EQ.0)GO TO 4800
3445 2500 RESULT=MOD(IDL,IDR)
3448 C.....OPERACJA NA 2 STALYCH TYPU REAL
3450 cdsw&bc XREAL=STALER(IDR)
3451 cdsw&bc YREAL=STALER(IDL)
3465 C XREAL,YREAL = WARTOSC PRAWEGO,LEWEGO ARGUMENTU
3466 GO TO (3100,3200,3300,3400),WB
3468 3100 XREAL=YREAL+XREAL
3471 3200 XREAL=YREAL-XREAL
3474 3300 XREAL=YREAL*XREAL
3477 cailvax and all other computers: 3400 IF(YREAL.EQ. 0.0)GO TO 4800
3478 3400 if(xreal .eq. 0.0)go to 4800
3480 C WSTAW XREAL DO SLOWNIKA STALYCH REAL
3481 3500 RESULT=CREAL(XREAL)
3484 C.....LEWY ARGUMENT STALY,PRAWY NIE.
3486 C OPERACJA SYMETRYCZNA?
3487 4000 IF(WB.EQ.3 .OR. WB.EQ.5)GO TO 4050
3488 C OPERACJA NIESYMETRYCZNA
3489 IF(TRESLT.EQ.NRRE)GO TO 4030
3492 4030 IDL=SCREAL(IDL)
3494 C TUTAJ ROZSZERZENIE O LEWY ARGUMENT 0.0 DLA - , / .
3498 C OPERACJA SYMETRYCZNA: + , * .ZAMIEN IDL,IDR
3504 C.....WSPOLNA AKCJA. PRAWY ARG.STALY LUB OP.SYM. I LEWY STALY
3505 C IDL = ATS ROZNEGO OD STALEJ ARG.,IDR=STALA
3506 C OBA ARGUMENTY TYPU INTEGER.
3508 4100 RESULT=TSTEMP(1)
3509 GO TO (4150,4150,4300,4200,4400,4700,4700,4720),WB
3513 C - . ZMIEN ZNAK STALEJ
3518 4300 IF(IDR.EQ.0)GO TO 4810
3519 CALL QUADR4(37,RESULT,IDL,IDR)
3523 C * . JAKA TO STALA?
3524 4400 IF(IDR.LT.0 .OR. IDR.GT.10)GO TO 4720
3526 IF(IDR-1) 4805 , 4810 , 4500
3527 C ... MNOZENIE PRZEZ STALA 2..10 /REALIZOWANE PRZEZ SHIFT/
3529 4600 CALL QUADR3(OPKOD,RESULT,IDL)
3534 4700 IF(IDR.GE.0 .AND. IDR.LE.8)GO TO 4750
3536 4720 IDR=SCONST(IDR)
3538 C ... DZIELENIE PRZEZ STALE 0..8 . WYROZNIJ 0,1,2,4,8
3540 GO TO (4800,4810,4820,4720,4840,4720,4720,4720,4880),N
3542 C.....DZIELENIE PRZEZ ZERO
3543 4800 CALL SERROR(460)
3544 C ZASTAP PRZEZ STALA ZERO / DLA MNOZENIA LUB DZIELENIA PRZEZ ZERO /
3546 IF(.NOT.OPTOPT)CALL QUADR2(140,IDL)
3549 C ... ZASTAP PRZEZ ARGUMENT ROZNY OD STALEJ / MNOZENIE,DZIELENIE
3550 C PRZEZ 1 LUB DODAWANIE,ODEJMOWANIE 0 /
3566 C-----------------------------------------------------------------------------
3568 C DWA GORNE ELEMENTY STOSU ZAWIERAJA ARGUMENTY RELACJI :
3569 C IS , IN DLA WB= 1,2 LUB
3570 C = , <> , < , <= , > , >= . WB=NUMER RELACJI /3..8/
3571 C GENERUJE KOD WYZNACZAJACY WARTOSC RELACJI.
3572 C WYROZNIA PRZYPADKI : OBA ARGUMENTY STALE,
3573 C POROWNANIE ZE STALA INTEGER
3574 C POROWNANIE Z ZEREM / 0 LUB 0.0 /
3575 C POROWNANIE Z NONE .
3578 C ##### OUTPUT CODE : 55 , 56 , 76 , 77 , 78 , 79 , 80 , 81 ,
3579 C 82 , 83 , 88 , 89 , 90 , 91 , 92 , 93 ,
3580 C 106 , 107 , 108 , 109 , 110 , 111 ,
3582 C 125 , 126 , 127 , 128 , 129 , 130 .
3584 C ##### DETECTED ERROR(S) : 475 , 476 .
3590 CCCCCCCCCCCCCCCCCCCCCCCC
3591 INTEGER REL(6),RELCONV(6),RLCASE,ELEM
3592 C REL - TABLICA WYZNACZAJACA WYNIKI POROWNANIA DLA 6 RELACJI,
3593 C BITY 15,14,13 =0 JESLI DLA L<P , L=P , L>P WYNIK JEST FALSE
3594 C RELCONV - TABLICA ZAMIANY POROWNAN PRZY ZAMIANIE ARGUMENTOW
3595 C RLCASE - TYP POROWNANIA: 1,3,4-INTEGER,2-REAL,5,6-REFERENCYJNY
3596 C ELEM - RODZAJ ELEMENTU
3601 equivalence (y, m(1))
3603 common/stream/ errflg,line,ibuf2(265),ibuf3(7),junk(260)
3605 DATA RELCONV/3,4,7,8,5,6/,REL/2,5,1,3,4,6/
3609 C WSTAW TYP I NAZWE LEWEGO ARGUMENTU
3610 TLDIM=STACK(VLPREV-3)
3611 TLBAS=STACK(VLPREV-4)
3614 IF(WB.LT.3)GO TO 7000
3616 IF(STACK(VALTOP)*STACK(VLPREV).EQ.0)GO TO 3200
3617 C WSTAW TYPY ARGUMENTOW
3618 TRDIM=STACK(VALTOP-3)
3619 TRBAS=STACK(VALTOP-4)
3623 IF(WB.LE.4)GO TO 200
3627 IF(TRESLT.EQ.NRRE)RLCASE=2
3630 C WSTAW INFORMACJE O DOSTEPNOSCI TYPOW FORMALNYCH
3631 200 OBJL=STACK(VLPREV-6)
3632 OBJR=STACK(VALTOP-6)
3635 C RLCASE OKRESLA TYP POROWNANIA: 1,3,4-INTEGER,2-REAL,5,6-REFERENCYJNE
3636 300 IF(CONVL.EQ.1)CALL SVREAL(VLPREV)
3637 IF(CONVR.EQ.1)CALL SVREAL(VALTOP)
3640 C IDL,IDR=WARTOSC LUB NUMER STALEJ LUB ATS LEWEGO,PRAWEGO ARGUMENTU
3642 C WYBIERZ TYP POROWNANIA: INTEGER,REAL,REFERENCYJNY
3643 GO TO (1000,3000,1000,1000,5000,5000),RLCASE
3649 1000 GO TO (1050,1200,1500,1300),ARG
3650 C.....OBA STALE,WYZNACZ WARTOSC RELACJI
3651 1050 X=FLOAT(IDL-IDR)
3653 C.....LEWY STALY,PRAWY NIE. ZAMIEN.
3659 C.....LEWY ROZNY OD STALEJ.
3662 C ="POROWNANIE INTEGER"-3
3664 C.....PRAWY STALY,LEWY NIE.
3666 C ="POROWNANIE ZE STALA"-3
3668 IF(IDR.EQ.0)GO TO 3400
3671 C.....GENERUJ POROWNANIE 2-ARG.
3672 1800 RESULT=TSTEMP(1)
3673 CALL QUADR4(RLCASE+WB,RESULT,IDL,IDR)
3677 C..........POROWNANIE 2 ARGUMENTOW REAL
3680 C ="POROWNANIE REAL"-3
3681 cdsw GO TO (3050,3300,4000,1800),ARG
3682 cdsw --------------------------
3683 go to (3050,3700,4000,1800),arg
3684 cdsw --------------------------
3685 C.....OBA STALE. WYZNACZ WARTOSC RELACJI
3686 cdsw&bc 3050 X=STALER(IDL)-STALER(IDR)
3688 3050 x=staler(idl)-staler(idr)
3700 3100 IF ( X ) 3110,3120,3130
3702 3110 RESULT=IAND(REL(WB-2),1)
3705 3120 RESULT=IAND(REL(WB-2),2)
3708 3130 RESULT=IAND(REL(WB-2),4)
3709 3150 IF(RESULT.NE.0)RESULT=-1
3710 C RESULT ZAWIERA REPREZENTACJE TRUE LUB FALSE
3714 C.....ZASTAP OBA ARGUMENTY PRZEZ WYNIK TYPU BOOLEAN
3722 C.....LEWY STALY,PRAWY NIE. LEWY = 0.0 ?
3723 cdsw3300 IF(STALER(IDL).NE. 0.0)GO TO 3700
3724 C LEWY=0.0, ZAMIEN POROWNANIA
3725 cdsw WB=RELCONV(WB-2)
3727 C.....GENERUJ POROWNANIE 1-ARG.
3728 3400 RESULT=TSTEMP(1)
3729 CALL QUADR3(73+WB,RESULT,IDL)
3730 C ZASTAP PRZEZ WARTOSC
3732 C.....LEWY ARG. STALY<>0.0 ,WSTAW STALA
3733 3700 IDL=SCREAL(IDL)
3735 C.....PRAWY STALY,LEWY NIE. PRAWY = 0.0 ?
3736 cdsw 4000 IF(STALER(IDR).EQ. 0.0)GO TO 3400
3737 C NIE 0.0 , WSTAW STALA
3738 cdsw ---------- added -------
3740 cdsw ------------------------
3747 C..........REFERENCYJNE.
3748 5000 GO TO (5050,5200,5300,5600),ARG
3749 C OBA NONE ,WSTAW TRUE DLA = , FALSE DLA <> / -1 LUB 0 /
3753 C.....LEWY NONE,PRAWY NIE. ZAMIEN
3755 C.....PRAWY NONE,LEWY NIE
3758 C.....OBA ROZNE OD NONE. ### BEZ DYNAMICZNEJ KONTROLI TYPOW #####
3763 C.....RELACJA IS , IN
3766 7000 IF(STACK(VLPREV).EQ.0)GO TO 7100
3767 TLBAS=IAND(IPMEM(TLBAS),15)
3768 IF((TLBAS.GT.7 .AND. TLBAS.LT.13).OR.TLDIM.GT.0)CALL MERR(475,IDL)
3769 C ZBADAJ PRAWY : REKORD,KLASA?
3770 7100 IDL=STACK(VALTOP)
3771 IF(IDL.EQ.0)GO TO 3200
3772 IF(IDL.EQ.8.OR.IDL.EQ.9)GO TO 7200
3776 7200 IF(STACK(VLPREV).EQ.1)GO TO 7300
3779 CALL QUADR4(54+WB,RESULT,STACK(VLPREV-2),STACK(VALTOP-4))
3781 C LEWY=NONE : NONE IS -> FALSE , NONE IN -> TRUE
3787 C-----------------------------------------------------------------------------
3789 C OBSLUGUJE GENERACJE TABLICY.
3790 C GORNE 3 ELEMENTY STOSU TO: ZMIENNA TABLICOWA,DOLNA GRANICA /UNIWERSALNY,
3791 C STALA,WARTOSC/,GORNA GRANICA /NA CZUBKU/.
3792 C ZDEJMUJE ZE STOSU 2 GORNE /1 ZOSTAWIA/,NIE WOLA SNEXT
3795 C ##### OUTPUT CODE : 23 , 132 ,145 .
3797 C ##### DETECTED ERROR(S) : 433 , 435 .
3804 C RUNNING-SYSTEM IDENTIFIERS OF ARRAY ELEMENTS : INTEGER,REAL,--,REFERENCE
3807 DATA AUX / -1 , -3 , 0 , -2 /
3812 IF(STACK(VALTOP).NE.1 .OR. STACK(VLPREV).NE.1)GO TO 60
3813 C TAK. DOLNA < GORNA ?
3814 IF(STACK(VLPREV-2).GT.STACK(VALTOP-2))
3815 X CALL SERRO2(433,VLPREV-9)
3816 C NAZWA 3-GO OD GORY,2-GI MA APETYT 8 /STALA/
3818 C WSTAW GRANICE GORNA,DOLNA
3820 CALL QUADR4(145,SVATS(VALTOP),1,I-1)
3821 C WSTAW WARTOSC I-TEGO PARAMETRU
3822 C PROCEDRA STANDARDOWA GENERACJI TABLICY MA NUMER 1 I PARAMETRY:
3823 C 0 - UPPER ,1 - LOWER,2 - APETYT,3 - ADRES VIRT.NOWEJ TABLICY
3826 C OBIE GRANICE WSTAWIONE. NA CZUBKU ZMIENNA.TABLICOWA?
3828 C IF(STACK(VALTOP).EQ.0)GO TO 30 NO GLOBAL JUMPS
3829 IF(STACK(VALTOP).EQ.0)RETURN
3833 N=SAPET(N-1,STACK(VALTOP-4))
3835 CALL QUADR4(145,SCONST(N),1,2)
3837 C WYGENEROWANA NOWA TABLICA.ODCZYTAJ I WPISZ JEJ ADRES
3839 CALL QUADR4(23,N,1,3)
3840 CALL SSTORE(VALTOP,N)
3842 C.....ERROR: ZMIENNA NIE JEST TYPU TABLICOWEGO
3843 300 CALL SERROR(435)
3846 SUBROUTINE SRESULT(ELEM)
3847 C-----------------------------------------------------------------------------
3849 C POMOCNICZA. ZASTEPUJE 2 GORNE ELEMENTY STOSU PRZEZ ELEMENT
3850 C BEZ NAZWY TYPU ELEM.
3851 C JESLI TO NIE UNIWERSALNY,TO WSTAWIA TYP /0,TRESLT/,
3852 C ZERUJE SLOWO -5,DO SLOWA -2 WSTAWIA RESULT
3853 C UZYWANA DLA ZASTAPIENIA 2 ARGUMENTOW PRZEZ WYNIK /WARTOSC/ OPERACJI.
3863 STACK(VALTOP-2)=RESULT
3865 STACK(VALTOP-4)=TRESLT
3869 SUBROUTINE SRESLT1(TYPE)
3870 C-----------------------------------------------------------------------
3872 C ZASTEPUJE CZUBEK STOSU PRZEZ WARTOSC TYPU <0,TYPE> ,
3873 C BEZ NAZWY, DO SLOWA -2 WSTAWIA RESULT, ZERUJE SLOWA -5,-6
3882 STACK(VALTOP-2)=RESULT
3884 STACK(VALTOP-4)=TYPE
3890 C----------------------------------------------------------------------
3892 C SPRAWDZA,CZY CZUBEK STOSU ZAWIERA ZMIENNA /ZMIENNA PROSTA,
3893 C ELEMENT TABLICY,TABLICA STATYCZNA/.
3894 C JESLI NIE, TO SYGNALIZUJE BLAD I ZASTEPUJE PRZEZ UNIWERSALNY.
3895 C GENERUJE KOD WYLICZAJACY ADRES FIZYCZNY ZMIENNEJ.
3896 C ATS WYLICZONEGO ADRESU ZWRACA NA ZMIENNA RESULT.
3898 C ##### OUTPUT CODE : 29 , 30 .
3900 C ##### DETECTED ERROR(S) : 420.
3910 IF(IDL.GT.5)GO TO 1000
3911 GO TO (1000,1000,300,400,500),IDL
3913 300 N=STACK(VALTOP-2)
3916 IF(STACK(VALTOP-7).EQ.0)GO TO 350
3917 C ... ZMIENNA PRZEZ KROPKE
3918 CALL QUADR4(29,RESULT,SMEMBER(VALTOP),N)
3920 C ... ZMIENNA WIDOCZNA
3921 350 CALL QUADR3(30,RESULT,N)
3923 C.....ELEMENT TABLICY
3924 400 RESULT=SARRAY(VALTOP)
3926 C.....TABLICA STATYCZNA
3930 1000 CALL SERROR(420)
3931 C ZASTAP PRZEZ UNIWERSALNY
3937 SUBROUTINE SBOOLEX(N)
3938 C-----------------------------------------------------------------------------
3940 C OBSLUGUJE 2-ARGUMENTOWE OPERACJE BOOLOWSKIE /N=1 --> AND,
3942 C 2 GORNE ELEMENTY STOSU SA ARGUMENTAMI.
3945 C ##### OUTPUT CODE : 100 , 101 , 140 .
3947 C ##### DETECTED ERROR(S) : 417 .
3952 CCCCCCCCCCCCCCCCCCCCCCC
3958 C.....USTAW TYP WYNIKU
3960 C ZBADAJ TYPY,NAJPIERW PRAWEGO.
3961 IF(STACK(VALTOP).NE.0) CALL SCHECK(417,NRBOOL)
3962 C SPRAWDZ LEWY ARGUMENT
3964 IF(STACK(VLPREV).EQ.0)GO TO 120
3968 CALL SCHECK(417,NRBOOL)
3970 IF(STACK(VALTOP).EQ.0)GO TO 120
3971 C.....ZATEM OBA ARGUMENTY O.K. ARGUMENY STALE?
3973 GO TO (170,130,160,100),ARG
3974 C GENERUJ ZMIENNA ROBOCZA.
3975 100 RESULT=TSTEMP(1)
3976 CALL QUADR4(100+ANDOPR,RESULT,STACK(VLPREV-2),STACK(VALTOP-2))
3980 C.....ZASTAP PRZEZ WYNIK
3982 120 CALL SRESULT(ELEM)
3986 C.....LEWY ARGUMENT STALY,PRAWY NIE.
3987 C DALEJ BEDZIE: ELEM=ATS WARTOSCI LUB ZMIENNEJ, RESULT=WARTOSC STALEJ.
3988 130 RESULT=STACK(VLPREV-2)
3989 ELEM=STACK(VALTOP-2)
3990 C.....WSPOLNA AKCJA DLA 1 ARGUMENTU STALEGO. ELEM,RESULT - JAK WYZEJ.
3991 140 IF(ANDOPR.EQ.1 .AND. RESULT.EQ.-1 .OR.
3992 X ANDOPR.EQ.0 .AND. RESULT.EQ.0)GO TO 150
3993 C.....AND,FALSE LUB OR,TRUE .
3994 C ZASTAP OBA WARTOSCIA RESULT, EWENT. GENERUJ NOP.
3995 IF(.NOT.OPTOPT)CALL QUADR2(140,ELEM)
3998 C.....AND,TRUE LUB OR,FALSE. ZASTAP OBA PRZEZ ROZNY OD STALEJ ARGUMENT.
4001 C.....PRAWY STALY,LEWY NIE.
4002 160 ELEM=STACK(VLPREV-2)
4003 RESULT=STACK(VALTOP-2)
4007 ELEM=STACK(VALTOP-2)+STACK(VLPREV-2)
4008 IF(ANDOPR.EQ.1 .AND. ELEM.EQ.-2 .OR.
4009 X ANDOPR.EQ.0 .AND. ELEM.NE.0) RESULT=-1
4014 C-----------------------------------------------------------------------
4016 C POMOCNICZA. BADA,CZY 2 GORNE ELEMENTY STOSU SA STALYMI.
4017 C NADAJE ZMIENNEJ ARG WARTOSC :
4019 C 2 - LEWY STALY,PRAWY NIE
4020 C 3 - LEWY NIE,PRAWY STALY
4021 C 4 - OBA ROZNE OD STALYCH
4028 IF(STACK(VALTOP).NE.1)ARG=2
4029 IF(STACK(VLPREV).NE.1)ARG=ARG+2
4033 C-----------------------------------------------------------------------------
4035 C OBSLUGUJE KOLEJNY INDEKS DLA TABLICY DYNAMICZNEJ.
4036 C WOLANA PO WYSTAPIENIU "," LUB ")"
4037 C CZUBEK STOSU ZAWIERA INDEKS .
4038 C PONIZEJ ADRES TABLICY .
4039 C ZASTEPUJE 2 GORNE ELEMENTY STOSU PRZEZ "ELEM.TABLICY" .
4043 C ##### DETECTED ERROR(S) : 431 .
4049 common/stream/ errflg,line,ibuf2(265),ibuf3(7),junk(260)
4052 C SPRAWDZ TYP INDEKSU
4054 IF(STACK(VLPREV-3).GT.0)GO TO 200
4056 CALL SERRO2(431,VLPREV)
4059 200 STACK(VLPREV-3)=STACK(VLPREV-3)-1
4060 C ZASTAP PRZEZ "ELEM.TABLICY"
4062 STACK(VLPREV-7)= STACK(VALTOP-2)
4063 C WARTOSC INDEKSU. STALY?
4064 IF(STACK(VALTOP).EQ.1)STACK(VLPREV-2)= - STACK(VLPREV-2)
4068 C----------------------------------------------------------------------
4070 C POMOCNICZA. SPRAWDZA,CZY CZUBEK STOSU ZAWIERA ELEMENT
4071 C SPROWADZALNY DO WARTOSCI TYPU INTEGER.
4072 C WYLICZA WARTOSC CZUBKA STOSU,DOKONUJE EWENTUALNEJ KONWERSJI DO INTEGER
4073 C WOLANA PRZEZ PROCEDURY SINDEX,SINDXS DLA KONTROLI INDEKSU
4075 C ##### DETECTED ERROR(S) : 412 .
4082 IF(STACK(VALTOP).EQ.0)RETURN
4083 C NIE UNIWERSALNY,SPRAWDZ TYP
4085 IF(STACK(VALTOP-3).GT.0 .OR. (N.NE.NRUNIV .AND. N.NE.NRINT
4086 X .AND. N.NE.NRRE) )GO TO 500
4088 IF(N.EQ.NRRE)CALL SVINT(VALTOP)
4090 C.....NIEPOPRAWNY TYP INDEKSU
4091 500 CALL SERROR(412)
4095 C-----------------------------------------------------------------------------
4099 C PROCEDURA OBSLUGUJE WIELOKROTNE PODSTAWIENIE.
4100 C WOLANA PRZEZ SDPDA PO POJAWIENIU SIE ASSIGN.
4101 C DOKONUJE KONTROLI TYPOW, GENERUJE KOD DYNAMICZNEJ KONTROLI
4102 C TYPOW I KONWERSJI ORAZ KOD NADAJACY WARTOSCI LEWYM STRONOM PODSTAWIENIA.
4103 C CZUBEK STOSU ZAWIERA PRAWA STRONE PODSTAWIENIA
4104 C PONIZEJ ,OD LSTFOR+1 DO LSTLSE ZNAJDUJA SIE LEWE STRONY PODSTAWIENIA
4105 C /UNIWERSALNY,ZMIENNA -MOZE BYC PRZEZ KROPKE-,ELEMTABLICY,TABL.STATYCZNA/.
4106 C WYROZNIA PRZYPADEK PODSTAWIENIA STALEJ REPREZENTOWANEJ PRZEZ ZERA.
4108 C OBNIZA STOS , USTAWIA LSTLSE.
4111 C ##### OUTPUT CODE : 150 , 170 .
4119 CCCCCCCCCCCCCCCCCCCCC
4121 C TYPL,TYPR - ATS-Y TYPOW LEWEJ,PRAWEJ STRONY /DLA KONTROLI DYNAMICZNEJ/
4123 C VALUE=ATS PRAWEJ STRONY LUB 0,GDY TO STALA REPREZENTOWANA PRZEZ ZERA
4124 C LSE=KOLEJNA LEWA STRONA
4126 C............................................
4128 C JESLI BRAK LEWYCH STRON LUB CZUBEK UNIWERSALNY-OBNIZ STOS
4129 IF(STACK(VALTOP).EQ.0 .OR. LSTLSE.LE.LSTFOR)GO TO 1000
4130 C CZUBEK NIE JEST UNIWERSALNY,SA LEWE STRONY.
4132 C.....OBEJRZYJ PRAWA STRONE PODSTAWIENIA
4133 TYPR=STACK(VALTOP-5)
4137 C................ KONIEC PRZYGOTOWAN. WYKONAJ W PETLI PODSTAWIENIE.
4141 C....................POCZATEK PETLI DLA KOLEJNYCH LEWYCH STRON
4142 C LSE WSKAZUJE KOLEJNA LEWA STRONE
4143 500 IF(STACK(LSE).EQ.0)GO TO 900
4145 C ZBADAJ POPRAWNOSC PODSTAWIENIA
4150 TRDIM=STACK(VALTOP-3)
4151 TRBAS=STACK(VALTOP-4)
4152 OBJR=STACK(VALTOP-6)
4154 C KONTROLA DYNAMICZNA?
4155 IF(J.GE.4 .AND. OPTTYP)GO TO 800
4156 C KONWERSJA LUB KONTROLA DYNAMICZNA
4157 GO TO (800,610,620,630,640,650,660),J
4160 610 CALL SVINT(VALTOP)
4161 VALUE=STACK(VALTOP-2)
4162 C JESLI STALA - WSTAW DO TABLICY SYMBOLI
4163 IF(STACK(VALTOP).EQ.1)VALUE=SCONST(VALUE)
4167 620 CALL SVREAL(VALTOP)
4168 VALUE=STACK(VALTOP-2)
4169 C JESLI STALA - WSTAW DO TABLICY SYMBOLI
4170 IF(STACK(VALTOP).EQ.1)VALUE=SCREAL(VALUE)
4173 C.....OBIE STRONY ZNANEGO TYPU
4174 630 CALL QUADR3(150,VALUE,STACK(LSE-4))
4177 C.....TYP LEWEJ FORMALNY,PRAWEJ ZNANY
4178 640 IF(TYPR.EQ.0)TYPR=STYPST(VALTOP)
4181 C.....TYP LEWEJ ZNANY,PRAWEJ FORMALNY
4182 650 TYPL=STYPST(LSE)
4185 C.....TYPY OBYDWU STRON FORMALNE
4186 660 TYPL=STYPFT(LSE)
4190 C..........KONTROLA DYNAMICZNA: TYPL,TYPR - TYPY LEWEJ,PRAWEJ STRONY
4191 700 CALL QUADR4(170,TYPL,VALUE,TYPR)
4195 800 CALL SSTORE(LSE,VALUE)
4196 C....................ZAKONCZENIE PETLI:
4197 C CZY JEST KOLEJNE LSE?
4200 IF(LSE.GT.LSTFOR)GO TO 500
4201 C.................... OBNIZANIE STOSU
4204 IF(VALTOP.GT.LSTFOR)GO TO 1020