;;VAR

NUMBUFS = 4
BUFADD:     DC.L    MINIMUM_ACODE

FIXED       = 0
REALLOCATABLE   = 1
EXPANDABLE  = 2


BTAB:   DC.L    CURINTERIM,.1,REALLOCATABLE
    DC.L    CURACODE,.3,FIXED
    DC.L    HEAP,.5,EXPANDABLE
    DC.L    LABM,.6,REALLOCATABLE
.1: DC.B    "intermediate code",0
.3: DC.B    "libraries/generated code",0
.5: DC.B    "general/identifier",0
.6: DC.B    "label",0
    EVEN

DEBUGDATA:
    DC.L    OLIST
    DC.L    PROCLIST
    DC.L    IDENTHASH
DBUGV:
    DC.L    0
DBUGA:
    DC.L    0
    DC.L    MODINFOLIST
    DC.L    CODELIST
    DC.L    MEMLIST
    DC.L    HEAP
    DC.L    MACROHASH

INITBUFFERS:
    MOVE.W  #1,CURSPOT
    MOVE.L  EBUFSIZE,D0
    LSR.L   #1,D0           ; *1.5+50k
    ADD.L   EBUFSIZE,D0
    ADD.L   BUFADD(PC),D0
    MOVE.L  D0,CURACODE+20
    BSR REALLOC1
    BSR ALLOC3
    BSR ALLOC5
    BSR REALLOC6
    MOVE.L  HEAP+20,GENERALSIZE
    RTS

REALLOC1:
    MOVEM.L D6/A5,-(A7)
    LEA CURINTERIM,A5
    BSR REALLOC
    MOVEM.L (A7)+,D6/A5
    RTS

ALLOC3:
    MOVEM.L D6/A5,-(A7)
    LEA CURACODE,A5
    BSR REALLOC
    MOVEM.L (A7)+,D6/A5
    RTS

CHECK3:
    MOVEM.L D6/A5,-(A7)
    LEA CURACODE,A5
    BSR CHECK
    MOVEM.L (A7)+,D6/A5
    RTS

ALLOC5:
    MOVEM.L D6/A5,-(A7)
    LEA HEAP,A5
    BSR REALLOC
    MOVEM.L (A7)+,D6/A5
    RTS

EXPAND5:
    MOVEM.L D6/A5,-(A7)
    LEA HEAP,A5
    BSR EXPANDBUF
    MOVEM.L (A7)+,D6/A5
    RTS

REALLOC6:
    MOVEM.L D6/A5,-(A7)
    LEA LABM,A5
    BSR REALLOC
    MOVEM.L (A7)+,D6/A5
    RTS

COOKIE  = $BE

NEW:
    MOVEM.L D1/D2/A0/A1/A6,-(A7)    ; SIZE-->D0-->ADDR
    ADDQ.L  #8,D0
    ADDQ.L  #1,D0
    MOVE.L  D0,D2
    MOVEQ   #0,D1
    MOVE.L  4.W,A6
    JSR -198(A6)
    TST.L   D0
    BEQ.S   .EXX
    MOVE.L  D0,A0
    ADDQ.L  #8,D0
    MOVE.B  #COOKIE,-1(A0,D2.L)
    MOVE.L  MEMLIST(PC),(A0)
    MOVE.L  D2,4(A0)
    MOVE.L  A0,MEMLIST
.EXX:   MOVEM.L (A7)+,D1/D2/A0/A1/A6
    RTS

MEMLIST:  DC.L    0

DISPOSE:              ; ADR-->D0
    MOVEM.L D0/D1/A0/A1/A2/A6,-(A7)
    TST.L   D0
    BEQ.S   .1
    SUBQ.L  #8,D0
    LEA MEMLIST(PC),A1
.XL:MOVE.L  (A1),D1
    BEQ.S   .1
    MOVE.L  A1,A2           ; ADR TO LINK BACK TO
    MOVE.L  D1,A1
    CMP.L   D1,D0
    BNE.S   .XL
    MOVE.L  4(A1),D0        ; MEMSIZE
    MOVE.L  (A1),(A2)       ; LINK BACK
    MOVE.L  4.W,A6
    JSR -210(A6)
.1: MOVEM.L (A7)+,D0/D1/A0/A1/A2/A6
    RTS


REALLOC:              ; CALLED FROM EVERYWHERE
    MOVE.L  8(A5),D6
    ADD.L   12(A5),D6
    SUB.L   16(A5),D6
    CMP.L   (A5),D6
    BMI.S   .1
    RTS
.1: MOVEM.L D0/D1/D7/A0/A1/A6,-(A7)
    MOVE.L  12(A5),D0
    ADD.L   20(A5),D0       ; NEW SIZE
    MOVE.L  D0,D6           ; D6=SIZE
    BSR NEW
    TST.L   D0
    BEQ.S   .ER
    MOVE.L  D0,D7           ; D7=ADR
    TST.L   12(A5)
    BEQ.S   .2          ; NO COPYING/FREEMEM
    MOVE.L  D7,A1
    MOVE.L  8(A5),A0
    MOVE.L  12(A5),D0
    MOVE.L  4.W,A6
    JSR -630(A6)        ; COPYMEMQUICK
    MOVE.L  8(A5),D0
    BSR DISPOSE
.2: TST.L   (A5)            ; NEW SETTINGS
    BNE.S   .3
    MOVE.L  D7,(A5)
    BRA.S   .4
.3: MOVE.L  (A5),D0
    SUB.L   8(A5),D0
    ADD.L   D7,D0
    MOVE.L  D0,(A5)
.4: MOVE.L  D7,8(A5)
    MOVE.L  D6,12(A5)
    MOVEM.L (A7)+,D0/D1/D7/A0/A1/A6
    RTS
