;; COMPILER
; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ;
;   The COMPILER Part !!!!!!                ;
; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ;


; compile main vars

COMPILEPROC:    DC.L    0
PROCMASK:   DC.W    0   ; ONE .L
PROCMASKREV:    DC.W    0   ;
SCOPE:      DC.W    0   ; <>0 --> LOCAL
CURLABNAME: DC.L    FOFF
LABPRES:    DC.L    0
LABPRES2:   DC.L    0
VAROFFSET:  DC.W    0
VARNO:      DC.W    0
PROCF:      DC.W    0
FLAG:       DC.W    0
CURIDENTREC:    DC.L    0   ; IDENTPTR STRUCT
NRLOC:      DC.W    0   ; LINK
NRARG:      DC.W    0   ; RTD
TYPELAB:    DC.W    0   ; 0-3
COMPMESSY:  DC.B    'parsing and compiling ...',10
ENDCOMPMESSY:   EVEN

PASS1:

    MOVE.W  #-1,EXPORTFLAG
    BTST    #6,CODEPREFS+2
    BNE.S   .EA
    CLR.W   EXPORTFLAG
.EA:    MOVE.W  #9,CURSPOT
    BTST    #7,CODEPREFS+2
    BNE.S   .1
    MOVE.L  #COMPMESSY,D2
    MOVE.L  #ENDCOMPMESSY-COMPMESSY,D3
    BSR WRITECON
.1: CLR.W   LINEWRITE
    CLR.W   LINENUM
    LEA CURINTERIM(PC),A0
    MOVE.L  8(A0),(A0)
    MOVE.L  CURINTERIM(PC),A0
COMPILELINE:
    MOVE.L  CURACODE(PC),A4
    MOVE.L  ESTACK(PC),A5
    MOVE.L  CURINTERIM(PC),A3
    MOVEQ   #5,D0
    BSR ADDLABEL
    MOVE.W  #2,ERRWHERE
COMPILELOOP:
    BSR WRITELINENUM        ; TRASHES D7

    MOVE.W  (A3)+,D7
    CMP.W   #-1,D7
    BEQ.S   COMPILEOUTS
    CMP.W   #21,D7
    BNE ERROR12
    MOVE.W  (A3)+,D7
    MOVE.L  A3,INTERMED
    TST.L   LINEBUF
    BEQ.S   .1
    CMP.W   LINENUM(PC),D7
    BEQ.S   .1
    MOVE.W  D7,LINENUM
    JSR ADDLINEDBG
.1: MOVE.W  D7,LINENUM
    MOVE.W  (A3)+,D7
    BSR DOINSMAIN
    MOVE.L  A4,CURACODE
    JSR CHECK3
    BRA.S   COMPILELOOP
COMPILEOUTS:
    TST.W   PROCF
    BNE ERROR9
    MOVE.L  A5,ESTACK
    MOVE.L  A3,CURINTERIM
    MOVE.W  #-1,LINENUM
    BSR LINKDATA
    MOVE.L  A4,CURACODE
    RTS

LINKDATA:
    LEA STRINGLINK,A6
.XL:MOVE.L  (A6),A6
    MOVE.L  A6,D0
    BEQ.S   .X
    MOVEQ   #0,D0
    MOVE.W  4(A6),D0
    BSR ADDLABEL

    LEA 6(A6),A5
.L2:    MOVE.L  (A5)+,A3
    MOVE.W  -2(A3),D0
    MOVE.L  A4,A0
    LSL.W   #1,D0
    ADD.W   D0,A0
    MOVE.L  A0,CURACODE
    JSR CHECK3
    MOVE.W  -4(A3),D0
    BEQ.S   .NC
    SUBQ.W  #1,D0
.CL:    MOVE.B  (A3)+,(A4)+
    DBRA    D0,.CL          ; WAS A BNE LOOP!
.NC:    MOVE.L  (A5),D7
    MOVE.L  D7,A5
    BNE.S   .L2
    CLR.B   (A4)+

    BRA.S   .XL
.X: MOVE.L  A4,D0
    BTST    #0,D0
    BEQ.S   .1
    CLR.B   (A4)+
.1: RTS


DOINSMAIN:            ; FIRST INTERIM IN D7
    CMP.W   #IOFF+59,D7
    BEQ.S   .1
.2: BSR DOINS
    TST.W   (A3)+
    BNE ERROR12
.3: BTST    #6,CODEPREFS+2
    BEQ.S   .EA
    RTS
.EA:    CLR.W   EXPORTFLAG
    RTS
.1: MOVE.W  #-1,EXPORTFLAG
    MOVE.W  (A3)+,D7
    BEQ.S   .3
    BRA.S   .2

EXPORTFLAG:   DC.W    0
FLTFLAG:      DC.W    0
DEFFLAG:      DC.W    0
HANDLEFLAG:   DC.W    0

DOINS:
    TST.W   SCOPE
    BEQ.S   .2
    TST.W   DEFFLAG
    BNE.S   .DH
.DHB:
    CMP.W   #$100,D7        ; in procs part
    BPL DOASM
    CMP.W   #48,D7
    BEQ PPCDOASM
    CMP.W   #IDENT,D7       ; BECOMES+LABEL:
    BEQ DOLAB
    CMP.W   #32,D7
    BEQ PTRCOMPLEX
    BTST    #3,CODEPREFS+3
    BEQ.S   .1
    CMP.W   #IOFF+20,D7
    BMI ERROR32
    CMP.W   #IOFF+23,D7
    BPL ERROR32
.1: CMP.W   #IOFF,D7
    BPL DOJOB
    BRA DOEXP
.2: CMP.W   #IOFF+16,D7     ; in global part
    BEQ DOJOB
    CMP.W   #IOFF,D7
    BEQ DOJOB
    CMP.W   #IOFF+48,D7
    BEQ DOJOB
    BRA ERROR35
.DH:    CMP.W   #IOFF+17,D7
    BEQ.S   .DHB
    CLR.W   DEFFLAG         ; FIRST STATEMENT AFTER DEF'S
    TST.W   HANDLEFLAG
    BEQ .DHB
    BSR HANDLEPROCREALLY
    BRA .DHB
DOINSOUT:
    RTS

DOEXP:
    TST.W   PROCF
    BNE.S   .1
    BSET    #6,WARNINGS+3       ; CODE OUTSIDE PROCS
.1: MOVE.W  #1,EXPSTAT
    MOVE.W  D7,-(A3)
    BSR EXP
    CLR.W   EXPSTAT
    BRA.S   DOINSOUT

EXPSTAT:  DC.W    0

DOASM:
    BSR ASM_COMPILE     ; WITH D7
    BRA.S   DOINSOUT

PPCDOASM:
    BSR PASM_COMPILE
    BRA     DOINSOUT

DOJOB:
    BSR.S   DOKEYWORD
    BRA DOINSOUT

STOPJOB:              ; END JOBCODE PROCESSING
    LEA .1(PC),A2
    RTS
.1: DC.W    0

DOKEYWORD:
    SUB.W   #IOFF,D7
    ASL.W   #2,D7
    LEA INSJOBTAB,A2
    MOVE.L  0(A2,D7.W),A2
JOBLOOP:
    MOVE.W  (A2)+,D7
    TST.W   D7
    BEQ.S   JOBOUT
    ASL.W   #2,D7
    LEA JOBROUTTAB(PC),A0
    MOVE.L  (A0,D7.W),A0
    JMP (A0)
JOBOUT:
    RTS


DOBECOMESMETHOD:
    CMP.W   #42,6(A3)
    BEQ DOEXP
DOBECOMES:
    MOVE.L  (A3)+,A1
    MOVE.L  A1,EAIDENT
    CMP.W   #ASSGN,(A3)
    BNE COMPLEXBECOMES
    MOVE.B  4(A1),D2
    BEQ ERROR22
    CMP.B   #LAB,D2
    BEQ ERROR6
    ADDQ.L  #2,A3

    move.l  a4,-(a7)
    MOVE.W  #17,EAREQUEST
    BSR EAEXP
    move.l  (a7)+,a2            ; a2 now - output code before expression
    TST.L   D0
    BNE.W   .OPT
    BTST    #2,ICODEPREFS+3
    BNE     .SKdupa

    TST.L   LAST_CMD_ADR        ; see if we can optimize
    beq     .SKdupa
    move.l  LAST_CMD_ADR,a0
    move.l  a4,d0
    sub.l   a0,d0
    cmp.l   #4,d0
    bne     .SK1
    btst    #1,CODEPREFS
    beq     .SK1
    cmp.l   #$F2006400,(a0)
    bne     .SK1
    subq.l  #4,a4
    move.l  a4,d0
    sub.l   a2,d0
    cmp.l   #8,d0
    beq     .OPTI8
.O8B:
    move.w  .F1,(a4)+
    move.l  a4,d1
    jsr     GVA1D0_0
    cmp.l   a4,d1
    beq     .SK0
    move.w  -(a4),d0
    move.w  .F1+2(pc),(a4)+
    move.w  d0,(a4)+
    bra     .OPT
.SK0:
    move.w  .F1+2(PC),(A4)+
    bra     .OPT
.SK1:
    cmp.w   #6,d0
    bne     .SK2
    cmp.w   #$203c,(a0)
    bne     .SK2
    move.l  a0,a4
    move.l  2(a4),-(a7)
    move.w  #$2b7c,(a4)+
    move.l  a4,a2
    JSR     GVA1D2_9
    moveq   #0,d2
    cmp.l   a4,a2
    beq     .SK1S
    move.w  -(a4),d2
    move.l  (a7)+,(a4)+
    move.w  d2,(a4)+
    bra     .OPT
.SK1S:
    move.l  (a7)+,(a4)+
    bra     .OPT


.SK2:
.SKdupa:
    MOVE.W  .1(PC),(A4)+
    JSR GVA1D2_9
.OPT:   BRA DOINSOUT
.1: MOVE.L  D0,2(A5)
.F1:fmove.s fp0,4(a5)
.F2:fsmove.s #0,fp0
.F3:fmove.s #0,fp0
.2: move.l  #0,2(a5)
.OPTI8:
    MOVE.L  .F2,d0
    cmp.l   (a2),d0
    bne     .O82
    bra     .O8
.O82:
    MOVE.L  .F3,d0
    cmp.l   (a2),d0
    bne     .O8B
.O8:
    subq.l  #8,a4
    move.l  4(a4),d0
    move.w  .2,(a4)+
    move.l  a4,a2
    jsr     GVA1D2_9
    cmp.l   a4,a2
    bne     .O8X
    move.l  d0,(a4)+
    bra     .OPT
.O8X:
    move.w  -(A4),d2
    move.l  d0,(a4)+
    move.w  d2,(a4)+
    bra     .OPT
;COMPLEXEXP:
;    move.l  (a3)+,a1
;    move.l  a1,EAIDENT
;    move.w  (a3)+,-(a7)
;    addq.l  #2,a3
;    BSR EXP
;    move.w  (a7)+,d0
;    subq.w  #7,d0
;    lsl.w   #2,d0
;    move.l  EAIDENT(PC),A1
;    lea     .C0(PC),A0
;    move.w  0(a0,d0),(a4)+
;    jsr GVA1D2_0
;    bra DOINSOUT
.;C0:add.l   d0,4(a5)
;    sub.l   d0,4(a5)
;


PTRCOMPLEX:           ; uses a0,d0
    SUBQ.L  #2,A3
    MOVE.L  A3,A0
    BRA.S   COMPLEXST
COMPLEXBECOMES:
    LEA -6(A3),A0
COMPLEXST:
    MOVE.L  A0,-(A7)        ; complexstart -->STACK (D7)
    BSR EATLEXP
    BSR EXP
    MOVE.L  (A7)+,D7
    MOVE.L  A3,-(A7)        ; complexend -->STACK
    MOVE.L  D7,A3
    MOVEQ   #2,D0
    BSR EADDRESSMODI
    CMP.W   #ASSGN,(A3)+
    BNE ERROR2
    MOVE.L  (A7)+,A3
    BRA DOINSOUT


NOASSIGN:
    MOVE.L  A0,A3           ; FROM COMPLEXST
    BSR EXP
    BRA DOINSOUT

EATLEXP:              ; uses d0
    MOVE.W  (A3)+,D0
    BEQ .3
    CMP.W   #IDENT,D0
    BEQ.S   .1
    CMP.W   #ASSGN,D0
    BEQ.S   .2
    CMP.W   #39,D0
    BEQ.S   .1
    CMP.W   #31,D0
    BEQ.S   .1
    CMP.W   #11,D0
    BEQ.S   .4
    CMP.W   #32,D0
    BMI.S   .XB
    CMP.W   #36,D0
    BMI.S   EATLEXP
.XB:CMP.W   #41,D0
    BEQ.S   EATLEXP
    CMP.W   #42,D0
    BEQ.S   .MET
    CMP.W   #29,D0
    BNE.S   .3          ; was ERROR0!!!
    ADD.L   (A3),A3
    BRA.S   EATLEXP
.2: RTS
.1: ADDQ.L  #4,A3
    BRA.S   EATLEXP
.4: BSET    #3,WARNINGS+3       ; a.complex=1 a statement
    MOVE.W  LINENUM,ASSLINE
.3: ADDQ.L  #8,A7
    BRA.S   NOASSIGN
.MET:   ADDQ.L  #4,A7
    MOVE.L  (A7)+,A3
    ADDQ.L  #2,A3
    BRA DOEXP

DOMULTIPLE:
    SUBQ.L  #2,A3
    MOVE.L  A3,-(A7)
.XL:CMP.W   #IDENT,(A3)+        ; SKIP VARS
    BNE ERROR6
    ADDQ.L  #4,A3
    CMP.W   #COM,(A3)+
    BEQ.S   .XL
    CMP.W   #ASSGN,-2(A3)
    BNE ERROR2
    BSR EXP
    MOVE.L  (A7)+,D0
    MOVE.L  A3,-(A7)
    MOVE.L  D0,A3
    MOVEQ   #0,D0           ; REGISTER COUNT
.L2:    CMP.W   #8,D0           ; NO MORE THAN 8 VARS
    BEQ ERROR0
    ADDQ.L  #2,A3           ; FILL VARS WITH D0..DX
    MOVE.L  (A3)+,A0
    LEA .1(PC),A1
    MOVE.B  4(A0),D2
    BEQ ERROR22
    CMP.B   #LAB,D2
    BEQ ERROR6
    MOVE.W  (A1),D1
    OR.W    D0,D1
    MOVE.W  D1,(A4)+
    JSR GVA0D7_9
    ADDQ.L  #1,D0
    CMP.W   #COM,(A3)+
    BEQ .L2
    MOVE.L  (A7)+,A3
    BRA DOINSOUT
.1: MOVE.L  D0,2(A5)


DOLAB:
    BTST    #3,CODEPREFS+3
    BNE.S   .1
.2: ;CMP.l   #$7000b,4(a3)
;    beq COMPLEXEXP
;    cmp.l   #$8000b,4(a3)
;    beq COMPLEXEXP
    MOVE.W  4(A3),D0
    CMP.W   #ASSGN,D0
    BEQ DOBECOMES
    CMP.W   #29,D0
    BEQ DOBECOMES
    CMP.W   #35,D0
    BEQ DOBECOMESMETHOD
    CMP.W   #41,D0
    BEQ DOBECOMES
    CMP.W   #COM,D0
    BEQ DOMULTIPLE
    CMP.W   #11,D0
    BNE.S   .3
    BSET    #3,WARNINGS+3       ; a=1 a statement
    MOVE.W  LINENUM,ASSLINE
