
// Header file for the M68000 code-generator  December 1980

// Author:  M. Richards

// The Code Generator is based on the one written for the
// IBM Series/1 by M. Richards, which was based on the one
// for the PDP-11 at Cambridge.

//  3 Nov 1981:  Modified by MR to run under MC68000 TRIPOS
//  8 Dec 1982:  Modified by TJK for floating point operations
// 15 Sep 1983:  Modified by NHG to run with BCP compiler (globals moved)
// 28 Jan 1986:  Modified by PJF to allow refs to EXTERNALS
// 31 Mar 1986:  Modified by PJF to allow word operations (%% operator)

// (C) Copyright 1979 Tripos Research Group
//     University of Cambridge
//     Computer Laboratory
// (C) Copyright 1985 All Rights Reserved METACOMCO plc
//     26 Portland Square
//     Bristol


GET "LIBHDR"
GET "BCPHDR"


MANIFEST
$(
//  Relocatable Object Hunks

    t.hunk                     = 1000
    t.reloc                    = 1001
    t.end                      = 1002

    secword                    = 12345
    max.sect.size              = 32767
$)



GLOBAL
$(
//  Private Global Routines

    addtoword                  : cg + 0
    bswitch                    : cg + 1
    bug                        : cg + 2
    switchspace                : cg + 3
    cgapply                    : cg + 4
    cgbyteap                   : cg + 5
    cgcmp                      : cg + 6
    cgcondjump                 : cg + 7
    cgitemn                    : cg + 8
    cgdyadic                   : cg + 9
    cgentry                    : cg + 10
    cgerror                    : cg + 11
    cgglobal                   : cg + 12
    cgmove                     : cg + 13
    cgname                     : cg + 14
    cgpendingop                : cg + 15
    cgreturn                   : cg + 16
    cgrv                       : cg + 17
    cgsave                     : cg + 18
    cgsects                    : cg + 19
    cgstatics                  : cg + 20
    cgstind                    : cg + 21
    cgstring                   : cg + 22
    cgswitch                   : cg + 23
    checkparam                 : cg + 24
    checkspace                 : cg + 25
    choosereg                  : cg + 26
    class                      : cg + 27
    cnop                       : cg + 28
    code                       : cg + 29
    code2                      : cg + 30
    condbfn                    : cg + 31
    dboutput                   : cg + 32
    exta                       : cg + 33
    extd                       : cg + 34
    forgetall                  : cg + 35
    forgetr                    : cg + 36
    forgetvar                  : cg + 37
    forgetvars                 : cg + 38
    formea                     : cg + 39
    freeblk                    : cg + 40
    freereg                    : cg + 41
    gen                        : cg + 42
    genb                       : cg + 43
    genea                      : cg + 44
    geneaea                    : cg + 45
    genqea                     : cg + 46
    genmoveq                   : cg + 47
    genrand                    : cg + 48
    genrea                     : cg + 49
    genr                       : cg + 50
    genrr                      : cg + 51
    genshkr                    : cg + 52
    genwea                     : cg + 53
    genwr                      : cg + 54
    getblk                     : cg + 55
    inforegs                   : cg + 56
    initdatalists              : cg + 57
    initftables                : cg + 58
    initslave                  : cg + 59
    initstack                  : cg + 60
    inregs                     : cg + 61
    insertcount                : cg + 62
    isfree                     : cg + 63
    isinslave                  : cg + 64
    loadt                      : cg + 65
    lose1                      : cg + 66
    lswitch                    : cg + 67
    match                      : cg + 68
    moveinfo                   : cg + 69
    movetoa                    : cg + 70
    movetoanycr                : cg + 71
    movetoanyr                 : cg + 72
    movetoanyrsh               : cg + 73
    movektol                   : cg + 74
    movetor                    : cg + 75
    nextparam                  : cg + 76
    objword                    : cg + 77
    outputsection              : cg + 78
    procbase                   : cg + 79
    rdgn                       : cg + 80
    rdl                        : cg + 81
    setword                    : cg + 82   // used for fixing branches
    regscontaining             : cg + 83
    regsinuse                  : cg + 84
    regswithinfo               : cg + 85
    regusedby                  : cg + 86
    remem                      : cg + 87
    compbfn                    : cg + 88
    scan                       : cg + 89
    setlab                     : cg + 90
    stack                      : cg + 91
    store                      : cg + 92
    storein                    : cg + 93
    storet                     : cg + 94
    swapargs                   : cg + 95
    try                        : cg + 96
    wrkn                       : cg + 97
    cgfloatdyadic              : cg + 98


    // GLOBAL Variables

    ea.m                       : cg + 99
    ea.d                       : cg + 100
    arg1                       : cg + 101
    arg1cl                     : cg + 102
    arg2                       : cg + 103
    arg2cl                     : cg + 104
    casek                      : cg + 105
    casel                      : cg + 106
    countflag                  : cg + 107
    datalabel                  : cg + 108
    debug                      : cg + 109
    nlist                      : cg + 110
    nliste                     : cg + 111
    dp                         : cg + 112
    fns.add                    : cg + 113
    fns.and                    : cg + 114
    fns.cmp                    : cg + 115
    fns.eor                    : cg + 116
    fns.or                     : cg + 117
    fns.sub                    : cg + 118
    fntab                      : cg + 119
    freelist                   : cg + 120
    incode                     : cg + 121
    labv                       : cg + 122
    listing                    : cg + 123
    llist                      : cg + 124
    maxgn                      : cg + 125
    maxlab                     : cg + 126
    maxssp                     : cg + 127
    needslist                  : cg + 128
    needsliste                 : cg + 129
    numbinl                    : cg + 130
    op                         : cg + 131
    paramnumber                : cg + 132
    pendingop                  : cg + 133
    procstk                    : cg + 134
    procstkp                   : cg + 135
    progsize                   : cg + 136
    rlist                      : cg + 137
    slave                      : cg + 138
    ssp                        : cg + 139
    stv                        : cg + 140
    stvp                       : cg + 141
    tempt                      : cg + 142
    tempv                      : cg + 143
    traceloc                   : cg + 144
    debugout                   : cg + 145
    lastlab                    : cg + 146
    lastlabpos                 : cg + 147
    totalcodesize              : cg + 148
    globxrefs                  : cg + 149
    addglobexternalref         : cg + 150
    fileposition               : cg + 151
    globxrefstail              : cg + 152
    location                   : cg + 153
    sectionnumber              : cg + 154
    globxrefnumber             : cg + 155
    sectionoffset              : cg + 156
    globxdefs                  : cg + 157
    globxdefstail              : cg + 158
    tempfile                   : cg + 159
    collapse                   : cg + 160
    genfpcall                  : cg + 161
    idlist                     : cg + 162
    writeword                  : cg + 163
    mypoint                    : cg + 164
    gsthunk                    : cg + 165
    toshunk                    : cg + 166
    symbols                    : cg + 167
    symbolstail                : cg + 168
$<EXT
    extrnsymbols               : cg + 169
    xrefs                      : cg + 170
$>EXT
$<WORD
    cgwordap                   : cg + 171
$>WORD
$)



