TOP;METATERP 8086 IMPLEMENTATION UNDER CP/M ;PROGRAMMED BY A. L. BENDER, M. D. PARAMETER KEF=026;CP/M END OF FILE PARAMETER KHT=009;HORIZONTAL TAB PARAMETER KQM=039;QUOTE MARK PARAMETER KEL=013;CARRIAGE RETURN CODE PARAMETER KNL=010;LINE FEED ;COPYRIGHT (C) W.A.GALE BYTE AA;ALL LOW DOUBLE LETTERS ARE TEMPORARY VARIABLES BYTE BB BYTE BO(080);OUTPUT STRING BYTE C0;NUMBER 0 BYTE C1;NUMBER 1 BYTE C2;NUMBER 2 BYTE C3;NUMBER 3 BYTE C9;NUMBER 9 BYTE CB;BLANK BYTE CC BYTE CD;'.' DOT BYTE CE;'/' ESCAPE FOR NUMBERS BYTE CG;'>' BYTE CL;'<' BYTE CM;'-' BYTE CP;'+' BYTE CQ;''' BYTE CS;'*' BYTE CT;HORIZONTAL TAB BYTE CU;'=' BYTE CV;NUMBER 25 BYTE CX;'!' BYTE DD BYTE DS(010);DIGIT STACK FOR WRITING NUMBERS BYTE EE BYTE EF;CP/M END OF FILE CODE (CTL-Z) BYTE EL;CARRIAGE RETURN CODE BYTE F1(128);INPUT BUFFER BYTE F2(128);OUTPUT BUFFER BYTE FL;FLAG FOR TRUE AND FALSE JUMPS BYTE KA;SPECIAL BYTE FOR TESTS IN KG ROUTINE BYTE KB;SPECIAL BYTE FOR TESTS IN KG BYTE KC;WRITE OUTPUT TO CRT TOO BYTE KS(06000);PROGRAM MEMORY SPACE BYTE LI;INSTRUCTION LENGTH BYTE LL;LINE LENGTH DURING LOADING BYTE MC(03000);SYMBOLIC MEMORY CHARACTER VECTOR BYTE MK;MEMORY SIZE CELL BYTE MN;DIMENSIONS OF NS LESS ONE BYTE ND;NUMBER OF DIGITS FOR WRITING NUMBERS BYTE NL;NEW LINE !!!! PARAMETERIZED SYSTEM DEPENDENT BYTE NS(080);CIRCULAR INPUT BUFFER BYTE OS(080);INPUT STRING BYTE PB;POINTER INTO BO BYTE PI;INDEX INTO RI BYTE PL;POINTER INTO NS BYTE PM;LOCUS IN NS WHERE INPUT NOT ACCEPTED BYTE PN;COUNT OF SUBROUTINES LOADED BYTE PO;POINTER INTO OS BYTE QI;POINTER INTO RI BYTE RC;COMMAND READ BYTE RI(080);INSTRUCTION REGISTER BYTE SD;STACK DIMENSIONS BOTH Y AND Z BYTE WA;WORK IN PACK BYTE WB;WORK IN PACK BYTE X0;CHARACTER ZERO BYTE X1; 1 BYTE X2; 2 BYTE X3; 3 BYTE X9; 9 BYTE XA; A BYTE XB; B BYTE XC; C BYTE XD; D BYTE XE; E BYTE XF; F BYTE XG; G BYTE XH; H BYTE XI; I BYTE XJ; J BYTE XK; K BYTE XL; L BYTE XM; M BYTE XN; N BYTE XO; O BYTE XP; P BYTE XQ; Q BYTE XR; R BYTE XS; S BYTE XT; T BYTE XU; U BYTE XV; V BYTE XW; W BYTE XX; X BYTE XY; Y BYTE XZ; Z BYTE YP;STACK POINTER BYTE ZP;STACK POINTER BYTE ZX;STORAGE FOR ERROR RECOVERY SYMBOL ; ;INTEGER STORAGE ; INT I00;NUMBER 000 INT I01;NUMBER 001 INT I03;NUMBER 003 INT I10;NUMBER 10 INT I16;NUMBER 16 INT IAA;WORKING STORAGE INT IBB;WORKING STORAGE INT IBK;BLOCK NUMBER (FILE NUMBER) INT ICC;WORKING STORAGE INT IDD;WORKING STORAGE INT ILB;POINTER INTO ILT INT ILN;LINE NUMBER OF INPUT INT ILT(01000);LOCATION TABLE FOR NUMBER LABELS INT IMB;MEMORY BASE INDEX FOR CURRENT LEVEL INT IMD;DIMENSION OF MC AND IMI INT IMF;MEMORY FREE INDEX INT IMI(03000);SYMBOLIC MEMORY INDEX VECTOR INT IML;NUMBER OF LOCAL PARAMETERS PER MEMORY LEVEL INT IMM;MAX MEMORY COUNTER INT IMT;TOP OF FREE MEMORY, REST TAKEN BY CELL STACK INT IMX;NULL MEMORY INDEX INT IMZ;TEMP VBL FOR MEM SRCH INT INL;NUMBER OF NUMERICAL LABELS INT IPC;PROGRAM COUNTER INDEX TO CURRENT INSTRUCTION INT IPL;CODE POINTER WHILE LOADING INT IPR(010);REGISTER VECTOR INT IPT;POINTER INTO IST SUBROO STACK INT IRN;NUMBER RETURNED BY READ NUMBER ROUTINE INT ISM;SYMBOL NUMBER OF INPUT INT IST(00600);SUBROUTINE AND LABEL STACK INT ITU;RESULT OF DIRECT FETCH INT IUU;UNIQUE SYMBOL GENERATOR INT IXX;WORK DURING NUMBER MANIP INT IYS(080);Y STACK INT IYY;WORK DURING NUMBER MANIP INT IZC;ERROR PROGRAM COUNTER INT IZS(080);Z STACK INT IZT;ERROR STACK POINTER BEGINMAIN(AC,IAV) EL=+KEL NL=+KNL MS 'METATERP ' MS 'Ver 1.2 ' GOSUB CR MS '8086 VERS' MS 'ION FOR C' MS 'P/M-86 ' GOSUB CR MS 'COPYRIGHT' MS ' 1984 A. ' MS 'L. BENDER' MS ', M. D. ' GOSUB IN; INITIALIZATION GOSUB CR; DON'T DO UNTIL IN HAS EXECUTED GOSUB RC; READ COMMANDS GOSUB LI;LEXICAL INITIALIZATION IPC=+00000 LOC 00 GOSUB GI CC=RI(C0) CHOOSE ON CC CASE XL;LEXICAL ANALYSIS COMMANDS AA=PI==C1 IF AA IF FL GOSUB LW;SEEK WHITE SPACE MOVE UP BASE ISM++; INCREMENT SYMBOL COUNT ELSE PL=PM;RESET LOOK AHEAD POINTER ENDIF ELSE;LONGER THAN ONE CC=RI(C1) CHOOSE ON CC CASE XM;MATCH SPECIFIC STRING FL=+000 BB=+002 WHILE AA=BB>>' GOTO 98 ENDIF IST(IPT)=IPC PACK(IPC,WA,WB) IAA=IPT IAA++ IST(IAA)=I00 IAA++ IST(IAA)=I00 CASE XR; RETURN IPC=IST(IPT) AA=IPTSECOND UNIQUE ELSE; JUST A FETCH... GOTO 22 ENDIF CASE XM; MEMORY OPERATIONS CC=RI(C1) CHOOSE ON CC CASE XS; STACK MEMORY GOSUB MH CASE XP; POP MEMORY GOSUB MP CASE XE; DEFINE A CELL ON TOP GOSUB ME IPR(C0)=IAA CASE XQ; QUERY GOSUB MS IPR(C0)=IAA CASE XC; CREATE CELL GOSUB MC IPR(C0)=IAA CASE XD; DESTROY CELL GOSUB MD IPR(C0)=IAA CASE XI; INITIALIZE CC=RI(C2) GOSUB ZN IF AA MK=CC-X0 ELSE MK=+002 ENDIF GOSUB MI DEFAULT MS 'ILLEGAL M' MS 'EM OPN>>>' GOSUB CR ENDCHOOSE CASE XJ; JUMP UNCONDITIONAL - LABEL MUST BE NUMBER LOC 20 AA=RI(C1) BB=RI(C2) PACK(ILB,AA,BB) IPC=ILT(ILB) CASE XE; STOP HERE LOC 21 CLOSE F1 CLOSE F2 IAA=IMM; MAXIMUM MEMORY USED GOSUB PN; PRINT MAX MEMORY USAGE MS ' MAX MEM ' MS 'USAGE. ' GOSUB CR MS 'PROGRAMME' MS 'D TERMINA' MS 'TION ' GOSUB CR STOP 0 DEFAULT; LOOK FOR FETCH AND STORE INSTRUCTION LOC 22 QI=+000 GOSUB FT GOSUB FI GOSUB ST ENDCHOOSE GOTO 00 LOC 99 FL=+000 GOTO 00 ENDMAIN SUB CK; CHECK OPENED AA=ER!=C0 IF AA MS 'CANT OPEN' IAA=IBK GOSUB PN GOSUB CR STOP 1 ENDIF ENDSUB SUB CR; CR/LF SUBROUTINE WRITE EL WRITE NL ENDSUB SUB DS; DIGIT STACK AA=IAA' CU='=' CL='<' CT=+KHT;HORIZONTAL TAB CE='/' CD='.' CQ=+KQM;QUOTE MARK IBK=+00003;FILE 3 ASSOCIATE FCB 3 WITH IBK; ***CP/M DEPENDENT*** OPEN F2 FOR XW AT IBK; OPEN OUTPUT FILE GOSUB MI; INITIALIZE MEMORY ENDSUB; IN SUB LA; L IS FOR LEX, A IS FOR AHEAD AA=PL==MN;MAX FOR NS IF AA PL=+000 ELSE PL++ ENDIF ENDSUB; LA SUB LB; MOVE UP THE BASE WHILE AA=PL!=PM ON AA GOSUB KG;READ CC FROM F1 AA=ER!=C0 IF AA CC=+000 ENDIF NS(PM)=CC AA=PM==MN IF AA PM=+000 ELSE PM++ ENDIF ENDWHILE ENDSUB; LB SUB LI; INITIALIZE LEX PM=+000 PL=+000 BB=+000 WHILE AA=BB<=MN CC=ER==C0 AA=AA&CC ON AA GOSUB KG;READ CC FROM F1; - SPECIAL READ FOR CP/M NS(BB)=CC BB++ ENDWHILE ENDSUB; LI SUB LW; TEST AND DISCARD WHITE SPACE CC=NS(PL) WHILE AA=CC==NL IF AA ILN++ ISM=+00000 ENDIF BB=CC==CB AA=AA?BB BB=CC==CT AA=AA?BB BB=CC==EL AA=BB?AA ON AA GOSUB LA CC=NS(PL) ENDWHILE GOSUB LB ENDSUB; LW SUB MC; CREATE CELL AT THTE TOP IAA=MK IMT=IMT-IAA GOSUB MO;CHECK FOR OVERFLOW IAA=IMT;POINT TO CELL GOSUB MZ;ZERO IT ENDSUB; MC SUB MD; DESTROY CELL IAA=MK IMT=IMT+IAA;RAISE TOP BY CELL SIZE AA=IMD" GREATER - SET FLAGS ACCORDINGLY IAA=IYS(YP) AA=IAA