.3: CMP.W   #19,D0
    BNE DOEXP
    SUBQ.L  #2,A3
    BSR CHLAB
    TST.W   (A3)+
    TST.W   (A3)            ; INTR. FOLLOWS OR WHAT?
    BEQ DOINSOUT
    BSR DOINSREC
    BRA DOINSOUT
.1: CMP.W   #19,4(A3)
    BNE ERROR32
    BRA     .2
;*-*
;;COMPILE


;   NOTEZBIEN:  DEZE MOGEN NIET MEER REGISTERS VERSTOREN!
;; ADD LABEL
ADDLABEL:             ; D0 LABEL (A4 IS ADR. LABEL)
    MOVE.L  LABM+8(PC),A0       ; THRASHES A0/D0!
    LSL.L   #2,D0
    AND.L   #$3FFFF,D0
    MOVE.L  A4,0(A0,D0.L)
    RTS
;*-*
;; ADD BRANCH
ADDBRANCH:            ; D0 LABEL (A4 IS ADR. NA OP.)
    MOVE.L  A4,D1
    SUBQ.L  #2,D1           ; +TRASH: D1/A0, -TRASH: D0 !

    TST.W   NEWOP
    BEQ.S   .NL
    BTST    #1,ICODEPREFS+3
    BNE     .1
    BTST    #2,CODEPREFS+3
    BEQ.S   .NL
.1:
    TST.W   NEWOP020
    BEQ     .LONG
    CMP.W   #1,ECPU
    BMI     .LONG
    subq.l  #4,a4
    move.w  NEWOP020,(a4)+
    CLR.W   NEWOP020
    CLR.W   NEWOP
    BRA     ADDBRANCHPCREL32
.LONG:
    MOVE.L  #$30000,-2(A4)
    ADDQ.L  #2,A4
    MOVE.W  D7,-(A7)
    MOVE.W  NEWOP,D7
    BEQ.S   .NNO
    MOVE.W  D7,-6(A4)
.NNO:   MOVE.W  (A7)+,D7
.NL:
    GETM    A0
    MOVE.L  BRANCHLIST,(A0)
    MOVE.L  A0,BRANCHLIST
    ADDQ.L  #4,A0
    MOVE.L  D1,(A0)+
    MOVE.W  D0,(A0)+
    CLR.W   (A0)+
    DONEM   A0
    CLR.W   NEWOP
    RTS
;*-*
;; ADD BRANCH RELOC
ADDBRANCHRELOC:           ; D0 LABEL (A4 IS ADR. VOOR REL.LONG.)
    MOVE.L  A4,D1           ; +TRASH: D1/A0, -TRASH: D0 !
    MOVE.L  #$30000,(A4)+
    GETM    A0
    MOVE.L  BRANCHLIST(PC),(A0)
    MOVE.L  A0,BRANCHLIST
    ADDQ.L  #4,A0
    MOVE.L  D1,(A0)+
    MOVE.W  D0,(A0)+
    CLR.W   (A0)+
    DONEM   A0
    RTS
;*-*
;; FORCE ABSOLUTE
FORCEABSHERE:
    MOVE.L  A4,D1           ; +TRASH: D1/A0, -TRASH: D0 !
    MOVE.L  #$B0000,(A4)+
    GETM    A0
    MOVE.L  BRANCHLIST(PC),(A0)
    MOVE.L  A0,BRANCHLIST
    ADDQ.L  #4,A0
    MOVE.L  D1,(A0)+
    move.w  #1,(a0)+
    MOVE.L  D0,(A0)+
    DONEM   A0
    RTS
;*-*
;; ADD BRANCH PCREL 32
ADDBRANCHPCREL32:
    MOVE.L  A4,D1
    MOVE.L  #$90000,(A4)+
    GETM    A0
    MOVE.L  BRANCHLIST,(A0)
    MOVE.L  A0,BRANCHLIST
    ADDQ.L  #4,A0
    MOVE.L  D1,(A0)+
    MOVE.W  D0,(A0)+
    CLR.W   (A0)+
    DONEM   A0
    RTS
;*-*
;; ADD BRANCH PCREL 16 EXTENDED
ADDBRANCHPCREL16E:
    MOVE.L  A4,D1
    CLR.W   (A4)+
    GETM    A0
    MOVE.L  BRANCHLIST(PC),(A0)
    MOVE.L  A0,BRANCHLIST
    ADDQ.L  #4,A0
    MOVE.L  D1,(A0)+
    MOVE.W  D0,(A0)+
    MOVE.W  #1,(A0)+
    DONEM   A0
    RTS
;*-*
;; ADD BRANCH PCREL 32 EXTENDED
ADDBRANCHPCREL32E:
    MOVE.L  A4,D1
    MOVE.L  #$90000,(A4)+
    GETM    A0
    MOVE.L  BRANCHLIST(PC),(A0)
    MOVE.L  A0,BRANCHLIST
    ADDQ.L  #4,A0
    MOVE.L  D1,(A0)+
    MOVE.W  D0,(A0)+
    MOVE.W  #1,(A0)+
    DONEM   A0
    RTS
;*-*
;; ADD LIB BRANCH
PUTLIBBRANCH:
    MOVE.L  A0,-(A7)
    GETM    A0
    MOVE.L  LIBPTRS(PC),(A0)+
    MOVE.L  A0,LIBPTRS
    MOVE.L  A4,(A0)+
    MOVE.L  A6,(A0)+
    BTST    #2,CODEPREFS+3
    BNE     .LARGE
    MOVE.W  #0,(A0)+
    MOVE.W  #$6100,(A4)+
    MOVE.W  #$0,(A4)+
    BRA .EXIT
.LARGE:
    MOVE.W  #1,(A0)+
    MOVE.W  #$4eb9,(a4)+
    move.l  #$0,(a4)+
.EXIT:
    DONEM   A0
    MOVE.L  (A7)+,A0
    RTS
;*-*
;; NEW LABEL
NEWLABEL:             ; => D0 LAB
    MOVE.L  CURLABNAME(PC),D0
    ADDQ.L  #1,CURLABNAME
    BSR CHECKLABBUF
    RTS
;*-*

;; central important vars:
;------------------------

CURINTERIM: DC.L 0          ; [1] ADR. OF CURRENT INTERIM
TOKENEND:   DC.L 0,0,0,10000,100*KB
CURLIBASC:
CURACODE:   DC.L 0,0        ; [3] ADR. OF CURRENT OBJPART
ACODE:      DC.L 0          ;     ADR. OF OBJECTCODE
        DC.L 0,MAXSTACK+1000,MINIMUM_ACODE
HEAP:       DC.L 0          ; [5] ADR. OF CURRENT HEAPSPACE
        DC.L 0,0,0,2000,10*KB
LABM:       DC.L 0,0,0,0,5000,15*KB ; [6]



ECODE:      DC.L EXAMPLE        ; ADR. OF E-CODE
CURECODE:   DC.L EXAMPLE        ; ADR. OF CURRENT ELINE
ENDECODE:   DC.L EXAMPLEEND
EBUF:       DC.L 0          ; <>0 --> DEALLOC
EBUFSIZE:   DC.L 0
GENERALSIZE:    DC.L 0

INITSTACK:  DC.L 0
ESTACK:     DC.L ESTACKBUF      ; ADR. OF COMPILESTACK
WORK:       DC.L WORKBUF        ; ADR. OF WORKBUFFER
DIRNAMEX:   DC.L DIRNAME
MODLEFT:    DC.L 0

LINENUM:    DC.W -1
LINENUM2:   DC.W 0
LINENUMZ:   DC.L 0
ERROROBJ:   DC.L 0          ; IDENTNAME THAT CAUSED ERROR
REALBRANCH: DC.L 0          ; OFFSET ADR
STARTINTERIM:   DC.L 0

LOADEDVERSION:  DC.W 0

CHECKHEAP:  DC.W 10
OPERSIZE:   DC.W 4          ; MUST BE KEPT AT 4 (FOR GLOBALS)

LIBINFO:    DC.L    0

;----------------------------
;*-*
;; VARS/CODE

; following code has HEAP in use!!!!!

DBLIST: DC.L    0       ; linked
DBTAIL: DC.L    0
DBBEG:  DC.L    0
DBCUR:  DC.L    0       ; =end after one, ISDEBUG FLAG
NEWOP:    DC.W    0     ; 0=NO32, X=NEWOP
NEWOP020: DC.W  0       ; 0=NoBcc.L, X=NEWOP
BRANCHLIST:   DC.L    0
INITCODE:   BSR GLOBSTACK
PROCRTS:    RTS
GLOBSTACK:  DC.L    0   ; TOTAL GLOBAL
XTRASTACK:  DC.L    0
MINSTACK:   DC.L    0   ; ALL LOCAL ADDED
CLEARXTRA:  ADD.L   #40,A7
PROCEND:    DC.L    0
PROCSTARTADR:   DC.L    0
;*-*
;; MACROS
MAXINT=$7FF0

LDEF:   MACRO
    TSTMOD
    BEQ.S   *+12
    CMP.W   #3,-2(A2)
    BEQ ERROR48
    ENDM
;*-*

;; OPTCACHELINE
OPTCACHELINE:               ; D0 LABEL (A4 IS ADR. LABEL)
    cmp.w   #1,ECPU
    bmi     .DO
    btst    #1,ICODEPREFS+3
    BEQ     .DO
    move.l  d1,-(a7)
    move.l  a4,d1
    sub.l   ACODE,d1
    and.l   #7,d1           ; boundaries!!
    cmp.w   #2,d1
    bne     .1
    move.w  #$51fb,(a4)+
    clr.l   (a4)+
    bra     .DO1
.1: cmp.w   #4,d1
    bne     .2
    move.l  #$51fa0000,(a4)+
    bra     .DO1
.2: cmp.w   #6,d1
    bne     .DO1
    move.w  #$51fc,(a4)+
.DO1:
    move.l  (a7)+,d1
.DO:
    RTS
;*-*

;; "1"
GETPARAMLABEL:            ; 1
    CMP.W   #IDENT,(A3)+
    BNE ERROR4
    MOVE.L  (A3)+,A0
    MOVE.W  10(A0),LABPRES+2
    CMP.B   #LAB,4(A0)
    BNE ERROR4
    BTST    #4,5(A0)
    BNE ERROR4
    BRA JOBLOOP
;*-*
;; "2"
JOBEXP:               ; 2
    BSR EXP
    BRA JOBLOOP
;*-*
;; "3"
GETPARAMVAR:          ; 3
    MOVE.W  (A3)+,D6
    CMP.W   #IDENT,D6
    BNE ERROR6
    MOVE.L  (A3)+,A0
    MOVE.L  A0,CURIDENTREC
    MOVE.W  10(A0),VAROFFSET
    MOVE.B  4(A0),D0
    BEQ ERROR22
    MOVE.W  D0,TYPELAB
    CMP.B   #LAB,D0
    BEQ ERROR6
    BRA JOBLOOP
;*-*
;; "4"
GETCOMMA:             ; 4
    MOVE.W  (A3)+,D6
    CMP.B   #COM,D6
    BNE ERROR5
    BRA JOBLOOP
;*-*
;; "5"
SAVESTIDENT:          ; 5
    MOVE.W  (A2)+,(A5)+
    BRA JOBLOOP
;*-*
;; "6"
FORWARDREFERENCE:         ; 6
    BSR     NEWLABEL
    MOVE.L  D0,(A5)+
    MOVE.L  D0,LABPRES
    BRA JOBLOOP
;*-*
;; "7"
CHECKSTIDENT:         ; 7
    MOVE.W  -(A5),D0
    CMP.W   (A2)+,D0
    BNE ERROR9
    BRA JOBLOOP
;*-*
;; "8"
MAKEBRANCH:           ; 8
    MOVE.L  LABPRES,D0
    CLR.W   NEWOP
    BSR ADDBRANCH
    BRA JOBLOOP
;*-*
;; "9"
COPY2:                ; 9
    MOVE.W  (A2)+,(A4)+
    BRA JOBLOOP
;*-*
;; 10
COPY4:                ; 10
    MOVE.L  (A2)+,(A4)+
    BRA JOBLOOP
;*-*
;; 11
COPYN:                ; 11
    MOVE.W  (A2)+,D0
COPYNLOOP:
    MOVE.W  (A2)+,(A4)+
    DBRA    D0,COPYNLOOP
    BRA JOBLOOP

;*-*
;; 12
COPY6:                ; 12
    MOVE.L  (A2)+,(A4)+
    MOVE.W  (A2)+,(A4)+
    BRA JOBLOOP
;*-*
;; 13
COPY8:                ; 13
    MOVE.L  (A2)+,(A4)+
    MOVE.L  (A2)+,(A4)+
    BRA JOBLOOP
;*-*
;; 14
COPY10:               ; 14
    MOVE.L  (A2)+,(A4)+
    MOVE.L  (A2)+,(A4)+
    MOVE.W  (A2)+,(A4)+
    BRA JOBLOOP
;*-*
;; 15
REMEMBERLAB:          ; 15
    MOVE.L  -(A5),D0
    BSR ADDLABEL
    BRA JOBLOOP
;*-*
;; 16
EXPORNILL:            ; 16
    TST.W   (A3)
    BEQ.S   MAKEMOVEQ
    CMP.W   #$400,(A3)
    BEQ MAKED0
    CMP.W   #IOFF+18,(A3)
    BEQ.S   MAKEMOVEQ
    BSR EXP
    CMP.W   #COM,(A3)
    BNE JOBLOOP
    CLR.W   .C
.XL:MOVE.W  .P(PC),(A4)+
    ADDQ.L  #2,A3
    BSR EXP
    ADDQ.W  #1,.C
    CMP.W   #COM,(A3)
    BEQ.S   .XL
    MOVE.W  .C(PC),D0
    CMP.W   #MAXMULTRET,D0
    BPL ERROR0
    MOVE.W  .M(PC),D1
    MOVE.W  D0,D2
    MOVEQ   #9,D3
    LSL.W   D3,D2
    OR.W    D2,D1
    MOVE.W  D1,(A4)+
.L2:    SUBQ.W  #1,D0
    MOVE.W  .R(PC),D1
    MOVE.W  D0,D2
    LSL.W   D3,D2
    OR.W    D2,D1
    MOVE.W  D1,(A4)+
    TST.W   D0
    BNE.S   .L2
    BRA JOBLOOP
.P: MOVE.L  D0,-(A7)
.C: DC.W    0
.M: MOVE.L  D0,D0
.R: MOVE.L  (A7)+,D0
MAKEMOVEQ:
    MOVE.W  MOVEQ(PC),(A4)+
    BRA JOBLOOP
MAKED0:
    ADDQ.L  #2,A3
    BRA JOBLOOP