MANIFEST
$(
    swapped                    = TRUE
    notswapped                 = FALSE


    //  DATA Registers

    r0                         = 0
    r1                         = 1
    r2                         = 2
    r3                         = 3
    r4                         = 4
    r5                         = 5
    r6                         = 6
    r7                         = 7


    //  ADDRESS Registers

    rz                         = 0
    rp                         = 1
    rg                         = 2
    rl                         = 3
    rb                         = 4
    rs                         = 5
    rr                         = 6
    rsp                        = 7


    //  CLASS Bits:
    //
    //         z   q   b       w  am  cr   r  r7  r6  r5  r4  r3  r2  r1  r0
    //         0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15

    c.r                        = #X0100    // Item is a register
    c.cr                       = #X0200    // Value is in a register or slaved
    c.m                        = #X0400    // Alterable memory location
    c.w                        = #X0800    // Long constant
    c.b                       = #X2000    // Byte constant
    c.q                        = #X4000    // Quick constant
    c.z                        = #X8000    // Zero constant

    c.regs                     = #X00FF


    //  Items in Simulated Stack or Registers

    k.sh                       = #10
    k.lv                       = #20


    k.loc                      = #01
    k.locsh                    = k.loc + k.sh
    k.lvloc                    = k.loc + k.lv
    k.lvlocsh                  = k.loc + k.sh + k.lv

    k.glob                     = #02
    k.globsh                   = k.glob + k.sh
    k.lvglob                   = k.glob + k.lv
    k.lvglobsh                 = k.glob + k.sh + k.lv

    k.lab                      = #03
    k.labsh                    = k.lab + k.sh
    k.lvlab                    = k.lab + k.lv
    k.lvlabsh                  = k.lab + k.sh + k.lv

$<EXT
    k.ext                      = #04
    k.lvext                    = k.ext + k.lv
$>EXT

    k.notsh                    = #77 - k.sh

    k.numb                     = #40
    k.reg                      = #50

    k.ir0                      = #60
    k.ir1                      = #61
    k.ir2                      = #62
    k.ir3                      = #63
    k.ir4                      = #64
    k.ir5                      = #65
    k.ir6                      = #66
    k.ir7                      = #67


    //  GLOBAL routine numbers

    gn.stop                    = 2
    gn.mul                     = 3    // Temporary fix
    gn.div                     = 4    // Temporary fix
    gn.rem                     = 5    // Temporary fix


    //  Machine Code Subroutine Entry Points

    sr.mul                     = #X10
    sr.div                     = #X12
    sr.stkchk                  = #X16
    sr.profile                 = #X18



    //  M68000 Addressing Modes

    m.w                        = #100    //  Abs word extension bit
    m.ww                       = #200    //  Abs long extension bit
    m.l                        = #400    //  Base rel extension bit

    m.00                       =  #00    //  R0 register direct
    m.10                       =  #10    //  A0 register direct
    m.1l                       =  #13    //  L  register direct
    m.20                       =  #20    //  (A0)
    m.2p                       =  #21    //  P register indirect
    m.2g                       =  #22    //  G register indirect
    m.2l                       =  #23    //  (L)
    m.2s                       =  #25    //  (S) for save routine
    m.2r                       =  #26    //  (R) for return routine
    m.50                       = #150    //  w(A0)
    m.5p                       = #151    //  w(P)  local variables
    m.5g                       = #152    //  w(G)  global variables
    m.5b                       = #454    //  w(B)  static variables
    m.5s                       = #155    //  w(S)  for system subroutines
    m.6z                       = #160    //  b(Z,Ri)  for BCPL indirection
    m.6p                       = #161    //  b(P,Ri)  out of range locals
    m.6g                       = #162    //  b(G,Ti)  out of range globals
    m.6l                       = #163    //  b(L,Ri)  out of indirect ref
    m.6b                       = #164    //  b(B,Ri)  ????????????
    m.73                       = #173    //  b(PC,Ri) used in label switch
    m.74                       = #374    //  #w  Long immediate data
$<EXT
    m.71                       = #371    //  Abs.L for XREFs
    m.4sp                      =  #47    //  -(SP) to stack args
$>EXT


    //  Function Table Entries

    ft.qr                      = 0       //  #q,Dn
    ft.qm                      = 1       //  #q,ea
    ft.rr                      = 2       //  Dn,Dm
    ft.rm                      = 3       //  Dn,ea
    ft.ir                      = 4       //  #w,Dn
    ft.im                      = 5       //  #w,ea
    ft.mr                      = 6       //  ea,Dn
    ft.zr                      = 7       //  #0,Dn
    ft.zm                      = 8       //  #0,ea
$)




