;;CHIDENT

; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ;
;   The CheckIdents and Procs part                              ;
; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ;


CHECKIDENTS:
    MOVE.W  #4,CURSPOT
    MOVE.L  #IDENTHASH+4,A5
.1A:    MOVE.L  A5,A4
    ADDQ.L  #4,A5
    CMP.L   #IDENTHASH+1028,A5
    BEQ.W   .2
.1: MOVE.L  -(A4),A4
    MOVE.L  A4,D0
    BEQ.S   .1A
    BTST    #0,5(A4)        ; SEE IF UNREFERENCED
    BEQ .UNREF
.UNRB:  MOVE.B  4(A4),D0
    TST.B   D0
    BEQ.S   .1          ; WAS .4
    CMP.B   #GLOBV,D0
    BEQ.W   .3
    CMP.B   #LOCV,D0
    BNE .5
    MOVEQ   #1,D0           ; -->LOC
    MOVE.L  D0,(A4)         ; PTR TO CHAR
    MOVE.L  6(A4),A3
    TST.W   10(A4)          ; AN ARG OR REGVAR
    BNE.S   .1

    ; no test for regalloc here.

;bra.s .pp
;.ppp: dc.l $1e0000
;.pp:
;move.l .ppp,a0
;move.l 12(a4),(a0)+
;move.l a0,.ppp

    MOVE.L  VARHEAVY(A4),D0     ; if 0 then cannot be regvar
    BEQ.W   .NR
    btst    #4,2(a3)
    bne     .NR

    MOVE.W  MAXREGALLOC(PC),D0
    CMP.B   3(A3),D0
    BLE.S   .RCALC

    BSET    #3,5(A4)        ; MAKE IT A REGVAR!
    ADDQ.B  #1,3(A3)
    MOVE.B  3(A3),D7
    EXT.W   D7
    NEG.W   D7
    ADDQ.W  #8,D7
    MOVE.W  D7,10(A4)       ; register nš
    MOVE.L  26(A3),D7
    BTST    #3,2(A3)
    BNE.S   .GOTT
    GETM    A0
    MOVE.L  A0,D7
    MOVE.L  A0,26(A3)
    BSET    #3,2(A3)        ; HASTABLE
    MOVEQ   #MAXREGVARS,D0      ; ONE TOO MUCH: NIL TERM
.ATL:   CLR.L   (A0)+
    DBRA    D0,.ATL
    DONEM   A0
.GOTT:  MOVE.L  D7,A0
.PL:    TST.L   (A0)+
    BNE.S   .PL
    MOVE.L  A4,-(A0)        ; ONE OF THE REGVARS
    BRA.W   .1

.RCALC: BTST    #3,2(A3)
    BEQ.S   .NR
    MOVE.L  26(A3),A0       ; A0=NOW FIND SMALLEST
    MOVE.L  #$7FFFFFFF,D1       ; D1=SMALLEST HEAVYNESS
    MOVEQ   #0,D2
.RCS:   MOVE.L  (A0)+,D0
    BEQ.S   .RCSO
    MOVE.L  D0,A1
    CMP.L   VARHEAVY(A1),D1
    BMI.S   .RCS
    MOVE.L  VARHEAVY(A1),D1
    MOVE.L  A1,D2           ; D2=BLACK SHEEP
    MOVE.L  A0,A2           ; A2=PLUG BACK
    BRA.S   .RCS
.RCSO:  TST.L   D2
    BNE.S   .RCR
    INTERN  104
.RCR:   MOVE.L  D2,A0           ; A0=OTHER IDENT
    MOVE.L  VARHEAVY(A0),D0
    CMP.L   VARHEAVY(A4),D0
    BPL.S   .NR
    MOVE.L  A4,-(A2)
    MOVE.W  10(A0),10(A4)
    BSET    #3,5(A4)
    BCLR    #3,5(A0)
    MOVE.W  4(A3),D0        ; MAKE IT A NEW LOCOFFSET
    SUBQ.W  #4,D0
    MOVE.W  D0,10(A0)
    MOVE.W  D0,4(A3)
    BRA .1

.NR:    MOVE.W  4(A3),D0        ; MAKE IT A NEW LOCOFFSET
    SUBQ.W  #4,D0
    MOVE.W  D0,10(A4)
    MOVE.W  D0,4(A3)
    BRA.W   .1

.2: TST.W   .UR         ; EXIT. BSR FROM OTHER POINTS
    BNE .WL
    RTS
.WL:    MOVEQ   #1,D3
    MOVE.L  #.WL2,D2
    BSR WRITECON
    RTS
.WL2:   DC.B    10,0