;*-*
;; 17               Procedure
PROCFLAGON:           ; 17
;    BTST    #0,CODEPREFS
;    BEQ     .XXX
;    MOVE.L  #$4e880020,(a4)+
;.XXX:
    CLR.L   FIXUPSTACKREGS
    TST.W   PROCF
    BNE ERROR9
    BCLR    #3,ICODEPREFS+3
    BSR.W   NEWLABEL
    MOVE.L  D0,PROCEND
    MOVE.L  A4,PROCSTARTADR
    MOVEQ   #-1,D1
    MOVE.W  D1,PROCF
    MOVE.W  D1,DEFFLAG
    CLR.W   HANDLEFLAG
    MOVE.L  CURIDENTREC(PC),A0  ; NOW GET NR OF LOC VARS
    MOVE.L  6(A0),A0
    MOVE.L  A0,COMPILEPROC
    CLR.L   PROCMASK        ; + REV
    MOVE.W  4(A0),NRLOC
    BTST    #0,2(A0)
    BEQ.S   .1
    MOVE.W  (A0),NRARG
    BRA.S   .2
.1: CLR.W   NRARG
.2: CLR.L   XTRASTACK
.3: BRA JOBLOOP
;*-*
;; 18
PROCFLAGOFF:          ; 18
    TST.W   PROCF
    BEQ ERROR9
    MOVE.L  PROCEND(PC),D0
    BSR ADDLABEL
    MOVE.L  A4,D0
    SUB.L   PROCSTARTADR(PC),D0
    CMP.L   #32000,D0
    BPL ERROR46
    CLR.W   PROCF
    MOVE.L  XTRASTACK(PC),D0
    ADD.L   D0,MINSTACK

    TST.L   D0
    BEQ.S   .2
    MOVE.W  CLEARXTRA(PC),(A4)+
    MOVE.L  D0,(A4)+
.2:
    TST.W   PROCMASKREV
    BEQ.S   .1
    RESTR   PROCMASKREV
.1:
    TST.W   HANDLEFLAG
    BEQ.S   .1B
    MOVE.L  .3(PC),(A4)+
.1B:
    BRA JOBLOOP
.3: MOVEM.L (A7)+,D3-D7
;*-*
;; 19
CHECK2LAB:            ; 19
    BSR.S   CHLAB
    BRA JOBLOOP

CHLAB:
    MOVE.W  (A3)+,D6
    CMP.W   #IDENT,D6
    BNE ERROR4
    MOVE.L  (A3)+,D0
    MOVE.L  D0,CURIDENTREC
    MOVE.L  D0,A0
    CMP.B   #LAB,4(A0)
    BNE ERROR4

    TST.W   EXPORTFLAG
    BEQ.S   .1
    BSET    #2,5(A0)        ; EXPORT
.1:
    MOVE.L  6(A0),A1        ; FOR MAIN
    MOVE.L  (A0),A0
    CMP.B   #'m',(A0)
    BEQ.S   MAINFOUND
MAINBACK:
    CMP.L   #FOFF,D0
    BMI.S   .1
    MOVE.L  D0,A1
    MOVEQ   #0,D0
    MOVE.W  10(A1),D0
.1: BSR ADDLABEL
    RTS

MAINF:    DC.W    0

MAINFOUND:
    CMP.B   #'a',1(A0)
    BNE.S   MAINBACK
    CMP.B   #'i',2(A0)
    BNE.S   MAINBACK
    CMP.B   #'n',3(A0)
    BNE.S   MAINBACK
    CMP.B   #0,4(A0)
    BNE.S   MAINBACK
    TST.W   (A1)
    BNE ERROR23
    MOVEQ   #1,D0           ; MAINLABCODE
    TST.W   MAINF
    BNE ERROR14
    MOVE.W  D0,MAINF
    TSTMOD
    BEQ.S   MAINBACK
    BRA ERROR48
;*-*
;; 20
REMINDCURPOS:         ; 20
    BSR     NEWLABEL
    MOVE.L  D0,(A5)+
    BSR ADDLABEL
    BRA JOBLOOP
;*-*
;; 21
POPLAB:               ; 21
    MOVE.L  -(A5),LABPRES
    BRA JOBLOOP
;*-*
;; 22
INSERTVAROFF:         ; 22
    SUBQ.L  #2,A4
    MOVE.L  CURIDENTREC(PC),A0
    JSR GVA0D2_0
    BRA JOBLOOP
;*-*
;; 23
PUSHVAR:              ; 23
    MOVE.L  CURIDENTREC(PC),(A5)+
    BRA JOBLOOP
;*-*
;; 24
POPVAR:               ; 24
    MOVEA.L -(A5),A0
    MOVE.L  A0,CURIDENTREC
    MOVE.B  4(A0),TYPELAB
    MOVE.W  10(A0),VAROFFSET
    BRA JOBLOOP
;*-*
;; 25
PUSHLAB:              ; 25
    MOVE.L  LABPRES(PC),(A5)+
    BRA JOBLOOP
;*-*
;; 26
PUSHLAB2:             ; 26
    MOVE.L  LABPRES2(PC),(A5)+
    BRA JOBLOOP
;*-*
;; 27
POPLAB2:              ; 27
    MOVE.L  -(A5),LABPRES2
    BRA JOBLOOP
;*-*
;; 28
NEWLAB2:              ; 28
    BSR NEWLABEL
    MOVE.L  D0,(A5)+
    MOVE.L  D0,LABPRES2
    BRA JOBLOOP
;*-*
;; 29
MAKEBRANCH2:          ; 29
    MOVE.L  LABPRES2(PC),D0
    CLR.W   NEWOP
    BSR ADDBRANCH
    BRA JOBLOOP
;*-*
;; 30
SETFLAG:              ; 30
    MOVE.W  #-1,FLAG
    BRA JOBLOOP
;*-*
;; 31
SKIPFLAG:             ; 31
    MOVE.W  (A2)+,D0
    TST.W   FLAG
    BNE.S   SKIPOUT
SKIPLOOP:
    TST.W   (A2)+           ; NOP
    DBRA    D0,SKIPLOOP
SKIPOUT:
    BRA JOBLOOP
;*-*
;; 32
CLEARFLAG:            ; 32
    MOVE.W  #0,FLAG
    BRA JOBLOOP         ; was: "OUT"
;*-*
;; 33               VARS
SKIPDEFLOCAL:         ; 33
    MOVEQ   #0,D6           ; D6=DEFARGS COUNT
    MOVE.W  (A2)+,D5        ; 1=PROC,2=LOCAL,3=DEF

    CLR.L   .DAAR
    CLR.L   .DAAR+4
    CLR.L   .DAAR+8
    CLR.L   .DAAR+12


    CLR.L   DBCUR
    BTST    #6,CODEPREFS+1
    BEQ.W   .NDB            ; NOW __DEBUG__ SPECIFIC
    CMP.W   #1,D5
    BNE.W   .NN

    GETM    A0
    MOVE.L  DBTAIL(PC),D0
    BNE.S   .LA
    MOVE.L  A0,DBLIST
    BRA.S   .LN
.LA:    MOVE.L  D0,A1
    MOVE.L  A0,(A1)
.LN:    MOVE.L  A0,DBTAIL
    MOVE.L  A0,D2
    CLR.L   (A0)+           ; NEXT
    MOVE.W  #4,(A0)+        ; COPY NAME FUN OR METHOD
    MOVE.L  COMPILEPROC(PC),A1
    MOVE.L  A1,D1
    CLR.W   (A0)+
    MOVE.L  A0,A6
    MOVE.L  10(A1),D0
    BEQ.S   .NM
    MOVE.L  D0,A1
    MOVE.L  OASCII(A1),A1
.COL:   MOVE.B  (A1)+,(A0)+
    BNE.S   .COL
    MOVE.B  #":",-1(A0)
.NM:    MOVE.L  D1,A1
    MOVE.L  14(A1),A1
    MOVE.L  (A1),A1
.CIL:   MOVE.B  (A1)+,(A0)+
    BNE.S   .CIL
    MOVE.L  A0,D0
    BTST    #0,D0
    BEQ.S   .NA
    CLR.B   (A0)+
.NA:    MOVE.L  A0,D0
    SUB.L   A6,D0
    MOVE.W  D0,-2(A6)

    MOVE.L  D1,A1           ; THIS BIT ADDS A "5" SELF EXTENSION
    MOVE.L  18(A1),D0
    BEQ.S   .NSELF
    MOVE.L  #$50004,(A0)+
    MOVE.W  LINENUM(PC),(A0)+
    MOVE.L  D0,A1
    MOVE.W  10(A1),(A0)+
.NSELF:
    CLR.W   (A0)+           ; TO BE ABLE TO DETECT A 5
    DONEM   A0

.NN:    GETM    A0          ; START REGULAR VAR DEBUG, 10 BYTES
    MOVE.L  A0,DBBEG
    CLR.L   (A0)+
    MOVE.W  D5,(A0)+
    MOVE.W  LINENUM(PC),(A0)+
    CLR.W   (A0)+
    MOVE.L  A0,DBCUR

.NDB:   TST.W   SCOPE
    BNE.S   .S
    CMP.W   #3,D5           ; must be DEF
    BNE ERROR35
    BRA.S   .XB
.S: CMP.W   #3,D5           ; musn't be DEF (LOCAL)
    BEQ ERROR35
    TST.W   PROCF
    BEQ ERROR35
    tst.w   DEFFLAG
    bne .XB
    cmp.w   #1,-2(a5)
    bne ERROR35
;    TST.W   DEFFLAG
;    BEQ ERROR35         ; NO LOCAL DEFS AFTER 1ST STAT.
.XB:MOVEQ   #0,D0           ; D0=XTRA ARRAY STACKSPACE
    CMP.W   #18,(A3)
    BEQ .BRCL
.XL:CMP.W   #IDENT,(A3)+
    BNE ERROR6
    MOVE.L  (A3)+,A0        ; A0=VAR
    MOVE.W  (A3),D2
    CMP.W   #11,D2          ; =
    BEQ .15
    TST.L   D6
    BNE ERROR30         ; WE WANT DEFARGS TILL THE END
.DAB:   CMP.W   #19,D2          ; :
    BEQ .2
    CMP.W   #29,D2          ; []
    BNE.S   .1
    ADDQ.L  #6,A3           ; ALSO SKIP ]OFFSET
    LDEF
    CMP.W   #VALUE,(A3)+
    BNE ERROR30
    MOVE.L  (A3)+,D2        ; D2=SIZE
    CMP.W   #30,(A3)+
    BNE ERROR34
    CMP.W   #19,(A3)+
    BNE ERROR0
    MOVE.W  (A3)+,D1
    CMP.W   #IOFF+60,D1
    BNE.S   .NAR
    BSR .SETREG
    MOVE.W  (A3)+,D1
.NAR:   CMP.W   #IOFF+41,D1
    BEQ .3
    CMP.W   #IOFF+42,D1
    BEQ .4
    CMP.W   #IOFF+47,D1
    BEQ .LIST
    CMP.W   #IOFF+20,D1
    BEQ .3_1
    CMP.W   #IOFF+21,D1
    BEQ .3_1
    CMP.W   #IOFF+22,D1
    BEQ .3_1
    CMP.W   #31,D1
    BEQ .3_1
    BRA .SK2
    BRA ERROR33
.1:
    MOVE.L  DBCUR(PC),D2        ; ADD DEBUG ADDRESSING MODE
    BEQ.S   .NDBA
    MOVE.L  D2,A6
    MOVE.W  10(A0),D2
    BTST    #3,5(A0)
    BEQ.S   .NREG
    ADD.W   #30000,D2
.NREG:  MOVE.W  D2,(A6)+
    MOVE.L  A6,DBCUR
.NDBA:
    CMP.W   #COM,(A3)+
    BEQ .XL
    CMP.W   #18,-(A3)
    BEQ     .BRCL

.E:
    MOVE.L  DBCUR(PC),D0        ; FINISH DEBUG INFOS
    BEQ.S   .NDBF
    MOVE.L  DBBEG(PC),A0
    MOVE.L  A0,D1
    ADD.L   #10,D1
    MOVE.L  D0,A1
    SUB.L   D1,D0
    BNE.S   .NZ
    DONEM   A0
    BRA.S   .NDBF
.NZ:    LSR.W   #1,D0
    MOVE.W  D0,8(A0)
    DONEH   A1
    MOVE.L  DBTAIL(PC),D0
    BNE.S   .LA2
    MOVE.L  A0,DBLIST
    BRA.S   .LN2
.LA2:   MOVE.L  D0,A1
    MOVE.L  A0,(A1)
.LN2:   MOVE.L  A0,DBTAIL
.NDBF:
    BRA JOBLOOP

.BRCL:  TST.L   D0          ; NO ARRAYS AS PROC ARGS
    BNE ERROR0
    tst.l   FIXUPSTACKREGS
    BEq .E
    move.w  .FIXATE,(A4)+
    BRA    .E
.FIXATE:
    subq.l   #4,a7
.DA:    ADDQ.L  #1,D6           ; HANDLE DEFARGS
    ADDQ.L  #2,A3
    CMP.W   #8,(A3)
    BNE.S   .DA1
    ADDQ.L  #2,A3
.DA1:   CMP.W   #1,(A3)+
    BNE .DA2
    ADDQ.L  #4,A3           ; SKIP VALUE
    MOVE.W  (A3),D2
    BRA .DAB
.DA2:
    tst.l   FIXUPSTACKREGS
    bne     .DA2_2
    move.l  .DAC2(PC),(A4)+
.DA2_2:
    subq.l  #2,a3
    MOVE.B  (A3),D2
    AND.B   #$FE,D2
    CMP.B   #4,D2
    BNE     ERROR30
    cmp.b   #5,(a3)+
    seq     d2
    and.l   #8,d2
    or.b    (a3)+,d2
    cmp.w   #12,d2
    bpl ERROR0
    move.l  a0,-(a7)
    lea .DAAR(PC,D2),A0
    tst.b   (a0)
    bne ERROR50
    st  (a0)
    move.l  (a7)+,a0
    move.w  .DAC(PC),(A4)
    or.w    d2,(A4)+
    addq.l  #1,FIXUPSTACKREGS
    move.w  (a3),d2
    BRA .DAB
.DAC:
    MOVE.L  D0,-(A7)
.DAC2:
    MOVEM.L D2-D7/A2-A6,-(A7)
.DAAR:
    DC.L    0,0,0,0


.15:    CMP.W   #1,D5
    BEQ .DA
    ADDQ.L  #2,A3
    LDEF

    
    MOVEM.L D0/D5/A0,-(A7)
    MOVE.L  A4,A0
    BSR TINYEXP         ; no EXP allowed!!!
    BTST    #3,ICODEPREFS+3
    BNE.S   .15a
    BSET    #3,ICODEPREFS+3
    BRA.S   .15b
.15a:
    cmp.l   .LASTVAL,D0
    bne     .15b
    move.l  a0,a4
.15b:
    move.l  d0,.LASTVAL
    MOVEM.L (A7)+,D0/D5/A0      ; NOTE:    DEF a=x   -->problems

    
    MOVEQ   #0,D2
    CMP.L   #$0013003C+IOFF,(A3)
    BNE.S   .NRLA
    ADDQ.L  #4,A3
    BSR .SETREG
    MOVEQ   #1,D2
.NRLA:
    MOVE.W  .16(PC),(A4)+
    JSR GVA0D4_9
    MOVE.B  4(A0),D4
    BEQ ERROR22
    TST D2
    BNE.S   .RDONE
    CMP.W   #19,(A3)
    BNE .1
    MOVEQ   #-1,D2          ; TEST: D2 WAS INTERIM