.ER:    MOVEM.L (A7)+,D0/D1/D7/A0/A1/A6
    BRA iERROR38

CHECK:
    MOVE.L  8(A5),D6
    ADD.L   12(A5),D6
    SUB.L   16(A5),D6
    CMP.L   (A5),D6
    BMI iERROR37
    RTS

EXPANDBUF:
    MOVE.L  8(A5),D6
    ADD.L   12(A5),D6
    SUB.L   16(A5),D6
    CMP.L   (A5),D6
    BMI .1
    RTS
.1: MOVE.L  D0,-(A7)
    MOVE.L  20(A5),D0
    MOVE.L  D0,12(A5)
    ADD.L   D0,GENERALSIZE
    BSR NEW
    TST.L   D0
    BEQ iERROR38
    MOVE.L  D0,(A5)
    MOVE.L  D0,8(A5)
    MOVE.L  (A7)+,D0
    RTS

FREEBUFFERS:
    MOVE.L  4.W,A6
    MOVE.L  MEMLIST(PC),A2
.XL:MOVE.L  A2,D0
    BEQ.S   .X
    MOVE.L  A2,A1
    MOVE.L  4(A2),D0
    MOVE.L  (A2),A2
    JSR -210(A6)
    BRA.S   .XL
.X: CLR.L   MEMLIST
    RTS

CHECKCOOKIES:
    MOVE.L  4.W,A6
    MOVE.L  MEMLIST(PC),A2
.XL:MOVE.L  A2,D0
    BEQ.S   .X
    MOVE.L  A2,A1
    MOVE.L  4(A2),D0
    MOVE.L  (A2),A2
    CMPI.B  #COOKIE,-1(A1,D0.L)
    BEQ.S   .1
    ADDQ.W  #1,BUFSPOT
    CLR.L   MEMLIST         ; BECAUSE OF CORRUPTED POINTERS?
    BRA.S   .X
.1: BRA.S   .XL
.X: TST.W   BUFSPOT
    BEQ .x
    JMP DAMAGEDCOOKIES
.x: RTS

SWAPVALUES:
    JSR FIXOBJTYPES
    MOVE.L  ACODE,CURACODE
    BSR GETLINEBUF
    RTS

GETLINEBUF:
    BTST    #5,CODEPREFS+1
    BEQ.S   .1
    MOVEQ   #0,D0
    MOVE.W  MAXLINENUM(PC),D0
    LSL.L   #3,D0
    ADD.L   #1000,D0
    BSR NEW
    TST.L   D0
    BEQ iERROR38
    MOVE.L  D0,LINEBUF
    MOVE.L  D0,A0
    MOVE.L  #$3F1,(A0)+     ; HUNKID
    CLR.L   (A0)+           ; HUNKLEN, _LATER_.
    CLR.L   (A0)+           ; ADD2HUNK=0
    MOVE.L  #"LINE",(A0)+
    ADDQ.L  #4,A0
    MOVE.L  A0,A2
    MOVE.L  #NAMEBUF,A1
.XL:MOVE.B  (A1)+,(A0)+
    BNE.S   .XL
    MOVE.B  #".",-1(A0)
    MOVE.B  #"e",(A0)+
    CLR.B   (A0)+
    CLR.B   (A0)+
    CLR.B   (A0)+
    MOVE.L  A0,D0
    SUB.L   A2,D0
    LSR.L   #2,D0
    MOVE.L  D0,-4(A2)
    LSL.L   #2,D0
    LEA 0(A2,D0.L),A0
    MOVE.L  A0,LINEBUFCUR
    MOVE.L  A0,LINEBUFCURSTART  ; IF THE SAME LATER, DON'T SAVE
.1: RTS

ADDLINEDBG:
    TST.W   PROCF
    BEQ.S   .1
    MOVEM.L D0/A0,-(A7)
    MOVE.L  LINEBUFCUR(PC),A0
    MOVEQ   #0,D0
    MOVE.W  LINENUM,D0
    ADDQ.L  #1,D0
    MOVE.L  D0,(A0)+
    MOVE.L  A4,D0
    SUB.L   ACODE,D0
    MOVE.L  D0,(A0)+
    MOVE.L  A0,LINEBUFCUR
    BTST    #6,CODEPREFS+1
    BEQ.S   .3
    MOVE.W  .2(PC),(A4)+        ; ADD A NOP
.3: MOVEM.L (A7)+,D0/A0
.1: RTS
.2: NOP

DEBUGLIST:    DC.L    0
MAXLINENUM:   DC.W    0
LINEBUF:      DC.L    0
LINEBUFCUR:   DC.L    0
LINEBUFCURSTART:  DC.L    0

SETVARS:
    MOVE.L  #BRACKETSBUF,CURBRACK
    MOVE.L  #HASHBUFS,A0        ; CLEAR HASHTABLES
    MOVE.L  #ENDHASHBUFS,D0
    SUB.L   A0,D0
    LSR.L   #2,D0
    SUBQ.L  #1,D0
    MOVEQ   #0,D1
.CLR:   MOVE.L  D1,(A0)+
    DBRA    D0,.CLR
    MOVE.L  DIRNAMEX,A1     ; STD MODULE PATH
    LEA STDDIR(PC),A0
.1: MOVE.B  (A0)+,(A1)+
    BNE.S   .1
    MOVE.W  #-1,KILLFLAG        ; FROM NOW, DELETE IF PROBLEMS
    LEA SELFNAME(PC),A0
    HASH    A0,D0,D1
    LSL.L   #2,D0
    ADD.L   #IDENTHASH,D0
    MOVE.L  D0,SELFHASHADR
    RTS

STDDIR:
    DC.B    'emodules:',0

;*-*