.3: GINFO   (A4),A3,A4
    MOVEQ   #1,D0           ; SET FLAGS=PTR TO CHAR
    MOVE.L  D0,(A4)         ; now - check for special structures;


    
    CMPA.L  PSEUDOA4-40,A4
    BNE     .NOTEXEC
    TST.L   OBJ_EXECBASE
    BEQ     .NOTEXEC
    MOVE.L  OBJ_EXECBASE(PC),(A4)
.NOTEXEC:
    CMPA.L  PSEUDOA4-48,A4
    BNE     .NOTINTUI
    TST.L   OBJ_INTUIBASE
    BEQ     .NOTINTUI
    MOVE.L  OBJ_INTUIBASE(PC),(A4)
.NOTINTUI:
    CMPA.L  PSEUDOA4-52,A4
    BNE     .NOTGFX
    TST.L   OBJ_GFXBASE
    BEQ     .NOTGFX
    MOVE.L  OBJ_GFXBASE(PC),(A4)
.NOTGFX:
    CMPA.L  PSEUDOA4-44,A4
    BNE     .NOTDOS
    TST.L   OBJ_DOSBASE
    BEQ     .NOTDOS
    MOVE.L  OBJ_DOSBASE(PC),(A4)
.NOTDOS:
    CMPA.L  PSEUDOA4-16,A4
    BNE     .NOTRST
    TST.L   OBJ_RASTPORT
    BEQ     .NOTRST
    MOVE.L  OBJ_RASTPORT(PC),(A4)
.NOTRST:
    CMPA.L  PSEUDOA4-36,A4
    BNE     .NOTWBM
    TST.L   OBJ_WBMESSAGE
    BEQ     .NOTWBM
    MOVE.L  OBJ_WBMESSAGE(PC),(A4)
.NOTWBM:
    TST.W   10(A4)
    BNE .1
    SUBQ.W  #4,NRGLOB       ; -->GLOB
    MOVE.W  NRGLOB(PC),10(A4)
    BRA .1

.5: CMP.W   #-4,10(A4)
    BEQ .1
    CMP.W   #-3,10(A4)
    BEQ .1
    CMP.W   #-2,10(A4)      ; -->LAB
    BEQ.S   .6
    CMP.W   #-1,10(A4)
    BNE.S   .ERL
    CLR.L   6(A4)
.6: MOVE.L  (A4),A1         ; CHECK FOR "MAIN"
    CMP.B   #"m",(A1)
    BNE.S   .NM
    CMP.B   #"a",1(A1)
    BNE.S   .NM
    CMP.B   #"i",2(A1)
    BNE.S   .NM
    CMP.B   #"n",3(A1)
    BNE.S   .NM
    CMP.B   #0,4(A1)
    BNE.S   .NM
    MOVE.W  #1,10(A4)       ; SET LAB MAIN
    MOVE.L  6(A4),A1
    TST.W   (A1)            ; MAIN --> NO ARGS
    BNE iERROR23
    BRA .1
.NM:    MOVE.W  CURLABNAME+2(PC),10(A4)
    ADDQ.L  #1,CURLABNAME
    BSR CHECKLABBUF
    BRA .1
.ERL:   BSR .2
    BRA iERROR14

.UNREF: BTST    #1,5(A4)
    BNE .UNRB
    TST.W   .UR
    BNE.S   .12
    MOVE.L  #.13,D2
    MOVE.L  #.14,D3
    SUB.L   D2,D3
    BSR WRITECON
    BRA.S   .16
.12:    MOVEQ   #1,D3
    MOVE.L  #.14,D2
    BSR WRITECON
.16:    MOVE.L  (A4),A0
.15:    TST.B   (A0)+
    BNE.S   .15
    SUB.L   (A4),A0
    SUBQ.L  #1,A0
    MOVE.L  A0,D3
    MOVE.L  (A4),D2
    BSR WRITECON
    MOVE.W  #-1,.UR
    BRA .UNRB
.13:    DC.B    "UNREFERENCED: "
.14:    DC.B    ","
    EVEN
.UR:    DC.W    0           ; MESSY DONE?

NRGLOB:
    DC.W    GLOBOFF         ; HASTABE initialized

CHECKLABBUF:
    SUBQ.W  #1,.1
    BEQ.S   .2
    RTS
.2: MOVE.L  D0,-(A7)
    MOVE.W  #25,.1
    MOVE.L  CURLABNAME(PC),D0
    LSL.L   #2,D0
    ADD.L   LABM+8(PC),D0
    MOVE.L  D0,LABM
    BSR REALLOC6
    MOVE.L  (A7)+,D0
    RTS
.1: DC.W    10
;*-*