.2: ADDQ.L  #2,A3
.AGAIN:
    CMP.W   #IOFF+44,(A3)+
    BEQ.S   .PTR
    CMP.W   #IOFF+20,-2(A3)     ; a:LONG
    BEQ .1
    CMP.W   #IOFF+82,-2(A3)     ; a:FLOAT
    BNE .AG_00
    BSET    #5,5(A0)
    BRA ERROR87
.AG_00:
    CMP.W   #IOFF+61,-2(A3)     ; a:REAL
    BNE .REG
    BSET    #4,5(A0)
    BRA .1
.REG:   CMP.W   #IOFF+60,-2(A3)     ; a:REG
    BNE .OBJ

    BSR .SETREG

.RDONE: CMP.W   #COM,(A3)
    BEQ .1
    TST.W   (A3)
    BEQ .1
    BRA.S   .AGAIN
.PTR:
    CMP.W   #IOFF+39,(A3)+
    BNE ERROR33
    CMP.W   #IOFF+44,(A3)
    BEQ .MULTIPTR
.PTR_BACK:
    BSR.S   .SETT
    BRA .1

.MULTIPTR:
    MOVE.B  #0,16(A0)           ; references
.MULTI_00:
    CMP.W   #IOFF+44,(A3)
    BNE .PTR_BACK
    ADDQ.L  #2,A3
    CMP.W   #IOFF+39,(A3)+
    BNE ERROR33
    ADDQ.B  #1,16(A0)
    BRA .MULTI_00

.OBJ:   CMP.L   #-1,D2          ; NO INIT OBJ'S
    BEQ ERROR0
    CMP.W   #31,-2(A3)
    BNE ERROR33
    LDEF
    MOVE.L  (A3)+,A6
    MOVE.W  OSIZE(A6),D2
    EXT.L   D2
    MOVE.L  D2,D7
    MOVE.L  A6,(A0)         ; TYPE=OBJECT
    BSR.W   .5
    BRA .1

.SETT:  MOVE.W  (A3)+,D1
    CMP.W   #31,D1
    BEQ.S   .W3
    CMP.W   #IOFF+20,D1     ; "OF LONG"
    BNE.S   .W1
    LSL.L   #2,D2
    MOVE.W  #4,2(A0)
    BRA.S   .SK
.W1:    CMP.W   #IOFF+21,D1     ; "OF INT"
    BNE.S   .W2
    LSL.L   #1,D2
    MOVE.W  #2,2(A0)
    BRA.S   .SK
.W2:    CMP.W   #IOFF+22,D1     ; "OF CHAR"
    BNE ERROR33
.SK:    RTS
.W3:    MOVE.L  A4,-(A7)        ; "OF <object>"
    MOVE.L  (A3)+,A4
    MOVE.L  A4,(A0)
    MULU    OSIZE(A4),D2
    MOVE.L  (A7)+,A4
    BRA.S   .SK

.3_1:
    subq.l  #2,a3
    move.l  d2,d7
    bsr.s   .SETT
    bra .SK2

.3: MOVE.L  D2,D7
    CMP.W   #IOFF+45,(A3)       ; "OF"
    BNE.S   .SK2
    ADDQ.L  #2,A3
    CMP.W   #IOFF+44,(A3)
    BEQ     .ARR_00
    BSR.S   .SETT
.SK2:   CMP.L   #MAXINT,D2
    BPL ERROR31
    BSR     .5          ; a[100]:ARRAY OF <TYPE>
    BRA .1
.ARR_00:
    MOVE.B  #0,16(A0)
    LSL.L   #2,D2
.ARR_01:
    CMP.W   #IOFF+44,(A3)
    BNE     .ARR_02
    ADDQ.L  #2,A3
    CMP.W   #IOFF+39,(A3)+
    BNE ERROR33
    ADDQ.B  #1,16(A0)
    BRA .ARR_01
.ARR_02:
    MOVE.L  D2,-(A7)
    BSR     .SETT
    MOVE.L  (A7)+,D2
.ARR_03:
    CMP.L   #MAXINT,D2
    BPL ERROR31
    BSR.S   .5          ; a[100]:ARRAY OF <TYPE>
    BRA .1

.4: MOVE.L  D2,D7
    ADDQ.L  #1,D2
    CMP.L   #MAXINT,D2
    BPL ERROR31
    BSR.S   .5          ; a[100]:STRING
    MOVE.W  .11(PC),(A4)+
    SWAP    D7
    MOVE.W  .10(PC),(A4)+
    MOVE.L  D7,(A4)+
    MOVE.W  .LC(PC),(A4)+
    CMP.W   #3,D5
    BEQ.S   .14
    ADDQ.L  #8,XTRASTACK
    BRA .1
.14:    ADDQ.L  #8,GLOBSTACK
    BRA .1

.LIST:  MOVE.W  #4,2(A0)        ; SET TO "PTR TO LONG"
    MOVE.L  D2,D7
    LSL.L   #2,D2
    CMP.L   #MAXINT,D2
    BPL ERROR31
    BSR.S   .5          ; a[25]:LIST
    MOVE.W  .11(PC),(A4)+
    SWAP    D7
    MOVE.W  .10(PC),(A4)+
    MOVE.L  D7,(A4)+
    MOVE.W  .LC(PC),(A4)+
    CMP.W   #3,D5
    BEQ.S   .L1
    ADDQ.L  #8,XTRASTACK
    BRA .1
.L1:    ADDQ.L  #8,GLOBSTACK
    BRA .1

.5: CMP.L   #1,D2           ; INIT ARRAY
    BMI ERROR31
    MOVE.W  .6(PC),(A4)+
    BTST    #0,D2
    BEQ.S   .7
    ADDQ.L  #1,D2
.7: BTST    #1,D2
    BEQ.S   .7B
    ADDQ.L  #2,D2
.7B:    MOVE.L  D2,D3
    NEG.L   D3
    MOVE.W  D3,(A4)+
    ADD.L   D2,D0
    CMP.W   #3,D5
    BEQ.S   .12
    MOVE.L  XTRASTACK(PC),D3    ; LOC
    BSR .C
    MOVE.L  D3,XTRASTACK
    BRA.S   .13
.12:    MOVE.L  GLOBSTACK(PC),D3    ; GLOB
    BSR .C
    MOVE.L  D3,GLOBSTACK
.13:    MOVE.W  .8(PC),(A4)+

    MOVE.B  4(A0),D4
    BEQ ERROR22
;   CMP.B   #GLOBV,D4       ;
;   BNE.S   .20         ; SET REG
;   BCLR    #1,-2(A4)       ;
;.20:   MOVE.W  10(A0),(A4)+
;   CMP.B   #GLOBV,D4
;   BEQ .9
;   BSET    #1,-4(A4)
    JMP GVA0D4_9

.6: LEA 4(A7),A7
.8: MOVE.L  A7,2(A5)
.10:    MOVE.L  #1,-(A7)
.LC:    CLR.L   -(A7)
.11:    CLR.W   (A7)
.16:    MOVE.L  D0,2(A5)
.C: ADD.L   D2,D3
    MOVE.L  D3,D2
    RTS

.SETREG:BTST    #3,5(A0)
    BEQ ERROR50
    CMP.W   #2,D5
    BNE ERROR33         ; regvars only local
    RTS
.LASTVAL:
    DC.L    0
FIXUPSTACKREGS:
    DC.L    0

;*-*
;; 34
GETNRLOC:             ; 34 NRLOC IN -2(A4)
    MOVE.W  NRLOC(PC),-2(A4)
    BRA JOBLOOP
;*-*
;; 35
INSERTVAROFFDEST:         ; 35
    SUBQ.L  #2,A4
    MOVE.L  CURIDENTREC(PC),A0
    JSR GVA0D2_9
    BRA JOBLOOP
;*-*
;; 36
GETBRACKLEFT:         ; 36
    MOVE.W  (A3)+,D6
    CMP.W   #17,D6
    BNE ERROR23
    BRA JOBLOOP
;*-*
;; 37
GETBRACKRIGHT:            ; 37
    MOVE.W  (A3)+,D6
    CMP.W   #18,D6
    BNE ERROR23
    BRA JOBLOOP
;*-*
;; 38
DOINCBIN:             ; 38
    LEA CURACODE(PC),A0
    MOVE.L  8(A0),D3
    ADD.L   12(A0),D3
    SUB.L   A4,D3
    SUBQ.L  #8,D3           ; MAXREADSIZE
    CMP.L   #3000,D3
    BMI ERROR37

    CMP.W   #STR,(A3)+      ; D0-D6/ A3/A6
    BNE ERROR0
    ADDQ.L  #2,A3
    MOVE.W  (A3)+,D6        ; D6=WORDLENSTR
    MOVE.L  DOSBASE(PC),A6
    MOVE.L  A3,D1
    MOVE.L  #1005,D2
    JSR -30(A6)
    TST.L   D0
    BEQ ERROR28
    MOVE.L  D0,D5           ; D5=HANDLE

    MOVE.L  D5,D1
    MOVE.L  A4,D2
    JSR -42(A6)         ; READ
    MOVE.L  D0,D4           ; D4=READLEN
    MOVE.L  D5,D1
    JSR -36(A6)         ; CLOSE
    CMP.L   #2,D4
    BMI ERROR28
    SUB.L   D4,D3
    CMP.L   #3000,D3
    BMI ERROR37
    ADD.L   D4,A4
    BTST    #0,D4
    BEQ.S   .1
    MOVE.B  #0,(A4)+
.1:
    LSL.W   #1,D6
    EXT.L   D6
    ADD.L   D6,A3
    BRA JOBLOOP
;*-*
;; 39               LONG
DOLONG:               ; 39
.2: CMP.W   #IDENT,-2(A3)
    BEQ     .4
.3: bsr     ASM_GRABVALUE
    tst.l   d0
    bmi     ERROR30
    move.l  d1,(a4)+
    CMP.W   #COM,(A3)
    BNE.S   .1
    ADDQ.L  #2,A3
    BRA.S   .2
.1: BRA JOBLOOP
.4: MOVem.L D0-D7/A0-A2/A5/A6,-(a7)
    MOVE.L  (A3)+,a0
    cmp.b   #LAB,4(a0)
    bne ERROR4
    move.w  10(a0),d0
    bsr ADDBRANCHRELOC
    movem.l (a7)+,d0-a2/a5/a6
    cmp.w   #COM,(A3)
    BNE .1
    ADDQ.L  #2,a3
    bra .2
;*-*
;; 40               INT
DOINT:                ; 40
.2:
    bsr     ASM_GRABVALUE
    tst.l   d0
    bmi     ERROR30
    move.w  d1,(a4)+
    CMP.W   #COM,(A3)
    BNE.S   .1
    ADDQ.L  #2,A3
    BRA.S   .2
.1: BRA JOBLOOP
;*-*
;; 41               CHAR
DOCHAR:               ; 41
.2: bsr     ASM_GRABVALUE
    tst.l   d0
    bmi     .3
    move.b  d1,(a4)+
.5: CMP.W   #COM,(A3)
    BNE.S   .1
    ADDQ.L  #2,A3
    BRA.S   .2
.1: MOVE.L  A4,D0
    BTST    #0,D0
    BEQ.S   .6
    MOVE.B  #0,(A4)+
.6: BRA JOBLOOP
.3: CMP.W   #STR,(A3)+
    BNE ERROR30
    MOVE.W  (A3)+,D1        ; =REAL LEN
    MOVE.W  (A3)+,D0        ; =WORD LEN
    SUBQ.L  #1,D1
.4: MOVE.B  (A3)+,(A4)+
    DBRA    D1,.4
    ADDQ.L  #1,A3
    MOVE.L  A3,D0
    BTST    #0,D0
    BEQ.S   .5
    ADDQ.L  #1,A3
    BRA.S   .5
;*-*
;; 42
JOBINS:               ; 42
    MOVE.L  A5,-(A7)
    BSR.S   DOINSREC
    CMPA.L  (A7)+,A5
    BNE ERROR9
    BRA JOBLOOP

DOINSREC:
    MOVE.W  (A3)+,D7
    BEQ ERROR0
    CMP.W   #-1,D7
    BEQ ERROR0
    MOVE.L  A2,-(A7)
    BSR DOINS
    MOVE.L  (A7)+,A2
    RTS
;*-*
;; 43
EXPECT:               ; 43 IF FOLLOWING CODE IS PRESENT, CONTINUE
    MOVE.W  (A3),D0         ;    WITH JOB, ELSE STOP.
    CMP.W   (A2)+,D0
    BEQ.S   .1          ;    CONTINUE, EAT 1
.2: TST.W   (A2)+
    BNE.S   .2          ;    STOP, EAT ALL
    SUBQ.L  #2,A2
    BRA JOBLOOP
.1: ADDQ.L  #2,A3
    BRA JOBLOOP
;*-*
;; 44
SERROR:
    BRA ERROR0          ; 44
;*-*
;; 45
EXPECT2:              ; 45 IF FOLLOWING CODE IS PRESENT, CONTINUE
    MOVE.W  (A3),D0         ;    WITH JOB, ELSE FIND PAST ZERO.
    CMP.W   (A2)+,D0
    BEQ.S   .1          ;    CONTINUE, EAT 1
.2: TST.W   (A2)+
    BNE.S   .2          ;    STOP, EAT ALL TO NEXT ZERO
    BRA JOBLOOP
.1: ADDQ.L  #2,A3
    BRA JOBLOOP
;*-*
;; 46
JOBSKIP:              ; 46
    ADDQ.L  #2,A2
    BRA JOBLOOP
;*-*
;; 47
EXPECTASSIGN:         ; 47
    CMP.W   #ASSGN,(A3)+
    BNE ERROR2
    BRA JOBLOOP
;*-*
;; 48
EXPECTTO:             ; 48 CHOMEUR
    BRA JOBLOOP
;*-*
;; 49               FOR - middle part
DOMIDFOR:                 ; 49
    CMP.W   #IOFF+39,(A3)+      ; MUST BE "TO"
    BNE ERROR0                  ;

    bsr     EXP

    move.w  .P1(pc),(a4)+
    bsr     NEWLABEL
    move.l  d0,.ST
    bsr     ADDLABEL
    clr.l   (a4)+
    bsr     NEWLABEL
    move.l  d0,.SS
    bsr     ADDLABEL
    move.l  #1,(a4)+

.P1:bra.b   .cont
.ST:dc.l    0  ; to -
.SS:dc.l    0  ; step

.cont:
    move.w  .P2(pc),(a4)+
    move.l  .ST,d0
    bsr     ADDBRANCHRELOC    ; store destination


    cmp.w   #IOFF+40,(a3)
    bne     .cont2
    addq.l  #2,a3
    bsr     EXP
    move.w  .P2(PC),(a4)+
    move.l  .SS,d0            ; calculate step
    bsr     ADDBRANCHRELOC