MANIFEST
$(
    //  Instructions compiled by  "geneaea( f, ms, ds, md, dd )"

    f.moveb                    = #X1000  //  MOVE.B    ea,ea
    f.movew                    = #X3000  //  MOVE      ea,ea
    f.movel                    = #X2000  //  MOVE.L    ea,ea


    //  Instruction compiled by  "genmoveq( r, b )"

    f.moveq                    = #X7000  //  MOVEQ     #q,ea


    //  Instructions compiled by  "genwea( f, w, m, d )"

    f.addq                     = #X5080  //  ADDQ.L    #q,ea
    f.subq                     = #X5180  //  SUBQ.L    #q,ea


    //  Instruction compiled by  "genqea( f, q, m, d )"
    //  (Doesn't appear to have any entries!)


    //  Instructions compiled by  "genrea( f, r, m, d )"

    f.eor                      = #XB180  //  EOR       Dn,ea
    f.lea                      = #X41C0  //  LEA       ea,An


    //  Shift Instructions

    f.lslkr                    = #XE188  //  LSL.L     #q,Dn
    f.lsrkr                    = #XE088  //  LSR.L     #q,Dn
    f.lslrr                    = #XE1A8  //  LSL.L     Dn,Dm
    f.lsrrr                    = #XE0A8  //  LSR.L     Dn,Dm


    //  Instructions compiled by  "genea( f, m, d )"

    f.clr                      = #X4280  //  CLR.L     ea
    f.jmp                      = #X4EC0  //  JMP       ea
    f.jsr                      = #X4E80  //  JSR       ea
    f.neg                      = #X4480  //  NEG.L     ea
    f.not                      = #X4680  //  NOT.L     ea


    //  Instruction compiled by  "gen( f )"

    f.nop                      = #X4E71  //  NOP

    // Floating point simulation instructions

    f.fadd                     = #XF000
    f.fsub                     = #XF001
    f.fmul                     = #XF002
    f.fdiv                     = #XF003
    f.fneg                     = #XF004
    f.fcmp                     = #XF005
    f.ftst                     = #XF006

    //  Instructions compiled by  "genb( f, l )"

    f.bra                      = #X6000  //  BRA       Ln
    f.beq                      = #X6700  //  BEQ       Ln
    f.bne                      = #X6600  //  BNE       Ln
    f.blt                      = #X6D00  //  BLT       Ln
    f.bge                      = #X6C00  //  BGE       Ln
    f.ble                      = #X6F00  //  BLE       Ln
    f.bgt                      = #X6E00  //  BGT       Ln
    f.blle                     = #X6300  //  BLS       Ln
    f.blgr                     = #X6200  //  BHI       Ln
    f.blls                     = #X6500  //  BCS       Ln
    f.blge                     = #X6400  //  BCC       Ln
$)

