/* THIS IS THE HEADER FOR THE NATIVE VERSION OF THE
    CODE GENERATOR
 */

GET "BCPL"

GLOBAL $(
PROFILING:164
PROGSIZE:193;       OP:194;             TEMPV:195
TEMPT:196;          BREFV:197;          BREFP:198
PROCSTK:199;        PROCSTKP:200;       REG.K:201
REG.N:202;          LABV:203;           DP:204
PARAMNUMBER:205;    STV:206;            STVP:207
INITDATALISTS:208;  CGERROR:209;        RDN:210
RDL:211;            INCODE:212;         RETURN.SET:213
MAXGN:214;          MAXLAB:215;         MAXSSP:216
INITSTACK:217;      CODE:218;           CGNAME:219
SCAN:220;           EVEN:221;           OUTPUTSECTION:222
CHECKPARAM:223;     RDGN:224;           NEXTPARAM:225
                    ARG1:227;           ARG2:228
PENDINGOP:229;      SSP:230;            STACK:231
STORE:232;          STORET:233;         LOADT:244
CGSTRING:245;       CGSTIND:246;        CGRV:247
CGPENDINGOP:248;    REGSET:249;         GENBRANCH:250
CGJUMP:251;         GETVALUE:252;       GENJ:253
CGLAB:254;          CGENTRY:255;        CGSAVE:256
CODEB:257;          CGAPPLY:258;        CGRETURN:259
PWABO:260;          MOVETOR:261;        CGGLOBCALL:262
CGSWITCH:263;       CGBYTEAP:264;       CGGLOBAL:265
CGDATA:266;                             MOVETOANYR:268
GENRS:269;          CHECKBREFS:270;     GEND:271
GENRD:272;          GENKD:273;          LOOKINFREEREGS:274
CONDBRFN:275;       NEXTRSET:276;       CGCMP:277
LOSE1:278;          CGPLUS:279;         CGMINUS:280
NUMBERIS:281;       GENSHIFT:282;       FREEREG:283
GENMULDIV:284;      GENF:285;           CGLOGORANDNEQV:286
INSET:287;          CGSHIFTK:288;       GENMOV:289
FORGETALL:290;      MOVETOINDEXR:291;   MOVETOINDEXRSH:292
LOOKINREGS:293;     SETR:294;           SETINFO:295
ISFREE:296;         NEXTR:297;          REGUSEDBY:298
NEXTRFORCESET:299;  CONSB2:300;         FORGETVARS:301
STOREIN:302;        GENBYTEXCHG:303;    GENCLEARBYTE:304
CGADDK:305;         GENINCDEC:306;      CGDIADWITHR:307
CGSTATICS:308;      GENBREFJUMPS:309;   SETLAB:310
INDCODE:311;        TRANR:312;          CASEK:313
CASEL:314;          BRLABREF:315;       ADDR.M:316
ADDR.V:317;         CODEKD:318;         CODERD:319
CODERS:320;         CODED:321;          REMEM:322
FORGET:323;         FORMSADDR:324;      FORMDADDR:325
CODEDISP:326;       FORMADDR:327;       CHECKSPACE:328
SMALLNUM:329;                           LABREF:331
REFLISTE:332;       DLISTE:333;         REFLIST:334
DLIST:335;          ADDABO:336;
OBJWORD:338
                    ISEVEN:342;         GETVBYTE:343
                    PUTVBYTE:345;       INSERTCOUNT:346
GENINT:347
DSIZE:349
       $)