.cont2:

    move.w  .MO(pc),(a4)+     ; get current value
    move.l  CURIDENTREC,a1
    jsr     GVA1D2_0          ; get var;

    bsr     NEWLABEL
    move.l  d0,.LB            ; entry point.
    bsr     ADDLABEL          ; here the code begins

    move.w  .TS(PC),(a4)+
    move.l  .SS(PC),D0        ; check step sign
    bsr     ADDBRANCHRELOC    ;

    move.l  .CD(PC),(A4)+
    move.w  .CD+4(PC),(A4)+
    move.l  .ST(pc),d0        ; compare actual against final
    bsr     ADDBRANCH         ; cmp [1]
    move.l  .CD+6(pc),(a4)+

    bsr     NEWLABEL
    move.l  d0,.FINE          ;
    bsr     ADDBRANCH

    move.l  .CD+10(pc),(a4)+  ;
    move.w  .CD+14(pc),(a4)+  ;
    move.l  .ST(pc),d0        ; as above...
    bsr     ADDBRANCH         ;
    move.l  .neg+4(pc),(a4)+
    move.l  .FINE,d0
    bsr     ADDBRANCH

    move.l  .FINE,(a5)+          ; label to be set after the loop code
    move.l  .LB,(a5)+            ; label to jump to perform next step
    move.l  .SS(PC),(a5)+            ; step position
    move.l  CURIDENTREC,(a5)+    ; current ident.
    bra     JOBLOOP

.P2:dc.w    $23c0,0,0      ; move.l d0,$xxx
.LB:dc.l    0
.FINE:dc.l  0
.TS:dc.w    $4ab9,0,0      ; tst.l $xxx
.CD:bmi.b   .neg           ; 2
    cmp.l   .CD(pc),d0      ; 2+[2]
    bgt     .CD            ; 4
    bra.B   .pos           ; 2
.neg:
    cmp.l   .CD(pc),d0      ; 2+[2]
    bmi     .CD            ; 4
.pos:
.MO:move.l  12(a5),d0


;*-*
;; 50               Initialization
ENDGLOBVAR:           ; 50
    TST.W   SCOPE
    BNE JOBLOOP
    MOVE.W  #-1,SCOPE
    TSTMOD
    BNE JOBLOOP
    BTST    #5,CODEPREFS
    BNE JOBLOOP
    MOVE.L  INITCODE(PC),(A4)+  ; DELEGATES
    MOVEQ   #6,D0
    MOVE.W  .1(PC),NEWOP
    BSR ADDBRANCH
    BTST    #0,CODEPREFS
    BNE     .SETUP_POWERPC      ; PPC!!!
    MOVE.L  INITCODE(PC),(A4)+  ; MAIN
    MOVEQ   #1,D0
    MOVE.W  .1(PC),NEWOP
    BSR ADDBRANCH
.BACK:
    MOVE.L  LIBINFO(PC),D0
    BNE.S   .5
    MOVE.L  GLOBSTACK(PC),D0
    BEQ.S   .3
    MOVE.W  CLEARXTRA(PC),(A4)+
    MOVE.L  D0,(A4)+
.3: MOVE.L  .4(PC),(A4)+
.8: MOVE.W  PROCRTS(PC),(A4)+
    BRA JOBLOOP
.4: MOVE.L  D0,-28(A4)
.1: JSR .1
.6: MOVE.L  -4(A4),A7
.7: MOVEQ   #-1,D0          ; SUCCES
.5: MOVE.L  .6(PC),(A4)+
    MOVE.W  .7(PC),(A4)+
    BRA.S   .8
.SETUP_POWERPC:
    MOVE.l  #$4e53ff70,(a4)+
    MOVE.l  #$244f24bc,(A4)+
    MOVEQ   #1,D0
    BSR ADDBRANCHRELOC
    MOVE.L  #8,D0
    LEA     .PPCCODE(PC),A0
.COPY:
    MOVE.L  (A0)+,(A4)+
    DBRA    D0,.COPY
    BRA     .BACK

.PPCCODE:
    CLR.L   4(A2)           ;4
    CLR.L   8(A2)           ;4
    MOVE.L  A7,12(A2)       ;4
    MOVE.L  A7,D2           ;2
    SUB.L   -64(A4),D2      ;4
    MOVE.L  D2,16(A2)       ;4
    MOVE.L  -132(A4),A6     ;4
    JSR     -30(A6)         ;4
    MOVE.L  20(A2),D0       ;4
    UNLK    A3              ;2

;*-*
;; 51
ELSEMAKELAB:          ; 51
    BSR.W   NEWLABEL
    MOVE.L  D0,(A5)+
    BRA JOBLOOP
;*-*
;; 52
ELSEUSELAB:           ; 52
    MOVE.L  -(A5),D0
    MOVE.L  D0,D4
    CLR.W   NEWOP
    BSR ADDBRANCH
    MOVE.L  D4,(A5)+
    BRA JOBLOOP
;*-*
;; 53
ELSEDEFLAB:           ; 53
    MOVE.L  -(A5),D0
    BSR ADDLABEL
    BRA JOBLOOP
;*-*
;; 54
ELSEWAISTELAB:            ; 54
    SUBQ.L  #4,A5
    BRA JOBLOOP
;*-*
;; Object blablabla
INHERITOBJECT:            ; A1=OBJECTHEAD, A2=MEMBERTAIL
    MOVEM.L D0-D2/A0/A4-A6,-(A7)    ; A3=SUPERCLASS INTERIM
    CMP.W   #31,(A3)+
    BNE ERROR39
    MOVE.L  (A3)+,A0        ; A0=SUPER
    MOVE.L  A0,OSUPER(A1)
    CMPA.L  A0,A1
    BEQ ERROR50
    MOVE.W  ODESTR(A0),ODESTR(A1)
.NID:   TST.W   OID(A0)
    BEQ ERROR39
    MOVE.W  OSIZE(A0),D1        ; SET D1=OFFSET
    EXT.L   D1
    LEA OMEMB+4(A0),A0      ; A0=SUPERMEMBERLIST
.XL:MOVE.L  -(A0),A0
    MOVE.L  A0,D0
    BEQ.S   DONE1
    GETM    A4
    CLR.L   (A4)+
    MOVE.L  (A0)+,(A4)+
    MOVE.W  (A0)+,(A4)+
    MOVE.W  OBJCOUNT(PC),(A4)+
    ADDQ.L  #2,A0
    MOVE.L  (A0)+,(A4)+
    MOVE.L  (A0)+,(A4)+
    LEA -16(A0),A0
    LEA -16(A4),A5
    MOVE.L  A5,(A2)
    LEA ONEXT(A5),A2
    CLR.L   (A2)
    DONEM   A4
    BRA.S   .XL
DONE1:  MOVE.L  D1,SUPERSIZE        ; STACK NEW OSIZE FROM SUPER
    MOVE.L  OSUPER(A1),A0
    LEA OMETHOD(A0),A0      ; A0=SUPER.METHODS
    MOVE.L  OMETHOD(A1),D1      ; D1=HEAD OWN.METHODS
    CLR.L   OMETHOD(A1)     ; REMAKE FROM SCRATCH
.L2:    MOVE.L  (A0),D0         ; M_NEXT
    BEQ .DONE2
    MOVE.L  D0,A0
    MOVE.L  M_NAME(A0),D0       ; D0=NAME
    TST.L   D1
    BEQ.S   .INH
    MOVE.L  D1,A4           ; A4=SEARCH IN OWN METHODS
    MOVEQ   #0,D1
.L3:    MOVE.L  D0,A5
    MOVE.L  M_NAME(A4),A6
.L4:    CMPM.B  (A5)+,(A6)+     ; STRCMP
    BNE.S   .C
    TST.B   -1(A6)
    BNE.S   .L4
    MOVE.L  (A4),A5         ; LINK IN OVERRIDING METHOD
    MOVE.L  OMETHOD(A1),(A4)
    MOVE.L  A4,OMETHOD(A1)
    MOVE.W  M_OFF(A0),M_OFF(A4) ; SAME OFFSET
    MOVE.L  M_PROC(A0),A6
    MOVE.W  (A6),D2
    MOVE.L  M_PROC(A4),A6
    CMP.W   (A6),D2
    BEQ.S   .ASAME
    BSET    #1,M_FLAGS(A4)
.ASAME: MOVE.L  A5,D2
    BEQ.S   .L2
    MOVE.L  A5,A6           ; IF THERE'S PART OF OWNMETHODS
.L5:    TST.L   (A5)            ; LEFT, RELINK IT.
    BEQ.S   .DD
    MOVE.L  (A5),A5
    BRA.S   .L5
.DD:    MOVE.L  D1,(A5)
    MOVE.L  A6,D1
    BRA.S   .L2
.C: MOVE.L  (A4),-(A7)      ; PICK NEXT OWN METHOD
    MOVE.L  D1,(A4)         ; RELINK D1
    MOVE.L  A4,D1
    MOVE.L  (A7),A4
    TST.L   (A7)+
    BNE.S   .L3
.INH:   GETM    A4
    MOVE.L  OMETHOD(A1),(A4)
    MOVE.L  A4,OMETHOD(A1)
    ADDQ.L  #4,A4
    MOVE.L  M_PROC(A0),(A4)+
    MOVE.W  M_TYPE(A0),(A4)+
    BSET    #0,-1(A4)       ; INHERITED
    MOVE.W  M_OFF(A0),(A4)+
    MOVE.L  M_NAME(A0),(A4)+
    DONEM   A4
    BRA .L2
.DONE2: MOVE.L  OSUPER(A1),A0       ; ADD NEW METHODS (D1)
    MOVE.W  ODEL(A0),D0     ; D0 = DELEGATESIZE
    MOVE.W  ODELOFF(A0),ODELOFF(A1)
    BSR.S   NEWMETHODS
    MOVEM.L (A7)+,D0-D2/A0/A4-A6
    MOVE.L  SUPERSIZE,D1
    RTS

NOINHERIT:
    MOVEM.L D0-D2/A0/A4/A6,-(A7)
    CLR.W   ODEL(A1)
    MOVE.L  OMETHOD(A1),D1
    BEQ.S   .1
    CLR.L   OMETHOD(A1)
    MOVEQ   #4,D0
    BSR NEWMETHODS
.1: MOVEM.L (A7)+,D0-D2/A0/A4/A6
    RTS

NEWMETHODS:
    TST.L   D1
    BEQ.S   .DONE3

    TST.W   D0
    BNE.S   .SAFE
    MOVEQ   #4,D0           ; INHERITANCE FROM METHOD-LESS OBJECT
.SAFE:
    MOVE.L  D1,A4
.L6:    MOVE.L  (A4),D2         ; NEW METHODS WITH OTHER M_OFF
    MOVE.L  OMETHOD(A1),(A4)
    MOVE.L  A4,OMETHOD(A1)
    MOVE.W  D0,M_OFF(A4)

    MOVE.L  M_NAME(A4),A6
    CMP.B   #'e',(A6)+
    BNE.S   .NEND
    CMP.B   #'n',(A6)+
    BNE.S   .NEND
    CMP.B   #'d',(A6)+
    BNE.S   .NEND
    TST.B   (A6)
    BNE.S   .NEND
    MOVE.L  M_PROC(A4),A0
    TST.W   (A0)            ; .end() NO ARGS
    BNE ERROR59
    BSET    #2,M_FLAGS(A4)
    MOVE.W  D0,ODESTR(A1)
.NEND:
    ADDQ.W  #4,D0
    MOVE.L  D2,A4
    TST.L   D2
    BNE.S   .L6
.DONE3: MOVE.W  D0,ODEL(A1)
    RTS

CREATEDELEGATEMEM:        ; A1=OBJECTHEAD, A2=MEMBERTAIL
    MOVEM.L A4-A5,-(A7)
    GETM    A4
    CLR.L   (A4)+           ; .NEXT
    MOVE.W  D1,(A4)+        ; .OFFSET
    MOVE.W  D1,ODELOFF(A1)
    ADDQ.W  #4,D1           ; SET D1=OFFSET
    MOVE.W  #$0100,(A4)+        ; .FLAGS
    MOVE.W  #4,(A4)+        ; .SIZE
    MOVE.W  OBJCOUNT(PC),(A4)+  ; .ID
    CLR.L   (A4)+           ; .ASCII (PRIVATE)
    LEA -12(A4),A5
    MOVE.L  A5,(A2)
    LEA ONEXT(A5),A2
    CLR.L   (A2)
    DONEM   A4
    MOVEM.L (A7)+,A4-A5
    RTS

SUPERSIZE:    DC.L    0
OBJCOUNT:     DC.W    0
OBJPRIV:      DC.W    0   ; 0=PUB / 1=PRIV

CHECKPR:
    MOVE.W  (A3),D0
    CMP.W   #IOFF+64,D0
    BNE.S   .y
    CLR.W   OBJPRIV
    ADDQ.L  #2,A3
    BRA.S   .x
.y: CMP.W   #IOFF+65,D0
    BNE.S   .x
    MOVE.W  #1,OBJPRIV
    ADDQ.L  #2,A3
.x:
    RTS


FINDDOUBLEMEMBER:         ; A0=MEMBER, A1=OBJH, USE D0, SAVE ALL
    MOVEM.L A3-A5,-(A7)
    LEA OMEMB+4(A1),A3
.XL:MOVE.L  ONEXT(A3),A3
    MOVE.L  A3,D0
    BEQ.S   .X
    CMP.L   A3,A0
    BEQ.S   .XL
    MOVE.L  OASCII(A0),A4
    MOVE.L  OASCII(A3),A5       ; ASCII
    MOVE.L  A5,D0
    BEQ.S   .XL
.L2:    CMPM.B  (A5)+,(A4)+
    BNE.S   .XL
    TST.B   -1(A5)
    BNE.S   .L2
    BRA ERROR43
.X: MOVEM.L (A7)+,A3-A5
    RTS

;*-*
;; 55
DOOBJECT:             ; 55
    MOVE.L  A2,-(A7)
    CLR.W   OBJPRIV
    ADDQ.W  #1,OBJCOUNT
    MOVEQ   #0,D1           ; D1=OFFSET !
    CMP.W   #31,(A3)+       ; objheader
    BNE ERROR39
    MOVE.L  (A3)+,A1        ; A1=OBJECT HEAD
    TST.W   OID(A1)
    BNE ERROR43             ; DOUBLE DECL OBJ
    MOVE.W  OBJCOUNT(PC),OID(A1)
    LEA OMEMB(A1),A2        ; A2=TAIL MEMLIST
    CLR.B   OFLAGS(A1)
    TST.W   EXPORTFLAG
    BEQ.S   .NE
    BSET    #0,OFLAGS(A1)       ; EXPORT OBJECT
.NE:
    TST.W   (A3)
    BEQ.S   .NOINH
    BSR CHECKPR
.z1:
    TST.W   (A3)
    BEQ.S   .NOINH
    CMP.W   #IOFF+45,(A3)+  ; OF <SUPERCLASS>
    BNE ERROR39
    BSR INHERITOBJECT       ; WANTS A1,A2, SAVES ALL
    BSR CHECKPR
.z2:
    BRA.S   .NOI
.NOINH: BSR NOINHERIT
.NOI:   TST.W   ODEL(A1)
    BEQ.S   .NVIRT
    CMP.W   #-1,ODELOFF(A1)
    BNE.S   .NVIRT
    BSR CREATEDELEGATEMEM   ; WANTS A1,A2, SAVES ALL
.NVIRT: TST.W   (A3)+
    BNE ERROR39