$<EXT
MANIFEST
$( e.link     = 0
   e.refs     = 1
   e.refstail = 2
   e.id       = 2  // Same cell used later
   e.name     = 3

   er.link    = 0
   er.loc     = 1
   er.id      = 2
   er.size    = 2
$)
$>EXT

MANIFEST
$( xref.link     = 0
   xref.location = 1
   xref.globno   = 2

   sym.link      = 0
   sym.val       = 1
   sym.name      = 2
$)

$<AMIGA'
$<RELEASE'
$<IMPERIAL'
MANIFEST
$( gst.escape  = #XFB
   gst.source  = #X01
   gst.comment = #X02
   gst.org     = #X03
   gst.section = #X04
   gst.offset  = #X05
   gst.xdef    = #X06
   gst.xref    = #X07
   gst.define  = #X10
   gst.common  = #X12
   gst.end     = #X13

   gst.trunc.byte     = #B00000001  // Result of truncation to go in a byte
   gst.trunc.word     = #B00000010  //     ditto but with short word
   gst.trunc.long     = #B00000100  //     ditto but with long word
   gst.trunc.signed   = #B00001000  // Number is signed
   gst.trunc.unsigned = #B00010000  // Number is unsigned
   gst.trunc.pcrel    = #B00100000  // Ref is PC relative
   gst.trunc.lwrtrel  = #B01000000  // Runtime relocation (lword only)

   gst.op.plus   = #X2B
   gst.op.minus  = #X2D
$)
$>IMPERIAL'
$>RELEASE'
$>AMIGA'

