(*==============================================*) (* 16.10.'86 FLORIAN MATTHES C-128 *) (* 30.6.'89 U1: HEAPPTR = 53, COMPILINGPARAM. *) (* FUER BOOTSTRAP C-128 -> C-128 *) (* PCODE START:-25856 ($9B00) WENIGER ALS 23K *) (* KONSTANTEN :-2752 ($F540 CHECKSUM ANPASSEN!)*) (* SCANNER :$F7B0 (BIS MAX.$FF00) *) (*==============================================*) (*$R-*) (*$C-*) (*$P+*) PROGRAM PASCAL(INPUT,OUTPUT; -25856;-2752;-32256;1024;1032;1040;53); LABEL 8, (* ABORT LABEL MIT RETURN-ABFRAGE *) 9; (* ABORT LABEL DIREKTE RUECKKEHR *) CONST TXMAX =530; (* MAX. EINTRAEGE IN BEZTAB *) MXLBL = 10; (* # LABELS IM PROGRAMM *) MXCASE= 45; (* FALLMARKEN PRO CASE-STAT.*) ALEN = 13; (* SIGNIFIKANTE STELLEN *) HEAD = 6; (* # BYTES FUER DL,SL,RA *) SETBYTES =12;(* 12 BYTES PRO MENGE *) SETSIZE =95;(* SETBYTES * 8 - 1 *) KBUFFERSIZE=80;(* EINE "SEITE" KONSTANTEN *) FSEK=4; CSEK=5;(* SEKUNDAERADRESSEN C/F$ *) GRAFOFFSET=9216; (* VERSCHIEBUNG (BASIC) *) (* CODES VON GETSYM: "()*+,-./:;<=>[]^#" *) KLAUF =40;KLZU =41;STERN =42;PLUS =43; KOMMA =44;MINUS =45;PUNKT =46;QUER =47; DPKT =58;SEMI =59;KLEINER=60;GLEICH=61; GROESSER=62;EKLAUF=91;EKLZU =93;PFEIL =94; HASH =35; STRCST=251;IDENT=252;INTNUM=253;REALNUM=254; EOFILE=255; (* INDIZES DER STANDARDBEZEICHNER: *) BOOL =2; INT =4; CHART=5; REALS=6; NILS=7; STRNG=8; SETT=9; TXTF=10; STRINGID=11; INFILE=12; OUTFILE=13; GRAFIK=69; (* M-CODE-ADRESSEN FUER HILFSROUTINEN: *) (* (WERTE AUS SCR.SYST.S/NEWSCAN.S) *) UINIT =-1838; UHOLE =-1754; UVORBEL=-952; UPOSI = -892; ENDOBJ= 5132; TEMPFLG=5134; ORGSRC = 5130; FIRSTFLAG = 5158; PHYSTOP=-9472; ULOAD = -43; (* $FFD5 *) (* BEFEHLSCODES: P-CODE *) SSYM = 0; LSYM = 4; SRSYM = 8; LRSYM =12; SBSYM =16; LBSYM =20; LDCSYM=24; LRCSYM=25; LSASYM=26; SSASYM=27; FSYM =28;LDSTRSYM=31; ADDSYM=32; INVSYM=39; CHSSYM=46; NOTSYM=47; FLTSYM=49; FLOSYM=50; MONSYM=52; DYASYM=53; CMPSYM=54; GS1SYM=55; GS2SYM=56; NULSYM=57; UNISYM=58; ISCSYM=59; DIFSYM=60; INNSYM=61; SGESYM=62; SLESYM=63; SEQSYM=64; ADUSYM=65; STRCMPSYM=66; CCTSYM=67; LDCHSTRSYM=73; LDARSTRSYM=74; STRMOVSYM=75; MOVSYM=76; POPSYM=77; ALCSYM=78; MSTSYM=79; NEWSYM=80; TSTSYM=81; ERRSYM=82; HLTSYM=83; SYSSYM=84; RPRSYM=85; JCDSYM=86; JNCSYM=87; JMPSYM=88; JMLSYM=89; JMCSYM=90; CUPSYM=91; FOR1SYM=92;FOR2SYM=93; LCBSYM=116;LC0SYM=117; CASERR=3;(* FEHLERCODE 'NO LABEL IN CASE' *) COPYRIGHT = "DIESES PROGRAMM LIEGT DEM BUCH" #13 "'PASCAL MIT DEM C-128' DES MARKT UND" #13 "TECHNIK VERLAGS AUF DISKETTE BEI." #13 #13 "AUTOR: FLORIAN MATTHES" #13 #13 "KOPIERUNG, VERVIELFAELTIGUNG, VERLEIH" #13 "ODER VERMIETUNG IST UNTERSAGT." #13 #13; TYPE TBEZ = PACKED ARRAY[0..ALEN] OF CHAR; VORBELBEZ= PACKED ARRAY[0..6 ] OF CHAR; TAB = PACKED ARRAY[0..TXMAX] OF INTEGER; TART = (NUL, KONST, STDTYP, AUFZHL, AUSSCH, FELDTYP, STRTYP, VERBTYP, MENGE, SEQTYP, ZEIGTYP, SAMET, SELECT, VARBLE, PROZ, FKT); VARDESCRIPTOR = RECORD VTYP, OFFSET, LEVEL:INTEGER; ACCESS:(BASEOFFSET, ABSOLUTE, BASESTACK); END; TPKBUFFER = ^TKBUFFER; TKBUFFER = RECORD B :PACKED ARRAY[0..KBUFFERSIZE] OF CHAR; NEXT:TPKBUFFER; END; VAR NUM :INTEGER[-2128];(* LETZTE ZAHL *) ZNR :INTEGER[-2126];(* NR. LFD ZEILE *) SYM :BYTE [-2124];(* LETZTES SYMBOL *) POS :INTEGER[-2122];(* POSITION IN BEZTAB *) FLOAT :REAL [-2120];(* WENN SYM=REALNUM *) ID :TBEZ [-2115];(* LETZER BEZEICHNER *) INDEX :BYTE [-2100];(* POS. IN ZEILE *) TSTFLG:BOOLEAN[-2097];(* RUN-TIME CHECKING *) PARTEST:BOOLEAN[-2095];(* PARAMETERPRUEFUNG *) (* FUER STRINGS *) CHAIN :BOOLEAN[-2093];(* NAMEN DER PROZ/FKT *) (* KOMPILIEREN *) REGS : RECORD STATUS,AKKU,X,Y:BYTE; END; TABBEZ :PACKED ARRAY[0..TXMAX] OF TBEZ; TABART :PACKED ARRAY[0..TXMAX] OF TART; TABA1,TABA2 :TAB; (* ATTRIBUTE DER BEZ. *) TABA3 :TAB; (* ATTRIBUTE DER BEZ. *) REALVALUE :RECORD SIGN: INTEGER; (* -1,0,+1 *) CASE BOOLEAN OF TRUE: (R: REAL); FALSE:(S: PACKED ARRAY [0..4] OF CHAR); END; LBL :ARRAY [0..MXLBL] OF RECORD VAL, LEV, ADR:INTEGER END; OPCODE :ARRAY [0..13] OF INTEGER; EMPTY :RECORD CASE BOOLEAN OF TRUE :(SHORT: VORBELBEZ); FALSE:(LONG : TBEZ); END; DUMMY :TBEZ; BLOCKNAME :TBEZ; (* GLOBAL SPEICHERN *) ZU :VARDESCRIPTOR; TX,LAST :INTEGER; (* ZEIGER IN BEZTAB *) WITHIND :INTEGER; (* -"- *) WITHADR :INTEGER; (* OFFSET ZU BASIS *) FWD,FWDTYP :INTEGER; (* ZAEHLER *) PRTFLG :BOOLEAN; PC :INTEGER; (* PROGRAMMZAEHLER *) ERRORPC :INTEGER; (* FUER DETECT *) STARTPC,ORGKC:INTEGER; (* FUER STATISTIK *) STACKPC :INTEGER; (* DORT POINTER AUF *) (* STACKANFANG *) FEHLER,I :INTEGER; GENFLG :(MEMORY,ONFILE,DETECT,SYNTAX); KBUFFERROOT,KBUFFER: TPKBUFFER; KC,KBUFFERZ :INTEGER; INCLUDE,LIST :TEXT; (* FUER SOURCE/LISTING*) COMMAND,CFILE:TEXT; (* FUER CODEERZEUGUNG *) FFILE :FILE OF (* FUER FIXUP *) RECORD V,N: INTEGER; (* VON,NACH *) END; HBYTEOVERFLOW : BYTE; CHECKSUM : INTEGER; OFFSET,HEAPPTR:INTEGER; GRAFPROGRAM :BOOLEAN; COMPILINGPARAMETER: BOOLEAN; (* U1: *) CH :CHAR; (*$"P.IFACE.P" *) PROCEDURE BLOCK(BLKTYP :TART; LVL,LBLIND:INTEGER); (* BLKTYP = NUL,PROZ,FKT *) VAR BLK,FIXADR,DX,K :INTEGER; LBLI2,LAST2,TX2 :INTEGER; ISFWD, BLOCKSTART :BOOLEAN; CH : CHAR; (*$"P.SIZE.P" *) (*$"P.DECL.P" *) FUNCTION EXPRESSION:INTEGER; FORWARD; (*$"P.VARS.P" *) (*$"P.CALL1.P" *) (*$"P.CALL2.P" *) (*$"P.EXPRESSION.P"*) (*$"P.STATEMENT.P" *) (*$"P.BLOCK.P" *)