.XL:CMPI.W  #21,(A3)+
    BNE ERROR39
    MOVE.W  (A3)+,LINENUM   ; ERline
    CMP.W   #IOFF+49,(A3)   ; ENDOBJECT
    BEQ .X
    BSR CHECKPR
.z3:
    TST.W   (A3)
    BNE.S   .L2
    ADDQ.L  #2,A3
    BRA.S   .XL

.L2:
    CMP.W   #IOFF+75,(A3)
    BNE     .CONTINUE
    ADDQ.L  #2,A3
    CMP.W   #29,(A3)+
    BNE     ERROR0
    ADDQ.L  #4,A3
    MOVE.L  D1,.LAST_SIZE
    MOVE.L  D1,.TOTAL_SIZE
.UNION_LOOP:
    MOVE.L  .LAST_SIZE,D1
    BSR     OBJECT_UNION
    CMP.L   .TOTAL_SIZE,D1
    BLT     .UN_SKIP
    MOVE.L  D1,.TOTAL_SIZE
.UN_SKIP:
    CMP.W   #COM,(A3)+
    BEQ     .UNION_LOOP
    MOVE.L  .TOTAL_SIZE,D1
    CMp.W   #30,-2(A3)
    BNE     ERROR34
    BRA     .1
.LAST_SIZE:
    DC.L    0
.TOTAL_SIZE
    DC.L    0



.CONTINUE:
    CMP.W   #39,(A3)+       ; ONE OR MORE DEFS
    BNE ERROR31
    MOVE.L  (A3)+,A0        ; A0=IDENTPTR MEMBER
    BSR FINDDOUBLEMEMBER
    TST.W   OBJPRIV
    BEQ.S   .PUB
    BSET    #0,OFLAGS(A0)   ; MEMBER IS PRIVATE
.PUB:   MOVE.L  A0,(A2)
    LEA ONEXT(A0),A2
    CLR.L   (A2)
    TST.W   OID(A0)
    BNE ERROR43             ; DOUBLE DECL OBJ
    MOVE.W  D1,(A0)
    MOVE.W  #4,4(A0)
    MOVEQ   #4,D2           ; D2=ADDSIZE
    MOVE.W  (A3),D0
    CMP.W   #19,D0          ; :<TYPE>
    BNE .ARRAY
    ADDQ.L  #2,A3
    MOVE.W  (A3)+,D0
    CMP.W   #IOFF+20,D0
    BEQ.S   .O
    CMP.W   #IOFF+21,D0
    BNE.S   .2
    MOVEQ   #2,D2           ; INT
    BRA.S   .O
.2: CMP.W   #IOFF+22,D0
    BNE.S   .SOBJ
    MOVEQ   #1,D2           ; CHAR
.O: MOVE.L  D2,D3
.O2:    MOVE.W  OBJCOUNT(PC),6(A0)
    MOVE.W  D3,4(A0)
    ADD.L   D2,D1
    BTST    #0,1(A0)        ; CHECK ON WORD BOUNDARIES
    BEQ.S   .1
    BTST    #0,D2
    BNE.S   .1
    ADDQ.W  #1,(A0)
    ADDQ.L  #1,D1
.1: MOVE.W  (A3)+,D0
    BEQ .XL
    CMP.W   #COM,D0
    BEQ .L2
    BRA ERROR39
.X: ADDQ.L  #2,A3
    MOVE.W  D1,OSIZE(A1)
    TST.W   D1
    BEQ ERROR39         ; EMPTY OBJECT
    MOVE.L  (A7)+,A2
    BRA JOBLOOP         ; ONLY EXIT!
.SOBJ:  CMP.W   #IOFF+44,D0
    BEQ.S   .PTR
    CMP.W   #31,D0
    BNE ERROR33
    MOVE.L  (A3)+,A6
    MOVE.L  A6,OPTRTYPE(A0)
    BSET    #1,OFLAGS(A0)
    TST.W   OID(A6)
    BEQ ERROR42
    CMP.L   A1,A6
    BEQ ERROR39         ; RECURSIVE DEFINITION
    MOVE.W  4(A6),D2
    EXT.L   D2
    MOVEQ   #0,D3
    BRA.S   .O2
.PTR:   CMP.W   #IOFF+39,(A3)+
    BNE ERROR33
    BSR .GETT
    MOVEQ   #4,D2
    MOVEQ   #4,D3
    BRA.W   .O2
.ARRAY: CMP.W   #29,D0          ; []:ARRAY
    BNE.W   .O
    ADDQ.L  #6,A3           ; ALSO SKIP ]OFFSET
    CMP.W   #VALUE,(A3)+
    BNE ERROR30
    MOVE.L  (A3)+,D2
    CMP.W   #30,(A3)+
    BNE ERROR34
    CMP.W   #19,(A3)+
    BNE ERROR0
    CMP.W   #IOFF+41,(A3)
    BNE     .zz1
;    BNE ERROR0
    ADDQ.L  #2,A3
    CMP.W   #IOFF+45,(A3)       ; OF?
    BNE.S   .A2
    ADDQ.L  #2,A3
.zz1:
    BSR .GETT
    MOVE.L  D0,D3
    AND.L   #$FFFFFFF0,D3
    BEQ.S   .A3
    MOVE.L  D0,A6
    MOVE.W  OSIZE(A6),D0
.A3:    MULU    D0,D2
    BRA.S   .A2A
.A2:    MOVE.L  #1,OPTRTYPE(A0)
    BSET    #1,OFLAGS(A0)
.A2A:   BTST    #0,D2
    BEQ .A1
    ADDQ.L  #1,D2
.A1:    CMP.L   #MAXOBJSIZE,D2
    BPL ERROR31
    CMP.L   #1,D2
    BMI ERROR31
    MOVEQ   #0,D3
    BRA .O2
.GETT:  MOVE.W  (A3)+,D0        ; TRASHES ONLY D0 (TYPE)
    CMP.W   #31,D0              ; PTR/ARRAY OF/TO <OBJECT>
    BNE.S   .GT1
    MOVE.L  (A3)+,D0
    BRA.S   .GTE
.GT1:   CMP.W   #IOFF+20,D0     ; LONG
    BNE.S   .GT2
    MOVEQ   #4,D0
    BRA.S   .GTE
.GT2:   CMP.W   #IOFF+21,D0     ; INT
    BNE.S   .GT3
    MOVEQ   #2,D0
    BRA.S   .GTE
.GT3:   CMP.W   #IOFF+22,D0     ; CHAR
    BNE.S   .MUT
    MOVEQ   #1,D0
.GTE:   MOVE.L  D0,OPTRTYPE(A0)
    BSET    #1,OFLAGS(A0)
    RTS
.MUT:   CMP.W   #45,D0          ; MUTUALLY RECURSIVE PTR TO <OBJ>
    BNE ERROR33
    MOVE.L  D1,-(A7)
    MOVE.L  (A3)+,D1
    BSR FINDOBJ
    TST.L   D0
    BEQ ERROR42
    MOVE.L  (A7)+,D1
    BRA.S   .GTE

;; UNION

OBJECT_UNION:
    CMP.W   #29,(A3)
    BNE     ERROR0
    ADDQ.L  #6,A3
.CONTINUE
    CMP.W   #39,(A3)+       ; ONE OR MORE DEFS
    BNE ERROR33             ; Not a member
    MOVE.L  (A3)+,A0        ; A0=IDENTPTR MEMBER
    BSR FINDDOUBLEMEMBER    ; check if already defined
    TST.W   OBJPRIV         ; check if private
    BEQ.S   .PUB            ;
    BSET    #0,OFLAGS(A0)   ; MEMBER IS PRIVATE
.PUB:
    MOVE.L  A0,(A2)         ; Link a member (ok)
    LEA ONEXT(A0),A2        ; A0 = member (from 0)
    CLR.L   (A2)            ; A2 = member link pos
    TST.W   OID(A0)         ; Check if defined already
    BNE ERROR43             ; DOUBLE DECL OBJ
    MOVE.W  D1,(A0)         ; D1 = object offset;
    MOVE.W  #4,4(A0)        ; standard size = LONG
    MOVEQ   #4,D2           ; D2=ADDSIZE
    MOVE.W  (A3),D0         ; check if there's somethig after member
    CMP.W   #19,D0          ; :<TYPE>
    BNE .ARRAY              ;
    ADDQ.L  #2,A3           ;
    MOVE.W  (A3)+,D0        ;
    CMP.W   #IOFF+20,D0     ; LONG
    BEQ.S   .O              ;
    CMP.W   #IOFF+21,D0     ; INT
    BNE.S   .2
    MOVEQ   #2,D2           ;
    BRA.S   .O
.2: CMP.W   #IOFF+22,D0     ; CHAR
    BNE     .SOBJ
    MOVEQ   #1,D2
.O: MOVE.L  D2,D3
.O2:MOVE.W  OBJCOUNT(PC),6(A0)
    MOVE.W  D3,4(A0)        ; SIZEOF member
    ADD.L   D2,D1           ;
    BTST    #0,1(A0)        ; CHECK ON WORD BOUNDARIES
    BEQ.S   .1              ;
    BTST    #0,D2           ;
    BNE.S   .1              ;
    ADDQ.W  #1,(A0)         ;
    ADDQ.L  #1,D1           ;
.1: MOVE.W  (A3)+,D0        ;
;    BEQ .XL                ; anything else?
    CMP.W   #COM,D0
    BEQ .CONTINUE
    CMP.W   #30,D0          ; "]" - end of part 1
    BNE ERROR39

;    GETM A0                 ; fill an with empty field
;    MOVE.L  A0,(A2)
;    LEA ONEXT(A0),A2
;    MOVE.W  OBJCOUNT(PC),6(A0)
;    MOVE.W  #0,4(A0)        ;
;    MOVE.W  D1,(A0)         ;
;    BSET    #0,2(A0)        ; private
;    BSET    #1,2(A0)        ; typed?
;    MOVE.L  #0,8(A0)        ; noname
;    MOVE.L  #1,12(A0)       ;
;    MOVE.L  #0,16(A0)       ;
;    DONEM A0

    RTS

.X: ADDQ.L  #2,A3           ; skip sth
    MOVE.W  D1,OSIZE(A1)    ;
    TST.W   D1              ;
    BEQ ERROR39             ; EMPTY OBJECT
    MOVE.L  (A7)+,A2        ;
    BRA JOBLOOP             ; ONLY EXIT!

.SOBJ:
    CMP.W   #IOFF+44,D0     ; PTR
    BEQ.S   .PTR            ;
    CMP.W   #31,D0          ; :object
    BNE ERROR33             ;
    MOVE.L  (A3)+,A6        ;
    MOVE.L  A6,OPTRTYPE(A0) ;
    BSET    #1,OFLAGS(A0)   ;
    TST.W   OID(A6)         ;
    BEQ ERROR42             ;
    CMP.L   A1,A6           ;
    BEQ ERROR39             ; RECURSIVE DEFINITION
    MOVE.W  4(A6),D2        ;
    EXT.L   D2              ;
    MOVEQ   #0,D3           ;
    BRA     .O2             ;
.PTR:                       ;
    CMP.W   #IOFF+39,(A3)+  ; "PTR TO"
    BNE ERROR33             ;
    BSR .GETT               ;
    MOVEQ   #4,D2           ;
    MOVEQ   #4,D3           ;
    BRA.W   .O2             ;
.ARRAY:
    CMP.W   #29,D0          ; []:ARRAY
    BNE.W   .O              ;
    ADDQ.L  #6,A3           ; ALSO SKIP ]OFFSET
    CMP.W   #VALUE,(A3)+    ;
    BNE ERROR30             ;
    MOVE.L  (A3)+,D2        ;
    CMP.W   #30,(A3)+       ;
    BNE ERROR34             ;
    CMP.W   #19,(A3)+       ;
    BNE ERROR0              ;
    CMP.W   #IOFF+41,(A3)+  ;
    BNE ERROR0              ;
    CMP.W   #IOFF+45,(A3)   ; OF?
    BNE.S   .A2             ;
    ADDQ.L  #2,A3           ;
    BSR .GETT               ;
    MOVE.L  D0,D3           ;
    AND.L   #$FFFFFFF0,D3   ;
    BEQ.S   .A3             ;
    MOVE.L  D0,A6           ;
    MOVE.W  OSIZE(A6),D0    ;
.A3:
    MULU    D0,D2           ;
    BRA.S   .A2A            ;
.A2:
    MOVE.L  #1,OPTRTYPE(A0) ;
    BSET    #1,OFLAGS(A0)
.A2A:
    BTST    #0,D2           ;
    BEQ .A1                 ;
    ADDQ.L  #1,D2           ;
.A1:
    MOVE.W  D2,OSIZEOF(A6)  ;
    CMP.L   #MAXOBJSIZE,D2  ;
    BPL ERROR31             ;
    CMP.L   #1,D2           ;
    BMI ERROR31             ;
    MOVEQ   #0,D3           ;
    BRA .O2                 ;
.GETT:  MOVE.W  (A3)+,D0        ; TRASHES ONLY D0 (TYPE)
    CMP.W   #31,D0              ; PTR/ARRAY OF/TO <OBJECT>
    BNE.S   .GT1
    MOVE.L  (A3)+,D0
    BRA.S   .GTE
.GT1:   CMP.W   #IOFF+20,D0     ; LONG
    BNE.S   .GT2
    MOVEQ   #4,D0
    BRA.S   .GTE
.GT2:   CMP.W   #IOFF+21,D0     ; INT
    BNE.S   .GT3
    MOVEQ   #2,D0
    BRA.S   .GTE
.GT3:   CMP.W   #IOFF+22,D0     ; CHAR
    BNE.S   .MUT
    MOVEQ   #1,D0
.GTE:   MOVE.L  D0,OPTRTYPE(A0)
    BSET    #1,OFLAGS(A0)
    RTS
.MUT:   CMP.W   #45,D0          ; MUTUALLY RECURSIVE PTR TO <OBJ>
    BNE ERROR33
    MOVE.L  D1,-(A7)
    MOVE.L  (A3)+,D1
    BSR FINDOBJ
    TST.L   D0
    BEQ ERROR42
    MOVE.L  (A7)+,D1
    BRA.S   .GTE
;*-*
;*-*

;; 56               OptiIF
OPTIIF:               ; 56
;    btst    #2,ICODEPREFS+3
;    bne     .3
    cmp.l   #$488048c0,-4(a4)
    bne     .2
    moveq   #4,d0
    subq.l  #4,a4
    bra     .dosth
.2: cmp.w   #$49c0,-2(a4)
    bne     .4 ;.3
    moveq   #2,d0
    subq.l  #2,a4
    bra     .dosth
;.3: tst.l   LAST_CMD_ADR
;    bne     .TRY_LAST_CMD
.4:
    MOVE.L  (A2)+,(A4)+
    move.w  (a2)+,(A4)+
    bra JOBLOOP
.dosth:
    move.w  -2(a4),d1
    and.l   #$f0ff,d1
    cmp.w   #$50c0,d1
    beq     .dosth2
    add.l   d0,a4
    bra     .4
.dosth2:
    move.w  -(a4),d1
    cmp.w   #$56c0,d1
    bne     .skp
    cmp.w   #$4a80,-2(a4)
    bne     .skp
    subq.l  #2,a4