MANIFEST $(
 // BITS OF OPCODES
 // JUMPS
F.JGE = #B01111101
F.JG  = #B01111111
F.JLE = #B01111110
F.JL  = #B01111100
F.JE  = #B01110100
F.JNE = #B01110101
F.JMP = #B11101011
F.B   = F.JMP
F.JI  = #B100    // INDIRECT JUMP
F.JIS = #B101    //    "      "   INTERSEGMENT
F.CALLI = #B010  // INDIRECT CALL
F.CIS   = #B011  //    "      "   INTERSEGMENT
 // MONADIC OPERATORS REPRESENTED BY 11 BIT QUANTITIES
F.NEG = #B11110111011
F.NOT = #B11110111010
 // SHIFT OPERATORS REP. BY 11 BIT QUANTITIES
F.SHL = #B11010001100
F.SHR = #B11010001101
F.SAR = #B11010001111
 // NOP I.E. XCHG AX,AX
F.NOP = #B10010000
 // MOVES
F.MOVIMMTRM = #B11000111
F.MOVRTRM = #B10001001
F.MOVIMMTR = #B10111000
F.LEA = #B10001101
 // CONVERT WORD IN AX TO DOUBLEWORD IN AX AND DX FOR DIVISION
F.CWD = #B10011001
 // MULTIPLY AND DIVIDE
F.IMUL = #B101
F.IDIV = #B111
 // DIADICS
F.XOR = #B110
F.OR  = #B001
F.AND = #B100
F.ADD = #B000
F.SUB = #B101
F.CMP = #B111
 //
F.INC = #B000
F.DEC = #B001
 // BYTE OPERATIONS
F.XCHGB = #B10000110
F.CLRB  = #B00110000   // THIS IS XOR REG,REG
 // SOFTWARE INTERRUPT WITH TYPE GIVEN
F.INT   = #B11001101
 //
 // REGISTERS
R0 = 0; R1 = 1; R2 = 2; R3 = 3; R4 = 4; R5 = 5; R6 = 6; R7 = 7
R.BX = R0
R.AX = R1
R.CX = R2
R.DX = R3
R.SI = R4
R.BP = R5
R.SP = R6
R.DI = R7
 // SETS
V.XX  = #B11111111
V.R0  = #B00000001
V.R1  = #B00000010
V.RI  = #B00010001
V.AX  = #B00000010
V.R80 = #B00001111
V.XMULDIV = #B00010101
 //
 // TYPES
K.LAB = 3
K.NUMB = 4
K.LVLOC = 5
K.LVGLOB = 6
K.LVLAB = 7
K.REG = 8
K.MLOC = 9
K.MLAB = 10
K.MGLOB = 11
K.NONE = 12
K.ROFF = 14
K.LOC = R.BP + K.ROFF
K.GLOB = R.DI + K.ROFF
K.XBX = R.BX + K.ROFF
K.XSI = R.SI + K.ROFF
 // M/C TYPES
M.LOC  = #B110
M.GLOB = #B101
M.BX   = #B111
M.SI   = #B100
M.BP   = #B110
M.DI   = #B101
M.LAB  = 1
M.REG  = 2
M.IMM  = 3
 // GLOBALS USED
GN.STOP       = 2
GN.IPDUMP     = 8
 //
 // INTERRUPT TYPES
I.STKCHECK    = 33
 //
 // OBJECT MODULE TYPES
T.HUNK   = 1000
T.END    = 1002
T.RELOCB = 1005
 //
SECWORD = 12345
 //
// AE TREE AND OCODE OPERATORS
S.TRUE=4; S.FALSE=5
S.RV=8; S.FNAP=10
S.MULT=11; S.DIV=12; S.REM=13; S.PLUS=14
S.MINUS=15; S.QUERY=16; S.NEG=17; S.ABS=19
S.EQ=20; S.NE=21; S.LS=22; S.GR=23; S.LE=24; S.GE=25
S.NOT=30; S.LSHIFT=31; S.RSHIFT=32; S.LOGAND=33
S.LOGOR=34; S.EQV=35; S.NEQV=36
S.NEEDS=48; S.SECTION=49
S.RTAP=51; S.GOTO=52
S.RETURN=67; S.FINISH=68
S.SWITCHON=70; S.GLOBAL=76

// OCODE OPERATORS
S.LP=40; S.LG=41; S.LN=42; S.LSTR=43; S.LL=44
S.LLP=45; S.LLG=46; S.LLL=47
S.LOCAL=77; S.LABEL=78
S.SP=80; S.SG=81; S.SL=82; S.STIND=83
S.JUMP=85; S.JT=86; S.JF=87; S.ENDFOR=88
S.LAB=90; S.STACK=91; S.STORE=92; S.RSTACK=93
S.ENTRY=94; S.SAVE=95; S.FNRN=96; S.RTRN=97
S.RES=98; S.DATALAB=100; S.ITEML=101; S.ITEMN=102
S.ENDPROC=103; S.GETBYTE=120; S.PUTBYTE=121

S.DEBUG=109; S.NONE=111
 //
 // SELECTORS
H1 = 0; H2 = 1; H3 = 2; H4 = 3; H5 = 4; H6 = 5
         $)