.skp:
    and.l   #$0f00,d1
    or.l    #$6000,d1
    eori.w  #$100,d1
    move.w  d1,(a4)+
    clr.w   (a4)+
    addq.l  #6,a2
    bra     JOBLOOP
;.TRY_LAST_CMD:             ;
;    move.l  LAST_CMD_ADR,a1;6
;    move.l  a4,d0          ;2
;    sub.l   a1,d0          ;2
;    cmp.l   #4,d0          ;6
;    bne     .4             ;4
;    move.w  (a1),d0        ;2
;    and.w   #$FFFE,d0      ;4
;    cmp.w   .TC1,d0        ;6
;    bne     .4             ;4
;    move.w  (a1),d0        ;2
;    and.l   #1,d0          ;6
;    or.w    .TC1+4,d0      ;6
;    move.w  d0,(a1)        ;2
;    addq.l  #6,a2          ;2
;    move.l  .TC1+8,(A4)+   ;6
;    bra     JOBLOOP        ;2


.TC1:
    move.l  -4(a4),d0
    tst.l   -4(a4)
    beq     .TC1
;*-*
;; 57
DOELSECH:             ; 57
    MOVE.W  #1,ELSECHECK
    BRA JOBLOOP
;*-*
;; 58
DORETURN:             ; 58
    TST.L   HANDLERPEA
    BEQ.S   .2
    TST.L   ENDPEA
    BNE.S   .2
    LEA .3(PC),A0
    MOVE.L  (A0)+,(A4)+
    MOVE.L  (A0)+,(A4)+
    MOVE.L  (A0)+,(A4)+
.2: TST.W   PROCF
    BEQ ERROR9
    MOVE.L  .1(PC),(A4)+
    MOVE.L  PROCEND(PC),D0
    CLR.W   NEWOP
    BSR ADDBRANCH
    BRA JOBLOOP
.1: BRA DORETURN
.3: MOVE.L  (A7)+,-88(A4)       ; (A5) ; ook: EXCEPT/Raise()
    MOVE.L  (A7)+,-76(A4)       ; PUT PREVIOUS HANDLER BACK (CODE)
    MOVE.L  (A7)+,-80(A4)       ; (STACK)
;*-*
;; 59
MAKEBRANCHL:          ; 59, like 8
    MOVE.L  LABPRES,D0
    MOVE.W  .1(PC),NEWOP
    BSR ADDBRANCH
    BRA JOBLOOP
.1: JMP .1
;*-*
;; 60
JOBINSIF:             ; 60
    TST.W   EXPRECC
    BNE.S   .1
    BSR.W   DOINSREC
    BRA JOBLOOP
.1: BSR EXP
    BRA JOBLOOP
;*-*
;; 61
JOBEXPIF:             ; 61
    MOVE.L  LABPRES(PC),-(A7)
    BSR EXP
    MOVE.L  (A7)+,LABPRES
    BRA JOBLOOP
;*-*
;; 62               STEP
JOBFORSTEP:           ; 62
    move.l  -(a5),a1
    move.l  a1,.ID
    move.w  .CD(pc),(a4)+
    jsr     GVA1D2_0
    move.l  -(a5),d0
    move.l  .CD2,(a4)+
    bsr     ADDBRANCH
    move.w  .CD3(pc),(a4)+
    move.l  .ID,a1
    jsr     GVA1D2_9
    move.l  .CD4(PC),(a4)+
    move.l  -(a5),d0
    jsr     ADDBRANCH
    bra     JOBLOOP

.ID:dc.l    0
.CD:move.l  12(a5),d0
.CD2:add.l  .CD2(pc),d0
.CD3:move.l d0,12(a5)
.CD4:bra    .CD4
;*-*
;; 63
HANDLEPROC:           ; 63
    CLR.L   ENDPEA
    CMP.W   #IOFF+56,(A3)
    BNE.S   .2
    ADDQ.L  #2,A3
    MOVE.W  #-1,HANDLEFLAG
    MOVE.L  .3(PC),(A4)+
    BRA JOBLOOP
.2: CLR.L   HANDLERPEA
    BRA JOBLOOP
.3: MOVEM.L D3-D7,-(A7)

HANDLEPROCREALLY:
    LEA .1(PC),A0
    MOVE.L  (A0)+,(A4)+
    MOVE.L  (A0)+,(A4)+
    MOVE.L  (A0)+,(A4)+
    MOVE.L  (A0)+,(A4)+
    MOVE.L  (A0)+,(A4)+
    MOVE.L  A4,HANDLERPEA
    MOVE.L  (A0)+,(A4)+
    MOVE.L  (A0)+,(A4)+
    RTS
.1: MOVE.L  -80(A4),-(A7)       ; STACK
    MOVE.L  -76(A4),-(A7)       ; CODE
    MOVE.L  -88(A4),-(A7)       ;
    MOVE.L  A7,-80(A4)
    LEA .1(PC),A0       ; TOTAL SIZE=5*.L, OFF=14
    MOVE.L  A0,-76(A4)
    MOVE.L  A5,-88(A4)

HANDLERPEA: DC.L    0
ENDPEA:     DC.L    0
;*-*
;; 64
DOEXCEPT:             ; 64
    MOVEQ   #0,D1           ; D1=DOFLAG
    CMP.W   #IOFF+28,(A3)
    BNE.S   .1
    MOVEQ   #1,D1
    ADDQ.L  #2,A3
.1: LEA EREST(PC),A0
    MOVE.L  (A0)+,(A4)+
    MOVE.L  (A0)+,(A4)+
    MOVE.L  (A0)+,(A4)+
    TST.L   D1
    BEQ.S   .2
    ADDQ.L  #4,A0           ; TAKE THE CLR INSTEAD OF BRA
.2: MOVE.L  (A0)+,(A4)+
    MOVE.L  A4,ENDPEA
    MOVE.L  HANDLERPEA,D0
    BEQ ERROR47
    MOVE.L  D0,A0
    SUB.L   A4,D0
    NEG.L   D0
    ADDQ.L  #2,D0
    MOVE.W  D0,-2(A0)
    BRA JOBLOOP
EREST:  MOVE.L  (A7)+,-88(A4)       ; (A5) ; ook: RETURN/Raise()
    MOVE.L  (A7)+,-76(A4)       ; PUT PREVIOUS HANDLER BACK (CODE)
    MOVE.L  (A7)+,-80(A4)       ; (STACK)
    BRA EREST           ; TO ENDPROC
    CLR.L   -84(A4)
;*-*
;; 65
CLOSEHANDLER:         ; 65
    TST.L   HANDLERPEA
    BEQ.S   .1
    MOVE.L  ENDPEA,D0
    BEQ ERROR47
    MOVE.L  D0,A0
    CMP.W   #-84,-2(A0)     ; CLR INSTEAD OF BRA
    BEQ.S   .1
    SUB.L   A4,D0
    NEG.L   D0
    ADDQ.L  #2,D0
    MOVE.W  D0,-2(A0)
.1: BRA JOBLOOP
;*-*
;; 66
PUSHTYPE:             ; 66
    MOVE.W  TYPELAB(PC),(A5)+
    BRA JOBLOOP
;*-*
;; 67
POPTYPE:              ; 67
    MOVE.W  -(A5),TYPELAB
    BRA JOBLOOP
;*-*
;; 68               RTS/RTD
RTSRTD:               ; 68
    CMP.W   #IOFF+78,(A3)
    BEQ .WITH
    MOVE.W  NRARG(PC),D0
    BEQ.S   .RTS
    MOVE.W  .RTD(PC),(A4)+
    LSL.W   #2,D0
    MOVE.W  D0,(A4)+
    BRA JOBLOOP
.RTS:   MOVE.W  PROCRTS(PC),(A4)+
    BRA JOBLOOP
.RTD:   RTD #4
.WITH:
    ADDQ.L  #2,A3
    MOVE.W  (A3)+,D0
    CMP.W   #$100+47,D0
    BEQ .RTR
    CMP.W   #$100+48,D0
    BNE ERROR90
    MOVE.W  .1(PC),(A4)+
    TST.W   (A3)+
    BNE ERROR0
    BRA JOBLOOP
.RTR:
    MOVE.W  .2(PC),(A4)+
    TST.W   (A3)+
    BNE ERROR0
    BRA JOBLOOP
.1: RTE
.2: RTR
.3:
;*-*
;; 69
DONEW:                ; 69
    ;SUBQ.L #2,A3
    MOVEQ   #1,D0
    BSR NEWEXP
    BRA JOBLOOP
;*-*
;; 70
EXPECTRETURNIS:           ; 70
    MOVE.W  (A3),D0
    CMP.W   #IOFF+51,D0
    BEQ.S   .1
    CMP.W   #IOFF+62,D0
    BEQ.S   .1
.2: TST.W   (A2)+
    BNE.S   .2
    SUBQ.L  #2,A2
    BRA JOBLOOP
.1: ADDQ.L  #2,A3
    BRA JOBLOOP


BEGL2:  MACRO
    CMP.W   #21,(A3)+
    BNE ERROR12

    ;MOVE.W LINENUM(PC),-(A7)

    MOVE.W  (A3)+,LINENUM
    MOVE.L  A3,INTERMED

    ;TST.L  LINEBUF
    ;BEQ.S  .ALB
    ;CMP.W  LINENUM(PC),(A7)
    ;BEQ.S  .ALB
    ;BSR    ADDLINEDBG
;.ALB:  ADDQ.L  #2,A7

    ENDM

BEGL1:  MACRO
    TST.W   (A3)+
    BNE ERROR12
    ENDM

BEGL:   MACRO
    BEGL1
    BEGL2
    ENDM

BLOCK:  MACRO               ; \1=ID, \2=IOFF1, \3=IOFF2, \4=IOFF3
    MOVEM.L D5-D7/A6,-(A7)
    BEGL1
.CCCL:  BSR WRITELINENUM        ; TRASHES D7
    BEGL2
    MOVE.W  (A3)+,D7
    CMP.W   \2,D7
    BEQ .CCCC
    CMP.W   \3,D7
    BEQ .CCCC
    CMP.W   \4,D7
    BEQ .CCCC
    BRA.S   .CCCN
.CCCC:  CMP.W   \1,-2(A5)
    BNE.S   .CCCN
    SUBQ.L  #2,A3
    BRA.S   .CCCO
.CCCN:  BSR DOINSMAIN
    MOVE.L  A4,CURACODE
    JSR CHECK3
    BRA.S   .CCCL
.CCCO:  MOVEM.L (A7)+,D5-D7/A6
    ENDM

BLOCK2: MACRO               ; note: same as BLOCK, without 3x check
    MOVEM.L D5-D7/A6,-(A7)
    BEGL1
.CCCL:  BSR WRITELINENUM        ; TRASHES D7
    BEGL2
    MOVE.W  (A3)+,D7
    CMP.W   \2,D7
    BEQ .CCCC
    BRA.S   .CCCN
.CCCC:  CMP.W   \1,-2(A5)
    BNE.S   .CCCN
    SUBQ.L  #2,A3
    BRA.S   .CCCO
.CCCN:  BSR DOINSMAIN
    MOVE.L  A4,CURACODE
    JSR CHECK3
    BRA.S   .CCCL
.CCCO:  MOVEM.L (A7)+,D5-D7/A6
    ENDM

RANGC:  MACRO               ; \1=DX
    TST.L   \1
    BMI ERROR31
    CMP.L   D7,\1
    BPL ERROR31
    ENDM

PUTRA:  MACRO               ; \1=DX,\2=TRASH.DX
    MOVE.L  \1,\2
    LSL.L   #1,\2
    TST.W   0(A6,\2.L)
    BNE ERROR50
    MOVE.W  D0,0(A6,\2.L)
    ENDM
;*-*
;; 71               SELECT OF
SELECTOF:             ; 71
    BSR     ASM_GRABVALUE
    TST.L   D0
    BMI JOBLOOP
    MOVE.L  D1,D7
;    CMP.W   #VALUE,(A3)
;    BNE JOBLOOP
;    ADDQ.L  #2,A3
;    MOVE.L  (A3)+,D7        ; D7=RANGE
    CMP.L   #1,D7
    BMI ERROR31
    CMP.L   #1024,D7
    BPL ERROR31
    CMP.W   #IOFF+45,(A3)+
    BNE ERROR0
    MOVE.L  D7,-(A7)
    BSR EXP
    MOVE.L  (A7)+,D7
    BSR NEWLABEL
    MOVE.L  D0,D5           ; D5=ENDLABEL
    BSR NEWLABEL
    MOVE.L  D0,D6           ; D6=DEFAULTLABEL
    MOVE.L  .C1(PC),(A4)+
    CLR.W   (A4)+
    CLR.W   NEWOP
    BSR ADDBRANCH
    MOVE.W  .C2(PC),(A4)+
    MOVE.L  D7,(A4)+
    MOVE.L  .C3(PC),(A4)+
    MOVE.L  D6,D0
    BSR ADDBRANCH
    MOVE.W  .C4(PC),(A4)+
    MOVE.L  .C5A(PC),(A4)+
    MOVE.L  .C5B(PC),(A4)+
    MOVE.L  A4,A6           ; A6=TABLESTART
    MOVE.L  D7,D0
    SUBQ.L  #1,D0
    MOVEQ   #0,D1
.FILL:  MOVE.W  D1,(A4)+
    DBRA    D0,.FILL
    BEGL
    MOVE.W  #8,(A5)+        ; SELECT_OF IDENT
.XL:MOVE.W  (A3)+,D0        ; PARSE ANY #OF CASE'S UNTIL DEF/ENDSEL
    CMP.W   #IOFF+11,D0
    BEQ .DEFA
    CMP.W   #IOFF+12,D0
    BEQ .ENDS
    CMP.W   #IOFF+10,D0
    BNE ERROR0
    MOVE.L  A4,D0
    SUB.L   A6,D0           ; D0=CURRENT OFFSET
    BRA.S   .RST
.RANGL: MOVE.L  (A3)+,D1        ; D1=1STVALUE
    CMP.W   #IOFF+39,(A3)
    BEQ.S   .RR
    RANGC   D1
    PUTRA   D1,D2
    BRA.S   .RNEXT
.RR:    ADDQ.L  #2,A3
    CMP.W   #VALUE,(A3)+
    BNE ERROR30
    MOVE.L  (A3)+,D2        ; D2=ENDVALUE
    RANGC   D1
    RANGC   D2
    CMP.W   D1,D2
    BMI ERROR50
.TOL:   PUTRA   D1,D3
    ADDQ.L  #1,D1
    CMP.L   D2,D1
    BLE.S   .TOL
.RNEXT: CMP.W   #COM,(A3)
    BNE.S   .RDONE
    ADDQ.L  #2,A3
.RST:   CMP.W   #VALUE,(A3)+
    BNE ERROR30
    BRA.S   .RANGL
.RDONE: BLOCK   #8,#IOFF+10,#IOFF+11,#IOFF+12
    MOVE.L  .C6(PC),(A4)+
    CLR.W   NEWOP
    MOVE.L  D5,D0
    BSR ADDBRANCH
    BRA .XL
.DEFA:  BSR .FDEF
    BSR AAAAAA
    ADDQ.L  #2,A3
    BRA.S   .ENDS2
.ENDS:  BSR .FDEF
.ENDS2: BSR STOPJOB
    MOVE.L  D5,D0
    BSR ADDLABEL
    CMP.W   #8,-(A5)
    BNE ERROR9
    BRA JOBLOOP
.FDEF:  MOVE.L  D6,D0
    BSR ADDLABEL
    MOVE.L  A4,D0
    SUB.L   A6,D0
    MOVE.L  A6,A0
    MOVE.L  D7,D1
    SUBQ.L  #1,D1
.FDL:   TST.W   (A0)+
    BNE.S   .NEXT
    MOVE.W  D0,-2(A0)
.NEXT:  DBRA    D1,.FDL
    RTS
.C1:    TST.L   D0
    BMI .C1
.C2:    CMP.L   #1,D0
.C3:    BPL .C1
.C4:    LSL.L   #1,D0
.C5A:   MOVE.W  .C6(PC,D0.L),D0
.C5B:   JMP .C6(PC,D0.W)
.C6:    ; TABLE START
    BRA .C2
AAAAAA: BLOCK2  #8,#IOFF+12
    RTS
;*-*
;; 72
EXPECTOFOBJECT:           ; 72
    cmp.w   #IOFF+93,(a3)
    bne     .1
    addq.l  #2,a3
.1: CMP.W   #IOFF+45,(A3)
    BNE JOBLOOP
    ADDQ.L  #2,A3           ; of_object
    CMP.W   #31,(A3)+
    BNE ERROR40
    MOVE.L  (A3)+,A0        ; A0=OBJ
    MOVE.L  COMPILEPROC(PC),A6
    MOVE.L  22(A6),A1
    BTST    #1,9(A1)
    BNE ERROR55
    MOVE.L  18(A6),A6       ; A6=SELF
    MOVE.L  A0,(A6)         ; SET SELF AS PTR TO OBJ
    MOVE.W  .CODE(PC),(A4)+
    JSR GVA6D0_9
    BRA JOBLOOP
.CODE:  MOVE.L  A0,2(A5)
;*-*
;; 73
SAVEREGSPROC:         ; 73
    MOVE.L  COMPILEPROC(PC),A0  ; COMPUTE MOVEMMASK
    MOVE.B  3(A0),D0
    BEQ.S   .NR
    EXT.W   D0
    SUBQ.W  #1,D0
    MOVEQ   #7,D1
    MOVEQ   #0,D2
.XL:BSET    D1,D2
    SUBQ.W  #1,D1
    DBRA    D0,.XL
    MOVE.W  D2,PROCMASK
    SAVER   #-1,D0
    MOVE.W  D0,PROCMASKREV
.NR:    BRA JOBLOOP
;*-*
;; 74
DOEND:                ; 74
    MOVE.W  #-1,.ISM
    CMP.W   #IDENT,(A3)+
    BNE ERROR6
    MOVE.L  (A3)+,A0        ; A0=IDENT
    TST.B   4(A0)
    BEQ ERROR22
    CMP.B   #LAB,4(A0)
    BEQ ERROR6

    MOVE.L  (A0),D0         ; D0=OBJECTSIZE
    SUB.L   A6,A6           ; A6=OBJECT | NIL
    CMP.L   #5,D0
    BMI.S   .0
    MOVE.L  D0,A6
    MOVE.W  OSIZE(A6),D0
    EXT.L   D0

    CMP.W   #35,(A3)
    BNE.S   .0
    CMP.W   #39,2(A3)
    BNE .0
    ADDQ.L  #4,A3
    MOVE.L  (A3)+,A1        ; A1=MEMBER
    BSR FINDMEMBER      ; D1=TRASH,a1=first->REAL,a6=obj
    MOVE.W  OOFF(A1),.ISM
    BTST    #1,OFLAGS(A1)
    BEQ ERROR40
    CMP.W   #4,OSIZE(A1)
    BNE ERROR40
    SUB.L   A6,A6
    MOVE.L  OPTRTYPE(A1),D0
    BEQ.W   ERROR40
    BMI.S   .OO
    CMP.L   #5,D0
    BMI.S   .CON
.OO:    MOVE.L  D0,A6
    MOVE.W  OSIZE(A6),D0
    EXT.L   D0
.CON:
    MOVE.W  .ST2(PC),(A4)+
    JSR GVA0D1_0
    MOVE.W  .ST3(PC),(A4)+
    MOVE.W  .ISM(PC),(A4)+
    BRA.S   .XB
.0:
    MOVE.W  .ST(PC),(A4)+
    JSR GVA0D1_0
.XB:MOVE.L  A4,.BEQS
    MOVE.L  .BEQ(PC),(A4)+

    MOVE.L  A6,D1
    BEQ.S   .ND
    BSR DESTR
.ND:
    CMP.W   #29,(A3)
    BNE.S   .1
    TST.L   D0
    BMI ERROR50
    ADDQ.L  #6,A3           ; ALSO SKIP ]OFFSET
    MOVEM.L A0/D0/A6,-(A7)      ; END p[exp]
    BSR EXP
    MOVEM.L (A7)+,A0/D0/A6
    CMP.W   #30,(A3)+
    BNE ERROR34
    CMP.W   #1,D0
    BEQ.S   .NM
    CMP.W   #2,D0
    BNE.S   .N1
    MOVE.W  .LSL1(PC),(A4)+
    BRA.S   .NM
.N1:    CMP.W   #4,D0
    BNE.S   .N2
    MOVE.W  .LSL2(PC),(A4)+
    BRA.S   .NM
.N2:    MOVE.W  .M(PC),(A4)+
    MOVE.W  D0,(A4)+
.NM:    MOVE.W  .S1(PC),(A4)+
    BRA.S   .2
.1: TST.L   D0
    BMI.S   .1B
    MOVE.W  .S2(PC),(A4)+       ; just END p
    MOVE.W  D0,(A4)+
    BRA.W   .2
.1B:    ;MOVE.W .S1(PC),(A4)+
.2: MOVE.L  A0,-(A7)
    MOVEQ   #109+10,D0      ; D0=FASTDISPOSE
    MOVE.B  #-1,EFUNCBYTE+109   ; fastdispose=110
    MOVE.L  .4(PC),(A4)+        ; GEN CALL
    TSTMOD
    BNE.S   .MOD
    MOVE.W  .5(PC),NEWOP
    BSR ADDBRANCH
    BRA.S   .CC
.MOD:   SUBQ.L  #4,A4
    MOVE.W  .5(PC),(A4)+
    BSR ADDBRANCHRELOC
    MOVE.W  D0,-2(A4)
.CC:    MOVE.L  (A7)+,A0
    MOVE.W  .A(PC),(A4)+
    BSR .NUKEV
    MOVE.L  .BEQS(PC),A1
    MOVE.L  A4,D0
    SUB.L   A1,D0
    SUBQ.L  #2,D0
    MOVE.B  D0,1(A1)
    CMP.W   #COM,(A3)+
    BEQ DOEND
    SUBQ.L  #2,A3
    BRA JOBLOOP
.ISM:   DC.W    0
.M: MULU    #6,D0
.LSL1:  LSL.L   #1,D0
.LSL2:  LSL.L   #2,D0
.S1:    MOVE.L  D0,-(A7)
.S2:    PEA 1.W
.A: ADDQ.L  #8,A7
.5: JSR .M
.4: BSR.W   .M
.ST:    MOVE.L  2(A5),D0
.ST2:   MOVE.L  2(A5),A0
.ST3:   MOVE.L  4(A0),D0
.BEQ:   BEQ.S   .A
    MOVE.L  D0,-(A7)
.BEQS:  DC.L    0

.NUKEV: MOVE.W  .ISM(PC),D0
    BPL.S   .INUKE
    MOVE.W  .NUKE(PC),(A4)+
    JMP GVA0D1_0
.INUKE: MOVE.W  .NUKE2(PC),(A4)+
    JSR GVA0D1_0
    MOVE.W  .NUKE3(PC),(A4)+
    MOVE.W  D0,(A4)+
    RTS
.NUKE:  CLR.L   2(A5)
.NUKE2: MOVE.L  2(A5),A0
.NUKE3: CLR.L   4(A0)

DESTR:  MOVE.W  ODESTR(A6),D2       ; GETS OBJ=A6, OSIZE=D0
    BMI.W   .XX         ; D2=ENDOFF
    MOVE.W  .7(PC),(A4)+
    BSR.S   .GEND
    MOVE.W  .6A(PC),(A4)+
    MOVE.W  D2,(A4)+
    MOVE.W  .6B(PC),(A4)+
.XX:    TST.W   ODEL(A6)
    BEQ.S   .XXX
    MOVE.W  .GS(PC),(A4)+
    BSR.S   .GEND
    MOVE.W  .GS2(PC),(A4)+
    MOVEQ   #-1,D0          ; SIGNAL SIZE ALREADY on (A7)
.XXX:   RTS
.GS:    MOVE.L  (A7),A0
.GS2:   MOVE.L  (A1),-(A7)
.7: MOVEA.L D0,A0
.6: MOVE.L  (A0),A1
.6X:    MOVE.L  2(A0),A1
.6A:    MOVE.L  4(A1),A1
.6B:    JSR (A1)
.GEND:  TST.W   ODELOFF(A6)
    BMI ERROR71
    BHI .U
    MOVE.W  .6(PC),(A4)+
    RTS
.U: MOVE.W  .6X(PC),(A4)+
    MOVE.W  ODELOFF(A6),(A4)+
    RTS
;*-*
;; 75               do EXIT
; GETS BRANCH TO FILL AT -2(A4)

FILLEXIT:             ; 75
    MOVE.W  -2(A5),D0
    CMP.W   #3,D0
    BNE.S   .1
    MOVE.L  -10(A5),D0
    BRA.S   .D
.1:
    CMP.W   #4,D0
    BNE ERROR0
    MOVE.L  -4-4-4-4-4(a5),d0
    TST.W   -4(a5)
    beq     .D
    move.l  -4-4-4-4(a5),d0
    cmp.w   #2,-4(a5)
    ble     .D
    move.l  -4-4-4(a5),d0
.D: BCHG    #0,-4(A4)       ; negate CC
    CLR.W   NEWOP
    BSR ADDBRANCH
    BRA JOBLOOP
;*-*
;; 76               do SUPER
DOSUPER:              ; 76
    BSR SUPEREXP
    BRA JOBLOOP
;*-*
;; 77               Fix stack
FIXUPSTACK:
    MOVE.L  FIXUPSTACKREGS,D0
    BEQ .X
    ADDQ.L  #1,D0
    LSL.L   #2,D0
    MOVE.W  .c,(A4)+
    MOVE.W  D0,(A4)+
    MOVE.L  .r(PC),(A4)+
.X:
    BRA JOBLOOP
.c: LEA 0(A7),A7
.r: MOVEM.L (A7)+,D2-D7/A2-A6
;*-*
;; 78               Fix FOR stack
FIXFORSTACK:
   RTS
FIXFORSTACKSIZE:
    DC.W    0
;*-*
;; 79               Section
JOB_SECTION:
    BTST        #2,CODEPREFS+3
    BEQ         ERROR44
    MOVE.L      HunkList,A0
    MOVE.L      A4,H_END(A0)
    move.l      a0,d0

    CMP.W   #IOFF+84,(A3)+
    BNE     .1
    MOVE.L  #$3E9,D1
    BRA     .X
.1: CMP.W   #IOFF+85,-2(A3)
    BNE     ERROR97
    MOVE.L  #$3EA,D1
.X: CMP.W   #COM,(A3)
    BNE     .XX
    ADDQ.L  #2,A3
    CMP.W   #IOFF+86,(A3)+
    BNE     .X2
    bset    #30,d1
    BRA     .XX
.X2:CMP.W   #IOFF+87,-2(A3)
    BNE     ERROR97
    BSET    #31,D1
.XX:
    GETM        A0
    MOVE.L      HunkList(PC),(A0)+
    MOVE.L      A0,HunkList
    exg.L       A0,D0
    move.l      d0,H_PREV(A0)
    exg.l       a0,d0
    MOVE.L      A4,(A0)+
    move.l      D1,(a0)+
    clr.l       (a0)+
    clr.l       (a0)+
    clr.l       (a0)+
    DONEM       A0
    ADDQ.L      #1,NumHunks
    bra         JOBLOOP
;*-*
;; 80               Automatic procedure
JOB_AUTOPROC:
    CMP.W   #IOFF+90,(A3)
    BMI     JOBLOOP
    CMP.W   #IOFF+91,(A3)
    BGT     JOBLOOP
    TSTMOD
    BEQ     ERROR49
    MOVE.L  COMPILEPROC(PC),A0
    TST.W   (A0)
    BNE     ERROR23
    BTST    #1,2(A0)
    BNE     ERROR39

    MOVEQ   #0,D0
    MOVE.W  (A3)+,D0
    SUB.W   #IOFF+90-6,D0
    BSET    D0,2(A0)
    MOVE.L  14(A0),A0
    BSET    #2,5(A0)
    BRA JOBLOOP
;*-*
;; 81               optimize cache line
JOB_OPTCACHE:
    bsr     OPTCACHELINE
    bra     JOBLOOP
;*-*
;*-*

JOBROUTTAB:
    DC.L    JOBOUT,GETPARAMLABEL,JOBEXP,GETPARAMVAR,GETCOMMA; 0
    DC.L    SAVESTIDENT,FORWARDREFERENCE,CHECKSTIDENT       ; 5
    DC.L    MAKEBRANCH,COPY2,COPY4,COPYN,COPY6,COPY8        ; 8
    DC.L    COPY10,REMEMBERLAB,EXPORNILL,PROCFLAGON         ; 14
    DC.L    PROCFLAGOFF,CHECK2LAB,REMINDCURPOS,POPLAB       ; 18
    DC.L    INSERTVAROFF,PUSHVAR,POPVAR,PUSHLAB             ; 22
    DC.L    PUSHLAB2,POPLAB2,NEWLAB2,MAKEBRANCH2            ; 26
    DC.L    SETFLAG,SKIPFLAG,CLEARFLAG,SKIPDEFLOCAL,GETNRLOC; 30
    DC.L    INSERTVAROFFDEST,GETBRACKLEFT,GETBRACKRIGHT     ; 35
    DC.L    DOINCBIN,DOLONG,DOINT,DOCHAR,JOBINS,EXPECT      ; 38
    DC.L    SERROR,EXPECT2,JOBSKIP,EXPECTASSIGN,EXPECTTO    ; 44
    DC.L    DOMIDFOR,ENDGLOBVAR,ELSEMAKELAB,ELSEUSELAB      ; 49
    DC.L    ELSEDEFLAB,ELSEWAISTELAB,DOOBJECT,OPTIIF        ; 53
    DC.L    DOELSECH,DORETURN,MAKEBRANCHL,JOBINSIF,JOBEXPIF ; 57
    DC.L    JOBFORSTEP,HANDLEPROC,DOEXCEPT,CLOSEHANDLER     ; 62
    DC.L    PUSHTYPE,POPTYPE,RTSRTD,DONEW,EXPECTRETURNIS    ; 66
    DC.L    SELECTOF,EXPECTOFOBJECT,SAVEREGSPROC,DOEND      ; 71
    DC.L    FILLEXIT,DOSUPER,FIXUPSTACK,FIXFORSTACK         ; 75
    DC.L    JOB_SECTION,JOB_AUTOPROC,JOB_OPTCACHE,JOBOUT,JOBOUT          ; 79

