;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ;
;                                                                       ;
;   Amiga E Compiler/Assembler/Linker by $#%! in 1991/92/93/94/95       ;
;   CreativE 2.06 by Tomasz Wiszkowski (error/bb)                       ;
;                                                                       ;
; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ;

CREATIVE_VERSION: MACRO
    DC.B    "CreativE "
    DC.B    "2.10 (30.12.99)"
    DC.B    " by Tomasz Wiszkowski",10
    ENDM

VERSION_020 EQU 0       ; just a couple of changes; no speedup...
MY_EXP_HANDLER EQU 0    ; unfinished! Keep clear.
MULTIPLE_PTRS EQU 1     ; keep it off - not finished yet.

    IFEQ VERSION_020
GOSR: MACRO
    JSR \1
    ENDM
    ELSE
GOSR: MACRO
    BSR.L \1
    ENDM
    ENDC


S:  MOVE.L  A7,INITSTACK
    GOSR INITALL
    GOSR INITBUFFERS
    GOSR CLEARHASHTAB
    GOSR SETVARS
    GOSR MAKEKEYHASH
    GOSR MAKEASMHASH
    GOSR SETUPLIBS
    GOSR INITFUNCS
    GOSR ADDGLOBVARS
    GOSR GETCACHE
    GOSR CHECKCOOKIES
    GOSR TOKENIZE
    GOSR CHECKCOOKIES
    GOSR SECONDARYLOAD
    GOSR CHECKIDENTS
    GOSR SWAPVALUES
    GOSR MAKEINITCODE
    GOSR CHECKCOOKIES
    GOSR PASS1
    GOSR CHECKCOOKIES
    GOSR LINKDELEGATECONSTRUCTORS
    GOSR MAKEEXITCODE
    GOSR MATHEXITETC
    GOSR LINKFUNCS

    GOSR LINKLIB

    GOSR CALCADR

    GOSR WRITEEXE
    GOSR WRITELIBMOD
    GOSR CHECKCOOKIES
    GOSR NOERROR
    GOSR WRITEBUFFERS
    GOSR CLEANUPALL
    GOSR FIXRETVALUE
    RTS


K:  BSET    #6,CODEPREFS+3      ; -w
    BRA S

SC: MOVE.L  #CLINE,A0
    MOVEQ   #CLEND-CLINE,D0
    BRA S
CLINE:  DC.B    " ",10
CLEND:
    EVEN

EXAMPLE:
    DC.B    " ",10

EXAMPLEEND:
    DC.B    10,10

EVEN

;; Ident types
; No more demoversions!
UNDEF   = 0             ; ident types
LOCV    = 1
GLOBV   = 2
LAB = 3
;*-*
;; interim codes
EOI = 0             ; interimcodes
VALUE   = 1
LIBC    = 2
COM = 3
ASSGN   = 4
IDENT   = 5
STR = 6
;*-*
;; Object structure
ONEXT   = -4                ; M O  OBJECT STRUCTURE OFFSETS
OOFF    = 0                 ; M    M=MEMBER
ODEL    = 0                 ;   O  O=OBJECT
OFLAGS  = 2                 ; M O
OSIZE   = 4                 ; M O
OID = 6                     ; M O
OASCII  = 8                 ; M O
OPTRTYPE= 12                ; M
OSIZEOF = 16                ; M
OMEMB   = 12                ;   O
OMETHOD = 16                ;   O
OSUPER  = 20                ;   O
ODCODE  = 24                ;   O
OACC    = 28                ;   O
ODELOFF = 32                ;   O
ODESTR  = 34                ;   O
;*-*
;; Lib structure
LIB_NEXT    =   -4      ; next
LIB_NAME    =   0       ; name
LIB_ARGS    =   4       ; args count
LIB_CLEN    =   6       ; code len
LIB_CODE    =   10      ; code itself
LIB_USED    =   14      ; set if used/position in code
LIB_TYPE    =   18      ; type (0=proc, 1=inline, 2=startup etc)
LIB_TARR    =   20      ; table args array - regs (inline only)
LIB_RELO    =   28      ; reloc
LIB_XTNS    =   32      ; extension - for XREFs and XDEFs.
LIB_CPU     =   36      ; required CPU
LIB_FPU     =   38      ; required FPU
LIB_MMU     =   40      ; required MMU
LIB_OSVERS  =   42      ; required os version
LIB_SIZE    =   44      ; SIZEOF lib
;*-*
;; Method structure
M_NEXT  = 0             ; METHOD
M_PROC  = 4
M_TYPE  = 8
M_FLAGS = 9
M_OFF   = 10
M_NAME  = 12
;*-*
;; method flags
MT_METHOD   = 0         ; METHODFLAGS
MT_FROZEN   = 1
MT_SHARED   = 2
MT_EMPTY    = 3
;*-*
;; module info
MI_NEXT     = 0         ; MODULEINFO
MI_FLAGS    = 4
MI_NAMELEN  = 6
MI_MOD      = 10
MI_LIST     = 14
MI_NAMEPTR  = 18
;MI_NAME    = 22            ; ARRAY FROM HERE...
;*-*
;; proc or class
PC_NEXT     = 0         ; PROC_OR_CLASS
PC_TYPE     = 4
PC_INFO     = 6
PC_ACC      = 10
;*-*
;; constants structure
CNEXT   = 0             ; CONST STRUCTURE OFFSETS
CASCII  = 4
CVAL    = 8
CFLAGS  = 12
;*-*

CURVERSION  = 11            ; IMPORTANT, MODULE VERSION!!

;; system consts
SKIPMARK    = $8000

MAXREGVARS  = 5         ; NOTE: DEPENDS ALSO ON EFUNCS!
MAXMULTRET  = 3         ; NOTE: DEPENDS ON REGVARS!
MIDHEAVY    = $100
VARHEAVY    = 12            ; OFFSET AT WHICH HEAVYINFOS IN ID

MINSTACKSIZE    = 10000         ; van gen. code
MINSTACKSIZELIB = 1500
MAXOBJSIZE  = 5000
;*-*
;; A4handle
CHOPMEM     = -100
CHOPLEFT    = -104
FMEMSIZE    = 5000
GLOBOFF     = -512
GLOBOFFNEWTAB   = GLOBOFF+16        ; 16..256+16
NEWTABMAX   = 256
;*-*
;; customs
IOFF        = 100
KB      = 1024
MAXIDENT    = 1000          ; size of *one* identifier
MAXSTACK    = 30000         ; each rec.step=6-10b+rec.databuffer
MAXLIBRAISE = 200           ; EACH = 10 BYTES
;*-*
MINIMUM_ACODE   = 100*KB        ; GENERATED CODE-BUF

;; MACRO SECTION
;; TSTMOD - check if we're in a module
TSTMOD: MACRO
    BTST    #4,CODEPREFS+2
    ENDM
;*-*
;; RANGE CHECK MACROS
;; CheckB
CHKB:   MACRO               ; \1=REG, \2=TRREG, \3=ERLAB
    MOVE.L  \1,\2
    BTST    #31,\2
    BEQ.S   *+4
    NEG.L   \2          ; BAD: RANGE=(-255,255)=>(-128,255)
    clr.b   \2
    TST.L   \2
    BNE \3
    ENDM
;*-*
;; CheckW
CHKW:   MACRO               ; \1=REG, \2=TRREG, \3=ERLAB
    MOVE.L  \1,\2
    BTST    #31,\2
    BEQ.S   *+4
    NEG.L   \2
    SWAP    \2
    TST.W   \2
    BNE \3
    ENDM
;*-*
;*-*
;; HASHING MACROS
;; HashC
HASHC:  MACRO               ; \1=HASHREG, \2=CHAR
    LSL.W   #4,\1
    ADD.B   \2,\1
    ENDM
;*-*
;; HashE
HASHE:  MACRO               ; \1=HASHREG
    DIVU    #211,\1
    SWAP    \1
    EXT.L   \1
    ENDM
;*-*
;; Hash
HASH:   MACRO               ; \1=ASCREG, \2=DATREG, \3=TRASHREG
    MOVEQ   #0,\2
.H1:MOVE.B  (\1)+,\3
    BEQ.S   .H2
    HASHC   \2,\3
    BRA.S   .H1
.H2:    HASHE   \2
    ENDM
;*-*
;*-*
;; APART VAR ACCESS: ASM_GETLABEL
;; GENGI - GENerateGlobalInfo: A4=MID INS.
GENGI:  MACRO               ; \1=IDENTREC, \2=TRASHDX
    MOVE.L  6(\1),\2        ; SEE IF WE HAVE TO ADD A GLOBINFO ENTRY
    BEQ.S   .GVNGI
    MOVEM.L \1/A3,-(A7)
    MOVE.L  \2,\1
    MOVE.L  4(\1),\2
    MOVE.L  \1,A3
    GETM    \1
    MOVE.L  \1,4(A3)
    MOVE.L  \2,(\1)+
    MOVE.L  A4,(\1)+
    MOVE.W  OPERSIZE,(\1)+
    DONEM   \1
    MOVEM.L (A7)+,\1/A3
.GVNGI:
    ENDM
;*-*
;; OpLong - Set operator size
OPLONG: MACRO
    MOVE.W  #4,OPERSIZE
    ENDM
;*-*
;; OpInt
OPINT:  MACRO
    MOVE.W  #2,OPERSIZE
    ENDM
;*-*
;; OpChar
OPCHAR: MACRO
    MOVE.W  #1,OPERSIZE
    ENDM
;*-*
;; GenVar
; OFF_1:IMM, IDENT_2:Ax, OFFSET_3:EA.W, THRASH_4:Dx
             ; NOT A3-A5!!

GENVAR: MACRO       
    MOVE.B  4(\2),\4
    BNE .1
    JMP ERROR22         ; TEST FOR UNIDENT
.1:
    CMP.B   #GLOBV,\4
    BNE.S   .GV1
    MOVE.W  -2(A4),\4
    BCLR    #\1,\4          ; ADJUSTMODE
    MOVE.W  \4,-2(A4)

    GENGI   \2,\4

.GV1:   BTST    #3,5(\2)        ; SEE IF REGVAR
    BNE.S   .GV2
    MOVE.W  \3,(A4)+
    BRA.S   .GV3
.GV2:   MOVE.W  10(\2),\4
    IFEQ \1
     ANDI.W #%1111111111000000,-2(A4)
    ELSE
     AND.W  #%1111000000111111,-2(A4)
     LSL.W  #8,\4
     LSL.W  #1,\4
    ENDC
    OR.W    \4,-2(A4)
.GV3:                   ; END
    ENDM
;*-*

MOVEMS:     MOVEM.L D0/D1,-(A7)
MOVEMR:     MOVEM.L (A7)+,D0/D1
SMASK:      DC.W    0
;*-*
;; BitM
BITM:   MACRO               ; \1=BITNUM, \2=REG
    BTST    #\1,\2
    BEQ.S   .SR\1
    BSET    #15-\1,\2
.SR\1:
    ENDM
;*-*
;; LSaver
LSAVER: MACRO               ; \1=SAVEMASK.EA.W, \2=RETURN_SMASK.DX
    MOVE.W  \1,\2
    AND.W   #%11111000,\2       ; diffr. from SAVER
    MOVE.W  \2,SMASK
    BEQ.S   .NOSR
    MOVE.W  MOVEMS,(A4)+
    BITM    7,\2
    BITM    6,\2
    BITM    5,\2
    BITM    4,\2
    BITM    3,\2
    CLR.B   \2
    MOVE.W  \2,(A4)+
    MOVE.W  SMASK,\2
.NOSR:                  ; \2 IS HERE ATLEAST BOOL
    ENDM
;*-*
;; Saver
SAVER:  MACRO               ; \1=SAVEMASK.EA.W, \2=RETURN_SMASK.DX
    MOVE.W  \1,\2
    AND.W   PROCMASK,\2
    MOVE.W  \2,SMASK
    BEQ.S   .NOSR
    MOVE.W  MOVEMS,(A4)+
    BITM    7,\2
    BITM    6,\2
    BITM    5,\2
    BITM    4,\2
    BITM    3,\2
    CLR.B   \2
    MOVE.W  \2,(A4)+
    MOVE.W  SMASK,\2
.NOSR:                  ; \2 IS HERE ATLEAST BOOL
    ENDM
;*-*
;; Restr
RESTR:  MACRO               ; \1=SMASK.EA
    TST.W   \1
    BEQ.S   .NORR
    MOVE.W  MOVEMR,(A4)+
    MOVE.W  \1,(A4)+
.NORR:
    ENDM
;*-*
;; Lower
LOWER:  MACRO               ; \1=AX (STRING,TRASH), \2=(TRASH)
.LOWL:  MOVE.B  (\1),\2
    BEQ.S   .LOWO
    CMP.B   #"A",\2
    BMI.S   .LOWN
    CMP.B   #"Z"+1,\2
    BPL.S   .LOWN
    BSET    #5,\2;ADD.B   #32,\2
.LOWN:  MOVE.B  \2,(\1)+
    BRA.S   .LOWL
.LOWO:                  ; ax points at 0-byte at end string
    ENDM
;*-*
;; Lower2
LOWER2:  MACRO               ; \1=AX (STRING,TRASH), \2=(TRASH)
.LOWL2:  MOVE.B  (\1),\2
    BEQ.S   .LOWO2
    CMP.B   #"A",\2
    BMI.S   .LOWN2
    CMP.B   #"Z"+1,\2
    BPL.S   .LOWN2
    BSET    #5,\2;ADD.B   #32,\2
.LOWN2:  MOVE.B  \2,(\1)+
    BRA.S   .LOWL2
.LOWO2:                  ; ax points at 0-byte at end string
    ENDM
;*-*
;; FAST MEMORY ALLOCATION MACROS
;; GetM
GETM:   MACRO               ; \1=Ax (START USING MEM)
    MOVE.L  HEAP,\1
    ENDM
;*-*
;; DoneM
DONEM:  MACRO               ; \1=Ax (DONE WITH MEM (LIGHT VERSION))
    MOVE.L  \1,HEAP
    SUBQ.W  #1,CHECKHEAP
    BNE.S   *+16
    BSR.L EXPAND5
    MOVE.W  #5,CHECKHEAP        ; MAX 200 BYTES EACH = IDENT OR STRUCT
    ENDM                ; doesn't trash \1 !!!!
;*-*
;; DoneH
DONEH:  MACRO               ; \1=Ax (HEAVY VERSION)
    MOVE.L  \1,HEAP
    BSR.L EXPAND5
    ENDM
;*-*
;*-*
;; CREATE GLOBINFO STRUCTURE FOR IDENT
;; GInfo
GINFO:  MACRO               ; \1=ASCIIPTR.EA, \2=TRASH.AX, \3=IDENTPTR.AX
    TSTMOD
    BEQ.S   .NGINF
    GETM    \2          ; BUILD "GLOBINFO"
    BTST    #1,5(\3)
    BNE.S   .NGINF
    MOVE.L  \2,6(\3)
    MOVE.L  \1,(\2)+
    CLR.L   (\2)+
    DONEM   \2
    BRA.S   .NGOUT
.NGINF: CLR.L   6(\3)
.NGOUT:
    ENDM
;*-*
;; ChEStB
CHESTB: MACRO               ; CHeckEStackBuf \1=CURBUF.EA, \2=TR.DX
    SUBQ.W  #1,.BC          ; \3=DIST, \4=ERROR
    BNE.S   .NC
    MOVE.W  #\3,.BC
    MOVE.L  #ESTACKBUF,\2
    ADD.L   #MAXSTACK,\2
    SUB.L   #1000,\2
    CMP.L   \1,\2
    BMI \4
    BRA.S   .NC
.BC:    DC.W    \3
.NC:
    ENDM
;*-*
;; INTERN
INTERN: MACRO               ; \1=ERRNUM
    MOVE.W  #\1,GURUNUM
    BRA.L DAMAGEDCOOKIES
    ENDM
;*-*
;*-*
;*-*

;; Preprocessor

; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ;
;   The (Macro) PreProcessor                ;
; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ;

; - recursive macros
; - check end_of_source at each "\n" skipped.

;; Macro structure offsets
MAC_NEXT    = 0
MAC_NAME    = 4
MAC_BODY    = 8
MAC_NARGS   = 12
MAC_FLAGS   = 14    ; .B
;*-*
;; Macro characters
PREPCHARS:
    DC.B    0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0    ; 0
    DC.B    0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0    ; 16
    DC.B    0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0    ; 32
    DC.B    4,4,4,4,4,4,4,4, 4,4,0,0,0,0,0,0    ; 48

    DC.B    0,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5    ; 64
    DC.B    5,5,5,5,5,5,5,5, 5,5,5,0,0,0,0,5    ; 80
    DC.B    0,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5    ; 96
    DC.B    5,5,5,5,5,5,5,5, 5,5,5,0,0,0,0,0

    DC.B    0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0    ; 128
    DC.B    0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0
    DC.B    0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0
    DC.B    0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0

    DC.B    0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0
    DC.B    0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0
    DC.B    0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0
    DC.B    0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0
;*-*

; IN TOKENIZE CONTEXT: A0=SOURCE, A1=INTERIM, A2=IDENT WORK, D4=LAST TOKEN
;; Preprocessor macros
PREPTA: MACRO               ; \1=AX
    LEA PREPCHARS(PC),\1
    ENDM

PREPID: MACRO               ; \1=TAB.AX, \2=CHAR.L.DX
    CMP.B   #5,0(\1,\2.L)
    ENDM

PREPIDR:MACRO               ; \1=TAB.AX, \2=CHAR.L.DX
    CMP.B   #4,0(\1,\2.L)
    ENDM
;*-*

PREP:             ; JUST READ A "#"
    ADDQ.L  #1,A0
    CMP.B   #"d",D6
    BNE.S   .1
    CMP.B   #"e",(A0)
    BEQ.S   PREPDEF
    CMP.B   #"a",(A0)
    BEQ     PREPDATE
    BRA     iERROR63
.1: CMP.B   #"i",D6
    BEQ.W   PREPIF
    CMP.B   #"e",D6
    BEQ.W   PREPENDIF
    BRA iERROR63

; format:
; 32-255: normal chars
; "\t" and "\\\n" translated to " "
; "\n" is end of macro (0)
; chars 1-31 are args.
; ";" not allowed
;; #define

PREPDEF:              ; #define
    LEA .1(PC),A6
    BSR PREPKCMP
    BSR PREPWHITE
    GETM    A5          ; A5=MEM
    MOVE.L  A5,A4           ; A4=IDENT
    PREPTA  A6          ; A6=TABLE
    MOVEQ   #0,D0
    MOVE.B  (A0)+,D0        ; D0=CHAR
    MOVEQ   #0,D1           ; D1=HASH
    PREPID  A6,D0
    BMI iERROR64
.XL:HASHC   D1,D0
    MOVE.B  D0,(A5)+
    MOVE.B  (A0)+,D0
    PREPIDR A6,D0
    BPL.S   .XL
    SUBQ.L  #1,A0
    CLR.B   (A5)+
    MOVE.L  A5,D0
    BTST    #0,D0
    BEQ.S   .2
    CLR.B   (A5)+
.2: HASHE   D1
    LSL.L   #2,D1
    ADD.L   #MACROHASH,D1
    MOVE.L  D1,A6
    BSR PREPFINDMACRO
    TST.L   D0
    BNE iERROR66
    MOVE.L  D1,A6
    MOVE.L  (A6),(A5)       ; MAC_NEXT
    MOVE.L  A5,(A6)
    MOVE.L  A5,A6           ; A6=MACOBJ
    ADDQ.L  #4,A5
    MOVE.L  A4,(A5)+        ; MAC_NAME
    CLR.L   (A5)+           ; MAC_BODY
    CLR.L   (A5)+           ; MAC_NARGS + MAC_FLAGS
    DONEH   A5          ; -->FOR MACBODY NEEDS HEAVY
    ;BSR    PREPWHITE
    MOVE.L  WORK,A2
    MOVE.L  A2,D7           ; A2,D7=ARGSASC
    CMP.B   #"(",(A0)
    BNE.S   .NARGS
    ADDQ.L  #1,A0
    PREPTA  A5          ; A5=TAB
    MOVEQ   #0,D0
    MOVEQ   #0,D1           ; D1=NARG
.AL:    BSR PREPWHITE
    ADDQ.L  #1,D1
    MOVE.B  (A0)+,D0
    PREPID  A5,D0
    BMI iERROR64
.ALC:   MOVE.B  D0,(A2)+
    MOVE.B  (A0)+,D0
    PREPIDR A5,D0
    BPL.S   .ALC
    SUBQ.L  #1,A0
    CLR.B   (A2)+
    ;               ; -->CHECK FOR DOUBLARGS?
    BSR PREPWHITE
    CMP.B   #",",(A0)+
    BEQ.S   .AL
    CMP.B   #")",-1(A0)
    BNE iERROR64
    MOVE.W  D1,MAC_NARGS(A6)
.NARGS: BSR PREPWHITE
    CLR.B   (A2)+
    GETM    A3          ; A3,D6=PRE_ANA_MACBODY
    MOVE.L  A3,MAC_BODY(A6)
    MOVE.L  A3,D6
    PREPTA  A6          ; A6=TAB
    MOVEQ   #0,D0
.MBL:   MOVE.B  (A0)+,D0
    CMP.B   #10,D0
    BEQ.W   .MBX
    CMP.B   #"\",D0
    BEQ.W   .BSL
    CMP.B   #" ",D0
    BEQ.W   .SP
    CMP.B   #9,D0
    BEQ.W   .TAB
    CMP.B   #";",D0
    BEQ iERROR64
    CMP.W   #32,D0
    BMI iERROR64
    PREPID  A6,D0
    BMI.S   .CH
    MOVE.L  D7,A2           ; A2=ASCIIARGS
    SUBQ.L  #1,A0
    MOVE.L  A0,D5           ; D5=START ID IN TEXT
    MOVEQ   #0,D2           ; D2=NTH ARG
.FAL:   TST.B   (A2)
    BEQ.S   .CRI
    ADDQ.L  #1,D2
    MOVE.L  D5,A0
.FALI:  CMPM.B  (A2)+,(A0)+
    BEQ.S   .FALI
    TST.B   -(A2)
    BEQ.S   .MA
.FAN:   TST.B   (A2)+
    BNE.S   .FAN
    BRA.S   .FAL
.MA:    ADDQ.L  #1,A2
    MOVE.B  -(A0),D0
    PREPIDR A6,D0
    BPL.S   .FAL
    MOVE.B  D2,D0
    BRA.S   .CH         ; INSERT ARGNUM AS CHAR
.CRI:   MOVE.L  D5,A0
.CRIL:  MOVE.B  (A0)+,D0
    MOVE.B  D0,(A3)+
    PREPIDR A6,D0
    BPL.S   .CRIL
    SUBQ.L  #2,A0
    SUBQ.L  #2,A3
    MOVE.B  (A0)+,D0        ; LAST AS CH FOR CHECK
.CH:    MOVE.B  D0,(A3)+
    MOVE.L  A3,D1
    SUB.L   D6,D1
    CMP.L   #1000,D1
    BPL iERROR64
    BRA.W   .MBL
.MBX:   SUBQ.L  #1,A0
    CLR.B   (A3)+
    MOVE.L  A3,D0
    BTST    #0,D0
    BEQ.S   .3
    CLR.B   (A3)+
.3: DONEH   A3
    BRA.W   PREPDONE
.1: DC.B    "efine",0
.BSL:   CMP.B   #10,(A0)
    BNE.S   .CH
    ADDQ.L  #1,A0
    ADDQ.W  #1,LINENUM
    CMPA.L  ENDECODE,A0
    BPL iERROR64
    MOVEQ   #" ",D0
    BRA.S   .CH
.SP:    CMP.B   #" ",(A0)+
    BEQ.S   .SP
    SUBQ.L  #1,A0
    BRA.S   .CH
.TAB:   CMP.B   #9,(A0)+
    BEQ.S   .TAB
    SUBQ.L  #1,A0
    MOVEQ   #" ",D0
    BRA.S   .CH
;*-*
;; #date

PREPDATE:             ; #date
    LEA .1(PC),A6           ; name
    BSR PREPKCMP            ; check if true
    TST.L   UTILBASE        ;
    BEQ     iERROR76         ;
    BSR PREPWHITE           ; and if yes - skip whitespaces.
    GETM    A5              ; A5=buffer mem
    MOVE.L  A5,A4           ; A4=IDENT
    PREPTA  A6              ; A6=TABLE
    MOVEQ   #0,D0           ;
    MOVE.B  (A0)+,D0        ; D0=CHAR
    MOVEQ   #0,D1           ; D1=HASH
    PREPID  A6,D0           ;
    BMI iERROR64             ;
.XL:HASHC   D1,D0           ; calculate macro hashvalue
    MOVE.B  D0,(A5)+        ; A5 - macro name
    MOVE.B  (A0)+,D0        ;
    PREPIDR A6,D0           ;
    BPL.S   .XL             ; until end of macro name
    SUBQ.L  #1,A0           ;
    CLR.B   (A5)+           ; macro name = "name\0"
    MOVE.L  A5,D0           ;
    BTST    #0,D0           ;
    BEQ.S   .2              ;
    CLR.B   (A5)+           ; must be word aligned
.2: HASHE   D1              ;
    LSL.L   #2,D1           ;
    ADD.L   #MACROHASH,D1   ; add macro to hash table
    MOVE.L  D1,A6           ;
    BSR PREPFINDMACRO       ; and check if it wasn't already defined
    TST.L   D0              ;
    BNE iERROR66             ;
    MOVE.L  D1,A6           ; restore location
    MOVE.L  (A6),(A5)       ; and add to list
    MOVE.L  A5,(A6)         ;
    MOVE.L  A5,A6           ; A6=MACOBJ
    ADDQ.L  #4,A5           ; leave space for links
    MOVE.L  A4,(A5)+        ; MAC_NAME
    CLR.L   (A5)+           ; MAC_BODY
    CLR.L   (A5)+           ; MAC_NARGS + MAC_FLAGS
    DONEM   A5              ; -->FOR MACBODY NEEDS HEAVY

    BSR     PREPWHITE
    BSR     .PREPARE          

    GETM    A3              ; A3,D6=PRE_ANA_MACBODY
    MOVE.L  A3,A2
    MOVE.L  A3,MAC_BODY(A6) ;
    MOVE.B  (A0)+,D0
    CMP.B   #"'",D0
    BNE     iERROR64
    MOVE.B  D0,(A3)+
.LOOP:
    MOVE.B  (A0)+,D0
    CMP.B   #"%",D0
    BEQ     .EXTEND
    MOVE.B  d0,(A3)+
    CMP.B   #"'",D0
    BNE     .LOOP
    CMP.B   #"'",(a0)+
    BEQ     .LOOP
    SUBQ.L  #1,A0
    CLR.B   (A3)+
    MOVE.L  A3,D0
    BTST    #0,D0
    BEQ     .DONTSET
    CLR.B   (A3)+
.DONTSET:
    DONEH   A3
    BRA.W   PREPDONE

.PREPARE:
    MOVEM.L D0-D7/A0-A6,-(A7)
    TST.L   .BCRES
    BNE     .SKIP_GO
    LEA .BCNAME(PC),A1
    MOVE.L  $4.W,A6
    JSR     -498(A6)
    MOVE.L  D0,.BCRES
    MOVE.L  .BCRES,A6
    JSR     -12(A6)
    LEa     .DATESTORE(PC),A0
    MOVE.L  UTILBASE,A6
    JSR     -120(A6)

.SKIP_GO:
    MOVEM.L (A7)+,D0-D7/A0-A6
    RTS

.EXTEND:
    MOVEQ   #0,D1
    MOVe.B  (A0)+,D0
    CMp.B   #"%",D0
    BEQ     .S01
    CMP.B   #"d",D0
    BEQ     .S02
    CMp.B   #"m",D0
    BEQ     .S03
    CMp.B   #"y",D0
    BEQ     .S04
    CMp.B   #"D",D0
    BEQ     .S05
    CMp.B   #"M",D0
    BEQ     .S06
    CMP.B   #"Y",D0
    BEQ     .S09
    CMP.B   #"a",D0
    BNE     .XX
    MOVE.B  (A0)+,D0
    CMP.B   #"D",D0
    BEQ     .S07
    CMP.B   #"M",D0
    BEQ     .S08
.XX:BRA     iERROR64
.S01:
    MOVE.B  #"%",(A3)+
    BRA     .LOOP
.S02:
    MOVE.W  .DATESTORE+6(PC),D1
    MOVEM.L D0-D7/A1-A2/A4-A6,-(A7)
    MOVEQ   #1,D3
    BSR     .PUTNUMBER
    MOVEM.L (A7)+,D0-D7/A1-A2/A4-A6
    BRA     .LOOP
.S03:
    MOVE.W  .DATESTORE+8(PC),D1
    MOVEM.L D0-D7/A1-A2/A4-A6,-(A7)
    MOVEQ   #1,D3
    BSR     .PUTNUMBER
    MOVEM.L (A7)+,D0-D7/A1-A2/A4-A6
    BRA     .LOOP
.S04:
    MOVE.W  .DATESTORE+10(PC),D1
    MOVEM.L D0-D7/A1-A2/A4-A6,-(A7)
    MOVEQ   #3,D3
    BSR     .PUTNUMBER
    MOVEM.L (A7)+,D0-D7/A1-A2/A4-A6
    BRA     .LOOP
.S05:
    MOVE.W  .DATESTORE+12(PC),D1
    MOVEM.L D0-D7/A1-A2/A4-A6,-(A7)
    LEA     LongDays,A1
    BSR     .PUTSTRING
    MOVEM.L (A7)+,D0-D7/A1-A2/A4-A6
    BRA     .LOOP
.S06:
    MOVE.W  .DATESTORE+8(PC),D1
    SUBQ.L  #1,D1
    MOVEM.L D0-D7/A1-A2/A4-A6,-(A7)
    LEA     LongMonths,A1
    BSR     .PUTSTRING
    MOVEM.L (A7)+,D0-D7/A1-A2/A4-A6
    BRA     .LOOP
.S07:
    MOVE.W  .DATESTORE+12(PC),D1
    MOVEM.L D0-D7/A1-A2/A4-A6,-(A7)
    LEA     ShortDays,A1
    BSR     .PUTSTRING
    MOVEM.L (A7)+,D0-D7/A1-A2/A4-A6
    BRA     .LOOP
.S08:
    MOVE.W  .DATESTORE+8(PC),D1
    SUBQ.L  #1,D1
    MOVEM.L D0-D7/A1-A2/A4-A6,-(A7)
    LEA     ShortMonths,A1
    BSR     .PUTSTRING
    MOVEM.L (A7)+,D0-D7/A1-A2/A4-A6
    BRA     .LOOP
.S09:
    MOVEQ   #0,D1
    MOVE.W  .DATESTORE+10(PC),D1
.S09_1:
    SUB.L   #100,D1
    BPL     .S09_1
    ADD.L   #100,D1
    MOVEM.L D0-D7/A1-A2/A4-A6,-(A7)
    MOVEQ   #1,D3
    BSR     .PUTNUMBER
    MOVEM.L (A7)+,D0-D7/A1-A2/A4-A6
    BRA     .LOOP


.PUTSTRING:
    LSL.W   #2,D1
    MOVE.L  0(A1,D1),A1
.P:
    MOVE.B  (A1)+,(A3)+
    TST.B   (A1)
    BNE     .P
    RTS

.PUTNUMBER:
    LSL.W   #1,D3
    LEA     .NUMBERS(PC),A1
    ADD.L   D3,A1
    LSR.W   #1,D3

.D: MOVEQ   #-1,D2
.S: ADDQ.L  #1,D2
    SUB.W   (A1),D1
    BPL     .S
    ADD.W   (A1),D1
    ADD.B   #"0",D2
    MOVE.B  D2,(A3)+
    SUBQ.L  #2,A1
    DBF     D3,.D
    RTS
.NUMBERS:
    DC.W    1,10,100,1000,10000

.DATESTORE:
    DC.L    0,0,0,0
.BCRES:
    DC.L    0
.BCNAME:
    DC.B    "battclock.resource",0
.1: DC.B    "ate",0
    EVEN
;*-*
;; #ifdef
PREPIF:               ; #ifdef, #ifndef
    CMP.B   #"f",(A0)+
    BNE iERROR63
    MOVEQ   #-1,D7          ; D7=TRUTHFLAG
    CMP.B   #"n",(A0)
    BNE.S   .2
    MOVEQ   #0,D7
    ADDQ.L  #1,A0
.2: LEA .1(PC),A6
    BSR PREPKCMP
    BSR PREPWHITE
    MOVE.L  WORK,A2
    MOVE.L  A2,D6           ; A2,D6=IDENT
    PREPTA  A6          ; A6=TAB
    MOVEQ   #0,D0
    MOVEQ   #0,D1           ; D1=HASH
    MOVE.B  (A0)+,D0
    PREPID  A6,D0
    BMI iERROR67
.CL:    MOVE.B  D0,(A2)+
    HASHC   D1,D0
    MOVE.B  (A0)+,D0
    PREPIDR A6,D0
    BPL.S   .CL
    CLR.B   (A2)+
    SUBQ.L  #1,A0
    BSR PREPWHITE
    CMP.B   #10,(A0)
    BNE iERROR67
    MOVE.L  D6,A2
    HASHE   D1
    LSL.L   #2,D1
    ADD.L   #MACROHASH,D1
    MOVE.L  D1,A6
    MOVE.L  D6,A4
    BSR PREPFINDMACRO
    TST.L   D0
    BEQ.S   .3
    MOVEQ   #-1,D0
.3: EOR.L   D0,D7           ; NEW TRUTH
    NOT.L   D7
    MOVE.W  PREPSTACKSIZE(PC),D0
    LEA PREPIFSTACK(PC),A4
    MOVE.B  D7,0(A4,D0.W)
    ADDQ.W  #1,D0
    MOVE.W  D0,PREPSTACKSIZE
    CMP.W   #PREPMAXSTACK,D0
    BPL iERROR65
    TST.L   D7
    BNE.S   .4
    MOVEQ   #0,D6           ; NESTED LEVEL
    ADDQ.L  #1,A0
.EL:    ADDQ.W  #1,LINENUM      ; NOW EAT LF
    CMPA.L  ENDECODE,A0
    BPL iERROR65
    BSR PREPWHITE
    CMP.B   #"#",(A0)
    BNE.S   .ER
    ADDQ.L  #1,A0
    MOVE.B  (A0),D0
    CMP.W   #"i",D0
    BNE.S   .E1
    ADDQ.L  #1,D6
    BRA.S   .ER
.E1:    CMP.W   #"e",D0
    BNE.S   .ER
    TST.L   D6
    BEQ.S   .EX
    SUBQ.L  #1,D6
.ER:    MOVEQ   #10,D0
.ERL:   CMP.B   (A0)+,D0
    BNE.S   .ERL
    BRA.S   .EL
.EX:    ADDQ.L  #1,A0
    BRA.S   PREPENDIF
.4: BRA.S   PREPDONE
.1: DC.B    "def",0
;*-*
;; #endif
PREPENDIF:            ; #endif
    LEA .1(PC),A6
    BSR PREPKCMP
    MOVE.W  PREPSTACKSIZE(PC),D0
    SUBQ.W  #1,D0
    BMI iERROR65
    MOVE.W  D0,PREPSTACKSIZE
    ;LEA    PREPIFSTACK(PC),A4
    ;TST.B  0(A4,D0.W)
    ;BEQ    iERROR65
    BRA.S   PREPDONE
.1: DC.B    "ndif",0,0
;*-*

;; PrepDone
PREPDONE:
    MOVE.L  STARTINTERIM,A6
    SUBQ.L  #2,A6
    CMPA.L  A6,A1
    BNE.S   .1
    MOVE.L  WORK,A2
    BRA PARSELOOP
.1: INTERN  105
;*-*
;; PrepKCmp
PREPKCMP:
    CMPM.B  (A6)+,(A0)+
    BEQ.S   PREPKCMP
    TST.B   -(A6)
    BNE iERROR63
    MOVE.B  -(A0),D6
    CMP.B   #" ",D6
    BEQ.S   .1
    CMP.B   #10,D6
    BEQ.S   .1
    CMP.B   #9,D6
    BNE iERROR63
.1: RTS
;*-*
;; PrepWhite
PREPWHITE:                ; TR ONLY D0.B
    MOVE.B  (A0),D0
    CMP.B   #" ",D0
    BEQ.S   .1
    CMP.B   #9,D0
    BNE.S   .2
.1: ADDQ.L  #1,A0
    BRA.S   PREPWHITE
.2: RTS
;*-*
;; PrepFindMacro
PREPFINDMACRO:                ; A6=LISTADR,A4=STR, OUT=D0/A6
    MOVEM.L A0/A1,-(A7)
.XL:MOVE.L  (A6),D0
    BEQ.S   .1
    MOVE.L  D0,A6
    MOVE.L  MAC_NAME(A6),A0
    MOVE.L  A4,A1
.CL:    CMPM.B  (A0)+,(A1)+
    BNE.S   .XL
    TST.B   -1(A0)
    BNE.S   .CL
.1: MOVEM.L (A7)+,A0/A1
    RTS
;*-*
;; PrepExpand
PREPEXPAND:
    MOVE.L  WORK,A4
    MOVE.L  HASHVAL(PC),D0
    LSL.L   #2,D0
    ADD.L   #MACROHASH,D0
    MOVE.L  D0,A6
    BSR PREPFINDMACRO           ; A6=MACOBJ
    TST.L   D0
    BNE.S   .C
    RTS

.C: MOVEM.L D1-D7/A1-A6,-(A7)       ; KEEP ONLY A0,A6 FROM ENV

    TST.L   PREPESTACK
    BNE.S   .1
    MOVE.L  #PREPETOTAL,D0
    BSR NEW
    TST.L   D0
    BEQ iERROR38
    MOVE.L  D0,PREPESTACK
    ADD.L   #PREPESTACKSIZE,D0
    MOVE.L  D0,PREPEBUFUSE
    ADD.L   #PREPEBUFSIZE,D0
    MOVE.L  D0,PREPEBUFEND
.1:
    MOVE.L  PREPEBUFUSE(PC),PREPETEMP
    MOVE.W  MAC_NARGS(A6),D7        ; D7.W=NARGS
    BEQ.S   .NARG
    BSR PREPWHITE
    BSR PREPMULTIEXPAND
    BRA.S   .INAC

.NARG:  MOVE.L  MAC_BODY(A6),D6         ; D6=NEW ASCCODE
.INAC:  MOVE.W  PREPESTACKUSE(PC),D0
    CMP.W   #PREPESTACKSIZE,D0
    BPL iERROR68
    MOVE.L  PREPESTACK(PC),A5       ; A5=MACEXPANSIONSTACK
    MOVE.L  A0,0(A5,D0.W)
    MOVE.L  PREPETEMP(PC),4(A5,D0.W)
    ADDQ.W  #8,PREPESTACKUSE
    MOVE.L  D6,A0
    MOVEM.L (A7)+,D1-D7/A1-A6
    ADDQ.L  #4,A7               ; BSR OFF STACK
    BSR MOVEBUF             ; FOR LONG MACROS
    BRA PARSELOOP

;*-*

;; PreProcessor Consts And Vars
PREPMAXSTACK    = 10
PREPESTACKSIZE  = 20*8
PREPEBUFSIZE    = 10*KB
PREPETOTAL  = PREPESTACKSIZE+PREPEBUFSIZE

; EACH STACKFRAME: LASTA0,LASTEBUF


PREPIFSTACK:  DS.B    PREPMAXSTACK
PREPSTACKSIZE:    DC.W    0

PREPESTACK:   DC.L    0
PREPESTACKUSE:    DC.W    0

PREPETEMP:    DC.L    0
PREPEBUFEND:  DC.L    0
PREPEBUFUSE:  DC.L    0

PREPMACROMSG: DC.B    'MACRO: ',0     ; 7

PREPMACROBODYERR: DC.L    0
;*-*

;; PrepMacroDone
PREPMACRODONE:
    MOVE.W  PREPESTACKUSE(PC),D0
    BEQ E
    BMI E
    SUBQ.W  #8,D0
    MOVE.L  PREPESTACK(PC),A6
    MOVE.L  0(A6,D0.W),A0
    MOVE.L  4(A6,D0.W),PREPEBUFUSE
    MOVE.W  D0,PREPESTACKUSE
    BRA PARSELOOP
;*-*
;; PrepWriteMacroLine
PREPWRITEMACROLINE:
    MOVE.L  PREPMACROBODYERR(PC),D7
    BEQ.S   .1
    MOVE.L  #PREPMACROMSG,D2
    MOVEQ   #7,D3
    BSR WRITECON
    MOVE.L  D7,A0
    MOVE.L  D7,A1
.XL:CMP.B   #10,-1(A0)
    BEQ.S   .L2
    CMP.B   #";",-1(A0)
    BEQ.S   .L2
    TST.B   -1(A0)
    BPL.S   .KLUD
.XB:SUBQ.L  #1,A0
    BRA.S   .XL
.L2:    CMP.B   #10,(A1)
    BEQ.S   .D
    CMP.B   #";",(A1)
    BEQ.S   .D
    TST.B   (A1)
    BEQ.S   .D
    ADDQ.L  #1,A1
    BRA.S   .L2
.D: CLR.B   (A1)
    MOVE.L  A1,D3
    MOVE.L  A0,D2
    SUB.L   D2,D3
    BSR WRITECON
    BSR WRITELN
.1: RTS
.KLUD:  CMP.B   #8,-1(A0)       ; MACBODY FROM MOD HAS LEN:INT,CHARS..
    BPL.S   .XB
    ;ADDQ.L #1,A0           ; why?
    BRA.S   .L2
;*-*
;; PrepMacroError
PREPMACROERROR:
    TST.W   PREPESTACKUSE
    BEQ.S   .1
    MOVE.L  A0,PREPMACROBODYERR
    MOVE.L  PREPESTACK(PC),A0       ; OLDEST A0 BACK
    MOVE.L  (A0),A0
.1: RTS
;*-*
;; PrepMultiExpand

; IN:   A0=ASCII, A6=MACOBJ, D7.W=NARGS
; FILLS PREPBUFUSE++ TO MAX PREFBUFEND
; RET NEW ASCII IN D6


; PROBLEMS: <CONS>

PREPMULTIEXPAND:
    MOVE.L  PREPEBUFUSE(PC),A5  ; A5=CURBUF
    MOVE.W  D7,D0
    LSL.W   #3,D0
    MOVE.L  A5,A4           ; A4,D4=ARGSBUF
    MOVE.L  A4,D4
    ADD.W   D0,A5
    CMPA.L  PREPEBUFEND(PC),A5
    BPL iERROR37
    MOVE.L  A5,D6           ; D6=BEGIN
    CMP.B   #"(",(A0)+
    BNE iERROR0
    MOVEQ   #0,D5           ; D5=BRACKET RECURSION
.BL:MOVE.L  A0,(A4)+        ; SHOVE ADR FOR ARG
.XL:MOVE.B  (A0)+,D0        ; HERE!!!
    CMP.B   #"(",D0
    BEQ.S   .UPL
    CMP.B   #"[",D0
    BEQ.S   .UPL
    CMP.B   #"]",D0
    BEQ.S   .DOL
    CMP.B   #")",D0
    BEQ.S   .DOL
    CMP.B   #",",D0
    BEQ.S   .COM
    CMP.B   #"'",D0
    BEQ.S   .STR
    CMP.B   #'"',D0
    BEQ.S   .STR
    ;               ; MORE CASES HERE?
    CMP.B   #10,D0
    BEQ iERROR3          ; ERROR = \N \0 /* ->
    CMP.B   #";",D0
    BEQ iERROR3
    TST.B   D0
    BEQ iERROR3
    CMP.B   #"/",D0
    BEQ.S   .CM1
    CMP.B   #"-",D0
    BEQ.S   .CM2
    BRA.S   .XL
.COM:   TST.L   D5
    BNE.S   .XL
    SUBQ.W  #1,D7
    BEQ iERROR0
.XBL:   MOVE.L  A0,D0
    SUB.L   -4(A4),D0
    SUBQ.L  #1,D0
    MOVE.L  D0,(A4)+        ; SHOVE LEN FOR ARG
    TST.W   D7
    BNE.S   .BL
    BRA.S   .FILL
.UPL:   ADDQ.L  #1,D5
    BMI iERROR0
    BRA.S   .XL
.DOL:   SUBQ.L  #1,D5
    BPL.S   .XL
    SUBQ.W  #1,D7
    BNE iERROR20
    BRA.S   .XBL
.CM1:   CMP.B   #"*",(A0)
    BEQ iERROR0
    BRA.W   .XL
.CM2:   CMP.B   #">",(A0)
    BEQ iERROR0
    BRA.W   .XL
.STR:   MOVE.B  (A0)+,D1
    CMP.B   #10,D1
    BEQ iERROR3
    CMP.B   D0,D1
    BNE.S   .STR
    CMP.B   (A0),D0
    BNE.W   .XL
    ADDQ.L  #1,A0
    BRA.S   .STR
.FILL:  MOVE.L  MAC_BODY(A6),A1     ; A1=BODY (NOW FILL ARGS IN MACRO)
    MOVE.L  PREPEBUFEND(PC),D3  ; D3=END
    SUBQ.L  #8,D3
    MOVEQ   #0,D0
    MOVE.W  MAC_NARGS(A6),D7
    ADDQ.L  #1,D7
.FL:    CMPA.L  D3,A5
    BPL iERROR37
    MOVE.B  (A1)+,D0
    CMP.W   D7,D0
    BMI.S   .ARG
    MOVE.B  D0,(A5)+
    BRA.S   .FL
.ARG:   TST.W   D0
    BEQ.S   .XF
    MOVE.L  D0,D1
    SUBQ.L  #1,D1
    LSL.L   #3,D1
    ADD.L   D4,D1
    MOVE.L  D1,A2
    MOVE.L  4(A2),D1        ; D1=ARGLEN
    MOVE.L  (A2),A2         ; A2=ARG
    MOVE.L  A5,D2
    ADD.L   D1,D2
    CMP.L   D3,D2
    BPL iERROR37
    SUBQ.W  #1,D1
    BMI.S   .AX
.AL:    MOVE.B  (A2)+,(A5)+
    DBRA    D1,.AL
.AX:    BRA.S   .FL
.XF:    CLR.B   (A5)+
    MOVE.L  A5,D0
    BTST    #0,D0
    BEQ.S   .NA
    CLR.B   (A5)+
.NA:    MOVE.L  A5,PREPEBUFUSE
    RTS
;*-*
;; PrepSaveMacros
PREPSAVEMACROS:
    BTST    #6,CODEPREFS+2
    BEQ.S   .XX
    MOVE.L  #ESTACKBUF,D5
    MOVE.L  D5,A5           ; D5,A5=BUF
    MOVE.W  #11,(A5)+
    MOVE.L  #MACROHASH,A4       ; A4=TABLE
    MOVE.L  #MACROHASH+1024,D4  ; D4=END
    MOVEQ   #0,D7           ; D7=NUMBER OF MACROS
.XL:CMP.L   A4,D4
    BEQ.S   .X
    MOVE.L  (A4)+,D0
    BEQ.S   .XL
    MOVE.L  D0,A3           ; A3=MACLIST
.L2:    BTST    #0,MAC_FLAGS(A3)
    BNE.S   .NEXT
    ADDQ.L  #1,D7
    ADDQ.W  #2,A5           ; COPY LEN+NAME
    MOVE.L  A5,A1
    MOVE.L  MAC_NAME(A3),A2
.L3:    MOVE.B  (A2)+,(A5)+
    BNE.S   .L3
    CLR.B   (A5)+
    MOVE.L  A5,D0
    BCLR.L  #0,D0
    MOVE.L  D0,A5
    SUB.L   A1,D0
    MOVE.W  D0,-(A1)
    MOVE.L  MAC_NARGS(A3),(A5)+ ; NARGS+FLAGS+
    ADDQ.W  #2,A5           ; COPY LEN+BODY
    MOVE.L  A5,A1
    MOVE.L  MAC_BODY(A3),A2
.L4:    MOVE.B  (A2)+,(A5)+
    BNE.S   .L4
    CLR.B   (A5)+
    MOVE.L  A5,D0
    BCLR.L  #0,D0
    MOVE.L  D0,A5
    SUB.L   A1,D0
    MOVE.W  D0,-(A1)
    BSR.S   .WR
.NEXT:  MOVE.L  (A3)+,A3
    MOVE.L  A3,D0
    BNE.S   .L2
    BRA.S   .XL
.X: TST.L   D7
    BEQ.S   .XX
    CLR.W   (A5)+
    BSR .WR
.XX:    RTS
.WR:    MOVE.L  D5,D2
    MOVE.L  A5,D3
    SUB.L   D2,D3
    BSR WRITEFILE
    MOVE.L  D5,A5
    RTS

;*-*
;; PrepReadMacros
; A0=MOD,D1=MMODE(SKIP IF 2)
PREPREADMACROS:
.XL:MOVE.W  (A0)+,D0
    BEQ.S   .X
    MOVE.L  A0,D7           ; MAC_NAME
    ADD.W   D0,A0
    MOVE.L  (A0)+,D6        ; MAC_NARGS+MAC_FLAGS+..
    MOVE.W  (A0)+,D0
    MOVE.L  A0,D5           ; MAC_BODY
    ADD.W   D0,A0
    CMP.W   #2,D1
    BEQ.S   .XL
    MOVE.L  D7,A1
    HASH    A1,D2,D3
    LSL.L   #2,D2
    ADD.L   #MACROHASH,D2
    MOVE.L  D2,A1           ; A1=HASHSPOT
    GETM    A2
    MOVE.L  (A1),(A2)       ; MAC_NEXT
    MOVE.L  A2,(A1)
    ADDQ.L  #4,A2
    MOVE.L  D7,(A2)+
    MOVE.L  D5,(A2)+
    MOVE.L  D6,(A2)+
    BSET    #0,-2(A2)       ; MAC_FLAGS = ITS AN IMPORTED MACRO!
    DONEM   A2
    BRA.S   .XL
.X: RTS

;*-*
;*-*

;;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
    BNE DAMAGEDCOOKIES
    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

;*-*

;;PARSE

; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ;
;   The Parsing Routines                    ;
; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ;

LEXMESSY:   DC.B    'lexical analysing ...',10
ENDLEXMESSY:    EVEN

TOKENIZE:
    MOVE.W  #-1,EXPORTFLAG
    BTST    #6,CODEPREFS+2      ; SEE IF EXPORT ALL
    BNE.S   .EA
    CLR.W   EXPORTFLAG
.EA:    MOVE.W  #2,CURSPOT
    BTST    #7,CODEPREFS+2
    BNE.S   .11
    MOVE.L  #LEXMESSY,D2
    MOVEQ   #ENDLEXMESSY-LEXMESSY,D3
    BSR WRITECON
.11:    CLR.W   LINENUM
    CLR.L   CONSTD
    MOVE.W  #1,ERRWHERE
.2: MOVE.L  CURECODE,A0
    CMP.L   ENDECODE,A0
    BPL.S   .1
    BSR PARSELINE
    BRA.S   .2
.1: TST.W   PREPSTACKSIZE
    BNE iERROR65
    MOVE.W  LINENUM,MAXLINENUM
    MOVE.L  CURINTERIM,A1
    MOVE.L  A1,TOKENEND
    MOVE.L  #-1,(A1)+
    MOVE.W  #-1,LINENUM
    MOVE.W  #0,ERRWHERE
    CLR.W   LINENUM2
    RTS

PARSELINE:
    BSR REALLOC1
    BSR WRITELINENUM
    MOVE.W  #-1,CURINS
    MOVE.L  CURECODE,A0
    MOVE.L  CURINTERIM,A1
    MOVE.W  #21,(A1)+
    MOVE.W  LINENUM2,(A1)+
    LEA 2(A1),A2
    MOVE.L  A2,STARTINTERIM
    MOVE.L  WORK,A2
    MOVEQ   #0,D0
    MOVE.W  D0,PARSEBRACKET
    MOVE.W  D0,XF
    MOVEQ   #0,D4
    MOVE.W  #-1,CURINS
PARSELOOP:
    MOVEQ   #0,D7
    MOVE.B  (A0)+,D7        ; CURRENT CHAR
    MOVE.B  (A0),D6         ; NEXT CHAR; WE CAN LOOK AHEAD ! YEAH !

    IFNE VERSION_020
        JMP  ([JUMPTAB.W,PC,D7.W*4])
    ELSE
        MOVE.W  D7,D5
        LSL.W   #2,D5
        MOVE.L  JUMPTAB(PC,D5.W),A4
        JMP (A4)
    ENDC


JUMPTAB:
    DC.L    PREPMACRODONE,E,E,E,E,E,E,E         ; 0
    DC.L    E,PARSELOOP,PARSEENDLINE,E,PARSELOOP,E,E,E  ; 8
    DC.L    E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E         ; 16
    DC.L    PARSELOOP,PARSEFLT,PARSELONGSTR,ASM_PARSEIMM    ; 32
    DC.L    PARSEHEXNUM,PARSEBINNUM,PARSEAMP,PARSESTRING       ; 36
    DC.L    PARSEOPEN,PARSECLOSE,PARSEPROD,PARSEPLUS    ; 40
    DC.L    PARSECOMMA,PARSEMINUS,PARSEPERIOD,PARSEDIV  ; 44
    DC.L    VAL,VAL,VAL,VAL,VAL,VAL,VAL,VAL         ; 48
    DC.L    VAL,VAL,PARSEBECOMES,PARSEENDLINE       ; 56
    DC.L    PARSESMALLER,PARSEEQ,PARSEBIGGER,QMARK  ; 60
    DC.L    E,ID,ID,ID,ID,ID,ID,ID              ; 64
    DC.L    ID,ID,ID,ID,ID,ID,ID,ID             ; 72
    DC.L    ID,ID,ID,ID,ID,ID,ID,ID             ; 80
    DC.L    ID,ID,ID,PARSESQ1,E,PARSESQ2,PARSEPTR,ID    ; 88
    DC.L    PARSEQUOTE,ID,ID,ID,ID,ID,ID,ID         ; 96
    DC.L    ID,ID,ID,ID,ID,ID,ID,ID             ; 104
    DC.L    ID,ID,ID,ID,ID,ID,ID,ID             ; 112
    DC.L    ID,ID,ID,PARSECURL1,PARSECONS,PARSECURL2,E,E    ; 120
    DC.L    E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E         ; 128
    DC.L    E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E         ; 144
    DC.L    E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E         ; 160
    DC.L    E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E         ; 176
    DC.L    E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E         ; 192
    DC.L    E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E         ; 208
    DC.L    E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E         ; 224
    DC.L    E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E         ; 240

E: BRA iERROR3

;; ","
PARSECOMMA:           ; ,
    MOVEQ   #COM,D4
    MOVE.W  D4,(A1)+
    BRA PARSELOOP
;*-*
;; + ++
PARSEPLUS:            ; + ++
    CMP.B   #'+',D6
    BEQ.S   .1
    MOVEQ   #7,D4
    MOVE.W  D4,(A1)+
    BRA PARSELOOP
.1: ADDQ.L  #1,A0
    MOVEQ   #33,D4
    MOVE.W  D4,(A1)+
    BRA PARSELOOP
;*-*
;; - --
PARSEMINUS:           ; - --
    CMP.B   #'-',D6
    BEQ.S   .1
    CMP.B   #'>',D6
    BEQ.S   .2
    MOVEQ   #8,D4
    MOVE.W  D4,(A1)+
    BRA PARSELOOP
.1: ADDQ.L  #1,A0
    MOVEQ   #34,D4
    MOVE.W  D4,(A1)+
    BRA PARSELOOP
.2: MOVEQ   #10,D0
.XL:CMP.B   (A0)+,D0
    BNE.S   .XL
    SUBQ.L  #1,A0
    BRA PARSELOOP
;*-*
;; "*"
PARSEPROD:            ; *
    CMP.B   #'/',D6
    BEQ iERROR27
    MOVEQ   #9,D4
    MOVE.W  D4,(A1)+
    BRA PARSELOOP
;*-*
;; / //
PARSEDIV:             ; *
    CMP.B   #'*',D6
    BEQ.S   COMMENT
    CMP.B   #"/",D6
    BEQ     .CMNT
    MOVEQ   #10,D4
    MOVE.W  D4,(A1)+
    BRA PARSELOOP
.CMNT:
    CMP.B   #10,(A0)+
    BNE     .CMNT
    SUBQ.L  #1,A0
    BRA PARSELOOP
;*-*
;; /* */
COMMENT:              ; /* */
    MOVE.L  A0,A3           ; BACKUP
    MOVE.L  LINENUM(PC),A4      ; BACKUPTOO
    MOVEQ   #1,D0           ; COUNTING COMMENTS
    MOVEQ   #'/',D1
    MOVEQ   #'*',D2
    MOVE.L  ENDECODE(PC),D3
    CMP.L   D3,A0
    BMI.S   .NM
    MOVEQ   #0,D3           ; IN A MACRO
.NM:    MOVEQ   #10,D5
    ADDQ.L  #1,A0
.1: TST.L   D0
    BEQ.S   .3
    TST.L   D3
    BEQ.S   .MA
    CMP.L   D3,A0
    BPL.S   .ER
.XB:MOVE.B  (A0)+,D7
    MOVE.B  (A0),D6
    CMP.B   D7,D5
    BEQ.S   .4
.5: CMP.B   D1,D7           ; IS THIS LIKE "/*" ?
    BNE.S   .2
    CMP.B   D2,D6
    BNE.S   .2
    ADDQ.L  #1,D0
    ADDQ.L  #1,A0
    BRA.S   .1
.2: CMP.B   D2,D7           ; OR LIKE "*/" ?
    BNE.S   .1
    CMP.B   D1,D6
    BNE.S   .1
    SUBQ.L  #1,D0
    ADDQ.L  #1,A0
    BRA.S   .1
.3: BRA PARSELOOP
.4: ADDQ.W  #1,LINENUM
    BRA.S   .5
.ER:    MOVE.L  A3,A0           ; FOR ERROR REPORT
    SUBQ.L  #1,A0
    MOVE.L  A4,LINENUM
    BRA iERROR27
.MA:    TST.B   (A0)
    BEQ.S   .ER
    BRA.S   .XB
;*-*
;; "`"
PARSEQUOTE:           ; `
    MOVEQ   #36,D4
    MOVE.W  D4,(A1)+
    BRA PARSELOOP
;*-*
;; "="
PARSEEQ:              ; =
    CMP.B   #">",D6
    BEQ     .1
    CMP.B   #"<",D6
    BEQ     .2
    MOVEQ   #11,D4
    MOVE.W  D4,(A1)+
    BRA PARSELOOP
.1: ADDQ.L  #1,a0
    MOVEQ   #14,D4
    MOVE.W  D4,(A1)+
    BRA PARSELOOP
.2: ADDQ.L  #1,A0
    MOVEQ   #15,D4
    MOVE.W  D4,(A1)+
    BRA PARSELOOP
;*-*
;; "^"
PARSEPTR:             ; ^
    MOVEQ   #32,D4
    MOVE.W  D4,(A1)+
    BRA PARSELOOP
;*-*
;; "&"
PARSEAMP:
    MOVE.W  #IOFF+29,D4
    MOVE.W  D4,(A1)+
    BRA PARSELOOP
;*-*
;; "!"
PARSEFLT:             ; !
    MOVEQ   #37,D4
    MOVE.W  D4,(A1)+
    BRA PARSELOOP
;*-*
;; "| ||"
PARSECONS:            ; |
    CMP.B   #"|",D6
    BEQ     .OR
    MOVEQ   #46,D4
    MOVE.W  D4,(A1)+
    BRA PARSELOOP
.OR:ADDQ.L  #1,A0
    MOVE.W  #IOFF+30,D4
    MOVE.W  D4,(A1)+
    BRA PARSELOOP
;*-*
;; "{"
PARSECURL1:           ; {
    MOVEQ   #23,D4
    MOVE.W  D4,(A1)+
    BRA PARSELOOP
;*-*
;; "}"
PARSECURL2:           ; }
    MOVEQ   #0,D4
    MOVE.W  #24,(A1)+
    BRA PARSELOOP
;*-*
MAXBRACK    = 50
CURBRACK:   DC.L    0
;; "["
PARSESQ1:             ; [
    MOVEQ   #29,D4
    MOVE.W  D4,(A1)+
    MOVE.L  CURBRACK(PC),A3     ; 29:INT, otherbrackoff:LONG
    CMPA.L  #BRACKETSBUF,A3
    BNE.S   .1
    MOVE.L  A0,SQBRAKPOS
    MOVE.L  LINENUM(PC),SQBRAKLINE
.1: MOVE.L  A1,(A3)+
    MOVE.L  A3,CURBRACK
    CLR.L   (A1)+
    BRA PARSELOOP
;*-*
;; "]"
PARSESQ2:             ; ]
    MOVEQ   #30,D4
    MOVE.W  D4,(A1)+
    MOVE.L  CURBRACK(PC),A3
    CMPA.L  #BRACKETSBUF,A3
    BEQ iERROR52
    MOVE.L  -(A3),A4
    MOVE.L  A3,CURBRACK
    MOVE.L  A1,D0
    SUB.L   A4,D0
    MOVE.L  D0,(A4)         ; OFFSET = {otherbrackoff} .. ob+2
    BRA PARSELOOP
;*-*
;; "."
PARSEPERIOD:          ; . .l .b .w
    MOVEQ   #26,D4
    CMP.B   #'W',D6
    BNE.S   .1
    MOVE.W  D4,(A1)+
    BRA .3
.1: CMP.B   #'B',D6
    BNE.S   .2
    MOVE.W  #28,(A1)+
    BRA .3
.2: CMP.B   #'L',D6
    BNE.S   .4
    MOVE.W  #27,(A1)+
.3: ADDQ.L  #1,A0
    BRA PARSELOOP
.4: CMP.B   #58,D6
    BMI.S   .5
.6: MOVEQ   #35,D4
    MOVE.W  D4,(A1)+
    BRA PARSELOOP
.5: CMP.B   #48,D6
    BMI.S   .6
    BRA PARSEVALUE
;*-*
;; > >= >>
PARSEBIGGER:          ; > >=
    CMP.B   #'=',D6
    BEQ.S   .1
    CMP.B   #">",D6
    BEQ     .2
    MOVEQ   #12,D4
    MOVE.W  D4,(A1)+
    BRA PARSELOOP
.1: MOVEQ   #14,D4
    MOVE.W  D4,(A1)+
    ADDQ.L  #1,A0
    BRA PARSELOOP
.2: ADDQ.L  #1,A0
    MOVEQ   #50,D4
    MOVE.W  D4,(A1)+
    BRA     PARSELOOP
;*-*
;; < <= <> <=> <<
PARSESMALLER:
    CMP.B   #'=',D6
    BEQ.S   .1
    CMP.B   #'>',D6
    BEQ.S   .2
    CMP.B   #"<",D6
    BEQ     .4
    MOVEQ   #13,D4          ; <
    MOVE.W  D4,(A1)+
    BRA PARSELOOP
.1: ADDQ.L  #1,A0
    CMP.B   #'>',(A0)
    BEQ.S   .3
    MOVEQ   #15,D4          ; <=
    MOVE.W  D4,(A1)+
    BRA PARSELOOP
.2: MOVEQ   #16,D4          ; <>
    MOVE.W  D4,(A1)+
    ADDQ.L  #1,A0
    BRA PARSELOOP
.3: MOVEQ   #40,D4          ; <=>
    MOVE.W  D4,(A1)+
    ADDQ.L  #1,A0
    BRA PARSELOOP
.4: MOVEQ   #49,D4
    ADDQ.L  #1,A0
    MOVE.W  D4,(a1)+
    BRA     PARSELOOP
;*-*
;; := : :: :=:
PARSEBECOMES:
    CMP.B   #'=',D6
    BNE.S   .1
    CMP.B   #':',1(A0)      ; :=:
    BEQ     .3
    MOVEQ   #ASSGN,D4       ; :=
    MOVE.W  D4,(A1)+
    MOVE.B  (A0)+,D7
    BRA PARSELOOP
.1: CMP.B   #':',D6
    BNE.S   .2
    MOVEQ   #41,D4          ; ::
    MOVE.W  D4,(A1)+
    MOVE.B  (A0)+,D7
    BRA PARSELOOP   
.2: MOVEQ   #19,D4          ; :
    MOVE.W  D4,(A1)+
    BRA PARSELOOP
.3: MOVEQ   #53,D4          ; :=:
    MOVE.W  D4,(A1)+
    ADDq.L  #2,A0
    BRA     PARSELOOP
;*-*
;; "("
PARSEOPEN:            ; (
    MOVEQ   #17,D4
    MOVE.W  D4,(A1)+
    TST.W   PARSEBRACKET
    BNE.S   .1
    MOVE.L  A0,BRAKPOS
    MOVE.L  LINENUM(PC),BRAKLINE
.1: ADDQ.W  #1,PARSEBRACKET
    BRA PARSELOOP
;*-*
;; ")"
PARSECLOSE:           ; )
    MOVEQ   #18,D4
    MOVE.W  D4,(A1)+
    TST.W   PARSEBRACKET
    BEQ iERROR20
    SUBQ.W  #1,PARSEBRACKET
    BRA PARSELOOP
;*-*
;; "?"
QMARK:
    MOVEQ   #52,D4
    MOVE.W  D4,(A1)+
    BRA     PARSELOOP
;*-*
PARSEBRACKET: DC.W    0
BRAKPOS:      DC.L    0
BRAKLINE:     DC.L    0
SQBRAKPOS:    DC.L    0
SQBRAKLINE:   DC.L    0

ID:
PARSEIDENT:
    MOVEQ   #0,D5           ; D5=HASHVALUE!!!
.3: HASHC   D5,D7
    MOVE.B  D7,(A2)+        ; IDENT
    CMP.B   #123,D6
    BPL.S   .4
    CMP.B   #97,D6
    BPL .2
    CMP.B   #91,D6
    BPL.S   .5
    CMP.B   #65,D6
    BPL .2
    CMP.B   #58,D6
    BPL.S   .4
    CMP.B   #48,D6
    BPL .2
.4: CLR.B   (A2)+           ; IDENT FINISHED
    MOVE.B  #-1,(A2)+
    HASHE   D5
    MOVE.L  D5,HASHVAL
    MOVE.L  WORK(PC),A2
    BTST    #7,CODEPREFS+1
    BEQ.S   .NMAC
    BSR PREPEXPAND
.NMAC:  MOVE.B  (A2),D0
    CMP.B   #'_',D0
    BMI.S   PARSEUPPER
    BRA.S   PARSELOWER
.2: MOVE.B  (A0)+,D7
    MOVE.B  (A0),D6
    BRA.S   .3
.5: CMP.B   #'_',D6
    BEQ.S   .2
    BRA.S   .4

HASHVAL:  DC.L    0       ; IDENT HASHVALUE!!!
INPROC:   DC.W    0
REGSTOP:  DC.W    0

PARSELOWER:
    BSR PARSEGETIDENTNR
    MOVE.L  WORK(PC),A2
    BRA PARSELOOP

PARSEUPPER:
    MOVE.B  1(A2),D0        ; INS or Ins or Rx
    CMP.B   #58,D0
    BMI ASM_PARSEREG
REGBACK:
    CMP.B   #'a',D0
    BPL PARSEUPLOW
    CMP.B   #'.',(A0)
    BEQ PARSECONSTASM
    BSR.W   PARSEGETINSNR       ; INS
    TST.W   D0
    BEQ PARSECONSTASM

    IFNE VERSION_020
        JMP ([.TAB-(4*IOFF).W,PC,D0.W*4])
    ELSE
        LEA .TAB-(4*IOFF)(PC),A3
        MOVE.L  D0,D1
        LSL.W   #2,D1
        MOVE.L  0(A3,D1.W),A3
        JMP (A3)
    ENDC


.TAB:
    DC.L    .P,   .EP,  .DONE,.DONE,.DONE,.DONE ; PROC .. WHILE
    DC.L    .DONE,.DONE,.DONE,.DONE,.DONE,.DONE ; ENDW .. DEFAULT
    DC.L    .DONE,.DONE,.DONE,.DONE,.D,   .DONE ; ENDS .. LOCAL
    DC.L    .DONE,.DONE,.DONE,.DONE,.DONE,.DONE ; ELSE .. INC
    DC.L    .DONE,.DONE,.DONE,.DONE,.DONE,.DONE ; DEC  .. AND
    DC.L    .DONE,.RESO,.RESO,.RESO,.DONE,.DONE ; OR   .. EXIT
    DC.L    .DONE,.DONE,.DONE,.DONE,.DONE,.DONE ; LARG .. ARRAY
    DC.L    .DONE,.DONE,.DONE,.DONE,.DONE,.DONE ; STRI .. LIST
    DC.L    .OBJ, .EOBJ,.DONE,.EP2, .DONE,.RESO ; OBJE .. ENUM
    DC.L    .RESO,.DONE,.HAND,.DONE,.RSE, .EXP  ; SET  .. EXPORT
    DC.L    .REG, .DONE,.EP,  .DONE,.DONE,.DONE ; REG  .. PRIVATE
    DC.L    .DONE,.DONE,.RESO,.DONE,.DONE,.DONE ; SUPE .. NOSTARTUP
    DC.L    .DONE,.DONE,.DONE,.DONE,.RESO,.DONE ; LINK .. STARTUP
    DC.L    .DONE,.DONE,.DONE,.DONE,.DONE,.DONE
    DC.L    .DONE,.DONE,.DONE,.DONE,.DONE,.DONE
    DC.L    .DONE,.DONE,.DONE,.DONE,.DONE,.DONE

;; .RESO
.RESO:
    TST.L   CONSTD
    BNE .SER
    MOVE.L  A1,CONSTD
    MOVE.L  LINENUM(PC),LINENUMZ
    MOVE.W  D0,(A1)+
    MOVE.W  D0,D4
    MOVE.L  WORK(PC),A2
    BRA PARSELOOP
;*-*
;; .BRAK
.BRAK:
    TST.W   PARSEBRACKET
    BNE iERROR20
    RTS
;*-*
;; .DONE
.DONE:
    MOVE.W  D0,(A1)+
    MOVE.W  D0,D4
    TST.W   MAXREGALLOC
    BNE .HEAVY          ; DO REGALLOC STATS
.HB:MOVE.L  WORK(PC),A2
    BRA PARSELOOP
;*-*
;; .P
.P: MOVE.W  #-1,.DEFF
    MOVE.W  #-1,INPROC
    MOVE.W  #-1,SCOPE
    CLR.W   REGSTOP
    BSR.S   .BRAK
    BRA.S   .RESO
.EP2:
    CMP.W   #18,D4          ; RETURN PREC ")" OR <OBJ>
    BEQ.S   .EP
    CMP.W   #31,D4
    BNE.S   .DONE
;*-*
;; .EP
.EP:CLR.W   INPROC
    CLR.W   SCOPE
    BSR.S   .BRAK
    BRA .DONE
;*-*
;; .OBJ
.OBJ:
    MOVE.L  #-1,OBJECTD
    CLR.L   OBJNAME
    BRA.S   .DONE
;*-*
;; .EOBJ
.EOBJ:
    CLR.L   OBJECTD
    BRA.S   .DONE
;*-*
;; .D
.D: TST.L   CONSTD
    BNE iERROR12
    TST.W   .DEFF
    BEQ     .DONE
    MOVE.L  #IOFF+17,D0     ; SET DEF TO LOCAL
    MOVE.W  #17,CURINS      ; FIX
    BRA.W   .DONE
.DEFF:  DC.W    0
;*-*
;; .RSE
.RSE:
    MOVE.W  #-1,BUSYRAISE
    BRA .RESO
;*-*
;; .SER
.SER:
    CMP.W   #IOFF+33,D0
    BNE iERROR12
    BRA .DONE
;*-*
;; .EXP
.EXP:
    MOVE.W  #-1,EXPORTFLAG
    TSTMOD
    BEQ iERROR49
    BRA .DONE
;*-*
;; .HAND
.HAND:
    MOVE.L  CPROC(PC),A2
    BSET    #2,2(A2)        ; SET NO_REGALLOC
    MOVE.W  #1,REGSTOP
    BRA .DONE
;*-*
;; .REG
.REG:
    CMP.W   #19,D4
    BNE .DONE
    MOVE.L  LASTID(PC),D1
    BEQ .DONE
    MOVE.L  D1,A3

    BTST    #3,5(A3)        ; SET REG!
    BNE iERROR50
    BSET    #3,5(A3)
    MOVE.L  6(A3),A6        ; A6=PROC
    TST.W   REGSTOP
    BNE iERROR56         ; NO :REG IN HANDLE
    ADDQ.B  #1,3(A6)
    MOVE.B  3(A6),D7
    EXT.W   D7
    CMP.W   #MAXREGVARS+1,D7
    BPL iERROR56         ; TOOMUCH regvars per proc
    NEG.W   D7
    ADDQ.W  #8,D7
    MOVE.W  D7,10(A3)       ; set regnum instead of offset

    BRA .DONE
;*-*
; UPDATE HEAVYNESS FACTOR ACCORDING TO KEYWORDS (KEY=D4)
;; .HEAVY
.HEAVY:
    TST.W   REGSTOP
    BNE .HB
    MOVE.B  (HEAVYTABLE-IOFF,PC,D4),D0
    MOVE.L  HEAVYNESS,D1        ; D1 BECOMES NEW HEAVYNESS
    EXT.W   D0
    CMP.B   #"s",D0
    BEQ.S   .SET1
    CMP.B   #"m",D0
    BEQ.S   .LOOP
    CMP.B   #"d",D0
    BEQ.S   .ELOOP
    CMP.B   #"i",D0
    BEQ.S   .IF
    CMP.B   #"e",D0
    BEQ.S   .EIF
    CMP.B   #"D",D0
    BEQ.S   .DO
    CMP.B   #"S",D0
    BEQ.S   .SEL
    CMP.B   #"U",D0
    BEQ.S   .UNTIL
    CMP.B   #"E",D0
    BEQ.S   .ESEL
.HEND:
    CMP.L   #1,D1
    BPL.S   .HEND2
    MOVEQ   #1,D1
.HEND2:
    MOVE.L  D1,HEAVYNESS
    BRA .HB
;*-*
;; .SET1
.SET1:
    MOVE.L  #MIDHEAVY,D1
    BRA.S   .HEND
;*-*
;; .LOOP
.LOOP:
    LSL.L   #3,D1
    ADDQ.W  #3,POSTDFACTOR
    BRA.S   .HEND
;*-*
;; .ELOOP
.ELOOP:
    LSR.L   #3,D1
    BRA.S   .HEND
;*-*
;; .IF
.IF:
    ADDQ.W  #1,POSTDFACTOR
    MOVE.W  #1,POSTACTION
    BRA.S   .HEND
;*-*
;; .EIF
.EIF:
    LSL.L   #1,D1
    BRA.S   .HEND
;*-*
;; .SEL
.SEL:
    LSL.L   #4,D1
    MOVE.W  #2,POSTACTION
    BRA.S   .HEND
;*-*
;; .ESEL
.ESEL:
    LSL.L   #2,D1
    BRA.S   .HEND
;*-*
;; .DO
.DO:MOVE.W  #1,POSTACTION
    CMP.W   #IOFF+25,D4     ; then?
    BNE.S   .HEND
    LSR.L   #1,D1
    ADDQ.W  #1,POSTMFACTOR
    SUBQ.W  #1,POSTDFACTOR
    BRA.S   .HEND
;*-*
;; .UNTIL
.UNTIL:
    ADDQ.W  #3,POSTDFACTOR
    MOVE.W  #1,POSTACTION
    BRA.S   .HEND
;*-*
;; HEAVY - Data
HEAVYNESS:  DC.L    MIDHEAVY
POSTMFACTOR:    DC.W    0
POSTDFACTOR:    DC.W    0
POSTACTION: DC.W    0       ; WHAT TO DO AT EOLN
                    ; 0=NOP, 1=FAC, 2=SEL
HEAVYTABLE:
        DC.B "ssie mdmdS  EmU"  ; PROC-UNTIL
        DC.B "          DmdD "  ; JUMP-AND
        DC.B "               "  ; OR-PTR
        DC.B "            s  "  ; OF-EXPORT
        DC.B "               "  ; REG...
        DC.B "               "
        EVEN

; s h:=8        start of PROC etc.
; m h:=h*8      start of loop
; d h:=h/8      end of loop
; i lf;h:=h/2   if
; e h:=h*2      endif
; E h:=h*4      endselect
; S h:=h*16;lf;/4   select
; D lf      do/then
; U lf;h:=h/8   until
;*-*
POSTOPTI:

;   MOVE.W  LINENUM,D0      ; WRITE TABLE AT $1E0000
;   MOVE.L  #$1E0000,A2
;   LSL.W   #2,D0
;   ADD.W   D0,A2
;   MOVE.L  HEAVYNESS,(A2)

    TST.W   MAXREGALLOC
    BEQ.S   .E
    TST.W   REGSTOP
    BNE.S   .E
    TST.W   POSTACTION
    BEQ.S   .EC
    MOVEM.L D0/D1,-(A7)
    MOVE.L  HEAVYNESS(PC),D1
    MOVE.W  POSTACTION(PC),D0
    CMP.W   #1,D0
    BNE.S   .S
    MOVE.W  POSTMFACTOR(PC),D0
    LSL.L   D0,D1
    MOVE.W  POSTDFACTOR(PC),D0
    LSR.L   D0,D1
    BRA.S   .R
.S: LSR.L   #6,D1           ; /16/4
.R: CMP.L   #1,D1
    BPL.S   .O
    MOVEQ   #1,D1
.O: MOVE.L  D1,HEAVYNESS
    MOVEM.L (A7)+,D0/D1
    CLR.W   POSTACTION
.EC:CLR.L   POSTMFACTOR
.E: RTS

CONSTD:       DC.L    0
OBJECTD:      DC.L    0
BUSYRAISE:    DC.W    0

;; CONST/Assembler
PARSECONSTASM:
    MOVE.L  WORK(PC),A2
    BSR     ASM_PARSE
    MOVE.L  WORK(PC),A2
    TST.L   D0
    BNE PARSELOOP

    IFEQ VERSION_020
        MOVE.L  #CONSTHASH,A3
        MOVE.L  HASHVAL,D0
        LSL.L   #2,D0
        ADD.L   D0,A3           ; A3=START CONST TABEL
    ELSE
        MOVE.L  HASHVAL,D0
        LEA     (D0.L*4,CONSTHASH),A3
    ENDC

    MOVE.L  A3,A6           ; A6=BACKUP
.1: MOVE.L  (A3),A3
    MOVE.L  A3,D0
    BEQ .3
    MOVE.L  CASCII(A3),A4       ; A4=ASCIIPTR
    MOVE.L  WORK(PC),A5     ; A5=THIS CONST
.2: CMPM.B  (A4)+,(A5)+
    BNE.S   .1
    CMP.B   #0,-1(A4)
    BNE.S   .2
    MOVEQ   #VALUE,D4
    MOVE.W  D4,(A1)+
    MOVE.L  CVAL(A3),(A1)+
    MOVE.L  WORK(PC),A2
    BRA PARSELOOP
.3: TST.L   CONSTD          ; MAKE NEW CONSTANT
    BEQ.S   .ER
    GETM    A3
    MOVE.L  A3,D0
    MOVE.L  WORK(PC),A4
.4: MOVE.B  (A4)+,(A3)+
    BNE .4
    MOVE.L  A3,D4
    BTST    #0,D4
    BEQ.S   .5
    CLR.B   (A3)+
.5: DONEM   A3
    MOVEQ   #25,D4
    MOVE.W  D4,(A1)+
    MOVE.L  D0,(A1)+
    MOVE.L  A6,(A1)+        ; HASHENTRY
    MOVE.L  WORK(PC),A2
    BRA PARSELOOP
.ER:MOVE.L  WORK(PC),ERROROBJ
    BRA iERROR1
;*-*
;; EFunction

XF:   DC.W    0       ; 0=NO F-FUNC, -1=F

PARSEUPLOW:           ; Ins
    BSR PARSELIBFUNCTION
    TST.L   D4
    BNE PLIBOUT
    LEA EFUNCTAB,A3     ; IT MIGHT BE AN E FUNCTION!
    MOVEQ   #0,D3
    MOVEQ   #0,D1
.1: MOVE.L  (A3)+,A4        ; ASC
    CMP.L   A4,D1
    BEQ.S   MIGHTBELIB
    ADD.L   #EFUNCENTRYSIZE-4,A3
    MOVE.L  A2,A5
    ADDQ.L  #1,D3
.2: CMPM.B  (A4)+,(A5)+
    BNE.S   .1
    CMP.B   #0,(A4)
    BNE.S   .2
    CMP.B   #0,(A5)
    BNE.S   .2
    CMP.B   #'F',-1(A4)
    BNE.S   .3
    MOVE.W  #-1,XF
    BRA.S   .4
.3: CLR.W   XF
.4: SUB.L   #16,A3
    MOVEQ   #22,D4
    MOVE.W  D4,(A1)+
    MOVE.L  A3,(A1)+


    MOVEM.L D0/A1,-(A7)         ; this part of code determines whether
    LEA EFUNCFLAGSTAB,A1        ; the command is an inline one or not.
    MOVE.W  -2(A1,D3.W*2),D0    ; If it is, nothing special happens (quit),
    BTST    #8,D0               ; but if it's not, the "COPY" flag is set
    BNE     .INLINE             ; to let the compiler know to copy this fragment of
    MOVE.L  #EFUNCBYTE,A3       ; code. DON'T EVER DELETE IT!
    MOVE.B  #-1,-1(A3,D3)
.INLINE:
    MOVEM.L (A7)+,D0/A1

    BRA.S   PLIBOUT
;*-*
;; Library call
MIGHTBELIB:
    MOVE.L  WORK(PC),A2
    MOVE.L  ACODE(PC),A3        ; IT MIGHT BE A LIBRARY CALL!
    MOVEQ   #0,D1           ; (WE USE ASMCODE BUF !!!)
.1: MOVE.L  (A3)+,A4        ; ASC
    CMP.L   A4,D1
    BEQ.S   PNOLIB
    MOVE.L  (A3)+,D0        ; D0=OFFSETS
    MOVE.W  (A3)+,D2        ; D2=EXCEPTION
    MOVE.L  A2,A5
.2: CMPM.B  (A4)+,(A5)+
    BNE.S   .1
    CMP.B   #32,(A4)
    BPL.S   .2
    CMP.B   #32,(A5)
    BPL.S   .2
    MOVEQ   #LIBC,D4
    TST.W   BUSYRAISE
    BNE.S   .RAISE
    MOVE.W  D4,(A1)+
    MOVE.L  D0,(A1)+
    MOVEQ   #0,D0
    MOVEQ   #0,D1           ; MOVEM.L MASK
    MOVE.L  A4,(A1)+
.4: MOVE.B  (A4)+,D0
    CMP.W   #16,D0
    BPL.S   .3
    BSET    D0,D1
    BRA.S   .4
.3: MOVE.W  D1,(A1)+
    MOVE.W  D2,(A1)+        ; PUT EXCEPTION #
    BRA.S   PLIBOUT
.RAISE: LEA -10(A3),A3
    MOVE.W  #38,(A1)+
    MOVE.L  A3,(A1)+
    BRA.S   PLIBOUT
PNOLIB:               ; WHAT ELSE?
    MOVE.L  WORK(PC),ERROROBJ
    BRA iERROR24
PLIBOUT:
    MOVE.L  WORK(PC),A2
    BRA PARSELOOP
;*-*
;; LibFunction
PARSELIBFUNCTION:
; quite intelligent :)
; searches the whole list for best match
; (note it checks for best matching CPU, FPU, MMU and OSVersion)
; the highest priority has the cpu required.
; so __OSVERSION=37 is same as __CPU=020 or (_FPU=68040 and _MMU=68040)
    MOVE.W  #-32768,.RES1
    CLR.L   .RES2
    clr.w   .RES3
    MOVE.L  D0,-(A7)
    MOVE.L  HASHVAL,D0
    LSL.W   #2,D0
    MOVE.L  #LIBHASH,A3
    ADD.L   D0,A3
    ADDQ.L  #4,A3
.FIND:
    MOVE.L  LIB_NEXT(A3),D0
    BEQ     .NFOUND
    MOVE.L  D0,A3
    MOVE.L  LIB_NAME(A3),A4
    MOVE.L  A2,A5
.CHK:
    CMPM.B  (A4)+,(A5)+
    BNE .FIND
    TST.B   -1(A4)
    BNE .CHK
    TST.B   -1(A5)
    BNE .CHK
    move.w  #-1,.RES3
    move.w  TCPU,d4
    cmp.w   LIB_CPU(A3),d4
    blt     .CHK
    MOVE.W  LIB_CPU(A3),D0
    DIVU.W  #5,D0
    move.w  EFPU,D4
    cmp.w   LIB_FPU(A3),d4
    blt     .CHK
    ADD.W   LIB_FPU(A3),D0

    move.w  EMMU,D4
    cmp.w   LIB_MMU(A3),D4
    blt     .CHK
    ADD.W   LIB_MMU(A3),D0

    move.w  OSVERSION,D4
    cmp.w   LIB_OSVERS(A3),D4
    blt     .CHK

    ADD.W   LIB_OSVERS(A3),D0
    SUB.W   #33,D0
    CMP.W   .RES1,D0
    BLT     .CHK
    MOVE.W  D0,.RES1
    MOVE.L  A3,.RES2
    BRA     .CHK
.FOUND:
    MOVEQ   #54,D4
    move.w  d4,(a1)+
    MOVE.L  .RES2,A3
    move.l  A3,(a1)+
    move.l  #-1,LIB_USED(a3)      ; set "used"
    MOVE.L  (A7)+,D0
    rts
.NFOUND:
    TST.L   .RES2
    BNE .FOUND
    tst.w   .RES3
    BNE iERROR53
    moveq   #0,d4
    MOVE.L  (A7)+,D0
    rts
.RES1:
    DC.W    0
.RES2:
    DC.L    0
.RES3:
    DC.W    0
;*-*
;; VALUES
VAL:
;; DEC
PARSEVALUE:
.2: MOVE.B  D7,(A2)+
    MOVE.B  (A0)+,D7
    CMP.B   #58,D7
    BPL.S   .1
    CMP.B   #48,D7
    BPL .2
    CMP.B   #".",D7
    BEQ.S   .2
.1: SUBQ.L  #1,A0
    MOVE.B  #0,(A2)+        ; VALUE FINISHED
    MOVE.L  WORK(PC),A2
    BSR PARSEGETVALUE
    MOVE.L  WORK(PC),A2

    MOVEQ   #VALUE,D4
    TST.L   D7
    BEQ.S   .3
    ADD.W   #42,D4          ; FLOAT
.3:
    MOVE.W  D4,(A1)+
    MOVE.L  D0,(A1)+
    BRA PARSELOOP
;*-*
;; HEX
PARSEHEXNUM:
    MOVE.L  WORK(PC),A2
    MOVE.L  A2,D3
    MOVEQ   #0,D1           ; RESULT
    MOVEQ   #0,D2           ; #OF SHIFTS
.4: MOVE.B  (A0)+,D0
    CMP.B   #"G",D0
    BPL.S   .2B
    CMP.B   #"0",D0
    BMI.S   .1
    CMP.B   #"9"+1,D0
    BPL.S   .2
.3: MOVE.B  D0,(A2)+
    BRA.S   .4
.1: CMP.L   A2,D3
    BEQ.S   .5
    MOVEQ   #0,D0
    MOVE.B  -(A2),D0
    SUB.B   #48,D0
    CMP.W   #32,D2
    BEQ iERROR7
    LSL.L   D2,D0
    ADD.L   D0,D1
    ADDQ.L  #4,D2
    BRA.S   .1
.5: MOVEQ   #VALUE,D4
    MOVE.W  D4,(A1)+
    MOVE.L  D1,(A1)+
    SUBQ.L  #1,A0
    MOVE.L  WORK(PC),A2
    BRA PARSELOOP
.2: CMP.B   #"A",D0
    BMI.S   .1
    SUB.B   #7,D0
    BRA.S   .3
.2B:    CMP.B   #"a",D0
    BMI.S   .1
    CMP.B   #"g",D0
    BPL.S   .1
    SUB.B   #7+32,D0
    BRA.S   .3
;*-*
;; BIN
PARSEBINNUM:
    MOVE.L  WORK(PC),A2
    MOVE.L  A2,D3
    MOVEQ   #0,D1           ; RESULT
    MOVEQ   #0,D2           ; BITNUM
.4: MOVE.B  (A0)+,D0
    CMP.B   #"1",D0
    BEQ.S   .R
    CMP.B   #"0",D0
    BNE.S   .1
.R: MOVE.B  D0,(A2)+
    BRA.S   .4
.1: CMP.L   A2,D3
    BEQ.S   .5
    MOVEQ   #0,D0
    MOVE.B  -(A2),D0
    SUB.B   #"0",D0
    BEQ.S   .NS
    BSET    D2,D1
.NS:    CMP.W   #32,D2
    BEQ iERROR7
    ADDQ.L  #1,D2
    BRA.S   .1
.5: MOVEQ   #VALUE,D4
    MOVE.W  D4,(A1)+
    MOVE.L  D1,(A1)+
    SUBQ.L  #1,A0
    MOVE.L  WORK(PC),A2
    BRA PARSELOOP
;*-*
;; STR
PARSELONGSTR:
    MOVEQ   #0,D0           ; RESULT
    MOVEQ   #24,D1          ; SHIFTCOUNT
.1: MOVEQ   #0,D2
    MOVE.B  (A0)+,D2
    CMP.B   #34,D2
    BEQ.S   .2
    CMP.B   #10,D2
    BEQ iERROR8
    CMP.L   #-8,D1
    BEQ iERROR8
    CMP.B   #"\",D2
    BEQ.S   .SP
.SPB:
    LSL.L   D1,D2
    ADD.L   D2,D0
    SUBQ.L  #8,D1
    BRA.S   .1
.2: ADDQ.L  #8,D1           ; 0,32=NOSHIFT
    CMP.W   #32,D1
    BPL.S   .3
    TST.W   D1
    BEQ.S   .3
    LSR.L   D1,D0
.3: MOVEQ   #VALUE,D4
    MOVE.W  D4,(A1)+
    MOVE.L  D0,(A1)+
    MOVE.L  WORK(PC),A2
    BRA PARSELOOP
.SP:
    MOVE.B  (A0)+,D2
    CMP.B   #"x",D2
    bEQ     .EXTHEX
    LEA .SPT(PC),A3
.SPL:
    ADDQ.L  #1,A3
    CMP.B   (A3),D2
    BEQ.S   .SPD
    TST.B   (A3)+
    BNE.S   .SPL
    BRA iERROR26
.SPD:
    MOVE.B  -(A3),D2
    BRA.S   .SPB

.EXTHEX:
    MOVEM.L D0-D1/D3-D7/A1-A6,-(A7)
    MOVEQ   #1,D0
    MOVEQ   #0,D1
.LP:
    MOVE.B  (A0)+,D2
    CMP.B   #"0",D2
    BLT     iERROR72
    CMP.B   #"9",D2
    BLE     .DEC
    CMP.B   #"A",D2
    BLT     iERROR72
    CMP.B   #"F",D2
    BLE     .HEX
    CMP.B   #"a",D2
    BLT     iERROR72
    CMP.B   #"f",D2
    BGT     iERROR72
    BCLR    #5,D2
.HEX:
    SUB.B   #"A"+10,D2
    AND.B   #$F,D2
    OR.B    D2,D1
    BRA     .X
.DEC:
    SUB.B   #"0",D2
    AND.B   #$F,D2
    OR.B    D2,D1
.X: LSL.W   #4,D1
    DBF     D0,.LP
    MOVE.L  D1,D2
    LSR.W   #4,D2
    MOVEM.L (A7)+,D0-D1/D3-D7/A1-A6
    BRA     .SPB



.SPT:   DC.B    10,"n",39,"a",34,"q",27,"e",9,"t","\","\",0,"0",13,"b",11,"v"
;*-*
;*-*

CONTINUETAB:
        DC.B    0,0,1,1,1,0,0           ; EOS .. STR
        DC.B    1,1,1,1,1,0,1,1,1,0,1,0 ; "+" .. ")"
        DC.B    0,0,0,1,1,0,0,0,0,0     ; ":" .. ".B"
        DC.B    1,0,0,1,0,0,1,1,0       ; "[" .. "|"
        DC.B    1,0,1,1,0               ; LIB .. OBJA
        DC.B    0,0,0,0,0,0,0,0,0,0,0,0 ; ..
        DC.B    0,0,0,0,0,0,0,0,0,0,0,0 ; ..
        DC.B    0,0,0,0,0,0,0,0,0,0,0,0 ; ..
        EVEN

PARSEENDLINE:
    CMP.L   ENDECODE(PC),A0
    BPL.S   .SKIP
    CMP.W   #IOFF+65,D4
    BPL.S   .SKIP
    TST.W   D4
    BMI.S   .SKIP
    CMP.L   #BRACKETSBUF,CURBRACK       ; OPEN [ ( COUNT
    BNE PCONTINUE
    TST.W   PARSEBRACKET
    BNE PCONTINUE
    CMP.W   #IOFF,D4
    BPL.S   .2TAB
    TST.B  CONTINUETAB(PC,D4.W)         ; CHECK FOR "," ETC.
    BNE PCONTINUE
    BRA.S   .1
.2TAB:
    TST.B  CONTINUEKEY-IOFF(PC,D4.W)    ; CHECK FOR KEYWORDS
    BNE PCONTINUE
    BRA.S   .1
.SKIP:
    CMP.L   #BRACKETSBUF,CURBRACK
    BEQ.S   .1C
    MOVE.L  SQBRAKPOS(PC),D0
    BEQ.S   .1D
    MOVE.L  D0,A0
    MOVE.L  SQBRAKLINE(PC),LINENUM
.1D:BRA iERROR34
.1C:TST.W   PARSEBRACKET
    BEQ.S   .1
    MOVE.L  BRAKPOS(PC),D0
    BEQ.S   .1B
    MOVE.L  D0,A0
    MOVE.L  BRAKLINE(PC),LINENUM
.1B:BRA iERROR20
.1: MOVE.L  CONSTD(PC),D0
    BNE RESOLVECONST
RESBACK:
    BTST    #6,CODEPREFS+2      ; SEE IF EXPORT ALL
    BNE.S   .EA
    CLR.W   EXPORTFLAG
.EA:MOVE.L  A0,CURECODE
    MOVEQ   #0,D4
    MOVE.W  D4,(A1)+
    CMP.B   #10,-1(A0)
    BNE.S   .2
    ADDQ.W  #1,LINENUM      ; COUNT LINES
    MOVE.W  LINENUM(PC),LINENUM2
.2: MOVE.L  STARTINTERIM(PC),A0 ; SEE IF WE PARSED AN EMPTY LINE
    CMP.L   A1,A0
    BEQ.S   .1
    MOVE.L  A1,CURINTERIM
    ADDQ.W  #1,STATS
    BRA.S   .3
.1: SUBQ.L  #6,A0
    MOVE.L  A0,CURINTERIM
.3: BSR POSTOPTI
    RTS             ; THE ONLY WAY OUT

CONTINUEKEY:
        DC.B    1,0,1,0,1,1,0,1,0,1,1,0 ; PROC .. DEFA
        DC.B    0,0,1,1,1,1,0,1,0,0,0,1 ; ENDS .. INC
        DC.B    1,1,0,0,0,1,1,1,1,0,0,0 ; DEC  .. FULL
        DC.B    0,0,0,1,1,0,0,1,1,1,1,0 ; LARG .. LIST
        DC.B    1,0,1,0,1,1,1,1,0,0,1,0 ; OBJE .. EXPO
        DC.B    0,1,1,1,0,0,0,0,1,0,0,0 ; REG  .. LINK
        DC.B    1,0,1,0,0,0,0,0,0,0,0,0 ; EXTR ..
        EVEN


; ALSO CALLED FROM PREP!!!

MOVEBUF:
    MOVE.L  A1,CURINTERIM       ; FOR CHECK.
    MOVE.L  A1,D7           ;
    BSR REALLOC1        ; CHECK DOUBLECHECK
    MOVE.L  CURINTERIM(PC),A1   ;
    SUB.L   A1,D7           ;
    BEQ.S   .1          ;
    NEG.L   D7          ;
    ADD.L   D7,STARTINTERIM     ;
    TST.L   CONSTD          ;
    BEQ.S   .1          ;
    ADD.L   D7,CONSTD       ;
.1: RTS

PCONTINUE:
    BSR.S   MOVEBUF
    CMP.B   #10,-1(A0)
    BNE PARSELOOP
    ADDQ.W  #1,LINENUM      ; COUNT LINES
    BRA PARSELOOP

REBACK:
    MOVE.W  #1,ERRWHERE
    MOVE.L  LINENUMZ,LINENUM
    BRA RESBACK

STATS:    DC.W    0

;; RESOLVECONST
RESOLVECONST:
    ADDQ.W  #1,STATS
    MOVE.W  #2,ERRWHERE     ; A1 NOW
    MOVE.L  LINENUM(PC),D6
    MOVE.L  LINENUMZ(PC),LINENUM
    MOVE.L  D6,LINENUMZ
    MOVE.L  A1,D6           ; D6=ENDPARSE
    MOVEQ   #0,D4
    MOVE.W  D4,(A1)+
    MOVE.L  D0,A1
    MOVE.L  D0,A3
    MOVE.L  A3,INTERMED     ; !!!!
    MOVE.W  (A3)+,D7        ; INS. CODE
    CLR.L   CONSTD
    CMP.W   #IOFF,D7
    BEQ PROCPARSE
    CMP.W   #IOFF+32,D7
    BEQ .OPT
    CMP.W   #IOFF+33,D7
    BEQ MODULELOAD
    CMP.W   #IOFF+76,D7
    BEQ LIBLOAD
    CMP.W   #IOFF+53,D7
    BEQ DOENUM
    CMP.W   #IOFF+54,D7
    BEQ DOSET
    CMP.W   #IOFF+58,D7
    BEQ DORAISE
    CMP.W   #IOFF+68,D7
    BEQ DOLIBRARY
.1: TST.W   INPROC
    BNE iERROR35
;; CONST
    GETM    A4          ; CONST
    CMP.W   #25,(A3)+
    BNE iERROR0
    MOVE.L  (A3)+,4(A4)
    MOVE.L  (A3)+,A6
    MOVE.L  (A6),(A4)
    MOVE.L  A4,(A6)
    ADDQ.L  #8,A4
    CMP.W   #11,(A3)+
    BNE iERROR0
    MOVE.L  A0,-(A7)
    BSR ASM_GRABVALUE
    MOVE.L  (A7)+,A0
    CMP.W   #-1,D0
    BEQ iERROR30
    MOVE.L  D1,(A4)+
    CLR.W   (A4)+
    TST.W   EXPORTFLAG
    BEQ.S   .NE
    BSET    #0,-2(A4)
.NE:DONEM   A4
    CMP.W   #COM,(A3)+
    BEQ.S   .1
    TST.W   -2(A3)
    BNE iERROR0
    BRA REBACK
;*-*
;; OPTS
.OPT:   CMP.W   #1,STATS        ; OPT
    BNE iERROR35
    CLR.W   STATS
.2: MOVE.W  (A3)+,D7
    CMP.W   #VALUE,D7
    BEQ .CPU
;; STACK
    CMP.W   #IOFF+34,D7     ; --> STACK=X
    BNE.S   .4B
    CMP.L   #$B0001,(A3)+
    BNE iERROR0
    MOVE.L  (A3)+,D7
    CMP.L   #MINSTACKSIZE,D7
    BMI iERROR31
    BSET    #0,CODEPREFS+3
    MOVE.L  D7,CODESTACK
    BRA .5
;*-*
;; PREPROCESS
.4B:
    CMP.W   #IOFF+67,D7     ; --> PREPROCESS
    BNE.S   .4BB
    BSET    #7,CODEPREFS+1
    BRA .5
;*-*
;; EXPORT
.4BB:
    CMP.W   #IOFF+59,D7     ; --> EXPORT
    BNE.S   .4C
    BSET    #6,CODEPREFS+2
    BRA .5
;*-*
;; RTD
.4C:
    CMP.W   #256+117,D7        ; --> RTD
    BNE.S   .4D
    CMP.W   #0,(A3)+
    BNE iERROR0
    ;BSET   #0,CODEPREFS+1      ; probs with hooks/callbacks etc.
    BRA .5
;*-*
;; REG
.4D:
    CMP.W   #IOFF+60,D7     ; --> REG=X
    BNE.S   .6
    CMP.L   #$B0001,(A3)+
    BNE iERROR0
    MOVE.L  (A3)+,D7
    TST.L   D7
    BMI iERROR31
    CMP.L   #MAXREGVARS+1,D7
    BPL iERROR31
    MOVE.W  D7,MAXREGALLOC
    BRA .5
;*-*
;; ASM
.6: CMP.W   #IOFF+37,D7     ; --> ASM
    BNE.S   .7
    BSET    #3,CODEPREFS+3
    MOVE.W  #-1,SCOPE       ;     NO NEED OF SCOPES ANYMORE
    MOVE.W  #-1,MAINF       ;     ... AND NO MAIN EITHER
    BRA .5
;*-*
;; NOWARN
.7: CMP.W   #IOFF+38,D7     ; --> NOWARN
    BNE.S   .8
    BSET    #4,CODEPREFS+3
    BRA .5
;*-*
;; DIR
.8: CMP.W   #IOFF+43,D7     ; --> DIR
    BNE.S   .9
    CMP.L   #$B0006,(A3)+
    BNE iERROR0
    ADDQ.L  #2,A3
    MOVE.W  (A3)+,D0
    MOVE.L  DIRNAMEX(PC),A4
    SUBQ.W  #1,D0
.XL:MOVE.W  (A3)+,(A4)+
    DBRA    D0,.XL
    BRA     .5
;*-*
;; OSVERSION
.9: CMP.W   #IOFF+52,D7     ; --> OSVERSION
    BNE.S   .10
    BSET    #0,CODEPREFS+2
    CMP.L   #$B0001,(A3)+
    BNE iERROR0
    MOVE.L  (A3)+,D7
    CMP.L   #33,D7
    BMI iERROR31
    CMP.L   #100,D7
    BPL iERROR31
    MOVE.W  D7,OSVERSION
    BRA     .5
;*-*
;; LARGE
.10:
    CMP.W   #IOFF+36,D7     ; --> LARGE
    BNE.S   .11
    BSET    #2,CODEPREFS+3
    BRA     .5
;*-*
;; MODULE
.11:
    CMP.W   #IOFF+33,D7     ; --> MODULE (OPT)
    BNE .UTIL
    BSET    #4,CODEPREFS+2
    BRA     .5
;*-*
;; UTILLIB
.UTIL:
    CMP.W   #IOFF+69,D7
    BNE     .POOL
    CMP.W   #37,OSVERSION
    BLT     iERROR78
    BSET    #7,CODEPREFS
    JSR     SETUPUTIL
    BRA     .5
;*-*
;; POOL
.POOL:
    CMP.W   #IOFF+70,D7
    BNE     .LINK
    CMP.W   #39,OSVERSION
    BLT     iERROR78
    BSET    #6,CODEPREFS
    CMP.W   #17,(A3)
    BNE     .5
    ADDQ.L  #2,A3
    CMP.W   #VALUE,(A3)+
    BNE     iERROR73
    MOVE.L  (A3)+,OPENPOOL+2
    CMP.W   #COM,(A3)
    BNE     .PX
    ADDQ.L  #2,A3
    CMp.W   #VALUE,(A3)+
    BNE     iERROR73
    MOVE.L  (A3)+,OPENPOOL+8
    CMP.W   #COM,(A3)
    BNE     .PX
    ADDQ.L  #2,A3
    CMP.W   #VALUE,(A3)+
    BNE     iERROR73
    MOVE.L  (A3)+,OPENPOOL+14
.PX:CMP.W   #18,(a3)+
    BNE     iERROR74
    BRA     .5
;*-*
;; LINKABLE
.LINK:
    CMP.W   #IOFF+72,D7
    BNE     .NOST
    TST.L   LIBINFO
    BNE     iERROR50
    BSET    #5,CODEPREFS
    BRA     .5
;*-*
;; NOSTARTUP
.NOST:
    CMP.W   #IOFF+71,D7
    BNE     .INLINE
    BSET    #4,CODEPREFS
    BRA     .5
;*-*
;; INLINE
.INLINE:
    CMP.W   #IOFF+74,D7
    BNE     .STARTUP
    BSET    #7,ICODEPREFS+3
    BRA     .5
;*-*
;; STARTUP
.STARTUP:
    CMP.W   #IOFF+77,D7
    BNE     .FPEXP

    BTST    #2,CODEPREFS
    BNE iERROR50
    BSET    #2,CODEPREFS
    MOVEQ   #0,d2
    CMP.W   #11,(A3)+
    BNE     iERROR0
    CMP.W   #STR,(A3)+
    BNE     iERROR0
    ADDQ.L  #2,A3
    move.w  (A3)+,d2
    SUBQ.W  #1,D2
    LEA     STCNAME,A4
.LOOP:
    MOVE.W  (A3)+,(A4)+
    DBRA D2,.LOOP

    BRA .5
;*-*
;; FPEXP
.FPEXP
    cmp.w   #IOFF+81,D7
    BNE iERROR0
    tst.w   EFPU
    beq iERROR53
    bset    #1,CODEPREFS
    bra .5
;*-*

.5: CMP.W   #COM,(A3)+
    BEQ .2
    TST.W   -2(A3)
    BNE iERROR0
    JSR     PATCHER
    BRA REBACK
;; CPU
.CPU:
    MOVE.L  (A3)+,D7        ; --> OPT 040
    LEA CPUTAB(PC),A6
.CPUL:
    CMP.W   #-1,(A6)
    BEQ iERROR31
    ADD.L   #10,A6
    CMP.W   (A6),D7
    BNE.S   .CPUL
    MOVE.W  (A6)+,D0
    cmp.w   #$060,d0
    bpl .CPU2
    move.w  D0,TCPU
.CPU2:
    MOVE.W  (A6)+,D0
    BEQ.S   .C1
    TST.W   ECPU
    BNE iERROR50
    MOVE.W  D0,ECPU
.C1:MOVE.W  (A6)+,D0
    BEQ.S   .C2
    TST.W   EFPU
    BNE iERROR50
    MOVE.W  D0,EFPU
.C2:MOVE.W  (A6)+,D0
    MOVE.W  ASMCPU(PC),D1
    BSET    D0,D1
    MOVE.W  D1,ASMCPU
    MOVE.W  (A6)+,D0
    MOVE.W  D0,EMMU
    BRA     .5
;*-*
;*-*
;; MODULE
MODULELOAD:
    TST.W   SCOPE           ; global scope only!
    BNE iERROR35             ;
    MOVEM.L A0/A1,-(A7)     ; MODULE    ; D4 GETRASHED!
MODULELOOP:
    CLR.L   THISMOD         ;
    MOVE.L  DOSBASE,A6      ;
    CMP.W   #STR,(A3)+      ;
    BNE iERROR0              ;
    ADDQ.L  #2,A3           ;
    MOVE.W  (A3)+,D0        ; string length (in words)
    MOVE.L  A3,A0           ; A0=MOD name
    MOVE.L  A0,A1           ;
    LOWER   A1,D1           ;
BLAAAAAARGH:
    EXT.L   D0              ;
    LSL.L   #1,D0           ; string length
    ADD.L   D0,A3           ;
    CMP.B   #"*",(A0)       ; check if in cdir
    BNE.S   .STD            ;
    ADDQ.L  #1,A0           ;
    MOVE.L  #PRINTBUF,D1    ;
    CLR.B   PRINTBUF        ;
    BRA.S   .CUR            ;
.STD:
    MOVE.L  DIRNAMEX(PC),D1 ; directory name
.CUR:
    MOVE.L  D1,D6           ; BOTH MODPATH
    MOVE.L  D1,A1           ;
    LOWER   A1,D7           ;
    MOVE.L  A1,D7           ; D7=NAMEOFFSET
    MOVE.B  -1(A1),D0       ;
    CMP.L   A1,D1           ;
    BEQ.S   .2              ;
    CMP.B   #':',D0         ;
    BEQ.S   .2              ;
    CMP.B   #'/',D0         ;
    BEQ.S   .2              ;
    MOVE.B  #'/',(A1)+      ; the path :)
.2: MOVE.B  (A0)+,(A1)+     ; copy
    BNE.S   .2              ;
    MOVE.B  #'.',-1(A1)
    MOVE.B  #'m',(A1)+
    MOVE.B  #0,(A1)+
    MOVE.L  D1,CACHENAMESTART
    MOVE.L  A1,CACHENAMEEND
    BSR SEARCHINMODLIST     ; CHECK CIRC. INCLUSIONS ETC.
    TST.L   D0
    BEQ.S   .1
    MOVE.L  D0,A0
    BTST    #0,MI_FLAGS(A0)
    BEQ .NEXT
    BCLR    #0,MI_FLAGS(A0)
    MOVE.L  A0,THISMOD
.1: BSR SEARCHINCACHE       ; SEE IF MODULE IS ALREADY THERE
    MOVE.L  D0,A0
    TST.L   D0
    BNE.S   .GOTM

    MOVE.L  D6,D0
    BSR FILELENGTH
    MOVE.L  D0,D3
    BEQ iERROR36
    BMI iERROR36
    MOVE.L  #1005,D2
    JSR -30(A6)         ; OPEN
    MOVE.L  D0,D5           ; D5=HANDLE
    BEQ iERROR36
    MOVE.L  D3,D0
    ADDQ.L  #8,D0
    BSR NEWCACHE
    MOVE.L  D0,D2
    BEQ iERROR38
    MOVE.L  D5,D1
    JSR -42(A6)         ; READ
    MOVE.L  D0,D4
    MOVE.L  D5,D1
    JSR -36(A6)         ; CLOSE
    CMP.L   D3,D4
    BNE iERROR36
    MOVE.L  D2,A0
    ADD.L   D3,D2
    MOVE.L  D2,A1
    CLR.B   (A1)+
    CLR.B   (A1)+
    CLR.B   (A1)+
    CLR.B   (A1)+
    CLR.B   (A1)+
    CLR.B   (A1)+           ; max 8!
.GOTM:  MOVEM.L D0-D7/A0-A6,-(A7)
    TST.L   THISMOD
    BEQ.S   .3
    MOVE.L  THISMOD,A1
    MOVE.L  A0,MI_MOD(A1)
    BRA.S   .GM
.3: GETM    A1              ; CREATE A MODINFO
    MOVE.L  A1,THISMOD
    MOVE.L  MODINFOLIST(PC),(A1)        ; MI_NEXT
    MOVE.L  A1,MODINFOLIST
    ADDQ.L  #4,A1
    CLR.W   (A1)+               ; MI_FLAGS
    MOVE.L  CACHENAMEEND(PC),A2
    SUB.L   CACHENAMESTART(PC),A2
    MOVE.L  A2,(A1)+            ; MI_NAMELEN
    MOVE.L  A0,(A1)+            ; MI_MOD
    CLR.L   (A1)+               ; MI_LIST
    LEA 4(A1),A2
    MOVE.L  A2,(A1)+            ; MI_NAMEPTR
    MOVE.L  CACHENAMESTART(PC),A2       ; MI_NAME
.XL:MOVE.B  (A2)+,(A1)+
    BNE.S   .XL
    MOVE.L  A1,D0
    BTST    #0,D0
    BEQ.S   .E
    CLR.B   (A1)+
.E: DONEH   A1
.GM:    CMP.L   #"EMOD",(A0)+
    BNE iERROR36
    JSR MODULEJOBENTRY
    MOVEM.L (A7)+,D0-D7/A0-A6
.NEXT:  MOVE.L  D7,A0
    MOVE.B  #0,(A0)+
    CMP.W   #COM,(A3)+
    BEQ MODULELOOP
    TST.W   -2(A3)
    BNE iERROR0
    MOVEM.L (A7)+,A0/A1
    BRA REBACK

MODINFOLIST:  DC.L    0

; GETS NAME FROM CACHENAMESTART, RETURNS MODINFO OR NIL IN D0

SEARCHINMODLIST:
    MOVEM.L D1-D2/A0-A2,-(A7)
    LEA MODINFOLIST(PC),A0  ; A0=MODLIST
    MOVE.L  CACHENAMESTART(PC),D1   ; D1=NAME
    MOVE.L  CACHENAMEEND(PC),D2
    SUB.L   D1,D2           ; D2=LEN
.XL:MOVE.L  (A0),D0
    BEQ.S   .X
    MOVE.L  D0,A0
    CMP.L   MI_NAMELEN(A0),D2
    BNE.S   .XL
    MOVE.L  MI_NAMEPTR(A0),A1
    MOVE.L  D1,A2
.CMP:   CMPM.B  (A1)+,(A2)+
    BNE.S   .XL
    TST.B   -1(A1)
    BNE.S   .CMP
    MOVE.L  A0,D0
.X: MOVEM.L (A7)+,D1-D2/A0-A2
    RTS

AGAIN:    DC.W    0

SECONDARYLOAD:
.ML:    CLR.W   AGAIN
    MOVE.L  DOSBASE,A6      ; A6=BASE
    LEA MODINFOLIST(PC),A5  ; A5=LIST
.XL: MOVE.L  (A5),D0
    BEQ.W   .X
    MOVE.L  D0,A5
    BTST    #0,MI_FLAGS(A5)
    BEQ.S   .XL
    BCLR    #0,MI_FLAGS(A5)

    MOVE.L  MI_NAMEPTR(A5),D0
    MOVE.L  D0,ERROROBJ
    MOVE.L  D0,CACHENAMESTART
    ADD.L   MI_NAMELEN(A5),D0
    MOVE.L  D0,CACHENAMEEND
    BSR SEARCHINCACHE
    MOVE.L  D0,A0
    TST.L   D0
    BNE.S   .GOTM

    MOVE.L  MI_NAMEPTR(A5),D0
    BSR FILELENGTH
    MOVE.L  D0,D3
    BEQ iERROR36
    BMI iERROR36

    MOVE.L  MI_NAMEPTR(A5),D1
    MOVE.L  #1005,D2
    JSR -30(A6)         ; OPEN
    MOVE.L  D0,D5           ; D5=HANDLE
    BEQ iERROR36

    MOVE.L  D3,D0
    ADDQ.L  #4,D0
    BSR NEWCACHE
    MOVE.L  D0,D2
    BEQ iERROR38
    MOVE.L  D5,D1
    JSR -42(A6)         ; READ
    MOVE.L  D0,D4
    MOVE.L  D5,D1
    JSR -36(A6)         ; CLOSE
    CMP.L   D3,D4
    BNE iERROR36
    MOVE.L  D2,A0
    ADD.L   D3,D2
    MOVE.L  D2,A1
    CLR.B   (A1)+
    CLR.B   (A1)+
    CLR.B   (A1)+
    CLR.B   (A1)+

.GOTM:  MOVE.L  A5,THISMOD
    MOVE.L  A0,MI_MOD(A5)
    CMP.L   #"EMOD",(A0)+
    BNE iERROR36
    MOVEM.L D0-D7/A0-A6,-(A7)
    JSR MINIMUMMODULE
    MOVEM.L (A7)+,D0-D7/A0-A6

    BRA.W   .XL
.X: TST.W   AGAIN
    BNE.W   .ML
    CLR.L   ERROROBJ
    RTS
;*-*
;; LIB/OBJECTS
LIBLOAD:
    TST.W   SCOPE
    BNE     iERROR30
    MOVEM.L A0/A1,-(A7)
    MOVE.L  DOSBASE,A6
.LIBLOOP1:
    CMP.W   #STR,(A3)+
    BNE     iERROR0
    ADDQ.L  #2,A3
    MOVEQ   #0,D0
    MOVE.W  (A3)+,D0

    move.l  a3,a0
    lsl.l   #1,d0
    add.l   d0,a3
    MOVE.L  #PRINTBUF,A1
    CLR.B   PRINTBUF

    MOVE.L  .ELIBPATH,(A1)+
    MOVE.B  #":",(A1)+
.LP:MOVE.B  (A0)+,(A1)+
    BNE     .LP

    MOVE.B  #".",-1(A1)
    MOVE.B  #"m",(A1)
    MOVE.B  #0,1(A1)

    MOVE.L  A1,.T
    MOVE.L  A3,-(A7)

    MOVE.L  #PRINTBUF,D1
    MOVE.L  D1,D0
    BSR FILELENGTH
    TST.L   D0
    BEQ     iERROR28
    BMI     iERROR28
    move.l  d0,-(a7)
    BSR NEW                 ; get mem
    move.l  d0,-(a7)
    move.l  #PRINTBUF,D1
    MOVE.L  #1005,D2
    JSR     -30(A6)
    MOVe.L  D0,D4
    move.l  (a7),D2
    move.l  4(a7),d3
    move.l  d4,d1
    jsr     -42(a6)
    move.l  d4,d1
    jsr     -36(a6)

    MOVE.L  .T,A1           ; now open lib
    MOVE.B  #"l",(A1)
    MOVE.B  #"i",1(A1)
    MOVE.B  #"b",2(A1)
    MOVE.B  #0,3(A1)

    MOVE.L  #PRINTBUF,D1
    MOVE.L  D1,D0
    BSR FILELENGTH
    TST.L   D0
    BEQ     iERROR28
    BMI     iERROR28
    move.l  d0,-(a7)
    BSR NEW                 ; get mem
    move.l  d0,-(a7)
    move.l  #PRINTBUF,D1
    MOVE.L  #1005,D2
    JSR     -30(A6)
    MOVe.L  D0,D4
    move.l  (a7),D2
    move.l  4(a7),d3
    move.l  d4,d1
    jsr     -42(a6)
    move.l  d4,d1
    jsr     -36(a6)


    move.l  (a7)+,d2        ; lib mem
    move.l  (a7)+,d3        ; lib size
    move.l  (a7)+,d0        ; mod mem
    move.l  (a7)+,d1        ; mod size
    JSR PARSEOBJECTFILE
    MOVE.L  (A7)+,A3
    cmp.w   #COM,(A3)+
    BEQ .LIBLOOP1
    TST.W   -(A3)
    BNE     iERROR0
    MOVEM.L (A7)+,A0/A1
    BRA REBACK

.ELIBPATH:
    DC.B    'ELIB'
.T: DC.L    0
;*-*
;; PROC
PROCPARSE:            ; PARSE 'PROC bla(a,b,c=1) OF o IS x\0'
    CLR.W   .REGCNT
    GETM    A6          ; DEFARGSLIST
    CLR.W   (A6)+
    MOVE.L  A6,.A6ST
    CLR.W   .CNT
    CMP.W   #IDENT,(A3)+
    BNE iERROR4
    MOVE.L  (A3)+,A2        ; A2=PROCNAMEVAR
    CMP.B   #LAB,4(A2)
    BNE iERROR4
    MOVE.W  #-2,10(A2)
    MOVE.L  6(A2),A4
    MOVE.L  A2,14(A4)       ; SET PROC.IDENT
    MOVE.L  A4,A2           ; A2=PTR PROC STRUCT
    ;BSET   #3,2(A2)
    ;BNE    iERROR14
    CMP.W   #17,(A3)+
    BNE iERROR23
    MOVEQ   #0,D1           ; D1=NARG
    MOVE.L  A3,A4           ; BACKUP
.1: MOVE.W  (A3)+,D0
    CMP.W   #IDENT,D0
    BNE .2
    ADDQ.L  #1,D1
    ADDQ.L  #4,A3

    CMP.W   #11,(A3)        ; CHECK FOR a=1 DEFARGS
    BNE.S   .NIS
    ADDQ.L  #2,A3
    cmp.b   #4,(a3)
    blt     .IS0
    cmp.b   #5,(a3)
    bgt     .IS0
    move.w  (a3)+,(a6)+
    bset    #5,2(A2)
    addq.w  #1,.REGCNT
    bra     .NIS
.REGCNT:    dc.w    0
.IS0:
    CMP.W   #8,(A3)
    BNE.S   .IS1
    ADDQ.L  #2,A3
    NEG.L   2(A3)
.IS1:
    CMP.W   #1,(A3)+
    BNE iERROR30
    ADDQ.W  #1,.CNT
    MOVE.L  (A3)+,(A6)+

.NIS:   BSR .SKIP
    MOVE.W  (A3)+,D0
    CMP.W   #COM,D0
    BEQ.S   .1
.2: CMP.W   #18,D0
    BNE iERROR6
    tst.w   .REGCNT
    beq     .2_2
    cmp.w   .REGCNT,D1
    bne     iERROR50
.2_2:
    CLR.W   (A6)+
    MOVE.L  A6,.A6MID
    MOVE.L  D6,A1
    MOVE.W  D1,(A2)
    BEQ.S   .4
    MOVE.L  A4,A3
    MOVEQ   #0,D2
    LSL.L   #2,D1
    ADDQ.L  #8,D1
.3: MOVE.W  (A3)+,D0
    CMP.W   #IDENT,D0
    BNE .4
    MOVE.L  (A3)+,A4        ; A4=VAR
    ADDQ.L  #4,D2
    MOVE.L  D1,D3
    SUB.L   D2,D3
    MOVE.W  D3,10(A4)

    TSTMOD
    BEQ.S   .NAN    
    MOVE.L  (A4),(A6)+
.NAN:
    CMP.W   #11,(A3)
    BNE.S   .NIS2
    ADDQ.L  #2,A3
    CMP.B   #4,(A3)
    BLT     .IS00
    CMP.B   #5,(A3)
    BGT     .IS00
    ADDQ.L  #2,A3
    BRA     .NIS2
.IS00:
    CMP.W   #8,(A3)
    BNE.S   .IS11
    ADDQ.L  #2,A3
.IS11:  ADDQ.L  #6,A3
    
.NIS2:  BSR.W   .SKIP
    MOVE.W  (A3)+,D0
    CMP.W   #COM,D0
    BEQ.S   .3
.4: ADDQ.L  #2,.A6ST        ; EXIT, A3 JUST AFTER ")"
    CMPA.L  .A6ST(PC),A6
    BEQ.S   .EX         ; CHECK IF DEFARGS
    MOVE.L  A3,-(A7)
    MOVE.L  .A6ST(PC),A3
    MOVE.W  .CNT(PC),-4(A3)
    MOVE.L  .A6MID(PC),A3
    MOVE.L  A6,D0
    SUB.L   A3,D0
    LSR.L   #2,D0
    MOVE.W  D0,-2(A3)
    MOVE.L  (A7)+,A3
.22:    MOVE.L  .A6ST,D0
    SUBQ.L  #4,D0
    MOVE.L  D0,6(A2)        ; DEFARGSLIST IN PROCSTRUCT
    DONEH   A6
.EX:    CMP.W   #IOFF+45,(A3)+      ; NOW CHECK FOR of_object
    BNE .NOM
    TST.W   .REGCNT
    BNE     iERROR50
    CMP.W   #31,(A3)+
    BNE .REX
    MOVE.L  (A3)+,A3        ; A3=OBJECTHEAD, A2=PROC
    BTST    #1,2(A3)
    BNE iERROR69
    MOVE.L  A3,10(A2)       ; SET PROC TO METHOD
    MOVE.L  -4(A2),PROCLIST     ; DISCONNECT FROM PROCLIST
    CLR.L   -4(A2)

    MOVE.L  14(A2),A6
    MOVE.L  (A6),D0
    MOVE.L  A3,A6
    MOVE.L  A0,-(A7)
    JSR FINDMETHOD      ; WANTS OBJ=A6,NAME=D0, TRASHES A0,
    MOVE.L  (A7)+,A0
    TST.L   D1          ;   RETURNS D1=METHOD | NIL
    BNE iERROR61

    GETM    A6
    MOVE.L  OMETHOD(A3),D2      ; BUILD NEW METHOD:
    MOVE.L  A6,OMETHOD(A3)
    MOVE.L  A6,22(A2)
    MOVE.L  D2,(A6)+        ; SET M_NEXT
    MOVE.L  A2,(A6)+        ; SET M_PROC
    MOVE.B  #MT_METHOD,(A6)+    ; SET M_TYPE
    CLR.B   (A6)+
    MOVEQ   #4,D0
    TST.L   D2
    BEQ.S   .F
    MOVE.L  D2,A4
    MOVE.W  M_OFF(A4),D0
    ADDQ.W  #4,D0
.F: MOVE.W  D0,(A6)+        ; SET M_OFF TO LAST M_OFF+4
    ADDQ.W  #4,D0
    MOVE.W  D0,ODEL(A3)
    MOVE.L  14(A2),A4       ; A4=IDENT
    MOVE.L  (A4),(A6)+      ; SET M_NAME
    BSET    #4,5(A4)        ; SET FLAGS OR METHOD
    BSET    #0,5(A4)
    DONEM   A6
    BSET    #1,2(A2)
    MOVE.L  CURSELF(PC),D0      ; NOW MAKE A "self" FOR THIS METHOD
    BNE.S   .GOTS
    GETM    A6
    MOVE.L  SELFHASHADR(PC),A4
    MOVE.L  (A4),(A6)+
    MOVE.L  A6,(A4)
    MOVE.L  A6,D0
    MOVE.L  #SELFNAME,(A6)+     ; IDENT.ASCII
    MOVE.W  #$0101,(A6)+        ; IDENT.TYPE/FLAGS
    MOVE.L  A2,(A6)+        ; IDENT.PROC
    CLR.W   (A6)+           ; IDENT.INFO

    TST.W   REGSTOP
    BNE.S   .CLH
    MOVE.L  #MIDHEAVY*3,(A6)+   ; VARHEAVY: USED 3x (FAKE)
.CLHB:
    DONEM   A6
    MOVE.L  D0,A6
    BRA.S   .GOTS2

.CLH:   CLR.L   (A6)+           ; SELF NOT IN REG
    BRA.S   .CLHB


.GOTS:  MOVE.L  D0,A6
    TST.B   4(A6)
    BNE iERROR50
    MOVE.B  #1,4(A6)
    BSET    #0,5(A6)
.GOTS2: MOVE.L  A6,18(A2)       ; HERE WE HAVE A VALID SELF IN A6
    BRA.S   .REX
.NOM:   BTST    #1,2(A2)
    BNE iERROR21
.REX:   CLR.L   CURSELF
    BRA REBACK
.SKIP:  MOVE.W  (A3)+,D0
    CMP.W   #19,D0
    BEQ.S   .SKIP
    CMP.W   #IOFF+20,D0
    BEQ.S   .S3
    CMP.W   #IOFF+44,D0
    BEQ.S   .S1
    CMP.W   #IOFF+61,D0
    BEQ.S   .S3
    SUBQ.L  #2,A3
.S3:    RTS
.S1:    CMP.W   #IOFF+39,(A3)+      ; PTR TO
    BNE iERROR33
    CMP.W   #IOFF+20,(A3)
    BPL.S   .S2
    CMP.W   #31,(A3)+
    BNE iERROR33
    ADDQ.L  #4,A3
    RTS
.S2:    CMP.W   #IOFF+23,(A3)+
    BPL iERROR33
    RTS
.CNT:   DC.W    0
.A6ST:  DC.L    0
.A6MID: DC.L    0
;*-*
;; ENUM
DOENUM:
    TST.W   INPROC
    BNE iERROR35
    MOVEQ   #0,D7
.1: GETM    A4          ; ENUM
    CMP.W   #25,(A3)+
    BNE iERROR0
    MOVE.L  (A3)+,4(A4)
    MOVE.L  (A3)+,A6
    MOVE.L  (A6),(A4)
    MOVE.L  A4,(A6)
    ADDQ.L  #8,A4
    CMP.W   #11,(A3)        ; LOOK FOR BASE REDEF.
    BNE.S   .2
    ADDQ.L  #2,A3
    CMP.W   #8,(A3)
    BNE.S   .NM
    ADDQ.L  #2,A3
    CMP.W   #VALUE,(A3)
    BNE.S   .NM
    NEG.L   2(A3)
.NM:    CMP.W   #VALUE,(A3)+
    BNE iERROR0
    MOVE.L  (A3)+,D7
.2: MOVE.L  D7,(A4)+
    ADDQ.L  #1,D7
    CLR.W   (A4)+
    DONEM   A4
    TST.W   EXPORTFLAG
    BEQ.S   .NE
    BSET    #0,-2(A4)
.NE:    CMP.W   #COM,(A3)+
    BEQ.S   .1
    TST.W   -2(A3)
    BNE iERROR0
    BRA REBACK
;*-*
;; SET
DOSET:
    TST.W   INPROC
    BNE iERROR35
    MOVEQ   #1,D7
.1: GETM    A4
    TST.L   D7          ; SEE IF SET>32
    BEQ iERROR7
    CMP.W   #25,(A3)+
    BNE iERROR0
    MOVE.L  (A3)+,4(A4)
    MOVE.L  (A3)+,A6
    MOVE.L  (A6),(A4)
    MOVE.L  A4,(A6)
    ADDQ.L  #8,A4
    MOVE.L  D7,(A4)+
    LSL.L   #1,D7
    CLR.W   (A4)+
    DONEM   A4
    TST.W   EXPORTFLAG
    BEQ.S   .NE
    BSET    #0,-2(A4)
.NE:    CMP.W   #COM,(A3)+
    BEQ.S   .1
    TST.W   -2(A3)
    BNE iERROR0
    BRA REBACK
;*-*
;; LIBRARY
DOLIBRARY:
    BTST    #5,CODEPREFS
    BNE iERROR50
    TST.W   SCOPE
    BNE iERROR35
    TSTMOD
    BNE iERROR50
    MOVE.L  LIBINFO(PC),D7
    BNE iERROR50
    CMP.W   #STR,(A3)+
    BNE iERROR0
    ADDQ.L  #2,A3
    MOVE.W  (A3)+,D7
    LSL.W   #1,D7
    GETM    A4
    DONEH   A4
    GETM    A4
    MOVE.L  A4,A6           ; A6=LIBINFO
    MOVE.L  A4,LIBINFO
    MOVE.L  A3,(A4)+        ; LIBRARY NAME
    ADD.W   D7,A3
    CMP.W   #COM,(A3)+
    BNE iERROR5
    CMP.W   #VALUE,(A3)+
    BNE iERROR30
    MOVE.L  (A3)+,(A4)+     ; VERSION
    CMP.W   #COM,(A3)+
    BNE iERROR5
    CMP.W   #VALUE,(A3)+
    BNE iERROR30
    MOVE.L  (A3)+,(A4)+     ; REVISION
    CMP.W   #COM,(A3)+
    BNE iERROR5
    CMP.W   #STR,(A3)+
    BNE iERROR0
    ADDQ.L  #2,A3
    MOVE.W  (A3)+,D7
    LSL.W   #1,D7
    MOVE.L  A3,(A4)+
    ADD.W   D7,A3
    CLR.L   (A4)+
    CMP.W   #IOFF+73,(A3)
    BNE     .E
    ADDQ.L  #2,A3
    CMP.W   #VALUE,(A3)+    ; EXTRA!!!
    BNE     iERROR75
    MOVE.L  (A3)+,D7
    BMI     iERROR31
    CMP.L   #32000,D7
    BGT     iERROR31
    BTST    #0,D7
    BNE     iERROR75

    ADD.L   D7,InitTable
    ADD.W   D7,PatchLib1+2
    ADD.W   D7,PatchLib2+2
    ADD.W   D7,PatchLib3+2
    ADD.W   D7,GETTC+2
    ADD.W   D7,NEWTC+2
    ADD.W   D7,GETA4+6

.E: CMP.W   #IOFF+62,(A3)+
    BNE iERROR0
.X: CMP.W   #IDENT,(A3)+
    BNE iERROR4
    MOVE.L  (A3)+,(A4)+
    BSR PARSE_REGLIST
    CMP.W   #COM,(A3)+
    BEQ .X
    TST.W   -2(A3)
    BNE iERROR5
    MOVE.L  A4,D7
    SUB.L   A6,D7
    SUB.L   #20,D7
    DIVS.W  #20,D7          ; SIZE OF PROCS!
    MOVE.W  D7,18(A6)
    CLR.L   (A4)+
    MOVE.L  (A6),A5
    MOVE.L  A4,(A6)
.1: MOVE.B  (A5)+,(A4)+
    BNE.S   .1
    MOVE.L  12(A6),A5
    MOVE.L  A4,12(A6)
.2: MOVE.B  (A5)+,(A4)+
    BNE.S   .2
    MOVE.L  A4,D0
    BTST    #0,D0
    BEQ.S   .3
    CLR.B   (A4)+
.3: DONEH   A4
    BRA REBACK
;*-*
;; Library reglist parser
PARSE_REGLIST:            ; A3=INTERIM, A4=BUF
    CMP.W   #17,(A3)
    BNE.S   .X
    MOVEM.L D0/D1/D2,-(A7)
    MOVEQ   #0,D0           ; MASK
    MOVEQ   #0,D1           ; NARGS
    ADDQ.L  #2,A3
    CMP.W   #18,(A3)
    BEQ.S   .BR
.XL:MOVE.B  (A3)+,D2
    CMP.B   #4,D2
    BEQ.S   .1
    CMP.B   #5,D2
    BNE iERROR19
.1: MOVE.B  (A3),(A4)+
    MOVEQ   #15,D2          ; REVERSE MASK
    SUB.B   (A3)+,D2
    BSET    D2,D0
    BNE iERROR50
    ADDQ.L  #1,D1
    CMP.W   #18,(A3)
    BEQ.S   .BR
    CMP.W   #COM,(A3)+
    BNE iERROR5
    BRA.S   .XL
.BR:    ADDQ.L  #2,A3
    MOVEQ   #12,D2
    SUB.W   D1,D2
    BMI iERROR70
    ADD.W   D2,A4
    MOVE.W  D0,(A4)+
    MOVE.W  D1,(A4)+
    MOVEM.L (A7)+,D0/D1/D2
    RTS
.X: CMP.B   #6,(A3)
    BEQ.S   .AX
    ADD.W   #12,A4
    MOVE.L  #-1,(A4)+
    RTS
.AX:    MOVEM.L D0/D1,-(A7)
    MOVE.W  (A3)+,D0
    AND.W   #%111,D0
    ADDQ.W  #8,D0
    MOVE.B  D0,(A4)+
    ADD.W   #11,A4
    MOVEQ   #15,D1
    SUB.W   D0,D1
    MOVEQ   #0,D0
    BSET    D1,D0
    MOVE.W  D0,(A4)+
    MOVE.W  #1,(A4)+
    MOVEM.L (A7)+,D0/D1
    RTS

DORAISE:
    TST.W   SCOPE
    BNE iERROR35
.1: CMP.W   #VALUE,(A3)+
    BNE iERROR30
    MOVE.L  (A3)+,D7        ; RAISE ID
    CMP.W   #IOFF+2,(A3)+
    BNE iERROR0          ; WE NEED AN "IF"
    CMP.W   #22,(A3)+
    BNE .LIB            ; EFUNC

    MOVE.L  (A3)+,D0
    SUB.L   #EFUNCTAB,D0
    LSR.L   #4,D0
    MOVE.L  #EFUNCRAISE,A4
    MULU.W  #10,D0
    EXT.L   D0
    ADD.L   D0,A4
    BRA.S   .NEXT

.LIB:   CMP.W   #38,-2(A3)
    BNE iERROR0
    MOVE.L  (A3)+,A4        ; LIBRECORD
    MOVE.W  RAISENUM(PC),D0
    MOVE.W  D0,8(A4)
    CMP.W   #MAXLIBRAISE,D0
    BEQ iERROR37
    MULU    #10,D0
    EXT.L   D0
    MOVE.L  #LIBRAISE,A4
    ADD.L   D0,A4
    ADDQ.W  #1,RAISENUM

.NEXT:  MOVE.L  D7,2(A4)        ; SET EXCEPT ID
    CMP.L   #$110012,(A3)+      ; ()        A4 --> RECORD
    BNE iERROR23
    MOVE.W  (A3)+,D1
    CMP.W   #11,D1
    BMI iERROR0
    CMP.W   #17,D1
    BPL iERROR0
    MOVE.W  D1,(A4)
    CMP.W   #8,(A3)
    BNE.S   .2
    ADDQ.L  #2,A3
    CMP.W   #VALUE,(A3)
    BNE.S   .2
    NEG.L   2(A3)
.2: CMP.W   #VALUE,(A3)+
    BNE iERROR30
    MOVE.L  (A3)+,6(A4)
    CMP.W   #COM,(A3)+
    BEQ .1
    TST.W   -2(A3)
    BNE iERROR0
    CLR.W   BUSYRAISE       ; !
    BRA REBACK
;*-*
RAISENUM:   DC.W    0

OSVERSION:  DC.W    33
WARNINGS:   DC.L    0
CODEPREFS:  DC.L    0
CODESTACK:  DC.L    0
MAXREGALLOC:DC.W    0

ICODEPREFS: DC.L    0

TCPU:       DC.W    0       ; 000, 010, 020, 030, 040, 060.
ECPU:       DC.W    0       ; 0,1,2 = 000+, 020+, 040+
EFPU:       DC.W    0       ; 0,1,2 = FFP, 881/882, 040
EMMU:       DC.W    0       ; 0,1,2 = [-], 851, 020+
ASMCPU:     DC.W    0       ; BITSET

CPUTAB:
    DC.W    000,0,0,0,0       ;
    DC.W    010,0,0,0,0       ; CPU,ECPUTYPE,EFPUTYPE,ASMCPUBIT#,EMMUTYPE
    DC.W    020,1,0,1,2
    DC.W    030,1,0,2,2
    DC.W    040,2,2,3,2
    DC.W    060,2,3,4,2
    DC.W    881,0,1,8,0
    DC.W    882,0,1,9,0
    DC.W    851,0,0,10,1
    DC.W    -1

STARTUP_CODE:
    DC.L    0
STARTUP_SIZE:
    DC.L    0
STARTUP_XTNS:
    DC.L    0
STARTUP_NODE:
    DC.L    0
;*-*

PARSEGETINSNR:            ; GETS INSNR OUTOF WORKBUF
    MOVEQ   #0,D0           ; INSNR (MUST BE <>0 AT END)
    MOVE.W  CURINS(PC),-(A7)
    MOVEQ   #-1,D1
    MOVE.W  D1,CURINS
    MOVE.L  HASHVAL(PC),D7
    LSL.L   #2,D7
    ADD.L   #KEYHASH,D7
    MOVE.L  D7,A6
.LOOP:  MOVE.L  (A6),A6         ; A6 _NOW_ POINTS TO ENTRY IN INSTABLE
    MOVE.L  A6,D6
    BEQ.S   .4
    MOVE.L  WORK(PC),A4
    MOVE.L  (A6)+,A5
.2: CMPM.B  (A4)+,(A5)+
    BNE.S   .LOOP
    TST.B   -1(A4)
    BNE.S   .2
    SUB.L   #INSTABLE,D6
    LSR.L   #3,D6
    MOVE.L  D6,D1
    MOVE.W  #IOFF,D0
    ADD.W   D1,D0           ; STAY: 0..20, 50..59, 62..
    CMP.W   #IOFF+20,D0
    BPL.S   .4
    MOVE.W  D1,CURINS
.3: ADDQ.L  #2,A7
    RTS
.4: CMP.W   #IOFF+50,D0
    BPL.S   .5
.6: MOVE.W  (A7)+,CURINS
    RTS
.5: CMP.W   #IOFF+60,D0
    BPL.S   .7
    BRA.S   .3
.7: CMP.W   #IOFF+62,D0
    BPL.S   .3
    BRA.S   .6

MAKEKEYHASH:
    MOVE.L  #KEYHASH,A0     ; A0=TABEL
    LEA INSTABLE,A1
    MOVE.L  A0,A2
    MOVE.L  #255,D0
.CL:    CLR.L   (A2)+           ; CLEAR TABLE
    DBRA    D0,.CL
.LOOP:  MOVE.L  (A1),D0
    BEQ.S   .EX
    MOVE.L  D0,A2
    HASH    A2,D0,D1
    LSL.L   #2,D0

    LEA 0(A0,D0.L),A2
    MOVE.L  (A2),D0         ; READ PREVIOUS LIST (OR NIL)
    MOVE.L  A1,(A2)         ; PUT ENTRY IN LIST
    MOVE.L  D0,4(A1)        ; AND LINK TAIL TO IT
    ADDQ.L  #8,A1
    BRA.S   .LOOP
.EX:    RTS

CURINS: DC.W    0
;*-*
;;IDENT

PARSEGETIDENTNR:          ; GETS IDENTNR OUTOF WORKBUF
    TST.L   OBJECTD
    BNE OBJECTIDENT

    MOVE.L  CPROC(PC),D3
    MOVEQ   #0,D5
    MOVEQ   #UNDEF,D7
    MOVE.W  CURINS(PC),D6       ; INS-ioff

    CMP.W   #35,D4          ; .
    BEQ .1
    CMP.W   #IOFF+39,D4     ; TO
    BEQ.S   .5
    CMP.W   #19,D4          ; :
    BEQ.S   .4
    CMP.W   #IOFF+45,D4     ; OF
    BEQ.S   .2
    CMP.W   #IOFF+50,D4     ; SIZEOF
    BEQ.S   .1
    CMP.W   #41,D4          ; ::
    BEQ.S   .1
    BRA.S   XNEXT
.5: CMP.W   #IOFF+44,-4(A1)     ; PTR TO
    BNE.S   XNEXT
    BRA OBJUSE
.2: CMP.W   #IOFF+41,-4(A1)     ; ARRAY OF
    BEQ.S   .1
    CMP.W   #18,-4(A1)      ; ) OF
    BNE.S   XNEXT
    CMP.W   #1,-8(A1)       ; SELECT 1 OF (ERG DIRTY!)
    BEQ.S   .XTEST
.XBACK:
.1: BRA OBJUSE

.XTEST: CMP.W   #IOFF+8,-10(A1)
    BEQ.S   XNEXT
    BRA.S   .XBACK

.4: CMP.W   #-1,D6
    BNE.S   .1
    CMP.W   #30,-4(A1)
    BEQ.S   .1
XNEXT:

    TST.W   D6          ; "PROC"=0
    BNE.S   .1
        CMP.W   #IOFF,D4        ;-2(A1) ; PROCNAME OR ARGVAR ?
        BEQ.S   .2
    MOVEQ   #LOCV,D7
    BRA.S   .5
.2: MOVEQ   #LAB,D7
    BSR NEWPROC
    BRA.S   .5
.1: CMP.W   #16,D6
    BNE.S   .3
    MOVEQ   #GLOBV,D7
    BRA.S   .5
.3: CMP.W   #17,D6
    BNE.S   .4
    MOVEQ   #LOCV,D7
    BRA.S   .5
.4: CMP.B   #':',(A0)       ; DIRTY
    BNE.S   .5
    CMP.B   #'=',1(A0)
    BEQ.S   .5
    CMP.B   #':',1(A0)
    BEQ.S   .5
    MOVEQ   #LAB,D7
.5: LEA IDENTHASH,A3
    MOVE.L  HASHVAL,D1
    LSL.L   #2,D1
    ADD.L   D1,A3
    MOVE.L  A3,IDHASHADR
    ADDQ.L  #4,A3
    MOVE.L  WORK(PC),D2     ; D2,D1=BACKUP
IDCHECKLOOP:
    MOVE.L  -(A3),A3
    MOVE.L  A3,D1
    BEQ UNIDENT
    MOVE.L  A3,A5
    MOVE.L  (A3),A4
    MOVE.L  D2,A6
.1: CMPM.B  (A4)+,(A6)+
    BNE.S   IDCHECKLOOP
    TST.B   -1(A4)
    BNE.S   .1
    CMPI.B  #LOCV,4(A5)
    BNE.S   .2
    MOVE.L  6(A5),D0        ; check if proc is ok
    CMP.L   CPROC(PC),D0
    BNE.S   IDCHECKLOOP
    BRA.S   .3
.2: CMPI.B  #LAB,4(A5)      ; check if redef loc/glob > lab
    BNE.S   .3
    CMP.W   #LOCV,D7
    BEQ.S   IDCHECKLOOP
    CMP.W   #GLOBV,D7
    BEQ.S   IDCHECKLOOP
.3: MOVE.L  A5,D5
    CMPI.B  #GLOBV,4(A5)        ; check if locv > globv
    BEQ.S   IDCHECKLOOP

; HIERNA D4 TIJDLK. GETRASHED
    
IDALREADYPRESENT:
    TST.W   D7          ; USE IN EXP
    BEQ.W   .X2                     ; !!!!!!!!!!!!! WAS .X
    MOVE.B  4(A5),D4        ; USE IN 'LOCAL'
    CMP.B   #LOCV,D7
    BNE.S   .10
    TST.B   D4          ; var has type?
    BNE.S   .2
    MOVE.L  6(A5),D0
    CMP.L   D3,D0
    BNE.S   .X
    MOVE.B  #LOCV,4(A5)     ; no: local
    BRA.S   .X
.2: CMP.B   #GLOBV,D4
    BEQ UNIDENT2
    CMP.B   #LOCV,D4
    BNE iERROR21         ; LAB AS LOC OR LOC*2
    CMP.L   6(A5),D3
    BEQ iERROR21         ; same local name in other proc
    BRA UNIDENT2
.10:CMP.B   #LAB,D7         ; USE IN 'DEF'
    BEQ.S   .20
    CMP.B   #LOCV,D4
    BEQ UNIDENT2
    BTST    #2,5(A5)
    BNE.S   .12
    TST.B   D4
    BNE iERROR21
    BRA.S   .12B
.12:    TST.W   EXPORTFLAG      ; allow bases to be redefined nonexport
    BNE.S   .12B
    BCLR    #2,5(A5)
.12B:   MOVE.B  #GLOBV,4(A5)
    BRA.S   .X
.20:CMP.B   #":",(A0)       ; ONLY TEST LABELS, NOT PROCS/METHODS
    BNE.S   .MH
    CMP.B   #LAB,D4             ; OK THIS TEST?
    BEQ iERROR14
.MH:TST.B   D4                  ; USE IN 'PROC' OR ':'
    BNE UNIDENT3
    MOVE.B  #LAB,4(A5)
    MOVE.W  #-1,10(A5)
.X: MOVE.L  D3,6(A5)
.X2:    MOVE.L  D4,D2
    MOVEQ   #IDENT,D4
    MOVE.W  D4,(A1)+
    MOVE.L  D5,(A1)+
    TST.W   MAXREGALLOC
    BEQ.S   .NR
    CMP.B   #LOCV,4(A5)
    BNE.S   .NR
    CMP.W   #23,D2          ; used in {}
    BEQ.S   .NR2
    TST.L   VARHEAVY(A5)
    BEQ.S   .NR
    MOVE.L  HEAVYNESS(PC),D0
    ADD.L   D0,VARHEAVY(A5)
.NR:    TST.B   D7
    BEQ.S   .S
    TST.W   EXPORTFLAG
    BEQ.S   .NOEXP
    BSET    #0,5(A5)        ; USED IF DEF+EXPORT
.NOEXP: RTS
.S: BSET    #0,5(A5)        ; SET IF USED
    RTS
.NR2:   CLR.L   VARHEAVY(A5)
    BRA.S   .NR

UNIDENT3:
    TST.L   10(A5)          ; see if objhead in procstruct
    BEQ.W   iERROR21         ; no method!
    MOVE.L  CPROC(PC),A6
    BSET    #1,2(A6)        ; SET METHOD
    BRA.S   UNIDENT2
UNIDENT:
    TST.L   D5
    BNE DOUBLENAME
UNIDENT2:
    GETM    A3          ; A3=FRESH MEM
    MOVE.L  WORK(PC),A4
    MOVE.L  A3,A5           ; A5=ASCIIPTR IN HEAP
.1: MOVE.B  (A4)+,(A3)+
    BNE.S   .1
    MOVE.L  A3,D0
    BTST    #0,D0
    BEQ.S   .OK
    CLR.B   (A3)+
.OK:
    MOVE.L  IDHASHADR,A4
    MOVE.L  (A4),(A3)+
    MOVE.L  A3,(A4)
    MOVEQ   #IDENT,D4
    MOVE.W  D4,(A1)+
    MOVE.L  A3,(A1)+
    MOVE.L  A3,LASTID
    MOVE.L  A3,A6           ; A6=BASE ID
    MOVE.L  A5,(A3)+
    MOVEQ   #0,D0
    MOVE.B  D7,(A3)+        ; TST
    BEQ .S
    TST.W   EXPORTFLAG
    BNE.S   .SE
    CLR.B   (A3)+
    BRA.S   .S2
.SE:MOVE.B  #4,(A3)+        ; SET EXPORT
    CMP.W   #2,D7
    BEQ.S   .S2
    BSET    #0,-1(A3)       ; +USED
    BRA.S   .S2
.S: MOVE.B  #1,(A3)+        ; SET FLAGS=1 IF USED (D7=0)
                            ; ALS IDENT<>LABEL DAN ERROR22
.S2:MOVE.L  D3,(A3)+
    CMP.B   #LAB,D7
    BEQ.S   .2
    MOVE.W  D0,(A3)+        ; VARS:   OFFSET=0
    CMP.B   #LOCV,D7
    BNE.S   .3          ; SEE IF LOCAL --> HEAVYNESS
    TST.W   MAXREGALLOC
    BEQ.S   .3
    TST.W   REGSTOP
    BNE.S   .2A
    MOVE.L  HEAVYNESS(PC),(A3)+ ; must be offs VARHEAVY
    BRA.S   .3
.2A:CLR.L   (A3)+           ; no regalloc in HANDLEr
    BRA.S   .3
.2: MOVE.W  #-1,(A3)+       ; LABELS: OFFSET=-1
.3:
    CMP.L   #"main",(A5)
    BNE.S   .NM
    TST.B   4(A5)
    BNE.S   .NM
    BSET    #0,5(A6)

.NM:    CMP.L   #"self",(A5)
    BNE.S   .NS
    TST.B   4(A5)
    BNE.S   .NS
    MOVE.L  A6,CURSELF
.NS:MOVE.L  #0,(A3)+        ; 0 = DEF long
    MOVE.L  #0,(A3)+
    DONEM   A3
    RTS
DOUBLENAME:
    MOVE.L  D5,A5
    BRA IDALREADYPRESENT

LASTID:       DC.L    0
IDHASHADR:    DC.L    0
CURSELF:      DC.L    0
SELFHASHADR:  DC.L    0
SELFNAME:     DC.B    "self",0,0

NEWPROC:
    GETM    A3
    MOVE.L  PROCLIST(PC),(A3)+
    MOVE.L  A3,PROCLIST
    MOVE.L  A3,CPROC
    MOVE.L  A3,D3
    CLR.L   (A3)+
    BTST    #0,CODEPREFS+1
    BEQ.S   .1
    TSTMOD
    BNE.S   .1
    BSET    #0,-2(A3)       ; USE RTD
.1: CLR.W   (A3)+           ; FIRST 10 BYTES IN USE
    CLR.L   (A3)+           ; DEFARGS
    CLR.L   (A3)+           ; of_object
    CLR.L   (A3)+           ; IDENT
    CLR.L   (A3)+           ; SELF
    CLR.L   (A3)+           ; METHOD
    CLR.L   (A3)+           ; if regalloc then table
    DONEM   A3
    RTS

PROCLIST:   DC.L    0
CPROC:      DC.L    0
OBJNAME:    DC.L    0

FINDOBJ:              ; D1=ASCII, RET D0=OBJH | NIL
    MOVEM.L A3/A4/A5,-(A7)
    LEA OLIST+4(PC),A3
.XL:MOVE.L  ONEXT(A3),A3
    MOVE.L  A3,D0
    BEQ.S   .X
    MOVE.L  D1,A4
    MOVE.L  OASCII(A3),A5       ; ASCII
.L2:    CMPM.B  (A5)+,(A4)+
    BNE.S   .XL
    TST.B   -1(A5)
    BNE.S   .L2
    MOVE.L  A3,D0
.X: MOVEM.L (A7)+,A3/A4/A5
    RTS

OBJUSE:
    CMP.W   #35,D4          ; SEARCHING OBJECTNAME OR FIELD
    BEQ.S   .FIELD
    MOVE.L  WORK(PC),D1     ; D1=ASCIIPTR
    BSR FINDOBJ
    CMP.W   #IOFF+50,D4
    BEQ .000
.001:
    MOVEQ   #31,D4          ; FOUND
    MOVE.W  D4,(A1)+
    MOVE.L  D0,(A1)+
    BEQ iERROR42
    RTS
.000:
    TST.W   D0
    BNE .001
    BRA XNEXT

.FIELD: MOVE.L  WORK(PC),D1     ; IS THIS PART NECESSARY ?
    LEA MEMBERLIST+4(PC),A3
.FL:    MOVE.L  ONEXT(A3),A3
    MOVE.L  A3,D0
    BEQ .MODF
    MOVE.L  D1,A4
    MOVE.L  OASCII(A3),A5
    MOVE.L  A5,D0           ; SKIP IF PRIVATE
    BEQ.S   .FL
.FL2:   CMPM.B  (A5)+,(A4)+
    BNE.S   .FL
    TST.B   -1(A5)
    BNE.S   .FL2
    MOVEQ   #39,D4
    MOVE.W  D4,(A1)+
    MOVE.L  A3,(A1)+
    RTS
.MODF:  MOVE.L  WORK(PC),D1     ; SEARCH IN "MODULE" LIST
    LEA OLIST+4(PC),A3      ; (AFTER OWN OBJECTS!)
.MFL:   MOVE.L  ONEXT(A3),A3
    MOVE.L  A3,D0
    BEQ .UNF
    LEA OMEMB+4(A3),A6
.ML:    MOVE.L  ONEXT(A6),A6
    MOVE.L  A6,D0
    BEQ.S   .MFL
    MOVE.L  D1,A4
    MOVE.L  OASCII(A6),A5
    MOVE.L  A5,D0           ; SKIP IF PRIVATE
    BEQ.S   .ML
.ML2:   CMPM.B  (A5)+,(A4)+
    BNE.S   .ML
    TST.B   -1(A5)
    BNE.S   .ML2
    MOVEQ   #39,D4
    MOVE.W  D4,(A1)+
    MOVE.L  A6,(A1)+
    RTS
.UNF:   MOVEQ   #42,D4          ; NOT FOUND SOFAR
    MOVE.W  D4,(A1)+
    GETM    A3
    MOVE.L  A3,(A1)+
    MOVE.L  WORK(PC),A4
.UFL:   MOVE.B  (A4)+,(A3)+     ; KAN DUS NIET!!!
    BNE.S   .UFL            ; DOUBLE COPY
    MOVE.L  A3,D1
    BTST    #0,D1
    BEQ.S   .UF2
    ADDQ.L  #1,A3
.UF2:   DONEM   A3
    RTS


OLIST:        DC.L    0
MEMBERLIST:   DC.L    0   ; TIJDENS LEX

OBJECTIDENT:          ; definition
    CMP.W   #19,D4          ; 2. bla:INT IPV x:bla
    BEQ.S   .S
    CMP.W   #IOFF+39,D4     ; TO
    BEQ.S   .S
    CMP.W   #IOFF+45,D4     ; OF
    BNE.S   .NEW
.S: MOVE.L  WORK(PC),A5
    MOVE.L  A5,D5
    LEA OLIST+4(PC),A6      ; A6=LINKED LIST
.XL:MOVE.L  ONEXT(A6),A6
    MOVE.L  A6,D0
    BEQ.S   .MUT
    MOVE.L  OASCII(A6),A4
    MOVE.L  D5,A5
.COMP:  CMPM.B  (A5)+,(A4)+
    BNE.S   .XL
    TST.B   -1(A5)
    BNE.S   .COMP
    CMP.W   #IOFF+48,D4     ; 1. OBJECT <DOUBLEDECL>
    BEQ iERROR43
    MOVEQ   #31,D4          ; FOUND
    MOVE.W  D4,(A1)+
    MOVE.L  A6,(A1)+
    RTS
.MUT:   CMP.W   #IOFF+39,D4     ; ONLY "TO". ILLEGAL = "OF", ":"
    BNE iERROR42
    MOVEQ   #45,D4
    MOVE.W  D4,(A1)+
    GETM    A3
    MOVE.L  A3,(A1)+
    MOVE.L  D5,A5
.MUTL:  MOVE.B  (A5)+,(A3)+
    BNE.S   .MUTL
    MOVE.L  A3,D0
    ADDQ.L  #1,D0
    BCLR    #0,D0
    MOVE.L  D0,A3
    DONEM   A3
    RTS
.NEW:   MOVEQ   #0,D0           ; IF D0=1 THEN OHEAD, 0=MEMBER
    CMP.W   #IOFF+48,D4
    BNE.S   .1
    MOVEQ   #1,D0
.1: GETM    A3
    TST.W   D0
    BNE .5
    TST.L   OBJNAME
    BEQ iERROR39
.3: MOVE.L  WORK(PC),A2
    MOVE.L  A3,D1           ; D1=ASCPTR
.2: MOVE.B  (A2)+,(A3)+
    BNE.S   .2
    MOVE.L  A3,D4
    BTST    #0,D4
    BEQ.S   .OK
    CLR.B   (A3)+
.OK:    MOVE.L  A3,A4           ; STILL ON HEAP
    MOVEQ   #31,D4
    MOVE.W  D4,(A1)+
    ADDQ.L  #4,A4
    MOVE.L  A4,(A1)+
    TST.L   D0
    BEQ.S   .MEM
    MOVE.L  OLIST(PC),ONEXT(A4) ; OBJECTHEAD STRUCT
    MOVE.L  A4,OLIST
    CLR.L   (A4)+           ; DELEGATESIZE+FLAGS
    CLR.L   (A4)+           ; SIZEOF+ID
    MOVE.L  D1,(A4)+        ; ASCII
    CLR.L   (A4)+           ; MEMBERLIST=0
    CLR.L   (A4)+           ; METHODLIST=0
    CLR.L   (A4)+           ; SUPERCLASS=0
    MOVE.L  #1,(A4)+        ; DELEGATECODE=1
    CLR.L   (A4)+           ; ACCESLIST
    MOVE.L  #-1,(A4)+       ; DELOFFSET+DESTRUCTOFF
    BRA.S   .C
.MEM:   MOVEQ   #39,D4
    MOVE.W  D4,-6(A1)
    MOVE.L  MEMBERLIST(PC),ONEXT(A4); (NEXT) MEMBER STRUCT
    MOVE.L  A4,MEMBERLIST
    CLR.L   (A4)+
    CLR.L   (A4)+
    MOVE.L  D1,(A4)+
    CLR.L   (A4)+           ; OPTRTYPE
    CLR.L   (A4)+           ; info (used?)
    CLR.L   (A4)+           ; next (INT!!!)
.C: DONEM   A4
    RTS
.5: MOVE.L  A3,OBJNAME
    MOVE.L  WORK(PC),D1
    BSR FINDOBJ
    TST.L   D0
    BNE iERROR43
    MOVEQ   #1,D0
    BRA .3

PARSEGETVALUE:            ; A2 STRING, =>D0 LONGINT
    TST.B   (A2)+
    BNE.S   PARSEGETVALUE
    SUBQ.L  #1,A2
    MOVEQ   #0,D0           ; RESULT
    CMPA.L  #WORKBUF+11,A2
    BPL iERROR7
    LEA VALUETAB(PC),A3
    MOVEQ   #0,D7
.1: MOVEQ   #0,D3
    MOVE.L  (A3)+,D2
    MOVE.B  -(A2),D3
    SUB.W   #48,D3
    BMI.S   .2          ; DAMN! WERE DOING A FLOAT!
    MOVE.L  D3,D1
    MULU    D2,D3
    SWAP    D2
    MULU    D2,D1
    SWAP    D1
    ADD.L   D1,D3
    ADD.L   D3,D0
    BCS iERROR7
.3: CMPA.L  WORK(PC),A2
    BNE.S   .1
    TST.L   D7          ; NEED TO CONVERT FLOAT?
    BNE.S   .4
    RTS             ; NO
.4: MOVE.L  D0,D6
    MOVEM.L A0/A1,-(A7)
    BSR ISOPENMATH
    MOVE.L  MATHBASE(PC),A6     ; YES
    MOVE.L  D6,D0
    JSR -36(A6)         ; SPFLT
    CMP.L   #1,D7
    BEQ.S   .5
    MOVE.L  D0,D6
    MOVE.L  D7,D0
    JSR -36(A6)
    MOVE.L  D6,D1
    EXG.L   D0,D1
    MOVE.W  #-1,IEEEPROBLEM
    JSR -84(A6)         ; SPDIV
    CLR.W   IEEEPROBLEM
.5: MOVEM.L (A7)+,A0/A1
    RTS
.2: TST.L   D7
    BNE iERROR0
    MOVE.L  D2,D7           ; = FLT FACTOR
    SUBQ.L  #4,A3
    BRA.S   .3

IEEEPROBLEM:  DC.W    0

VALUETAB:
    DC.L    1,10,100,1000,10000,100000,1000000
    DC.L    10000000,100000000,1000000000






PARSESTRING:
    MOVEQ   #STR,D4
    MOVE.W  D4,(A1)+
    ADDQ.L  #4,A1
    MOVE.L  A1,A4
.LOOP:  MOVE.B  (A0)+,D0
    CMP.B   #10,D0
    BEQ.S   .ER
    CMP.B   #'\',D0
    BEQ.S   .SPEC
;    CMP.B   #'%',D0
;    BEQ.S   .PERC
    MOVE.B  D0,(A1)+
    CMP.B   #"'",D0
    BNE.S   .LOOP
    CMP.B   #"'",(A0)
    BEQ.S   .DQUO
    SUBQ.L  #1,A1
    MOVE.L  A1,D1
    MOVE.B  #0,(A1)+
    MOVE.L  A1,D0
    BTST    #0,D0
    BEQ.S   .EQSTR
    MOVE.B  #0,(A1)+
.EQSTR: SUB.L   A4,D1
    MOVE.L  A1,D0
    SUB.L   A4,D0
    ASR.L   #1,D0
    MOVE.W  D0,-2(A4)
    MOVE.W  D1,-4(A4)       ; REAL LEN
    MOVE.L  STRLENADR,A3
    MOVE.L  D1,(A3)
    BRA PARSELOOP
.PERC:  TST.W   XF
    BEQ.S   .SK
    MOVE.B  #"%",(A1)+
.SK:    MOVE.B  #"%",(A1)+
    BRA .LOOP
.DQUO:  ADDQ.L  #1,A0
    BRA .LOOP
.ER:    SUBQ.L  #1,A0
    BRA iERROR8

.SPEC:  MOVE.B  (A0)+,D1
    CMP.B   #'n',D1
    BEQ     .1
    CMP.B   #'a',D1
    BEQ     .2
    CMP.B   #'e',D1
    BEQ     .3
    CMP.B   #'t',D1
    BEQ     .4
    CMP.B   #'\',D1
    BEQ     .5
    CMP.B   #'0',D1
    BEQ     .6
    CMP.B   #'b',D1
    BEQ     .14
    CMP.B   #'d',D1
    BEQ     .7
    CMP.B   #'h',D1
    BEQ     .8
    CMP.B   #'s',D1
    BEQ     .9
    CMP.B   #'z',D1
    BEQ     .10
    CMP.B   #'l',D1
    BEQ     .11
    CMP.B   #'r',D1
    BEQ     .12
    CMP.B   #'c',D1
    BEQ     .13
    CMP.B   #'q',D1
    BEQ     .15
    CMP.B   #'!',D1
    BEQ     .16
    CMP.B   #'v',D1
    BEQ     .17
    CMP.B   #'x',D1
    BEQ     .18
    CMp.B   #"u",D1
    BEQ     .19
    BRA iERROR26
.1: MOVE.B  #10,(A1)+
    BRA .LOOP
.2: MOVE.B  #"'",(A1)+
    BRA .LOOP
.3: MOVE.B  #27,(A1)+
    BRA .LOOP
.4: MOVE.B  #9,(A1)+
    BRA .LOOP
.5: MOVE.B  #"\",(A1)+
    BRA .LOOP
.6: MOVE.B  #0,(A1)+
    BRA .LOOP
.7: MOVE.B  #'%',(A1)+
    BSR     DOFIELD
    MOVE.B  #'l',(A1)+
    MOVE.B  #'d',(A1)+
    BRA .LOOP
.8: MOVE.B  #'%',(A1)+
    BSR     DOFIELD
    MOVE.B  #'l',(A1)+
    MOVE.B  #'x',(A1)+
    BRA .LOOP
.9: MOVE.B  #'%',(A1)+
    BSR     DOFIELD
    MOVE.B  #'s',(A1)+
    BRA .LOOP
.10:    MOVE.W  #-1,FZERO
    BRA .LOOP
.11:    MOVE.W  #-1,FRL
    BRA .LOOP
.12:    MOVE.W  #0,FRL
    BRA .LOOP
.13:    MOVE.B  #'%',(A1)+
    MOVE.B  #'l',(A1)+
    MOVE.B  #'c',(A1)+
    BRA .LOOP
.14:    MOVE.B  #13,(A1)+
    BRA .LOOP
.15:    MOVE.B  #34,(A1)+
    BRA .LOOP
.16:    MOVE.B  #7,(A1)+
    BRA .LOOP
.17:    MOVe.B  #11,(A1)+
    BRA .LOOP
.18:
    MOVEM.L D0/D2,-(A7)
    MOVEQ   #1,D1
    MOVEQ   #0,D2
.18_1:
    LSL.B   #4,D2
    MOVE.B  (A0)+,D0
    CMP.B   #"0",D0
    BLT     iERROR72
    CMP.B   #"9",D0
    BLE     .DEC
    CMP.W   #"A",D0
    BLT     iERROR72
    CMP.W   #"F",D0
    BLE     .HEX
    CMP.W   #"a",D0
    BLT     iERROR72
    CMP.W   #"f",D0
    BGT     iERROR72
.HEX:
    BCLR    #5,D0
    AND.L   #$FF,D0
    SUB.B   #"A",D0
    ADD.B   #10,D0
    BRA     .CNT
.DEC:
    AND.L   #$FF,D0
    SUB.B   #"0",D0
.CNT:
    ADD.W   D0,D2
    DBF     D1,.18_1
    MOVE.B  D2,(A1)+
    MOVEM.L (A7)+,D0/D2
    BRA .LOOP
.19:
    MOVE.B  #"%",(A1)+
    BSR     DOFIELD
    MOVE.W  #"lu",(A1)+
    BRA .LOOP


FZERO:  DC.W    0           ; 0=PADSPACE, -1=PADZERO
FRL:    DC.W    0           ; 0=RIGHT, -1=LEFT
SSTR:   DC.L    0

DOFIELD:
    TST.W   FRL
    BEQ.S   .1
    MOVE.B  #'-',(A1)+
.1: TST.W   FZERO
    BEQ.S   .2
    MOVE.B  #'0',(A1)+
.2: CMP.B   #'(',(A0)
    BNE.S   .5
    MOVE.L  A0,SSTR
    ADDQ.L  #1,A0
.4: MOVE.B  (A0)+,D1
    CMP.B   #')',D1
    BEQ.S   .5
    CMP.B   #',',D1
    BNE.S   .3
    MOVE.B  #'.',(A1)+
    BRA.S   .4
.3: CMP.B   #58,D1
    BPL.S   .F
    CMP.B   #48,D1
    BMI.S   .F
    MOVE.B  D1,(A1)+
    BRA.S   .4
.F: MOVE.L  SSTR(PC),A0
.5: CMP.B   #'[',(A0)
    BEQ.S   .7
.6: MOVE.W  #0,FZERO
    RTS
.7: MOVE.L  WORK(PC),A5
    MOVE.L  A5,D5
    MOVE.L  A0,SSTR
    ADDQ.L  #1,A0
.8: MOVE.B  (A0)+,D1
    CMP.B   #58,D1
    BPL.S   .X
    CMP.B   #48,D1
    BMI.S   .X
    MOVE.B  D1,(A5)+
    BRA.S   .8
.X: CMP.B   #']',D1
    BNE.S   .F2
    CMP.L   D5,A5
    BEQ.S   .6
    MOVE.B  #0,(A5)+
    MOVE.L  D5,A5
.XL:MOVE.B  (A5)+,(A1)+
    BNE.S   .XL
    MOVE.B  #'.',-1(A1)
    MOVE.L  D5,A5
.L2:    MOVE.B  (A5)+,(A1)+
    BNE.S   .L2
    SUBQ.L  #1,A1
    BRA.S   .6
.F2:    MOVE.L  SSTR(PC),A0
    BRA.S   .6
;*-*

;; Assembler part

; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ;
;   The ASSEMBLER part !!!!!!!              ;
; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ;
;; Parse
ASM_PARSE:
    MOVE.L  #ASM_KWORDS,D2
    MOVE.L  A2,D0
    MOVE.L  (A2),D1
    AND.L   #$FFFFFF00,D1
    CMP.L   #'PC'*$10000,D1
    BEQ ASM_PC

;; Check for keywords
    MOVE.L  HASHVAL(PC),D7
    LSL.L   #2,D7
    ADD.L   #AKWHASH,D7
    MOVE.L  D7,A6
.LOOPZ:
    MOVE.L  (A6),A6
    MOVE.L  A6,D6
    BEQ     .SKIP_GO1
    MOVE.L  (A6)+,A4
    MOVE.L  D0,A2
.3Z:CMPM.B  (A4)+,(A2)+
    BNE     .LOOPZ
    TST.B   -1(A2)
    BNE     .3Z
    SUB.L   D2,D6
    LSR.L   #3,D6
    MOVEQ   #47,D4
    MOVE.W  D4,(A1)+
    MOVE.W  D6,(A1)+
    MOVEQ   #-1,D0
    RTS
;*-*
;; Check for commands
.SKIP_GO1:
    MOVE.L  #ASM_INSTAB,D2
    MOVE.L  HASHVAL(PC),D7
    LSL.L   #2,D7
    ADD.L   #ASMHASH,D7
    MOVE.L  D7,A6
.LOOP:
    MOVE.L  (A6),A6         ; A6 _NOW_ POINTS TO ENTRY IN INSTABLE
    MOVE.L  A6,D6
    BEQ.S   .2
    MOVE.L  (A6)+,A4
    MOVE.L  D0,A2
.3: CMPM.B  (A4)+,(A2)+
    BNE.S   .LOOP
    TST.B   -1(A2)
    BNE.S   .3
    SUB.L   D2,D6
    LSR.L   #3,D6
    MOVE.L  D6,D0           ; D0=1..112
    ADD.L   #$100,D0
;*-*
;; Check for sizes
    MOVEQ   #0,D1
    CMP.B   #'.',(A0)       ; SEE IF THERE'S A:     .B .W .L .S
    BNE.S   .4
    ADDQ.L  #1,A0
    MOVE.B  (A0)+,D2
    LEA     .SIZES(PC),A6
    MOVEQ   #7,D4
.CHKSIZE:
    ADDQ.L  #1,D1
    CMP.B   (A6)+,D2
    BEQ     .4
    DBF     D4,.CHKSIZE
    BRA     ERROR31
.4: MOVE.W  D0,D4
    MOVE.W  D0,(A1)+
    MOVE.W  D1,(A1)+
    RTS
.2: MOVE.L  WORK(PC),A2
    MOVEQ   #0,D0           ; 0=FAIL, ELSE=ISASM
    RTS
.SIZES:
    DC.B    "BWLSXPDQ",0
;*-*
    EVEN
;*-*
;; PC
ASM_PC:
    CMP.W   #17,D4
    BNE .2
    CMP.B   #')',(A0)
    BEQ.S   .1
.2:
    MOVE.W  #$E00,D4
    MOVE.W  D4,(A1)+
    MOVEQ   #-1,D0
    RTS
.1: CMP.W   #17,D4          ;-(A1)
    BNE ERROR19
    SUBQ.L  #2,A1
    ADDQ.L  #1,A0
    SUBQ.W  #1,PARSEBRACKET
    MOVE.W  #$D00,D4
    MOVE.W  D4,(A1)+
    MOVEQ   #-1,D0
    RTS
;*-*
;; IMM
ASM_PARSEIMM:
    BTST    #7,CODEPREFS+1
    BEQ.S   .1
    MOVE.L  STARTINTERIM(PC),A6
    SUBQ.L  #2,A6
    CMPA.L  A6,A1
    BEQ PREP
.1: MOVE.W  #$F00,D4
    MOVE.W  D4,(A1)+        ; 11+4
    BRA PARSELOOP
;*-*
;; ParseReg
ASM_PARSEREG:
    CMP.B   #0,2(A2)
    BNE REGBACK
    MOVE.B  (A2),D1         ; D1="A" OR "D"
    CMP.B   #'D',D1
    BEQ.S   .1
    CMP.B   #'A',D1
    BNE REGBACK
.1: MOVEQ   #0,D0
    MOVE.B  1(A2),D0        ; D0="0" .. "9"
    SUB.W   #48,D0
    MOVE.L  D0,D7           ; =>COPY
    CMP.W   #8,D0
    BPL ERROR19
    CMP.B   #'A',D1
    BEQ .2
    MOVEQ   #0,D3           ; D3=ADR.MOD NR.
    BRA.S   .EXIT           ; --> Dx
.2: CMP.W   #17,D4          ;-2(A1)
    BEQ.S   .3
.6: BSET    #3,D0           ; --> Ax
    MOVEQ   #1,D3
    BRA.S   .EXIT
.3: CMP.B   #')',(A0)
    BNE.S   .6
    SUBQ.L  #2,A1
    ADDQ.L  #1,A0
    SUBQ.W  #1,PARSEBRACKET
    CMP.W   #8,-2(A1)
    BEQ.S   .4
.7: CMP.B   #'+',(A0)
    BEQ.S   .5
    BSET    #4,D0           ; --> (Ax)
    MOVEQ   #2,D3
    BRA.S   .EXIT
.4: CMP.L   #$10000,-6(A1)
    BEQ.S   .7
    SUBQ.L  #2,A1           ; --> -(Ax)
    MOVEQ   #4,D3
    BSET    #5,D0
    BRA.S   .EXIT
.5: ADDQ.L  #1,A0           ; --> (Ax)+
    MOVEQ   #3,D3
    ADD.W   #%11000,D0
    BRA .EXIT

.EXIT:  ASL.W   #8,D3
    ADD.W   #$400,D3
    CMP.W   #4,D7
    BEQ.S   .8
    CMP.W   #5,D7
    BEQ.S   .8
.9: ADD.W   D3,D0
    MOVE.W  D0,D4
    MOVE.W  D0,(A1)+
    MOVE.L  WORK(PC),A2
    BRA PARSELOOP
.8: CMP.W   #$400,D3
    BEQ.S   .9
    BSET    #0,WARNINGS+3       ; ISSUE A4/A5 USED WARNING
    BRA.S   .9
;*-*

;; Hash
MAKEASMHASH:
    MOVE.L  #ASMHASH,A0     ; A0=TABEL
    LEA ASM_INSTAB,A1
    MOVE.L  A0,A2
    MOVE.L  #255,D0
.CL:
    CLR.L   (A2)+           ; CLEAR TABLE
    DBRA    D0,.CL
.LOOP:
    MOVE.L  (A1),D0
    BEQ.S   EX_KWORDS
    MOVE.L  D0,A2
    HASH    A2,D0,D1
    LSL.L   #2,D0
    LEA 0(A0,D0.L),A2
    MOVE.L  (A2),D0         ; READ PREVIOUS LIST (OR NIL)
    MOVE.L  A1,(A2)         ; PUT ENTRY IN LIST
    MOVE.L  D0,4(A1)        ; AND LINK TAIL TO IT
    ADDQ.L  #8,A1
    BRA.S   .LOOP
EX_KWORDS:
    MOVE.L  #AKWHASH,A0     ; A0=TABEL
    LEA     ASM_KWORDS,A1
    MOVE.L  A0,A2
    MOVE.L  #255,D0
.CLX:
    CLR.L   (A2)+           ; CLEAR TABLE
    DBRA    D0,.CLX
.LOOPX:
    MOVE.L  (A1),D0
    BEQ.S   .EXX
    MOVE.L  D0,A2
    HASH    A2,D0,D1
    LSL.L   #2,D0
    LEA     0(A0,D0.L),A2
    MOVE.L  (A2),D0         ; READ PREVIOUS LIST (OR NIL)
    MOVE.L  A1,(A2)         ; PUT ENTRY IN LIST
    MOVE.L  D0,4(A1)        ; AND LINK TAIL TO IT
    ADDQ.L  #8,A1
    BRA.S   .LOOPX
.EXX:
    RTS
;*-*
;*-*
;;ASM

ASM_COMPILE:          ; GETS INSCODE IN D7
    MOVEM.L A2/A5,-(A7)     ; JUST A3-A4 STAY PRESERVED
    MOVEQ   #0,D0
    MOVE.W  D7,D0           ; D0=INSNR/ADDRESSMODENR
    MOVEQ   #0,D1
    SUB.W   #$100,D0
    MOVE.W  (A3)+,D1
    LEA ASM_INSJOB,A0
    LSL.L   #2,D0
    ADD.L   D0,A0
    MOVE.L  (A0),A0         ; A0=JOBTAB ENTRY
    MOVE.L  A4,A1           ; A1=ptr START INS IN A4
    MOVE.W  (A0)+,(A4)+
ASM_LOOP:
    MOVEQ   #0,D7
    MOVE.W  (A0)+,D7
    BEQ.S   .1
    SUBQ.L  #1,D7
    LSL.L   #2,D7
    MOVE.L  ASM_JOBROUTINES(PC,D7.L),A2
    JSR (A2)
    BRA.S   ASM_LOOP
.1: MOVEM.L (A7)+,A2/A5
    RTS

ASM_STOP:             ; EN JOBCODE PROCESSING
    LEA .1(PC),A0
    RTS
.1: DC.W    0

SKIP244:
    CMP.W   #44,(A3)
    BNE.S   *+4
    ADDQ.L  #4,A3   
    RTS


XR:
    BSR SKIP244

;; a:REG
ASM_REGID:
    CMP.W   #IDENT,(A3)
    BNE.S   .1
    MOVE.L  A0,-(A7)
    MOVE.L  2(A3),A0
    BTST    #3,5(A0)
    BEQ.S   .2
    MOVE.L  D0,-(A7)
    MOVE.W  #$400,D0
    OR.W    10(A0),D0
    MOVE.W  D0,(A3)
    MOVE.L  #$2C002C,2(A3)
    MOVE.L  (A7)+,D0
.2: MOVE.L  (A7)+,A0
.1: RTS
;*-*

ASM_JOBROUTINES:
    DC.L    ASM_NOTIMPL,ASM_PUTSIZE,ASM_PUTSIZEMOVE,ASM_DOEA
    DC.L    ASM_DOEAMOVEDEST,ASM_COMMA,ASM_ADDSUB,ASM_MOVEQ,ASM_ASQ
    DC.L    ASM_BCC,ASM_DBCC,ASM_GETADRREG,ASM_SHIFT,ASM_DATAREG
    DC.L    ASM_BIT,ASM_SIZEA,ASM_SIZEE,ASM_XREG,ASM_DOEXG
    DC.L    ASM_CMPM,ASM_MOVEM,ASM_TRAP,ASM_MOVEP,ASM_CMPI
    DC.L    ASM_CPUSUP,ASM_SIZEFIXED,ASM_SIZE0,ASM_SIZEO
    DC.L    ASM_MONADIC,ASM_FPUSUP,ASM_46EMUL,ASM_DYADIC
    DC.L    ASM_MMUSUP,ASM_COPY,ASM_FMOVE,ASM_FMOVECR
    DC.L    ASM_FMOVEM,ASM_FSINCOS,ASM_TRAPCC,ASM_FTST
    DC.L    ASM_PMMSTD,ASM_PMMLDX,ASM_PMMTST,ASM_PMMMOVE,ASM_PMMEA
    DC.L    ASM_IMM3B,ASM_MOVEC,ASM_MOVES,ASM_BITFIELD1,ASM_BITFIELD2
    DC.L    ASM_BITFIELD3,ASM_MULDIV,ASM_LINK,ASM_CPCACHE040,ASM_MOVE16
    DC.L    ASM_PULSE,ASM_MOVE,ASM_ANDI,ASM_EORI,ASM_ORI

;; Not implemented      1
ASM_NOTIMPL:          ; 1
    BRA ERROR87      ; TEMP
;*-*
;; Put size             2
ASM_PUTSIZE:          ; 2
    TST.L   D1
    BNE     .EXISTS
    MOVE.W  (A0),D1
.EXISTS:
    ADDQ.L  #2,A0
    MOVE.W  (A0)+,D2
    MOVE.L  D1,D0
    SUBQ.L  #1,D0
    BTST    D0,D2
    BEQ     ERROR79         ; 1=B,2=W,3=L...

    MOVE.W  (A0)+,D2        ; FIND OFFSET
    LSL.L   D2,D0
    OR.W    D0,(A1)         ; PUT IN INS.WORD
    RTS
;*-*
;; Put size (move)      3
ASM_PUTSIZEMOVE:          ; 3
    TST.L   D1
    BNE     .EXISTS
    MOVE.W  (A0),D1
.EXISTS:
    MOVE.L  D1,D0
    sUBQ.L  #1,D0
    ADDQ.L  #2,A0
    MOVE.W  (A0)+,D2
    btst    d0,d2
    beq     ERROR79

    MOVE.L  D1,D0
    CMP.W   #1,D0
    BEQ.S   .1
    BCHG    #0,D0
.1: MOVE.W  (A0)+,D2        ; FIND OFFSET
    LSL.L   D2,D0
    OR.W    D0,(A1)         ; PUT IN INS.WORD
    RTS
;*-*
;; EA                   4
ASM_DOEA:             ; 4
    BSR.W   ASM_GETEA
    MOVE.W  (A0)+,D2
    BTST    D0,D2
    BEQ ERROR19
    MOVE.W  (A0)+,D2
    TST.W   D2
    BMI.S   .1          ; OFFS=-1 --> NO OR.W EA
    LSL.W   D2,D3
    OR.W    D3,(A1)
.1: RTS
;*-*
;; EA (move dest)       5
ASM_DOEAMOVEDEST:         ; 5  MASK IN D3, # IN D0
    BSR.W   ASM_GETEA
    MOVE.W  (A0)+,D2
    BTST    D0,D2
    BEQ ERROR19
    MOVE.L  D3,D0
    LSR.W   #3,D3           ; UPPER BITS
    AND.W   #%111,D0        ; LOWER
    LSL.W   #3,D0
    ADD.W   D3,D0           ; SWAPPED REGISTER AND MODE FIELDS
    MOVE.W  (A0)+,D2
    LSL.W   D2,D0
    OR.W    D0,(A1)
    RTS
;*-*
;; Comma                6
ASM_COMMA:            ; 6
    CMP.W   #COM,(A3)+
    BNE ERROR5
    RTS
;*-*
;; Add/Sub              7
ASM_ADDSUB:           ; 7
    BSR ASM_REGID
    MOVE.B  (A3),D2
    CMP.B   #4,D2
    BEQ.S   .1
    CMP.B   #15,D2
    BEQ.S   .3
.2: BSR.W   ASM_GETEA       ; EA --> Dx
    BSR SKIP244
    OR.W    D3,(A1)
    BSR.S   ASM_COMMA
    CMP.B   #5,(A3)
    BEQ.S   .4
    MOVEQ   #9,D0
    BSR.W   ASM_GETDATAREG
    ADDQ.L  #2,A0
    RTS
.1: CMP.W   #44,2(A3)
    BEQ.W   .S
    ADDQ.L  #4,A3
    BSR ASM_REGID
    MOVE.B  (A3),D0
    SUBQ.L  #4,A3
    CMP.B   #4,D0
    BEQ.S   .2
    CMP.B   #5,D0
    BEQ.S   .2
.SB:    MOVEQ   #9,D0
    BSR.W   ASM_GETDATAREG      ; Dx --> EA
    BSR.S   ASM_COMMA
    MOVEQ   #0,D7
    BSR.W   ASM_ANYEA
    CMP.W   #8,D3           ; FROM DX TO DX, ALWAYS DEST.
    BMI.S   .DXDX
    BSET    #0,(A1)
.DXDX:  ADDQ.L  #2,A0
    RTS
.3: BSR ASM_GETEA       ; #x --> EA
    BSR ASM_COMMA
    CMP.B   #5,(A3)
    BEQ.S   .8
    BSR ASM_GETEA
    OR.W    D3,(A1)
    MOVE.B  (A0)+,(A1)
    ADDQ.L  #1,A0
    MOVE.W  #DEST,D2
    BTST    D0,D2
    BEQ ERROR19
    RTS
.4: MOVE.B  (A1),D6         ; EA --> Ax
    CMP.B   #13*16,D6
    BEQ.S   .5
    CMP.B   #9*16,D6
    BNE ERROR19
.5: MOVE.W  (A3)+,D6
    AND.W   #7,D6
    LSL.W   #1,D6
    OR.B    D6,(A1)
    MOVE.W  (A1),D6
    AND.W   #%11000000,D6
    TST.W   D6
    BEQ ERROR31
    BTST    #7,D6
    BEQ.S   .7
    BSET    #0,(A1)
.7: OR.B    #%11000000,1(A1)
    ADDQ.L  #2,A0
    RTS
.8: OR.W    #%111100,(A1)
    BRA.S   .4
.S: ADDQ.L  #8,A3
    BSR ASM_REGID
    MOVE.B  (A3),D0
    SUBQ.L  #8,A3
    CMP.B   #4,D0
    BEQ.W   .2
    CMP.B   #5,D0
    BEQ.W   .2
    BRA.W   .SB
;*-*
;; Moveq                8
ASM_MOVEQ:            ; 8
    CMP.W   #$0F00,(A3)+
    BNE ERROR30

    MOVEM.L A0/D1,-(A7)
    CMP.W   #LIBC,(A3)
    BNE .1_1
    ADDQ.L  #4,A3
    MOVE.W  (A3)+,D1
    EXT.L   D1
    ADDQ.L  #8,A3
    MOVEQ   #0,D0
    BRA .1_2
.1_1:
    BSR ASM_GRABVALUE
.1_2:
    TST.L   D0
    BMI ERROR30
    MOVE.L  D1,D0
    MOVEM.L (A7)+,A0/D1

    CMP.L   #128,D0
    BPL ERROR31
    CMP.L   #-127,D0
    BMI ERROR31
    MOVE.B  D0,1(A1)
    BSR.W   ASM_COMMA
    MOVEQ   #9,D0
    BSR     ASM_GETDATAREG
    RTS
;*-*
;; Addq/Subq            9
ASM_ASQ:              ; 9
    CMP.W   #$0F00,(A3)+
    BNE ERROR30
    
    MOVEM.L A0/D1,-(A7)
    BSR ASM_GRABVALUE
    TST.L   D0
    BEQ ERROR30
    MOVE.L  D1,D2
    MOVEM.L (A7)+,A0/D1

    TST.L   D2
    BEQ ERROR31
    CMP.L   #8,D2
    BNE.S   .1
    MOVEQ   #0,D2
.1: MOVE.L  D2,D3
    AND.L   #$FFFFFFF8,D3
    TST.L   D3
    BNE ERROR31
    AND.W   #%111,D2
    MOVEQ   #9,D3
    LSL.W   D3,D2
    ADD.W   D2,(A1)
    RTS
;*-*
;; Bcc                  10
ASM_BCC:              ; 10
    CMP.W   #IDENT,(A3)+
    ADDQ.L  #2,A0
    BNE ERROR4
    MOVE.L  (A3)+,A2
    CMP.B   #LAB,4(A2)
    BNE ERROR4
    BTST    #4,5(A2)        ; CHECK IF METHOD
    BNE ERROR4

    CMP.W   #3,D1
    BNE     .X0
    MOVE.W  -2(A0),(A1)     ; Bcc.L....
    MOVEM.L D1/A0,-(A7)
    MOVE.W  10(A2),D0
    BSR     ADDBRANCHPCREL32
    MOVEM.L (A7)+,D1/A0
    RTS

.X0:CMP.W   #4,D1
    BEQ.S   .X1
    CMP.W   #1,D1           ; A Bcc.S/Bcc.B ?
    BNE.S   .1
.X1:MOVE.B  #5,1(A1)
    BRA.S   .2
.1: MOVE.W  #0,(A4)+
.2: MOVE.W  10(A2),D0
    MOVEM.L D1/A0,-(A7)
    CLR.W   NEWOP
    BSR ADDBRANCH
    MOVEM.L (A7)+,D1/A0
    RTS

;*-*
;; DBcc                 11
ASM_DBCC:             ; 11
    BSR ASM_REGID
    CMP.B   #4,(A3)+
    BNE ERROR19
    MOVE.B  (A3)+,D0
    OR.B    D0,1(A1)
    BSR SKIP244
    BSR.W   ASM_COMMA
    CMP.W   #IDENT,(A3)+
    BNE ERROR4
    MOVE.L  (A3)+,A2
    CMP.B   #LAB,4(A2)
    BNE ERROR4
    BTST    #4,5(A2)        ; CHECK IF METHOD
    BNE ERROR4
    MOVE.W  #0,(A4)+
    MOVE.W  10(A2),D0
    MOVEM.L D1/A0,-(A7)
    CLR.W   NEWOP
    BSR ADDBRANCH
    MOVEM.L (A7)+,D1/A0
    RTS
;*-*
;; Address reg          12
ASM_GETADRREG:            ; 12
    MOVE.W  (A0)+,D0
    CMP.B   #5,(A3)+
    BNE ERROR19
    MOVE.B  (A3)+,D2
    AND.W   #%111,D2
    LSL.W   D0,D2
    ADD.W   D2,(A1)
    RTS
;*-*
;; Shift                13
ASM_SHIFT:            ; 13
    BSR ASM_REGID
    MOVE.B  (A3),D2
    CMP.B   #4,D2
    BEQ.S   .2
    CMP.B   #15,D2
    BNE.W   .1
    ADDQ.L  #2,A3           ; IMM,REG
    CMP.W   #VALUE,(A3)+
    BNE ERROR30
    MOVE.L  (A3)+,D4
    BEQ ERROR31
    CMP.L   #8,D4
    BNE.S   .4
    MOVEQ   #0,D4
.4: CMP.L   #8,D4
    BPL ERROR31
    TST.L   D4
    BMI ERROR31
    BSR ASM_COMMA
    BSR ASM_REGID
    CMP.B   #4,(A3)
    BNE.S   .5
    ADDQ.L  #1,A3
    MOVE.B  (A3)+,D5
    BSR SKIP244
    LSL.W   #1,D4
    OR.B    D4,(A1)
    OR.B    D5,1(A1)
    SUBQ.W  #1,D1
    LSL.W   #6,D1
    OR.W    D1,(A1)
    ADDQ.L  #2,A0
    RTS
.2: BSET    #5,1(A1)        ; REG,REG
    ADDQ.L  #1,A3
    MOVE.B  (A3)+,D3
    LSL.B   #1,D3
    OR.B    D3,(A1)
    BSR SKIP244
    BSR ASM_COMMA
    BSR ASM_REGID
    CMP.B   #4,(A3)+
    BNE ERROR19
    MOVE.B  (A3)+,D3
    BSR SKIP244
    OR.B    D3,1(A1)
    SUBQ.W  #1,D1
    LSL.W   #6,D1
    OR.W    D1,(A1)
    ADDQ.L  #2,A0
    RTS
.5: CMP.W   #1,D4
    BNE ERROR31
.1: CMP.W   #2,D1           ; SHIFT IN MEM NEEDS .W
    BNE ERROR31
    BSR.W   ASM_GETEA
    MOVE.W  #MDEST,D2       ; SHIFT IN MEMORY
    BTST    D0,D2
    BEQ ERROR19
    MOVE.W  (A0)+,(A1)      ; NEW OPCODE
    OR.W    D3,(A1)         ; PUT IN EA
    RTS
;*-*
;; Data reg             14
ASM_DATAREG:          ; 14
    MOVE.W  (A0)+,D0
    BSR ASM_REGID
    CMP.B   #4,(A3)+
    BNE ERROR19
    MOVEQ   #0,D2
    MOVE.B  (A3)+,D2
    LSL.W   D0,D2
    ADD.W   D2,(A1)
    BSR SKIP244
    RTS
;*-*
;; Bit                  15
ASM_BIT:              ; 15
    CMP.B   #$F,(A3)
    BNE.S   .1
    ADDQ.L  #2,A3           ; #IMM,EA
    CMP.W   #VALUE,(A3)+
    BNE ERROR30
    MOVE.L  (A3)+,D2
    CHKB    D2,D3,ERROR31
    MOVE.W  D2,(A4)+
    MOVE.W  (A0)+,(A1)      ; NEW OPCODE
    BSR ASM_COMMA
    BSR.W   ASM_GETEA
    MOVE.W  #BTDEST,D2
    BTST    D0,D2
    BEQ ERROR19
    OR.W    D3,(A1)
    RTS
.1: BSR ASM_REGID
    CMP.B   #4,(A3)+        ; Dx,EA
    BNE ERROR19
    MOVE.B  (A3)+,D2
    LSL.B   #1,D2
    OR.B    D2,(A1)
    BSR SKIP244
    BSR ASM_COMMA
    BSR.W   ASM_GETEA
    MOVE.W  #BTDEST,D2
    BTST    D0,D2
    BEQ ERROR19
    OR.W    D3,(A1)
    ADDQ.L  #2,A0
    RTS
;*-*
;; SizeA                16
ASM_SIZEA:            ; 16
    TST.W   D1
    bNE     .EXISTS
    MOVE.W  (A0),D1
.EXISTS:
    ADDQ.L  #2,A0
    MOVE.L  D1,D0
    SUBQ.L  #1,D0
    MOVE.W  (A0)+,D2
    BTST    D0,D2
    BEQ     ERROR79

    CMP.W   #1,D1
    BEQ ERROR79
    CMP.W   #3,D1
    BEQ.S   .1
    RTS
.1: BSET    #0,(A1)
    RTS
;*-*
;; SizeE                17
ASM_SIZEE:            ; 17
    TST.W   D1
    bNE     .EXISTS
    MOVE.W  (A0),D1
.EXISTS:
    ADDQ.L  #2,A0
    MOVE.L  D1,D0
    SUBQ.L  #1,D0
    MOVE.W  (A0)+,D2
    BTST    D0,D2
    BEQ     ERROR79

    CMP.W   #1,D1
    BEQ ERROR79
    CMP.W   #3,D1
    BEQ.S   .1
    RTS
.1: BSET    #6,1(A1)
    RTS
;*-*
;; Xreg                 18
ASM_XREG:             ; 18
    BSR ASM_REGID
    MOVE.B  (A3)+,D2
    MOVE.B  (A3)+,D3
    BSR SKIP244
    BSR ASM_COMMA
    BSR ASM_REGID
    MOVE.B  (A3)+,D4
    MOVE.B  (A3)+,D5
    BSR SKIP244
    CMP.B   D2,D4
    BNE ERROR19
    CMP.B   #4,D2
    BEQ.S   .1
    CMP.B   #8,D2
    BNE ERROR19
    BSET    #3,1(A1)
.1: AND.B   #%111,D3
    AND.B   #%111,D5
    OR.B    D3,1(A1)
    LSL.B   #1,D5
    OR.B    D5,(A1)
    RTS
;*-*
;; Exg                  19
ASM_DOEXG:            ; 19
    BSR ASM_REGID
    MOVE.B  (A3)+,D2
    MOVE.B  (A3)+,D3
    CMP.B   #4,D2
    BNE.S   .1
    BSR SKIP244

    LSL.B   #1,D3
    OR.B    D3,(A1)

    BSR ASM_COMMA
    BSR ASM_REGID
    MOVE.B  (A3)+,D2
    MOVE.B  (A3)+,D3
    AND.B   #%111,D3

    OR.B    D3,1(A1)

    CMP.B   #4,D2
    BNE.S   .2
    BSR SKIP244
    BSET    #6,1(A1)        ; d,d
    RTS
.2: BSET    #7,1(A1)        ; d,a
    BSET    #3,1(A1)
    RTS
.1: CMP.B   #5,D2
    BNE ERROR19
    AND.B   #%111,D3

    OR.B    D3,1(A1)

    BSR ASM_COMMA
    BSR ASM_REGID
    MOVE.B  (A3)+,D2
    MOVE.B  (A3)+,D3
    AND.B   #%111,D3

    LSL.B   #1,D3
    OR.B    D3,(A1)

    CMP.B   #4,D2
    BNE.S   .3
    BSR SKIP244
    BSET    #7,1(A1)        ; d,a
    BSET    #3,1(A1)
    RTS
.3: BSET    #6,1(A1)        ; a,a
    BSET    #3,1(A1)
    RTS
;*-*
;; Cmpm                 20
ASM_CMPM:             ; 20
    CMP.B   #7,(A3)+
    BNE ERROR19
    MOVE.B  (A3)+,D2
    BSR ASM_COMMA
    CMP.B   #7,(A3)+
    BNE ERROR19
    AND.W   #$7,D2
    OR.W    D2,(A1)
    MOVE.B  (A3)+,D2
    AND.W   #$7,D2
    LSL.B   #1,D2
    OR.B    D2,(A1)
    RTS
;*-*
;; Movem                21
ASM_MOVEM:            ; 21
    BSR ASM_REGID
    MOVE.B  (A3),D0
    BEQ.S   .1B
    CMPI.B  #6,D0
    BMI.S   .1
.1B:    ADDQ.L  #2,A4
    BSR.W   ASM_GETEA       ; (Ax)+,REGLIST
    MOVE.W  #MMSRC,D2
    BTST    D0,D2
    BEQ ERROR19
    OR.W    D3,(A1)
    BSET    #2,(A1)
    BSR ASM_COMMA
    BSR ASM_REGID
    BSR.S   .2
    MOVE.W  D2,2(A1)
    RTS
.1: BSR.S   .2
    MOVE.W  D2,(A4)+
    MOVE.W  D7,-(A7)
    BSR ASM_COMMA
    BSR.W   ASM_GETEA       ; REGLIST,-(Ax)
    MOVE.W  (A7)+,D7
    CMP.W   #4,D0
    BNE.S   .10
    MOVE.W  D7,2(A1)
.10:    MOVE.W  #MMDEST,D2
    BTST    D0,D2
    BEQ ERROR19
    OR.W    D3,(A1)
    RTS
.2: MOVEQ   #0,D2           ; MASK
    MOVEQ   #0,D7
    MOVE.B  (A3)+,D0        ; GET REGLIST
    BEQ ERROR0
.6: MOVEQ   #4,D6
    CMP.B   #4,D0
    BEQ.S   .4
    CMP.B   #5,D0
    BEQ.S   .5
    BRA ERROR19
.X: SUBQ.L  #2,A3
    RTS
.4: MOVEQ   #0,D4
    MOVE.B  (A3)+,D4        ; Dx
    BSR SKIP244
    BSET    D4,D2
    MOVEQ   #15,D3
    SUB.L   D4,D3
    BSET    D3,D7
.9: MOVE.W  (A3)+,D5
    CMP.W   #10,D5
    BEQ.S   .7
    CMP.W   #8,D5
    BNE.S   .X
    BSR ASM_REGID
    CMP.B   (A3)+,D6
    BNE ERROR19
    MOVEQ   #0,D5
    MOVE.B  (A3)+,D5
    BSR SKIP244
.8: ADDQ.L  #1,D4
    BSET    D4,D2
    MOVEQ   #15,D3
    SUB.L   D4,D3
    BSET    D3,D7
    CMP.L   D5,D4
    BMI.S   .8
    BEQ.S   .9
    BRA ERROR19
.5: MOVEQ   #5,D6           ; Ax
    BRA.S   .4
.7: BSR ASM_REGID
    MOVE.B  (A3)+,D0
    BRA.S   .6
;*-*
;; Trap                 22
ASM_TRAP:             ; 22
    CMP.L   #$0F000001,(A3)+
    BNE ERROR19
    MOVE.L  (A3)+,D2
    MOVE.L  D2,D3
    AND.L   #$FFFFFFF0,D3
    TST.L   D3
    BNE ERROR31
    OR.W    D2,(A1)
    RTS
;*-*
;; Movep                23
ASM_MOVEP:            ; 23
    CMP.B   #4,(A3)
    BNE.S   .1
    ADDQ.L  #1,A3
    BSET    #7,1(A1)        ; Dx,x(Ax)
    MOVE.B  (A3)+,D2
    LSL.B   #1,D2
    OR.B    D2,(A1)
    BSR ASM_COMMA
    BSR     ASM_GETEA
    CMP.W   #5,D0
    BNE ERROR19
    AND.W   #7,D3
    OR.W    D3,(A1)
    RTS
.1: BSR     ASM_GETEA       ; x(Ax),Dx
    CMP.W   #5,D0
    BNE ERROR19
    AND.W   #7,D3
    OR.W    D3,(A1)
    BSR ASM_COMMA
    CMP.B   #4,(A3)+
    BNE ERROR19
    MOVE.B  (A3)+,D2
    LSL.B   #1,D2
    OR.B    D2,(A1)
    RTS
;*-*
;; Cmpi                 24
ASM_CMPI:             ; 24
    CMP.W   #$0F00,(A3)
    BEQ .1
    RTS
.1: MOVE.B  #$C,(A1)        ; SET TO CMPI
    BSR     ASM_GETEA
    CMP.W   #11,D0
    BNE ERROR19
    BSR ASM_COMMA
    BSR ASM_GETEA
    MOVE.W  #DEST,D2
    BTST    D0,D2
    BEQ ERROR19
    OR.W    D3,(A1)
    BSR ASM_STOP
    RTS
;*-*
;; CpuSup               25
ASM_CPUSUP:           ; 25
    MOVE.W  ASMCPU(PC),D0
    AND.W   (A0)+,D0
    BEQ ERROR53
    RTS
;*-*
;; SizeFixed            26
ASM_SIZEFIXED:
    CMP.W   (A0)+,D1
    BNE ERROR31
    RTS
;*-*
;; Size0                27
ASM_SIZE0:
    TST.W   D1
    BNE     ERROR79
    RTS
;*-*
;; SizeO                28
ASM_SIZEO:
    TST.W   D1
    BNE     .EXISTS
    MOVE.W  (A0),D1
.EXISTS:
    ADDQ.L  #2,A0
    MOVe.W  (A0)+,D2
    MOVE.L  D1,D0
    SUBQ.L  #1,D0
    BTST    D0,D2
    BEQ     ERROR79
    RTS
;*-*
;; Monadic              29
ASM_MONADIC:
    MOVE.W  (A0)+,(A4)+
    CMP.W   #47,(A3)
    BNE     .EA
    CMP.W   #5,D1
    BNE     ERROR79
    BSR     ASM_GETFPREG
    MOVE.W  D2,D3
    CMP.W   #COM,(A3)
    BNE     .FP
    BSR     ASM_COMMA
    BSR     ASM_GETFPREG
.FP:LSL.W   #8,D3
    LSL.W   #2,D3
    LSL.W   #7,D2
    OR.W    D2,2(A1)
    OR.W    D3,2(A1)
    RTS
.EA:
    BSR     ASM_GETEA
    MOVE.L  #NASRC,D2
    BTST    D0,D2
    BEQ     ERROR19
    TST.W   D0
    BNE     .EA2
    CMp.W   #5,D1
    BPL     ERROR79
.EA2:
    TST.W   (A0)+
    BNE     .EA3
    CMP.W   #6,D1
    BEQ     ERROR79
.EA3:
    OR.W    D3,(A1)
    MOVE.L  D1,D2
    CMp.W   #8,D1
    BEQ     ERROR79
    LSL.W   #1,D2
    MOVE.W  .SIZES(PC,D2),D2
    OR.W    D2,2(A1)
    BSR     ASM_COMMA
    BSR     ASM_GETFPREG
    LSL.W   #7,D2
    OR.W    D2,2(A1)
    RTS
.SIZES:
    DC.W    0,$5800,$5000,$4000,$4400,$4800,$4c00,$5400,$0000
;*-*
;; FpuSup               30
ASM_FPUSUP:
    MOVE.W  (A0)+,D2
    MOVE.W  EFPU,D0
    AND.W   D0,D2
    BEQ     ERROR53
    RTS
;*-*
;; 040/060 emulated     31
ASM_46EMUL:
    CMP.W   #2,EFPU
    BNE     .X
    BSET    #7,WARNINGS+3
.X: RTS
;*-*
;; Dyadic               32
ASM_DYADIC:
    MOVE.W  (A0)+,(A4)+
    CMP.W   #47,(A3)
    BNE     .EA
    CMP.W   #5,D1
    BNE     ERROR79
    BSR     ASM_GETFPREG
    MOVE.W  D2,D3
    BSR     ASM_COMMA
    BSR     ASM_GETFPREG
.FP:LSL.W   #8,D3
    LSL.W   #2,D3
    LSL.W   #7,D2
    OR.W    D2,2(A1)
    OR.W    D3,2(A1)
    RTS
.EA:
    BSR     ASM_GETEA
    MOVE.L  #NASRC,D2
    BTST    D0,D2
    BEQ     ERROR19
    TST.W   D0
    BNE     .EA2
    CMp.W   #5,D1
    BPL     ERROR79
.EA2:
    TST.W   (A0)+
    BNE     .EA3
    CMP.W   #6,D1
    BEQ     ERROR79
.EA3:
    OR.W    D3,(A1)
    MOVE.L  D1,D2
    CMp.W   #8,D1
    BEQ     ERROR79
    LSL.W   #1,D2
    MOVE.W  .SIZES(PC,D2),D2
    OR.W    D2,2(A1)
    BSR     ASM_COMMA
    BSR     ASM_GETFPREG
    LSL.W   #7,D2
    OR.W    D2,2(A1)
    RTS
.SIZES:
    DC.W    0,$5800,$5000,$4000,$4400,$4800,$4c00,$5400,$0000
;*-*
;; MmuSup               33
ASM_MMUSUP:
    MOVE.W  (A0)+,D2
    MOVE.W  EMMU,D0
    AND.W   D0,D2
    BEQ     ERROR53
    RTS
;*-*
;; Copy                 34
ASM_COPY:
    MOVE.W  (A0)+,(A4)+
    RTS
;*-*
;; Fmove                35
ASM_FMOVE:
    CMP.W   #47,(A3)
    BNE     .EA
    CMP.W   #$24,2(A3)
    BPL     .FPCR1
    BSR     ASM_GETFPREG
    MOVE.W  D2,D7
    BSR     ASM_COMMA
    CMP.W   #47,(A3)
    BNE     .EAX
    CMP.W   #5,D1

    BNE     ERROR79         ; FP to FP
    BSR     ASM_GETFPREG
    LSL.W   #8,D7
    LSL.W   #2,D7
    LSL.W   #7,D2
    OR.W    D2,2(A1)
    OR.W    D7,2(A1)
    RTS
.EAX:
    BSR     ASM_GETEA
    MOVE.L  #DEST,D2
    BTST    D0,D2
    BEQ     ERROR19
    TST.W   D0
    BNE     .EAX1
    CMP.W   #5,D1
    BPL     ERROR79
.EAX1:
    OR.W    D3,(A1)
    LSL.W   #7,D7
    OR.W    D7,2(A1)
    BSR     .ADJUSTSIZE
    OR.W    #$2000,2(A1)
    CMP.W   #6,D1
    BNE     .X
    CMP.W   #23,(a3)
    BEQ     .EXT
.X: RTS
.EXT:
    ADDQ.L  #2,A3
    CMP.B   #4,(A3)
    BEQ     .EXTD
    CMp.L   #$0f000001,(a3)+
    bne     ERROR19
    move.l  (a3)+,d2
    bmi     ERROR31
    cmp.l   #64,d2
    bpl     ERROR31
    OR.W    D2,2(A1)
    CMP.W   #24,(A3)+
    BNE     ERROR29
    RTS
.EXTD:
    OR.W    #$1000,2(A1)
    MOve.W  (a3)+,d2
    and.l   #7,d2
    lsl.w   #4,d2
    or.w    d2,2(A1)
    cmp.w   #24,(a3)+
    bne     ERROR29
    RTS
.FPCR1:
    CMP.W   #3,D1
    BNE     ERROR79
    ADDq.L  #2,A3
    MOVE.W  (A3)+,D2
    cmp.w   #$27,d2
    bpl     ERROR80
    sub.w   #$24,d2
    beq     .F11
    cmp.w   #1,d2
    beq     .F12
    move.w  #$A400,D2
    BRA     .F13
.F11:
    move.w  #$a800,d2
    bra     .F13
.F12:
    MOVe.W  #$B000,d2
.F13:
    move.w  d2,2(a1)
    bsr     ASM_COMMA
    BSR     ASM_GETEA
    MOVe.W  #DEST,D2
    BTST    D0,D2
    BEQ     ERROR19
    OR.W    D3,(A1)
    RTS

.EA:
    BSR     ASM_GETEA
    MOVE.L  #NASRC,D2
    BTST    D0,D2
    BEQ     ERROR19
    TST.W   D0
    BNE     .EA2
    CMp.W   #5,D1
    BPL     ERROR79
.EA2:
    OR.W    D3,(A1)
    BSR     ASM_COMMA
    CMP.W   #$24,2(A3)
    BPL     .FPCR2
    BSR     ASM_GETFPREG
    LSL.W   #7,D2
    OR.W    D2,2(A1)
    BSR     .ADJUSTSIZE
    RTS

.FPCR2:
    CMP.W   #3,D1
    BNE     ERROR79
    CMP.W   #47,(a3)+
    BNE     ERROR80
    MOVE.W  (A3)+,D2
    cmp.w   #$27,d2
    bpl     ERROR80
    sub.w   #$24,d2
    beq     .F21
    cmp.w   #1,d2
    beq     .F22
    move.w  #$8400,D2
    BRA     .F23
.F21:
    move.w  #$8800,d2
    bra     .F23
.F22:
    MOVe.W  #$9000,d2
.F23:
    move.w  d2,2(a1)
    OR.W    D3,(A1)
    RTS
.ADJUSTSIZE:
    MOVE.L  D1,D2
    LSL.W   #1,D2
    MOVE.W  .SIZES(PC,D2),D2
    OR.W    D2,2(A1)
    RTS
.SIZES:
    DC.W    0,$5800,$5000,$4000,$4400,$4800,$4c00,$5400,$0000
;*-*
;; Fmovecr              36
ASM_FMOVECR:
    CMP.L   #$0f000001,(a3)+
    BNE     ERROR30
    MOVE.L  (a3)+,D2
    BMI     ERROR31
    CMP.L   #$7F,D2
    BGT     ERROR31
    OR.W    D2,2(A1)
    BSR     ASM_COMMA
    BSR     ASM_GETFPREG
    LSL.W   #7,D2
    OR.W    D2,2(A1)
    RTS
;*-*
;; Fmovem               37
ASM_FMOVEM:
    CMP.W   #3,D1       ; ".L"?
    BEQ     .FPCR_LIST

    CMP.W   #47,(A3)
    BEQ     .01         ; FP reg list

    BSR     ASM_GETEA
    MOVE.L  #MMSRC+1,D2
    BTST    D0,D2
    BEQ     ERROR19
    TST.W   D0
    BEQ     .02         ; mask in Dx

    OR.W    D3,(A1)
    BSR     ASM_COMMA
    CMP.W   #47,(A3)
    BEQ     .03         ; restore list
;; FMOVEM <ea>,Dx
    Bsr     ASM_GETEA
    TST.W   D0
    BNE     ERROR19
    LSL.W   #3,D3
    or.w    d3,2(a1)
    OR.W    #$C800,2(A1)    ; FMOVEM.X  <ea>,Dx
    RTS
;*-*
;; FMOVEM <ea>,<list>
.03:
    BSR     .COMBINE_LIST
    MOVE.L  D0,D7
    BSR     .FLIP
    OR.W    D2,2(A1)
    OR.W    #$D000,2(A1)    ; FMOVEM.X  <ea>,<list>
    RTS
;*-*
;; FMOVEM Dx,<ea>
.02:
    LSL.W   #3,D3
    OR.W    D3,2(A1)
    BSR     ASM_COMMA
    BSR     ASM_GETEA
    MOVE.L  #MMDEST,D2
    BTST    D0,D2
    BEQ     ERROR19
    OR.W    D3,(A1)
    CMP.W   #4,d0
    bne     .X2
    OR.W    #$E800,2(A1)    ; FMOVEM.X  Dx,<ea>
    RTS
.X2:OR.W    #$F800,2(A1)
    RTS
;*-*
;; FMOVEM <list>,<ea>
.01:
    BSR     .COMBINE_LIST
    MOVE.L  D2,D7
    BSR     ASM_COMMA
    BSR     ASM_GETEA
    MOVE.L  #MMDEST,D2
    BTST    D0,D2
    BEQ     ERROR19
    OR.W    D3,(A1)
    CMP.W   #4,D0
    BNE     .X1
    OR.W    #$E000,2(A1)    ; FMOVEM.X <list>,<ea>
    OR.W    D7,2(a1)
    RTS
.X1:OR.W    #$F000,2(A1)
    BSR     .FLIP
    OR.W    D2,2(A1)
    RTS
;*-*
;; Flip bits
.FLIP:
    MOVEQ   #7,D0
    MOVEQ   #0,D2
.FLIPX:
    LSR.W   #1,D7
    BCC     .FLIPY
    BSET    D0,D2
.FLIPY:
    DBF     D0,.FLIPX
    RTS
;*-*
;; Combine mask list
.COMBINE_LIST:
    MOVEQ   #0,D0
    BSR     ASM_GETFPREG
    BSET    D2,D0           ; D0 - mask
    MOVE.L  D2,D7
.LOOP:
    CMP.W   #10,(A3)
    BEQ     .ONE
    CMP.W   #8,(A3)
    BNE     .XXX

    ADDQ.L  #2,A3
    ADDQ.L  #1,D7
    BSR     ASM_GETFPREG
    CMP.W   D2,D7
    BGT     ERROR19
.L1:
    BTST    D7,D0
    BNE     ERROR50
    BSET    D7,D0
    ADDQ.B  #1,D7
    CMP.W   D2,D7
    BLE     .L1
    CMP.W   #8,(A3)
    BEQ     ERROR19
    CMP.W   #10,(A3)
    BNE     .XXX

.ONE:
    ADDQ.L  #2,A3
    BSR     ASM_GETFPREG
    BTST    D2,D0
    BNE     ERROR50
    BSET    D2,D0
    MOVE.L  D2,D7
    BRA     .LOOP
.XXX:
    MOVE.L  D0,D2
    RTS
;*-*
;; FPcr
.FPCR_LIST:
    BSR     .COMBINE_FPCR
    OR.W    D2,2(A1)
    OR.W    #$A000,2(A1)
    BSR     ASM_COMMA
    BSR     ASM_GETEA
    MOVE.W  #MMDEST,D2
    bTST    D0,D2
    bEQ     ERROR19
    OR.W    D3,(A1)
    RTS
.CREA:
    BSR     ASM_GETEA
    MOVE.W  #MMSRC,D2
    BTST    D0,D2
    BEQ     ERROR19
    OR.W    D3,(A1)
    BSR     ASM_COMMA
    BSR     .COMBINE_FPCR
    OR.W    d2,2(A1)
    OR.W    #$C000,2(A1)
    RTS
;*-*
;; Combine FPcr
.COMBINE_FPCR:
    CMP.W   #47,(A3)+
    BNE     ERROR80
    MOVEQ   #0,D2
.CFLOOP:
    MOVE.W  (A3)+,D0
    SUB.L   #$24,D0
    BMI     ERROR80
    CMp.W   #1,D0
    BMI     .x1
    BEQ     .x2
    BTST    #10,d2
    bne     ERROR50
    bset    #10,d2
    bra     .x3
.x2:
    btst    #12,d2
    bne     ERROR50
    bset    #12,d2
    bra     .x3
.x1:
    btst    #11,d2
    bne     ERROR50
    bset    #11,d2
.x3:
    cmp.l   #$000a002f,(a3)+
    beq     .CFLOOP
    subq.l  #4,a3
    rts
;*-*
;*-*
;; Fsincos              38
ASM_FSINCOS:
    CMP.W   #47,(A3)
    BNE     .EA
    CMP.W   #5,D1
    BNE     ERROR79
    BSR     ASM_GETFPREG
    LSL.W   #8,D2
    LSL.W   #2,D2
    OR.W    D2,2(A1)
    BRA     .REST
.EA:
    BSR     .ADJUSTSIZE
    BSR     ASM_GETEA
    MOVE.L  #NASRC,D2
    BTST    D0,D2
    BEQ     ERROR19
    TST.W   D0
    BNE     .SKP
    CMP.W   #5,D1
    BPL     ERROR79
.SKP:
    OR.W    D3,(A1)
.REST:
    BSR     ASM_COMMA
    BSR     ASM_GETFPREG
    MOVE.L  D2,D7
    CMP.W   #19,(A3)+
    BNE     ERROR81
    BSR     ASM_GETFPREG
    LSL.W   #7,D2
    OR.W    D2,2(A1)
    OR.W    D7,2(A1)
    RTS

.ADJUSTSIZE:
    MOVE.L  D1,D2
    LSL.W   #1,D2
    MOVE.W  .SIZES(PC,D2),D2
    OR.W    D2,2(A1)
    RTS
.SIZES:
    DC.W    0,$5800,$5000,$4000,$4400,$4800,$4c00,$5400,$0000
;*-*
;; Trapcc               39
ASM_TRAPCC:
    CMP.L   #$0F000001,(A3)
    BEQ     .PARAM
    ADD.W   #2,(A1)
    RTS
.PARAM:
    ADDQ.L  #4,A3
    MOVE.L  (A3)+,D2
    CMP.W   #2,D1
    BEQ     .WRD
    ADD.W   #1,(A1)
    MOVE.L  D2,(A4)+
    RTS
.WRD:
    CHKW    D2,D7,ERROR31
    MOVE.W  D2,(A4)+
    RTS
;*-*
;; Ftst                 40
ASM_FTST:
    CMP.W   #47,(A3)
    BNE     .EA
    CMP.W   #5,D1
    BNE     ERROR79
    BSR     ASM_GETFPREG
    lsl.w   #8,d2
    lsl.w   #2,d2
    or.w    d2,2(a1)
    rts
.EA:
    BSR     ASM_GETEA
    MOVE.L  #NASRC,D2
    BTST    D0,D2
    BEQ     ERROR19
    OR.W    d3,(a1)
    TST.W   D0
    BNE     .SKP
    CMP.W   #5,D1
    BPl     ERROR79
.SKP:
    BSR     .ADJUSTSIZE
    RTS

.ADJUSTSIZE:
    MOVE.L  D1,D2
    LSL.W   #1,D2
    MOVE.W  .SIZES(PC,D2),D2
    OR.W    D2,2(A1)
    RTS
.SIZES:
    DC.W    0,$5800,$5000,$4000,$4400,$4800,$4c00,$5400,$0000
;*-*
;; Standard MMU         41
ASM_PMMSTD:
    CMP.W   #47,(A3)
    BNE     .EA
    ADDQ.L  #2,A3
    MOVE.W  (a3)+,D2
    CMP.W   #2,D2
    BPL     ERROR82
    OR.W    D2,2(A1)
    BRA     .C
.EA:
    BSR     ASM_GETEA
    TST.W   D0
    BNE     .040
    OR.W    #8,D3
    OR.W    D3,2(A1)
.C:
    BSR     ASM_COMMA
    CMP.L   #$0f000001,(a3)+
    BNE     ERROR30
    MOVE.L  (A3)+,D2
    BMI     ERROR31
    CMP.L   #8,D2
    BPL     ERROR31
    LSL.W   #5,D2
    OR.W    D2,2(A1)
    MOVE.W  #0,(A0)
    CMP.W   #COM,(A3)
    BEQ     .C2
    RTS
.C2:
    BSR     ASM_COMMA
    BSR     ASM_GETEA
    MOVE.L  #%000111100100,D2
    BTST    D0,D2
    BEQ     ERROR19
    OR.W    d3,(a1)
    or.w    #$800,2(a1)
    rts
.040:
    TST.W   (A0)
    BEQ     ERROR19
    CMP.W   #2,ECPU
    BLT     ERROR53
    ADDQ.L  #2,A0
    CMP.W   #2,D0
    BNE     ERROR19
    MOVE.W  #$F508,(A1)
    AND.W   #7,D3
    OR.W    #8,D3
    OR.W    D3,(A1)
    LEA     2(A1),A4
    RTS

;*-*
;; MMU Load             42
ASM_PMMLDX:
    CMP.W   #47,(A3)
    BNE     .EA
    ADDQ.L  #2,A3
    MOVE.W  (a3)+,D2
    CMP.W   #2,D2
    BPL     ERROR82
    OR.W    D2,2(A1)
    BRA     .C
.EA:
    BSR     ASM_GETEA
    TST.W   D0
    BNE     ERROR19
    OR.W    #8,D3
    OR.W    D3,2(A1)
.C:
    BSR     ASM_COMMA
    BSR     ASM_GETEA
    MOVE.L  #%000111100100,D2
    BTST    D0,D2
    BEQ     ERROR19
    OR.W    d3,(a1)
    rts
;*-*
;; MMU Test             43
ASM_PMMTST:
    CMP.W   #47,(A3)
    BNE     .EA
    ADDQ.L  #2,A3
    MOVE.W  (a3)+,D2
    CMP.W   #2,D2
    BPL     ERROR82
    OR.W    D2,2(A1)
    BRA     .C
.EA:
    BSR     ASM_GETEA
    TST.W   D0
    BNE     .040
    OR.W    #8,D3
    OR.W    D3,2(A1)
.C:
    BSR     ASM_COMMA
    BSR     ASM_GETEA
    MOVE.L  #%000111100100,D2
    BTST    D0,D2
    BEQ     ERROR19
    OR.W    d3,(a1)
    BSR     ASM_COMMA
    CMP.L   #$0f000001,(a3)+
    BNE     ERROR30
    MOVE.L  (A3)+,D2
    BMI     ERROR31
    CMP.L   #8,D2
    BPL     ERROR31
    LSL.W   #8,D2
    LSL.W   #2,D2
    OR.W    D2,2(A1)
    MOVE.W  #0,(A0)
    CMP.W   #COM,(A3)
    BEQ     .C2
    RTS
.C2:
    BSR     ASM_COMMA
    BSR     ASM_GETEA
    CMP.W   #1,D0
    BNE     ERROR19
    OR.W    #$100,2(a1)
    AND.L   #$7,D3
    LSL.W   #5,D3
    OR.W    D3,2(a1)
    RTS
.040:
    CMP.W   #2,D0
    BNE     ERROR19
    MOVE.W  ASMCPU(PC),D2
    AND.W   #16,D2
    BEQ     ERROR53
    ADDQ.L  #2,A0
    MOVE.W  (A0)+,(A1)
    AND.L   #7,D3
    OR.W    D3,(A1)
    LEA     2(A1),A4
    RTS
;*-*
;; MMU Move             44
ASM_PMMMOVE:
    CMP.W   #47,(A3)
    BEQ     .II
    BSR     .EA
    BSR     ASM_COMMA
    BSR     .SEL
    RTS
.II:BSR     .SEL
    BSR     ASM_COMMA
    BSR     .EA
    RTS

.EA:
    BSR     ASM_GETEA
    MOVE.L  #%000111111100,D2
    BTST    D0,D2
    BEQ     ERROR19
    OR.W    D3,(A1)
    RTS

.SEL:
    CMP.W   #47,(a3)+
    BNE     ERROR82
    MOVE.W  (A3)+,D2
    CMP.W   #3,D1
    BEQ     .LO
    CMP.W   #8,D1
    BEQ     .QO
    CMP.W   #2,D1
    BEQ     .WO
    BRA     ERROR79
;; Long ones
.LO:CMP.W   #3,D2
    BNE     .L0
    MOVE.W  #$4200,D2
    BRA     .LZ
.L0:CMP.W   #$13,D2
    BNE     .L1
    MOVE.W  #$A00,D2
    BRA     .LZ
.L1:CMP.W   #$14,D2
    BNE     .L2
    MOVe.W  #$E00,D2
    BRA     .LZ
.L2:BRA     ERROR82

.LZ:OR.W    D2,2(A1)
    RTS
;*-*
;; Quad ones
.QO:CMP.W   #$10,D2
    BNE     .Q0
    MOVE.W  #$4A00,D2
    BRA     .QZ
.Q0:CMP.W   #$1b,D2
    BNE     .Q1
    MOVE.W  #$4600,D2
    BRA     .QZ
.Q1:CMP.W   #$12,D2
    BNE     .Q2
    MOVE.W  #$4e00,D2
    BRA     .QZ
.Q2:BRA     ERROR82

.QZ:OR.W    D2,2(A1)
    RTS
;*-*
;; Word ones
.WO:CMP.W   #$E,D2      ;MMUSR
    BNE     .W0
    MOVE.W  #$6200,D2
    BRA     .WZ
.W0:CMP.W   #$16,D2     ;BAC0
    BNE     .W1
    MOVE.W  #$7600,D2
    BRA     .WZ
.W1:CMP.W   #$30,D2     ;BAC1
    BNE     .W2
    MOVE.W  #$7604,D2
    BRA     .WZ
.W2:CMP.W   #$31,D2     ;BAC2
    BNE     .W3
    MOVE.W  #$7608,D2
    BRA     .WZ
.W3:CMP.W   #$32,D2     ;BAC3
    BNE     .W4
    MOVE.W  #$760c,D2
    BRA     .WZ
.W4:CMP.W   #$33,D2     ;BAC4
    BNE     .W5
    MOVE.W  #$7610,D2
    BRA     .WZ
.W5:CMP.W   #$34,D2     ;BAC5
    BNE     .W6
    MOVE.W  #$7614,D2
    BRA     .WZ
.W6:CMP.W   #$35,D2     ;BAC6
    BNE     .W7
    MOVE.W  #$7618,D2
    BRA     .WZ
.W7:CMP.W   #$36,D2     ;BAC7
    BNE     .W8
    MOVE.W  #$761C,D2
    BRA     .WZ
.W8:CMP.W   #$15,D2     ;BAD0
    BNE     .W9
    MOVE.W  #$7200,D2
    BRA     .WZ
.W9:CMP.W   #$29,D2     ;BAD1
    BNE     .WA
    MOVE.W  #$7204,D2
    BRA     .WZ
.WA:CMP.W   #$2a,D2     ;BAD2
    BNE     .WB
    MOVE.W  #$7208,D2
    BRA     .WZ
.WB:CMP.W   #$2b,D2     ;BAD3
    BNE     .WC
    MOVE.W  #$720c,D2
    BRA     .WZ
.WC:CMP.W   #$2c,D2     ;BAD4
    BNE     .WD
    MOVE.W  #$7210,D2
    BRA     .WZ
.WD:CMP.W   #$2d,D2     ;BAD5
    BNE     .WE
    MOVE.W  #$7214,D2
    BRA     .WZ
.WE:CMP.W   #$2e,D2     ;BAD6
    BNE     .WF
    MOVE.W  #$7218,D2
    BRA     .WZ
.WF:CMP.W   #$2f,D2     ;BAD7
    BNE     .WG
    MOVE.W  #$721C,D2
    BRA     .WZ
.WG:BRA     ERROR82
.WZ:OR.W    D2,2(A1)
    RTS
;*-*
;*-*
;; MMU EA               45
ASM_PMMEA:
    BSR     ASM_GETEA
    MOVE.W  (A0)+,D2
    BTST    D0,D2
    BEQ     ERROR19
    AND.L   #7,D3
    OR.W    D3,(A1)
    RTS
;*-*
;; Immediate 3 bit      46
ASM_IMM3B:
    CMp.L   #$0f000001,(a3)+
    BNE     ERROR30
    MOVE.L  (a3)+,D2
    BMI     ERROR31
    CMP.L   #8,D2
    BPL     ERROR31
    OR.W    D2,(A1)
    RTS
;*-*
;; Movec                47
ASM_MOVEC:
    CMP.W   #47,(A3)
    BNE     .EA_TO_CR
    BSR     .COMBINE_REG
    BSR     ASM_COMMA
    BSR     .COMBINE_EA
    RTS
.EA_TO_CR:
    BSR     .COMBINE_EA
    BSR     ASM_COMMA
    BSR     .COMBINE_REG
    ADD.W   #1,(A1)
    RTS
.COMBINE_REG:
    CMP.W   #47,(A3)+
    BNE     ERROR83
    MOVE.W  (A3)+,D2
    CMP.W   #$12,D2
    BPL     ERROR83
    LSL.W   #1,D2
    MOVE.W  .REGS(PC,D2),D2
    OR.W    D2,2(A1)
    RTS
.REGS:
    DC.W    $0000,$0001,$0002,$0003,$0004,$0005,$0006,$0007,$0008
    DC.W    $0800,$0801,$0802,$0803,$0804,$0805,$0806,$0807,$0808
.COMBINE_EA:
    BSR     ASM_GETEA
    MOVE.L  #3,D2
    BTST    D0,D2
    BEQ     ERROR19
    LSL.W   #8,D3
    LSL.W   #4,D3
    OR.W    D3,2(A1)
    RTS
;*-*
;; Moves                48
ASM_MOVES:
    MOVEQ   #0,D2
    CMP.W   #1,D1
    BEQ     .SX
    ADD.W   #$40,D2
    CMP.W   #2,D1
    BEQ     .SX
    ADD.W   #$40,D2
.SX:
    ADD.W   D2,(A1)
    BSR     ASM_GETEA
    MOVE.L  #%000011111111,D2
    BTST    D0,D2
    BEQ     ERROR19
    CMP.W   #2,D0
    BMI     .SPACE
    OR.W    D3,(A1)
    BSR     ASM_COMMA
    BSR     ASM_GETEA
    CMP.W   #2,D0
    BPL     ERROR19
    LSL.W   #8,D3
    LSL.W   #4,D3
    OR.W    D3,2(A1)
    RTS
.SPACE:
    LSL.W   #8,D3
    LSL.W   #4,D3
    OR.W    #$800,D3
    OR.W    D3,2(A1)
    BSR     ASM_COMMA
    BSR     ASM_GETEA
    MOVE.L  #%000011111100,D2
    BTST    D0,D2
    BEQ     ERROR19
    OR.W    D3,(A1)
    RTS
;*-*
;; BitField1            49
ASM_BITFIELD1:
    BSR     ASM_GETEA
    MOVE.L  #DEST,D2
    BTST    D0,D2
    BEQ     ERROR19
    OR.W    D3,(A1)
    BSR     ASM_COMMA
    CMP.W   #23,(A3)+
    BNE     ERROR19
    BSR     .GET
    MOVE.L  D2,D7
    CMP.W   #19,(A3)+
    BNE     ERROR81
    BSR     .GET
    LSL.W   #6,D7
    OR.W    D7,2(A1)
    OR.W    D2,2(A1)
    CMP.W   #24,(A3)+
    BNE     ERROR29
    RTS
.GET:
    CMP.W   #$0001,(A3)
    BNE     .EA
    ADDQ.L  #2,A3
    MOVE.L  (A3)+,D2
    BMI     ERROR31
    CMP.L   #32,D2
    BPL     ERROR31
    RTS
.EA:
    BSR     ASM_GETEA
    TST.W   D0
    BNE     ERROR19
    MOVE.L  D3,D2
    OR.W    #$20,D2
    RTS
;*-*
;; BitField2            50
ASM_BITFIELD2:
    BSR     ASM_GETEA
    MOVE.L  #DEST,D2
    BTST    D0,D2
    BEQ     ERROR19
    OR.W    D3,(A1)
    BSR     ASM_COMMA
    CMP.W   #23,(A3)+
    BNE     ERROR19
    BSR     .GET
    MOVE.L  D2,D7
    CMP.W   #19,(A3)+
    BNE     ERROR81
    BSR     .GET
    LSL.W   #6,D7
    OR.W    D7,2(A1)
    OR.W    D2,2(A1)
    CMP.W   #24,(A3)+
    BNE     ERROR29
    BSR     ASM_COMMA
    BSR     ASM_GETEA
    TST.W   D0
    BNE     ERROR19
    LSL.W   #8,D3
    LSL.W   #4,D3
    OR.W    D3,2(A1)
    RTS
.GET:
    CMP.W   #$0001,(A3)
    BNE     .EA
    ADDQ.L  #2,A3
    MOVE.L  (A3)+,D2
    BMI     ERROR31
    CMP.L   #32,D2
    BPL     ERROR31
    RTS
.EA:
    BSR     ASM_GETEA
    TST.W   D0
    BNE     ERROR19
    MOVE.L  D3,D2
    OR.W    #$20,D2
    RTS
;*-*
;; BitField3            51
ASM_BITFIELD3:
    BSR     ASM_GETEA
    TST.W   D0
    BNE     ERROR19
    LSL.W   #8,D3
    LSL.W   #4,D3
    OR.W    D3,2(A1)

    BSR     ASM_COMMA

    BSR     ASM_GETEA
    MOVE.L  #DEST,D2
    BTST    D0,D2
    BEQ     ERROR19
    OR.W    D3,(A1)
    BSR     ASM_COMMA
    CMP.W   #23,(A3)+
    BNE     ERROR19
    BSR     .GET
    MOVE.L  D2,D7
    CMP.W   #19,(A3)+
    BNE     ERROR81
    BSR     .GET
    LSL.W   #6,D7
    OR.W    D7,2(A1)
    OR.W    D2,2(A1)
    CMP.W   #24,(A3)+
    BNE     ERROR29
    RTS
.GET:
    CMP.W   #$0001,(A3)
    BNE     .EA
    ADDQ.L  #2,A3
    MOVE.L  (A3)+,D2
    BMI     ERROR31
    CMP.L   #32,D2
    BPL     ERROR31
    RTS
.EA:
    BSR     ASM_GETEA
    TST.W   D0
    BNE     ERROR19
    MOVE.L  D3,D2
    OR.W    #$20,D2
    RTS
;*-*
;; Mul/Div              52
ASM_MULDIV:
    CMP.W   #2,D1
    BEQ     .WRD
    MOVE.W  (A0)+,(A1)
    MOVE.W  (A0)+,(A4)+
    MOVE.W  ASMCPU(PC),D2
    AND.L   #$FE,D2
    BEQ     ERROR53
    BSR     ASM_GETEA
    MOVE.L  #NASRC,D2
    BTST    D0,D2
    BEQ     ERROR19
    OR.W    D3,(A1)
    BSR     ASM_COMMA
    BSR     ASM_GETEA
    TST.W   D0
    BNE     ERROR19
    MOVE.W  D3,D7
    CMP.W   #19,(A3)
    BNE     .X1
    ADDQ.L  #2,A3
    BSR     ASM_GETEA
    TST.W   D0
    BNE     ERROR19
.X1:LSL.W   #8,D3
    LSL.W   #4,D3
    OR.W    D3,2(A1)
    OR.W    D7,2(A1)
    RTS
.WRD:
    ADDQ.L  #4,A0
    BSR     ASM_GETEA
    MOVE.L  #NASRC,D2
    BTST    D0,D2
    BEQ     ERROR19
    OR.W    D3,(A1)
    BSR     ASM_COMMA
    BSR     ASM_GETEA
    TST.W   D0
    BNE     ERROR19
    LSL.W   #8,D3
    LSL.W   #1,D3
    OR.W    D3,(A1)
    RTS
;*-*
;; Link                 53
ASM_LINK:
    CMP.W   #3,D1
    BEQ     .LONG
    BSR     ASM_GETEA
    CMP.W   #1,D0
    BNE     ERROR19
    AND.L   #7,D3
    OR.W    D3,(A1)
    BSR     ASM_COMMA
    CMP.L   #$0F000001,(A3)+
    BNE     ERROR30
    MOVE.L  (A3)+,D0
    CHKW    D0,D2,ERROR31
    MOVE.W  D0,(A4)+
    RTS
.LONG:
    MOVE.W  ASMCPU,D2
    AND.L   #%111110,D2
    BEQ     ERROR53
    MOVE.W  #$4800,(A1)
    BSR     ASM_GETEA
    CMP.W   #1,D0
    BNE     ERROR19
    OR.W    D3,(A1)
    BSR     ASM_COMMA
    CMP.L   #$0F000001,(A3)+
    BNE     ERROR30
    MOVE.L  (A3)+,(A4)+
    RTS
;*-*
;; CpCache 040+         54
ASM_CPCACHE040:
    CMP.W   #47,(A3)+
    BNE     ERROR84
    MOVEQ   #0,D2
    MOVE.W  (A3)+,D2
    SUB.L   #$37,D2
    BMI     ERROR84
    CMP.W   #4,D2
    BPL     ERROR84
    LSL.W   #6,D2
    ADD.W    D2,(A1)
    TST.W   (A0)+
    BEQ     .XX
    BSR     ASM_COMMA
    BSR     ASM_GETEA
    CMP.W   #2,D0
    BNE     ERROR19
    AND.L   #7,D3
    OR.W    D3,(A1)
.XX:RTS
;*-*
;; Move16               55
ASM_MOVE16:
    BSR     ASM_GETEA
    CMP.W   #8,D0
    BEQ     .ABS
    CMP.W   #3,D0
    BEQ     .INC
    CMP.W   #2,D0
    BNE     ERROR19
    AND.L   #7,d3
    OR.W    D3,(A1)
    BSR     ASM_COMMA
    BSR     ASM_GETEA
    CMP.W   #8,D0
    BNE     ERROR19
    RTS
.ABS:
    SUB.W   #8,(A1)
    BSR     ASM_COMMA
    BSR     ASM_GETEA
    CMP.W   #3,D0
    BEQ     .SKIP
    ADD.W   #16,(A1)
.SKIP:
    AND.L   #7,D3
    OR.W    D3,(A1)
    RTS
.INC:
    SUB.W   #$10,(A1)
    AND.L   #7,D3
    OR.W    D3,(A1)
    BSR     ASM_COMMA
    BSR     ASM_GETEA
    CMP.W   #8,D0
    BNE     .REL2
    RTS
.REL2:
    cmp.w   #3,d0
    bne     ERROR19
    add.w   #$20,(A1)
    lsl.w   #8,d3
    lsl.w   #4,d3
    move.w  d3,(a4)+
    rts
;*-*
;; Pulse                56
ASM_PULSE:
    CMP.L   #$0F000001,(A3)+
    BNE     ERROR30
    MOVE.L  (A3)+,D2
    CHKW    D2,D0,ERROR31
    MOVE.W  D2,(A4)+
    RTS
;*-*
;; Move                 57
ASM_MOVE:
    CMP.W   #47,(A3)
    BEQ     .KW1
    BSR     ASM_GETEA
    MOVE.L  #%111111111111,d2
    btst    d0,d2
    beq ERROR19     ;should never happen.
    cmp.w   #1,d0
    bne .1
    cmp.w   #1,d1
    beq ERROR31
.1:
    or.w    d3,(a1)

    bsr ASM_COMMA

    cmp.w   #47,(a3)
    beq     .KW2
    bsr ASM_GETEA
    move.l  #%000111111111,d2
    btst    d0,d2
    beq ERROR19
    cmp.w   #1,d0
    bne     .2

    cmp.w   #1,d1
    beq ERROR31
    and.l   #7,d3
    lsl.w   #8,d3
    lsl.w   #1,d3
    or.w    d3,(a1)
    or.w    #64,(a1)
    rts
.2:
    move.w  d3,d0
    lsr.w   #3,d3
    and.w   #%111,d0
    lsl.w   #3,d0
    add.w   d3,d0
    lsl.w   #6,d0
    or.w    d0,(a1)
    rts

.KW1:
    cmp.w   #2,d1
    bne ERROR31
    addq.l  #2,a3
    move.w  (a3)+,d0

    cmp.w   #$27,d0
    bne .KW1_2
    move.w  #$42c0,(A1)
    bra .KW1_EXIT
.KW1_2:
    cmp.w   #$28,d0
    bne ERROR19
    move.w  #$40c0,(a1)
.KW1_EXIT:
    bsr ASM_COMMA
    BSR ASM_GETEA
    move.l  #%000111111101,d2
    btst    d0,d2
    beq ERROR19
    or.w    d3,(A1)
    rts
.KW2:

    cmp.w   #1,d0
    beq     ERROR19     ; move A0,xxx
    addq.l  #2,a3
    move.w  (a3)+,d0
    cmp.w   #$27,d0
    bne     .KW2_2
    move.w  (a1),d0
    and.w   #%111111,d0
    move.w  #$44c0,(a1)
    or.w    d0,(a1)
    rts
.KW2_2:
    cmp.w   #$28,d0
    bne ERROR19
    move.w  (a1),d0
    and.w   #%111111,d0
    move.w  #$46c0,(a1)
    or.w    d0,(a1)
    rts
;*-*
;; Andi                 58
ASM_ANDI:
    BSR ASM_GETEA
    CMP.W   #11,d0
    bne ERROR30

    bsr ASM_COMMA

    cmp.w   #47,(a3)
    beq .KW
    bsr ASM_GETEA
    move.l  #%000111111101,d2
    btst    d0,d2
    beq ERROR19
    or.w    d3,(a1)
    rts
.KW:
    cmp.w   #1,d1
    bne ERROR31
    addq.l  #2,a3
    cmp.w   #$27,(a3)+
    bne ERROR19
    move.w  #$23c,(a1)
    rts
;*-*
;; Eori                 59
ASM_EORI:
    BSR ASM_GETEA
    CMP.W   #11,d0
    bne ERROR30

    bsr ASM_COMMA

    cmp.w   #47,(a3)
    beq .KW
    bsr ASM_GETEA
    move.l  #%000111111101,d2
    btst    d0,d2
    beq ERROR19
    or.w    d3,(a1)
    rts
.KW:
    cmp.w   #1,d1
    bne ERROR31
    addq.l  #2,a3
    cmp.w   #$27,(a3)+
    bne ERROR19
    move.w  #$A3c,(a1)
    rts
;*-*
;; Ori                  60
ASM_ORI:
    BSR ASM_GETEA
    CMP.W   #11,d0
    bne ERROR30

    bsr ASM_COMMA

    cmp.w   #47,(a3)
    beq .KW
    bsr ASM_GETEA
    move.l  #%000111111101,d2
    btst    d0,d2
    beq ERROR19
    or.w    d3,(a1)
    rts
.KW:
    cmp.w   #1,d1
    bne ERROR31
    addq.l  #2,a3
    cmp.w   #$27,(a3)+
    bne ERROR19
    move.w  #$3c,(a1)
    rts
;*-*

;; FPU reg
ASM_GETFPREG:
    CMP.W   #47,(A3)+
    BNE     ERROR80
    MOVE.W  (A3)+,D2
    SUB.W   #$1c,D2
    BMI     ERROR80
    CMP.W   #$8,D2
    BPL     ERROR80
    RTS
;*-*
;; Data reg
ASM_GETDATAREG:           ; D0=SHIFT
    BSR ASM_REGID
    CMP.B   #4,(A3)+
    BNE ERROR19
    MOVE.B  (A3)+,D2
    AND.W   #%111,D2
    LSL.W   D0,D2
    ADD.W   D2,(A1)
    BSR SKIP244
    RTS
;*-*
;; Any EA
ASM_ANYEA:            ; D7=SHIFT, res=d3.ea after shift
    BSR.W   ASM_GETEA
    LSL.W   D7,D3
    ADD.W   D3,(A1)
    RTS
;*-*
;; Get EA
ASM_GETEA:
    MOVE.W  (A3)+,D0
    CMP.W   #$400,D0        ; COMPLEX OR BASIC ADR.MODE
    BMI .2
;; Dx/Ax/(Ax)/(PC)/(A0)+/-(A0)
    SUB.W   #$400,D0        ; LOWBYTE IS ADR.MASK, HI IS #ADR.MODE
    MOVEQ   #0,D3
    MOVE.B  D0,D3           ; D3.L = ADR.MODE MASK
    LSR.W   #8,D0           ; D0.W = # ADR.MODE
    CMP.W   #11,D0
    BEQ.S   .1
    CMP.W   #5,D0
    BPL ERROR19
    CMP.W   #1,D0
    BEQ.S   .AX
.X: RTS                     ; DELIVERS MASK IN D3 AND # IN D0
.AX:    CMP.W   #1,D1
    BEQ ERROR19
    RTS
;*-*
;; Immediate
.1: MOVEM.L D1/A0,-(A7)
    CMP.W   #LIBC,(A3)
    BNE .1_1
    ADDQ.L  #4,A3
    MOVE.W  (A3)+,D1
    EXT.L   D1
    ADDQ.L  #8,A3
    MOVEQ   #0,D0
    BRa .1_2
.1_1:
    BSR ASM_GRABVALUE
.1_2:
    MOVE.L  D1,D4
    MOVEM.L (A7)+,D1/A0
    CMP.W   #-1,D0          ; IMMEDIATE VALUE?
    BEQ ERROR19
    MOVE.W  #%111100,D3
    MOVEQ   #11,D0
    CMP.W   #3,D1
    BNE.S   .4
    MOVE.L  D4,(A4)+        ; .L #
    RTS
.4: CMP.W   #2,D1
    BNE.S   .5
    CHKW    D4,D5,iERROR93
    MOVE.W  D4,(A4)+        ; .W #
    RTS
.5: CHKB    D4,D5,iERROR94
    MOVE.B  #0,(A4)+        ; .B #
    MOVE.B  D4,(A4)+
    RTS
;*-*
.2:
    CMP.W   #29,(A3)
    BEQ _020
    CMP.W   #17,D0
    BEQ _BRACKET
;; Other
    SUBQ.L  #2,A3           ; ANY OTHER MODE
    MOVEM.L D1/A0,-(A7)
    BSR ASM_GRABVALUE
    MOVE.L  D1,D4           ; D4=VALUE
    CMP.W   #-1,D0
    BEQ ASM_GETLABEL
    MOVEM.L (A7)+,D1/A0
GL_BACK:
    MOVE.B  (A3),D2         ; SEE WHAT'S NEXT
    CMP.B   #4,D2
    BMI     .6              ; ABS OR INDEXED MODE
    CMP.W   #$D,d2
    beq     .xxPC
    CMP.B   #6,D2           ;
    BNE ERROR19
    MOVE.W  (A3)+,D3
    AND.W   #%111,D3
    OR.W    #%101000,D3
    MOVEQ   #5,D0
    MOVE.W  D4,(A4)+
    CHKW    D4,D5,iERROR93
    RTS
;; $00(PC)
.xxPC:
    addq.l  #2,a3
    moveq   #0,d3
    move.w  #%111010,d3
    moveq   #9,d0
    move.w  d4,(a4)+
    CHKW    D4,D5,ERROR31
    RTS
;*-*
;; $00(PC,Rn)
.xxPCxx:
    addq.l  #2,a3
    BSR ASM_COMMA
    cmp.b   #4,(a3)
    blt     ERROR17
    cmp.b   #5,(a3)
    bgt     ERROR17
    seq d0
    move.w  (a3)+,d3
    and.w   #7,d3
    and.b   #8,d0
    or.b    d0,d3
    lsl.w   #4,d3
    move.b  d3,(a4)+
    move.b  d4,(a4)+
    MOVE.L  D4,D5           ; D5=EXTENSIONWORD
    CHKB    D5,D4,ERROR31

    moveq   #0,d3
    move.w  #%111011,d3
    moveq   #10,d0
    CHKW    D4,D5,ERROR31
    cmp.w   #18,(a3)+
    bne ERROR74
    RTS
;*-*
.6: MOVE.W  (A3),D2
    CMP.W   #17,D2
    BEQ.S   .9
    CMP.W   #26,D2
    BEQ.S   .7
    CMP.W   #27,D2
    BNE.S   .8
    ADDQ.L  #2,A3
.8: MOVE.W  #%111001,D3     ; ABS 4
    MOVEQ   #8,D0
    MOVE.L  D4,(A4)+
    RTS
.7: ADDQ.L  #2,A3           ; ABS 4.W
    MOVE.W  #%111000,D3
    MOVEQ   #7,D0
    MOVE.W  D4,(A4)+
    CHKW    D4,D5,ERROR93
    RTS

.9: ADDQ.L  #2,A3           ; off(Ax,Rx.s), D4=off
    CMP.B   #$E,(A3)
    BEQ .xxPCxx
    CMP.B   #5,(A3)+
    BNE ERROR19
    MOVE.B  (A3)+,D3        ; D3.B = Ax
    AND.L   #%111,D3        ; (Ax,...
    OR.W    #%110000,D3
    MOVEQ   #6,D0
    MOVE.L  D4,D5           ; D5=EXTENSIONWORD
    CHKB    D5,D4,ERROR94
    AND.W   #$FF,D5
    CMP.W   #COM,(A3)+
    BNE ERROR5
    BSR ASM_REGID
    MOVE.B  (A3)+,D2
    CMP.B   #4,D2           ; ...,Dx
    BEQ.S   .12
    CMP.B   #5,D2
    BNE ERROR19
    BSET    #15,D5          ; ...,Ax
.12:
    MOVE.B  (A3)+,D2
    BSR SKIP244
    AND.W   #%111,D2
    MOVEQ   #12,D4
    LSL.W   D4,D2
    OR.W    D2,D5

    MOVE.W  (A3)+,D2
    CMP.W   #26,D2
    BEQ .12_2
    CMP.W   #27,D2
    BNE .13
    BSET    #11,D5
.12_2:
    MOVE.W  (A3)+,D2
.13:
    CMp.W   #9,D2
    BNE .14
    CMP.W   #VALUE,(A3)+
    BNE ERROR73
    MOVE.L  (A3)+,D2
    MOVEQ   #0,D0

    CMP.W   #1,D2
    BEQ .16
    ADDQ.L  #1,D0
    CMP.W   #2,D2
    BEQ .16
    ADDQ.L  #1,D0
    CMP.W   #4,D2
    BEQ .16
    ADDQ.L  #1,D0
    CMP.W   #8,D2
    BNE iERROR91
.16:
    LSL.W   #8,D0
    LSL.W   #1,D0
    OR.W    D0,D5
    MOVE.W  (A3)+,D2
.14:
    CMP.W   #18,D2
    BNE ERROR74
    MOVE.W  D5,(A4)+
    RTS
;*-*
;; 020 full
_020:
    CMP.W   #1,ECPU
    BMI ERROR53
    MOVE.L  A0,-(A7)
    MOVE.L  A4,A0
    ADDQ.L  #2,A0

    MOVE.W  #$30,d3         ; adressing mode for suppressed reg
    MOVE.W  #6,d0
    MOVEQ   #0,D6
    MOVE.l  #%0000000111010000,D2   ; here we set a MOVE.L  (),...
    ADDQ.L  #6,A3           ; skip "[xx"

    CMP.W   #30,(A3)
    BNE     .020_0
    ADDQ.L  #2,A3
    BSR     ASM_COMMA
    BSET    #1,D6
    BRA     .020_2

.020_0:
    CMP.W   #IDENT,(A3)
    BEQ     .020_ID
    MOVEM.L D0/D2-D4/D6-A2/A4-a6,-(A7)
    BSR ASM_GRABVALUE
    MOVE.L  D0,D5
    MOVEM.L (A7)+,D0/D2-D4/D6-A2/A4-A6
    TST.L   D5
    BMI .020_1
    CMP.W   #26,(A3)
    BMI     .020_0_2
    CMP.W   #28,(A3)
    BPL     .020_0_2
    CMP.W   #27,(A3)+
    BEQ     .020_0_2
    MOVE.W  D1,(A0)+
    or.w    #32,d2
    BCLR    #4,D2
    BRA     .020_0_1
.020_0_2:
    MOVE.L  D1,(A0)+
    OR.W    #48,D2          ; MOVE.L    ([$xxxxxxxx.L
.020_0_1:
    CMP.W   #COM,(A3)+
    BEQ .020_1
    CMP.W   #30,-2(A3)
    bne ERROR0
    cmp.w   #18,(a3)
    beq     .020_EXIT
    BSR ASM_COMMA           ; MOVE.L    ([$xxxxxxxx.L],
    BSET    #0,D6
    BRA     .020_1
.020_ID:
    ADDQ.L  #2,A3
    MOVE.L  (A3)+,D1
    CMP.W   #$E00,2(a3)
    beq     .020_ID_PCREL
    cmp.w   #$E00,4(a3)
    beq     .020_ID_PCREL
    MOVEM.L D0-D7/A1/A2/A4-A6,-(A7)
    MOVE.L  D1,A1
    CMP.B   #LAB,4(A1)
    BNE     ERROR4
    MOVE.L  A0,A4
    MOVE.W  10(A1),D0
    BSR ADDBRANCHRELOC
    MOVE.L  A4,A0
    MOVEM.L (A7)+,D0-D7/A1/A2/A4-a6
    OR.W    #48,D2
    BRA .020_0_1
.020_ID_PCREL:
    CMP.W   #26,(A3)
    BMI .020_ID_NOADJ
    CMP.W   #28,(A3)
    BPL .020_ID_NOADJ
    CMP.W   #27,(A3)+
    BPL .020_ID_NOADJ
    BCLR    #4,D2
    OR.W    #32,D2
    CLR.W   NEWOP
    MOVEm.L  D0-D7/A1/a2/A4-a6,-(A7)
    move.l  a0,a4
    MOVE.L  D1,A1
    MOve.w  10(a1),d0
    BSR ADDBRANCHPCREL16E
    move.l  a4,a0
    movem.l  (a7)+,d0-d7/a1/a2/a4-a6
    BRA .020_0_1
.020_ID_NOADJ:
    MOVEm.L  D0-D7/A1/a2/A4-a6,-(A7)
    move.l  a0,a4
    MOVE.L  D1,A1
    MOve.w  10(a1),d0
    BSR ADDBRANCHPCREL32E
    move.l  a4,a0
    movem.l  (a7)+,d0-d7/a1/a2/a4-a6
    OR.W    #48,D2
    BRA .020_0_1

.020_1:
    CMP.w   #$E00,(A3)
    beq     .020_1_1
    CMP.B   #5,(A3)
    BNE     .020_2
    CMP.W   #9,2(A3)
    BEQ     .020_2
    CMP.W   #26,2(A3)
    BEQ     .020_2
    CMP.W   #27,2(a3)
    beq     .020_2
    BTST    #0,D6
    bne     .020_2          ; MOVE.L    ([$xxxxxxxx.L]
    MOVE.W  (A3)+,D1        ; MOVE.L    ([$xxxxxxxx.L,Ax
    BCLR    #7,D2
    and.l   #7,d1
    add.w   d1,d3
    bra     .020_1_2
.020_1_1:
    addq.l  #2,a3
    addq.l  #8,d3
    addq.l  #3,d3
    moveq   #10,d0
    bclr    #7,d2
.020_1_2:
    cmp.w   #COM,(A3)+
    beq     .020_2
    cmp.w   #30,-2(a3)
    bne     ERROR0
    cmp.w   #18,(a3)
    beq     .020_EXIT
    bset    #1,d6
    bsr ASM_COMMA
.020_2:
    CMP.B   #4,(A3)
    BMI .020_3
    CMP.B   #6,(A3)
    BPL .020_3

    BTST    #1,D6
    BEQ .020_2_1
    BSET    #2,D2
.020_2_1:
    bclr    #6,d2           ; MOVE.L    ([$xxxxxxxx.L, Ax, Rn
    MOVE.W  (A3)+,D1        ; or
    btst    #8,d1           ; MOVE.L    ([$xxxxxxxx.L, Ax], Rn
    beq .020_2_2
    bset    #15,d2
.020_2_2:
    and.l   #7,d1
    rol.w   #8,d1
    rol.w   #4,d1
    or.w    d1,d2
    cmp.w   #26,(A3)
    bmi     .020_2_3
    cmp.w   #28,(a3)
    bpl     .020_2_3
    cmp.w   #27,(a3)+
    bne     .020_2_3
    bset    #11,d2
.020_2_3:
    cmp.w   #9,(a3)
    bne     .020_2_5
    addq.l  #2,a3
    cmp.w   #VALUE,(a3)+
    bne     ERROR73
    move.l  (A3)+,d1
    moveq   #0,d0
    cmp.l   #1,d1
    beq     .020_2_4
    addq.l  #1,d0
    cmp.l   #2,d1
    beq     .020_2_4
    addq.l  #1,d0
    cmp.l   #4,d1
    beq     .020_2_4
    addq.l  #1,d0
    cmp.l   #8,d1
    bne     iERROR91
.020_2_4:
    rol.w   #8,d0           ; MOVE.L    ([$xxxxxxxx.L, Ax, Rn.s*y], $yyyyyyyy)
    rol.w   #1,d0
    or.w    d0,d2
.020_2_5:
    btst    #1,d6
    bne     .020_2_7
    cmp.w   #30,(a3)+
    bne     ERROR34
.020_2_7:
    cmp.w   #18,(a3)
    beq .020_EXIT
    BSR ASM_COMMA

.020_3:
    MOVEM.L D0/D2-D4/D6-A2/A4-a6,-(A7)
    BSR ASM_GRABVALUE
    MOVE.L  D0,D5
    MOVEM.L (A7)+,D0/D2-D4/D6-A2/A4-A6
    TST.L   D5
    BMI .020_EXIT

    CMP.W   #26,(A3)
    BMI     .020_3_1
    CMP.W   #28,(A3)
    BPL     .020_3_1
    cmp.w   #26,(A3)+
    BNE     .020_3_1
    move.w  d1,(a0)+
    or.w    #2,d2
    bra     .020_3_2
.020_3_1:
    move.l  d1,(a0)+
    or.w    #3,d2
.020_3_2:
.020_EXIT
    CMP.W   #18,(A3)+
    BNE ERROR0
    MOVE.W  D2,(A4)
    MOVE.L  A0,A4
    MOVE.L  (A7)+,A0
    RTS   
;*-*
;; bracketed
;; value
_BRACKET:
    MOVEQ   #0,D4
    MOVE.W  (A3),D2
    CMP.W   #IDENT,D2
    BEQ .BR_IDENT
    CMP.W   #LIBC,D2
;    BEQ .BR_LIBC
    CMP.W   #VALUE,D2       ; ($xx,Ax/PC,Rn.S*F)
    BNE .BR_0
    ADDQ.L  #2,A3
    MOVE.L  (A3)+,D4
    swap    d4
    tst.w   d4
    bne iERROR93
    swap    d4

    BSR ASM_COMMA
.BR_0:
    CMP.B   #$E,(A3)
    BEQ .BR_1
    CMP.B   #$5,(A3)
    BNE ERROR92
    MOVE.W  (A3)+,D2
    AND.L   #7,D2
    moveq   #$28,d3
    or.w    d2,d3
    moveq   #5,d0
    BRA .BR_2
.BR_1:
    move.w  (a3)+,d2
    moveq   #$3a,d3
    moveq   #9,d0
.BR_2:
    CMP.W   #COM,(A3)
    BNE .BR_EXIT
    BSR ASM_COMMA
    CMP.B   #5,(a3)
    seq D5
    moveq   #8,d2
    and.l   d2,d5
    move.w  (a3)+,d2
    and.l   #7,d2
    or.w    d5,d2
    ror.w   #4,d2
    ror.l   #8,d4
    tst.b   D4
    bne iERROR94
    rol.l   #8,d4
    or.w    d2,d4
    cmp.w   #$3B,D3
    BEQ .BR_3
    ADDQ.L  #7,d3
.BR_3:
    ADDQ.L  #1,D3
    addq.l  #1,d0
    CMP.W   #18,D2
    BEQ .BR_EXIT
    move.w  (a3),d2
    cmp.w   #27,D2
    bgt .BR_4
    cmp.w   #26,d2
    blt .BR_4
    move.w  (a3)+,d2
    cmp.w   #26,d2
    beq .BR_4
    bset    #11,d4
.BR_4:
    cmp.w   #18,(A3)
    beq .BR_EXIT
    move.w  (a3)+,d2
    cmp.w   #9,d2
    bne iERROR0
    cmp.w   #VALUE,(a3)+
    bne iERROR73
    move.l  (a3)+,d2
    moveq   #0,d5

    CMP.W   #1,D2
    BEQ .BR_5
    ADDQ.L  #1,D5
    CMP.W   #2,D2
    BEQ .BR_5
    ADDQ.L  #1,D5
    CMP.W   #4,D2
    BEQ .BR_5
    ADDQ.L  #1,D5
    CMP.W   #8,D2
    BNE iERROR91
.BR_5:
    LSL.W   #8,D5
    LSL.W   #1,D5
    OR.W    D5,D4

.BR_EXIT:
    cmp.w   #18,(a3)+
    bne iERROR74
    move.w  d4,(a4)+
    rts
;*-*
;; ident
.BR_IDENT:
    addq.l  #2,a3
    MOVE.L  (A3)+,A5
    tst.b   4(a5)
    beq iERROR22
    cmp.b   #3,4(a5)
    beq .BRI_LABEL
    moveq   #$28+5,d3
    moveq   #5,d0
    moveq   #0,d4
    move.w  10(a5),d4
    cmp.b   #2,4(a5)
    bne .BRI_1
    subq.w  #1,d3
.BRI_1:
    cmp.w   #COM,(a3)
    bne .BR_EXIT
    ADDQ.L  #1,D0
    addq.l  #8,d3
    ror.w   #8,d4
    tst.b   d4
    beq .BRI_0
    cmp.b   #$ff,d4
    bne iERROR94
.BRI_0:
    clr.b   d4
    rol.w   #8,d4
    bsr ASM_COMMA
    cmp.b   #5,(a3)
    seq D2
    bgt iERROR95
    cmp.b   #4,(a3)
    blt iERROR95
    and.l   #8,d2
    ror.w   #4,d2
    or.w    d2,d4
    move.w  (a3)+,d2
    and.l   #7,d2
    ror.w   #4,d2
    or.w    d2,d4
    cmp.w   #18,(a3)
    beq .BR_EXIT
    cmp.w   #9,(a3)
    beq .BRI_2
    cmp.w   #26,(a3)
    blt iERROR0
    cmp.w   #27,(a3)
    bgt iERROR0
    seq D2
    rol.l   #8,d2
    and.l   #$800,d2
    or.w    d2,d4
    addq.l  #2,a3
.BRI_2:
    cmp.w   #18,(a3)
    beq .BR_EXIT
    cmp.w   #9,(a3)+
    bne iERROR9
    cmp.w   #VALUE,(a3)+
    bne iERROR73
    move.l  (a3)+,d2
    moveq   #0,d5
    cmp.w   #1,d2
    beq .BRI_3
    addq.l  #1,d5
    cmp.w   #2,d2
    beq .BRI_3
    addq.l  #1,d5
    cmp.w   #4,d2
    beq .BRI_3
    addq.l  #1,d5
    cmp.w   #8,d2
    bne iERROR91
.BRI_3:
    lsl.l   #8,d5
    lsl.l   #1,d5
    or.w    d5,d4
    bra .BR_EXIT
;*-*
;; label
.BRI_LABEL:
    BSR ASM_COMMA
    CMP.W   #$E00,(A3)+
    BNE iERROR92

    moveq   #$3a,d3
    moveq   #9,d0
    moveq   #0,d4

    cmp.w   #COM,(a3)
    bne .BRL_EXIT
    ADDQ.L  #1,D0
    addq.l  #1,d3
    bsr ASM_COMMA
    cmp.b   #5,(a3)
    seq D2
    bgt iERROR95
    cmp.b   #4,(a3)
    blt iERROR95
    and.l   #8,d2
    ror.w   #4,d2
    or.w    d2,d4
    move.w  (a3)+,d2
    and.l   #7,d2
    ror.w   #4,d2
    or.w    d2,d4
    cmp.w   #18,(a3)
    beq .BRL_EXIT
    cmp.w   #9,(a3)
    beq .BRL_2
    cmp.w   #26,(a3)
    blt iERROR0
    cmp.w   #27,(a3)
    bgt iERROR0
    seq D2
    rol.l   #8,d2
    and.l   #$800,d2
    or.w    d2,d4
    addq.l  #2,a3
.BRL_2:
    cmp.w   #18,(a3)
    beq .BRL_EXIT
    cmp.w   #9,(a3)+
    bne iERROR9
    cmp.w   #VALUE,(a3)+
    bne iERROR73
    move.l  (a3)+,d2
    moveq   #0,d5
    cmp.w   #1,d2
    beq .BRL_3
    addq.l  #1,d5
    cmp.w   #2,d2
    beq .BRL_3
    addq.l  #1,d5
    cmp.w   #4,d2
    beq .BRL_3
    addq.l  #1,d5
    cmp.w   #8,d2
    bne iERROR91
.BRL_3:
    lsl.l   #8,d5
    lsl.l   #1,d5
    or.w    d5,d4
.BRL_EXIT:
    cmp.w   #18,(a3)+
    bne iERROR74
    move.w  d4,(a4)+
    cmp.w   #10,d0
    beq .BRL_EXIT2
.BRL_FINE:
    movem.l  d0/A0,-(a7)
    move.w  10(a5),d0
    clr.w   NEWOP
    bsr ADDBRANCH
    movem.l  (a7)+,d0/a0
    rts
.BRL_EXIT2:
    move.b  #1,-1(a4)
    bra .BRL_FINE

;*-*
;*-*
;*-*
;; GetLabel
ASM_GETLABEL:         ; E INTERFACE TO ASM_GETEA ADR.MODE
    MOVEM.L (A7)+,D1/A0
    MOVE.W  (A3)+,D0
    CMP.W   #IDENT,D0
    BNE .4
    MOVE.L  (A3)+,A5        ; A5=VAR
    MOVE.B  4(A5),D2
    BEQ ERROR22
    CMP.B   #LAB,D2
    BEQ .3
    BTST    #3,5(A5)        ; SEE IF REGVAR
    BNE.W   .REG
    CMP.B   #GLOBV,D2
    BNE.S   .1
    MOVEQ   #%101100,D3
    BRA.S   .2
.1: MOVEQ   #%101101,D3
.2: MOVE.W  10(A5),D0
    MOVE.W  (A3),D2
    CMP.W   #29,D2
    BPL.S   .5
    CMP.W   #26,D2
    BMI.S   .5
    ADDQ.L  #2,A3
    CMP.W   #27,D2
    BEQ.S   .5
    CMP.W   #26,D2
    BNE.S   .6
    ADDQ.W  #2,D0
    OPINT
    BRA.S   .5
.6: ADDQ.W  #3,D0
    OPCHAR
.5: CMP.B   #GLOBV,4(A5)
    BNE.S   .8
    GENGI   A5,D2
.8: OPLONG
    MOVE.W  D0,(A4)+
    MOVEQ   #5,D0
    RTS

.REG:   MOVEQ   #0,D0
    MOVE.W  10(A5),D3
    RTS

.3: BTST    #4,5(A5)        ; CHECK IF METHOD
    BNE ERROR4
    CMP.W   #$D00,(A3)+
    BNE .9
    MOVE.W  10(A5),D0       ; LAB(PC)
    CLR.W   (A4)+
    MOVEM.L D1/A0,-(A7)
    CLR.W   NEWOP
    BSR ADDBRANCH
    MOVEM.L (A7)+,D1/A0
    MOVEQ   #9,D0
    MOVEQ   #%111010,D3
    RTS

.9: SUBQ.L  #2,A3           ; lab(PC,Rx.s)
    CMP.W   #17,(A3)+
    BNE ERROR19
    CMP.W   #$E00,(A3)+
    BNE ERROR19
    MOVEQ   #%111011,D3     ; (PC,...
    MOVEQ   #10,D0
    MOVEQ   #0,D4
    MOVE.L  D4,D5           ; D5=EXTENSIONWORD
    MOVEM.L D0-D1/A0,-(A7)
    MOVE.W  10(A5),D0
    MOVE.W  #1,(A4)+
    CLR.W   NEWOP
    BSR ADDBRANCH
    MOVEM.L (A7)+,D0-D1/A0
    MOVE.W  -(A4),D5
    CMP.W   #COM,(A3)+
    BNE ERROR5
    BSR ASM_REGID
    MOVE.B  (A3)+,D2
    CMP.B   #4,D2           ; ...,Dx
    BEQ.S   .12
    CMP.B   #5,D2
    BNE ERROR19
    BSET    #15,D5          ; ...,Ax
.12:    MOVE.B  (A3)+,D2
    BSR SKIP244
    AND.W   #%111,D2
    MOVEQ   #12,D4
    LSL.W   D4,D2
    ADD.W   D2,D5
.13:    MOVE.W  (A3)+,D2
    CMP.W   #26,D2
    BEQ.S   .13
    CMP.W   #18,D2
    BEQ .14
    CMP.W   #27,D2
    BNE ERROR0
    BSET    #11,D5
    BRA.S   .13
.14:    MOVE.W  D5,(A4)+
    RTS
.4: CMP.W   #LIBC,D0        ; LIBCALL(Ax)
    BNE ERROR19
    ADDQ.L  #2,A3
    MOVEQ   #0,D4
    MOVE.W  (A3)+,D4
    ADDQ.L  #8,A3
    EXT.L   D4
    BRA GL_BACK
    CMP.B   #6,(A3)+
    BNE ERROR19
    MOVE.B  (A3)+,D3
    AND.W   #%111,D3
    ADD.W   #%101000,D3
    MOVEQ   #5,D0
    RTS
;*-*
;; GrabValue

; EATS INTERIM CODE FOR TRUE VALUES + CALC
; -->D0=TRUE/FALSE WAS VALUE
; -->D1=RESULT
; TRASHES: D0-D4,A0

ASM_GRABVALUE:
    MOVEQ   #0,D1
    MOVEQ   #-1,D0          ; IF D0=-1 THEN NOVALUE ELSE CODENR 
.XL:MOVEQ   #0,D2           ; D2<>0 --> NEGATE
    MOVE.W  (A3)+,D3
    CMP.W   #8,D3           ; '-' SIGN ?
    BNE.S   .1
    MOVEQ   #-1,D2
    MOVE.W  (A3)+,D3
    CMP.W   #VALUE,D3
    BNE.S   .X2
    BRA.S   .2
.1: CMP.W   #VALUE,D3       ; VALUE ?
    BNE.S   .X          ; sizeof or exit
.2: CMP.W   #-1,D0          ; SIZEOFBACK
    BNE.S   .3
    MOVEQ   #6,D0           ; ATLEAST ONE VALUE
.3: TST.L   D2
    BEQ.S   .4
    NEG.L   (A3)
.4: SUBQ.W  #6,D0
    LSL.W   #2,D0
    MOVE.L  .T(PC,D0.W),A0
    JMP (A0)
.XB:MOVE.W  (A3)+,D0
    CMP.W   #11,D0
    BPL.S   .X3
    CMP.W   #7,D0
    BMI.S   .X3         ; SEE IF AND/OR, ELSE QUIT
.AOB:   BRA.S   .XL
.X2:    SUBQ.L  #4,A3
    CMP.W   #-1,D0
    BEQ.S   .5
    SUBQ.L  #2,A3
    RTS
.X: CMp.W   #LIBC,D3
    BEQ .LIB
    CMP.W   #IOFF+50,D3     ; check for sizeof
    BNE.S   .XNS
    CMP.W   #31,(A3)+       ; OBJECT
    BNE ERROR40
    MOVE.L  (A3)+,A0        ; WE USE A0=OBJ
    MOVE.W  4(A0),-(A3)
    BEQ ERROR40         ; NO SIZEOF IN CONST DECL. (SOB..)
    CLR.W   -(A3)
    BRA.S   .2
.LIB:
    ADDQ.L  #2,A3
    MOVE.L  D3,-(A7)
    MOVE.W  (A3)+,D3
    ADDQ.L  #4,A3
    EXT.L   d3
    MOVE.L  D3,(A3)
    MOVE.L  (A7)+,D3
    BRA.S   .2

.XNS:
    SUBQ.L  #2,A3           ; ASSUMES NEXT WORD ALREADY READ
    CMP.W   #-1,D0
    BEQ.S   .5
    SUBQ.L  #2,A3
.5: RTS
.X3:    CMP.W   #IOFF+29,D0     ; CHECK FOR AND/OR
    BEQ.S   .AO
    CMP.W   #IOFF+30,D0
    BEQ.S   .AO
    SUBQ.L  #2,A3
    RTS
.AO:    SUB.W   #IOFF+18,D0
    BRA.S   .AOB
.T: DC.L    .MOVE,.ADD,.SUB,.MUL,.DIV,.AND,.OR
.MOVE:  MOVE.L  (A3)+,D1
    BRA .XB
.ADD:   ADD.L   (A3)+,D1
    BRA .XB
.SUB:   SUB.L   (A3)+,D1
    BRA .XB
.AND:   AND.L   (A3)+,D1
    BRA .XB
.OR:    OR.L    (A3)+,D1
    BRA .XB
.MUL:   MOVE.L  (A3)+,D4
    MOVE.L  D4,D2
    MOVE.L  D4,D3
    MULU    D1,D4
    SWAP    D3
    MULU    D1,D3
    SWAP    D3
    CLR.W   D3
    ADD.L   D3,D4
    SWAP    D1
    MULU    D1,D2
    SWAP    D2
    CLR.W   D2
    ADD.L   D2,D4
    MOVE.L  D4,D1
    BRA .XB

;.DIV:  MOVE.L  (A3)+,D4
;   MOVEQ   #32,D3
;   MOVEQ   #0,D2
;.D1:   SUB.L   D4,D2
;   BCC.B   .D2
;   ADD.L   D4,D2
;.D2:   ROXL.L  #1,D1
;   ROXL.L  #1,D2
;   DBF     D3,.D1
;   NOT.L   D1
;   BRA .XB

.DIV:   MOVE.L  D1,-(A7)
    MOVE.L  (A3)+,-(A7)
    TST.L   (A7)
    BEQ ERROR15
    JSR I_DIV
    ADDQ.L  #8,A7
    MOVE.L  D0,D1
    BRA .XB
;*-*
;*-*

;;ERROR I
iERROR0: MOVEQ   #0,D0
        BRA LEAVEERROR
iERROR1: MOVEQ   #1,D0
        BRA LEAVEERROR
iERROR2: MOVEQ   #2,D0
        BRA LEAVEERROR
iERROR3: MOVEQ   #3,D0
        BRA LEAVEERROR
iERROR4: MOVEQ   #4,D0
        BRA LEAVEERROR
iERROR5: MOVEQ   #5,D0
        BRA LEAVEERROR
iERROR6: MOVEQ   #6,D0
        BRA LEAVEERROR
iERROR7: MOVEQ   #7,D0
        BRA LEAVEERROR
iERROR8: MOVEQ   #8,D0
        BRA LEAVEERROR
iERROR9: MOVEQ   #9,D0
        BRA LEAVEERROR
iERROR10:MOVEQ   #10,D0
        CLR.W   ERRWHERE
        BRA LEAVEERROR
iERROR11:MOVEQ   #11,D0
        BRA LEAVEERROR
iERROR12:MOVEQ   #12,D0
        BRA LEAVEERROR
iERROR13:MOVEQ   #13,D0
        CLR.W   ERRWHERE
        BRA LEAVEERROR
iERROR14:MOVEQ   #14,D0
        BRA LEAVEERROR
iERROR15:MOVEQ   #15,D0
        BRA LEAVEERROR
iERROR16:MOVEQ   #16,D0
        CLR.W   ERRWHERE
        MOVE.L  #NAMEBUF,ERROROBJ
        BRA LEAVEERROR
iERROR17:MOVEQ   #17,D0
        CLR.W   ERRWHERE
        BRA LEAVEERROR
iERROR18:MOVEQ   #18,D0
        CLR.W   ERRWHERE
        BRA LEAVEERROR
iERROR19:MOVEQ   #19,D0
        BRA LEAVEERROR
iERROR20:MOVEQ   #20,D0
        BRA LEAVEERROR
iERROR21:MOVEQ   #21,D0
        BRA LEAVEERROR
iERROR22:MOVEQ   #22,D0
        BRA LEAVEERROR
iERROR23:MOVEQ   #23,D0
        BRA LEAVEERROR
iERROR24:MOVEQ   #24,D0
        BRA LEAVEERROR
iERROR25:MOVEQ   #25,D0
        BRA LEAVEERROR
iERROR26:MOVEQ   #26,D0
        BRA LEAVEERROR
iERROR27:MOVEQ   #27,D0
        BRA LEAVEERROR
iERROR28:MOVEQ   #28,D0
        CLR.W   ERRWHERE
        BRA LEAVEERROR
iERROR29:MOVEQ   #29,D0
        BRA LEAVEERROR
iERROR30:MOVEQ   #30,D0
        BRA LEAVEERROR
iERROR31:MOVEQ   #31,D0
        BRA LEAVEERROR
iERROR32:MOVEQ   #32,D0
        CLR.W   ERRWHERE
        BRA LEAVEERROR
iERROR33:MOVEQ   #33,D0
        BRA LEAVEERROR
iERROR34:MOVEQ   #34,D0
        BRA LEAVEERROR
iERROR35:MOVEQ   #35,D0
        CLR.W   ERRWHERE
        BRA LEAVEERROR
iERROR36:MOVEQ   #36,D0
        BRA LEAVEERROR
iERROR37:MOVEQ   #37,D0
        CLR.W   ERRWHERE
        BRA LEAVEERROR
iERROR38:MOVEQ   #38,D0
        CLR.W   ERRWHERE
        BRA LEAVEERROR
iERROR39:MOVEQ   #39,D0
        BRA LEAVEERROR
iERROR40:MOVEQ   #40,D0
        BRA LEAVEERROR
iERROR41:MOVEQ   #41,D0
        BRA LEAVEERROR
iERROR42:MOVEQ   #42,D0
        BRA LEAVEERROR
iERROR43:MOVEQ   #43,D0
        BRA LEAVEERROR
iERROR44:MOVEQ   #44,D0
        CLR.W   ERRWHERE
        BRA LEAVEERROR
iERROR45:MOVEQ   #45,D0
        CLR.W   ERRWHERE
        BRA LEAVEERROR
iERROR46:MOVEQ   #46,D0
        CLR.W   ERRWHERE
        BRA LEAVEERROR
iERROR47:MOVEQ   #47,D0
        BRA LEAVEERROR
iERROR48:MOVEQ   #48,D0
        BRA LEAVEERROR
iERROR49:MOVEQ   #49,D0
        BRA LEAVEERROR
iERROR50:MOVEQ   #50,D0
        BRA LEAVEERROR
iERROR51:MOVEQ   #51,D0
        BRA LEAVEERROR
iERROR52:MOVEQ   #52,D0
        BRA LEAVEERROR
iERROR53:MOVEQ   #53,D0
        BRA LEAVEERROR
iERROR54:MOVEQ   #54,D0
        BRA LEAVEERROR
iERROR55:MOVEQ   #55,D0
        BRA LEAVEERROR
iERROR56:MOVEQ   #56,D0
        BRA LEAVEERROR
iERROR57:MOVEQ   #57,D0
        CLR.W   ERRWHERE
        BRA LEAVEERROR
iERROR58:MOVEQ   #58,D0
        CLR.W   ERRWHERE
        BRA LEAVEERROR
iERROR59:MOVEQ   #59,D0
        BRA LEAVEERROR
iERROR60:MOVEQ   #60,D0
        BRA LEAVEERROR
iERROR61:MOVEQ   #61,D0
        BRA LEAVEERROR
iERROR62:MOVEQ   #62,D0
        BRA LEAVEERROR
iERROR63:MOVEQ   #63,D0
        BRA LEAVEERROR
iERROR64:MOVEQ   #64,D0
        BRA LEAVEERROR
iERROR65:MOVEQ   #65,D0
        BRA LEAVEERROR
iERROR66:MOVEQ   #66,D0
        BRA LEAVEERROR
iERROR67:MOVEQ   #67,D0
        BRA LEAVEERROR
iERROR68:MOVEQ   #68,D0
        BRA LEAVEERROR
iERROR69:MOVEQ   #69,D0
        BRA LEAVEERROR
iERROR70:MOVEQ   #70,D0
        BRA LEAVEERROR
iERROR71:MOVEQ   #71,D0
        BRA LEAVEERROR
iERROR72:MOVEQ   #72,D0
        BRA LEAVEERROR
iERROR73:MOVEQ   #73,D0
        BRA LEAVEERROR
iERROR74:MOVEQ   #74,D0
        BRA LEAVEERROR
iERROR75:MOVEQ   #75,D0
        BRA LEAVEERROR
iERROR76:MOVEQ   #76,D0
        BRA LEAVEERROR
iERROR77:MOVEQ   #77,D0
        CLR.W   ERRWHERE
        BRA LEAVEERROR
iERROR78:MOVEQ   #78,D0
        BRA LEAVEERROR
iERROR79:MOVEQ   #79,D0
        BRA LEAVEERROR
iERROR80:MOVEQ   #80,D0
        BRA LEAVEERROR
iERROR81:MOVEQ   #81,D0
        BRA LEAVEERROR
iERROR82:MOVEQ   #82,D0
        BRA LEAVEERROR
iERROR83:MOVEQ   #83,D0
        BRA LEAVEERROR
iERROR84:MOVEQ   #84,D0
        BRA LEAVEERROR
iERROR85:MOVEQ   #85,D0
        BRA LEAVEERROR
iERROR86:MOVEQ   #86,D0
        BRA LEAVEERROR
iERROR87:MOVEQ   #87,D0
        BRA LEAVEERROR
iERROR88:MOVEQ   #88,D0
        BRA LEAVEERROR
iERROR89:MOVEQ   #89,D0
        BRA LEAVEERROR
iERROR90:MOVEQ   #90,D0
        BRA LEAVEERROR
iERROR91:MOVEQ   #91,D0
        BRA LEAVEERROR
iERROR92:MOVEQ   #92,D0
        BRA LEAVEERROR
iERROR93:MOVEQ   #93,D0
        BRA LEAVEERROR
iERROR94:MOVEQ   #94,D0
        BRA LEAVEERROR
iERROR95:MOVEQ   #95,D0
        BRA LEAVEERROR
iERROR96:MOVEQ   #96,D0
        BRA LEAVEERROR
;*-*
;;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

    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)
    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)
    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 ERROR23
    BRA .1
.NM:    MOVE.W  CURLABNAME+2(PC),10(A4)
    ADDQ.L  #1,CURLABNAME
    BSR CHECKLABBUF
    BRA .1
.ERL:   BSR .2
    BRA ERROR14

.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
;*-*
;; Errors/Warnings/Messages/Dos support
; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ;
;   The Error, Message And DosSupport Part          ;
; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ;

ERROR:                ; D0=ERRORNR.
    BSR PREPMACROERROR
    MOVE.W  #5,CURSPOT
    MOVE.L  A0,SAVEDREGS
    MOVE.L  A3,SAVEDREGS+4
    MOVE.L  D0,D7
    BSR SHOWIDENT
    MOVE.L  #ERTEXT,D2
    MOVE.L  #ERTEXTEND-ERTEXT,D3
    BSR.W   WRITECON        ; WRITE 'ERROR: '
    MOVE.W  D7,D0
    ASL.W   #2,D0
    LEA ERRORTAB,A0
    MOVE.L  0(A0,D0.W),D2       ; FIND ERSTRING
    MOVE.L  D2,A0
.5: TST.B   (A0)+
    BNE .5
    SUBQ.L  #1,A0
    MOVE.L  A0,D3
    SUB.L   D2,D3
    BSR.W   WRITECON        ; WRITE 'YO SYNTAX SUCKS'
    BSR.W   WRITELN
    MOVE.W  LINENUM2(PC),D4
    BNE.S   .6
    MOVE.W  LINENUM,D4
    CMP.W   #-1,D4
    BEQ.S   .4
.6: MOVE.W  D4,RETERROR
    MOVE.L  ECODE(PC),A0
    MOVE.W  D4,D2
    BEQ.S   .1
    BMI.S   .1
    SUBQ.W  #1,D2
    MOVEQ   #10,D0
.XL:CMP.B   (A0)+,D0        ; FIND LINE
    BNE.S   .XL
    DBRA    D2,.XL
.1:
    BSR RECONSTRUCT     ; !!!!

    MOVE.L  A0,D0           ; BACKUP A0
.1B:    CMPI.B  #0,(A0)         ; find eol
    BEQ.S   .2
    CMPI.B  #10,(A0)+
    BNE.S   .1B
.3: CLR.B   -(A0)
    MOVE.L  A0,D3
    SUB.L   D0,D3
    LEA ERARGS(PC),A1
    MOVE.L  D0,4(A1)
    LEA ERLINE(PC),A0
    ADDQ.W  #1,D4
    EXT.L   D4
    MOVE.L  D4,(A1)
    BSR.W   WRITEFORMAT
.4: MOVE.L  ERROROBJ(PC),D0
    BEQ.S   .X
    LEA ERARGS(PC),A1       ; WRITE 'WITH: '
    MOVE.L  D0,(A1)
    LEA EROBJLINE(PC),A0
    BSR WRITEFORMAT
.X: BSR PREPWRITEMACROLINE
    RTS
.2: ADDQ.L  #1,A0
    BRA.S   .3

RECONSTRUCT:          ; GETS START LINE IN A0, RETURNS NEW
    MOVE.L  A0,LINEOFF      ; ADR. IN A0, TRASHES NOTHING
    MOVEM.L D0-D4/A1-A4,-(A7)
    MOVE.W  ERRWHERE(PC),D0
    BEQ .EXIT
    CMP.W   #1,D0
    BEQ.S   .LA0
    BSR CONSTRUCT
    TST.L   D0
    BEQ.S   .GOTP
    BRA .EXIT
.LA0:   MOVE.L  SAVEDREGS(PC),ERPOINT   ; ERROR IS IN LEX
.GOTP:  MOVE.L  ERPOINT(PC),D0
    MOVE.L  ECODE,D1
    SUB.L   D0,D1
    NEG.L   D1
    MOVE.L  D1,BYTEOFF
    MOVE.L  LINEOFF(PC),A0
    MOVE.L  ERBUF(PC),A1
    MOVEQ   #0,D1           ; 0=SEARCH,1=ON,2=AFTER ERPOS
.1: CMP.L   A0,D0
    BNE.S   .2
    LEA .ON(PC),A2      ; START OF ERPOS
.3: MOVE.B  (A2)+,(A1)+
    BNE.S   .3
    SUBQ.L  #1,A1
    MOVEQ   #1,D1
.2: MOVE.B  (A0)+,D2        ; READ BYTE
    BEQ.S   .NL         ; NL ?
    CMP.B   #10,D2
    BEQ.S   .NL         ; NL ?
    MOVE.B  D2,(A1)+
    CMP.W   #1,D1
    BNE.S   .1
    MOVEQ   #2,D1           ; END OF ERPOS
    CMP.B   #9,-1(A1)
    BNE.S   .NT
    MOVE.B  #" ",-1(A1)     ; A TAB? --> EXTRA SPACE
    MOVE.B  #9,(A1)+
.NT:    LEA .OFF(PC),A2
.5: MOVE.B  (A2)+,(A1)+
    BNE.S   .5
    SUBQ.L  #1,A1
    BRA.S   .1
.NL:    CMP.W   #1,D1
    BMI.S   .NL0
    BEQ.S   .NL1
    CLR.B   (A1)+           ; END OF STRING + ER
    MOVE.L  ERBUF(PC),LINEOFF
    BRA.S   .EXIT
.NL0:   MOVE.L  ERBUF(PC),A1        ; NEXT STRING
    BRA.S   .1
.NL1:   MOVE.B  #" ",(A1)+      ; END OF STRING
    LEA .OFF(PC),A2
.4: MOVE.B  (A2)+,(A1)+
    BNE.S   .4
    MOVE.L  ERBUF(PC),LINEOFF
.EXIT:  MOVEM.L (A7)+,D0-D4/A1-A4
    MOVE.L  LINEOFF(PC),A0
    RTS
.ON:    DC.B    27,"[43;32m",0
.OFF:   DC.B    27,"[0m",0

LINEOFF:    DC.L    0
ERRWHERE:   DC.W    0       ; 0=?, 1=A0.ASC, 2==A3.INT
INTERMED:   DC.L    0
ERPOINT:    DC.L    0
SAVEDREGS:  DC.L    0,0     ; A0,A3
XTRALINES:  DC.W    0
ERBUF:      DC.L    ESTACKBUF
BYTEOFF:    DC.L    0

CONSTRUCT:
    MOVE.L  SAVEDREGS+4(PC),D3  ; D3=INTERIM ERPOINT
    BTST    #0,D3
    BEQ.S   .EVEN
    ADDQ.L  #1,D3
.EVEN:  MOVE.L  INTERMED(PC),A3     ; A3=INTERIM START
    MOVE.L  LINEOFF(PC),A0      ; A0=ASCII START
.LOOP:  CMP.L   D3,A3
    BPL .EXIT
.EAT:   MOVE.B  (A0)+,D0        ; COLLECT WHITESPACE
    BEQ .ERR
    CMP.B   #" ",D0
    BEQ.S   .EAT
    CMP.B   #9,D0
    BEQ.S   .EAT
    CMP.B   #10,D0
    BEQ.S   .EAT
    CMP.B   #"-",D0
    BEQ.S   .SCOM
    CMP.B   #"/",D0
    BNE.S   .TOKEN
    CMP.B   #"*",(A0)
    BNE.S   .TOKEN
    ADDQ.L  #1,A0
    MOVEQ   #1,D1           ; COMMENT COUNT
    MOVE.L  ENDECODE,D2
.COML:  TST.L   D1
    BEQ.S   .EAT
    MOVE.B  (A0)+,D0
    CMP.B   #"*",D0
    BNE.S   .1
    CMP.B   #"/",(A0)
    BNE.S   .COML
    ADDQ.L  #1,A0
    SUBQ.L  #1,D1
    BRA.S   .COML
.1: CMP.B   #"/",D0
    BNE.S   .2
    CMP.B   #"*",(A0)
    BNE.S   .COML
    ADDQ.L  #1,A0
    ADDQ.L  #1,D1
    BRA.S   .COML
.2: CMP.B   #10,D0
    BNE.S   .COML
    CMP.L   D2,A0
    BPL.S   .ERR
    BRA.S   .COML           ;?
.SCOM:  CMP.B   #">",(A0)
    BNE.S   .TOKEN
    MOVEQ   #10,D0
.SCL:   CMP.B   (A0)+,D0
    BNE.S   .SCL
    BRA.S   .EAT
.TOKEN: SUBQ.L  #1,A0
    MOVEQ   #0,D1           ; ATTRIBUTE
    MOVE.W  (A3)+,D0        ; TOKEN
    CMP.W   #$100,D0
    BPL.S   .ASM
    CMP.W   #IOFF,D0
    BMI.S   .3
    BSR .ID
    BRA .LOOP
.3: LSL.L   #3,D0
    EXT.L   D0
    LEA .TAB(PC),A1
    ADD.L   D0,A1
    MOVE.L  4(A1),D1
    MOVE.L  (A1),A1
    JSR (A1)
    BRA .LOOP
.ASM:   CMP.W   #$400,D0
    BPL.S   .ERR            ; FOR NOW.
    BSR .ID
    CMP.B   #".",(A0)
    BNE.S   .XX
    CMP.B   #10,1(A0)
    BEQ.S   .XX
    ADDQ.L  #2,A0
.XX:    BRA .LOOP
.EXIT:  MOVE.L  A0,ERPOINT
    MOVEQ   #0,D0
    RTS
.ERR:   MOVEQ   #1,D0           ; !SHOULD BE 1 LATER!
    MOVE.L  A0,ERPOINT      ; !SHOULD BE DELETED LATER!
    RTS
.TAB:
    DC.L    .EX,0,.NUM,4,.ID,12,.ONE,",",.TWO,":="      ; 0-4
    DC.L    .ID,4,.STR,0,.ONE,"+",.ONE,"-",.ONE,"*"     ; 5-9
    DC.L    .ONE,"/",.ONE,"=",.ONE,">",.ONE,"<",.TWO,">="   ; 10-14
    DC.L    .TWO,"<=",.TWO,"<>",.ONE,"(",.ONE,")",.ONE,":"  ; 15-19
    DC.L    .ER,0,.EX,0,.ID,4,.ONE,"{",.ONE,"}"     ; 20-24
    DC.L    .ID,8,.TWO,".W",.TWO,".L",.TWO,".B",.ONE4,"["   ; 25-29
    DC.L    .ONE,"]",.ID,4,.ONE,"^",.TWO,"++",.TWO,"--" ; 30-34
    DC.L    .ONE,".",.ONE,"`",.ONE,"!",.ID,4,.ID,4      ; 35-39
    DC.L    .THREE,"<=>",.TWO,"::",.ID,4,.NUM,4,.ONE,"@"    ; 40-44
    DC.L    .ID,4,.ONE,"|",.ID,2,.ER,0,.TWO,"<<",.TWO,">>",.ER,0  ; 45-51
    DC.L    .ONE,"?",.THREE,':=:',.ID,4
.ER:    ADDQ.L  #4,A7
    BRA .ERR
.EX:    ADDQ.L  #4,A7
    BRA .EXIT
.ID:    MOVE.B  (A0)+,D2
    CMP.B   #"_",D2
    BEQ.S   .ID
    CMP.B   #"0",D2
    BMI.S   .6
    CMP.B   #"9"+1,D2
    BMI.S   .ID
    CMP.B   #"A",D2
    BMI.S   .6
    CMP.B   #"Z"+1,D2
    BMI.S   .ID
    CMP.B   #"a",D2
    BMI.S   .6
    CMP.B   #"z"+1,D2
    BMI.S   .ID
.6: SUBQ.L  #1,A0
    ADD.L   D1,A3
    RTS
.NUM:   MOVE.B  (A0),D2
    CMP.B   #"A",D2         ; SEE IF IT'S A CONSTANT
    BMI.S   .10
    CMP.B   #"Z"+1,D2
    BMI.S   .ID
.10:    CMP.B   #'"',D2
    BEQ.S   .SSTR
    MOVEQ   #0,D4           ; HEXFLAG
.8: MOVE.B  (A0)+,D2
    CMP.B   #"$",D2
    BEQ.S   .7
    CMP.B   #"%",D2
    BEQ.S   .8
    CMP.B   #".",D2         ; FOR FLOATS?
    BEQ.S   .8
    CMP.B   #"0",D2
    BMI.S   .9
    CMP.B   #"9"+1,D2
    BMI.S   .8
    TST.L   D4
    BEQ.S   .9
    CMP.B   #"A",D2
    BMI.S   .9
    CMP.B   #"G",D2
    BMI.S   .8
    CMP.B   #"a",D2
    BMI.S   .9
    CMP.B   #"z"+1,D2
    BMI.S   .8
.9: SUBQ.L  #1,A0
    ADD.L   D1,A3
    RTS
.7: MOVEQ   #1,D4
    BRA.S   .8
.SSTR:  ADDQ.L  #1,A0
.SSL:   CMP.B   #'"',(A0)+
    BNE.S   .SSL
    ADD.L   D1,A3
    RTS
.ONE:   CMP.B   (A0)+,D1
    BEQ.S   .4
    ADDQ.L  #4,A7           ; STACK BACK
    BRA .ERR
.4: RTS
.ONE4:  CMP.B   (A0)+,D1        ; AS ONE, BUT NOW SKIPS A LONG
    BEQ.S   .4B
    ADDQ.L  #4,A7           ; STACK BACK
    BRA .ERR
.4B:    ADDQ.L  #4,A3
    RTS
.TWO:   MOVE.L  D1,D2
    LSR.L   #8,D2
    CMP.B   (A0)+,D2
    BNE.S   .5
    CMP.B   (A0)+,D1
    BNE.S   .5
    RTS
.THREE: MOVE.L  D1,D2
    SWAP    D2
    CMP.B   (A0)+,D2
    BNE.S   .5
    MOVE.L  D1,D2
    LSR.L   #8,D2
    CMP.B   (A0)+,D2
    BNE.S   .5
    CMP.B   (A0)+,D1
    BNE.S   .5
    RTS
.5: ADDQ.L  #4,A7           ; STACK BACK
    BRA .ERR
.STR:   ADDQ.L  #2,A3
    MOVE.W  (A3)+,D2
    EXT.L   D2
    LSL.L   #1,D2
    ADD.L   D2,A3
    CMP.B   #"'",(A0)+
    BNE.S   .SE
.SL:    MOVE.B  (A0)+,D2
    CMP.B   #10,D2
    BEQ.S   .SE
    CMP.B   #"'",D2
    BNE.S   .SL
    CMP.B   #"'",(A0)
    BNE.S   .SEX
    ADDQ.L  #1,A0
    BRA.S   .SL
.SEX:   RTS
.SE:    ADDQ.L  #4,A7           ; STACK BACK
    BRA .ERR


WRITECON:             ; ADR D2, LEN D3
    MOVE.L  STOUT(PC),D1
    MOVE.L  DOSBASE(PC),A6
    JSR -48(A6)
    RTS

WRITELN:
    MOVEQ   #1,D3
    MOVE.L  #RETURNOUT,D2
    BSR.S   WRITECON
    RTS

WRITEFORMAT:          ; A0=STRING, A1=DATA
    MOVE.L  #PRINTBUF,A3        ; USES D0-D3/A0-A3/A6
    LEA .1(PC),A2       ; TRASH DIRNAME BUF....
    MOVE.L  A3,D2
    MOVE.L  4.W,A6
    JSR -522(A6)
    MOVE.L  D2,A0
.2: TST.B   (A0)+
    BNE.S   .2
    SUBQ.L  #1,A0
    MOVE.L  A0,D3
    SUB.L   D2,D3
    BSR WRITECON
    RTS
.1: MOVE.B  D0,(A3)+
    RTS

WRITELINENUM:
    MOVE.W  LINENUM(PC),D7
    CMP.W   LINEWRITE(PC),D7
    BPL.S   .1
    RTS
.1: BTST    #7,CODEPREFS+2
    BNE.S   .11
    MOVEM.L D0-D3/A0-A3,-(A7)
    LEA .2(PC),A0
    LEA .3(PC),A1
    MOVE.W  LINEWRITE(PC),D0
    EXT.L   D0
    MOVE.L  D0,(A1)
    BSR WRITEFORMAT
    ADD.W   #100,LINEWRITE
    MOVEM.L (A7)+,D0-D3/A0-A3
.11:    RTS
.2: DC.B    '%ld',13,0
    EVEN
.3: DC.L    0

NOERROR:
    ADDQ.W  #1,ASSLINE
    BTST    #4,CODEPREFS+3
    BNE.S   .X
    BTST    #3,CODEPREFS+3
    BEQ.S   .3
    BCLR    #0,WARNINGS+3
.3: MOVE.L  WARNINGS(PC),D7
    MOVEQ   #0,D6           ; BITCOUNT
    LEA WARNINGTAB(PC),A2
.XL:CMP.W   #32,D6
    BEQ.S   .X
    BTST    D6,D7
    BEQ.S   .1
    MOVEQ   #9,D3
    MOVE.L  #WARNINGMESSY,D2
    BSR WRITECON
    MOVE.L  D6,D5
    LSL.L   #2,D5
    MOVE.L  WARNINGTAB(PC,D5.L),D2
    MOVE.L  D2,A0

;.2:    TST.B   (A0)+
;   BNE.S   .2
;   SUBQ.L  #1,A0
;   MOVE.L  A0,D3
;   SUB.L   D2,D3
;   BSR WRITECON

    MOVEM.L D0-D3/A0-A3,-(A7)
    LEA ASSLINE(PC),A1
    BSR WRITEFORMAT
    MOVEM.L (A7)+,D0-D3/A0-A3

    BSR WRITELN

.1: ADDQ.L  #1,D6
    BRA.S   .XL
.X: BTST    #7,CODEPREFS+2
    BNE.S   .11
    MOVE.L  #NOERMESSAGE,D2
    MOVE.L  #NEMEND-NOERMESSAGE,D3
    BSR WRITECON
    BSR WRITELN
.11:    RTS
;*-*
;; Warnings
WARNINGMESSY:
    DC.B    "WARNING: ",0       ; 9

WARNINGTAB:
    DC.L    .1,.2,.3,.4,.5,.6,.7,.8,.9

.1: DC.B    "A4/A5 used in inline assembly",0
.2: DC.B    "keep an eye on your stacksize",0
.3: DC.B    "stack is definitely too small",0
.4: DC.B    'suspicious use of "=" in void expression(s). (line %d)',0
.5: DC.B    "module changed OPT settings",0
.6: DC.B    "variable used as function",0
.7: DC.B    "code outside PROCs",0
.8: DC.B    "040/060 emulated instruction(s) used",0
.9: DC.B    " ",0
    EVEN
;*-*
;; Cache Handler
PORTCOOKIE  = $DEADBEEF

CACHENAME:    DC.B    "EmoduleCache",0,0
PORTADR:      DC.L    0   ; MUST BE NIL FOR NO_CACHE
CACHENAMESTART:   DC.L    0
CACHENAMEEND: DC.L    0

FLUSHMODULE:          ; D0=MODPTR
    MOVEM.L D1/D2/D3/A0-A3/A6,-(A7)
    MOVE.L  D0,D1           ; D1=MODNAME
    MOVE.L  D1,A0
.SL:    MOVE.B  (A0)+,D2        ; CHOMP OFF PATH
    CMP.B   #":",D2
    BEQ.S   .SP
    CMP.B   #"/",D2
    BEQ.S   .SP
    TST.B   D2
    BNE.S   .SL
    MOVE.L  PORTADR(PC),D0
    BEQ.S   .X
    MOVE.L  D0,A0
    LEA 38(A0),A0       ; A1=PREV, A0=CUR
.XL:MOVE.L  A0,A1
    MOVE.L  (A0),A0
    MOVE.L  A0,D0
    BEQ.S   .X
    MOVE.L  8(A0),D2
    MOVE.L  D2,A2
.SL2:   MOVE.B  (A2)+,D3        ; CHOMP OFF PATH HERE TOO
    CMP.B   #":",D3
    BEQ.S   .SP2
    CMP.B   #"/",D3
    BEQ.S   .SP2
    TST.B   D3
    BNE.S   .SL2
    MOVE.L  D2,A2
    MOVE.L  D1,A3
.CL:    CMPM.B  (A2)+,(A3)+     ; SPECIAL STRCMP: ENDS MUST MATCH
    BNE.S   .XL
    TST.B   -1(A2)
    BNE.S   .CL
    MOVE.L  (A0),(A1)       ; PREV.NEXT:=CUR.NEXT
    MOVE.L  4(A0),D0
    EXG.L   A0,A1
    MOVE.L  4.W,A6
    MOVEM.L D1/A0,-(A7)
    JSR -210(A6)
    MOVEM.L (A7)+,D1/A0
    BRA.S   .XL
.X: MOVEM.L (A7)+,D1/D2/D3/A0-A3/A6
    RTS
.SP:    MOVE.L  A0,D1
    BRA.S   .SL
.SP2:   MOVE.L  A2,D2
    BRA.S   .SL2

SEARCHINCACHE:            ; RETURNS D0=MODPTR OR NIL
    MOVEM.L D1/A0-A3,-(A7)
    MOVE.L  PORTADR(PC),D0
    BEQ.S   .X
    MOVE.L  D0,A0
    MOVE.L  38(A0),A0
    MOVE.L  CACHENAMESTART(PC),A1
    MOVE.L  CACHENAMEEND(PC),D1
    SUB.L   A1,D1
.XL:MOVE.L  A0,D0
    BEQ.S   .X
    CMP.L   12(A0),D1       ; SEE IF LENGTHS MATCH
    BNE.S   .N
    MOVE.L  8(A0),A2
    MOVE.L  A1,A3
.CL:    CMPM.B  (A2)+,(A3)+     ; STRCMP
    BNE.S   .N
    TST.B   -1(A2)
    BNE.S   .CL
    MOVE.L  16(A0),D0       ; EXIT WITH MODPTR
    BRA.S   .X
.N: MOVE.L  (A0),A0
    BRA.S   .XL
.X: MOVEM.L (A7)+,D1/A0-A3
    RTS

NEWCACHE:
    TST.L   PORTADR         ; DO WE CACHE?
    BEQ NEW
    MOVEM.L D1-D3/A0-A3/A6,-(A7)    ; SIZE-->D0-->ADDR
    MOVE.L  CACHENAMESTART(PC),A2
    MOVE.L  CACHENAMEEND(PC),D3
    SUB.L   A2,D3
    MOVE.L  D0,A3           ; TEMP
    ADD.L   #50,D0
    ADD.L   D3,D0
    MOVE.L  D0,D2
    MOVEQ   #0,D1
    MOVE.L  4.W,A6
    JSR -198(A6)
    TST.L   D0
    BEQ.S   .EXX
    MOVE.L  A3,D1
    MOVE.L  D0,A0
    MOVE.L  PORTADR(PC),A3      ; LINK INTO LIST
    MOVE.L  38(A3),(A0)
    MOVE.L  A0,38(A3)
    MOVE.L  D2,4(A0)        ; SET MEM-LEN
    MOVE.L  D3,12(A0)
    LEA 32(A0),A3
    MOVE.L  A3,8(A0)        ; SET NAME
.XL:MOVE.B  (A2)+,D2
    CMP.B   #"A",D2         ; LOWERCASE'M
    BMI.S   .C
    CMP.B   #"Z"+1,D2
    BPL.S   .C
    ADD.B   #32,D2
.C: MOVE.B  D2,(A3)+
    BNE.S   .XL
    MOVE.L  A3,D3
    BTST    #0,D3
    BEQ.S   .S
    ADDQ.L  #1,A3
.S: MOVE.L  A3,16(A0)
    MOVE.L  D1,20(A0)
    MOVE.L  A3,D0
.EXX:   MOVEM.L (A7)+,D1-D3/A0-A3/A6
    RTS

GETCACHE:
    BTST    #1,CODEPREFS+1      ; IF OPT=-c THEN DON'T USE CACHE
    BEQ.S   .1
    RTS
.1: MOVE.L  4.W,A6
    JSR -$84(A6)        ; FORBID
    LEA CACHENAME(PC),A1
    JSR -390(A6)        ; FINDPORT
    TST.L   D0
    BNE.S   .FOUND
    MOVEQ   #1,D1           ; get ourselves mem for port
    SWAP    D1
    MOVEQ   #100,D0
    MOVE.L  4.W,A6
    JSR -198(A6)
    TST.L   D0
    BEQ.S   .FAIL
    MOVE.L  D0,A5           ; A5=MESSAGEPORT
    LEA CACHENAME(PC),A0
    LEA 50(A5),A1
    MOVE.L  A1,D0
.XL:MOVE.B  (A0)+,(A1)+
    BNE.S   .XL
    MOVE.L  D0,10(A5)
    MOVE.B  #4,8(A5)        ; this is a msgport
    MOVE.B  #1,9(A5)        ; pri = 1
    MOVE.B  #2,14(A5)       ; pa_ignore
    MOVE.L  #PORTCOOKIE,34(A5)
    MOVE.L  A5,A1
    JSR -354(A6)
    BRA.S   .PORT
.FOUND: MOVE.L  D0,A5
.PORT:  MOVE.L  #DEBUGDATA,42(A5)
    TST.W   46(A5)
    BNE.S   .FAIL
    CMP.L   #PORTCOOKIE,34(A5)  ; HERE WE HAVE VALID PORT IN A5
    BNE.S   .FAIL
    MOVE.L  A5,PORTADR
    MOVE.W  #1,46(A5)
.FAIL:  JSR -$8A(A6)        ; PERMIT
    RTS

UNLOCKCACHE:
    MOVE.L  4.W,A6
    JSR -$84(A6)        ; FORBID
    MOVE.L  PORTADR(PC),D0
    BEQ.S   .1
    MOVE.L  D0,A0
    CLR.W   46(A0)
.1: JSR -$8A(A6)        ; PERMIT
    RTS

;     RESCHECK:             ; PRESERVES ALL REGS IF OK
;   TST.W   .1
;   BNE.S   .X
;   MOVE.W  #-1,.1
;   RTS
;.1:    DC.W    0
;.X:    MOVE.L  INITSTACK,A7        ; EMERGENCY EXIT
;   MOVEQ   #20,D0
;   RTS
;*-*
;;INIT

INITALL:
    MOVE.W  #6,CURSPOT
    MOVE.L  D0,ARGLEN       ; SAVE THESE 1ST
    MOVE.L  A0,ARGADR
    MOVE.L  4.W,A6
    MOVE.W  20(A6),KICKVERS

    LEA UTILNAME,A1
    MOVEQ   #0,D0
    JSR -552(A6)
    MOVe.L  D0,UTILBASE

    LEA INITDOS,A1
    MOVEQ   #0,D0
    JSR -552(A6)        ; OPEN DOS
    MOVE.L  D0,DOSBASE
    BEQ LEAVEFAST

    MOVE.L  D0,A6
    JSR -60(A6)         ; GET STDIO
    MOVE.L  D0,STOUT
    TST.L   D0
    BEQ NOSTDOUT

;   here start with cl-arg-parse
    BSR   INITOTHER

    CMP.W   #37,KICKVERS
    BPL READARGS

    MOVE.L  ARGLEN(PC),D0
    MOVE.L  ARGADR(PC),A0

    CLR.W   MAXREGALLOC
    MOVE.L  CODEPREFS(PC),D5
    CMP.B   #'-',(A0)
    BNE .1
    SUBQ.L  #1,D0
    ADDQ.L  #1,A0
    MOVEQ   #0,D2
.2: MOVE.B  (A0)+,D2
    SUBQ.L  #1,D0
    CMP.W   #33,D2
    BMI .1
    CMP.W   #127,D2
    BPL .1
    LEA .OPTS(PC),A2
.XL:MOVE.B  (A2)+,D3
    BEQ ERROR10
    MOVE.B  (A2)+,D4
    CMP.B   D2,D3
    BNE.S   .XL
    BSET    D4,D5
    CMP.B   #"m",D3
    BEQ.S   .M
    CMP.B   #"r",D3
    BEQ.S   .R
    BRA.S   .2
.M: MOVE.B  (A0)+,D2
    SUBQ.L  #1,D0
    CMP.B   #"9"+1,D2
    BPL ERROR10
    CMP.B   #"1",D2
    BMI ERROR10
    SUB.B   #"0",D2
    EXT.W   D2
    EXT.L   D2
    MULU    #400,D2         ; SEE READARGS
    LSL.L   #8,D2
    ADD.L   D2,BUFADD
    BRA.S   .2
.R: MOVE.B  (A0),D2
    CMP.B   #"0"+1+MAXREGVARS,D2    ; PUT 1..5 VARS IN REGS
    BPL.S   .NR
    CMP.B   #"1",D2
    BMI.S   .NR
    SUBQ.L  #1,D0
    ADDQ.L  #1,A0
    SUB.B   #"0",D2
    EXT.W   D2
.SR:    MOVE.W  D2,MAXREGALLOC
    BRA.S   .2
.NR:    MOVEQ   #MAXREGVARS,D2
    BRA.S   .SR
.OPTS:  DC.B    'a',3,'n',4,'w',6,'b',9,'m',10,'l',2,'s',13
    DC.B    'e',11,'E',5,'r',7,'q',15,'c',17,'h',18,'L',21,0
    EVEN
.1: MOVE.L  D5,CODEPREFS
    MOVE.L  #NAMEBUF,A1     ; COPY ARGS
    CMP.L   #2,D0
    BMI ERROR18         ; NOSTDOUT
    SUBQ.L  #1,D0
    MOVE.L  D0,ARGLEN
    MOVE.L  A0,ARGADR
    SUBQ.L  #1,D0
    MOVEQ   #0,D2
COPYARGS:
    MOVE.B  (A0)+,D2
    CMP.W   #33,D2
    BPL.S   .1
    SUBQ.L  #1,ARGLEN
    BRA.S   .2
.1: MOVE.B  D2,(A1)+
.2: DBRA    D0,COPYARGS

INITOTHER:
    MOVEM.L D0-A6,-(A7)
    LEA MIDAT(PC),A1
    MOVEQ   #0,d1
.1: MOVE.B  (A1),D0
    BEQ .2
    ADDQ.L  #1,D1
    eori.b  #$45,d0
    move.b  d0,(a1)+
    bra .1
.2: move.l  d1,MIDAT-4
    lea MIDAT2(PC),A1
    moveq   #0,d0
    moveq   #0,d2
    move.l  ARGADR,A0
.3: move.b  (a0)+,d0
    tst.b   d0
    beq     .4
    cmp.b   #10,d0
    beq     .4
    addq.l  #1,d2
    eori.b  #$45,d0
    cmp.b   (a1)+,d0
    bne     .5
    bra .3
.4:
    cmp.l   #16,d2
    bne .5
    MOve.l  #MIDAT,d2
    exg.l   d1,d3
    JSR WRITECON
    JSR CLEANUPALL
    MOVE.L  INITSTACK,A7
    rts
.5:
    MOVEM.L (A7)+,D0-A6
    RTS


    DC.L    0
MIDAT:
    DC.B    'Oeeeeeeeeeeeee!f',$15,'e!f',$15,'eeeOe',$4,$28,$2c,'"$ee'
    DC.B    'eeee!f',$15,'e!f',$15,'eeeeOeeeeeeeeeee!f',$15,'e!f'
    DC.B    $15,"eeeeeOeeóf'eóf'e!f",$15,'e!f',$15,"eeeeeeOeeeóf'"
    DC.B    "eóf'e",$15,'e!f',$15,"eeeeeeeOeeeeóf'e!f'e!f",$15,'eeeeeeeeO'
    DC.B    'eeeeeóffe!fff',$15,'e',$3,'*7 3 7eOeeeeeeóf',$15,'e!f',$15
    DC.B    "eeeeeeeeeeOeeeeeeeeeeeeee 77j')$÷eOO",0
        EVEN
MIDAT2:
    DC.L    $0c622865,$3c2a3037,$65082436,$31203764,0

; HERE ARGADR IS OK, AND ARGLEN=PRECISELEN, A1=ENDOFSTR
BACKRA:

    CMP.B   #"e",-1(A1)
    BEQ.S   .4
    CMP.B   #"E",-1(A1)
    BNE.S   .3
.4: CMP.B   #".",-2(A1)
    BNE.S   .3
    MOVE.L  ARGLEN(PC),D2
    SUBQ.L  #2,D2
    BMI.S   .3
    MOVE.L  D2,ARGLEN
    SUBQ.L  #2,A1

.3: MOVE.B  #0,(A1)+
    MOVE.W  #0,CONOUT
    BSR.W   SHOWIDENT
    BRA.S   GOTOUT
NOSTDOUT:             ; WE'VE GOT NO STDIO
        MOVEQ   #0,D0
        MOVE.L  D0,ARGLEN       ; SIMULATE NO ARGS
        SWAP    D0
        MOVE.B  D0,NAMEBUF
    BSR OPENCON         ; WE NEED A CON: AS STDIO
    BSR.S   SHOWIDENT
    MOVE.W  #-1,CONOUT
    BSET    #2,CODEPREFS+1
GOTOUT:               ; WE GOT STDIO, SO START PRINTING
    BSR TOFRONT         ; PUT WBTOFRONT
    BSR INSTALLHANDLER
    MOVE.W  CONOUT(PC),D0
    CMP.W   #0,D0
    BNE.S   ERNOARGS
    BSR OPENFILE
    RTS
ERNOARGS:
    RTS

SHOWIDENT:
    TST.W   .2
    BNE.S   .1
    BTST    #7,CODEPREFS+2
    BNE.S   .1
    MOVE.L  #TITLE,D2
    MOVE.L  #TITLEEND-TITLE,D3
    BSR WRITECON        ; SHOW OUR REAL IDENTITY
    MOVE.W  #-1,.2
.1: RTS
.2: DC.W    0

ISOPENMATH:
    TST.L   MATHBASE
    BNE.S   .1
    ;MOVEM.L    D0-D1/A0-A1,-(A7)
    LEA INITMATH,A1
    MOVEQ   #0,D0
    MOVE.L  4.W,A6
    JSR -552(A6)        ; OPEN MATH
    MOVE.L  D0,MATHBASE
    ;MOVEM.L    (A7)+,D0-D1/A0-A1
    TST.L   MATHBASE
    BEQ ERROR58
.1: RTS

READARGS:
    MOVE.L  DOSBASE,A6
    MOVE.L  #TEMPLATE,D1
    MOVE.L  #.SRC,D2
    MOVEQ   #0,D3
    JSR -$31E(A6)       ; READARGS
    MOVE.L  D0,D7           ; D7=RASTRUCT
    BEQ ERROR18
    
    MOVE.L  #NAMEBUF,A1     ; COPY ARGS
    MOVE.L  .SRC(PC),A0
    MOVE.L  A1,ARGADR
    MOVE.L  A1,D0
.COPY:  MOVE.B  (A0)+,(A1)+
    BNE.S   .COPY
    SUBQ.L  #1,A1
    MOVE.L  A1,D5           ; D5=END
    SUB.L   A1,D0
    NEG.L   D0
    MOVE.L  D0,ARGLEN
    
    MOVE.L  CODEPREFS,D6        ; D6=CODEPREFS
    MOVE.L  .REG(PC),D0
    BEQ.S   .1
    MOVE.L  D0,A0
    MOVE.L  (A0),D0
    TST.L   D0
    BMI.S   .D
    CMP.L   #MAXREGVARS+1,D0
    BMI.S   .O
.D: MOVEQ   #MAXREGVARS,D0
.O: MOVE.W  D0,MAXREGALLOC
.1: TST.L   .LARGE
    BEQ.S   .2
    BSET    #2,D6
.2: TST.L   .SYM
    BEQ.S   .3
    BSET    #13,D6
.3: TST.L   .NOWRN
    BEQ.S   .4
    BSET    #4,D6
.4: TST.L   .QUIET
    BEQ.S   .5
    BSET    #15,D6
.5: TST.L   .ASM
    BEQ.S   .6
    BSET    #3,D6
.6: TST.L   .ERRL
    BEQ.S   .7
    BSET    #11,D6
.7: TST.L   .ERRB
    BEQ.S   .8
    BSET    #5,D6
.8: TST.L   .SBUF
    BEQ.S   .9
    BSET    #9,D6
.9: TST.L   .ICA
    BEQ.S   .10
    BSET    #17,D6
.10:    TST.L   .HOLD
    BEQ.S   .11
    BSET    #18,D6
.11:    TST.L   .WB
    BEQ.S   .11B
    BSET    #6,D6
.11B:   TST.L   .LINED
    BEQ.S   .11BB
    BSET    #21,D6
.11BB:  TST.L   .NIL
    BEQ.S   .11C
    BSET    #1,D6
.11C:   TST.L   .DBG
    BEQ.S   .11D
    BSET    #22,D6
    BSET    #21,D6
.11D:   TST.L   .OPTI
    BEQ.S   .12
    MOVE.W  #MAXREGVARS,MAXREGALLOC
.12:    MOVE.L  .ABUF(PC),D0
    BEQ.S   .13
    MOVE.L  D0,A0
    MOVE.L  (A0),D0
    CMP.L   #1,D0
    BMI.S   .13
    CMP.L   #1001,D0
    BPL.S   .13
    MULU    #400,D0         ; SEE PARSE "-"
    LSL.L   #8,D0
    ADD.L   D0,BUFADD
.13:
    MOVE.L  D6,CODEPREFS

    MOVE.L  D7,D1
    JSR -$35A(A6)
    MOVE.L  D5,A1
    BRA BACKRA

.SRC:   DC.L    0
.REG:   DC.L    0
.LARGE: DC.L    0
.SYM:   DC.L    0
.NOWRN: DC.L    0
.QUIET: DC.L    0
.ASM:   DC.L    0
.ERRL:  DC.L    0
.ERRB:  DC.L    0
.SBUF:  DC.L    0
.ABUF:  DC.L    0
.ICA:   DC.L    0
.HOLD:  DC.L    0
.WB:    DC.L    0
.LINED: DC.L    0
.OPTI:  DC.L    0
.DBG:   DC.L    0
.NIL:   DC.L    0

TEMPLATE:   DC.B    'SOURCE/A,REG=NUMREGALLOC/N/K,LARGE/S,'
            DC.B    'SYM=SYMBOLHUNK/S,NOWARN/S,'
            DC.B    'QUIET/S,ASM/S,ERRLINE/S,ERRBYTE/S,'
            DC.B    'SHOWBUF/S,ADDBUF/N/K,IGNORECACHE/S,'
            DC.B    'HOLD/S,WB/S,LINEDEBUG/S,OPTI/S,'
            DC.B    'DEBUG/S,NILCHECK/S',0
            EVEN
KICKVERS:   DC.W    0
ARGLEN:     DC.L    0   ; =0 IF NO ARGS
ARGADR:     DC.L    0
HANDLE:     DC.L    0
LINEWRITE:  DC.W    0
DOSBASE:    DC.L    0
UTILBASE:   DC.L    0
MATHBASE:   DC.L    0
KILLFLAG:   DC.W    0   ; IF -1 THEN KILL EXE
STOUT:      DC.L    0
CONOUT:     DC.W    0   ; FLAG: true->STDOUT=CON:,asmone
CDLOCK:     DC.L    0
GOTLOCK:    DC.W    0
RETERROR:   DC.W    -1
ASSLINE:    DC.W    0   ; LINENUM OF LAST A=1
ERARGS:     DC.L    0,0,0,0,0
RETURNOUT:  DC.B    10
ERTEXT:     DC.B    'ERROR: '
ERTEXTEND:
ERLINE:     DC.B    'LINE %ld: %s',10,0
EROBJLINE:  DC.B    'WITH: %s',10,0
      DC.B    '$VER: '
TITLE:  CREATIVE_VERSION
TITLEEND:   DC.B    0
      EVEN
;; split name
SPLITNAME:
    MOVE.L  #NAMEBUF,A0
    MOVE.L  A0,A1       ; A1=BEGBUF
    LOWER   A0,D0
.XL:CMPA.L  A0,A1
    BEQ.S   .D
    MOVEQ   #0,D0
    MOVE.B  -(A0),D0
    CMP.W   #":",D0
    BEQ.S   .DM
    CMP.W   #"/",D0
    BEQ.S   .DM
    BRA.S   .XL
.DM:    ADDQ.L  #1,A0       ; A0=MIDBUF
.D: MOVE.L  #SRCDIRBUF,A2   ; A2=DIRBUF
    MOVE.L  A2,A4
    MOVE.L  A1,A3
.L1:    CMPA.L  A3,A0
    BEQ.S   .E1
    MOVE.B  (A3)+,(A4)+
    BRA.S   .L1
.E1:    CLR.B   (A4)+
    MOVE.L  A0,A3
    MOVE.L  A1,A4
.L2:    MOVE.B  (A3)+,(A4)+
    BNE.S   .L2
    MOVE.L  ARGLEN(PC),D0
    ADD.L   A1,D0
    SUB.L   A0,D0
    MOVE.L  D0,ARGLEN
    TST.B   (A2)
    BEQ.S   .1
    MOVE.L  DOSBASE(PC),A6
    MOVE.L  A2,D1
    MOVEQ   #-2,D2
    JSR -$54(A6)    ; LOCK
    BEQ.S   .1
    MOVE.L  #FIB,A2
    MOVE.L  A2,D2
    MOVE.L  D0,D1
    MOVE.L  D0,D3
    JSR -$66(A6)
    TST.L   4(A2)       ; IS IT A DIR?
    BMI.S   .2
    MOVE.L  D3,D1
    JSR -$7E(A6)    ; CURRENTDIR
    MOVE.L  D0,CDLOCK
    MOVE.W  #-1,GOTLOCK
.1: RTS
.2: MOVE.L  D3,D1
    JSR -$5A(A6)    ; UNLOCK
    RTS
;*-*
;; close lock
CLOSELOCK:
    TST.W   GOTLOCK
    BEQ.S   .1
    MOVE.L  DOSBASE(PC),A6
    MOVE.L  CDLOCK(PC),D1
    JSR -$7E(A6)    ; CURRENTDIR
    MOVE.L  D0,D1
    JSR -$5A(A6)    ; UNLOCK
.1: RTS
;*-*
;; open file
OPENFILE:
    BSR SPLITNAME
    MOVE.W  #7,CURSPOT
    MOVE.L  #NAMEBUF,A2     ; FIX '.E'
    ADD.L   ARGLEN(PC),A2       ; A2=MIDARG
    MOVE.B  #'.',(A2)
    MOVE.B  #'e',1(A2)
    MOVE.B  #0,2(A2)
    MOVE.L  #NAMEBUF,D0
    BSR.W   FILELENGTH      ; GET FILELENGTH
    CMP.L   #1,D0
    BMI ERROR16
    MOVE.L  D0,D7           ; D7=SIZE (-4)
    ADDQ.L  #4,D0           ; FIX MEM
    BSR NEW
    TST.L   D0
    BEQ ERROR38
    MOVE.L  D0,D6           ; D6=ADR
    MOVE.L  DOSBASE(PC),A6      ; OPEN FILE
    MOVE.L  #NAMEBUF,D1
    MOVE.L  #1005,D2
    JSR -30(A6)
    MOVE.B  #0,(A2)
    MOVE.L  D0,HANDLE
    BEQ ERROR16
    MOVE.L  D6,D4           ; READ DATA
    MOVE.L  D7,D3
    MOVE.L  D4,D2
    MOVE.L  HANDLE(PC),D1
    MOVE.L  DOSBASE(PC),A6
    ADDQ.L  #1,D4
    JSR -42(A6)
    MOVE.L  D0,D4
    MOVE.L  DOSBASE(PC),A6      ; CLOSE IT
    MOVE.L  HANDLE(PC),D1
    JSR -36(A6)
    CMP.L   D4,D7
    BNE ERROR16
    ADD.L   D6,D4
    MOVE.L  D4,ENDECODE     ; SET POINTERS
    MOVE.L  D4,A0
    MOVE.B  #10,(A0)+
    MOVE.B  #10,(A0)+
    MOVE.L  D6,D4
    MOVE.L  D4,CURECODE
    MOVE.L  D4,ECODE
    ADDQ.L  #4,D7
    MOVE.L  D6,EBUF
    MOVE.L  D7,EBUFSIZE
    RTS
;*-*
;; file length
FILELENGTH:           ; FILENAME-->D0-->LEN
    MOVEM.L D1-D2/D4/D6/D7/A6,-(A7)
    MOVE.L  D0,D1
    MOVEQ   #-2,D2
    MOVE.L  DOSBASE(PC),A6
    JSR -84(A6)
    MOVE.L  D0,D7           ; LOCK
    BEQ.S   .1
    MOVE.L  D0,D1
    MOVE.L  #-260,D4        ; FRAME WITH BCPL ADDRESS CONV.
    MOVE.L  A7,D0
    BTST    #1,D0
    BEQ.S   .4
    SUBQ.L  #2,D4
.4: LEA 0(A7,D4.L),A7
    MOVE.L  A7,D2
    JSR -102(A6)        ; EXAMINE
    MOVE.L  124(A7),D6      ; GET LENGTH FROM FIB
    NEG.L   D4
    LEA 0(A7,D4.L),A7
    TST.L   D0
    BEQ.S   .2
    BSR .3
    MOVE.L  D6,D0
    BRA.S   .EX
.3: MOVE.L  D7,D1           ; UNLOCK
    JSR -90(A6)
    RTS
.2: BSR.S   .3
.1: MOVEQ   #-1,D0
.EX:    MOVEM.L (A7)+,D1-D2/D4/D6/D7/A6
    RTS
;*-*
;; to front
TOFRONT:
    BTST    #6,CODEPREFS+3      ; -w
    BEQ.S   .2
    LEA INITINTUI,A1
    MOVEQ   #0,D0
    MOVE.L  4.W,A6
    JSR -552(A6)
    TST.L   D0
    BEQ.S   .2
    MOVE.L  D0,A6
    JSR -342(A6)
    MOVE.L  A6,A1
    MOVE.L  4.W,A6
    JSR -414(A6)
.2: RTS
;*-*
;; write buffers
WRITEBUFFERS:
    BTST    #1,CODEPREFS+2
    BNE .C
    RTS
.C: LEA HEAP(PC),A0
    MOVE.L  8(A0),D0
    ADD.L   12(A0),D0
    SUB.L   (A0),D0
    MOVE.L  GENERALSIZE,D1
    MOVE.L  D1,12(A0)
    SUB.L   D0,D1
    ADD.L   8(A0),D1
    MOVE.L  D1,(A0)
    LEA BTAB(PC),A5
    MOVEQ   #NUMBUFS-1,D5
.XL:LEA .MES(PC),A0
    LEA ERARGS(PC),A1
    MOVE.L  (A5)+,A4
    MOVE.L  (A5)+,(A1)      ; bufname
    MOVE.L  (A4),D0
    SUB.L   8(A4),D0
    MOVE.L  D0,4(A1)        ; used
    MOVE.L  12(A4),D1
    MOVE.L  D1,12(A1)       ; maxbuf
    LSR.L   #8,D0
    LSR.L   #8,D1
    MULU    #100,D0
    DIVU    D1,D0
    AND.L   #$FFFF,D0
    ADDQ.L  #1,D0
    MOVE.L  D0,8(A1)        ; percentage
    MOVE.L  (A5)+,D0
    LSL.L   #2,D0
    MOVE.L  .T(PC,D0.L),16(A1)  ; MAX/DYN/EXP
    BSR WRITEFORMAT
    DBRA    D5,.XL
    RTS
.MES:   DC.B    '%s buffer used %ld (%ld%%) of %ld (%s).',10,0
    EVEN
.T: DC.L    .1,.2,.3
.1: DC.B    'fixed',0
.2: DC.B    'reallocatable',0
.3: DC.B    'expandable',0
    EVEN
;*-*
;; clear hash table
CLEARHASHTAB:
    LEA     LIBHASH,A1
    MOVE.L  #255,D0
.1:
    CLR.L   (A1)+
    DBRA    D0,.1
    RTS
;*-*
;*-*

;; Write file
;; WriteExe
WRITEEXE:
    MOVE.W  #8,CURSPOT
    TST.L   ARGLEN
    BNE.S   .1
    RTS
.1: TSTMOD
    BNE WRITEMODULE
    MOVE.L  #NAMEBUF,D1
    MOVE.L  LIBINFO(PC),D0
    BEQ.S   .NL
    MOVE.L  D0,A0
    MOVE.L  (A0),D1
.NL:    MOVE.L  #1006,D2
    MOVE.L  DOSBASE(PC),A6
    JSR -30(A6)
    MOVE.L  D0,HANDLE
    BEQ ERROR17

    MOVE.L  CODEAMOUNT(PC),D4
    LSR.L   #2,D4
    MOVE.L  D4,CODESIZE
    MOVE.L  D4,CODESIZE2
    MOVE.L  D4,CODESIZE3

    BTST    #5,CODEPREFS
    BNE     .LINKABLE

    MOVE.L  #HUNK,D2
    MOVEQ   #32,D3
    BSR WRITEFILE
    BRA     .DALEJ
.LINKABLE:
    MOVE.L  #LHUNK,D2
    MOVEQ   #16,D3
    BSR     WRITEFILE

.DALEJ:
    MOVE.L  ACODE(PC),D2
    MOVE.L  CURACODE(PC),D3
    SUB.L   D2,D3
    BSR WRITEFILE

    MOVE.L  LINEBUF(PC),D2
    BEQ.S   .2
    MOVE.L  LINEBUFCUR(PC),D3
    CMP.L   LINEBUFCURSTART(PC),D3  ; ONLY IF LINEDEBUGSIZE<>0
    BEQ.S   .2
    SUB.L   D2,D3
    MOVE.L  D3,D4
    SUBQ.L  #8,D4
    LSR.L   #2,D4
    MOVE.L  D2,A0
    MOVE.L  D4,4(A0)
    BSR WRITEFILE
    BSR WRITEEVARONLY
    LEA DEBUGLIST(PC),A5
.XL:MOVE.L  (A5),D0
    BEQ.S   .2
    MOVE.L  D0,A5
    MOVE.L  4(A5),D2
    MOVE.L  D2,A0
    MOVE.L  4(A0),D3
    MOVE.L  8(A5),D0
    OR.L    #$4C000000,D0
    MOVE.L  D0,12(A0)
    LSL.L   #2,D3
    ADDQ.L  #8,D3
    CMP.L   #$3F1,0(A0,D3.L)
    BNE.S   .NEVAR
    MOVE.L  4(A0,D3.L),D0       ; ADD EVAR HUNK
    ADDQ.L  #2,D0
    LSL.L   #2,D0
    ADD.L   D0,D3
.NEVAR: BSR WRITEFILE
    BRA.S   .XL
.2:
    MOVE.L  #ENDHUNK,D2
    MOVEQ   #4,D3
    BSR WRITEFILE
    MOVE.L  DOSBASE(PC),A6
    MOVE.L  HANDLE(PC),D1
    JSR -36(A6)
    RTS
;*-*
;; WriteModule
WRITEMODULE:
    MOVE.L  #NAMEBUF,A2     ; FIX '.M'
    ADD.L   ARGLEN(PC),A2       ; A2=MIDARG
    MOVE.B  #'.',(A2)
    MOVE.B  #'m',1(A2)
    MOVE.B  #0,2(A2)

    MOVE.L  #NAMEBUF,D1     ; OPEN MODULE FOR WRITING
    MOVE.L  #1006,D2
    MOVE.L  DOSBASE(PC),A6
    JSR -30(A6)
    MOVE.L  D0,HANDLE
    BEQ ERROR17

    MOVE.L  #.1,D2          ; WRITE "EMOD" HEADER
    MOVEQ   #4,D3
    BSR WRITEFILE

    BSR WRITESYSINFOS
    BSR WRITECODEINFOS
    BSR WRITERELOCINFOS
    BSR WRITEPROCINFOS
    BSR WRITEGLOBINFOS
    BSR WRITEOBJECTINFOS
    BSR WRITECONSTINFOS
    BSR WRITEMODINFOS
    BSR WRITEDEBUGINFOS
    BSR PREPSAVEMACROS

    MOVE.L  #.2,D2          ; WRITE END
    MOVEQ   #2,D3
    BSR WRITEFILE

    MOVE.L  DOSBASE(PC),A6
    MOVE.L  HANDLE(PC),D1
    JSR -36(A6)

    MOVE.L  #NAMEBUF,D0     ; FLUSH THE MODULE
    MOVE.L  D0,A0
    LOWER   A0,D1

    BSR FLUSHMODULE

    RTS
.1: DC.L    "EMOD"          ; HEADER
.2: DC.W    0           ; END


WRITEFILE:            ; D2=ADR,D3=LEN
    MOVE.L  HANDLE(PC),D1
    MOVE.L  DOSBASE(PC),A6
    JSR -48(A6)
    RTS

CODEAMOUNT:   DC.L    0

HUNK:
    DC.L    1011            ; hunkheader
    DC.L    0,1,0,0         ; endofnames,1hunk,firsthunkno,lasthn
CODESIZE:
    DC.L    0           ; CODESIZE/4 hunklentab
    DC.L    1001            ; hunkcode
CODESIZE2:
    DC.L    0           ; CODESIZE/4
ENDHUNK:
    DC.L    1010            ; last
LHUNK:
    DC.L    $3e7
    DC.L    0,$3e9
CODESIZE3:
    DC.L    0

;; Evars
WRITEEVARONLY:
    MOVE.L  #ESTACKBUF,A4       ; A4=BUF,D4=BEGIN
    MOVE.L  A4,D4
    MOVE.L  #$3F1,(A4)+     ; HUNK_DEBUG
    CLR.L   (A4)+           ; HUNKLEN
    CLR.L   (A4)+
    MOVE.L  #"EVAR",(A4)+       ; "EVAR"
    LEA DBLIST(PC),A5       ; A5=LIST
    TST.L   (A5)
    BEQ.W   .OUT
.XL:MOVE.L  (A5),D0
    BEQ.S   .X
    MOVE.L  D0,A5
    MOVEQ   #0,D3           ; D3=WLEN
    CMP.W   #4,4(A5)
    BNE.S   .1
    MOVE.W  6(A5),D3
    LSR.W   #1,D3
    ADDQ.L  #1,D3
    BRA.S   .2
.1: MOVE.W  8(A5),D3
    ADDQ.L  #2,D3
.2: LEA 4(A5),A0
.CL:    MOVE.W  (A0)+,(A4)+
    DBRA    D3,.CL
    CHESTB  A4,D0,3,ERROR37

    CMP.W   #4,4(A5)
    BNE.S   .NSELF
    CMP.W   #5,(A0)
    BNE.S   .NSELF
    MOVE.L  (A0)+,(A4)+
    MOVE.L  (A0)+,(A4)+
.NSELF:
    BRA.S   .XL
.X: MOVE.L  A4,D3
    SUB.L   D4,D3
    BTST    #1,D3
    BEQ.S   .LE
    CLR.W   (A4)+
    ADDQ.L  #2,D3
.LE:    MOVE.L  D4,A0
    MOVE.L  D3,D0
    SUBQ.L  #8,D0
    LSR.L   #2,D0
    MOVE.L  D0,4(A0)
    MOVE.L  D4,D2
    BSR WRITEFILE
.OUT:   RTS
;*-*
;; Debug infos
WRITEDEBUGINFOS:
    TST.L   LINEBUF
    BEQ.S   .2
    MOVE.L  LINEBUFCUR(PC),D3   ; TEST EMPTYNESS
    CMP.L   LINEBUFCURSTART(PC),D3
    BEQ.S   .2
    MOVE.L  #.4,D2          ; WRITE DEBUGHEAD
    MOVE.L  #2,D3
    BSR WRITEFILE
    MOVE.L  LINEBUF(PC),D2
    MOVE.L  LINEBUFCUR(PC),D3   ; WRITE LINE-DEBUG HUNK
    SUB.L   D2,D3
    MOVE.L  D3,D4
    SUBQ.L  #8,D4
    LSR.L   #2,D4
    MOVE.L  D2,A0
    MOVE.L  D4,4(A0)        ; LEN
    BSR WRITEFILE
    BSR WRITEEVARONLY
    MOVE.L  #.3,D2          ; WRITE LEN NO FURTHER INFOS
    MOVE.L  #4,D3
    BSR WRITEFILE
.2: RTS
.3: DC.L    0
.4: DC.W    10
;*-*
;; Code infos
WRITECODEINFOS:
    MOVE.L  CODEAMOUNT(PC),D4
    BEQ.S   .X
    LSR.L   #2,D4
    MOVE.L  D4,.1+2
    MOVE.L  #.1,D2
    MOVEQ   #6,D3
    BSR WRITEFILE
    MOVE.L  ACODE(PC),D2        ; WRITE CODE
    MOVE.L  CODEAMOUNT(PC),D3
    BSR WRITEFILE
.X: RTS
.1: DC.W    3
    DC.L    0
;*-*
;; Reloc infos
RELOCTABSTART:    DC.L    0

WRITERELOCINFOS:
    MOVE.L  NUMRELOC(PC),D4
    BEQ.S   .X
    MOVEQ   #2,D3
    MOVE.L  #.1,D2
    BSR WRITEFILE
    LSL.L   #2,D4
    ADDQ.L  #4,D4           ; WRITE NUM ALSO
    MOVE.L  RELOCTABSTART(PC),A0
    MOVE.L  -4(A0),(A0)
    MOVE.L  A0,D2
    MOVE.L  D4,D3
    BSR WRITEFILE
.X: RTS
.1: DC.W    7
;*-*
;; Object infos
WRITEOBJECTINFOS:     ; for objects & members -SAME-
    MOVE.L  #ESTACKBUF,D5   ; EStackBuffer
    MOVE.L  D5,A5           ; D5,A5=BUF
    LEA OLIST+4,A3          ; A3=ObjectLIST
    MOVEQ   #0,D7           ; D7=OBJECT COUNT
.XL:MOVE.L  ONEXT(A3),A3    ; Next object
    MOVE.L  A3,D0           ; End of list?
    BEQ.W   .E              ; .E(nd)
    TST.L   OACC(A3)        ; Access -> TEMP: HAVE TO EXPORT
    BNE.S   .1              ; we have to.
    BTST    #0,OFLAGS(A3)   ; #0 -> OPT EXPORT?
    BEQ.S   .XL             ; No; skip the object, get another one.
.1: BTST    #1,OFLAGS(A3)   ;
    BNE.S   .XL             ;
    ADDQ.L  #1,D7           ; Ok, let's parse this object.
    MOVE.W  #2,(A5)+        ; #2 = OBJECT JOB
    CLR.L   (A5)+           ; SKIPSIZE
    MOVE.W  OSIZE(A3),D1    ; D1=OHEADSIZE
    MOVE.W  #-1,OSIZE(A3)   ;
    MOVE.L  A3,A0           ;
    BSR .DOREC              ;
    LEA OMEMB+4(A3),A4      ; list of members in A4
.ML:MOVE.L  ONEXT(A4),A4    ; next member; ONEXT=-4!!!! Look at previous command
    MOVE.L  A4,D0           ; Reached last one?
    BEQ.W   .EOO            ; Yes.
    MOVE.L  A4,A0           ;
    BTST    #0,OFLAGS(A0)   ; EXPORT?
    BNE.S   .ML             ; No.
    BSR .DOREC              ; Yes -> copy member name
    BTST    #1,OFLAGS(A0)   ; Object typed?
    BEQ.S   .NT             ; No.
    MOVE.L  OPTRTYPE(A0),D0 ; pointer to objectname
    MOVE.L  D0,D4           ;
    AND.L   #$FFFFFFF0,D4   ; ptr to object or LONG/INT/CHAR?
    BEQ.S   .NO             ; no objects->jump
    MOVE.L  D0,A2           ;
    MOVEQ   #-1,D0          ;
.NO:
    MOVE.W  D0,(A5)+        ;
    TST.L   D0              ; temporarily set name to -1
    BPL.S   .NTS            ;
    CLR.W   (A5)+           ;
    MOVE.L  A5,D4           ;
    MOVE.L  OASCII(A2),A2   ; object name (ptr to objectname)
.CL:MOVE.B  (A2)+,(A5)+
    BNE.S   .CL
    MOVE.L  A5,D0           ;
    BTST    #0,D0           ; even length
    BEQ.S   .EE             ;
    CLR.B   (A5)+           ;
.EE:MOVE.L  A5,D0
    SUB.L   D4,D0           ;
    MOVE.L  D4,A2           ;
    MOVE.W  D0,-(A2)        ; Set ptrname length
    BRA.S   .NTS            ;
.NT:CLR.W   (A5)+           ; object not typed and no name copied
.NTS:
    CHESTB  A5,D0,5,ERROR37 ;
    BRA.W   .ML             ;
.E: MOVE.L  D5,D2           ;
    MOVE.L  A5,D3           ;
    SUB.L   D2,D3           ;
    MOVE.L  D5,A5           ;
    MOVE.L  D3,D5           ;
    SUBQ.L  #6,D5           ;
    MOVE.L  D5,2(A5)        ; ptr to <another>
    TST.L   D7              ;
    BEQ.S   .LEAVE          ;
    BSR WRITEFILE           ;
.LEAVE: RTS                 ;


.DOREC: MOVE.W  #-1,(A5)+       ; len=-1 (no id)
    MOVE.W  OSIZE(A0),(A5)+     ; copy object size
    MOVE.W  OOFF(A0),(A5)+      ; copy delegates offset
    MOVE.L  A5,A1               ;
    MOVE.L  OASCII(A0),A2       ; object ascii name
    MOVE.L  A2,D0               ; or <NIL>
    BEQ.S   .PRIV               ; if private
.DL:
    MOVE.B  (A2)+,(A5)+         ; copy object name
    BNE.S   .DL                 ;
    MOVE.L  A5,D0               ;
    BTST    #0,D0               ; must be word aligned
    BEQ.S   .EQ                 ;
    CLR.B   (A5)+               ;
.EQ:MOVE.L  A5,D0               ; id len
    SUB.L   A1,D0               ;
    MOVE.W  D0,-6(A1)           ; it's the thing we've set to "-1" at start of this part
.PRIV:  RTS                     ;


; FOLLOWING CODE IS USED ONLY WHEN OBJECT HAS A METHODS!


.EOO:   CLR.W   (A5)+           ; "END OF OBJECTS"
    MOVE.W  D1,(A5)+            ; ???

    ; LEAVE A3,A5, D5,D7

    MOVE.W  ODEL(A3),(A5)+      ; DELSIZE:INT
    BEQ.W   .ECL
    MOVE.L  ODCODE(A3),D0
    SUB.L   ACODE,D0
    MOVE.L  D0,(A5)+            ; DELCODE:OFF
    CLR.W   (A5)+               ; SUPERASCLEN:INT
    MOVE.W  ODELOFF(A3),(A5)+   ; ODELOFF:INT
    MOVE.W  ODESTR(A3),(A5)+    ; ODESTR:INT
    LEA OMETHOD(A3),A0
.MEL:   MOVE.L  (A0),D0
    BEQ.S   .MEX
    MOVE.L  D0,A0               ; (A0=METHOD)
    MOVE.L  M_TYPE(A0),(A5)+    ; TYP:CHAR,FL:CHAR,OFF:INT
    ADDQ.L  #2,A5               ; ASCLEN:INT
    MOVE.L  A5,A1               ; (A1=PATCHBACK)
    MOVE.L  M_NAME(A0),A2
.MLL:   MOVE.B  (A2)+,(A5)+     ; ASCBYTES
    BNE.S   .MLL
    MOVE.L  A5,D0
    ADDQ.L  #1,D0
    BCLR    #0,D0
    MOVE.L  D0,A5
    SUB.L   A1,D0
    MOVE.W  D0,-2(A1)
    MOVE.L  M_PROC(A0),A1       ; (A1=PROC)
    MOVE.W  (A1),(A5)+          ; NARGS:INT


    MOVE.L  6(A1),D0            ; LISTLEN:INT, LIST:LONGS
    BEQ.S   .DZERO
    MOVE.L  D0,A2
    MOVE.W  (A2)+,D0
    MOVE.W  D0,(A5)+
    BEQ.S   .DDONE
    SUBQ.W  #1,D0
.DEFAL: MOVE.L  (A2)+,(A5)+
    DBRA    D0,.DEFAL
    BRA.S   .DDONE
.DZERO: CLR.W   (A5)+
.DDONE:
    BRA.S   .MEL
.MEX:   MOVE.W  #-1,(A5)+       ; END -> TYP+FL = -1

    LEA OACC(A3),A0
.AL:MOVE.L  (A0),D0         ; LISTOF CODE:OFF, TYP:INT
    BEQ.S   .AX
    MOVE.L  D0,A0
    MOVE.W  8(A0),(A5)+
    MOVE.L  4(A0),D0
    SUB.L   ACODE(PC),D0
    MOVE.L  D0,(A5)+
    BRA.S   .AL
.AX:    MOVE.W  #-1,(A5)+       ; END -> -1:INT

.ECL:   
    BRA .XL
;*-*
;; Sys infos
WRITESYSINFOS:
    MOVE.L  #ESTACKBUF,D2
    MOVE.L  D2,A5           ; D5,A5=BUF
    MOVE.W  #5,(A5)+
    MOVE.L  MINSTACK(PC),(A5)+
    MOVE.W  OSVERSION(PC),(A5)+
    MOVE.L  CODEPREFS(PC),(A5)+
    MOVE.L  ECPU(PC),(A5)+      ; CPU+FPU
    MOVE.W  ASMCPU(PC),(A5)+
    MOVE.W  #CURVERSION,(A5)+
    CLR.L   (A5)+
    MOVEQ   #24,D3          ; HEAD+22
    BSR WRITEFILE
    RTS
;*-*
;; Const infos
WRITECONSTINFOS:
    MOVE.L  #ESTACKBUF,D5
    MOVE.L  D5,A5           ; D5,A5=BUF
    MOVE.W  #1,(A5)+
    CLR.L   (A5)+           ; SKIPSIZE
    MOVE.L  #CONSTHASH,A3
    MOVEQ   #0,D7           ; #OF CONST WRITTEN
    LEA 1024(A3),A4
    MOVE.L  A4,D3
.OL:    CMP.L   A3,D3
    BEQ.S   .X
    LEA (A3),A4
    ADDQ.L  #4,A3
.IL:    MOVE.L  (A4),A4
    MOVE.L  A4,D4
    BEQ.S   .OL
    BTST    #0,CFLAGS(A4)
    BEQ.S   .IL
    ADDQ.L  #1,D7
    MOVE.L  A5,A6
    ADDQ.L  #2,A5
    MOVE.L  CVAL(A4),(A5)+
    MOVE.L  CASCII(A4),A2
.CL:    MOVE.B  (A2)+,(A5)+
    BNE.S   .CL
    MOVE.L  A5,D0
    BTST    #0,D0
    BEQ.S   .EVEN
    CLR.B   (A5)+
.EVEN:  MOVE.L  A5,D0
    SUB.L   A6,D0
    SUBQ.L  #6,D0
    MOVE.W  D0,(A6)
    CHESTB  A5,D0,5,ERROR37
    BRA.S   .IL
.X: CLR.W   (A5)+
    MOVE.L  D5,D2
    MOVE.L  A5,D3
    SUB.L   D2,D3
    MOVE.L  D5,A5
    MOVE.L  D3,D5
    SUBQ.L  #6,D5
    MOVE.L  D5,2(A5)
    TST.L   D7
    BEQ.S   .LEAVE
    BSR WRITEFILE
.LEAVE: RTS
;*-*
;; Proc infos
WRITEPROCINFOS:
    MOVEQ   #0,D1           ; D1=PROC COUNT
    MOVE.L  #ESTACKBUF,D5
    MOVE.L  D5,A5           ; D5,A5=BUF
    MOVE.W  #4,(A5)+
    MOVE.L  LABM+8,A0       ; A0=LABELBUF
    MOVE.L  ACODE,D3        ; D3=ACODE
    MOVE.L  #IDENTHASH+4,D6
    MOVE.L  #IDENTHASH+1028,D7  ; D6,D7=IDENTBUF,END
.OLOOP: MOVE.L  D6,A4
    ADDQ.L  #4,D6
    CMP.L   D6,D7
    BEQ .EX
.LOOP:  MOVE.L  -(A4),A4
    MOVE.L  A4,D4
    BEQ.S   .OLOOP
    CMP.B   #LAB,4(A4)
    BNE.S   .LOOP
    BTST    #2,5(A4)        ; MUST BE EXPORT
    BEQ.S   .LOOP
    BTST    #4,5(A4)        ; MUSN'T BE METHOD
    BNE.S   .LOOP
    ADDQ.L  #1,D1
    MOVE.L  (A4),A3         ; ident record
    MOVE.L  A5,A2
    ADDQ.L  #2,A5
.COPY:  MOVE.B  (A3)+,(A5)+ ; COPY IDENTIFIER
    BNE.S   .COPY
    MOVE.L  A5,D0
    SUB.L   A2,D0
    SUBQ.L  #2,D0
    BTST    #0,D0
    BEQ.S   .1
    CLR.B   (A5)+
    ADDQ.L  #1,D0
.1: MOVE.W  D0,(A2)         ; set lenght

    CHESTB  A5,D0,5,ERROR37

    MOVEQ   #0,D0
    MOVE.W  10(A4),D0       ; LABEL-ID
    LSL.L   #2,D0
    MOVE.L  0(A0,D0.L),D0
    SUB.L   D3,D0
    MOVE.L  D0,(A5)+

    MOVE.L  6(A4),D0
    BEQ     .LAB
    MOVE.W  #1,(A5)+        ; THIS IS A PROC
    MOVE.L  D0,A3
    MOVE.W  (A3),(A5)+      ; NRARG
    MOVE.W  4(A3),(A5)+     ; NRLOC (NEG)*4

    BTST    #5,2(A3)
    BEQ     .NOREGS
    MOVE.W  #-1,(A5)+
    moveq   #0,d0
    MOVE.W  (A3),D0
    MOVE.W  D0,(A5)+
    MOVE.L   6(a3),a2
    addq.l  #2,a2
    subq.l  #1,d0
.LOCAL1:
    MOVE.W  (a2)+,(a5)+
    dbf d0,.LOCAL1
    move.l  #0,(a5)+
    BRA .LOOP
.NOREGS:
    MOVE.L  6(A3),D0
    BEQ.S   .DZERO
    MOVE.L  D0,A3
    MOVE.W  (A3)+,D0
    MOVE.W  D0,(A5)+
    BEQ.S   .NDEFA
    SUBQ.W  #1,D0
.DEFAL: MOVE.L  (A3)+,(A5)+
    DBRA    D0,.DEFAL
.NDEFA: MOVE.W  (A3)+,D0
    MOVE.W  D0,(A5)+
    BEQ.W   .LOOP
    SUBQ.W  #1,D0
    MOVE.L  A5,A1
.NL:    MOVE.L  (A3)+,A2
.NL2:   MOVE.B  (A2)+,(A5)+
    BNE.S   .NL2
    MOVE.B  #",",-1(A5)
    DBRA    D0,.NL
    CLR.B   -1(A5)
    MOVE.L  A5,D0
    BTST    #0,D0
    BEQ.S   .11
    CLR.B   (A5)+
.11:    MOVE.L  A5,D0
    SUB.L   A1,D0
    MOVE.W  D0,-2(A1)
    BRA .LOOP
.LAB:   MOVE.W  #2,(A5)+        ; THIS ONE IS A LABEL
    BRA .LOOP
.DZERO: CLR.L   (A5)+
    BRA .LOOP
.EX:    MOVE.W  #-1,(A5)+
    MOVE.L  D5,D2
    MOVE.L  A5,D3
    SUB.L   D2,D3
    TST.L   D1
    BEQ.S   .LEAVE
    BSR WRITEFILE
.LEAVE: RTS
;*-*
;; Globals infos
WRITEGLOBINFOS:
    MOVEQ   #0,D1           ; D1=GLOB COUNT
    MOVE.L  #ESTACKBUF,D5
    MOVE.L  D5,A5           ; D5,A5=BUF
    MOVE.W  #8,(A5)+
    MOVE.W  #SKIPMARK,(A5)+
    CLR.L   (A5)+
    MOVE.L  ACODE,D3        ; D3=ACODE
    MOVE.L  #IDENTHASH+4,D6
    MOVE.L  #IDENTHASH+1028,D7  ; D6,D7=IDENTBUF,END
.OLOOP: MOVE.L  D6,A4
    ADDQ.L  #4,D6
    CMP.L   D6,D7
    BEQ .EX
.LOOP:  MOVE.L  -(A4),A4
    MOVE.L  A4,D4
    BEQ.S   .OLOOP
    CMP.B   #GLOBV,4(A4)
    BNE.S   .LOOP
    MOVE.L  6(A4),D0
    BEQ.S   .LOOP
    MOVE.L  A5,A1           ; A1=BACKUP A5
    MOVE.L  D0,A0           ; A0=GLOBINFO
    ADDQ.L  #1,D1
    BTST    #2,5(A4)
    BEQ.S   .NNAME
    MOVE.L  (A0),A3         ; ASCIIPTR
    MOVE.L  A5,A2
    ADDQ.L  #2,A5
.COPY:  MOVE.B  (A3)+,(A5)+     ; COPY IDENTIFIER
    BNE.S   .COPY
    MOVE.L  A5,D0
    SUB.L   A2,D0
    SUBQ.L  #2,D0
    BTST    #0,D0
    BEQ.S   .1
    CLR.B   (A5)+
    ADDQ.L  #1,D0
.1: MOVE.W  D0,(A2)         ; set lenght
    BRA.S   .2
.NNAME: CLR.W   (A5)+
.2: CHESTB  A5,D0,5,ERROR37
    MOVE.L  4(A0),A0
    MOVE.L  A0,D0
    BEQ.S   .DEL
    BRA.S   .GLT
.GLL:   MOVE.L  4(A0),D0
    SUB.L   D3,D0
    MOVE.L  D0,(A5)+
    MOVE.W  8(A0),(A5)+     ; ADD OPERSIZE (V10+ ONLY)
    MOVE.L  (A0),A0
.GLT:   MOVE.L  A0,D0
    BNE.S   .GLL
    CLR.L   (A5)+
    BRA .LOOP
.EX:    MOVE.W  #-1,(A5)+
    TST.L   D1
    BEQ.S   .LEAVE
    MOVE.L  D5,D2
    MOVE.L  A5,D3
    SUB.L   D2,D3
    MOVE.L  D5,A0
    MOVE.L  D3,D0
    SUBQ.L  #8,D0           ; CHUNKSIZE-HEAD(2)-SKIP(6)
    MOVE.L  D0,4(A0)
    BSR WRITEFILE
.LEAVE: RTS
.DEL:   SUBQ.L  #1,D1
    MOVE.L  A1,A5
    BRA.W   .LOOP
;*-*
;; Modules infos
WRITEMODINFOS:
    MOVEQ   #0,D1           ; D1=MOD COUNT
    MOVE.L  #ESTACKBUF,D5
    MOVE.L  D5,A5           ; D5,A5=BUF
    MOVE.W  #9,(A5)+
    CLR.L   (A5)+
    MOVE.L  ACODE,D3        ; D3=ACODE
    LEA MODINFOLIST,A0
.XL:MOVE.L  (A0),D0
    BEQ.W   .EX
    MOVE.L  D0,A0           ; A0=MODINFO
    MOVE.L  MI_LIST(A0),D0
    BEQ.S   .XL
    MOVE.L  D0,A1           ; A1=PROCCLASS
    
    MOVE.L  MI_NAMEPTR(A0),A3
    MOVE.L  A5,A6           ; A6=BEGIN ONE MOD
    ADDQ.L  #2,A5
.COPY:  MOVE.B  (A3)+,(A5)+     ; COPY MODNAME
    BNE.S   .COPY
    MOVE.L  A5,D0
    SUB.L   A6,D0
    SUBQ.L  #2,D0
    BTST    #0,D0
    BEQ.S   .1
    CLR.B   (A5)+
    ADDQ.L  #1,D0
.1: MOVE.W  D0,(A6)         ; set lenght
    MOVEQ   #0,D4           ; D4=NUMPROCCLASS

.L2:    ;TST.L  PC_ACC(A1)
    ;BEQ.S  .NEXT
    MOVE.W  PC_TYPE(A1),D0
    MOVE.L  PC_INFO(A1),A4      ; A4=ID OR CLASS
    CMP.W   #2,D0
    BNE.S   .3
    MOVE.L  (A4),A3         ; A3=ASC
    TST.L   PC_ACC(A1)      ; PROCC NOACC CHECK
    BEQ.W   .NEXT
    BRA.S   .4
.3: MOVE.L  OASCII(A4),A3
    TST.L   OACC(A4)        ; CLASS NOACC CHECK
    BEQ.W   .NEXT
.4:
    MOVE.W  D0,(A5)+
    ADDQ.L  #1,D4
    ADDQ.L  #1,D1

    MOVE.L  A5,A2
    ADDQ.L  #2,A5
.COPY2: MOVE.B  (A3)+,(A5)+     ; COPY PROCNAME
    BNE.S   .COPY2
    MOVE.L  A5,D0
    SUB.L   A2,D0
    SUBQ.L  #2,D0
    BTST    #0,D0
    BEQ.S   .2
    CLR.B   (A5)+
    ADDQ.L  #1,D0
.2: MOVE.W  D0,(A2)         ; set lenght

    CMP.W   #2,PC_TYPE(A1)
    BNE.S   .5
    MOVE.L  6(A4),D0
    BEQ.S   .7
    MOVE.L  D0,A3
    MOVE.W  (A3),(A5)+
    BRA.S   .8
.7: MOVE.W  #-1,(A5)+
.8: MOVE.L  PC_ACC(A1),A3
    ADDQ.L  #2,A5
    MOVE.L  A5,A4
.L3:    MOVE.L  4(A3),D2
    SUB.L   D3,D2
    MOVE.L  D2,(A5)+
    MOVE.L  (A3),D0
    MOVE.L  D0,A3
    TST.L   D0
    BNE.S   .L3
    MOVE.L  A5,D0
    SUB.L   A4,D0
    LSR.L   #2,D0
    MOVE.W  D0,-2(A4)
    BRA.W   .6

.5: MOVE.L  PC_INFO(A1),A3      ; WE GET HERE FOR CLASS
    MOVE.L  A5,A4
    ADDQ.L  #2,A5
    LEA OACC(A3),A3
    MOVE.L  ACODE(PC),D2
.CLL:   MOVE.L  (A3),D0
    BEQ.S   .CLE
    MOVE.L  D0,A3
    MOVE.L  4(A3),D0
    SUB.L   D2,D0
    MOVE.L  D0,(A5)+
    MOVE.W  8(A3),(A5)+
    BRA.S   .CLL
.CLE:   MOVE.L  A5,D0
    SUB.L   A4,D0
    DIVU    #6,D0
    MOVE.W  D0,(A4)

.6:
.NEXT:  MOVE.L  (A1),D0
    MOVE.L  D0,A1
    CHESTB  A5,D2,3,ERROR37
    TST.L   D0
    BNE.W   .L2
    TST.L   D4
    BNE.S   .10
    MOVE.L  A6,A5
    BRA.S   .11
.10:    CLR.W   (A5)+
.11:    BRA.W   .XL

.EX:    CLR.W   (A5)+
    TST.L   D1
    BEQ.S   .LEAVE
    MOVE.L  D5,D2
    MOVE.L  A5,D3
    SUB.L   D2,D3
    MOVE.L  D5,A0
    MOVE.L  D3,D0
    SUBQ.L  #6,D0           ; CHUNKSIZE-HEAD(2)-SKIP(4)
    MOVE.L  D0,2(A0)
    BSR WRITEFILE
.LEAVE: RTS
;*-*
;*-*
;*-*
;; Internals
;; KillExe
KILLEXE:
    TST.W   KILLFLAG
    BEQ.S   .1
    MOVE.L  DOSBASE(PC),A6
    MOVE.L  #NAMEBUF,D1
    TSTMOD
    BEQ.S   .2
    MOVE.L  D1,A0
.3: TST.B   (A0)+
    BNE.S   .3
    MOVE.B  #".",-1(A0)
    MOVE.B  #"m",(A0)
    CLR.B   1(A0)
.2: JSR -72(A6)
.1: RTS
;*-*
;; CleanUp All
CLEANUPALL:
    BSR CLOSECON
    BSR CLOSELOCK
    BSR FREEBUFFERS
    BSR SETOLDHANDLER
    BSR UNLOCKCACHE
    MOVE.L  4,A6
    MOVE.L  DOSBASE(PC),A1
    JSR -414(A6)
    MOVE.L  UTILBASE,A1
    JSR -414(A6)
    TST.L   MATHBASE
    BEQ.S   .1
    MOVE.L  MATHBASE(PC),A1
    JSR -414(A6)
.1: RTS
;*-*
;; OpenCon
OPENCON:
    MOVE.L  #CONNAME,D1
    MOVE.L  #1006,D2
    MOVE.L  DOSBASE(PC),A6
    JSR -30(A6)
    MOVE.L  D0,STOUT
    BEQ LEAVEFAST       ; NO CON: --> DEEP TROUBLE
    RTS
;*-*
;; HoldCon
HOLDCON:
    MOVEM.L D0-D7/A0-A6,-(A7)
    BTST    #2,CODEPREFS+1
    BEQ.S   .2
    BSR READCON         ; MUST BE READABLE
.2: MOVEM.L (A7)+,D0-D7/A0-A6
    RTS
;*-*
;; CloseCon
CLOSECON:
    BSR HOLDCON
    TST.W   CONOUT
    BEQ.S   .1          ; NO CON: SO DON'T CLOSE IT
    MOVE.L  STOUT(PC),D1
    MOVE.L  DOSBASE(PC),A6
    JSR -36(A6)
.1: RTS
;*-*
;; ReadCon
READCON:
    MOVE.L  WORK(PC),D2
    MOVE.L  #10,D3
READSTRING:           ; D2=ADR, D3=LEN
    MOVE.L  STOUT(PC),D1
    MOVE.L  DOSBASE(PC),A6
    JSR -42(A6)
    RTS
;*-*

;; FixRetValue
FIXRETVALUE:
    MOVEQ   #0,D0
    MOVE.W  RETERROR(PC),D1
    BMI.S   .1
    MOVEQ   #5,D0
    BTST    #3,CODEPREFS+2
    BEQ.S   .2
    MOVE.L  D1,D0
    EXT.L   D0
    ADDQ.L  #1,D0
    BRA.S   .1
.2: BTST    #5,CODEPREFS+3
    BEQ.S   .1
    MOVE.L  BYTEOFF(PC),D0
.1: RTS
;*-*
;; LeaveError
LEAVEERROR:
    BSR ERROR
    BSR KILLEXE
LEAVEOTHERERROR:
    BSR CLEANUPALL
LEAVEFAST:
    MOVE.L  INITSTACK(PC),A7
    BSR.S   FIXRETVALUE
    RTS
;*-*
;; InstallHandler
INSTALLHANDLER:
    ;rts
    ;TST.W  CONOUT          ; DON'T INSTALL IF IN ASMONE
    ;BNE.S  .1
    MOVE.L  4.W,A6
    MOVE.L  276(A6),A0
    MOVE.L  50(A0),OLDTRAP
    MOVE.L  #TRAPHANDLER,50(A0)
    ;DIVU   #0,D0
.1: RTS
;*-*
;; SetOldHandler
SETOLDHANDLER:
    MOVE.L  4.W,A6
    MOVE.L  276(A6),A0
    MOVE.L  OLDTRAP,D0
    BEQ.S   .1
    MOVE.L  D0,50(A0)
.1: RTS
;*-*
;; TrapHandler
TRAPHANDLER:
    MOVE.L  (A7)+,D0
    MOVE.W  D0,GURUNUM
    MOVEQ   #3,D1
    CMP.L   D1,D0           ; BUS/ADR ER?
    BGT.S   .2
    MOVE.L  4.W,A6
    BTST    #0,297(A6)      ; 68010+ ?
    BNE.S   .2
    ADDQ.L  #8,A7
.2: MOVE.L  2(A7),CRASHPC
    MOVE.L  #.3,2(A7)
    RTE
.3: MOVE.W  GURUNUM(PC),D0
    MOVEQ   #31,D1
    BCLR    D1,D0
    CMP.L   #50,D0
    BMI.S   .1
    MOVEQ   #1,D0
.1: MOVE.W  D0,GURUNUM
    MOVE.L  CRASHPC(PC),D0
    SUB.L   #S,D0
    BMI.S   .4
    CMP.L   #100000,D0      ; MAX EXE SIZE EC
    BMI.S   .5
.4: MOVEQ   #0,D0
.5: MOVE.L  D0,CRASHPC
    BSR CHECKCOOKIES
DAMAGEDCOOKIES:           ; ENTRY FOR OWN-GEN ERRORS
    MOVE.W  LINENUM(PC),LINENUMC
    LEA INTERNALMESSY(PC),A0
    LEA CURSPOT(PC),A1
    TST.W   IEEEPROBLEM
    BNE.S   IEEEWARN
    BSR WRITEFORMAT
    BRA LEAVEOTHERERROR
IEEEWARN:
    MOVE.L  #IEEEMESSY,D2
    MOVEQ   #IEEEEND-IEEEMESSY,D3
    BSR WRITECON
    BRA LEAVEOTHERERROR
;*-*


CONNAME:
    DC.B    'CON:40/40/560/80/Amiga E Compiler Output',0
    EVEN

OLDTRAP:  DC.L    0

CURSPOT:  DC.W    0
GURUNUM:  DC.W    0
LINENUMC: DC.W    0
BUFSPOT:  DC.W    0
CRASHPC:  DC.L    0


INTERNALMESSY:    DC.B    "EC INTERNAL ERROR [%d,%d,%d,%d,$%lx] (please report!)",10,0
    EVEN
IEEEMESSY:    DC.B    "PROBLEM: your `mathieeesingbas.library' is"
            DC.B    " not properly patched (see docs)",10
IEEEEND:      EVEN

;*-*

;; 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
    BSR ADDLINEDBG
.1: MOVE.W  D7,LINENUM
    MOVE.W  (A3)+,D7
    BSR DOINSMAIN
    MOVE.L  A4,CURACODE
    BSR 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
    BSR 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   #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

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(PC),A2
    MOVE.L  0(A2,D7.W),A2
JOBLOOP:
    MOVE.W  (A2)+,D7
    TST.W   D7
    BEQ.S   JOBOUT
    ASL.W   #2,D7
    MOVE.L  JOBROUTTAB(PC,D7.W),A0
    JMP (A0)
JOBOUT:
    RTS

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,JOBOUT,JOBOUT             ; 75

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

    TST.W   6(A3)
    BNE     .OT_01
    CMP.W   #IDENT,(A3)
    BNE     .OT_00
    ADDQ.L  #2,A3
    MOVE.W  .C0(PC),(A4)+
    MOVE.L  A4,D5
    JSR     GVA1D2_9
    move.l  (a3)+,a1
    moveq   #0,d1
    cmp.l  a4,d5
    beq     .OT_001
    move.w  -(a4),d1
.OT_001:
    JSR GVA1D2_0
    tst.w   d1
    beq     .OPT
    MOVE.W  D1,(a4)+
    bra .OPT


.C0:MOVE.L  2(A5),2(A5)
.C1:MOVE.L  #0,2(A5)
.C2:CLR.L   2(A5)
.OT_00:
    cmp.w   #VALUE,(A3)
    BRA .OT_01
    tst.l   2(a3)
    beq     .OT_003
    move.l  2(a3),d1
    and.l   #$FFFFFF00,d1
    tst.l   d1
    beq     .OT_01           ; faster - MOVEQ #xx,D0/MOVE.L  D0,xx(A5)
    addq.l  #2,a3
    move.w  .C1(PC),(A4)+
    move.l  a4,d2
    jsr GVA1D2_9
    moveq   #0,d1
    cmp.l   a4,d2
    beq .OT_002
    move.w  -(a4),d1
.OT_002:
    move.l  (a3)+,(a4)+
    tst.w   d1
    beq     .OPT
    move.w  d1,(a4)+
    bra .OPT
.OT_003:
    addq.l  #6,a3
    MOVE.W  .C2(PC),(A4)+
    JSR GVA1D2_0
    BRA .OPT

.OT_01:
    MOVE.W  #17,EAREQUEST
    BSR EAEXP
    TST.L   D0
    BNE.W   .OPT
    MOVE.W  .1(PC),(A4)+
    JSR GVA1D2_9
.OPT:   BRA DOINSOUT
.1: MOVE.L  D0,2(A5)

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    #2,CODEPREFS+3
    BEQ.S   .NL
    MOVE.L  #$30000,-2(A4)
    ADDQ.L  #2,A4
    MOVE.W  D7,-(A7)
    MOVE.W  NEWOP(PC),D7
    BEQ.S   .NNO
    MOVE.W  D7,-6(A4)
.NNO:   MOVE.W  (A7)+,D7
.NL:

    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
    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(PC),(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,50*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
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
;*-*

;; "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
PROCFLAGON:           ; 17
    CLR.L   FIXUPSTACKREGS
    TST.W   PROCF
    BNE ERROR9
    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
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
    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.S   .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.S   .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)
    BSR TINYEXP         ; no EXP allowed!!!
    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)
    IFNE MY_EXP_HANDLER
        BRA .1
    ELSE
        BRA ERROR87
    ENDC
.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:                          ; supported, but not supported ;)
    IFEQ MULTIPLE_PTRS
        BRA ERROR87
    ELSE
    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
    ENDC

.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:
    IFEQ MULTIPLE_PTRS
        BRA ERROR87
    ELSE
        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
    ENDC

.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

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   #VALUE,(A3)+
    BEQ.S   .3
    CMP.W   #IDENT,-2(A3)
    BEQ     .4
    CMP.W   #8,-2(A3)
    BNE ERROR30
    CMP.W   #VALUE,(A3)+
    BNE ERROR30
    NEG.L   (A3)
.3: MOVE.L  (A3)+,(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
DOINT:                ; 40
.2: CMP.W   #VALUE,(A3)+
    BEQ.S   .3
    CMP.W   #8,-2(A3)
    BNE ERROR30
    CMP.W   #VALUE,(A3)+
    BNE ERROR30
    NEG.L   (A3)
.3: MOVE.L  (A3)+,D0
    MOVE.W  D0,(A4)+
    CMP.W   #COM,(A3)
    BNE.S   .1
    ADDQ.L  #2,A3
    BRA.S   .2
.1: BRA JOBLOOP
;*-*
;; 41
DOCHAR:               ; 41
.2: CMP.W   #VALUE,(A3)+
    BEQ.S   .7
    CMP.W   #8,-2(A3)
    BNE.S   .3          ; NO VALUE? --> STRING
    CMP.W   #VALUE,(A3)+
    BNE ERROR30
    NEG.L   (A3)
.7: MOVE.L  (A3)+,D0
    MOVE.B  D0,(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,-2(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 ASM_GRABVALUE
    TST.L   D0
    BMI     .EXP

    MOVE.L  D1,(A5)+
    MOVEQ   #1,D1

    CMP.W   #IOFF+40,(A3)
    BNE     .VAL
    ADDQ.L  #2,A3
    BSR ASM_GRABVALUE
    TST.L   D0
    BPL .VAL

    BSR EXP
    move.w      .CODE01(PC),(A4)+
    move.l  -(a5),-(a7)
    BSR NEWLABEL
    MOVE.L  D0,(A5)+
    BSR ADDLABEL
    BSR NEWLABEL
    MOVE.L  D0,(A5)+
    MOVE.L  D0,LABPRES
    move.l  CURIDENTREC,(A5)+
    move.l  (a7)+,(A5)+
    move.w  #1,(A5)+
    bra JOBLOOP
.VAL:
    move.l  -(a5),d0
    movem.l d0/d1,-(a7)
    BSR NEWLABEL
    MOVE.L  D0,(A5)+
    BSR ADDLABEL
    BSR NEWLABEL
    MOVE.L  D0,(A5)+
    MOVE.L  D0,LABPRES
    movem.l (a7)+,d0/d1
    move.l  CURIDENTREC,(A5)+
    move.l  d0,(a5)+
    move.l  d1,(a5)+
    move.w  #0,(a5)+

    bra JOBLOOP
.EXP:
    bsr EXP
    move.w  .CODE01(PC),(A4)+
    moveq   #1,d1
    cmp.w   #IOFF+40,(A3)
    bne .EXPVAL
    addq.l  #2,a3
    bsr ASM_GRABVALUE
    tst.l   d0
    bpl .EXPVAL
    bsr EXP
    move.w  .CODE01(PC),(A4)+

    BSR NEWLABEL
    MOVE.L  D0,(A5)+
    BSR ADDLABEL
    BSR NEWLABEL
    MOVE.L  D0,(A5)+
    MOVE.L  D0,LABPRES
    move.l  CURIDENTREC,(A5)+
    move.w  #3,(a5)+
    bra JOBLOOP
.EXPVAL:
    move.l  d1,-(a7)
    BSR NEWLABEL
    MOVE.L  D0,(A5)+
    BSR ADDLABEL
    BSR NEWLABEL
    MOVE.L  D0,(A5)+
    MOVE.L  D0,LABPRES
    move.l  CURIDENTREC,(A5)+
    move.l  (a7)+,(a5)+
    move.w  #2,(a5)+
    bra JOBLOOP
.CODE01:
    move.l  d0,-(a7)

;*-*
;; 50
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 
    MOVE.L  INITCODE(PC),(A4)+  ; MAIN
    MOVEQ   #1,D0
    MOVE.W  .1(PC),NEWOP
    BSR ADDBRANCH
    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
;*-*
;; 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 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:    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:               ; 56

    MOVE.L  (A2)+,(A4)+
    move.w  (a2)+,(A4)+
    bra JOBLOOP

    CMP.L   #$488048C0,-4(A4)   ; EXT.W EXT.L
    BNE.S   .1
    CMP.B   #$C0,-5(A4)     ; Scc D0
    BNE.S   .1
    SUBQ.L  #6,A4
    MOVE.B  (A4),D0

    TST.L   -4(A4)          ; OPTIMIZE EVEN FURTHER IF (a=0)
    BNE.S   .2
    CMP.W   #$C80,-6(A4)        ; cmp.l #0,d0
    BNE.S   .2
    SUBQ.L  #6,A4
    MOVE.W  .3(PC),(A4)+
    BSR.S   .4

.2: BCHG    #0,D0
    LSL.W   #8,D0
    ADD.W   #$1000,D0
    MOVE.W  D0,(A4)+
    MOVE.W  #6,(A4)+        ; make Bcc.W lab
    ADDQ.L  #6,A2
    BRA JOBLOOP

.1: MOVE.W  (A2)+,(A4)+
    BSR.S   .4
    MOVE.L  (A2)+,(A4)+
    BRA JOBLOOP
.3: TST.L   D0

.4: CMP.B   #$20,-6(A4)     ; if "move.l x(a5),d0"
    BNE.S   .5B         ; then del "tst.l d0"
    MOVE.B  -5(A4),D7
    CMP.B   #$2D,D7
    BEQ.S   .6
    CMP.B   #$2C,D7
    BNE.S   .5
.6: MOVE.W  -4(A4),D1
    BPL.S   .5
    SUBQ.L  #2,A4
.5: RTS
.5B:    MOVE.W  -4(A4),D7
    AND.W   #%1111111111111000,D7
    CMP.W   #$2000,D7
    BNE.S   .5
    SUBQ.L  #2,A4
    RTS
;*-*
;; 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

    cmp.w   #1,-(a5)
    blt     .VALVAL
    beq     .VALEXP
    cmp.w   #3,(a5)
    blt     .EXPVAL
;; exp end and exp step
    move.w  #8,FIXFORSTACKSIZE
    move.l  -(a5),a1        ; var
    move.l  .CODE02(PC),(A4)+
    move.l  a4,d0
    jsr GVA1D2_0
    cmp.l   a4,d0
    bne     .EE00
    move.w  .CODE05(PC),-2(A4)
    move.w  10(a1),d2
    lsl.w   #8,d2
    lsl.w   #1,d2
    or.w    d2,-2(a4)
.EE00:
    move.w  .CODE02+6(PC),(A4)+
    jsr GVA1D2_0

    move.l  .CODE03(PC),(A4)+
    move.l  .CODE03+4(PC),(A4)+
    move.l  .CODE03+8(PC),(A4)+
    move.l  .CODE03+12(PC),(A4)+
    clr.w   NEWOP
    move.l  -8(a5),d0
    BSR ADDBRANCH

    bra JOBLOOP
;*-*
;; exp end and val step
.EXPVAL:
    move.w  #4,FIXFORSTACKSIZE
    move.l  -(a5),d1        ; step
    move.l  -(a5),a1        ; var
    tst.l   d1
    bmi     .EV02
    cmp.l   #8,d1
    bgt     .EV00
    move.w  .CODE01+8(PC),(A4)
    cmp.l   #8,d1
    beq     .EV01
    lsl.w   #8,d1
    lsl.w   #1,d1
    or.w    d1,(a4)+
.EV01:
    jsr     GVA1D2_0
    bra .EV92
.EV02:
    cmp.l   #-8,d1
    blt     .EV00
    neg.l   d1
    move.w  .CODE01+12(PC),(A4)
    cmp.l   #8,D1
    beq     .EV01
    lsl.w   #8,D1
    lsl.w   #1,d1
    or.w    d1,(a4)+
    bra     .EV01
.EV00:
    move.w  .CODE01(PC),(A4)+
    move.l  a4,d0
    jsr     GVA1D2_0
    moveq   #0,d2
    cmp.l   a4,d0
    beq     .EV91
    move.w  -(a4),d2
.EV91:
    move.l  d1,(a4)+
    tst.w   d2
    beq     .EV92
    move.w  d2,(a4)+
.EV92:
    move.w  .CODE01+16(PC),(A4)+
    JSR GVA1D2_0
    move.w  .CODE01+34(PC),(A4)+
    tst.l   4(a5)
    smi     d2
    and.l   #4,d2
    lea     .CODE01+26(PC),A1
    move.l  (a1,d2),(a4)+
    move.l  -8(a5),d0
    BSR ADDBRANCH

    bra JOBLOOP
;*-*
;; val end and exp step
.VALEXP:
    move.w  #4,FIXFORSTACKSIZE
    move.l  -(a5),d1    ; end
    move.l  -(a5),a1    ; var

    move.l  .CODE02(PC),(A4)+
    move.l  a4,d0
    jsr GVA1D2_0
    cmp.l   a4,d0
    bne     .VE00
    move.w  .CODE05(PC),-2(A4)
    move.w  10(a1),d2
    lsl.w   #8,d2
    lsl.w   #1,d2
    or.w    d2,-2(a4)
.VE00:
    move.w  .CODE02+6(PC),(A4)+
    jsr GVA1D2_0

    move.w  .CODE03-6(PC),(A4)+
    move.l  d1,(a4)+
    move.l  .CODE03+4(PC),(A4)+
    move.l  .CODE03+8(PC),(A4)+
    move.l  .CODE03+12(PC),(A4)+
    clr.w   NEWOP
    move.l  -8(a5),d0
    BSR ADDBRANCH

    bra JOBLOOP
;*-*
;; val end and val step
.VALVAL:
    move.l  -(a5),d1        ; step
    move.l  -(a5),d0        ; last
    move.l  -(a5),a1        ; var
    tst.l   d1
    bmi     .VV02
    cmp.l   #8,d1
    bgt     .VV00
    move.w  .CODE01+8(PC),(A4)
    cmp.l   #8,d1
    beq     .VV01
    lsl.w   #8,d1
    lsl.w   #1,d1
    or.w    d1,(a4)+
.VV01:
    jsr     GVA1D2_0
    bra .VV92
.VV02:
    cmp.l   #-8,d1
    blt     .VV00
    neg.l   d1
    move.w  .CODE01+12(PC),(A4)
    cmp.l   #8,D1
    beq     .VV01
    lsl.w   #8,D1
    lsl.w   #1,d1
    or.w    d1,(a4)+
    bra     .VV01
.VV00:
    move.w  .CODE01(PC),(A4)+
    move.l  a4,d0
    jsr     GVA1D2_0
    moveq   #0,d2
    cmp.l   a4,d0
    beq     .VV91
    move.w  -(a4),d2
.VV91:
    move.l  d1,(a4)+
    tst.w   d2
    beq     .VV92
    move.w  d2,(a4)+
.VV92:
    move.w  .CODE01+16(PC),(A4)+
    JSR GVA1D0_0
    move.w  .CODE01+20(PC),(A4)+
    move.l  4(a5),(A4)+
    tst.l   8(a5)
    smi     d2
    and.l   #4,d2
    lea     .CODE01+26(PC),A1
    move.l  (a1,d2),(a4)+
    move.l  -8(a5),d0
    BSR ADDBRANCH

    bra JOBLOOP
;*-*
.CODE01:
    addi.l  #0,-4(a5)     ; 2+4+2=  8
    addq.l  #8,-4(a5)     ; 2+2=    4
    SUBQ.L  #8,-4(A5)     ; 2+2=    4
    MOVE.L  -4(A5),D0     ; 2+2=    4
    cmp.l   #0,d0         ; 2+4=    6
    ble     .CODE01       ; 2+2=    4
    bge     .CODE01       ; 2+2=    4
    cmp.l   (a7),d0       ; 2=      2
.CODE02:
    move.l  (a7),d0       ; 2=      2
    add.l   d0,-4(a5)     ; 2+2=    4
    move.l  -4(a5),d0     ; 2+2=    4
    move.l  #0,d1
.CODE03:
    move.l  4(a7),d1        ; 2+2=    4
    tst.l   (a7)            ; 2=      2
    bpl.s   .CODE04         ; 2=      2
    exg.l   d1,d0           ; 2=      2
.CODE04:
    cmp.l   d1,d0           ; 2=      2
    ble     .CODE03         ; 2+2=    4
.CODE05:
    ADD.L   D0,D0
;*-*
;; 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

    MOVEM.L  A0/A1,-(A7)

    tst.l   LIBINFO
    BEQ.S   .X3
    JMP ERROR86
.X3
    MOVE.W  #$2879,(a4)+
    MOVE.L  A4STORAGEADR(PC),D0
    BEq ERROR89
    JSR     FORCEABSHERE

    LEA .3(PC),A0
    LEA .X2(PC),A1
.XYZ:
    MOVE.W  (A0)+,(A4)+
    CMPA.L  A0,A1
    BGT .XYZ

    MOVEM.L (A7)+,A0/a1

    MOVE.W  .1(PC),(A4)+
    CMP.W   #0,(A3)+
    BNE ERROR0
    BRA JOBLOOP
.RTR:
    MOVE.W  .2(PC),(A4)+
    CMP.W   #0,(A3)+
    BNE ERROR0
    BRA JOBLOOP
.1: RTE
.2: RTR
.3:
    MOVE.L  (A7)+,D2    ;2
    MOVE.L  D2,-96(A4)
    MOVE.L  #"GURU",-84(A4)
    MOVEQ   #3,D1       ;2
    CMP.L   D1,D2       ;2
    BGT.S   .noadjust   ;2
    MOVE.L  $4.W,A6     ;6
    BTST    #0,297(A6)  ;8
    BNE.S   .noadjust   ;2
    ADDQ.L #8,A7        ;2
.noadjust:
    LEA     .X0(PC),A0
    MOVE.L  A0,2(A7)

    RTE
.X0:
    MOVE.L  -76(A4),D0
    BEQ.S   .X1
    MOVE.L  D0,A0               ; A0=CODE TO JUMP TO
    MOVE.L  -80(A4),A7          ; STACK BACK
    MOVE.L  -88(A4),A5
    MOVE.L  (A7)+,-88(A4)       ; (A5)
    MOVE.L  (A7)+,-76(A4)       ; PUT PREVIOUS HANDLER BACK (CODE)
    MOVE.L  (A7)+,-80(A4)       ; (STACK)
    JMP (A0)
.X1:MOVE.L  -24(A4),A0          ; PERFORM CLEANUP(0)
    JMP (A0)
    RTS
.X2:
;*-*
;; 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
SELECTOF:             ; 71
    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+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)+
    BSR 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)+
    BSR GVA0D1_0
    MOVE.W  .ST3(PC),(A4)+
    MOVE.W  .ISM(PC),(A4)+
    BRA.S   .XB
.0:
    MOVE.W  .ST(PC),(A4)+
    BSR 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)+
    BRA GVA0D1_0
.INUKE: MOVE.W  .NUKE2(PC),(A4)+
    BSR 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
; 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 ERROR9
    MOVE.L  -4-4-4-4(a5),d0
    TST.W   -4(a5)
    bra     .D
    move.l  -4-4-4-4-4(a5),d0
    cmp.w   #2,-4(a5)
    ble     .D
    move.l  -4-4-4-4-4-4(a5),d0
.D: BCHG    #0,-4(A4)       ; negate CC
    CLR.W   NEWOP
    BSR ADDBRANCH
    BRA JOBLOOP
;*-*
;; 76
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:
    moveq   #0,d7
    MOVE.W  FIXFORSTACKSIZE,D7
    beq     JOBLOOP
    MOVE.W  .1(PC),(A4)
    lsl.w   #8,d7
    lsl.w   #1,d7
    or.w  d7,(a4)+
    clr.w   FIXFORSTACKSIZE
    BRA JOBLOOP
.1: addq.l  #8,a7
FIXFORSTACKSIZE:
    DC.W    0
;*-*
;*-*
;;JOB

; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ;
;   Instruction JobCode And Data Part           ;
; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ;

DUM:
INSJOBTAB:
    DC.L    .PROC,.ENDPROC,.IF,.ENDIF,.VOID,.WHILE,.ENDWHILE        ; 0-6
    DC.L    .FOR,.ENDFOR,.SELECT,.CASE,.DEFAULT,.ENDSELECT          ; 7-12
    DC.L    .REPEAT,.UNTIL,.JUMP,.DEF,.LOCAL,.ELSE,.INCBIN          ; 13-19
    DC.L    .LONG,.INT,.CHAR,.INC,.DEC,.THEN,.LOOP,.ENDLOOP         ; 20-27
    DC.L    .ERROR,.ERROR,.ERROR,.ERROR,.ERROR,.ERROR,.ERROR        ; 28-34
    DC.L    .EXIT,.ERROR,.ERROR,.ERROR,.ERROR,.ERROR,.ERROR         ; 35-41
    DC.L    .ERROR,.ERROR,.ERROR,.ERROR,.ELSEIF,.ERROR,.OBJECT      ; 42-48
    DC.L    .ERROR,.ERROR,.RETURN,.ERROR,.ERROR,.ERROR,.ERROR       ; 49-55
    DC.L    .ERROR,.EXCEPT,.ERROR,.ERROR,.ERROR,.END,.ERROR         ; 56-62
    DC.L    .NEW,.ERROR,.ERROR,.SUPER,.ERROR,.ERROR,.ERROR,.ERROR   ; 63-70
    DC.L    .ERROR,.ERROR,.ERROR,.LOOP,.ERROR,.ERROR,.ERROR,.ERROR  ; 71-78
    DC.L    .ELSEWHILE,.ALWAYS                                      ; 79-

.PROC:  DC.W    50,19,17,36,33,1,37,10
        LINK    A5,#-27*4
        DC.W    34,73,72,63,5,1,70,7,1,65,16,18,9
        UNLK    A5
        DC.W    77,68,0

.ENDPROC:
        DC.W    7,1,65,16,18,9
        UNLK    A5
        DC.W    77,68,0

.RETURN:
        DC.W    16,58,0

.EXIT:  DC.W    61,56
        TST.L   D0
        BEQ DUM
        DC.W    75,0

.IF:    DC.W    51,6,61,56
        TST.L   D0
        BEQ DUM
        DC.W    8,5,2,43,IOFF+25,60,45,IOFF+18,7,2,28,10
        BRA DUM
        DC.W    57,29,27,15,26,5,2,60,46,0,7,2,15,54,0

.ELSE:  DC.W    7,2,28,10
        BRA DUM
        DC.W    29,27,15,26,5,2,0

.ELSEIF:DC.W    7,2,28,10
        BRA DUM
        DC.W    27,15,52,26,2,12
        TST.L   D0
        BEQ DUM
        DC.W    29,5,2,0

.ENDIF: DC.W    7,2,15,53,0

.VOID:  DC.W    2,0

.WHILE: DC.W    51,6,20,61,56
        TST.L   D0
        BEQ DUM
        DC.W    8,5,3

        DC.W 43,IOFF+28,42,7,3,21,10
        BRA DUM
        DC.W    8,15,53,0

.ELSEWHILE:
        DC.W    7,3,27,10
        BRA DUM
        DC.W    15,52,21,8,25,20,26,61,56
        TST.L   D0
        BEQ DUM
        DC.W    27,21,8,25,26,5,3,0
.ALWAYS:
        DC.W    7,3,27
        DC.W    21,53,20,25,26
        DC.W    5,3,0

.ENDWHILE:
        DC.W    7,3,21,27,53,26,10
        BRA DUM
        DC.W    8,15,0

.FOR:   DC.W    3,47,2,10
        MOVE.L  D0,2(A5)
        DC.W    35

        DC.W 49,5,4,43,IOFF+28,42,7,4,62
        DC.W    15,21

        DC.W    78

        DC.W 0

.ENDFOR:DC.W    7,4,62
        DC.W    15,21

        DC.W    78

        DC.W    0

.SELECT:DC.W    71,2,9
        MOVE.L  D0,-(A7)
        DC.W    6,28,32,5,5,0

.CASE:  DC.W    7,5,27,31,3,10
        BRA DUM
        DC.W    29,30,15,2,12
        CMP.L   (A7),D0
        BNE DUM
        DC.W    6,8,26,5,5,0

.DEFAULT:
        DC.W    7,5,27,10
        BRA DUM
        DC.W    29,15,6,26,5,5,0

.ENDSELECT:
        DC.W    7,5,15,15,9
        ADDQ.L  #4,A7
        DC.W    0

.REPEAT:DC.W    20,5,6,0

.UNTIL: DC.W    7,6,21,61,56
        TST.L   D0
        BEQ DUM
        DC.W    8,0

.JUMP:  DC.W    1,10
        BRA DUM
        DC.W    59,0

.DEF:   DC.W    33,3,0

.LOCAL: DC.W    33,2,0

.INCBIN:DC.W    38,0

.LONG:  DC.W    39,0

.INT:   DC.W    40,0

.CHAR:  DC.W    41,0

.DEC:   DC.W    3,10
        SUBQ.L  #1,-4(A5)
        DC.W    22,0

.INC:   DC.W    3,10
        ADDQ.L  #1,-4(A5)
        DC.W    22,0

.THEN:  DC.W    44,0

.LOOP:  DC.W    20,5,7,0

.ENDLOOP:
        DC.W    7,7,21,10
        BRA DUM
        DC.W    8,0

.ERROR: DC.W    44,0

.OBJECT:DC.W    55,0

.EXCEPT:DC.W    7,1,64,5,1,0

.NEW:   DC.W    69,0

.END:   DC.W    74,0

.SUPER: DC.W    76,0

;*-*

;;ERROR
ERROR0: MOVEQ   #0,D0
        BRA LEAVEERROR
ERROR1: MOVEQ   #1,D0
        BRA LEAVEERROR
ERROR2: MOVEQ   #2,D0
        BRA LEAVEERROR
ERROR3: MOVEQ   #3,D0
        BRA LEAVEERROR
ERROR4: MOVEQ   #4,D0
        BRA LEAVEERROR
ERROR5: MOVEQ   #5,D0
        BRA LEAVEERROR
ERROR6: MOVEQ   #6,D0
        BRA LEAVEERROR
ERROR7: MOVEQ   #7,D0
        BRA LEAVEERROR
ERROR8: MOVEQ   #8,D0
        BRA LEAVEERROR
ERROR9: MOVEQ   #9,D0
        BRA LEAVEERROR
ERROR10:MOVEQ   #10,D0
        CLR.W   ERRWHERE
        BRA LEAVEERROR
ERROR11:MOVEQ   #11,D0
        BRA LEAVEERROR
ERROR12:MOVEQ   #12,D0
        BRA LEAVEERROR
ERROR13:MOVEQ   #13,D0
        CLR.W   ERRWHERE
        BRA LEAVEERROR
ERROR14:MOVEQ   #14,D0
        BRA LEAVEERROR
ERROR15:MOVEQ   #15,D0
        BRA LEAVEERROR
ERROR16:MOVEQ   #16,D0
        CLR.W   ERRWHERE
        MOVE.L  #NAMEBUF,ERROROBJ
        BRA LEAVEERROR
ERROR17:MOVEQ   #17,D0
        CLR.W   ERRWHERE
        BRA LEAVEERROR
ERROR18:MOVEQ   #18,D0
        CLR.W   ERRWHERE
        BRA LEAVEERROR
ERROR19:MOVEQ   #19,D0
        BRA LEAVEERROR
ERROR20:MOVEQ   #20,D0
        BRA LEAVEERROR
ERROR21:MOVEQ   #21,D0
        BRA LEAVEERROR
ERROR22:MOVEQ   #22,D0
        BRA LEAVEERROR
ERROR23:MOVEQ   #23,D0
        BRA LEAVEERROR
ERROR24:MOVEQ   #24,D0
        BRA LEAVEERROR
ERROR25:MOVEQ   #25,D0
        BRA LEAVEERROR
ERROR26:MOVEQ   #26,D0
        BRA LEAVEERROR
ERROR27:MOVEQ   #27,D0
        BRA LEAVEERROR
ERROR28:MOVEQ   #28,D0
        CLR.W   ERRWHERE
        BRA LEAVEERROR
ERROR29:MOVEQ   #29,D0
        BRA LEAVEERROR
ERROR30:MOVEQ   #30,D0
        BRA LEAVEERROR
ERROR31:MOVEQ   #31,D0
        BRA LEAVEERROR
ERROR32:MOVEQ   #32,D0
        CLR.W   ERRWHERE
        BRA LEAVEERROR
ERROR33:MOVEQ   #33,D0
        BRA LEAVEERROR
ERROR34:MOVEQ   #34,D0
        BRA LEAVEERROR
ERROR35:MOVEQ   #35,D0
        CLR.W   ERRWHERE
        BRA LEAVEERROR
ERROR36:MOVEQ   #36,D0
        BRA LEAVEERROR
ERROR37:MOVEQ   #37,D0
        CLR.W   ERRWHERE
        BRA LEAVEERROR
ERROR38:MOVEQ   #38,D0
        CLR.W   ERRWHERE
        BRA LEAVEERROR
ERROR39:MOVEQ   #39,D0
        BRA LEAVEERROR
ERROR40:MOVEQ   #40,D0
        BRA LEAVEERROR
ERROR41:MOVEQ   #41,D0
        BRA LEAVEERROR
ERROR42:MOVEQ   #42,D0
        BRA LEAVEERROR
ERROR43:MOVEQ   #43,D0
        BRA LEAVEERROR
ERROR44:MOVEQ   #44,D0
        CLR.W   ERRWHERE
        BRA LEAVEERROR
ERROR45:MOVEQ   #45,D0
        CLR.W   ERRWHERE
        BRA LEAVEERROR
ERROR46:MOVEQ   #46,D0
        CLR.W   ERRWHERE
        BRA LEAVEERROR
ERROR47:MOVEQ   #47,D0
        BRA LEAVEERROR
ERROR48:MOVEQ   #48,D0
        BRA LEAVEERROR
ERROR49:MOVEQ   #49,D0
        BRA LEAVEERROR
ERROR50:MOVEQ   #50,D0
        BRA LEAVEERROR
ERROR51:MOVEQ   #51,D0
        BRA LEAVEERROR
ERROR52:MOVEQ   #52,D0
        BRA LEAVEERROR
ERROR53:MOVEQ   #53,D0
        BRA LEAVEERROR
ERROR54:MOVEQ   #54,D0
        BRA LEAVEERROR
ERROR55:MOVEQ   #55,D0
        BRA LEAVEERROR
ERROR56:MOVEQ   #56,D0
        BRA LEAVEERROR
ERROR57:MOVEQ   #57,D0
        CLR.W   ERRWHERE
        BRA LEAVEERROR
ERROR58:MOVEQ   #58,D0
        CLR.W   ERRWHERE
        BRA LEAVEERROR
ERROR59:MOVEQ   #59,D0
        BRA LEAVEERROR
ERROR60:MOVEQ   #60,D0
        BRA LEAVEERROR
ERROR61:MOVEQ   #61,D0
        BRA LEAVEERROR
ERROR62:MOVEQ   #62,D0
        BRA LEAVEERROR
ERROR63:MOVEQ   #63,D0
        BRA LEAVEERROR
ERROR64:MOVEQ   #64,D0
        BRA LEAVEERROR
ERROR65:MOVEQ   #65,D0
        BRA LEAVEERROR
ERROR66:MOVEQ   #66,D0
        BRA LEAVEERROR
ERROR67:MOVEQ   #67,D0
        BRA LEAVEERROR
ERROR68:MOVEQ   #68,D0
        BRA LEAVEERROR
ERROR69:MOVEQ   #69,D0
        BRA LEAVEERROR
ERROR70:MOVEQ   #70,D0
        BRA LEAVEERROR
ERROR71:MOVEQ   #71,D0
        BRA LEAVEERROR
ERROR72:MOVEQ   #72,D0
        BRA LEAVEERROR
ERROR73:MOVEQ   #73,D0
        BRA LEAVEERROR
ERROR74:MOVEQ   #74,D0
        BRA LEAVEERROR
ERROR75:MOVEQ   #75,D0
        BRA LEAVEERROR
ERROR76:MOVEQ   #76,D0
        BRA LEAVEERROR
ERROR77:MOVEQ   #77,D0
        CLR.W   ERRWHERE
        BRA LEAVEERROR
ERROR78:MOVEQ   #78,D0
        BRA LEAVEERROR
ERROR79:MOVEQ   #79,D0
        BRA LEAVEERROR
ERROR80:MOVEQ   #80,D0
        BRA LEAVEERROR
ERROR81:MOVEQ   #81,D0
        BRA LEAVEERROR
ERROR82:MOVEQ   #82,D0
        BRA LEAVEERROR
ERROR83:MOVEQ   #83,D0
        BRA LEAVEERROR
ERROR84:MOVEQ   #84,D0
        BRA LEAVEERROR
ERROR85:MOVEQ   #85,D0
        BRA LEAVEERROR
ERROR86:MOVEQ   #86,D0
        BRA LEAVEERROR
ERROR87:MOVEQ   #87,D0
        BRA LEAVEERROR
ERROR88:MOVEQ   #88,D0
        BRA LEAVEERROR
ERROR89:MOVEQ   #89,D0
        BRA LEAVEERROR
ERROR90:MOVEQ   #90,D0
        BRA LEAVEERROR
ERROR91:MOVEQ   #91,D0
        BRA LEAVEERROR
ERROR92:MOVEQ   #92,D0
        BRA LEAVEERROR
ERROR93:MOVEQ   #93,D0
        BRA LEAVEERROR
ERROR94:MOVEQ   #94,D0
        BRA LEAVEERROR
ERROR95:MOVEQ   #95,D0
        BRA LEAVEERROR

;*-*
;;ADDRESS

; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ;
;   The Calculate-Addresses-For-BRAnches Part       ;
; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ;


CALCADR:
    MOVE.W  #10,CURSPOT
    MOVE.L  CURACODE(PC),A4     ; A4=CODE
    MOVE.L  ACODE(PC),D2
    MOVE.L  A4,D4
    BTST    #1,D4
    BEQ.S   .1
    CLR.W   (A4)+
    MOVE.L  A4,D4
.1: SUB.L   D2,D4
    MOVE.L  D4,CODEAMOUNT       ; CLEANOFF AND SET CODESIZE
    MOVE.L  D2,D7           ; D7=START CODE

    BSR CALLLIBFUNC

    TSTMOD
    BNE.S   .NM
    BTST    #5,CODEPREFS
    BNE .NM
    TST.W   MAINF
    BEQ ERROR13
.NM:    LEA BRANCHLIST(PC),A5   ; A5=BRANCHES
    MOVE.L  LABM+8(PC),A6       ; A6=LABELS
    MOVE.L  CURLABNAME(PC),D0
    LSL.L   #2,D0
    ADD.L   A6,D0
    MOVE.L  D0,LABM         ; SET USED
    BSR PUTRELOC
BRLOOP:
    MOVE.L  (A5),A5
    MOVE.L  A5,D0
    BEQ.S   BROUT
    MOVE.L  4(A5),A0        ; BRAnch spot
    MOVEQ   #0,D0
    MOVE.W  8(A5),D0
    BEQ.S   BROUT
    LSL.L   #2,D0
    MOVE.L  0(A6,D0.L),D2       ; BRAnch to
    BTST    #0,1(A0)        ; IF BIT=1 --> .B OR .L RELOC
    BNE.S   OTHERRELOC
    SUB.L   A0,D2

    CMP.W   #1,10(A5)
    BNE .1
    ADDQ.L  #2,D2
;    ADDQ.L  #2,A0
.1:
    CMP.L   #$7FF0,D2
    BPL ERROR44
    CMP.L   #-$7FF0,D2
    BMI ERROR44
    MOVE.W  D2,(A0)
    BRA.S   BRLOOP
BROUT:
    MOVE.L  NUMRELOC,D0
    BEQ.S   .1
    CLR.L   (A4)+
    MOVE.L  NUMRELADR,A0
    MOVE.L  D0,(A0)
.1: BSR BUILDSYMHUNK
    MOVE.L  A4,CURACODE     ; SET BACK.
    RTS
OTHERRELOC:
    BTST    #3,1(A0)
    BNE     XLONG
    BTST    #1,1(A0)
    BNE     LONG
    BTST    #2,1(A0)        ; 8 bit pcrel
    BEQ.S   .1
    SUBQ.L  #2,D2
.1: SUB.L   A0,D2
    BEQ ERROR45
    CMP.L   #120,D2
    BPL ERROR45
    CMP.L   #-120,D2
    BMI ERROR45
    MOVE.B  D2,1(A0)        ; PTR A0 = RELOCEND-2
    BRA BRLOOP
LONG:
    BSR INCRELOC
    TST.W   2(A0)           ; SEE IF THERE'S EFUNCNUM
    BNE.S   .2
    SUB.L   D7,D2
    MOVE.L  D2,(A0)
    SUB.L   D7,A0
    MOVE.L  A0,(A4)+
    BRA BRLOOP
.2:
    SUB.L   D7,A0           ; EFUNC CALL, BIT #32 SET.
    MOVE.L  A0,D0
    MOVEQ   #31,D2
    BSET    D2,D0
    MOVE.L  D0,(A4)+
    BRA BRLOOP

INCRELOC:
    TST.L   NUMRELOC        ; 32BIT RELOC
    BNE.S   .1
    MOVE.L  #$3EC,(A4)+
    MOVE.L  A4,NUMRELADR
    ADDQ.L  #4,A4
    MOVE.L  A4,RELOCTABSTART
    CLR.L   (A4)+
.1: ADDQ.L  #1,NUMRELOC
    RTS

XLONG:
    BTST    #1,1(A0)
    BNE     .XRELOC
    SUB.L   A0,D2
    CMP.W   #1,10(A5)
    BNE .1
    ADDQ.L  #2,D2
.1:
    MOVE.L  D2,(A0)
    BRA     BRLOOP
.XRELOC:
    MOVE.L  10(a5),(a0)
    BSR INCRELOC
    SUB.L   D7,A0
    MOVE.L  A0,(A4)+
    BRA     BRLOOP

;; CallLibFunc
CALLLIBFUNC:
    MOVEM.L D0-A3/A5/A6,-(A7)
    LEA LIBPTRS+4,A0
.LOOP:
    MOVE.L  -4(A0),D0
    BEQ     .EXIT
    MOVE.L  D0,A0
    MOVE.L  4(A0),A1
    MOVE.L  14(A1),D0
    MOVE.L  (A0),A1

    CMP.W   #1,8(A0)
    BEQ     .LONG

    SUB.L   A1,D0
    SUBQ.L  #2,D0


    SWAP    D0
    TST.W   D0
    BNE     ERROR44
    SWAP    D0
    MOVE.L  (A0),A1
    MOVE.W  D0,2(A1)
    BRA     .LOOP
.EXIT:
    MOVEM.L (A7)+,D0-A3/A5/A6
    RTS
.LONG:
    SUB.L   D7,D0
    MOVE.L  D0,2(A1)
    SUb.L   D7,A1
    addq.l  #2,a1
    BSR INCRELOC
    MOVE.L  A1,(A4)+
    BRA .LOOP

;*-*

NUMRELOC:   DC.L    0
NUMRELADR:  DC.L    0
LIBPTRS:    DC.L    0

; LAST RELOC BYTE:
; <0xx0> BIT #0 CLR -->                PCREL RELOC16
; <0001>        SET --> BIT #1 CLR --> PCREL RELOC8
; <0101>        SET --> BIT #1 CLR --> PCREL RELOC8 + ADJUST
; <0x11>                       SET --> ABS   RELOC32 (ENTRY IN RELOCTAB)
; <1001> BIT #0 SET --> BIT #1 CLR --> PCREL RELOC32


DIVRELOC: DC.L    0

ADDDIVRELOC:          ; ADR=D0
    MOVE.L  A0,-(A7)
    GETM    A0
    MOVE.L  DIVRELOC(PC),(A0)
    MOVE.L  A0,DIVRELOC
    ADDQ.L  #4,A0
    MOVE.L  D0,(A0)+
    DONEM   A0
    MOVE.L  (A7)+,A0
    RTS

PUTRELOC:
    MOVEM.L A0-A3/A6/D0-D7,-(A7)    ; EXPECTS CODE IN A4
    LEA CODELIST(PC),A0     ; A0=CODEREM
    MOVE.L  LABM+8,A2       ; A2=LABELS
.XL:MOVE.L  (A0),A0
    MOVE.L  A0,D0
    BEQ.S   .E
    CMP.W   #3,4(A0)
    BNE.S   .LL
    MOVE.L  6(A0),A3        ; A3=RELOCTAB
    MOVE.L  10(A0),D3       ; D3=RELOCLEN
    SUBQ.L  #1,D3
.RL:    MOVE.L  (A3)+,D2
    BMI.S   .P
    BSR INCRELOC
    ADD.L   D1,D2           ; ADD OFFSET IN D1
    MOVE.L  D2,(A4)+
.P: DBRA    D3,.RL
    BRA.S   .XL
.E: LEA DIVRELOC(PC),A0     ; ADD SOME VARIOUS RELOCS
    MOVE.L  ACODE,D1
.DL:    MOVE.L  (A0),D0
    BEQ.S   .DX
    MOVE.L  D0,A0
    MOVE.L  4(A0),D0
    SUB.L   D1,D0
    BSR INCRELOC
    MOVE.L  D0,(A4)+
    BRA.S   .DL
.DX:    MOVEM.L (A7)+,A0-A3/A6/D0-D7
    RTS
.LL:    CMP.W   #2,4(A0)
    BNE.S   .PROC
    MOVE.L  10(A0),D1       ; D1=ADD OFFSET
    SUB.L   ACODE,D1
    BRA.S   .XL

.PROC:  CMP.W   #5,4(A0)
    BNE.S   .XL
    MOVE.L  6(A0),A1

    MOVE.L  A1,D0
    HASH    A1,D2,D7
    LSL.L   #2,D2
    ADD.L   #IDENTHASH+4,D2
    MOVE.L  D2,A3
.SL:    MOVE.L  -(A3),A3
    MOVE.L  A3,D2
    BEQ.S   .NOTF
    CMP.B   #LAB,4(A3)
    BNE.S   .SL
    MOVE.L  (A3),A1
    MOVE.L  D0,A6
.CL:    CMPM.B  (A1)+,(A6)+
    BNE.S   .SL
    TST.B   -1(A1)
    BNE.S   .CL
    MOVE.L  10(A0),A1
    MOVE.L  6(A3),D7
    BEQ.S   .SK
    MOVE.L  D7,A6
    MOVE.W  (A1),D7
    CMP.W   (A6),D7
    BNE.S   .SL
.SK:    ADDQ.L  #2,A1
    MOVE.W  (A1)+,D3
    BEQ.W   .XL
    SUBQ.W  #1,D3
    MOVEQ   #0,D2
    MOVE.W  10(A3),D2
    LSL.L   #2,D2
    MOVE.L  0(A2,D2.L),D2
    MOVE.L  ACODE,D7
    SUB.L   D7,D2
    
.PPL:   MOVE.L  (A1)+,A6
    ADD.L   D1,A6
    BSR INCRELOC
    MOVE.L  A6,(A4)+
    ADD.L   D7,A6
    MOVE.L  D2,(A6)
    DBRA    D3,.PPL
    BRA.W   .XL

.NOTF:  MOVE.L  D0,ERROROBJ
    BRA ERROR57

BUILDSYMHUNK:         ; GETS CODE IN A4
    MOVEM.L D0-D7/A0-A3/A5/A6,-(A7)
    BTST    #5,CODEPREFS+2
    BEQ NOSYM
    TSTMOD
    BNE NOSYM
    MOVE.L  LABM+8,A0       ; A0=LABELBUF
    MOVE.L  ACODE,D3        ; D3=ACODE
    MOVEQ   #0,D0           ; D0=NUMSYMS
    MOVE.L  #IDENTHASH+4,D6
    MOVE.L  #IDENTHASH+1028,D7  ; D6,D7=IDENTBUF,END
.OLOOP: MOVE.L  D6,A5           ; A5=IDENTPTR
    ADDQ.L  #4,D6
    CMP.L   D6,D7
    BEQ ESYMS
.LOOP:  MOVE.L  -(A5),A5
    MOVE.L  A5,D4           ; D4=DUMMY
    BEQ.S   .OLOOP
    CMP.B   #LAB,4(A5)
    BNE.S   .LOOP
    BTST    #4,5(A5)
    BNE.S   .LOOP           ; SKIP METHODS
    ;TST.L  6(A5)
    ;BEQ.S  .LOOP           ; skip labels yesorno?
    TST.L   D0          ; FIRST SYM, START HUNK
    BNE.S   .NF
    MOVE.L  #$3F0,(A4)+
.NF:CLR.L   (A4)+
    MOVE.L  A4,A6           ; A6=BACKPATCH
    MOVE.L  (A5),A2         ; A2=ASCII
.CL:MOVE.B  (A2)+,(A4)+
    BNE.S   .CL
    MOVE.L  A4,D4
    BTST    #0,D4
    BEQ.S   .1
    ADDQ.L  #1,D4
.1: BTST    #1,D4
    BEQ.S   .2
    ADDQ.L  #2,D4
.2: MOVE.L  D4,A4
    SUB.L   A6,D4
    LSR.L   #2,D4
    MOVE.W  D4,-2(A6)
    MOVEQ   #0,D1
    MOVE.W  10(A5),D1       ; LABEL-ID
    LSL.L   #2,D1
    MOVE.L  0(A0,D1.L),D1
    SUB.L   D3,D1
    MOVE.L  D1,(A4)+
    ADDQ.L  #1,D0
    BRA .LOOP
ESYMS:
    MOVE.L  #EFUNCBYTE,A3
    MOVE.W  #NREFUNC,D2
    SUBQ.W  #1,D2
    MOVE.L  #EFUNCTAB,D7
    MOVEQ   #0,D6
.3: TST.B   (A3)+
    BEQ.S   .4

    MOVE.L  D6,D5
    LSL.W   #1,D5
    LEA     EFUNCFLAGSTAB,A1
    MOVE.W  0(A1,D5),D5
    BTST    #8,D5
    BNE     .4

    MOVE.L  D7,A1
    MOVE.L  d6,D5
    MULU    #EFUNCENTRYSIZE,D5
    ADD.L   D5,A1           ; (a1)=ptr ascii

    TST.L   D0          ; FIRST SYM, START HUNK
    BNE.S   .NF
    MOVE.L  #$3F0,(A4)+
.NF:CLR.L   (A4)+
    MOVE.L  A4,A6           ; A6=BACKPATCH
    MOVE.L  (A1),A2         ; A2=ASCII
.CL:MOVE.B  (A2)+,(A4)+
    BNE.S   .CL
    MOVE.L  A4,D4
    BTST    #0,D4
    BEQ.S   .1
    ADDQ.L  #1,D4
.1: BTST    #1,D4
    BEQ.S   .2
    ADDQ.L  #2,D4
.2: MOVE.L  D4,A4
    SUB.L   A6,D4
    LSR.L   #2,D4
    MOVE.W  D4,-2(A6)
    MOVE.L  D6,D1
    ADD.L   #10,D1
    LSL.L   #2,D1
    MOVE.L  0(A0,D1.L),D1
    SUB.L   D3,D1
    MOVE.L  D1,(A4)+

.4: ADDQ.L  #1,D6
    DBRA    D2,.3

    TST.L   D0
    BEQ.S   NOSYM
    CLR.L   (A4)+
NOSYM:  MOVEM.L (A7)+,D0-D7/A0-A3/A5/A6
    RTS



;*-*
;; Expression support
; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ;
;   The Expression Calculation Part             ;
; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ;
;; EAEXP!!!


; ea specific version of EXP: optimizes some superfluous code away
;
; HANDLED ARE:
;
; MOVE.L #VAL,D0        6   1
; LEA X(PC),A0; MOVE.L A0,D0    6   'bla'
; MOVE.L X(A5),D0       4   a
; MOVEQ #VAL,D0         2   1
; MOVE.L Dx,D0          2   a
;
; RESULT IN D0:     0   NO OPTI DONE
;           1   OPTI DONE, BUT DON'T MOVE (MAY USE A0 TOO)
;           <ADR>   OPTI DONE, <ADR>..A4 IS CODE
EAEXP:
    MOVEM.L A1/D3/D4,-(A7)
    MOVE.L  A4,A1
    BSR EXP
    MOVE.L  A4,D3
    SUB.L   A1,D3
    CMP.L   #7,D3
    BPL .X
    CMP.L   #2,D3
    BNE.S   .1
;*-*

;; MOVEQ

    CMP.B   #%01110000,(A1)
    BNE .M
    MOVE.W  EAREQUEST(PC),D3
    CMP.W   #17,D3
    BPL .X
    CMP.W   #16,D3
    BEQ.S   .3
    CMP.W   #8,D3
    BPL.S   .5
    LSL.W   #1,D3
    OR.B    D3,(A1)         ; ** MOVEQ #1,Dx
    BRA .OK
.3: MOVE.B  1(A1),D4
    EXT.W   D4
    MOVE.W  D4,(A4)+        ; ** PEA 1.W
    MOVE.W  .4(PC),(A1)
    BRA .OK
.4: PEA 1.W
.5: MOVE.B  1(A1),D4
    EXT.W   D4
    MOVE.W  D4,(A4)+        ; ** MOVE.W 1,Ax
    MOVE.W  .6(PC),D4
    LSL.W   #8,D3
    LSL.W   #1,D3
    OR.W    D3,D4
    MOVE.W  D4,(A1)
    BRA .OK
.6: MOVE.W  #1,A0
.1: CMP.L   #4,D3
    BNE.S   .2

;*-*
;; VAR
    MOVE.W  (A1),D3
    BCLR    #0,D3
    CMP.W   #%0010000000101100,D3
    BNE .X

    BSR.W   DOOPT           ; ** MOVE.L 2(A5),Rx/-(A7)/2(A5)
    BRA .OK
;*-*
;; MOVE.L Dx,D0

.M: MOVE.W  (A1),D3
    AND.W   #%1111111111111000,D3
    CMP.W   #%0010000000000000,D3
    BNE .X
    BSR DOOPT           ; ** MOVE.L Dx,Rx/-(A7)/2(A5)
    BRA .OK


.2: CMP.W   #%0100000111111010,(A1)
    BEQ.S   .7
;*-*
;; MOVE.L

    CMP.W   #%0010000000111100,(A1)
    BNE.S   .X
    MOVE.W  EAREQUEST(PC),D3
    CMP.W   #16,D3
    BNE.S   .9
    TST.W   2(A1)
    BEQ.S   .8
    CMP.W   #-1,2(A1)
    BEQ.S   .10
.9: BSR.S   DOOPT           ; ** MOVE.L #1,Rx/-(A7)/2(A5)
    BRA.S   .OK         ; ** PEA 1.W
.8: TST.W   4(A1)
    BMI.S   .9
.11:    MOVE.W  .4(PC),(A1)
    MOVE.W  4(A1),2(A1)
    SUBQ.L  #2,A4
    BRA.S   .OK
.10:    TST.W   4(A1)
    BMI.S   .11
    BRA.S   .9

.7: 
;*-*
;; LEA+MOVE

    CMP.W   #%0010000000001000,4(A1)
    BNE.S   .X
    MOVE.W  EAREQUEST(PC),D3
    CMP.W   #16,D3
    BPL.S   .OT
    CMP.W   #8,D3
    BPL.S   .A
    OR.W    #%110000000000,(A1)
    ADDQ.L  #4,A1
    OR.W    #%110,(A1)
    BSR.S   DOOPT           ; ** MOVE.L A0,Dx
    SUBQ.L  #4,A1
    BRA.S   .OKNM
.A: SUBQ.L  #2,A4
    BSR.S   DOOPT           ; ** MOVE.L LAB(PC),Ax
    BRA.S   .OKNM
.OT:    ADDQ.L  #4,A1
    BSR.S   DOOPT           ; ** MOVE.L A0,-(A7)/2(A5)
    SUBQ.L  #4,A1
    BRA.S   .OKNM


.OK:    MOVE.L  A1,D0
    BRA.S   .OUT
.OKNM:  MOVEQ   #1,D0
    BRA.S   .OUT
.X: MOVEQ   #0,D0
.OUT:   MOVEM.L (A7)+,A1/D3/D4
    RTS
;*-*
DOOPT:  MOVE.W  EAREQUEST(PC),D3
    CMP.W   #17,D3          ; A1=OPCODE
    BPL.S   .VAR
    CMP.W   #16,D3
    BEQ.S   .ST
    LSL.W   #3,D3
    BTST    #6,D3
    BEQ.S   .XX
    BCLR    #6,D3
    BSET    #0,D3
    BRA.S   .XX
.ST:    MOVE.W  #%111100,D3
.XX:    LSL.W   #6,D3
    OR.W    D3,(A1)
    RTS


.VAR:   ORI.W   #%0000101101000000,(A1) ; SET TO MOVE.L EA,2(A5)
    MOVE.L  A2,D4
    MOVE.L  A6,D0
    LEA -2(A4),A2
    CMPA.L  A2,A1
    BEQ GRUNT
    MOVE.W  (A2),-(A7)
    MOVE.W  (A1),(A2)
    MOVE.L  EAIDENT(PC),A6
    BSR GVA6D3_9
    MOVE.W  (A2),(A1)
    MOVE.W  (A7)+,(A2)
    MOVE.L  D0,A6
    MOVE.L  D4,A2
    RTS
GRUNT:  MOVE.L  EAIDENT(PC),A6
    BSR GVA6D3_9
    MOVE.L  D0,A6
    MOVE.L  D4,A2
    RTS



EAREQUEST:    DC.W    0   ; 0-15=REG, 16=STACK, 17,25=VAR
EAIDENT:      DC.L    0

TINYEXP:              ; GENERATES CODE FOR D0, JUST VALUES
    MOVE.W  (A3)+,D0        ; TRASHES JUST D0
    CMP.W   #VALUE,D0
    BEQ.S   .1
    CMP.W   #43,D0
    BEQ.S   .1
    CMP.W   #8,D0
    BNE ERROR30
    CMP.W   #43,(A3)
    BEQ.S   .NF
    CMP.W   #VALUE,(A3)+
    BNE ERROR30
    MOVE.L  (A3)+,D0
    NEG.L   D0
    BRA.S   .2
.1: MOVE.L  (A3)+,D0
.2: CMP.L   #128,D0
    BPL.S   .3
    CMP.L   #-128,D0
    BMI.S   .3
    MOVE.B  .4(PC),(A4)+
    MOVE.B  D0,(A4)+
    RTS
.3: MOVE.W  .5(PC),(A4)+
    MOVE.L  D0,(A4)+
    RTS
.4: MOVEQ   #1,D0
.5: MOVE.L  #1,D0
.NF:    ADDQ.L  #2,A3
    MOVEM.L D0-D1/A0-A1/A6,-(A7)
    BSR ISOPENMATH
    MOVE.L  MATHBASE(PC),A6
    MOVE.L  (A3),D0
    JSR -60(A6)         ; SPNEG
    MOVE.L  D0,(A3)
    MOVEM.L (A7)+,D0-D1/A0-A1/A6
    BRA.S   .1


FINDMEMBER:   ; *** FIND O.MEMBER, D1=TRASH,a1=first->REAL,a6=obj
    MOVE.W  OID(A6),D1
    CMP.W   OID(A1),D1
    BEQ.S   .X
    MOVEM.L D0/D3/A3-A5,-(A7)
    MOVE.L  8(A1),D3
    LEA OMEMB+4(A6),A3
.XL:MOVE.L  ONEXT(A3),A3
    MOVE.L  A3,D0
    BEQ.S   .ERA3
    MOVE.L  D3,A4
    MOVE.L  OASCII(A3),A5
    MOVE.L  A5,D0
    BEQ.S   .XL
.L2:    CMPM.B  (A5)+,(A4)+
    BNE.S   .XL
    TST.B   -1(A5)
    BNE.S   .L2
    CMP.W   OID(A3),D1
    BNE.S   .XL          ; BNE ERA3
    MOVE.L  A3,A1
    MOVEM.L (A7)+,D0/D3/A3-A5
.X: RTS
.ERA3:  MOVEM.L (A7)+,D0/D3/A3-A5
    BRA ERROR42




; the main part for the objects  -  members  -  indexes

TYPERF_XXX:
        DC.B    0
        DC.B    0

EADDRESSMODI:         ; D5=-1/OTHER,A3=VOOR HELE EXP
    MOVEM.L D3-D5/A1,-(A7)  ; D0=[0=-->D0,1=-->D1,2=D0-->]
    CMP.W   #-1,D5          ;     SET(D5) PAR     PAR
    BNE.S   .1
    CMP.W   #1,D0
    BNE.S   .1
    MOVEQ   #0,D0           ; D0=FLAG
.1: MOVE.W  (A3)+,D1
    CMP.W   #32,D1          ; SEE IF ^IDENT
    BPL PL
    CMP.W   #IDENT,D1
    BNE ERROR6
    MOVE.L  (A3)+,A0        ; A0=IDENT
    TST.B   4(A0)
    BEQ ERROR22
    CMP.B   #LAB,4(A0)
    BEQ ERROR6
    MOVE.B  16(A0),TYPERF_XXX  ; number of PTR TO's
    MOVE.W  (A3)+,D1
    CMP.W   #33,D1          ; SEE IF IDENT++
    BPL PLX
PLB:
    CMP.W   #41,D1
    BNE     .0
    CMP.W   #31,(A3)+
    BNE ERROR42
    MOVE.L  (A3)+,.SPEC
    MOVE.W  (A3)+,D1
    CLR.L   .TDRF
    MOVE.B  #-1,TYPERF_XXX
    BRA .0_2        ; .DREFL
.0:
    MOVE.L  (A0),.SPEC
    CLR.B   .TDRF
.DREFL:
    IFNE MULTIPLE_PTRS
    MOVE.L  COMPILEPROC(PC),A1
    CMP.L   18(A1),A0
    BEQ .0_2                    ; self can't be a ptr to ptr ... - problems
    TST.B   TYPERF_XXX(PC)
    BGT     .0_0
    BMI     .0_2
    MOVE.L  (A0),.SPEC
    BRA     .0_1
.0_0:
    MOVE.L  #4,.SPEC
.0_1:
    SUBQ.B  #1,TYPERF_XXX
    TST.B   TYPERF_XXX
    BPL .0_2
    CMP.W   #29,d1
    beq     .0_2
    move.l  (a0),.SPEC
    subq.b  #1,TYPERF_XXX
    ENDC
.0_2:

    AND.L   #$FFFF,D0
    MOVE.W  D5,.KEEPD5

    MOVEQ   #0,D3
    CMP.W   #29,D1          ; "["
    BNE.W   .8
    ADDQ.L  #4,A3           ; SKIP ]OFFSET
    CMP.W   #30,(A3)        ; "[]"?
    BEQ.W   .10
    CMP.W   #VALUE,(A3)     ; "[VAL"
    BNE.S   .9
    CMP.W   #30,6(A3)       ; "[VAL]"
    BNE.S   .9
    MOVE.L  2(A3),D3        ; D3=OFFSET
    ADDQ.L  #6,A3
    BRA.S   .10
.9: CMP.W   #IDENT,(A3)     ; "[VAR"?
    BNE.S   .9B
    CMP.W   #30,6(A3)       ; "[VAR]"?
    BNE.S   .9B

    MOVE.L  2(A3),A6
    MOVE.W  .OPTID2(PC),(A4)+
    BSR GVA6D3_0
    ADDQ.L  #6,A3
    MOVEQ   #-1,D3
    BRA.S   .10

;; "Calculate expression in '[]'"

.9B:MOVEM.L D0/D3/A0,-(A7)
    TST.B   .TDRF
    BEQ.S   .NDR1
    MOVE.W  .SAVA0(PC),(A4)+
.NDR1:  MOVE.L  .SPEC(PC),-(A7)
    MOVE.L  .TDRF(PC),-(A7)
    CMP.W   #-1,D5
    BEQ.S   .31
    MOVE.W  .26(PC),(A4)+
    BSR EXP
    MOVE.L  .27(PC),(A4)+
    BRA.S   .32
.31:BSR EXP
    MOVE.W  .30(PC),(A4)+
.32:MOVE.L  (A7)+,.TDRF
    MOVE.L  (A7)+,.SPEC
    TST.B   .TDRF
    BEQ.S   .NDR2
    MOVE.W  .RETA0(PC),(A4)+
.NDR2:  MOVEM.L (A7)+,D0/D3/A0
;*-*

    MOVEQ   #-1,D3
.10:CMP.W   #30,(A3)+       ; "]"
    BNE ERROR34             ;
    MOVE.W  (A3)+,D1        ;

.8: SUBA.L  A1,A1           ; A1=OBJECT (member/NIL)
    SUBA.L  A6,A6           ; A6=OBJECT (HEAD/NIL)
    CMP.W   #41,D1          ; CHECK FOR POINTERTYPE
    BNE.S   .NCAST          ;
    CMP.W   #31,(A3)+       ; ::another objheader
    BNE ERROR40             ;
    MOVE.L  (A3)+,A6        ;
    MOVE.W  (A3)+,D1        ;
.NCAST:
    CMP.W   #35,D1          ; "."
    BNE .11
    CMP.W   #42,(A3)        ; another objmemberascii
    BEQ .EADDRMETHOD
    CMP.W   #39,(A3)+       ; another objmember
    BNE ERROR40
    CMP.W   #17,4(A3)       ; "(" - method
    BEQ .EADDRMETHOD2
    MOVE.L  .SPEC,D1
    CMP.L   #MAXOBJSIZE,D1
    BMI ERROR40
    MOVE.L  (A3)+,A1        ; A1=FIRST MATCH MEMBER
    MOVE.L  A6,D2
    BNE.S   .CASTO
    MOVE.L  D1,A6           ; A6=OBJECTHEAD
.CASTO: BSR FINDMEMBER
    BRA.S   .SKM
.FAKEO: DC.L    0,0,0,0
.SKMS:  SUBQ.L  #2,A3           ; JUMPSPOT FOR OBJ[I]
    LEA .FAKEO(PC),A1
.SKM:   MOVE.L  .SPEC,D1
    MOVE.L  D1,A2
    MOVE.W  4(A2),D5
    BRA.S   .12
.11:    MOVE.L  .SPEC,D5        ; D5=OBJSIZE
    CMP.L   #MAXOBJSIZE,D5
    BPL .SKMS           ; !!!ERROR40
.15:    SUBQ.L  #2,A3
.12:    BSR PP          ; D2=INC/DEC
    MOVEQ   #2,D1
    BSR GENID

    TST.L   D3          ; DECIDE ON CODE-GEN
    BEQ.S   .OO
    BMI.S   .EO
    BPL.S   .IO

;; Object offset

.OO:    MOVEQ   #0,D1           
    CMP.L   A1,D1
    BEQ.S   .13
    MOVE.W  (A1),D1
    EXT.L   D1
.13:    BSR GEND2
    BRA.S   .CONT
;*-*
;; Object index

.EO:    CMP.L   #-1,D3
    BNE ERROR31
    CMP.W   #2,D5
    BMI.S   .SO
    BEQ.S   .S1
    CMP.W   #4,D5
    BEQ.S   .S2
    CMP.W   #8,D5
    BEQ.S   .S3
    CMP.W   #16,D5
    BEQ.S   .S4
    MOVE.W  .28(PC),(A4)+
    MOVE.W  D5,(A4)+
    BRA.S   .SO
.S4:    MOVE.W  .29+6(PC),(A4)+     ; OBJ OF 16
    BRA.S   .SO
.S3:    MOVE.W  .29+4(PC),(A4)+     ; OBJ OF 8
    BRA.S   .SO
.S2:    MOVE.W  .29+2(PC),(A4)+     ; LONG
    BRA.S   .SO
.S1:    MOVE.W  .29(PC),(A4)+       ; INT
.SO:    MOVEQ   #0,D1
    CMP.L   D1,A1
    BEQ.S   .CONT
    MOVE.W  (A1),D1
    BSR GENADD
    BRA.S   .CONT
;*-*
;; Object offset+index

.OPC:   MOVE.L  2(A5),A0

.IO:    MOVEQ   #0,D1           
    CMP.L   A1,D1
    BEQ.S   .14
    MOVE.W  (A1),D1
    EXT.L   D1
.14:    MOVE.L  D3,D4
    MULU    D5,D4
    ADD.L   D4,D1
    BSR GEND2
;*-*

; FROM HERE D3=-1(D2 ALREADY CALC.), >0(RELA0)

.CONT:  ;MOVE.L #1,.SPEC        ; TO BE SURE
    TST.B   .TDRF
    BNE.S   .NXA5
    MOVE.W  .OPC(PC),(A4)+      ; MOVE.L X(A5),A0
    BSR GVA0D4_0
.NXA5:  BTST    #1,CODEPREFS+3
    BEQ.S   .NNCH
    BSR NILCHECK
.NNCH:  MOVEQ   #0,D4
    CMP.L   D4,A1
    BEQ.S   .16
    MOVE.W  4(A1),D4        ; D4=READSIZE
    BTST    #1,OFLAGS(A1)
    BEQ.S   .17 ;16B            ; was 17! (caused uninit .spec)
    MOVE.L  OPTRTYPE(A1),.SPEC
    BRA.S   .17
.16:    MOVE.L  D5,D4
.16B:   MOVE.L  #1,.SPEC
.17:    

    CLR.B   .TDRF
    CMP.W   #35,(A3)        ; "." (SLOW)
    BEQ.S   .DD
    CMP.W   #41,(A3)        ; "::"
    BEQ.S   .DD
    CMP.W   #29,(A3)        ; "["
    BNE.S   .NDD
.DD:    MOVE.B  #1,.TDRF        ; THROUGH-DEREF x.y.z
    MOVE.B  D0,.ORIGD0
    MOVE.W  #3,D0           ; TDR MODE
    TST.L   D4
    BEQ.S   .DD1
    CMP.W   #4,D4
    BNE ERROR40
    BRA.S   .DD2
.DD1:   ADDQ.W  #4,D0
.DD2:   TST.W   D2
    BNE ERROR40
    BRA.S   .18

.NDD:
    TST.W   D4
    BNE.S   .NP
    CMP.W   #2,D0
    BEQ ERROR40
    ADD.W   #4,D0           ; SET TO GET POINTER TO SUBSTRUCT
    BRA.S   .18
.NP:BSR .MOVEQ
.18:CMP.L   #$10000,D0
    BPL     .23
    TST.L   D3
    BPL.W   .40

;; *** indexed version

    CMP.W   #ASSGN,(A3)
    BEQ     .ENHANCE0
    CMP.W   #11,2(A3)
    BEQ     .EXPEXT0
.E0_B0:
    LSL.W   #2,D0
    MOVE.L  .20(PC,D0.W),(A4)+
    LSR.W   #2,D0
.E0_B:
    BSR .EXTL
    CMP.W   #2,D4
    BEQ .21
    BPL.S   .22
    TST.W   D4
    BEQ .DO         ; SKIP MOVE.X SET
    BCLR    #5,-4(A4)
    BRA .21
.22:BCLR    #4,-4(A4)
    BRA .21
;; Enhance
.ENHANCE0:
    CMP.W   #2,D0
    BPL     .E0_B0
    ADDQ.L  #2,A3
    MOVE.L  .E0_S(PC),(A4)+
    BSR     EXP
    MOVE.L  .E0_R(PC),(A4)+
    MOVE.L  .20+8(PC),(A4)+
    BRA     .E0_B

.E0_S:  MOVEM.L  D2/A0,-(A7)
.E0_R:  MOVEM.L  (A7)+,D2/A0
;*-*
;; Codes
.20:MOVE.W  0(A0,D2.L),D0       ; LONG
    MOVE.W  0(A0,D2.L),D1
    MOVE.W  D0,0(A0,D2.L)
    MOVE.W  0(A0,D2.L),A0
    LEA 0(A0,D2.L),A0
    LEA 0(A0,D2.L),A0
    LEA 0(A0,D2.L),A0
    LEA 0(A0,D2.L),A0
;*-*
;; Extend
.EXPEXT0:
    CMP.W   #0,D0
    BNE     .E0_B0
    MOVE.W  (A3),D1
    CMP.W   #7,D1
    BMI     .E0_B0
    CMP.W   #10,D1
    BLE     .EXP_C0
    CMP.W   #49,D1
    BMI     .E0_B0
    CMP.W   #50,D1
    BLE     .EXP_C0
    CMP.W   #IOFF+29,D1
    BMI     .E0_B0
    CMP.W   #IOFF+30,D1
    BGT     .E0_B0
.EXP_C0:
    MOVE.W  (A3),2(A3)
    MOVE.W  #51,(A3)

    LSL.W   #2,D0
    MOVE.L  .20(PC,D0.W),(A4)+      ;
    LSR.W   #2,D0

    BSR     .EXTL
    CMP.W   #2,D4
    BEQ.S   .EXP_C0_2
    BPL.S   .EXP_C0_1
    TST.W   D4
    BEQ     ERROR0                  ; compiler shouldn't use this code, anyway..
    BCLR    #5,-4(A4)               ; .B/.L size
    BRA.S   .EXP_C0_2
.EXP_C0_1:
    BCLR    #4,-4(A4)               ; same here
.EXP_C0_2:
    MOVE.L  D4,-(A7)
    MOVE.L  .EXP_ST2,(A4)+
    BSR     EXP
    MOVE.L  .EXP_RS2,(A4)+
    MOVE.L  (A7)+,D4
    MOVEQ   #2,D0
    MOVEQ   #0,D2
    BRA     .E0_B0
.EXP_ST2:
    MOVEM.L D2/A0,-(A7)
.EXP_RS2:
    MOVEM.L (A7)+,D2/A0
;*-*
;*-*
;; *** simple version

.23:CMP.W   #4,(A3)
    BEQ     .ENHANCE1
    CMP.W   #11,2(A3)
    BEQ     .EXPEXT1
.E1_B0:
    LSL.W   #1,D0
    MOVE.W  .24(PC,D0.W),(A4)+  
    LSR.W   #1,D0
.E1_B:
    BSR .EXTL
    CMP.W   #2,D4
    BEQ.W   .21
    BPL.S   .25
    TST.W   D4
    BEQ     .DO         ; SKIP MOVE.X SET
    BCLR    #5,-2(A4)
    BRA     .21
.25:BCLR    #4,-2(A4)
    BRA     .21
;; Enhance1 (:=)
.ENHANCE1:
    CMP.W   #2,D0
    BPL     .E1_B0
    ADDQ.L  #2,A3
    MOVE.W  .E1_S(PC),(A4)+
;    BSR     SD0
    BSR     EXP
;    BSR     RD0
    MOVE.W  .E1_R(PC),(A4)+
    MOVE.W  .24+4(PC),(A4)+
    BRA     .E1_B

.E1_S:  MOVE.L  A0,-(A7)
.E1_R:  MOVE.L  (A7)+,A0
;*-*
;; Codes
.24:MOVE.W  (A0),D0         ; a:=b[]
    MOVE.W  (A0),D1         ; a:=b+c[]
    MOVE.W  D0,(A0)         ; a[]:=b...
    MOVE.W  (A0),A0         ; a[][]?
    LEA (A0),A0
    LEA (A0),A0
    LEA (A0),A0
    LEA (A0),A0
;*-*
;; Extended (+=, -=, etc.)
.EXPEXT1:
    CMP.W   #0,D0
    BNE     .E1_B0
    MOVE.W  (A3),D1
    CMP.W   #7,D1
    BMI     .E1_B0
    CMP.W   #10,D1
    BLE     .EXP_C1
    CMP.W   #49,D1
    BMI     .E1_B0
    CMP.W   #50,D1
    BLE     .EXP_C1
    CMP.W   #IOFF+29,D1
    BMI     .E1_B0
    CMP.W   #IOFF+30,D1
    BGT     .E1_B0
.EXP_C1:
    MOVE.W  (A3),2(A3)
    MOVE.W  #51,(A3)

    LSL.W   #1,D0
    MOVE.W  .24(PC,D0.W),(A4)+      ;
    LSR.W   #1,D0

    BSR     .EXTL
    CMP.W   #2,D4
    BEQ.S   .EXP_C1_2
    BPL.S   .EXP_C1_1
    TST.W   D4
    BEQ     ERROR0                  ; compiler shouldn't use this code, anyway..
    BCLR    #5,-2(A4)               ; .B/.L size
    BRA.S   .EXP_C1_2
.EXP_C1_1:
    BCLR    #4,-2(A4)               ; same here
.EXP_C1_2:
    MOVE.L  D4,-(A7)
    MOVE.W  .EXP_ST,(A4)+
    BSR     EXP
    MOVE.W  .EXP_RS,(A4)+
    MOVE.L  (A7)+,D4
    MOVEQ   #2,D0
    MOVEQ   #0,d2
    BRA     .E1_B0
;*-*
;*-*
;; *** relative(a0) version

.40:CMP.W   #ASSGN,(A3)
    BEQ     .ENHANCE2

    CMP.W   #11,2(A3)
    BEQ     .EXPEXT2
.E2_B:
    LSL.W   #2,D0
    MOVE.W  .42(PC,D0.W),(A4)+      ;
    LSR.W   #2,D0
.E2_B1:
    MOVE.W  D3,(A4)+
    BSR .EXTL
    CMP.W   #2,D4
    BEQ     .21
    BPL.S   .41
    TST.W   D4
    BEQ     .DO                     ; SKIP MOVE.X SET
    BCLR    #5,-4(A4)               ; .B/.L size
    BRA     .21
.41:BCLR    #4,-4(A4)               ; same here
    BRA     .21

;; Enhanced (assigns in lists)
.ENHANCE2:
    CMP.W   #2,D0
    BPL     .E2_B
    ADDQ.L  #2,A3
    MOVE.W  .E2_S(PC),(A4)+
    MOVE.L  D3,-(A7)
    BSR     EXP
    MOVE.L  (A7)+,D3
    MOVE.W  .E2_R(PC),(A4)+
    MOVE.W  .42+8(PC),(A4)+
    BRA     .E2_B1

.E2_S:  MOVE.L  A0,-(A7)
.E2_R:  MOVE.L  (A7)+,A0
;*-*
;; Codes
.42:MOVE.W  2(A0),D0
    MOVE.W  2(A0),D1
    MOVE.W  D0,2(A0)
    MOVE.W  2(A0),A0
    LEA 2(A0),A0
    LEA 2(A0),A0
    LEA 2(A0),A0
    LEA 2(A0),A0
;*-*
;; Extended (+=, -=, etc.)
.EXPEXT2:
    CMP.W   #0,D0
    BNE     .E2_B
    MOVE.W  (A3),D1
    CMP.W   #7,D1
    BMI     .E2_B
    CMP.W   #10,D1
    BLE     .EXP_C2
    CMP.W   #49,D1
    BMI     .E2_B
    CMP.W   #50,D1
    BLE     .EXP_C2
    CMP.W   #IOFF+29,D1
    BMI     .E2_B
    CMP.W   #IOFF+30,D1
    BGT     .E2_B
.EXP_C2:
    MOVE.W  (A3),2(A3)
    MOVE.W  #51,(A3)

    LSL.W   #2,D0
    MOVE.W  .42(PC,D0.W),(A4)+      ;
    LSR.W   #2,D0

    MOVE.W  D3,(A4)+
    BSR     .EXTL
    CMP.W   #2,D4
    BEQ.S   .EXP_C2_2
    BPL.S   .EXP_C2_1
    TST.W   D4
    BEQ     ERROR0                  ; compiler shouldn't use this code, anyway..
    BCLR    #5,-4(A4)               ; .B/.L size
    BRA.S   .EXP_C2_2
.EXP_C2_1:
    BCLR    #4,-4(A4)               ; same here
.EXP_C2_2:
    MOVem.L  D3/D4,-(A7)
    MOVE.W  .EXP_ST,(A4)+
    BSR     EXP
    MOVE.W  .EXP_RS,(A4)+
    MOVEQ   #2,D0
    MOVEM.L (A7)+,D3/D4
    moveq   #0,d2
    BRA     .E2_B

.EXP_ST:
    MOVE.L  A0,-(A7)
.EXP_RS:
    MOVE.L  (A7)+,A0
;*-*
;*-*

;; LAST PARTS:

.DO:SUBQ.W  #4,D0           ; DO ADDITIONAL MOVE
    TST.B   .TDRF
    BNE.S   .DLOOP
    LSL.W   #1,D0
    MOVE.W  .MA0(PC,D0.W),(A4)+
    LSR.W   #1,D0
    
.21:    TST.B   .TDRF
    BNE.S   .DLOOP
    MOVEQ   #1,D1           ; OUT!
    BSR GENID
    BRA XIT

.DLOOP: MOVE.W  .KEEPD5,D5
    EXT.L   D5
    MOVE.W  (A3)+,D1
    MOVE.B  .ORIGD0,D0
    BRA.W   .DREFL

.SPEC:  DC.L    0           ; 2 LONGWORDS <-> SAVE
.TDRF:  DC.B    0
.ORIGD0:DC.B    0
.KEEPD5:DC.W    0
.SAVA0: MOVE.L  A0,-(A7)
.RETA0: MOVE.L  (A7)+,A0
.OPTID2:MOVE.L  2(A5),D2

;*-*
;; CODES:

.19:MOVEQ   #0,D0
    MOVEQ   #0,D1
.19A:
    EXT.W   D0
    EXT.W   D1
.19B:
    EXT.L   D0
    EXT.L   D1
.19C:
    EXTB.L  D0
    EXTB.L  D1

.MA0:
    MOVE.L  A0,D0
    MOVE.L  A0,D1
.26:MOVE.L  D0,-(A7)
.27:MOVE.L  (A7)+,D2
    EXG.L   D0,D2
.28:MULU    #1,D2
.29:LSL.L   #1,D2
    LSL.L   #2,D2
    LSL.L   #3,D2
    LSL.L   #4,D2
.30:    MOVE.L  D0,D2


.MOVEQ: CMP.W   #4,D4           ; see if we need a "moveq #0,D0/D1"
    BEQ.S   .MOVEX
    CMP.W   #2,D0
    BPL.S   .MOVEX
    CMP.W   #2,D4
    BEQ.S   .MOVEX
    LSL.L   #1,D0
    MOVE.W  .19(PC,D0.W),(A4)+
    LSR.L   #1,D0
.MOVEX: RTS

.EXTL:  CMP.W   #4,D4           ; see if we need a "EXT.L D0/D1"
    BEQ.S   .EXTX
    CMP.W   #2,D0
    BPL.S   .EXTX
    CMP.W   #1,D4
    BEQ.S   .EXTX
    LSL.L   #1,D0
    MOVE.W  .19B(PC,D0.W),(A4)+
    LSR.L   #1,D0
.EXTX:  RTS

.EXTBL:
    CMP.W   #1,ECPU
    BPL     .EXTBL_2
    LSL.L   #1,D0
    MOVE.W  .19A(PC,D0),(A4)+
    MOVE.W  .19B(PC,D0),(A4)+
    LSR.L   #1,D0
    RTS
.EXTBL_2:
    LSL.L   #1,D0
    MOVE.W  .19C(PC,D0),(A4)+
    LSR.L   #1,D0
    RTS

.EADDRMETHOD2:
    MOVE.L  (A3),A6
    MOVE.L  OASCII(A6),(A3)
    MOVE.W  #42,-(A3)
.EADDRMETHOD:
    MOVE.L  A0,METHODIDENT
    CLR.L   METHODSPEC
    TST.B   .TDRF
    BEQ.S   .NMS
    MOVE.L  .SPEC,METHODSPEC
.NMS:   MOVEM.L (A7)+,D3-D5/A1
    BSR SD0
    BSR EXPCALLMETHOD
    BSR RD0
    MOVEQ   #1,D5
    ADDQ.L  #4,A7           ; FLUSH RTS
    BRA EXPLOOP


PLX:    CMP.W   #35,D1          ; p++  p--
    BPL PLB
    SUBQ.L  #2,A3
    MOVE.L  (A0),D5         ; D5=OBJSIZE
    CMP.L   #MAXOBJSIZE,D5
    BMI.S   .NOBJ
    MOVE.L  D5,A6
    MOVE.W  4(A6),D5
    EXT.L   D5
.NOBJ:  MOVEQ   #4,D6           ; D6=NOPTR
    BRA.S   PLS

PL: MOVEQ   #0,D6           ; D6=PTR
    MOVEQ   #4,D5           ; D5=4(SIZE)
    CMP.W   #IDENT,(A3)+        ; ^p  ^p++  ^p--
    BNE ERROR6
    MOVE.L  (A3)+,A0        ; A0=IDENT
    TST.B   4(A0)
    BEQ ERROR22
    CMP.B   #LAB,4(A0)
    BEQ ERROR6
PLS:    BSR.W   PP

    MOVEQ   #2,D1
    BSR GENID

.6: TST.W   D6
    BEQ.S   .6B
    CMP.W   #1,EXPRECC
    BNE.S   .6B
    TST.W   EXPSTAT
    BNE .SPTR
.6B:
    TST.L   D6
    BNE.S   .6BB
    MOVE.W  .2(PC),(A4)+
    BRA.S   .6BBB
.6BB:   MOVE.W  D0,D3
    LSL.W   #2,D3
    MOVE.W  .2B(PC,D3.W),(A4)+
.6BBB:  BSR GVA0D3_0

    MOVE.W  D0,D3
    LSL.W   #1,D3
    TST.L   D6
    BNE.S   .SPTR
    MOVE.W  .3(PC,D3.W),(A4)+
.SPTR:  
    MOVEQ   #1,D1
    BSR GENID

.7: BRA XIT
.2: MOVE.L  2(A5),A0
.2B:    MOVE.L  2(A5),D0
    MOVE.L  2(A5),D1
.3: MOVE.L  (A0),D0
    MOVE.L  (A0),D1
    MOVE.L  D0,(A0)

PP: MOVEQ   #0,D2           ; D2 (1=++, 2=--, 0=NIX)
    MOVE.W  (A3),D1
    CMP.W   #33,D1
    BNE.S   .P1
    MOVEQ   #1,D2
    ADDQ.L  #2,A3
.P2:    RTS
.P1:    CMP.W   #34,D1
    BNE.S   .P2
    MOVEQ   #2,D2
    ADDQ.L  #2,A3
    RTS
GEND2:  MOVEQ   #-1,D3
    CMP.L   #30000,D1       ; VALUE IN D1, GENCODE FOR D2 (ONLY POSITIVE)
    BPL.S   .G1
    TST.L   D1
    BEQ.S   .G9
    MOVE.L  D1,D3
    RTS
.G9:    ADD.L   #$10000,D0
    RTS
.G1:    MOVE.W  .G3(PC),(A4)+
    MOVE.L  D1,(A4)+
    RTS
.G3:    MOVE.L  #0,D2
GENID:  CMP.L   D1,D2
    BEQ.S   .G4
    RTS
.G4:    SUBQ.L  #1,D1
    MOVE.W  D5,D4           ; d5=objsize, d4=trash
    EXT.L   D4
    CMP.L   #9,D4
    BPL .G5
    CMP.W   #8,D4
    BNE.S   .G8
    MOVEQ   #0,D4
.G8:    LSL.L   #2,D1
    MOVE.W  .G6(PC,D1.L),(A4)+
    LSL.W   #1,D4
    OR.B    D4,-2(A4)
    BRA GVA0D1_0
.G6:    ADDQ.L  #8,2(A5)
    SUBQ.L  #8,2(A5)
.G7:    ADD.L   #1,2(A5)
    SUB.L   #1,2(A5)
.G5:    LSL.L   #3,D1
    MOVE.W  .G7(PC,D1.W),(A4)+
    BSR GVA0D1_0
    BTST    #3,5(A0)
    BEQ.S   .GXX
    MOVE.L  D4,(A4)+
    RTS
.GXX:   MOVE.W  -(A4),D1
    MOVE.L  D4,(A4)+
    MOVE.W  D1,(A4)+
    RTS
GENADD: TST.L   D1          ; value in d1
    BNE.S   .GA1
    RTS
.GA1:   CMP.L   #9,D1
    BPL.S   .GA5
    CMP.W   #8,D1
    BNE.S   .GA8
    MOVEQ   #0,D1
.GA8:   MOVE.W  .GA6(PC),(A4)+
    LSL.W   #1,D1
    OR.B    D1,-2(A4)
    RTS
.GA5:   MOVE.W  .GA7(PC),(A4)+
    MOVE.L  D1,(A4)+
    RTS
.GA6:   ADDQ.L  #8,D2
.GA7:   ADD.L   #1,D2


XIT:    MOVEM.L (A7)+,D3-D5/A1
    RTS

;*-*
;; NilCheck
; WERE NOT TO DISTURB ANY REGS, NOT EVEN IN GENERATED CODE (D1?)
; (IN CODE): PTR TO CHECK IS IN A0

NILCHECK:
    MOVEM.L D0/D1/A0/A6,-(A7)
    MOVE.L  .CH(PC),(A4)+
    MOVE.L  A4,A6           ; A6=BRANCH BACKPATCH
    MOVE.L  .ARGS(PC),(A4)+
    MOVE.L  .ARGS+4(PC),(A4)+
    MOVE.W  LINENUM(PC),D0
    ADDQ.W  #1,D0
    MOVE.W  D0,(A4)+
    MOVEQ   #90+10,D0       ; D0=FASTNEW
    MOVE.B  #-1,EFUNCBYTE+90    ; fastnew=91
    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.W  .SB(PC),(A4)+
    MOVE.L  A4,D0
    SUB.L   A6,D0
    MOVE.B  D0,-(A6)
    MOVEM.L (A7)+,D0/D1/A0/A6
    RTS
.CH:    MOVE.L  A0,D1
    BNE.S   .CH
.ARGS:  MOVE.L  #"NIL",-(A7)
    PEA $10.W
.SB:    ADDQ.L  #8,A7
.5: JSR .CH
.4: BSR.W   .CH
;*-*
OBJ_EXECBASE:
    DC.L    0
;*-*
    IFEQ MY_EXP_HANDLER
;; Expression main
EXPRECC:  DC.W    0       ; RECURSION DEPTH OF EXP()
;; Main expression loop
EXP:              ; GENERATES EXP FOR D0
    MOVE.L  #0,LASTVAR
    MOVEM.L D3-D5/A1/A2,-(A7)   ; WE DO HEAVY RECURSION
    MOVE.W  FLTFLAG(PC),-(A7)
    CLR.W   FLTFLAG
    ADDQ.W  #1,EXPRECC
    MOVEQ   #6,D4           ;
    MOVEQ   #-1,D5          ; MUST BE = EXPBUT
    LEA EXPMOVE(PC),A1      ;

    CMP.W   #51,(A3)
    BNE     EXPLOOP
    MOVEQ   #1,D5           ; variable
    ADDQ.L  #2,A3

EXPLOOP:
    MOVE.W  (A3)+,D0
    BEQ EXPOUT
    CMP.W   #COM,D0
    BEQ EXPOUT
    CMP.W   #7,D0
    BPL EXPOPERATOR
EXPBACK:
    CMP.W   #IDENT,D0
    BEQ EXPVAR
    CMP.W   #STR,D0
    BEQ EXPSTRING
    CMP.W   #VALUE,D0
    BEQ EXPVALUE
    CMP.W   #11,D0
    BPL EXPCOMPARATOR
EXPBACK2:
    CMP.W   #17,D0
    BEQ EXPREC
    CMP.W   #LIBC,D0
    BEQ EXPLIBCALL
    CMP.W   #22,D0
    BEQ EXPEFUNC
    CMP.W   #23,D0
    BEQ CURLY
    CMP.W   #29,D0
    BEQ EXPIMMLIST
    CMP.W   #18,D0
    BEQ EXPOUT
    CMP.W   #30,D0
    BEQ EXPOUT
    CMP.W   #53,D0
    BEQ     EXPSWAP
    CMP.W   #32,D0
    BEQ.W   EXPPTR
    CMP.W   #IOFF+29,D0
    BPL EXPLOG
ANDORNOTBACK:
    CMP.W   #19,D0
    BEQ.S   EXPOUT
    CMP.W   #IOFF+2,D0
    BEQ EXPIF
    CMP.W   #IOFF+50,D0
    BEQ EXPSIZEOF
    CMP.W   #36,D0
    BEQ EXPQUOTE
    CMP.W   #37,D0
    BEQ EXPFLT
    CMP.W   #IOFF+63,D0
    BEQ EXPNEW
    CMP.W   #IOFF+55,D0
    BEQ EXPBUT
    CMP.W   #43,D0
    BEQ EXPFLOATVAL
    CMP.W   #40,D0
    BEQ EXPUNIFY
    CMP.W   #IOFF+66,D0
    BEQ EXPSUPER
    CMP.W   #46,D0
    BEQ EXPOUT
    CMP.W   #49,D0
    BEQ EXPSHIFT
    CMP.W   #50,D0
    BEQ EXPSHIFT
    CMP.W   #54,D0
    BEQ EXPLIBFUNC
    CMP.W   #52,D0
    BEQ EXPQMARK            ; ?
    CMP.W   #IOFF,D0
    BMI ERROR0
EXPOUT:
    TST.W   FLTFLAG
    BEQ .0
    BTST    #1,CODEPREFS
    BEQ .0
    CMP.L   #EXPCMP,A1
    BEQ .0
    MOVE.L  .C0(PC),(A4)+
.0:
    SUBQ.L  #2,A3
    CMP.W   #1,D5
    BNE ERROR0
    SUBQ.W  #1,EXPRECC
    MOVE.W  (A7)+,FLTFLAG
    MOVEM.L (A7)+,D3-D5/A1/A2
    RTS
.C0:FMOVE.S FP0,D0
;*-*
;; "^"
EXPPTR:
    CMP.W   #1,D5
    BEQ ERROR0
    MOVEQ   #1,D0
    SUBQ.L  #2,A3
    BSR EADDRESSMODI
    CMP.W   #-1,D5
    BEQ.S   .1
    BSR CLOSEEXP
.1: MOVEQ   #1,D5
    BRA EXPLOOP
;*-*
;; BUT
EXPBUT:
    CMP.W   #1,D5
    BNE ERROR0
;   MOVE.W  (A3),D0
;   CMP.W   #IOFF+29,D0
;   BEQ.S   .A
;   CMP.W   #IOFF+30,D0
;   BEQ.S   .O
    MOVEQ   #6,D4           ;
    MOVEQ   #-1,D5          ; = START OF EXP
    LEA EXPMOVE(PC),A1      ;
    BRA EXPLOOP
;.A:    MOVE.W  .EQ(PC),D0
;   BRA.S   .S
;.O:    MOVE.W  .NE(PC),D0
;.S:    ADDQ.L  #2,A3
;   MOVE.W  .TST(PC),(A4)+
;   MOVE.W  D0,(A4)+
;   MOVE.L  A4,A0
;   CLR.W   (A4)+
;   MOVE.L  A0,-(A7)
;   BSR.W   EXP
;   MOVE.L  (A7)+,A0
;   MOVE.L  A4,D0
;   SUB.L   A0,D0
;   MOVE.W  D0,(A0)
;   MOVEQ   #1,D5
;   BRA EXPLOOP
;.EQ:   BEQ.W   .A
;.NE:   BNE.W   .A
;.TST:  TST.L   D0

;*-*
;; Macro section
; RETURNS: 0=LIST, 1,2,4=SIMPLE, PTR=OBJECT

GTYPE:  MACRO               ; \1=TRASH.AX, \2=RESULT.DX
    MOVEQ   #0,\2
    MOVE.L  (A3)+,\1
    ADD.L   A3,\1
    SUBQ.L  #4,\1
    CMP.W   #19,(\1)+
    BNE.S   .GTOUT
    MOVE.W  (\1)+,\2
    CMP.W   #IOFF+20,\2
    BMI.S   .GT1
    CMP.W   #IOFF+23,\2
    BPL.S   .GT1
    SUB.W   #IOFF+20,\2
    MOVE.B  .GTTAB(PC,\2.W),\2
    EXT.W   \2
    EXT.L   \2
    BRA.S   .GTOUT
.GT1:   CMP.W   #31,\2
    BNE.S   .GTER
    MOVE.L  (\1),\2
    BRA.S   .GTOUT
.GTTAB: DC.B    4,2,1,0
.GTER:  MOVE.L  \1,A3
    BRA ERROR0
.GTOUT:
    ENDM

GEAT:   MACRO               ; \1=THRASH.DX
    CMP.W   #19,(A3)
    BNE.S   .GTDONE
    ADDQ.L  #2,A3
    MOVE.W  (A3)+,\1
    CMP.W   #IOFF+20,\1
    BMI.S   .GT9
    CMP.W   #IOFF+23,\1
    BMI.S   .GTDONE
.GT9:   CMP.W   #31,\1
    BNE ERROR0
    ADDQ.L  #4,A3
.GTDONE:
    ENDM
;*-*
;; SUPER
EXPSUPER:
    CMP.W   #1,D5
    BEQ ERROR0
    BSR SD0
    BSR SUPEREXP
    BSR RD0
    MOVEQ   #1,D5
    BRA EXPLOOP
SUPEREXP:
    CMP.W   #IDENT,(A3)+
    BNE ERROR0
    MOVE.L  (A3)+,A0        ; A0=IDENT
    MOVE.L  A0,METHODIDENT
    TST.B   4(A0)
    BEQ ERROR22
    CMP.B   #LAB,4(A0)
    BEQ ERROR6
    MOVE.L  (A0),A6         ; A6=OBJ
    CMPA.L  #MAXOBJSIZE,A6
    BMI.W   ERROR33
    MOVE.L  OSUPER(A6),D0
    BEQ ERROR50
    MOVE.L  D0,A6           ; A6=SUPER
    TST.W   ODEL(A6)
    BEQ ERROR40
    CMP.W   #35,(A3)+
    BNE ERROR0
    MOVE.L  A6,METHODFREEZ
    CLR.L   METHODSPEC
    BSR EXPCALLMETHOD       ; call SUPER-METHOD
    MOVE.L  METHODFREEZ(PC),A6
    CLR.L   METHODFREEZ
    RTS
;*-*
;; NEW
EXPNEW:
    CMP.W   #1,D5
    BEQ ERROR0
    BSR.W   SD0
    MOVEQ   #0,D0
    BSR.S   NEWEXP
    BSR.W   RD0
    MOVEQ   #1,D5
    BRA EXPLOOP
NEWEXP:
    MOVE.W  D0,-(A7)
.NLOOP: CMP.W   #IDENT,(A3)+
    BNE .NL
    MOVE.L  (A3)+,A0        ; A0=IDENT
    TST.B   4(A0)
    BEQ ERROR22
    CMP.B   #LAB,4(A0)
    BEQ ERROR6

    MOVE.W  #-1,.ISM

    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  A1,-(A7)
    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.L  (A7)+,A1
.0:
    CMP.W   #29,(A3)
    BNE.S   .1
    ADDQ.L  #6,A3           ; ALSO SKIP ]OFFSET
    MOVEM.L A0/D0/A6,-(A7)      ; NEW p[exp]
    BSR EXP
    MOVEM.L (A7)+,A0/D0/A6
    CLR.W   .SINGL
    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: MOVE.W  .S2(PC),(A4)+       ; just NEW p
    MOVE.W  D0,(A4)+
    MOVE.W  #1,.SINGL

.2: MOVE.L  D0,D1           ; D1=OBJECTSIZE NOW
    BSR .GNEW
    MOVE.W  .A(PC),(A4)+

    MOVE.W  .ISM(PC),D1
    BPL.W   .A0O

    MOVE.W  .ST(PC),(A4)+
    BSR GVA0D0_9
    BRA.S   .NA0O

.A0O:   MOVE.W  .ST2(PC),(A4)+
    BSR GVA0D0_0
    MOVE.W  .ST3(PC),(A4)+
    MOVE.W  D1,(A4)+
.NA0O:
    TST.W   .SINGL
    BEQ.W   .3

    MOVE.L  A6,D0
    BEQ.W   .4B
    TST.W   ODEL(A6)
    BEQ.W   .4B
    MOVE.L  A0,METHODIDENT
    GETM    A0
    MOVE.L  OACC(A6),(A0)
    MOVE.L  A0,OACC(A6)
    ADDQ.L  #4,A0
    MOVE.W  .GOBJ(PC),(A4)+
    TST.W   ODELOFF(A6)
    BNE.S   .G1
    MOVE.W  .GOBJ2(PC),(A4)+
    MOVE.L  A4,(A0)+
    CLR.W   (A4)+
    BRA.S   .G2
.G1:    MOVE.W  .GOBJ3(PC),(A4)+
    MOVE.L  A4,(A0)+
    CLR.W   (A4)+
    MOVE.W  ODELOFF(A6),(A4)+
.G2:    CLR.W   (A0)+
    DONEM   A0
    CMP.W   #35,(A3)
    BNE.S   .4B
    ADDQ.L  #2,A3

    CLR.L   METHODSPEC
    TST.W   .ISM
    BMI.S   .NMS
    MOVE.L  A6,METHODSPEC
.NMS:
    MOVE.L  METHODIDENT(PC),-(A7)
    BSR EXPCALLMETHOD       ; call constructor on memory
    MOVE.L  (A7)+,METHODIDENT
    TST.W   (A7)
    BNE.S   .4B
    MOVE.W  .MV(PC),(A4)+
    MOVE.L  METHODIDENT(PC),A0
    BSR GVA0D0_0
    BRA.S   .4B
.3:
    MOVE.L  A6,D0
    BEQ.S   .4B
    TST.W   ODEL(A6)
    BNE ERROR40
.4B:    
.XXXX:  TST.W   (A7)
    BEQ.S   .X1
    CMP.W   #COM,(A3)+
    BEQ .NLOOP
    SUBQ.L  #2,A3
.X1:    ADDQ.L  #2,A7
    RTS

.SINGL: DC.W    0
.ISM:   DC.W    0
.MV:    MOVE.L  2(A5),D0
.M: MULU    #6,D0
.LSL1:  LSL.L   #1,D0
.LSL2:  LSL.L   #2,D0
.S1:    MOVE.L  D0,-(A7)
.S2:    PEA 1.W
.5: JSR .M
.4: BSR.W   .M
.A: ADDQ.L  #4,A7
.ST:    MOVE.L  D0,2(A5)
.ST2:   MOVE.L  2(A5),A0
.ST3:   MOVE.L  D0,4(A0)
;.ST4:  MOVE.L  D0,A0
.GOBJ:  MOVE.L  D0,A0
.GOBJ2: MOVE.L  4(A4),(A0)
.GOBJ3: MOVE.L  4(A4),4(A0)

; GNEW TRASHES NOTHING

.GNEW:  MOVEM.L D0/D1/A0,-(A7)
    MOVEQ   #110+10,D0      ; D0=FASTNEW
    MOVE.B  #-1,EFUNCBYTE+110   ; fastnew=111
    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:    MOVEM.L (A7)+,D0/D1/A0
    RTS

.AD:    MOVE.L  D0,(A7)
.ALLD:  MOVE.L  (A7)+,D0
.LOAD:  MOVE.L  (A7),A6

.NL:    CMP.W   #29,-2(A3)
    BNE ERROR6
    MOVE.W  .S2(PC),(A4)+
    MOVE.L  A4,A6           ; A6=BACKPATCH
    CLR.W   (A4)+
    BSR .GNEW
    MOVE.W  .AD(PC),(A4)+
    MOVEQ   #0,D6           ; D6=TOTAL MEM USED
    GTYPE   A0,D7           ; D7=OBJECT OR NIL
    MOVE.L  D7,D2           ; D2=ADDSIZE IF NIL, ELSE CURMEMBER
    AND.L   #7,D2
    CMP.L   D2,D7
    BNE.S   .TIO
    MOVEQ   #0,D7
    MOVE.L  D2,D1           ; D1=STORESIZE
    TST.L   D2
    BNE.S   .TTD
    MOVEQ   #4,D2           ; true list
    MOVEQ   #4,D6           ; 4 EXTRA, ONLY 2 USED!
    BRA.S   .TTD
.TIO:   MOVE.L  D7,A0
    TST.W   (A0)
    BNE ERROR60
    MOVE.L  OMEMB(A0),D2
    MOVE.L  D2,A0
    MOVE.W  (A0),D6
    EXT.L   D6
.TTD:   CMP.W   #30,(A3)
    BEQ.S   .NLO
.NLL:   TST.L   D7
    BEQ.S   .NOBJ
    TST.L   D2
    BEQ ERROR46
    MOVE.L  D2,A0
    ;MOVE.L OASCII(A0),D1       ; PRIVATE MEMBER IN OBJECT
    ;BEQ    ERROR60
    ;BTST   #0,OFLAGS(A0)
    ;BNE    ERROR60
    MOVE.W  OSIZE(A0),D1        ; ARRAY IN OBJECT
    BEQ ERROR40
.NOBJ:  MOVEM.L D1/D2/D6/D7/A6,-(A7)
    BSR EXP
    MOVEM.L (A7)+,D1/D2/D6/D7/A6
    MOVE.W  .LOAD(PC),(A4)+
    MOVE.B  .TAB(PC,D1.W),D0
    EXT.W   D0
    MOVE.W  .STORE(PC,D0.W),(A4)+
    MOVE.W  D6,(A4)+
    TST.L   D7
    BNE.S   .TOBJ
    ADD.L   D2,D6
    BRA.S   .NLO
.STORE: MOVE.B  D0,2(A6)
    MOVE.W  D0,2(A6)
    MOVE.L  D0,2(A6)
.TAB:   DC.B    8,0,4,0,8,0
.TOBJ:  MOVE.L  D2,A0
    MOVE.L  -(A0),A0
    MOVE.L  A0,D2           ; stop if last in memberchain
    BEQ.S   .TEND
    MOVE.W  (A0),D6
    EXT.L   D6
    BRA.S   .NLO
.TEND:  CMP.W   #30,(A3)+
    BNE ERROR0
    BRA.S   .TC
.NLO:   CMP.W   #COM,(A3)+      ; end of loop
    BEQ.S   .NLL
    CMP.W   #30,-2(A3)      ; expect an "]"
    BNE ERROR0
.TC:    TST.L   D7
    BNE.S   .SK1A           ; only if its a list, NO OBJ, SIZE=4
    CMP.W   #4,D2
    BNE.S   .SK1
    CMP.W   #19,(A3)        ; IF ":" THEN IT WASN'T A LIST
    BEQ.S   .SK1
    MOVE.L  .SL(PC),(A4)+
    MOVE.L  D6,D0
    LSR.L   #2,D0
    SUBQ.L  #1,D0
    MOVE.W  D0,(A4)+
    MOVE.W  D0,(A4)+
    MOVE.W  .SL2(PC),(A4)+
    BRA.S   .SK2
.SK1A:  MOVE.L  D7,A0
    MOVE.W  OSIZE(A0),D6
    BEQ ERROR40
    EXT.L   D6
.SK1:   MOVE.W  .ALLD(PC),(A4)+
.SK2:   MOVE.W  D6,(A6)
    GEAT    D0
    AND.L   #$FFFF8000,D6
    BNE ERROR46
    BRA.W   .XXXX
.SL:    MOVE.L  (A7)+,A6
    MOVE.L  #2,(A6)+
.SL2:   MOVE.L  A6,D0
;*-*
;; "?"
EXPQMARK:
    CMP.W   #1,D5
    BNE     ERROR0
    MOVE.W  #$4A80,(A4)+        ; TST.L D0
    MOVE.W  #$6700,(A4)+        ; BNE   xxx
    MOVE.L  A4,-(A7)
    CLR.W   (A4)+               ; BNE   (*+2) - temp

    BSR     EXP                 ; <EXP>

    CMP.W   #19,(A3)            ; "... ? <a> : <b>" ?
    BNE     .1
    MOVE.W  #$6000,(A4)+        ; BRA   xxx
    MOVE.L  A4,A1
    CLR.W   (A4)+               ; BRA   (*+2) - temp
.1:
    MOVE.L  A4,D0
    MOVE.L  (A7),A0
    SUB.L   (A7)+,D0
    MOVE.W  D0,(A0)             ; make _real_ BNE

    CMP.W   #19,(A3)            ; <a> ? <b> [: <c>]
    BNE     .X
    ADDQ.L  #2,A3
    MOVE.L  A1,-(A7)
    BSR     EXP
    MOVE.L  A4,D0
    MOVE.L  (A7),A0
    SUB.L   (A7)+,D0
    MOVE.W  D0,(A0)
.X: BRA     EXPLOOP
;*-*
;; "{"
CURLY:
    CMP.W   #1,D5
    BEQ ERROR0
    CMP.W   #IDENT,(A3)+
    BNE ERROR4
    MOVE.L  (A3)+,A0
    BTST    #3,5(A0)
    BNE ERROR50         ; YOU CAN'T GET THE ADDRESS OF A REG :-)
    CMP.B   #LAB,4(A0)
    BNE.W   .3
    BTST    #4,5(A0)        ; THE LAB VERSION
    BNE ERROR4          ; (NO ADR OF METHOD)

    MOVE.W  10(A0),D0
    BMI.S   .MINM
    MOVE.L  .1(PC),(A4)+
    MOVE.W  .1L(PC),NEWOP
    BSR ADDBRANCH
    BRA.S   .D
.MINM:  MOVE.W  .1L(PC),(A4)+       ; ADR OF LABEL OF OTHER MODULE
    GETM    A6
    MOVE.L  A1,-(A7)
    MOVE.L  VARHEAVY(A0),A1     ; A1=PTR TO PROCCLASS
    MOVE.L  PC_ACC(A1),D0
    MOVE.L  A6,PC_ACC(A1)
    MOVE.L  D0,(A6)+
    MOVE.L  A4,(A6)+
    MOVE.L  (A7)+,A1
    DONEM   A6
    CLR.L   (A4)+
.D:
    CMP.W   #-1,D5
    BNE.S   .8
    MOVE.W  .4(PC),(A4)+
    BRA.S   .9
.8: MOVE.W  .2(PC),(A4)+
    BSR CLOSEEXP
.9: CMP.W   #24,(A3)+
    BNE ERROR29
    MOVEQ   #1,D5
    BRA EXPLOOP
.1: LEA .1(PC),A0
.1L:    LEA .1,A0
.2: MOVE.L  A0,D1
.4: MOVE.L  A0,D0
.5: LEA 2(A5),A0
.3: MOVE.W  .5(PC),(A4)+        ; THE VAR VERSION
    BSR GVA0D2_0
    CMP.W   #-1,D5
    BNE.S   .6
    MOVE.W  .4(PC),(A4)+
    BRA.S   .7
.6: MOVE.W  .2(PC),(A4)+
    BSR CLOSEEXP
.7: MOVEQ   #1,D5
    CMP.W   #24,(A3)+
    BNE ERROR29
    BRA EXPLOOP
;*-*
;; "'"
STRINGLINK:   DC.L    0

EXPSTRING:
    CMP.W   #1,D5
    BEQ ERROR0
    MOVEQ   #0,D0
    ADDQ.L  #2,A3
    MOVE.W  (A3)+,D0        ; D0=STRINGLENGTH IN W
    LEA EXPSTRINGCODE(PC),A0
    CMP.W   #-1,D5
    BNE.S   .SK
    LEA EXPSTRINGCODE2(PC),A0
.SK:    MOVE.L  (A0)+,(A4)+
    MOVEM.L A0/D0,-(A7)
    BSR.W   NEWLABEL        ; ->D0
    MOVE.W  LONGLEA(PC),NEWOP
    BSR ADDBRANCH
    GETM    A6          ; A6=HEAP
    MOVE.L  STRINGLINK(PC),(A6)
    MOVE.L  A6,STRINGLINK
    ADDQ.L  #4,A6
    MOVE.W  D0,(A6)+
    MOVEM.L (A7)+,D0/A0
    MOVE.L  A3,(A6)+
    MOVE.L  A6,D7           ; D7=LASTPTR
    CLR.L   (A6)+
    LSL.W   #1,D0
    MOVE.W  D0,D2           ; D2=TOTALLEN STRINGS
    EXT.L   D2
    ADD.W   D0,A3
    MOVE.W  (A0)+,(A4)+
    DONEM   A6
PLUSTRINGS:
    CMP.L   #$70006,(A3)
    BNE.S   .X
    ADDQ.L  #6,A3
    MOVE.W  (A3)+,D0
    GETM    A6
    MOVE.L  D7,A0
    MOVE.L  A6,(A0)
    MOVE.L  A3,(A6)+
    MOVE.L  A6,D7
    CLR.L   (A6)+
    DONEM   A6
    LSL.W   #1,D0
    EXT.L   D0
    ADD.L   D0,D2
    ADD.W   D0,A3
    BRA.S   PLUSTRINGS
.X: CMP.W   #-1,D5
    BEQ.S   .1
    BSR CLOSEEXP
.1: MOVEQ   #1,D5
    CMP.L   #800,D2
    BPL ERROR46
    BRA EXPLOOP


EXPSTRINGCODE:
    LEA EXPSTRINGCODE2(PC),A0   ; 6-2 BYTES
    MOVE.L  A0,D1
EXPSTRINGCODE2:
    LEA EXPSTRINGCODE(PC),A0    ; 6-2 BYTES
    MOVE.L  A0,D0
LONGLEA:
    LEA EXPSTRINGCODE,A0

MAKESTRLEN:
    MOVE.L  #0,-36(A4)
MAKESTRLEN2:
    MOVEQ   #0,D0
    MOVE.L  D0,-36(A4)

D0EXT:    EXT.L   D0
;*-*
;; "("
EXPREC:
    CMP.W   #1,D5
    BEQ ERROR0
    BSR.W   SD0
    BSR.W   EXP
    BSR.W   RD0
    ADDQ.L  #2,A3
    MOVEQ   #1,D5
    BRA EXPLOOP
;*-*
;; "<>"
EXPCONSNIL:
    MOVEQ   #1,D5
    MOVEQ   #0,D1
    BRA VALUENTRY
;*-*
;; <x>
EXPCONS:
    CMP.W   #1,D5
    BEQ ERROR0
    BSR.W   SD0
    CLR.W   -(A7)
.XL:MOVE.W  #16,EAREQUEST
    BSR EAEXP
    TST.L   D0
    BNE.S   .OPT
    MOVE.W  .4(PC),(A4)+
.OPT:   ADDQ.W  #4,(A7)
    CMP.W   #COM,(A3)+
    BEQ.S   .XL
    CMP.W   #46,-(A3)
    BNE.S   .NC
    ADDQ.L  #2,A3
    MOVE.W  #16,EAREQUEST
    BSR EAEXP
    TST.L   D0
    BNE.S   .OPT2
    MOVE.W  .4(PC),(A4)+
.OPT2:  BRA.S   .D
.NC:    MOVE.W  .5(PC),(A4)+
.D: CMP.W   #12,(A3)+
    BNE ERROR0
    MOVE.W  .6(PC),(A4)+
    MOVE.W  (A7),D0
    SUBQ.W  #4,D0
    MOVE.W  D0,(A4)+
    MOVE.L  #120+10,D0      ; D0=CONS
    MOVE.B  #-1,EFUNCBYTE+120   ; _Cons=121
    MOVE.L  .4B(PC),(A4)+       ; GEN CALL
    TSTMOD
    BNE.S   .MOD
    MOVE.W  .5B(PC),NEWOP
    BSR ADDBRANCH
    BRA.S   .CC
.MOD:   SUBQ.L  #4,A4
    MOVE.W  .5B(PC),(A4)+
    BSR ADDBRANCHRELOC
    MOVE.W  D0,-2(A4)
.CC:    MOVE.W  .7(PC),(A4)+
    MOVE.W  (A7)+,D0
    ADDQ.W  #8,D0
    MOVE.W  D0,(A4)+
    BSR.W   RD0
    MOVEQ   #1,D5
    BRA EXPLOOP
.4: MOVE.L  D0,-(A7)
.5: CLR.L   -(A7)
.6: PEA 0.W
.5B:    JSR .4
.4B:    BSR.W   .4
.7: LEA 4(A7),A7
;*-*
;; "!"
EXPFLT:
    BTST    #1,CODEPREFS
    BNE     .FP
    BSET    #3,CODEPREFS+1      ; USE MATHIEEESINGBAS
    CMP.W   #0,D5
    BEQ ERROR0          ; ALWAYS AFTER (1) OR (-1)
    LEA .2(PC),A0
    TST.W   FLTFLAG
    BEQ.S   .1
    CLR.W   FLTFLAG         ; CLEAR FLOATMODUS
    CMP.W   #-1,D5
    BEQ ERROR0
    MOVE.L  (A0)+,(A4)+
    MOVE.W  (A0)+,(A4)+
    MOVE.W  #-30,(A4)+
    BRA EXPLOOP
.1: MOVE.W  #-1,FLTFLAG     ; SET FLOATMODUS
    CMP.W   #-1,D5
    BEQ.S   .3
    MOVE.L  (A0)+,(A4)+
    MOVE.W  (A0)+,(A4)+
    MOVE.W  #-36,(A4)+
.3: BRA EXPLOOP
.2: MOVE.L  -56(A4),A6
    JSR -30(A6)

.FP:
    CMP.W   #0,D5
    BEQ ERROR0          ; ALWAYS AFTER (1) OR (-1)
    TST.W   FLTFLAG
    BEQ.S   .F1
    CLR.W   FLTFLAG         ; CLEAR FLOATMODUS
    CMP.W   #-1,D5
    BEQ ERROR0
    MOVE.L  .F2(PC),(A4)+
    BRA EXPLOOP
.F1:MOVE.W  #-1,FLTFLAG     ; SET FLOATMODUS
    CMP.W   #-1,D5
    BEQ.S   .F3
    MOVE.L  .F2+4(PC),(a4)+
.F3:BRA EXPLOOP
.F2:FMOVE.L FP0,D0
    FMOVE.L D0,FP0
;*-*
;; "`"
EXPQUOTE:
    CMP.W   #1,D5
    BEQ ERROR0
    BSR.W   SD0
    LEA .1(PC),A0
    MOVE.L  (A0)+,(A4)+
    MOVE.L  (A0)+,(A4)+
    MOVE.W  (A0)+,(A4)+
    MOVE.L  A4,-(A7)
    BSR.W   EXP
    MOVE.W  .2(PC),(A4)+
    MOVE.L  (A7)+,A0
    MOVE.L  A4,D0
    SUB.L   A0,D0
    ADDQ.L  #2,D0
    MOVE.W  D0,-2(A0)
    BSR.W   RD0
    MOVEQ   #1,D5
    BRA EXPLOOP
.1: LEA .2(PC),A0
    MOVE.L  A0,D0
    BRA .1
.2: RTS
;*-*
;; SIZEOF
EXPSIZEOF:
    MOVE.W  (A3),D0
    CMP.W   #IOFF+20,D0
    BPL.S   .1
    CMP.W   #IDENT,D0
    BEQ     .4
    CMP.W   #31,D0
    BNE ERROR40
    MOVE.W  #VALUE,(A3)+
    MOVE.L  (A3),A0
    MOVE.W  4(A0),2(A3)
    BEQ ERROR40
    CLR.W   (A3)
    BRA EXPVALUE
.1: CMP.W   #IOFF+23,D0
    BPL ERROR0
    ADDQ.L  #2,A3
    SUB.W   #IOFF+20,D0
    CMP.W   #1,D5
    BEQ ERROR0
    BSR.W   SD0
    MOVE.B  .3(PC),(A4)+
    MOVE.B  .2(PC,D0.W),(A4)+
    BSR.W   RD0
    MOVEQ   #1,D5
    BRA EXPLOOP
.4: ADDQ.L  #2,A3
    MOVE.L  (A3)+,A0
    MOVE.L  (A0),D0
    CMP.L   #4,D0
    BLE     .5
    MOVE.L  D0,A0
    MOVE.W  OSIZE(A0),D0
.5: CMP.W   #126,D0
    BGT     .6
    BSR SD0
    MOVE.B  .3(PC),(A4)+
    MOVE.B  D0,(A4)+
    BSR RD0
    MOVEQ   #1,D5
    BRA EXPLOOP
.6: BSR SD0
    MOVE.W  .7(PC),(A4)+
    EXT.L   D0
    MOVE.L  D0,(A4)+
    BSR RD0
    MOVEQ   #1,D5
    BRA EXPLOOP

.2: DC.B    4,2,1,0
.3: MOVEQ   #0,D0
.7: MOVE.L  #0,D0
;*-*
;; IF
EXPIF:
    MOVE.L  D0,D7           ; FOR DOJOB
    CMP.W   #1,D5
    BEQ ERROR0
    BSR.W   SD0
    CLR.W   ELSECHECK
    MOVE.L  A5,-(A7)
    MOVEM.L D3-D5/A1/A2,-(A7)
    BSR.W   DOKEYWORD
    MOVEM.L (A7)+,D3-D5/A1/A2
    CMP.L   (A7)+,A5
    BNE ERROR41
    TST.W   ELSECHECK
    BEQ ERROR41
    BSR     RD0
    MOVEQ   #1,D5
    BRA EXPLOOP

ELSECHECK:    DC.W    0
;*-*

;; Inter-expression codes

EXPRCODE1:
    MOVE.L  D0,-(A7)
FEXPRCODE1:
    FMOVE.S FP0,-(A7)   ; 4
    FMOVE   FP0,FP0     ; 4
EXPRCODE2:
    MOVE.L  D0,D1
    MOVE.L  (A7)+,D0
FEXPRCODE2:
    FMOVE.X FP0,FP1     ; 4
    FMOVE.S (A7)+,FP0   ; 4
    FSMOVE.S (A7)+,FP0  ; 4
    FMOVE   FP0,FP0     ; 4
FEXPRCODE_USED_REGS:
    DC.W    0           ; shouldn't fail ;)
EXTL:
    EXT.W   D0
    EXT.L   D0
EXTBL:
    EXTB.L  D0
MOVEQ:
    MOVEQ   #0,D0
;*-*
;; Extend D0
EXP_EXTD0:
    CMP.W   #1,ECPU     ;020+ mode?
    BPL     .020
    MOVE.L  EXTL(PC),(A4)+
    RTS
.020:
    MOVE.W  EXTBL(PC),(A4)+
    RTS
;*-*

;; ExpSwap
EXPSWAP:
    MOVE.L  LASTVAR,-(A7)
    TST.L   LASTVAR
    BEQ     ERROR0
    BSR SD0
    BSR EXP
    MOVEQ   #1,D4
    BSR RD0
    TST.L   LASTVAR
    BEQ     ERROR0
    MOVe.L  LASTVAR,A0
    MOVE.W  .1(PC),(A4)+
    BSR GVA0D0_0
    MOVe.L  (A7)+,a0
    MOVE.W  .2(PC),(A4)+
    BSR GVA0D0_0
    BRA EXPLOOP

.1: MOVE.L  D0,2(A5)
.2: MOVE.L  D1,2(A5)
;*-*

;; CloseExp
CLOSEEXP:
    TST.W   FLTFLAG
    BNE.S   CLOSEFLT
CLFLTB:
    CMP.B   #1,D4
    BEQ     .2
    CMP.W   #2,D4
    BEQ.S   .1
    CMP.W   #3,D4
    BEQ     .S
    MOVE.W  4(A1,D4.W),(A4)+    ; OP
    CMP.L   #EXPDIV,A1
    BNE.S   .2
    MOVE.W  D0EXT(PC),(A4)+
.2: RTS
.1: MOVE.W  10(A1),(A4)+        ; CMP
    MOVE.W  D3,(A4)+
    BSR EXP_EXTD0
    RTS
.S: MOVE.W  (A1),(A4)+
    RTS
;*-*
;; CloseFlt
CLOSEFLT:
    CMP.W   #-1,D5          ; NO MOVE
    BEQ.S   CLFLTB
    CMP.L   #EXPCMP,A1      ; NO AND/OR
    BMI.S   CLFLTB
    MOVE.L  D0,-(A7)
    CMP.W   #5,D1
    BLE     .3
    BSR MAKEFLTOPER
    TST.W   D0
    BNE.S   .2          ; SEE IF SPCMP
    btst    #1,CODEPREFS
    bne .4
    MOVE.W  D3,(A4)+
    BSR     EXP_EXTD0
.2: MOVE.L  (A7)+,D0
    RTS
.3: move.w  #1,FINISHFPEXP
    bsr MAKEFLTOPER
    TST.W   D0
    BNE.S   .2          ; SEE IF SPCMP
.4:
    bsr EXPFPCMP
    bra .2

;*-*
;; Restore
RD0:CMP.W   #-1,D5
    BEQ.S   .1
    BTST    #1,CODEPREFS
    BEQ     .0
    TST.W   FLTFLAG
    BNE     .2
.0: MOVE.L  EXPRCODE2(PC),(A4)+
    BSR CLOSEEXP
.1: RTS
.2: 
    subq.w  #1,FEXPRCODE_USED_REGS
    move.w  FEXPRCODE_USED_REGS,D1
    cmp.w   #5,d1
    ble     .4
    MOVE.L  FEXPRCODE2(PC),(A4)+
    CMP.W   #2,EFPU
    BPL     .3
    MOVE.L  FEXPRCODE2+4(PC),(A4)+
    BSR CLOSEEXP
    RTS
.3: MOVE.L  FEXPRCODE2+8(PC),(A4)+
    BSR CLOSEEXP
    RTS
.4:
;    move.l  FEXPRCODE2(PC),(A4)+
;    move.l  FEXPRCODE2+12(PC),(A4)+
;    addq.l  #2,d1
;    lsl.w   #8,d1
;    lsl.w   #2,d1
;    or.w    d1,-2(a4)
    bra CLOSEEXP
;*-*
;; Store
SD0:    CMP.W   #-1,D5
    BEQ.S   .1
    BTST    #1,CODEPREFS
    BEQ .0
    TST.W   FLTFLAG
    BNE .2
.0: MOVE.W  EXPRCODE1(PC),(A4)+
.1: RTS
.2: move.w  FEXPRCODE_USED_REGS,d1
    addq.w  #1,FEXPRCODE_USED_REGS
    cmp.w   #5,d1
    blt     .3
    MOVE.L  FEXPRCODE1(PC),(A4)+
    RTS
.3: move.l  FEXPRCODE1+4(PC),(A4)+
    addq.l  #2,d1
    lsl.w   #7,d1
    or.w    d1,-2(a4)
    rts
;*-*

;; "["
EXPIMMLIST:           ; D3-D5/A1/A3-A5
    ADDQ.L  #4,A3           ; SKIP ]OFFSET
    CMP.W   #-1,D5
    BNE ERROR0
    CMP.W   #30,(A3)
    BEQ .2
    MOVE.L  A5,A0           ; A0=BACKUP
    CLR.W   (A5)+
    MOVEQ   #0,D7           ; D7=COUNT
.1: MOVE.W  (A3),D1
    CMP.W   #8,D1           ; *** read list from a3
    BEQ .VALM
    CMP.W   #VALUE,D1
    BEQ .VAL
    CMP.W   #IOFF+50,D1     ; SIZEOF
    BEQ .VAL
    CMP.W   #STR,D1
    BEQ .STRI
.VALMB: MOVEM.L D7/A0,-(A7)
    BSR.W   EXP             ; *** gen exp code
    MOVE.L  A4,CURACODE     ;
    JSR CHECK3              ; CHECKA4
    MOVEM.L (A7)+,D7/A0
    MOVE.W  EXPRCODE1(PC),(A4)+
    MOVE.W  #2,(A5)+        ; 1=VAL, 2=EXP, 3=STR, 0=END
.R: ADDQ.L  #1,D7

    CHESTB  A5,D1,10,ERROR46

    CMP.W   #COM,(A3)+
    BEQ.S   .1
    CMP.W   #30,-2(A3)
    BNE ERROR34
    CLR.W   (A5)+
    LEA .8(PC),A2
    MOVE.L  (A2)+,(A4)+
    MOVE.L  (A2)+,(A4)+
    MOVE.L  (A2)+,(A4)+
    MOVE.L  A4,A2           ; A2 -->BRANCH
    MOVE.L  A5,D6           ; D6=NEWBUF ON STACK!
    MOVE.L  A0,A5

    MOVE.L  D6,A6           ; FREE BUF
    MOVE.L  #$00040000,(A6)
    CMP.W   #19,(A3)        ; FREE: _D6_,D0-D2,_A6_
    BNE .TLO
    ADDQ.L  #2,A3           ; *** read object
    MOVE.W  (A3)+,D0
    CMP.W   #IOFF+20,D0     ; LONG
    BEQ .TLO
    CMP.W   #IOFF+21,D0     ; INT
    BNE.S   .TL2
    MOVE.L  #$00020000,(A6)
    BRA .TLO
.TL2:   CMP.W   #IOFF+22,D0     ; CHAR
    BNE.S   .TL3
    MOVE.L  #$00010000,(A6)
    BRA.S   .TLO
.TL3:   CMP.W   #31,D0
    BNE ERROR33

    MOVEM.L D3/D4/A0-A1,-(A7)
    MOVEQ   #0,D3           ; D3(TEMP)=GLOBAL OFFSET
    MOVE.L  (A3)+,A0        ; A0(TEMP)=OBJ
    CMP.W   #-1,OSIZE(A0)
    BEQ ERROR40
    TST.W   (A0)
    BNE ERROR60
    MOVE.W  OID(A0),D0      ; D0(TEMP)=OBJ.ID
    LEA OMEMB+4(A0),A0      ; A0(TEMP)=MEMBERS LIST
.TLL:   MOVE.L  ONEXT(A0),A0
    MOVE.L  A0,D1
    BEQ.S   .TLLO
    MOVE.W  OSIZE(A0),D4        ; SIZE->D4
    BEQ ERROR40         ; ARRAY IN OBJ
    ;TST.L  OASCII(A0)
    ;BEQ    ERROR40         ; PRIVATE MEMBER IN OBJ
    ADD.W   D4,D3
    BTST    #0,D3
    BEQ.S   .SX
    CMP.W   #1,D4
    BEQ.S   .SX
    MOVE.W  #-1,(A6)+       ; -1 = EVEN
    ADDQ.W  #1,D3
.SX:    SUB.W   D4,D3
    CMP.W   OOFF(A0),D3
    BNE ERROR60
    ADD.W   D4,D3
    MOVE.W  D4,(A6)+
    BRA.S   .TLL
.TLLO:  BTST    #0,D3
    BEQ.S   .S3
    MOVE.W  #-1,(A6)+
;   ADDQ.W  #1,D3
.S3:    CLR.W   (A6)+
    MOVEM.L (A7)+,D3/D4/A0-A1
.TLO:   MOVE.L  D6,A6

    MOVE.L  A4,CURACODE     ;
    JSR CHECK3          ; CHECK
    ADDQ.L  #2,A0
.L1:    MOVE.W  (A0)+,D1        ; D1=STACK-INTERIM
    BEQ .3
    CMP.W   #1,D1           ; *** gen static list code
    BNE.S   .4
    MOVE.L  (A0)+,D0
    MOVE.W  #-1,(A0)+       ; NO STACK OFFSET NEEDED
    BRA.S   .SI
.4: CMP.W   #3,D1
    BEQ.S   .SC
    MOVEQ   #0,D0
.SI:    MOVE.W  (A6)+,D2
    BEQ.S   .REP
    BMI.S   .EVEN
    TST.W   -2(A0)
    BEQ.S   .SB
    CMP.W   #2,D2
    BEQ.S   .INT
    BMI.S   .CHAR
    BSR.S   .SETO
    MOVE.L  D0,(A4)+
    BRA.S   .L1
.SC:    MOVEQ   #3,D0
    ADDQ.L  #2,A0
    CLR.W   (A0)+
    BRA.S   .SI
.SB:    CMP.W   #4,D2
    BNE ERROR31
    MOVE.W  #-2,-2(A0)
    MOVE.W  -4(A0),D0
    MOVE.L  A0,-(A7)
    BSR ADDBRANCHRELOC
    MOVE.L  (A7)+,A0
    BRA.S   .L1
.EVEN:  MOVE.B  #0,(A4)+
    BRA.S   .SI
.REP:   MOVE.L  D6,A6
    BRA.S   .SI
.INT:   BSR.S   .SETO
    CHKW    D0,D2,ERROR31
    MOVE.W  D0,(A4)+
    BRA .L1
.CHAR:  BSR.S   .SETO
    CHKB    D0,D2,ERROR31
    MOVE.B  D0,(A4)+
    BRA .L1
.SETO:  CMP.W   #-1,-2(A0)
    BEQ.S   .SO
    MOVE.L  A4,D1
    SUB.L   A2,D1
    LSL.L   #3,D1
    ADD.W   D2,D1
    MOVE.W  D1,-2(A0)
.SO:    RTS
.3: MOVE.L  A4,CURACODE     ;
    JSR CHECK3          ; CHECK 
    MOVE.L  A4,D0
    BTST    #0,D0
    BEQ.S   .S2
    MOVE.B  #0,(A4)+
.S2:    MOVE.L  A4,D0
    SUB.L   A2,D0           ; CALC BRANCH
    ADDQ.L  #4,D0
    MOVE.W  D0,-4(A2)

    MOVEQ   #0,D0           ; D0=COUNT
    SUBQ.L  #2,A0
.L2:    MOVE.W  -(A0),D1        ; D1=ST.INT.
    BEQ.S   .5
    CMP.W   #-1,D1          ; SET VALUES=-1 FOR L2
    BNE.S   .6
    SUBQ.L  #6,A0
    BRA.S   .L2
.6: CMP.W   #-2,D1
    BNE.S   .6B
    SUBQ.L  #4,A0
    BRA.S   .L2
.6B:    MOVE.L  D1,D0           ; *** gen stack retrieval
    LSR.W   #3,D0
    EXT.L   D0
    AND.W   #7,D1
    SUBQ.W  #1,D1
    LSL.W   #2,D1
    CMP.W   #12,D1
    BNE.S   .S4
    SUBQ.L  #4,D1
    BRA.S   .S5
.S4:    MOVE.W  .STR(PC),(A4)+      ; was: .STR(PC,D1.W)
.S5:    MOVE.W  .7(PC,D1.W),(A4)+
    MOVE.W  D0,(A4)+
    MOVE.L  A4,CURACODE     ;
    JSR CHECK3          ; CHECK
    BRA.S   .L2

.5: MOVE.W  D7,-2(A2)
    MOVEQ   #1,D5
    BRA EXPLOOP
.7: MOVE.B  D1,4(A0)
    MOVE.W  D1,4(A0)
    MOVE.L  (A7)+,4(A0)
.STR:   MOVE.L  (A7)+,D1
.8: LEA .9(PC),A0
    MOVE.L  A0,D0
    BRA .5
    DC.W    0
.9:
.VALM:  CMP.W   #VALUE,2(A3)
    BNE.W   .VALMB
.VAL:   MOVEM.L D3/D4/A0,-(A7)
    BSR ASM_GRABVALUE
    MOVEM.L (A7)+,D3/D4/A0
    MOVE.W  (A3),D2
    CMP.W   #30,D2
    BEQ.S   .V1
    CMP.W   #COM,D2
    BNE ERROR0          ; WHATELSE? INTERIM=TRASHED
.V1:    MOVE.W  #1,(A5)+
    MOVE.L  D1,(A5)+
    MOVE.W  #1,(A5)+
    BRA .R
.2: ADDQ.L  #2,A3
    LEA .EL(PC),A0
    MOVE.L  (A0)+,(A4)+
    MOVE.L  (A0)+,(A4)+
    MOVE.W  (A0)+,(A4)+
    MOVEQ   #1,D5
    BRA EXPLOOP
.EL:    MOVE.W  #0,D0
    LEA .EL+4(PC),A0
    MOVE.L  A0,D0

.STRI:  MOVE.W  #3,(A5)+
    BSR NEWLABEL
    MOVE.W  D0,(A5)+
    MOVE.W  #3,(A5)+
    GETM    A6          ; A6=NODE
    MOVE.L  STRINGLINK(PC),(A6)
    MOVE.L  A6,STRINGLINK
    ADDQ.L  #4,A6
    MOVE.W  D0,(A6)+
    ADDQ.L  #4,A3
    MOVE.W  (A3)+,D0
    MOVE.L  A3,(A6)+
    CLR.L   (A6)+
    LSL.W   #1,D0
    ADD.W   D0,A3
    DONEM   A6
    BRA .R
;*-*
;; << >>
EXPSHIFT:
    CMP.W   #1,D5
    BNE     ERROR0
    MOVEQ   #3,D4
    LEA     .S(PC),A1
    CMP.W   #49,D0
    BEQ.S   .LEFT
    ADDQ.L  #4,A1
.LEFT
    MOVEQ   #0,D5
    BRA     EXPLOOP
.S: LSL.L   D1,D0
    LSL.L   #1,D0
    LSR.L   D1,D0
    LSR.L   #1,D0
;*-*
;; +-*/
EXPOPERATOR:
    CMP.W   #11,D0
    BPL EXPBACK
    CMP.W   #1,D5           ; 0 OPER,COMP / 1 VAL,VAR
    BNE.S   NEGVALUE
NEGBACK:
    MOVEQ   #6,D4
    CMP.W   #9,D0
    BMI.S   EXPNODP
    MOVEQ   #4,D4
EXPNODP:
    CMP.W   #-1,D5
    BNE.S   EXPNOTFIRST
    CMP.W   #8,D0
    BNE ERROR0
    MOVE.W  EXPSTART,(A4)+
EXPNOTFIRST:
    MOVEQ   #0,D5
    SUB.W   #7,D0
    MULU    #12,D0
    EXT.L   D0
    ADD.L   #EXPPLUS,D0
    MOVE.L  D0,A1
    BRA EXPLOOP
NEGBACK1:
    SUBQ.L  #2,A3
    CMP.W   #-1,D5
    BEQ.S   NEGBACK
    BRA ERROR0

NEGVALUE:
    CMP.W   #8,D0
    BNE ERROR0
    CMP.W   #43,(A3)
    BEQ EXPNEGFLOAT
    CMP.W   #VALUE,(A3)+
    BNE NEGBACK1
    NEG.L   (A3)
;*-*

;; Value
EXPVALUE:             ; ENTRY
    CMP.W   #1,D5
    BEQ ERROR0
    TST.W   FLTFLAG
    BNE.W   VALUEFLOAT
VALFLTBACK:

    TST.W   D5          ; SEE IF WE CAN OPTI CONSTS!
    BEQ.S   .1
    SUBQ.L  #2,A3
    MOVEM.L D3/D4,-(A7)
    BSR ASM_GRABVALUE
    MOVEM.L (A7)+,D3/D4
    MOVEQ   #1,D5
    BRA.S   .2

.1: MOVEQ   #1,D5
    MOVE.L  (A3)+,D1
.2:
VALUENTRY:            ; VAL IN D1, #1 IN D5
    CMP.L   #4,D4
    BEQ.S   SHORTBACK
    CMP.L   #3,D4
    BEQ     PASS_SHIFT1
    CMP.L   #128,D1
    BMI.W   EXPSHORT
SHORTBACK:
    MOVE.W  (A1),(A4)+
    CMP.L   #4,D4
    BEQ.S   EXPDIVPROD
    MOVE.L  D1,(A4)+
    CMP.W   #2,D4
    BNE EXPLOOP
    MOVE.W  D3,(A4)+
    BSR EXP_EXTD0
    BRA EXPLOOP
PASS_SHIFT1:
    TST.W   D1
    BEQ     .SOPTI
    CMP.W   #8,D1
    BPL     .LSHFT
    MOVE.W  2(A1),(A4)
    LSL.W   #8,D1
    LSL.W   #1,D1
    OR.W    D1,(A4)+
    BRA     .SOPTI
.LSHFT:
    MOVE.W  .MOV(PC),(A4)+
    MOVE.L  D1,(A4)+
    MOVE.W  (A1),(A4)+
.SOPTI:
    BRA EXPLOOP
.MOV:
    MOVE.L  #$0,D1

EXPDIVPROD:
    CMP.L   #2,D1
    BEQ.S   .OPTI
    CMP.L   #4,D1
    BEQ.S   .OPTI
    MOVE.W  D1,(A4)+
    TST.W   D1
    BEQ ERROR15
    SWAP    D1
    TST.W   D1
    BNE.S   .2
.3: CMPA.L  #EXPMUL,A1
    BEQ.S   .1
    MOVE.W  D0EXT(PC),(A4)+
.1: BRA EXPLOOP
.2: CMP.W   #-1,D1
    BNE ERROR11
    BRA.S   .3
.OPTI:  SUBQ.L  #2,A4
    CMPA.L  #EXPMUL,A1
    BNE.S   .OPTID
    CMP.W   #2,D1
    BNE.S   .OM4
    MOVE.W  .ADD(PC),(A4)+
    BRA EXPLOOP
.OM4:   MOVE.W  .ASL(PC),(A4)+
    BRA EXPLOOP
.OPTID: CMP.W   #2,D1
    BEQ .OD2
    MOVE.L  .AS2(PC),(A4)+
    MOVE.L  .AS2+4(PC),(A4)+
    BRA EXPLOOP
.OD2:   MOVE.L  .ASR(PC),(A4)+
    MOVE.L  .ASR+4(PC),(A4)+
    BRA EXPLOOP
.ADD:   ADD.L   D0,D0
.ASL:   ASL.L   #2,D0
.ASR:   TST.L   D0
    BGE.S   .AS
    ADDQ.L  #1,D0
.AS:    ASR.L   #1,D0
.AS2:   TST.L   D0
    BGE.S   .ASS
    ADDQ.L  #3,D0
.ASS:   ASR.L   #2,D0
;*-*
;; Float value
VALUEFLOAT:
    TST.W   FLTFLAG
    BEQ .0
    BTST    #1,CODEPREFS
    BNE EXPFPVAL
.0:
    CMP.W   #-1,D5
    BEQ.W   VALFLTBACK
    CMP.L   #EXPCMP,A1      ; NO AND/OR
    BMI.W   VALFLTBACK
    BRA EXPFLOATVAL
EXPFPVAL:
    MOVE.W  #-1,FLTFLAG
    CMP.L   #EXPCMP,A1      ; NO AND/OR
    BMI.W   VALFLTBACK
    CMP.W   #-1,D5
    BEQ     .FPFIRST
    CMP.W   #2,EFPU
    BEQ     .FP040S
    MOVE.W  .C2(PC),(A4)+
    MOVe.L  (A3)+,(A4)+
    move.l  .C2+6(PC),(A4)+
    BRA .FPLAST
.FPFIRST:
    cmp.w   #2,EFPU
    beq .FP040F
    move.w  .C1(PC),(A4)+
    move.l  (a3)+,(a4)+
    move.l  .C1+6(PC),(A4)+
    BRA .2
.FP040F:
    move.L  .C3(PC),(A4)+
    move.l  (a3)+,(A4)+
    bra .2
.FP040S:
    move.l  .C3+8(pc),(a4)+
    move.l  (a3)+,(a4)+

.FPLAST
    BSR MAKEFLTOPER
    TST.W   D0
    BNE.S   .2          ; SEE IF SPCMP
    cmp.w   #3,EFPU
    BEQ .FP060
    LEA .FPCMP(PC),A0
    MOVE.l  (A0,D3*4),(A4)+
    BSR EXP_EXTD0
.2: MOVEQ   #1,D5
    BRA EXPLOOP
.FP060:
    MOVE.W  #$70ff,(a4)+
    lea .FPCMP2(PC),A0
    MOVE.L  (A0,D3*4),(A4)+
    move.w  #$7000,(a4)+
    moveq   #1,D5
    bra EXPLOOP

.FPCMP:
    FSEQ    D0
    FSGT    D0
    FSLT    D0
    FSGE    D0
    FSLE    D0
    FSNE    D0
.FPCMP2:
    FBEQ    *+6
    FBGT    *+6
    FBLT    *+6
    FBGE    *+6
    FBLE    *+6
    FBNE    *+6

.C1:MOVE.L  #0,D0
    FMOVE.S D0,FP0
.C2:MOVE.L  #0,D0
    FMOVE.S D0,FP1
.C3:FSMOVE.S #0,FP0
    FSMOVE.S #0,FP1

EXPFLOATVAL:
    BTST    #1,CODEPREFS
    BNE     EXPFPVAL
    CMP.L   #EXPCMP,A1
    BMI ERROR0
    TST.W   D5
    BMI.S   .3
    BHI.W   ERROR0
    MOVE.W  .1(PC),(A4)+
    MOVE.L  (A3)+,(A4)+
    BSR MAKEFLTOPER
    TST.W   D0
    BNE.S   .2          ; SEE IF SPCMP
    MOVE.W  D3,(A4)+
    BSR EXP_EXTD0
.2: MOVEQ   #1,D5
    BRA EXPLOOP
.1: MOVE.L  #1,D1
.3: MOVE.W  .4(PC),(A4)+
    MOVE.L  (A3)+,(A4)+
    BRA.S   .2
.4: MOVE.L  #1,D0



EXPNEGFLOAT:
    ADDQ.L  #2,A3
    MOVEM.L D0-D1/A0-A1/A6,-(A7)
    BSR ISOPENMATH
    MOVE.L  MATHBASE(PC),A6
    MOVE.L  (A3),D0
    JSR -60(A6)         ; SPNEG
    MOVE.L  D0,(A3)
    MOVEM.L (A7)+,D0-D1/A0-A1/A6
    BRA.S   EXPFLOATVAL
;*-*
;; Short
EXPSHORT:
    CMP.L   #-128,D1
    BMI.W   SHORTBACK
    MOVE.W  (A1),D0
    CMP.W   EXPMOVE,D0
    BEQ.S   .1
    CMP.W   EXPPLUS,D0
    BEQ.S   SHORTADD
    CMP.W   EXPMINUS,D0
    BEQ.S   SHORTADD
    BRA SHORTBACK
.1: MOVE.B  EXPSTART,(A4)+
    MOVE.B  D1,(A4)+
    BRA EXPLOOP
SHORTADD:
    CMP.W   #9,D1
    BPL SHORTBACK
    CMP.W   #1,D1
    BMI SHORTBACK
    CMP.W   #8,D1
    BNE.S   SHORTNO8
    MOVEQ   #0,D1
SHORTNO8:
    CMP.W   EXPPLUS,D0
    BNE.S   SHORTSUB
    MOVE.W  EXPADDQ,D2
    ASL.W   #7,D1
    ASL.W   #2,D1
    OR.W    D1,D2
    MOVE.W  D2,(A4)+
    BRA EXPLOOP
SHORTSUB:
    CMP.W   EXPMINUS,D0
    BNE SHORTBACK
    MOVE.W  EXPSUBQ,D2
    ASL.W   #7,D1
    ASL.W   #2,D1
    OR.W    D1,D2
    MOVE.W  D2,(A4)+
    BRA EXPLOOP
;*-*
;; Variables
EXPVAR:
    CMP.W   #1,D5
    BEQ ERROR0
    MOVE.L  (A3)+,A0
    MOVE.L  A0,LASTVAR
    MOVE.W  (A3),D0         ; CHECK COMPLEX
    CMP.W   #11,2(A3)
    BEQ     EXPEXT
EXPEXTBACK:
    CMP.W   #33,D0          ; ++/--
    BPL EXPVARC
    CMP.W   #29,D0          ; []
    BEQ EXPVARC
    CMP.W   #41,D0          ; ::
    BEQ EXPVARC
    CMP.W   #17,D0          ; ()
    BEQ EXPOWNFUNC
EXPVARCBACK:
    CMP.W   #ASSGN,(A3)     ; :=
    BEQ EXPVARASSIGN
EXPVARASSBACK:
    MOVE.W  10(A0),D0       ; D0=VAROFFSET
    MOVE.B  4(A0),D2        ; D2=TYPE
    CMP.B   #3,D2
    BEQ ERROR23
    CMP.W   #2,D4
    BEQ EXPVARCMP
    CMP.W   #3,D4
    BEQ .SHIFT
    TST.W   FLTFLAG
    BNE .2
.4: CMP.W   #4,D4           ; TAKE LOWWORD IF MULU/DIVU
    BNE.S   .1
    ADDQ.W  #2,D0
    OPINT
.1: MOVE.W  0(A1,D4.W),(A4)+
    BSR GVA0D0D5_0
    OPLONG
    MOVEQ   #1,D5
    CMPA.L  #EXPDIV,A1
    BNE EXPLOOP
    MOVE.W  D0EXT(PC),(A4)+
    BRA EXPLOOP

.SHIFT:     
    MOVE.W  .3(PC),(A4)+
    BSR GVA0D0D5_0
    MOVEQ   #1,D5
    MOVE.W  (A1),(A4)+
    BRA EXPLOOP
.3: MOVE.L  2(A5),D1
.2:
    CMP.L   #EXPCMP,A1      ; NO AND/OR
    BMI .4
    BTST    #1,CODEPREFS
    BNE EXPFPVAR
    CMP.W   #-1,D5          ; SPXXX
    BEQ .4
BLERK:
    MOVE.W  .3(PC),(A4)+
    BSR GVA0D0D5_0
    MOVEQ   #1,D5
    BSR MAKEFLTOPER
    BRA EXPLOOP
.3: MOVE.L  2(A5),D1

EXPFPVAR:
;    MOVE.W  .FC1(PC),(A4)+
;    JSR GVA0D0_0
;    MOVE.W  D5,D0
;    LEA .FC1(PC),A0
;    ADDQ.L  #1,D0
;    MOVE.L  4(A0,D0.W*4),(A4)+
;    MOVE.L  D5,D0
;    MOVEQ   #1,D5
;    CMP.W   #-1,D0
;    BEQ EXPLOOP
;    BSR MAKEFLTOPER
;    BRA EXPLOOP
    MOVE.L  d5,d0
    addq.l  #1,d0
    mulu    #6,d0
    cmp.w   #2,EFPU
    spl     d1
    and.l   #12,d1
    add.w   d1,d0
    lea     .FC0(PC),A2
    move.l  (A2,D0),d1
    swap    d1
    move.w  d1,(a4)+
    move.l  a4,d2
    jsr GVA0D0_0
    moveq   #0,d0
    cmp.l   a4,d2
    beq .skp
    move.w  -(a4),d0
.skp:
    swap    d1
    move.w  d1,(a4)+
    tst.w   d0
    beq     .skp2
    move.w  d0,(a4)+
.skp2:
    move.l  d5,d0
    moveq   #1,d5
    cmp.w   #-1,d0
    beq EXPLOOP
    bsr MAKEFLTOPER
    BRA EXPLOOP

.FC0:
    FMOVE.S  2(A5),FP0
    FMOVE.S  2(A5),FP1
    FSMOVE.S 2(a5),FP0
    FSMOVE.S 2(A5),FP1
.FC1:
    MOVE.L  2(A5),D0
    FMOVE.S D0,FP0
    FMOVE.S D0,FP1
    FSMOVE.S    D0,FP0
    FSMOVE.S    D0,FP1


EXPEXT:
    CMP.W   #-1,D5
    BNE     EXPEXTBACK
    CMP.W   #7,D0
    BEQ     .PARSE
    CMP.W   #8,D0
    BEQ     .PARSE
    CMP.W   #9,D0
    BEQ     .PARSE
    CMP.W   #10,D0
    BEQ     .PARSE
    CMP.W   #49,D0
    BEQ     .PARSE
    CMP.W   #50,D0
    BEQ     .PARSE
    CMP.W   #IOFF+29,D0
    BEQ     .PARSE
    CMP.W   #IOFF+30,D0
    BEQ     .PARSE
    BRA     EXPEXTBACK
.PARSE:
    MOVE.W  (A3),2(A3)
    MOVE.L  -4(A3),-2(A3)
    MOVE.W  -6(A3),-4(A3)
    SUBQ.L  #6,A3
    MOVE.W  #ASSGN,(A3)
    BRA     EXPVARASSIGN

LASTVAR:
    DC.L    0
;*-*
;; < <= = => > <>
EXPVARCMP:
    TST.W   FLTFLAG
    BNE .1
    MOVE.W  6(A1),(A4)+
    BSR GVA0D0D5_0
    MOVEQ   #1,D5
    MOVE.W  D3,(A4)+
    BSR EXP_EXTD0
    BRA EXPLOOP

.1:
BLAARGH:
    MOVE.W  .2(PC),(A4)+        ; SPCMP
    BSR GVA0D0D5_0
    BTST    #1,CODEPREFS
    BNE     .FLOAT
    BSET    #3,CODEPREFS+1      ; USE MATHIEEESINGBAS
    MOVEQ   #1,D5
    MOVE.L  .3(PC),(A4)+
    MOVE.L  .3+4(PC),(A4)+
    MOVE.W  D3,(A4)+
    BSR EXP_EXTD0
    BRA EXPLOOP
.2: MOVE.L  2(A5),D1
.3: MOVE.L  -56(A4),A6
    JSR -42(A6)
.FLOAT:
    MOVEQ   #1,D5
    MOVE.L  .FC(PC),(A4)+
    MOVe.L  .FC+4(PC),(A4)+
    CMP.W   #3,EFPU
    BEQ .FLOAT_2
    lsl.l   #2,d3
    LEA     .FPCMP(PC),A0
    MOVE.L  (A0,D3),(A4)+
    BSR EXP_EXTD0
    BRA EXPLOOP
.FLOAT_2:
    lsl.l   #2,d3
    MOVE.W  #$70FF,(A4)+
    LEA     .FPCMP2(PC),A0
    MOVE.L  (A0,D3),(A4)+
    move.w  #$7000,(a4)+
    BRA EXPLOOP

.FC:FMOVE.S D1,FP1
    FCMP.X  FP1,FP0
.FPCMP:
    FSEQ    D0
    FSGT    D0
    FSLT    D0
    FSGE    D0
    FSLE    D0
    FSNE    D0
.FPCMP2:
    FBEQ    *+6
    FBGT    *+6
    FBLT    *+6
    FBGE    *+6
    FBLE    *+6
    FBNE    *+6
;*-*
;; FPCmp
EXPFPCMP:
    CMP.W   #3,EFPU
    BEQ .FLOAT_2
    lsl.l   #2,d3
    LEA     .FPCMP(PC),A0
    MOVE.L  (A0,D3),(A4)+
    BSR EXP_EXTD0
    RTS
.FLOAT_2:
    lsl.l   #2,d3
    MOVE.W  #$70FF,(A4)+
    LEA     .FPCMP2(PC),A0
    MOVE.L  (A0,D3),(A4)+
    move.w  #$7000,(a4)+
    RTS

.FPCMP:
    FSEQ    D0
    FSGT    D0
    FSLT    D0
    FSGE    D0
    FSLE    D0
    FSNE    D0
.FPCMP2:
    FBEQ    *+6
    FBGT    *+6
    FBLT    *+6
    FBGE    *+6
    FBLE    *+6
    FBNE    *+6
;*-*
;; :: .
EXPVARC:
    CMP.W   #41,D0
    BEQ.S   .3
    CMP.W   #36,D0
    BPL EXPVARCBACK
.3: TST.B   4(A0)
    BEQ ERROR22
    CMP.B   #LAB,4(A0)
    BEQ ERROR6
    CMP.W   #42,2(A3)
    BEQ.S   .2
    MOVEQ   #1,D0
    SUBQ.L  #6,A3
    BSR EADDRESSMODI
    TST.W   FLTFLAG
    BEQ     .0
    BTST    #1,CODEPREFS
    BEQ     .0
    addq.l  #1,d5
    move.l  .C0(PC,D5.w*4),(a4)+
    subq.l  #1,d5
    cmp.w   #-1,d5
    beq .C1
    bsr MAKEFLTOPER
    tst.w   d0
    bne     .C1
    bsr EXPFPCMP
.C1:
    moveq   #1,d5
    bra EXPLOOP
    bra     .0
.C0:
    FMOVE.S D0,FP0
    FMOVE.S D1,FP1

.0: CMP.W   #-1,D5
    BEQ     .1
    BSR CLOSEEXP
.1: MOVEQ   #1,D5
    BRA EXPLOOP
.2: CMP.W   #35,D0
    BNE.S   .3
    TST.B   4(A0)
    BEQ ERROR22
    ADDQ.L  #2,A3
    MOVE.L  A0,METHODIDENT      ; DO METHOD CALL HERE!
    BSR SD0
    CLR.L   METHODSPEC
    BSR.S   EXPCALLMETHOD
    BSR RD0
    MOVEQ   #1,D5
    BRA EXPLOOP

METHODIDENT:    DC.L    0
METHODSPEC: DC.L    0
METHODFREEZ:    DC.L    0   ; FROZEN CALL WITH THIS OBJECT
;*-*
;; FindMethod
; WANTS   OBJ=A6,NAME=D0
; TRASHES A0
; RETURNS D1=METHOD | NIL

FINDMETHOD:
    LEA OMETHOD(A6),A6
    MOVE.L  A6,D1
.XL:MOVE.L  D1,A6
    MOVE.L  (A6),D1
    BEQ .ERR
    MOVE.L  D1,A6
    MOVE.L  M_NAME(A6),A0
    MOVE.L  D0,A6
.CL:    CMPM.B  (A0)+,(A6)+
    BNE.S   .XL
    TST.B   -1(A0)
    BNE.S   .CL
.ERR:   RTS
;*-*
;; CallMethod
EXPCALLMETHOD:            ; IDENTENTRY IN METHODIDENT,
    CMP.W   #42,(A3)+       ; A3 JUST PAST "."
    BNE ERROR40
    MOVE.L  METHODSPEC(PC),D0
    BNE.S   .NS1
    MOVE.L  METHODIDENT(PC),A6
    MOVE.L  (A6),D0
.NS1:   CMP.L   #5,D0
    BMI ERROR40
    MOVE.L  D0,A6           ; A6=OBJECT
    MOVE.L  (A3)+,D0        ; D0=NAME
    BSR FINDMETHOD
    TST.L   D1
    BEQ .ERR
    MOVE.L  METHODSPEC(PC),-(A7)
    BEQ.S   .MS4
    MOVE.W  .SA0(PC),(A4)+
.MS4:   MOVE.L  METHODFREEZ(PC),-(A7)
    MOVE.L  D1,-(A7)        ; STACK: S.L, F.L, M.L, I.L, COUNT.W
    CMP.W   #17,(A3)+
    BNE ERROR23
    MOVE.L  METHODIDENT,-(A7)
    CLR.W   -(A7)
    CMP.W   #18,(A3)
    BEQ.S   .2
.3: MOVE.W  #16,EAREQUEST
    BSR EAEXP
    TST.L   D0
    BNE.S   .OPT
    MOVE.W  .4(PC),(A4)+
.OPT:   ADDQ.W  #4,(A7)
    CMP.W   #COM,(A3)+
    BEQ.S   .3
    SUBQ.L  #2,A3
.2: CMP.W   #18,(A3)+       ; OUT
    BNE ERROR23

    MOVEQ   #0,D0
    MOVE.W  (A7)+,D0        ; D0=ARGCOUNT
    MOVE.L  4(A7),A6
    MOVE.L  M_PROC(A6),A6
    BSR DODEFARGS

    MOVE.L  (A7)+,A0        ; A0.L=IDENT
    MOVE.L  (A7)+,A6        ; A6.L=METHOD
    MOVE.L  (A7)+,METHODFREEZ
    MOVE.L  (A7)+,METHODSPEC
    BNE.W   .MS2
    MOVE.W  .7(PC),(A4)+
    BSR GVA0D1_0
    MOVE.L  (A0),A0         ; A0=OBJ
    BRA.S   .MS3
.MS2:   MOVE.L  METHODSPEC(PC),A0
    MOVE.W  .GA0(PC),(A4)+
    MOVE.W  D0,(A4)+
    ADDQ.W  #4,D0
.MS3:
    TST.L   METHODFREEZ
    BNE.S   .FR

    TST.W   ODELOFF(A0)
    BMI ERROR71
    BHI .U
    MOVE.W  .6(PC),(A4)+
.UB:    BRA.S   .NFR

.FR:    MOVEM.L A0/A6,-(A7)     ; FREEZ!
    MOVE.L  METHODFREEZ(PC),A6
    GETM    A0          ; ADD TO SUPER-ACCESS
    MOVE.L  OACC(A6),(A0)
    MOVE.L  A0,OACC(A6)
    ADDQ.L  #4,A0
    MOVE.W  .GOBJ(PC),(A4)+     ; GEN: PUT SUPER-DEL IN a1
    MOVE.L  A4,(A0)+
    CLR.W   (A4)+
    CLR.W   (A0)+
    DONEM   A0
    MOVEM.L (A7)+,A0/A6

.NFR:   MOVE.W  .6A(PC),(A4)+
    MOVE.W  M_OFF(A6),(A4)+
    MOVE.W  .6B(PC),(A4)+
    TST.W   D0
    BEQ.S   .NOA
    MOVE.W  .5(PC),(A4)+
    MOVE.W  D0,(A4)+
.NOA:   RTS
.4: MOVE.L  D0,-(A7)
.5: LEA -8(A7),A7
.7: MOVEA.L 2(A5),A0
.6: MOVE.L  (A0),A1
.6X:    MOVE.L  2(A0),A1
.6A:    MOVE.L  4(A1),A1
.6B:    JSR (A1)
.U: MOVE.W  .6X(PC),(A4)+
    MOVE.W  ODELOFF(A0),(A4)+
    BRA.W   .UB
.SA0:   MOVE.L  A0,-(A7)
.GA0:   MOVE.L  2(A7),A0
.ERR:   CMP.W   #17,(A3)
    BEQ ERROR54
    BRA ERROR42
.GOBJ:  MOVE.L  4(A4),A1
;*-*
;; :=
EXPVARASSIGN:         ; VAR STILL IN A0
    CMP.W   #-1,D5
    BNE EXPVARASSBACK
    ADDQ.L  #2,A3
    TST.W   EXPLCHECK
    BNE.W   .CH
.CHB:   MOVE.L  A0,-(A7)
    BSR EXP
    MOVE.L  (A7)+,A0
    LEA .1(PC),A1
    MOVE.B  4(A0),D2
    BEQ ERROR22
    CMP.B   #LAB,D2
    BEQ ERROR6
    MOVE.W  (A1),(A4)+
    BSR GVA0D5_9
    MOVEQ   #1,D5
    BRA EXPLOOP
.1: MOVE.L  D0,2(A5)
.CH:BTST    #3,5(A0)
    BEQ.W   .CHB
    MOVE.W  10(A0),D0
    MOVE.W  EXPLMASK,D1
    BTST    D0,D1
    BEQ.W   .CHB
    BRA ERROR25
;*-*
;; MakeFloatOper

MAKEFLTOPER:          ; TRASHES D0 !!!!
    BTST    #1,CODEPREFS
    BNE .MAKEFPOPER
    BSET    #3,CODEPREFS+1      ; USE MATHIEEESINGBAS
    MOVE.L  A1,D0
    SUB.L   #EXPCMP,D0
    DIVU    #3,D0
    MOVE.L  .2(PC),(A4)+
    MOVE.L  .1(PC,D0.W),(A4)+
    RTS
.1: JSR -42(A6)         ; = <> etc.
    JSR -66(A6)         ; +
    JSR -72(A6)         ; -
    JSR -78(A6)         ; *
    JSR -84(A6)         ; /
.MAKEFPOPER:
    CMP.W   #1,FINISHFPEXP
    BEQ     .MAKEFP1
    MOVE.L  A1,D0
    SUB.L   #EXPCMP,D0
    DIVU    #3,D0
    MOVe.L  .3(PC,D0),(A4)+
    TST.W   D0
    SNE D0
    EXT.W   D0
    MOVE.W  D0,FLTFLAG
    RTS
.3: FCMP.X  FP1,FP0
    FADD.X  FP1,FP0
    FSUB.X  FP1,FP0
    FMUL.X  FP1,FP0
    FDIV.X  FP1,FP0
.MAKEFP1:
    addq.l  #2,d1
    MOVE.W  #0,FINISHFPEXP      ; D1 = other reg
    MOVE.L  A1,D0
    SUB.L   #EXPCMP,D0
    DIVU    #3,D0
    MOVe.L  .4(PC,D0),(A4)+
    lsl.w   #7,d1
    or.w    d1,-2(a4)
    tst.l   d0
    beq .C
    move.l  .5(PC),(a4)+
    lsl.w   #3,d1
    or.w    d1,-2(a4)
.C:
    TST.W   D0
    SNE D0
    EXT.W   D0
    MOVE.W  D0,FLTFLAG
    RTS

.4: FCMP.X  FP0,FP0
    FADD.X  FP0,FP0
    FSUB.X  FP0,FP0
    FMUL.X  FP0,FP0
    FDIV.X  FP0,FP0
.5: FMOVE.X FP0,FP0
.2: MOVE.L  -56(A4),A6

;*-*
;; parse < <= = => > <>
EXPCOMPARATOR:

    CMP.W   #17,D0
    BPL EXPBACK2
    CMP.W   #1,D5
    BNE .1
    CMP.W   #12,D0
    BEQ.S   .2
.3: TST.W   FLTFLAG
    BEQ .3_0
    BTST    #1,CODEPREFS
    BNE .FLT
.3_0:
    MOVEQ   #0,D5
    LEA EXPEQ(PC),A0
    MOVE.L  D0,D1
    SUB.W   #11,D1
    ASL.W   #1,D1
    MOVE.W  0(A0,D1.W),D3
    LEA EXPCMP(PC),A1
    MOVEQ   #2,D4
    BRA EXPLOOP
.1: CMP.W   #13,D0
    BEQ EXPCONS
    CMP.W   #16,D0
    BEQ EXPCONSNIL
    BRA ERROR0
.FLT:
    MOVE.L  D0,D3
    SUB.W   #11,D3
    EXT.L   D3
    MOVEQ   #2,D4
    LEA EXPCMP(PC),A1
    MOVEQ   #0,D5
    BRA EXPLOOP
.2: CMP.W   #2,EXPRECC      ; ONLY IF EXP IN EXP
    BMI.S   .3
    MOVE.W  (A3),D1
    CMP.W   #1,D1
    BMI.S   .4
    CMP.W   #COM,D1
    BEQ.S   .4
    CMP.W   #12,D1
    BEQ.S   .4
    CMP.W   #18,D1
    BEQ.S   .4
    CMP.W   #30,D1
    BEQ.S   .4
    CMP.W   #40,D1
    BEQ.S   .4
    CMP.W   #46,D1
    BEQ.S   .4
    CMP.W   #IOFF+18,D1
    BEQ.S   .4
    CMP.W   #IOFF+55,D1
    BEQ.S   .4
    BRA     .3
.4: BRA EXPOUT
;*-*
;; & || AND OR
EXPLOG:
    CMP.W   #IOFF+31,D0
    BPL ANDORNOTBACK
    CMP.W   #1,D5
    BNE ERROR0
;   TST.W   FLTFLAG
;   BNE ERROR0  ; NO AND/OR FLOAT
    MOVEQ   #0,D5
    MOVEQ   #6,D4
    SUB.W   #IOFF+29,D0
    MULU    #12,D0
    EXT.L   D0
    ADD.L   #EXPAND,D0
    MOVE.L  D0,A1
    BRA EXPLOOP
;*-*

;; Commands
EXPEQ:
    SEQ D0          ; = 11
    SGT D0          ; > 12
    SLT D0          ; < 13
    SGE D0          ; >=    14
    SLE D0          ; <=    15
    SNE D0          ; <>    16

EXPSTART:   MOVEQ   #0,D0

EXPAND:
    AND.L   #0,D0
    AND.L   2(A5),D0
    AND.L   D1,D0
EXPOR:
    OR.L    #0,D0
    OR.L    2(A5),D0
    OR.L    D1,D0
EXPCMP:
    CMP.L   #0,D0
    CMP.L   2(A5),D0
    CMP.L   D1,D0
EXPPLUS:              ; NO CHANGES TO THESE 8 !
    ADD.L   #0,D0           ; EACH 12
    ADD.L   2(A5),D0
    ADD.L   D1,D0
EXPMINUS:
    SUB.L   #0,D0
    SUB.L   2(A5),D0
    SUB.L   D1,D0
EXPMUL:
    MULS    #0,D0
    MULS    2(A5),D0
    MULS    D1,D0
    DC.W    0
EXPDIV:
    DIVS    #0,D0
    DIVS    2(A5),D0
    DIVS    D1,D0
EXPMOVE:
    MOVE.L  #0,D0
    MOVE.L  2(A5),D0
    MOVE.L  D1,D0

EXPADDQ:    ADDQ.L  #8,D0
EXPSUBQ:    SUBQ.L  #8,D0
;*-*

;; Procedure
EXPOWNFUNC:           ; A0=IDENTENTRY
    BTST    #4,5(A0)
    BNE ERROR4
    CMP.B   #LAB,4(A0)
    BNE EXPVARPROCCALL
    MOVE.L  6(A0),A6        ; A6=PROC!!
    MOVE.L  A6,D6
    BEQ ERROR25
    CMP.W   #17,(A3)+
    BNE ERROR23
    BSR SD0
    MOVEQ   #0,D0           ; #OF ARGS
    CMP.W   #18,(A3)
    BEQ.S   .2
.3: MOVEM.L D0/A0/A6,-(A7)
    MOVE.W  #16,EAREQUEST
    BSR EAEXP
    TST.L   D0
    BNE.S   .OPT
    MOVE.W  .4(PC),(A4)+
.OPT:   MOVEM.L (A7)+,D0/A0/A6
    ADDQ.L  #4,D0
    CMP.W   #COM,(A3)+
    BEQ.S   .3
    SUBQ.L  #2,A3
.2: CMP.W   #18,(A3)+       ; OUT
    BNE ERROR23
    BSR DODEFARGS
    MOVEM.L D0/A0,-(A7)

    MOVE.W  10(A0),D0
    BMI.S   .MINM
    MOVE.L  .1(PC),(A4)+
    MOVE.W  .1L(PC),NEWOP
    BSR ADDBRANCH
    BRA.S   .D
.MINM:  MOVE.W  .1L(PC),(A4)+       ; ADR OF LABEL OF OTHER MODULE
    MOVEM.L A1/A6,-(A7)
    GETM    A6
    MOVE.L  VARHEAVY(A0),A1     ; A1=PTR TO PROCCLASS
    MOVE.L  PC_ACC(A1),D0
    MOVE.L  A6,PC_ACC(A1)
    MOVE.L  D0,(A6)+
    MOVE.L  A4,(A6)+
    DONEM   A6
    MOVEM.L (A7)+,A1/A6
    CLR.L   (A4)+
.D:
    MOVEM.L (A7)+,D0/A0
    MOVE.L  6(A0),A6
    TST.W   (A6)
    BEQ.S   .NOA
    BTST    #0,2(A6)
    BNE.S   .NOA
    MOVE.W  .5(PC),(A4)+
    MOVE.W  D0,(A4)+
.NOA:   BSR RD0
    MOVEQ   #1,D5
    BRA EXPLOOP
.1: BSR .1
.1L:    JSR .1
.4: MOVE.L  D0,-(A7)
.5: LEA -8(A7),A7

DOREGARGS:
    MOVE.L  D0,D6
    LSR.L   #2,D6
    CMP.W   (A6),D6
    BNE     ERROR23
    move.l  6(a6),a6
    subq.l  #1,d6

    move.w  (a6)+,d0
    lsl.w   #1,d0
    add.w   d0,a6
    lsr.w   #1,d0
.L1:
    subq.l  #2,a6
    cmp.b   #5,(a6)
    seq     d0
    and.l   #$40,d0
    ror.l   #8,d0
    move.b  1(a6),d0
    and.w   #7,d0
    lsl.w   #1,d0
    rol.l   #8,d0
    move.w  .C1(PC),(A4)
    or.w    d0,(a4)+

    dbf     d6,.L1

    rts
.C1:MOVe.L  (A7)+,D0



DODEFARGS:
    BTST    #5,2(A6)
    BNE     DOREGARGS
    MOVE.L  D0,D6           ; DEAL WITH DEFARGS
    LSR.L   #2,D6
    CMP.W   (A6),D6
    BEQ.S   .R
    BPL ERROR23
    MOVE.W  (A6),D0
    EXT.L   D0
    LSL.L   #2,D0
    SUB.W   (A6),D6
    NEG.W   D6          ; D6=NARG WE STILL NEED
    MOVE.L  6(A6),A6
    MOVE.L  A6,D7
    BEQ ERROR23
    MOVE.W  (A6)+,D7
    BEQ ERROR23
    SUB.W   D6,D7
    BMI ERROR23
    LSL.W   #2,D7
    EXT.L   D7
    ADD.L   D7,A6
    SUBQ.L  #1,D6
.DAL:   MOVE.L  (A6)+,D7
    SWAP    D7
    TST.W   D7
    BEQ.S   .DP0
    CMP.W   #-1,D7
    BEQ.S   .DP1
.LP:    SWAP    D7
    MOVE.W  .P2(PC),(A4)+
    MOVE.L  D7,(A4)+
    BRA.S   .N
.DP0:   TST.L   D7
    BMI.S   .LP
    BRA.S   .DP
.DP1:   TST.L   D7
    BPL.S   .LP
.DP:    SWAP    D7
    MOVE.W  .P1(PC),(A4)+
    MOVE.W  D7,(A4)+
.N: DBRA    D6,.DAL
.R: RTS
.P1:    PEA $0.W
.P2:    PEA $0
;*-*
;; Var proc
EXPVARPROCCALL:           ; A0=IDENTENTRY
    CLR.W   .F
    TST.B   4(A0)
    BEQ ERROR22
    CMP.W   #17,(A3)+
    BNE ERROR23
    BSR SD0
    MOVE.L  A0,-(A7)
    CLR.W   -(A7)
    CMP.W   #18,(A3)
    BEQ.S   .2
    MOVEQ   #0,D0
    MOVEQ   #0,D1
    cmp.b   #4,(a3)
    seq d0
    cmp.b   #5,(a3)
    seq d1
    or.w    d0,d1
    move.w  d1,.F
    moveq   #0,d1
.3: addq.l  #1,d1
    CMP.B   #4,(A3)
    BLT     .3_1
    CMP.B   #5,(A3)
    BGT     .3_1
    MOVE.W  (A3)+,-(A7)
    cmp.w   #11,(a3)+
    bne ERROR0
    tst.w   .F
    beq ERROR50
    BRA .3_2
.3_1:
    TST.W   .F
    BNE ERROR50
.3_2:
    MOVE.W  #16,EAREQUEST
    move.l  d1,-(a7)
    BSR EAEXP
    move.l  (a7)+,d1
    TST.L   D0
    BNE.S   .OPT
    MOVE.W  .4(PC),(A4)+
.OPT:
    ADDQ.W  #4,(A7)
    CMP.W   #COM,(A3)+
    BEQ.S   .3
    SUBQ.L  #2,A3
.2: TST.W   .F
    BNE     .FIXREGS
    CMP.W   #18,(A3)+       ; OUT
    BNE ERROR23
    MOVE.W  (A7)+,D0
    MOVE.L  (A7)+,A0
    MOVE.W  .7(PC),(A4)+
    BSR GVA0D1_0
    MOVE.W  .6(PC),(A4)+
    TST.W   D0
    BEQ.S   .NOA
    MOVE.W  .5(PC),(A4)+
    MOVE.W  D0,(A4)+
.NOA:   BSR RD0
    MOVEQ   #1,D5
    BSET    #5,WARNINGS+3
    BRA EXPLOOP
.FIXREGS:
    SUBQ.L  #1,d1
.L1:move.w  (a7)+,d2
    ror.l   #8,d2
    cmp.b   #5,d2
    seq d0
    rol.l   #8,d2
    and.l   #$40,d0
    and.l   #7,d2
    bchg    #2,d2
    cmp.w   #4,d2
    blt     .L2
    cmp.w   #6,d2
    beq .L2
    cmp.w   #$40,d0
    beq     ERROR50
.L2:lsl.w   #8,d2
    lsl.w   #1,d2
    move.w  .0(PC),(a4)
    or.w    d2,(a4)
    or.w    d0,(a4)+
    dbf d1,.L1

    CMP.W   #18,(A3)+       ; OUT
    BNE ERROR23
    MOVE.W  (A7)+,D0
    MOVE.L  (A7)+,A0
    MOVE.W  .A(PC),(A4)+
    MOVE.W  .8(PC),(A4)+
    BSR GVA0D1_0
    MOVE.W  .9(PC),(A4)+
    MOVE.W  .C(PC),(A4)+
    BSR RD0
    MOVEQ   #1,D5
    BSET    #5,WARNINGS+3
    BRA EXPLOOP


.4: MOVE.L  D0,-(A7)
.5: LEA -8(A7),A7
.7: MOVEA.L 2(A5),A0
.6: JSR (A0)
.8: MOVE.L 2(A5),A5
.9: JSR (A5)
.0: MOVE.L  (A7)+,D0
.A: MOVE.L  A5,-(A7)
.C: MOVE.L  (A7)+,A5
.F: DC.W    0



;*-*
;; Library
NUMRECSAVE = 8

EXPLIBCALL:
    CMP.W   #1,D5
    BEQ ERROR0
    LEA EXPLCHECK(PC),A0    ; HERE WE CHECK LOOPED CALLS!
    TST.W   (A0)
    BEQ.S   .1          ; NO NEED TO
    MOVEQ   #NUMRECSAVE-1,D0
.2: MOVE.L  (A0)+,-(A7)     ; SHOVE NUMRECSAVE LONGS UP STACK
    DBRA    D0,.2
.1: SUB.L   A6,A6           ; NEED OF REGS
    MOVE.W  (A3)+,EXPLBASE
    MOVE.W  (A3)+,EXPLOFF
    MOVE.L  (A3)+,A2
    MOVE.W  (A3)+,D2
    MOVE.W  (A3)+,EXPLEXCEPT
    MOVE.W  D2,EXPLMASK
    MOVEQ   #0,D0           ; D0=# OF REGS
    LEA EXPLREGS(PC),A0
    MOVE.W  D5,-(A7)        ; SAVE D5
EXPLLOOP:
    MOVEQ   #0,D1
    MOVE.B  (A2)+,D1        ; D1=REG#
    CMP.W   #16,D1
    BPL.S   EXPLNEXT
    ADDQ.L  #1,D0
    MOVEQ   #13,D6
    MOVEQ   #0,D7           ; D7=POS
    CMP.W   #12,D1
    BMI .1          ; A4/A5 CALL
    ADDQ.L  #1,A6
.1: MOVEQ   #13,D5
    SUB.W   D6,D5
    CMP.W   D1,D5
    BEQ.S   .X
    BTST    D5,D2
    BEQ.S   .2
    ADDQ.L  #1,D7
.2: DBRA    D6,.1
.X: MOVE.B  D7,(A0)+
    BRA.S   EXPLLOOP
EXPLNEXT:
    MOVE.W  (A7)+,D5        ; RESTORE D5
    MOVE.B  #-1,(A0)+
    MOVE.W  D0,EXPLNUM
    CMP.W   #17,(A3)+       ; CHECK INCOMING (
    BNE ERROR23
    BSR SD0
    TST.W   EXPLNUM
        BEQ.S   EXPLNOARGS
        BSR.S   EXPLIBARG
        BRA.S   EXPLFIN
EXPLNOARGS:
    BSR.W   EXPLIBJSR
EXPLFIN:

    MOVE.W  EXPLEXCEPT(PC),D7   ; USE D7/A6
    BMI.S   .NR
    MULU    #10,D7
    MOVE.L  #LIBRAISE,A6
    LEA 0(A6,D7.W),A6
    BSR EXPRAISE
.NR:
    BSR RD0
    ADDQ.L  #2,A3           ; EAT )
    MOVEQ   #1,D5
    LEA EXPLCHECK(PC),A0    ; PUT LOOPED CALLS BACK AGAIN
    TST.W   (A0)
    BEQ.S   .3          ; NO NEED TO
    LEA NUMRECSAVE*4(A0),A0
    MOVEQ   #NUMRECSAVE-1,D0
.2: MOVE.L  (A7)+,-(A0)
    DBRA    D0,.2
.3: BRA EXPLOOP

EXPLIBARG:            ; IN CASE OF Func(arg,...)
    LSAVER  EXPLMASK,D1
    MOVE.W  D1,EXPLRSM
    CMP.W   #0,A6
    BEQ.S   .1
    MOVE.L  SAVE45(PC),(A4)+    ; NO OPTI IF A4/A5 USED
    BRA.S   .2
.1: 
    TST.W   D1          ; NO OPTI IF D3-D7 USED
    BNE.S   .2

    MOVE.L  A3,D1           ; CHECK IF OPTI POSSIBLE
.XL:MOVE.W  (A3)+,D0
    CMP.W   #8,D0
    BNE.S   .T1
    CMP.W   #VALUE,(A3)+
    BNE.S   .XB
    ADDQ.L  #4,A3
    BRA.S   .C
.T1:    CMP.W   #VALUE,D0
    BNE.S   .T2
    ADDQ.L  #4,A3
    BRA.S   .C
.T2:    CMP.W   #IDENT,D0
    BNE.S   .T3
    ADDQ.L  #4,A3
    BRA.S   .C
.T3:    CMP.W   #STR,D0
    BNE.S   .XB
    ADDQ.L  #2,A3
    MOVE.W  (A3)+,D7
    LSL.W   #1,D7
    ADD.W   D7,A3
    BTST    #2,CODEPREFS+3
    BNE.S   .XB
.C: CMP.W   #COM,(A3)+
    BEQ.S   .XL
    CMP.W   #18,-2(A3)
    BNE.S   .XB
    MOVEQ   #-1,D0
    BRA.S   .O
.XB: MOVEQ   #0,D0
.O: MOVE.L  D1,A3

; OPTFLAG NOW IN D0, CHOOSE BETWEEN TWO:

    TST.L   D0
    BNE OPTIARGS

.2: MOVE.W  EXPLNUM(PC),D0
    MOVE.W  D0,D1
    MULU    #-4,D1
    MOVE.W  EXPGETSTACK(PC),(A4)+
    MOVE.W  D1,(A4)+
    SUBQ.W  #1,D0
    LEA EXPLREGS(PC),A0
EXPLARGLOOP:
    MOVEM.L D0/A0/A6,-(A7)
    MOVE.W  EXPLCHECK(PC),-(A7)
    MOVE.W  #-1,EXPLCHECK
    BSR EXP
    MOVE.W  (A7)+,EXPLCHECK     ; RESTORE PREVIOUS VALUE
    MOVEM.L (A7)+,D0/A0/A6
    MOVE.B  (A0)+,D1
    EXT.W   D1
    LSL.W   #2,D1
    MOVE.W  EXPTOSTACK(PC),(A4)+
    MOVE.W  D1,(A4)+    
    TST.W   D0
    BEQ.S   EXPLARGOUT
    CMP.W   #COM,(A3)+
    BNE ERROR5
    DBRA    D0,EXPLARGLOOP
EXPLARGOUT:
    MOVE.W  EXPGETBASE(PC),(A4)+
    MOVE.W  EXPLBASE(PC),D0
    BSR DOOFF
    MOVE.W  D0,(A4)+
    MOVE.W  EXPMOVEM(PC),(A4)+
    MOVE.W  EXPLMASK(PC),(A4)+
    MOVE.W  EXPJSR(PC),(A4)+
    MOVE.W  EXPLOFF(PC),(A4)+
    CMP.W   #0,A6
    BEQ.S   .1
    MOVE.L  RETRIEVE45(PC),(A4)+
.1: MOVE.W  EXPLRSM(PC),D0
    RESTR   D0
    RTS

OPTIARGS:
    MOVE.W  EXPLNUM(PC),D0
    SUBQ.W  #1,D0
    MOVE.L  -10(A3),A0
.1: MOVE.B  (A0)+,D1
    MOVEM.L D0/A0/A6,-(A7)
    MOVE.W  EXPLCHECK(PC),-(A7)
    MOVE.W  #-1,EXPLCHECK
    EXT.W   D1
    MOVE.W  D1,EAREQUEST
    BSR EAEXP
    TST.L   D0
    BEQ.S   .3
    MOVE.W  (A7)+,EXPLCHECK
    MOVEM.L (A7)+,D0/A0/A6
    TST.W   D0
    BEQ.S   .2
    CMP.W   #COM,(A3)+
    BNE ERROR5
    DBRA    D0,.1
.2: MOVE.W  EXPGETBASE(PC),(A4)+
    MOVE.W  EXPLBASE(PC),D0
    BSR DOOFF
    MOVE.W  D0,(A4)+
    MOVE.W  EXPJSR(PC),(A4)+
    MOVE.W  EXPLOFF(PC),(A4)+
    RTS
.3: INTERN  100

EXPLIBJSR:            ; IN CASE OF Func()
    MOVE.W  EXPGETBASE(PC),(A4)+
    MOVE.W  EXPLBASE(PC),D0
    BSR DOOFF
    MOVE.W  D0,(A4)+
    MOVE.W  EXPJSR(PC),(A4)+
    MOVE.W  EXPLOFF(PC),(A4)+
    RTS

EXPJSR:       JSR -30(A6)
EXPGETBASE:   MOVE.L  -40(A4),A6
EXPGETSTACK:  LEA 4(A7),A7
EXPMOVEM:     MOVEM.L (A7)+,D0/A0
EXPTOSTACK:   MOVE.L  D0,4(A7)
SAVE45:       MOVEM.L A4/A5,-(A7)
RETRIEVE45:   MOVEM.L (A7)+,A4/A5

EXPLCHECK:    DC.W    0   ; NOTE: THESE DATA=NUMRECSAVE LONGS!
EXPLBASE:     DC.W    0
EXPLOFF:      DC.W    0
EXPLMASK:     DC.W    0
EXPLNUM:      DC.W    0
EXPLEXCEPT:   DC.W    0
EXPLOPTI:     DC.W    0
EXPLRSM:      DC.W    0
EXPLREGS:     DC.L    0,0,0,0
;*-*
;; EFunction
EXPEFUNC:
    CMP.W   #1,D5
    BEQ ERROR0
    MOVE.L  (A3)+,A0        ; A0=FUNCTABENTRY

    MOVE.L  A0,D0
    SUB.L   #EFUNCTAB,D0
    DIVU    #EFUNCENTRYSIZE,D0
    LSL.W   #1,D0
    LEA     EFUNCFLAGSTAB,A6
    MOVE.W  0(A6,D0),D2
    BTST    #8,D2
    BNE     EXPINLINE

    MOVEQ   #0,D0           ; D0=COUNT ARGS
    MOVEQ   #-100,D2
    TST.L   8(A0)           ; WRITEF/PRINTF?
    BPL.S   .3
    MOVE.L  8(A0),D2
    SUBQ.L  #1,D2
    ASL.L   #2,D2
.3: CMP.W   #17,(A3)+
    BNE ERROR23
    BSR SD0
    SUBA.L  A6,A6           ; NO BACKPATCH SOFAR

.1: CMP.W   #18,(A3)
    BEQ.S   .2
    ADDQ.L  #4,D2
    BMI.S   .4
    TST.L   D2
    BNE.S   .1C
    MOVE.L  A4,A6           ; A6=BACKPATCH
    MOVE.L  .LEA(PC),(A4)+
.1C:    MOVEM.L A0/D0/D2/A6,-(A7)
    BSR.W   EXP
    MOVEM.L (A7)+,A0/D0/D2/A6
    TST.L   D2
    BNE.S   .1B
    MOVE.W  WRITEFARG+4(PC),(A4)+
    BRA.S   .6
.1B:    MOVE.W  WRITEFARG(PC),(A4)+
    MOVE.W  D2,(A4)+
    BRA.S   .6
.4: MOVEM.L A0/D0/D2/A6,-(A7)
    MOVE.W  #16,EAREQUEST
    BSR.W   EAEXP
    TST.L   D0
    BNE.S   .NUS
    MOVE.W  UPSTACK(PC),(A4)+
.NUS:   MOVEM.L (A7)+,A0/D0/D2/A6
.6: ADDQ.L  #1,D0
    CMP.W   #COM,(A3)+
    BEQ.S   .1
    SUBQ.L  #2,A3

.2: TST.L   8(A0)
    BMI.S   .5
    CMP.L   8(A0),D0
    BEQ .DAB
    BSR EFUNDA
.DAB:   BRA.S   .5B
.5: CMP.L   #-4,D2          ; ATLEAST 1-3 ARGS
    BMI ERROR23
    MOVE.L  A6,D1
    BEQ.S   .5C
    ADDQ.L  #4,D2
    NEG.L   D2
    MOVE.W  D2,2(A6)
.5C:    MOVE.L  D0,D2
    ADD.L   8(A0),D2
    ADDQ.L  #1,D0
    LSL.L   #2,D2
    MOVE.W  .P(PC),(A4)+
    MOVE.W  D2,(A4)+
.5B:    MOVE.L  EFUNCJUMP(PC),(A4)+
    MOVE.L  D0,D2
    MOVE.L  A0,D0
    SUB.L   #EFUNCTAB,D0
    DIVU.W  #EFUNCENTRYSIZE,D0
    LSL.W   #1,D0

    MOVE.L  A0,-(A7)
    LEA     EFUNCFLAGSTAB,A0
    MOVE.W  0(A0,D0),D7
    BTST    #0,D7
    BEQ.S   .T0
    BSET    #3,CODEPREFS+1
.T0:BTST    #1,D7
    BEQ.S   .T1
    BSET    #4,CODEPREFS+1
.T1:BTST    #2,D7
    BEQ     .T2
    CMP.W   #37,OSVERSION
    BLT     ERROR78
.T2:BTST    #3,D7
    BEQ     .T3
    CMP.W   #39,OSVERSION
    BLT     ERROR78
.T3:BTST    #4,D7
    BEQ     .T4
    CMP.W   #1,ECPU
    BLT     ERROR53
.T4:BTST    #5,D7
    BEQ     .T5
    CMP.W   #2,ECPU
    BLT     ERROR53
.T5:BTST    #6,D7
    BEQ     .T6
    CMP.W   #1,EFPU
    BLT     ERROR53
.T6:BTST    #7,D7
    BEQ     .T7
    CMP.W   #2,EFPU
    BLT     ERROR53
.T7:BTST    #8,D7
    BEQ     .T8
    BTST    #7,CODEPREFS
    BEQ     ERROR0
.T8:BTST    #10,D7
    BEQ     .T9
    BSET    #3,CODEPREFS
.T9:BTST    #11,D7
    BEQ     .TA
    BTST    #6,CODEPREFS
    BEQ     ERROR85
.TA:
    MOVE.L  (A7)+,A0

    LSR.W   #1,D0
    MOVE.L  D0,D7           ; INDEX
    ADD.W   #10,D0

    TSTMOD
    BNE.S   .MOD
    MOVE.W  EFUNCJUMPL(PC),NEWOP
    BSR ADDBRANCH
    BRA.S   .CC
.MOD:   SUBQ.L  #4,A4
    MOVE.W  EFUNCJUMPL(PC),(A4)+
    BSR ADDBRANCHRELOC
    MOVE.W  D0,-2(A4)
.CC:
    MULU    #10,D7
    MOVE.L  #EFUNCRAISE,A6
    LEA 0(A6,D7.W),A6
    TST.W   (A6)
    BEQ.S   .NR
    BSR EXPRAISE
.NR:
    TST.W   D2
    BEQ.S   .E
    MOVE.W  EXPGETSTACK(PC),(A4)+
    LSL.L   #2,D2
    MOVE.W  D2,(A4)+
.E: BSR RD0
    CMP.W   #18,(A3)+       ; EAT )
    BNE ERROR23
    MOVEQ   #1,D5
    BRA EXPLOOP
.LEA:   LEA 4(A7),A7
.P: PEA 0.W

EFUNDA: ADDQ.L  #1,D0
    CMP.L   8(A0),D0
    BNE ERROR23
    MOVE.L  12(A0),D6
    BEQ ERROR23
    CMP.L   #-1,D6
    BNE.S   .SK
    MOVEQ   #0,D6
.SK:    MOVE.L  D6,D1           ;
    AND.L   #$FFFFFF00,D1       ; not really needed?
    BNE ERROR23         ;
    EXT.W   D6
    MOVE.W  .P(PC),(A4)+
    MOVE.W  D6,(A4)+
    RTS
.P: PEA 0.W

UPSTACK:
    MOVE.L  D0,-(A7)
EFUNCJUMP:
    BSR EFUNCJUMP
EFUNCJUMPL:
    JSR EFUNCJUMP
WRITEFARG:
    MOVE.L  D0,4(A7)
    MOVE.L  D0,(A7)


EXPRAISE:             ; GETS PTR TO RAISESTRUCT IN A6,
    MOVEM.L D0/D1/A0,-(A7)      ; TRHASHES ONLY A6
    TST.L   6(A6)
    BEQ.S   .Z
    MOVE.W  .1(PC),(A4)+
    MOVE.L  6(A6),(A4)+
    BRA.S   .Z2
.Z: MOVE.W  .1B(PC),(A4)+
.Z2:    MOVE.W  (A6),D0
    SUB.W   #11,D0
    LSL.W   #1,D0
    MOVE.W  .2(PC,D0.W),(A4)+
    MOVE.L  A4,A0
    MOVE.W  .3(PC),(A4)+
    MOVE.L  2(A6),(A4)+
    MOVE.L  .4(PC),(A4)+
    MOVEQ   #92,D0          ; CAUSE
    MOVE.B  #-1,EFUNCBYTE+82
    MOVEM.L D0/A0,-(A7)


    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:

    MOVEM.L (A7)+,D0/A0
    MOVE.L  A4,D0
    SUB.L   A0,D0
    MOVE.B  D0,-1(A0)
    MOVEM.L (A7)+,D0/D1/A0
    RTS
.1: CMP.L   #1,D0
.1B:    TST.L   D0
.2: BNE.S   .1
    BLE.S   .1
    BGE.S   .1
    BLT.S   .1
    BGT.S   .1
    BEQ.S   .1
.3: MOVE.L  #1,-(A7)
.4: BSR.W   .3
.5: JSR .3

;*-*
;; EXPINLINE
EXPINLINE:
    tst.l   d5
    bgt     ERROR0
    bmi     .n_d
    BSR     SD0
.n_d:
    cmp.w   #17,(a3)+
    bne     ERROR0
    MOVE.L  D0,-(A7)
    LSL.W   #1,D0
    LEA     INLINETAB,A0
    MOVE.L  0(A0,D0),A0
    JSR     (A0)

    tst.l   d5
    bmi     .exit
    bsr     RD0
.exit:
    MOVe.L  (A7)+,D0
    MOVE.L  A0,-(A7)
    LEA     EFUNCFLAGSTAB,A0
    MOVE.W  0(A0,D0),D7
    BTST    #0,D7
    BEQ.S   .T0
    BSET    #3,CODEPREFS+1
.T0:BTST    #1,D7
    BEQ.S   .T1
    BSET    #4,CODEPREFS+1
.T1:BTST    #2,D7
    BEQ     .T2
    CMP.W   #37,OSVERSION
    BLT     ERROR78
.T2:BTST    #3,D7
    BEQ     .T3
    CMP.W   #39,OSVERSION
    BLT     ERROR78
.T3:BTST    #4,D7
    BEQ     .T4
    CMP.W   #1,ECPU
    BLT     ERROR53
.T4:BTST    #5,D7
    BEQ     .T5
    CMP.W   #2,ECPU
    BLT     ERROR53
.T5:BTST    #6,D7
    BEQ     .T6
    CMP.W   #1,EFPU
    BLT     ERROR53
.T6:BTST    #7,D7
    BEQ     .T7
    CMP.W   #2,EFPU
    BLT     ERROR53
.T7:BTST    #10,D7
    BEQ     .T8
    BSET    #3,CODEPREFS
.T8:BTST    #11,D7
    BEQ     .T9
    BTST    #6,CODEPREFS
    BEQ     ERROR85
.T9:
    MOVE.L  (A7)+,A0

    moveq   #1,d5
    cmp.w   #18,(a3)+
    bne     ERROR74 
    bra     EXPLOOP

;*-*
;; LibFunc
EXPLIBFUNC:
    CMP.W   #1,D5
    BEQ     ERROR0

    MOVE.L  (A3)+,-(A7)

    CMP.W   #17,(A3)+
    BNE     ERROR0
    MOVEQ   #0,D6
    MOVE.W  D6,.TARGS
    tst.l   d5
    bmi     .X1
    BSR SD0
.X1:
    MOVE.W  #0,-(A7)
    CMP.W   #18,(A3)
    BEQ .NARGS
.ARGLOOP:
    ADDQ.W  #1,(A7)
    MOVE.W  #16,EAREQUEST
    BSR     EAEXP
    TST.L   D0
    BNE.S   .OPT
    MOVE.W  .4(PC),(A4)+
.OPT:
    CMP.W   #COM,(A3)+
    BEQ .ARGLOOP
    SUBQ.L  #2,A3
.NARGS:
    MOVE.W  (A7)+,.TARGS
    MOVEM.L  (A7)+,A6
    MOVEQ   #0,D6
    MOVE.W  .TARGS,D6
    CMP.W   #18,(A3)+
    BNE     ERROR74
    TST.W   LIB_ARGS(A6)
    BPL     .ARGSPLUS

    MOVEQ   #0,D2
    MOVE.L  D6,D0
    ADDQ.L  #1,D6
    MOVE.W  LIB_ARGS(A6),D2
    EXT.L   D2
    NEG.L   D2
    SUBQ.L  #1,D2

    SUB.L   D2,D0
    BMI ERROR23
    LSL.L   #2,D0

    MOVE.W  .45(PC),(A4)+
    MOVE.W  .46(PC),(A4)+
    MOVE.W  D0,(A4)+
    MOVE.L  D0,D2
    LSR.L   #3,D2
    SUBQ.L  #1,D2
    BMI .CD
.XYZ:
    MOVE.L  .47(PC),(A4)+
    MOVE.W  .47+4(PC),(A4)+
    DBF     D2,.XYZ
.CD:
    SWAP    D0
    TST.W   D0
    BNE     .LOADS
    SWAP D0
    MOVE.W  .43(PC),(A4)+
    MOVE.W  D0,(A4)+
    BRA .ARGSPLUS2
.LOADS:
    SWAP    D0
    MOVE.W  .44(PC),(A4)+
    MOVE.L  D0,(A4)+
    BRA .ARGSPLUS2
.ARGSPLUS:
    CMP.W   LIB_ARGS(A6),D6
    BNE     ERROR23
.ARGSPLUS2:
    CMP.W   #1,LIB_TYPE(a6)
    beq .INLINE

    BSR     PUTLIBBRANCH

    LSL.W   #2,D6
    TST.L   D6
    BEQ .EXIT
    MOVE.W  .LEA(PC),(A4)+
    MOVE.W  D6,(A4)+
.EXIT:
    tst.l   d5
    bmi     .X2
    BSR RD0
.X2:
    MOVEQ   #1,D5
    BRA EXPLOOP

.TARGS:
    DC.W    0
.LEA:
    LEA     4(A7),A7
.4:
    MOVE.L  D0,-(A7)
.42:
    MOVE.L  (A7)+,D0
.43:
    PEA $0.W
.44:
    PEA $0
.45:
    MOVE.L  A7,A0
.46:
    LEA 4(A7),A1
.47:
    MOVE.L  (A0),D0
    MOVE.L  -(A1),(A0)+
    MOVE.L  D0,(A1)

.INLINE:
    MOVE.W  LIB_ARGS(A6),D5
    BEQ     .INLCNT
    SUBQ.L  #1,D5
.INLMOVE:
    MOVE.W  .42(PC),(A4)
    MOVEQ   #0,D0
    MOVE.B  20(a6,d5),d0
    cmp.b   #4,d0
    SPL     D1
    AND.W   #$40,D1
    OR.W    D1,(A4)
    AND.B   #3,D0
    LSL.L   #8,D0
    LSL.L   #1,D0
    OR.W    D0,(A4)+
    DBF D5,.INLMOVE
.INLCNT:
    MOVE.L  A6,-(A7)
    MOVE.L  LIB_CODE(A6),A6
    MOVE.L  (A6)+,D0
    LSR.L   #1,D0
    SUBQ.L  #1,D0
    MOVE.L  A4,-(A7)
.INLCPY:
    MOVE.W  (A6)+,(A4)+
    DBF D0,.INLCPY
    MOVE.L  (A7)+,A6
    MOVe.L  (A7)+,d0
    move.l  a0,-(a7)
    move.l  d0,a0
    subq.l  #4,a6
    JSR FIXRELOC
    move.l  (a7)+,a0
    BRA .EXIT

;*-*

;; GetExp
; params: D0 -> final storage
EA_GETEXP:
    move.l  d0,-(a7)

    BSR.W   EXP

    move.l  (a7)+,d0
    TST.W   D0
    BEQ     .x
    move.w  .res(PC),(A4)
    OR.W    D0,(A4)+
.x:
    RTS
.res:
    MOVE.L  D0,D0
;*-*

;; <=>
; WARNING: AMAZING FEATURE AHEAD!

EXPUNIFY:
    CMP.W   #1,D5
    BNE ERROR0
    MOVEQ   #-1,D7          ; D7 = LEVEL/#OF_AX_USED
    BSR NEWLABEL
    MOVE.L  D0,D6           ; D6 = FALSELABEL
    CLR.W   NEWOP
    BSR.S   .R

    CMP.W   #1,EXPRECC
    BNE.S   .DI
    TST.W   EXPSTAT
    BNE .SR

.DI:    CMP.W   #-2,D7
    BEQ.S   .SH
    MOVE.L  .TRUE(PC),(A4)+
    MOVE.L  D6,D0
    BSR ADDLABEL
    MOVE.W  .FALSE(PC),(A4)+
    BRA EXPLOOP
.SH:    MOVE.W  .TRUE(PC),(A4)+
    BRA EXPLOOP

.SR:    MOVE.L  D6,D0
    BSR ADDLABEL
    BRA EXPLOOP

.R: MOVE.W  (A3)+,D0        ; RECURSIVE PART
    CMP.W   #VALUE,D0
    BNE.S   .1
.0: MOVE.L  (A3)+,D0
.0B:    TST.L   D7          ; VALUE
    BMI.S   .1B
    MOVE.W  .CMP2(PC),(A4)
    OR.W    D7,(A4)+
    BRA.S   .1C
.1B:    MOVE.W  .CMP(PC),(A4)+
.1C:    MOVE.L  D0,(A4)+
    MOVE.L  .BNE(PC),(A4)+
    MOVE.L  D6,D0
    BSR ADDBRANCH
    BRA .X

.1: CMP.W   #IDENT,D0
    BNE .2
    TST.L   D7          ; IDENT
    BMI.S   .2B
    MOVE.W  .M2(PC),(A4)
    OR.W    D7,(A4)+
    BRA.S   .2C
.2B:    MOVE.W  .M(PC),(A4)+
    SUBQ.L  #1,D7           ; AT TOP LEVEL: ALWAYS TRUE
.2C:    MOVE.L  (A3)+,A0
    BSR GVA0D0_9
    BRA.W   .X

.2: CMP.W   #29,D0
    BNE.S   .3
    ADDQ.L  #4,A3           ; LIST
    CLR.W   -(A7)           ; TOP STACK = NUM ELEMENTS
    TST.L   D7
    BMI.S   .3B
    MOVE.W  .GET2(PC),(A4)
    OR.W    D7,(A4)
    BRA.S   .3C
.3B:    MOVE.W  .GET(PC),(A4)
.3C:    ADDQ.L  #1,D7
    CMP.W   #4,D7
    BEQ ERROR46
    MOVE.L  D7,D0
    MOVEQ   #9,D1
    LSL.W   D1,D0
    OR.W    D0,(A4)+
    MOVE.W  .LEN(PC),(A4)
    OR.W    D7,(A4)+
    MOVE.L  A4,A6           ; A6=PATCHBACK
    MOVE.W  D0,(A4)+        ; DUM D0
    MOVE.W  #-2,(A4)+
    MOVE.L  .BNE(PC),(A4)+
    MOVE.L  D6,D0
    BSR ADDBRANCH
.XL:MOVE.L  A6,-(A7)
    BSR.W   .R
    MOVE.L  (A7)+,A6
    ADDQ.W  #1,(A7)
    CMP.W   #COM,(A3)+
    BEQ.S   .XL
    CMP.W   #30,-2(A3)
    BNE ERROR34
    MOVE.W  (A7)+,(A6)
    SUBQ.L  #1,D7
    BRA.W   .X

.3: CMP.W   #8,D0
    BNE.S   .4
    CMP.W   #VALUE,(A3)+        ; -VALUE
    BNE ERROR30
    NEG.L   (A3)
    BRA .0

.4: CMP.W   #13,D0          ; <CONS|CELL>
    BNE.S   .5
    TST.L   D7
    BMI.S   .4B
    MOVE.W  .GET2(PC),(A4)      ; GET CELL IN A0
    OR.W    D7,(A4)
    BRA.S   .4C
.4B:    MOVE.W  .GET(PC),(A4)
.4C:    ADDQ.L  #1,D7
    CMP.W   #4,D7
    BEQ ERROR46
    MOVE.L  D7,D0
    MOVEQ   #9,D1
    LSL.W   D1,D0
    OR.W    D0,(A4)+
.4L:    BSR.W   .R
    CMP.W   #COM,(A3)+
    BNE.S   .4D
    MOVE.W  .CDR(PC),(A4)

    MOVE.L  D7,D0
    MOVEQ   #9,D1
    LSL.W   D1,D0
    OR.W    D7,D0
    OR.W    D0,(A4)+

    BRA.S   .4L
.4D:    CMP.W   #46,-(A3)
    BNE.S   .4E
    ADDQ.L  #2,A3
    BSR.W   .R
    BRA.W   .4F
.4E:    ; TEST CDR=0 HERE

    MOVE.W  .NIL(PC),(A4)
    MOVE.L  D7,D0
    OR.W    D7,(A4)+
    MOVE.L  .BNE(PC),(A4)+
    MOVE.L  D6,D0
    BSR ADDBRANCH

.4F:    CMP.W   #12,(A3)+
    BNE ERROR0
    SUBQ.L  #1,D7
    BRA.S   .X

.5: CMP.W   #16,D0
    BNE.S   .6
    MOVEQ   #0,D0
    BRA.W   .0B

.6: ; OTHER TYPES
    BRA ERROR0

.X: RTS

.CMP:   CMPI.L  #1,D0
.CMP2:  CMPI.L  #1,(A0)+
.M: MOVE.L  D0,2(A5)
.M2:    MOVE.L  (A0)+,2(A5)
.BNE:   BNE .CMP
.TRUE:  MOVEQ   #-1,D0
    BRA.S   .FALSE+2
.FALSE: MOVEQ   #0,D0
.GET:   MOVE.L  D0,A0
.GET2:  MOVE.L  (A0)+,A0
.LEN:   CMPI.W  #1,-2(A0)
.CDR:   MOVE.L  (A0),A0
.NIL:   TST.L   (A0)

;*-*
FINISHFPEXP:
    DC.W    0
;*-*
    ELSE
;; Expression main
; it's NOT FINISHED
; This one will handle FLOAT var types etc in nearest future (2.1x? 2.2x?)
; PLEASE NOTE (!!!) that IT DOES NOT support MANY things YET
; (i.e. float calculations etc)
; most parts are copied from original source (2.0x)

EXPRECC:  DC.W    0       ; RECURSION DEPTH OF EXP()
EXPTYPE:  DC.W    0       ; EXPRESSION TYPE

;; Main expression loop
EXP:              ; GENERATES EXP FOR D0

    MOVE.W  MOVEQ(PC),(A4)+

    MOVEM.L D3-D5/A1/A2,-(A7)   ; WE DO HEAVY RECURSION
    MOVE.W  FLTFLAG(PC),-(A7)
    MOVE.W  EXPTYPE(PC),-(A7)
    CLR.W   EXPTYPE
    CLR.L   LASTVAR
    CLR.W   FLTFLAG
    ADDQ.W  #1,EXPRECC
    MOVEQ   #6,D4           ;
    MOVEQ   #-1,D5          ; MUST BE = EXPBUT

    CMP.W   #51,(A3)
    BNE     EXPLOOP
    MOVEQ   #1,D5           ; variable
    ADDQ.L  #2,A3

EXPLOOP:
    MOVE.W  (A3)+,D0
    BEQ EXPOUT
    CMP.W   #COM,D0
    BEQ EXPOUT
    CMP.W   #7,D0
    BPL EXPOPERATOR
EXPBACK:
    CMP.W   #IDENT,D0
    BEQ EXPVAR
    CMP.W   #STR,D0
    BEQ EXPSTRING
    CMP.W   #VALUE,D0
    BEQ EXPVALUE
EXPBACK2:
    CMP.W   #17,D0
    BEQ EXPREC
    CMP.W   #LIBC,D0
    BEQ EXPLIBCALL
    CMP.W   #22,D0
    BEQ EXPEFUNC
    CMP.W   #23,D0
    BEQ CURLY
    CMP.W   #29,D0
    BEQ EXPIMMLIST
    CMP.W   #18,D0
    BEQ EXPOUT
    CMP.W   #30,D0
    BEQ EXPOUT
    CMP.W   #53,D0
    BEQ     EXPSWAP
    CMP.W   #32,D0
    BEQ.W   EXPPTR
    CMP.W   #19,D0
    BEQ.S   EXPOUT
    CMP.W   #IOFF+2,D0
    BEQ EXPIF
    CMP.W   #IOFF+50,D0
    BEQ EXPSIZEOF
    CMP.W   #36,D0
    BEQ EXPQUOTE
    CMP.W   #37,D0
    BEQ EXPFLT
    CMP.W   #IOFF+63,D0
    BEQ EXPNEW
    CMP.W   #IOFF+55,D0
    BEQ EXPBUT
    CMP.W   #40,D0
    BEQ EXPUNIFY
    CMP.W   #IOFF+66,D0
    BEQ EXPSUPER
    CMP.W   #46,D0
    BEQ EXPOUT
    CMP.W   #54,D0
    BEQ EXPLIBFUNC
    CMP.W   #52,D0
    BEQ EXPQMARK            ; ?
    CMP.W   #IOFF,D0
    BMI ERROR0
EXPOUT:
    TST.W   FLTFLAG
    BEQ .0
    BTST    #1,CODEPREFS
    BEQ .0
    MOVE.L  .C0(PC),(A4)+
.0:
    SUBQ.L  #2,A3
    CMP.W   #1,D5
    BNE ERROR0
    SUBQ.W  #1,EXPRECC
    MOVE.W  (A7)+,EXPTYPE
    MOVE.W  (A7)+,FLTFLAG
    MOVEM.L (A7)+,D3-D5/A1/A2
    RTS
.C0:FMOVE.S FP0,D0
;*-*
;; "^"
EXPPTR:
    CMP.W   #1,D5
    BEQ ERROR0
    MOVEQ   #1,D0
    SUBQ.L  #2,A3
    BSR EADDRESSMODI
    CMP.W   #-1,D5
    BEQ.S   .1
    BSR CLOSEEXP
.1: MOVEQ   #1,D5
    BRA EXPLOOP
;*-*
;; BUT
EXPBUT:
    CMP.W   #1,D5
    BNE ERROR0
;   MOVE.W  (A3),D0
;   CMP.W   #IOFF+29,D0
;   BEQ.S   .A
;   CMP.W   #IOFF+30,D0
;   BEQ.S   .O
    MOVEQ   #6,D4           ;
    MOVEQ   #-1,D5          ; = START OF EXP
    CLR.W   EXPTYPE
    BRA EXPLOOP
;.A:    MOVE.W  .EQ(PC),D0
;   BRA.S   .S
;.O:    MOVE.W  .NE(PC),D0
;.S:    ADDQ.L  #2,A3
;   MOVE.W  .TST(PC),(A4)+
;   MOVE.W  D0,(A4)+
;   MOVE.L  A4,A0
;   CLR.W   (A4)+
;   MOVE.L  A0,-(A7)
;   BSR.W   EXP
;   MOVE.L  (A7)+,A0
;   MOVE.L  A4,D0
;   SUB.L   A0,D0
;   MOVE.W  D0,(A0)
;   MOVEQ   #1,D5
;   BRA EXPLOOP
;.EQ:   BEQ.W   .A
;.NE:   BNE.W   .A
;.TST:  TST.L   D0

;*-*
;; Macro section
; RETURNS: 0=LIST, 1,2,4=SIMPLE, PTR=OBJECT

GTYPE:  MACRO               ; \1=TRASH.AX, \2=RESULT.DX
    MOVEQ   #0,\2
    MOVE.L  (A3)+,\1
    ADD.L   A3,\1
    SUBQ.L  #4,\1
    CMP.W   #19,(\1)+
    BNE.S   .GTOUT
    MOVE.W  (\1)+,\2
    CMP.W   #IOFF+20,\2
    BMI.S   .GT1
    CMP.W   #IOFF+23,\2
    BPL.S   .GT1
    SUB.W   #IOFF+20,\2
    MOVE.B  .GTTAB(PC,\2.W),\2
    EXT.W   \2
    EXT.L   \2
    BRA.S   .GTOUT
.GT1:   CMP.W   #31,\2
    BNE.S   .GTER
    MOVE.L  (\1),\2
    BRA.S   .GTOUT
.GTTAB: DC.B    4,2,1,0
.GTER:  MOVE.L  \1,A3
    BRA ERROR0
.GTOUT:
    ENDM

GEAT:   MACRO               ; \1=THRASH.DX
    CMP.W   #19,(A3)
    BNE.S   .GTDONE
    ADDQ.L  #2,A3
    MOVE.W  (A3)+,\1
    CMP.W   #IOFF+20,\1
    BMI.S   .GT9
    CMP.W   #IOFF+23,\1
    BMI.S   .GTDONE
.GT9:   CMP.W   #31,\1
    BNE ERROR0
    ADDQ.L  #4,A3
.GTDONE:
    ENDM
;*-*
;; SUPER
EXPSUPER:
    CMP.W   #1,D5
    BEQ ERROR0
    BSR SD0
    BSR SUPEREXP
    BSR RD0
    MOVEQ   #1,D5
    BRA EXPLOOP
SUPEREXP:
    CMP.W   #IDENT,(A3)+
    BNE ERROR0
    MOVE.L  (A3)+,A0        ; A0=IDENT
    MOVE.L  A0,METHODIDENT
    TST.B   4(A0)
    BEQ ERROR22
    CMP.B   #LAB,4(A0)
    BEQ ERROR6
    MOVE.L  (A0),A6         ; A6=OBJ
    CMPA.L  #MAXOBJSIZE,A6
    BMI.W   ERROR33
    MOVE.L  OSUPER(A6),D0
    BEQ ERROR50
    MOVE.L  D0,A6           ; A6=SUPER
    TST.W   ODEL(A6)
    BEQ ERROR40
    CMP.W   #35,(A3)+
    BNE ERROR0
    MOVE.L  A6,METHODFREEZ
    CLR.L   METHODSPEC
    BSR EXPCALLMETHOD       ; call SUPER-METHOD
    MOVE.L  METHODFREEZ(PC),A6
    CLR.L   METHODFREEZ
    RTS
;*-*
;; NEW
EXPNEW:
    CMP.W   #1,D5
    BEQ ERROR0
    BSR.W   SD0
    MOVEQ   #0,D0
    BSR.S   NEWEXP
    BSR.W   RD0
    MOVEQ   #1,D5
    BRA EXPLOOP
NEWEXP:
    MOVE.W  D0,-(A7)
.NLOOP: CMP.W   #IDENT,(A3)+
    BNE .NL
    MOVE.L  (A3)+,A0        ; A0=IDENT
    TST.B   4(A0)
    BEQ ERROR22
    CMP.B   #LAB,4(A0)
    BEQ ERROR6

    MOVE.W  #-1,.ISM

    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  A1,-(A7)
    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.L  (A7)+,A1
.0:
    CMP.W   #29,(A3)
    BNE.S   .1
    ADDQ.L  #6,A3           ; ALSO SKIP ]OFFSET
    MOVEM.L A0/D0/A6,-(A7)      ; NEW p[exp]
    BSR EXP
    MOVEM.L (A7)+,A0/D0/A6
    CLR.W   .SINGL
    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: MOVE.W  .S2(PC),(A4)+       ; just NEW p
    MOVE.W  D0,(A4)+
    MOVE.W  #1,.SINGL

.2: MOVE.L  D0,D1           ; D1=OBJECTSIZE NOW
    BSR .GNEW
    MOVE.W  .A(PC),(A4)+

    MOVE.W  .ISM(PC),D1
    BPL.W   .A0O

    MOVE.W  .ST(PC),(A4)+
    BSR GVA0D0_9
    BRA.S   .NA0O

.A0O:   MOVE.W  .ST2(PC),(A4)+
    BSR GVA0D0_0
    MOVE.W  .ST3(PC),(A4)+
    MOVE.W  D1,(A4)+
.NA0O:
    TST.W   .SINGL
    BEQ.W   .3

    MOVE.L  A6,D0
    BEQ.W   .4B
    TST.W   ODEL(A6)
    BEQ.W   .4B
    MOVE.L  A0,METHODIDENT
    GETM    A0
    MOVE.L  OACC(A6),(A0)
    MOVE.L  A0,OACC(A6)
    ADDQ.L  #4,A0
    MOVE.W  .GOBJ(PC),(A4)+
    TST.W   ODELOFF(A6)
    BNE.S   .G1
    MOVE.W  .GOBJ2(PC),(A4)+
    MOVE.L  A4,(A0)+
    CLR.W   (A4)+
    BRA.S   .G2
.G1:    MOVE.W  .GOBJ3(PC),(A4)+
    MOVE.L  A4,(A0)+
    CLR.W   (A4)+
    MOVE.W  ODELOFF(A6),(A4)+
.G2:    CLR.W   (A0)+
    DONEM   A0
    CMP.W   #35,(A3)
    BNE.S   .4B
    ADDQ.L  #2,A3

    CLR.L   METHODSPEC
    TST.W   .ISM
    BMI.S   .NMS
    MOVE.L  A6,METHODSPEC
.NMS:
    MOVE.L  METHODIDENT(PC),-(A7)
    BSR EXPCALLMETHOD       ; call constructor on memory
    MOVE.L  (A7)+,METHODIDENT
    TST.W   (A7)
    BNE.S   .4B
    MOVE.W  .MV(PC),(A4)+
    MOVE.L  METHODIDENT(PC),A0
    BSR GVA0D0_0
    BRA.S   .4B
.3:
    MOVE.L  A6,D0
    BEQ.S   .4B
    TST.W   ODEL(A6)
    BNE ERROR40
.4B:    
.XXXX:  TST.W   (A7)
    BEQ.S   .X1
    CMP.W   #COM,(A3)+
    BEQ .NLOOP
    SUBQ.L  #2,A3
.X1:    ADDQ.L  #2,A7
    RTS

.SINGL: DC.W    0
.ISM:   DC.W    0
.MV:    MOVE.L  2(A5),D0
.M: MULU    #6,D0
.LSL1:  LSL.L   #1,D0
.LSL2:  LSL.L   #2,D0
.S1:    MOVE.L  D0,-(A7)
.S2:    PEA 1.W
.5: JSR .M
.4: BSR.W   .M
.A: ADDQ.L  #4,A7
.ST:    MOVE.L  D0,2(A5)
.ST2:   MOVE.L  2(A5),A0
.ST3:   MOVE.L  D0,4(A0)
;.ST4:  MOVE.L  D0,A0
.GOBJ:  MOVE.L  D0,A0
.GOBJ2: MOVE.L  4(A4),(A0)
.GOBJ3: MOVE.L  4(A4),4(A0)

; GNEW TRASHES NOTHING

.GNEW:  MOVEM.L D0/D1/A0,-(A7)
    MOVEQ   #110+10,D0      ; D0=FASTNEW
    MOVE.B  #-1,EFUNCBYTE+110   ; fastnew=111
    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:    MOVEM.L (A7)+,D0/D1/A0
    RTS

.AD:    MOVE.L  D0,(A7)
.ALLD:  MOVE.L  (A7)+,D0
.LOAD:  MOVE.L  (A7),A6

.NL:    CMP.W   #29,-2(A3)
    BNE ERROR6
    MOVE.W  .S2(PC),(A4)+
    MOVE.L  A4,A6           ; A6=BACKPATCH
    CLR.W   (A4)+
    BSR .GNEW
    MOVE.W  .AD(PC),(A4)+
    MOVEQ   #0,D6           ; D6=TOTAL MEM USED
    GTYPE   A0,D7           ; D7=OBJECT OR NIL
    MOVE.L  D7,D2           ; D2=ADDSIZE IF NIL, ELSE CURMEMBER
    AND.L   #7,D2
    CMP.L   D2,D7
    BNE.S   .TIO
    MOVEQ   #0,D7
    MOVE.L  D2,D1           ; D1=STORESIZE
    TST.L   D2
    BNE.S   .TTD
    MOVEQ   #4,D2           ; true list
    MOVEQ   #4,D6           ; 4 EXTRA, ONLY 2 USED!
    BRA.S   .TTD
.TIO:   MOVE.L  D7,A0
    TST.W   (A0)
    BNE ERROR60
    MOVE.L  OMEMB(A0),D2
    MOVE.L  D2,A0
    MOVE.W  (A0),D6
    EXT.L   D6
.TTD:   CMP.W   #30,(A3)
    BEQ.S   .NLO
.NLL:   TST.L   D7
    BEQ.S   .NOBJ
    TST.L   D2
    BEQ ERROR46
    MOVE.L  D2,A0
    ;MOVE.L OASCII(A0),D1       ; PRIVATE MEMBER IN OBJECT
    ;BEQ    ERROR60
    ;BTST   #0,OFLAGS(A0)
    ;BNE    ERROR60
    MOVE.W  OSIZE(A0),D1        ; ARRAY IN OBJECT
    BEQ ERROR40
.NOBJ:  MOVEM.L D1/D2/D6/D7/A6,-(A7)
    BSR EXP
    MOVEM.L (A7)+,D1/D2/D6/D7/A6
    MOVE.W  .LOAD(PC),(A4)+
    MOVE.B  .TAB(PC,D1.W),D0
    EXT.W   D0
    MOVE.W  .STORE(PC,D0.W),(A4)+
    MOVE.W  D6,(A4)+
    TST.L   D7
    BNE.S   .TOBJ
    ADD.L   D2,D6
    BRA.S   .NLO
.STORE: MOVE.B  D0,2(A6)
    MOVE.W  D0,2(A6)
    MOVE.L  D0,2(A6)
.TAB:   DC.B    8,0,4,0,8,0
.TOBJ:  MOVE.L  D2,A0
    MOVE.L  -(A0),A0
    MOVE.L  A0,D2           ; stop if last in memberchain
    BEQ.S   .TEND
    MOVE.W  (A0),D6
    EXT.L   D6
    BRA.S   .NLO
.TEND:  CMP.W   #30,(A3)+
    BNE ERROR0
    BRA.S   .TC
.NLO:   CMP.W   #COM,(A3)+      ; end of loop
    BEQ.S   .NLL
    CMP.W   #30,-2(A3)      ; expect an "]"
    BNE ERROR0
.TC:    TST.L   D7
    BNE.S   .SK1A           ; only if its a list, NO OBJ, SIZE=4
    CMP.W   #4,D2
    BNE.S   .SK1
    CMP.W   #19,(A3)        ; IF ":" THEN IT WASN'T A LIST
    BEQ.S   .SK1
    MOVE.L  .SL(PC),(A4)+
    MOVE.L  D6,D0
    LSR.L   #2,D0
    SUBQ.L  #1,D0
    MOVE.W  D0,(A4)+
    MOVE.W  D0,(A4)+
    MOVE.W  .SL2(PC),(A4)+
    BRA.S   .SK2
.SK1A:  MOVE.L  D7,A0
    MOVE.W  OSIZE(A0),D6
    BEQ ERROR40
    EXT.L   D6
.SK1:   MOVE.W  .ALLD(PC),(A4)+
.SK2:   MOVE.W  D6,(A6)
    GEAT    D0
    AND.L   #$FFFF8000,D6
    BNE ERROR46
    BRA.W   .XXXX
.SL:    MOVE.L  (A7)+,A6
    MOVE.L  #2,(A6)+
.SL2:   MOVE.L  A6,D0
;*-*
;; "?"
EXPQMARK:
    CMP.W   #1,D5
    BNE     ERROR0
    MOVE.W  #$4A80,(A4)+        ; TST.L D0
    MOVE.W  #$6700,(A4)+        ; BNE   xxx
    MOVE.L  A4,-(A7)
    CLR.W   (A4)+               ; BNE   (*+2) - temp

    BSR     EXP                 ; <EXP>

    CMP.W   #19,(A3)            ; "... ? <a> : <b>" ?
    BNE     .1
    MOVE.W  #$6000,(A4)+        ; BRA   xxx
    MOVE.L  A4,A1
    CLR.W   (A4)+               ; BRA   (*+2) - temp
.1:
    MOVE.L  A4,D0
    MOVE.L  (A7),A0
    SUB.L   (A7)+,D0
    MOVE.W  D0,(A0)             ; make _real_ BNE

    CMP.W   #19,(A3)            ; <a> ? <b> [: <c>]
    BNE     .X
    ADDQ.L  #2,A3
    MOVE.L  A1,-(A7)
    BSR     EXP
    MOVE.L  A4,D0
    MOVE.L  (A7),A0
    SUB.L   (A7)+,D0
    MOVE.W  D0,(A0)
.X: BRA     EXPLOOP
;*-*
;; "{"
CURLY:
    CMP.W   #1,D5
    BEQ ERROR0
    CMP.W   #IDENT,(A3)+
    BNE ERROR4
    MOVE.L  (A3)+,A0
    BTST    #3,5(A0)
    BNE ERROR50         ; YOU CAN'T GET THE ADDRESS OF A REG :-)
    CMP.B   #LAB,4(A0)
    BNE.W   .3
    BTST    #4,5(A0)        ; THE LAB VERSION
    BNE ERROR4          ; (NO ADR OF METHOD)

    MOVE.W  10(A0),D0
    BMI.S   .MINM
    MOVE.L  .1(PC),(A4)+
    MOVE.W  .1L(PC),NEWOP
    BSR ADDBRANCH
    BRA.S   .D
.MINM:  MOVE.W  .1L(PC),(A4)+       ; ADR OF LABEL OF OTHER MODULE
    GETM    A6
    MOVE.L  A1,-(A7)
    MOVE.L  VARHEAVY(A0),A1     ; A1=PTR TO PROCCLASS
    MOVE.L  PC_ACC(A1),D0
    MOVE.L  A6,PC_ACC(A1)
    MOVE.L  D0,(A6)+
    MOVE.L  A4,(A6)+
    MOVE.L  (A7)+,A1
    DONEM   A6
    CLR.L   (A4)+
.D:
    CMP.W   #-1,D5
    BNE.S   .8
    MOVE.W  .4(PC),(A4)+
    BRA.S   .9
.8: MOVE.W  .2(PC),(A4)+
    BSR CLOSEEXP
.9: CMP.W   #24,(A3)+
    BNE ERROR29
    MOVEQ   #1,D5
    BRA EXPLOOP
.1: LEA .1(PC),A0
.1L:    LEA .1,A0
.2: MOVE.L  A0,D1
.4: MOVE.L  A0,D0
.5: LEA 2(A5),A0
.3: MOVE.W  .5(PC),(A4)+        ; THE VAR VERSION
    BSR GVA0D2_0
    CMP.W   #-1,D5
    BNE.S   .6
    MOVE.W  .4(PC),(A4)+
    BRA.S   .7
.6: MOVE.W  .2(PC),(A4)+
    BSR CLOSEEXP
.7: MOVEQ   #1,D5
    CMP.W   #24,(A3)+
    BNE ERROR29
    BRA EXPLOOP
;*-*
;; "'"
STRINGLINK:   DC.L    0

EXPSTRING:
    CMP.W   #1,D5
    BEQ ERROR0
    MOVEQ   #0,D0
    ADDQ.L  #2,A3
    MOVE.W  (A3)+,D0        ; D0=STRINGLENGTH IN W
    LEA EXPSTRINGCODE(PC),A0
    CMP.W   #-1,D5
    BNE.S   .SK
    LEA EXPSTRINGCODE2(PC),A0
.SK:    MOVE.L  (A0)+,(A4)+
    MOVEM.L A0/D0,-(A7)
    BSR.W   NEWLABEL        ; ->D0
    MOVE.W  LONGLEA(PC),NEWOP
    BSR ADDBRANCH
    GETM    A6          ; A6=HEAP
    MOVE.L  STRINGLINK(PC),(A6)
    MOVE.L  A6,STRINGLINK
    ADDQ.L  #4,A6
    MOVE.W  D0,(A6)+
    MOVEM.L (A7)+,D0/A0
    MOVE.L  A3,(A6)+
    MOVE.L  A6,D7           ; D7=LASTPTR
    CLR.L   (A6)+
    LSL.W   #1,D0
    MOVE.W  D0,D2           ; D2=TOTALLEN STRINGS
    EXT.L   D2
    ADD.W   D0,A3
    MOVE.W  (A0)+,(A4)+
    DONEM   A6
PLUSTRINGS:
    CMP.L   #$70006,(A3)
    BNE.S   .X
    ADDQ.L  #6,A3
    MOVE.W  (A3)+,D0
    GETM    A6
    MOVE.L  D7,A0
    MOVE.L  A6,(A0)
    MOVE.L  A3,(A6)+
    MOVE.L  A6,D7
    CLR.L   (A6)+
    DONEM   A6
    LSL.W   #1,D0
    EXT.L   D0
    ADD.L   D0,D2
    ADD.W   D0,A3
    BRA.S   PLUSTRINGS
.X: CMP.W   #-1,D5
    BEQ.S   .1
    BSR CLOSEEXP
.1: MOVEQ   #1,D5
    CMP.L   #800,D2
    BPL ERROR46
    BRA EXPLOOP


EXPSTRINGCODE:
    LEA EXPSTRINGCODE2(PC),A0   ; 6-2 BYTES
    MOVE.L  A0,D1
      EXPSTRINGCODE2:
    LEA EXPSTRINGCODE(PC),A0    ; 6-2 BYTES
    MOVE.L  A0,D0
      LONGLEA:
    LEA EXPSTRINGCODE,A0

MAKESTRLEN:
    MOVE.L  #0,-36(A4)
MAKESTRLEN2:
    MOVEQ   #0,D0
    MOVE.L  D0,-36(A4)

D0EXT:    EXT.L   D0
;*-*
;; "("
EXPREC:
    CMP.W   #1,D5
    BEQ ERROR0
    BSR.W   SD0
    BSR.W   EXP
    BSR.W   RD0
    ADDQ.L  #2,A3
    MOVEQ   #1,D5
    BRA EXPLOOP
;*-*
;; "<>"
EXPCONSNIL:
    MOVEQ   #1,D5
    MOVEQ   #0,D1
;    BRA VALUENTRY
;*-*
;; <x>
EXPCONS:
    CMP.W   #1,D5
    BEQ ERROR0
    BSR.W   SD0
    CLR.W   -(A7)
.XL:MOVE.W  #16,EAREQUEST
    BSR EAEXP
    TST.L   D0
    BNE.S   .OPT
    MOVE.W  .4(PC),(A4)+
.OPT:   ADDQ.W  #4,(A7)
    CMP.W   #COM,(A3)+
    BEQ.S   .XL
    CMP.W   #46,-(A3)
    BNE.S   .NC
    ADDQ.L  #2,A3
    MOVE.W  #16,EAREQUEST
    BSR EAEXP
    TST.L   D0
    BNE.S   .OPT2
    MOVE.W  .4(PC),(A4)+
.OPT2:  BRA.S   .D
.NC:    MOVE.W  .5(PC),(A4)+
.D: CMP.W   #12,(A3)+
    BNE ERROR0
    MOVE.W  .6(PC),(A4)+
    MOVE.W  (A7),D0
    SUBQ.W  #4,D0
    MOVE.W  D0,(A4)+
    MOVE.L  #120+10,D0      ; D0=CONS
    MOVE.B  #-1,EFUNCBYTE+120   ; _Cons=121
    MOVE.L  .4B(PC),(A4)+       ; GEN CALL
    TSTMOD
    BNE.S   .MOD
    MOVE.W  .5B(PC),NEWOP
    BSR ADDBRANCH
    BRA.S   .CC
.MOD:   SUBQ.L  #4,A4
    MOVE.W  .5B(PC),(A4)+
    BSR ADDBRANCHRELOC
    MOVE.W  D0,-2(A4)
.CC:    MOVE.W  .7(PC),(A4)+
    MOVE.W  (A7)+,D0
    ADDQ.W  #8,D0
    MOVE.W  D0,(A4)+
    BSR.W   RD0
    MOVEQ   #1,D5
    BRA EXPLOOP
.4: MOVE.L  D0,-(A7)
.5: CLR.L   -(A7)
.6: PEA 0.W
.5B:    JSR .4
.4B:    BSR.W   .4
.7: LEA 4(A7),A7
;*-*
;; "!"
EXPFLT:
    BTST    #1,CODEPREFS
    BNE     .FP
    BSET    #3,CODEPREFS+1      ; USE MATHIEEESINGBAS
    CMP.W   #0,D5
    BEQ ERROR0          ; ALWAYS AFTER (1) OR (-1)
    LEA .2(PC),A0
    TST.W   FLTFLAG
    BEQ.S   .1
    CLR.W   FLTFLAG         ; CLEAR FLOATMODUS
    CMP.W   #-1,D5
    BEQ ERROR0
    MOVE.L  (A0)+,(A4)+
    MOVE.W  (A0)+,(A4)+
    MOVE.W  #-30,(A4)+
    BRA EXPLOOP
.1: MOVE.W  #-1,FLTFLAG     ; SET FLOATMODUS
    CMP.W   #-1,D5
    BEQ.S   .3
    MOVE.L  (A0)+,(A4)+
    MOVE.W  (A0)+,(A4)+
    MOVE.W  #-36,(A4)+
.3: BRA EXPLOOP
.2: MOVE.L  -56(A4),A6
    JSR -30(A6)

.FP:
    CMP.W   #0,D5
    BEQ ERROR0          ; ALWAYS AFTER (1) OR (-1)
    TST.W   FLTFLAG
    BEQ.S   .F1
    CLR.W   FLTFLAG         ; CLEAR FLOATMODUS
    CMP.W   #-1,D5
    BEQ ERROR0
    MOVE.L  .F2(PC),(A4)+
    BRA EXPLOOP
.F1:MOVE.W  #-1,FLTFLAG     ; SET FLOATMODUS
    CMP.W   #-1,D5
    BEQ.S   .F3
    MOVE.L  .F2+4(PC),(a4)+
.F3:BRA EXPLOOP
.F2:FMOVE.L FP0,D0
    FMOVE.L D0,FP0
;*-*
;; "`"
EXPQUOTE:
    CMP.W   #1,D5
    BEQ ERROR0
    BSR.W   SD0
    LEA .1(PC),A0
    MOVE.L  (A0)+,(A4)+
    MOVE.L  (A0)+,(A4)+
    MOVE.W  (A0)+,(A4)+
    MOVE.L  A4,-(A7)
    BSR.W   EXP
    MOVE.W  .2(PC),(A4)+
    MOVE.L  (A7)+,A0
    MOVE.L  A4,D0
    SUB.L   A0,D0
    ADDQ.L  #2,D0
    MOVE.W  D0,-2(A0)
    BSR.W   RD0
    MOVEQ   #1,D5
    BRA EXPLOOP
.1: LEA .2(PC),A0
    MOVE.L  A0,D0
    BRA .1
.2: RTS
;*-*
;; SIZEOF
EXPSIZEOF:
    MOVE.W  (A3),D0
    CMP.W   #IOFF+20,D0
    BPL.S   .1
    CMP.W   #31,D0
    BNE ERROR40
    MOVE.W  #VALUE,(A3)+
    MOVE.L  (A3),A0
    MOVE.W  4(A0),2(A3)
    BEQ ERROR40
    CLR.W   (A3)
    BRA EXPVALUE
.1: CMP.W   #IOFF+23,D0
    BPL ERROR0
    ADDQ.L  #2,A3
    SUB.W   #IOFF+20,D0
    CMP.W   #1,D5
    BEQ ERROR0
    BSR.W   SD0
    MOVE.B  .3(PC),(A4)+
    MOVE.B  .2(PC,D0.W),(A4)+
    BSR.W   RD0
    MOVEQ   #1,D5
    BRA EXPLOOP
.2: DC.B    4,2,1,0
.3: MOVEQ   #0,D0
;*-*
;; IF
EXPIF:
    MOVE.L  D0,D7           ; FOR DOJOB
    CMP.W   #1,D5
    BEQ ERROR0
    BSR.W   SD0
    CLR.W   ELSECHECK
    MOVE.L  A5,-(A7)
    MOVEM.L D3-D5/A1/A2,-(A7)
    BSR.W   DOKEYWORD
    MOVEM.L (A7)+,D3-D5/A1/A2
    CMP.L   (A7)+,A5
    BNE ERROR41
    TST.W   ELSECHECK
    BEQ ERROR41
    BSR     RD0
    MOVEQ   #1,D5
    BRA EXPLOOP

ELSECHECK:    DC.W    0
;*-*

;; Inter-expression codes
EXPRCODE1:
    MOVE.L  D0,-(A7)
FEXPRCODE1:
    FMOVE.S FP0,-(A7)
EXPRCODE2:
    MOVE.L  D0,D1
    MOVE.L  (A7)+,D0
FEXPRCODE2:
    FMOVE.X FP0,FP1
    FMOVE.S (A7)+,FP0
    FSMOVE.S (A7)+,FP0
EXTL:
    EXT.W   D0
    EXT.L   D0
EXTBL:
    EXTB.L  D0
MOVEQ:
    MOVEQ   #0,D0
;*-*
;; Extend D0
EXP_EXTD0:
    CMP.W   #1,ECPU     ;020+ mode?
    BPL     .020
    MOVE.L  EXTL(PC),(A4)+
    RTS
.020:
    MOVE.W  EXTBL(PC),(A4)+
    RTS
;*-*

;; ExpSwap
EXPSWAP:
    MOVE.L  LASTVAR,-(A7)
    TST.L   LASTVAR
    BEQ     ERROR0
    BSR SD0
    BSR EXP
    MOVEQ   #1,D4
    BSR RD0
    TST.L   LASTVAR
    BEQ     ERROR0
    MOVe.L  LASTVAR,A0
    MOVE.W  .1(PC),(A4)+
    BSR GVA0D0_0
    MOVe.L  (A7)+,a0
    MOVE.W  .2(PC),(A4)+
    BSR GVA0D0_0
    BRA EXPLOOP

.1: MOVE.L  D0,2(A5)
.2: MOVE.L  D1,2(A5)
;*-*

;; CloseExp
CLOSEEXP:
;    TST.W   FLTFLAG
;    BNE.S   CLOSEFLT
    MOVE.W  EXPTYPE(PC),D0
    LEA CODE_SET20(PC),A0
    CMP.W   #7,d0
    BPL     .0
    MOVE.W  (A0,D0.W*2),(A4)+
    RTS
.0: CMP.W   #13,D1
    BPL     .1
    MOVEQ   #7,D1
    MOVE.W  (A0,D1.W*2),(A4)+
    ADDQ.L  #1,D0
    MOVE.W  (A0,D0.W*2),(A4)+
    BSR EXP_EXTD0
    RTS
.1: MOVE.W  (A0,D1.W*2),(A4)+
    RTS
;*-*
;; CloseFlt
CLOSEFLT:
    CMP.W   #-1,D5          ; NO MOVE
;    BEQ.S   CLFLTB
;    CMP.L   #EXPCMP,A1      ; NO AND/OR
;    BMI.S   CLFLTB
    MOVE.L  D0,-(A7)
;    BSR MAKEFLTOPER
    TST.W   D0
    BNE.S   .2          ; SEE IF SPCMP
    MOVE.W  D3,(A4)+
    BSR     EXP_EXTD0
.2: MOVE.L  (A7)+,D0
    RTS
;*-*
;; Restore
RD0:
    CMP.W   #-1,D5
    BEQ.S   .1
    BTST    #1,CODEPREFS
    BEQ     .0
    TST.W   FLTFLAG
    BNE     .2
.0: MOVE.L  EXPRCODE2(PC),(A4)+
    BSR CLOSEEXP
.1: RTS
.2: MOVE.L  FEXPRCODE2(PC),(A4)+
    CMP.W   #2,EFPU
    BPL     .3
    MOVE.L  FEXPRCODE2+4(PC),(A4)+
    BSR CLOSEEXP
    RTS
.3: MOVE.L  FEXPRCODE2+8(PC),(A4)+
    BSR CLOSEEXP
    RTS
;*-*
;; Store
SD0:
    CMP.W   #-1,D5
    BEQ.S   .1
    BTST    #1,CODEPREFS
    BEQ .0
    TST.W   FLTFLAG
    BNE .2
.0: MOVE.W  EXPRCODE1(PC),(A4)+
.1: RTS
.2: MOVE.L  FEXPRCODE1(PC),(A4)+
    RTS
;*-*

;; "["
EXPIMMLIST:           ; D3-D5/A1/A3-A5
    ADDQ.L  #4,A3           ; SKIP ]OFFSET
    CMP.W   #-1,D5
    BNE ERROR0
    CMP.W   #30,(A3)
    BEQ .2
    MOVE.L  A5,A0           ; A0=BACKUP
    CLR.W   (A5)+
    MOVEQ   #0,D7           ; D7=COUNT
.1: MOVE.W  (A3),D1
    CMP.W   #8,D1           ; *** read list from a3
    BEQ .VALM
    CMP.W   #VALUE,D1
    BEQ .VAL
    CMP.W   #IOFF+50,D1     ; SIZEOF
    BEQ .VAL
    CMP.W   #STR,D1
    BEQ .STRI
.VALMB: MOVEM.L D7/A0,-(A7)
    BSR.W   EXP             ; *** gen exp code
    MOVE.L  A4,CURACODE     ;
    JSR CHECK3              ; CHECKA4
    MOVEM.L (A7)+,D7/A0
    MOVE.W  EXPRCODE1(PC),(A4)+
    MOVE.W  #2,(A5)+        ; 1=VAL, 2=EXP, 3=STR, 0=END
.R: ADDQ.L  #1,D7

    CHESTB  A5,D1,10,ERROR46

    CMP.W   #COM,(A3)+
    BEQ.S   .1
    CMP.W   #30,-2(A3)
    BNE ERROR34
    CLR.W   (A5)+
    LEA .8(PC),A2
    MOVE.L  (A2)+,(A4)+
    MOVE.L  (A2)+,(A4)+
    MOVE.L  (A2)+,(A4)+
    MOVE.L  A4,A2           ; A2 -->BRANCH
    MOVE.L  A5,D6           ; D6=NEWBUF ON STACK!
    MOVE.L  A0,A5

    MOVE.L  D6,A6           ; FREE BUF
    MOVE.L  #$00040000,(A6)
    CMP.W   #19,(A3)        ; FREE: _D6_,D0-D2,_A6_
    BNE .TLO
    ADDQ.L  #2,A3           ; *** read object
    MOVE.W  (A3)+,D0
    CMP.W   #IOFF+20,D0     ; LONG
    BEQ .TLO
    CMP.W   #IOFF+21,D0     ; INT
    BNE.S   .TL2
    MOVE.L  #$00020000,(A6)
    BRA .TLO
.TL2:   CMP.W   #IOFF+22,D0     ; CHAR
    BNE.S   .TL3
    MOVE.L  #$00010000,(A6)
    BRA.S   .TLO
.TL3:   CMP.W   #31,D0
    BNE ERROR33

    MOVEM.L D3/D4/A0-A1,-(A7)
    MOVEQ   #0,D3           ; D3(TEMP)=GLOBAL OFFSET
    MOVE.L  (A3)+,A0        ; A0(TEMP)=OBJ
    CMP.W   #-1,OSIZE(A0)
    BEQ ERROR40
    TST.W   (A0)
    BNE ERROR60
    MOVE.W  OID(A0),D0      ; D0(TEMP)=OBJ.ID
    LEA OMEMB+4(A0),A0      ; A0(TEMP)=MEMBERS LIST
.TLL:   MOVE.L  ONEXT(A0),A0
    MOVE.L  A0,D1
    BEQ.S   .TLLO
    MOVE.W  OSIZE(A0),D4        ; SIZE->D4
    BEQ ERROR40         ; ARRAY IN OBJ
    ;TST.L  OASCII(A0)
    ;BEQ    ERROR40         ; PRIVATE MEMBER IN OBJ
    ADD.W   D4,D3
    BTST    #0,D3
    BEQ.S   .SX
    CMP.W   #1,D4
    BEQ.S   .SX
    MOVE.W  #-1,(A6)+       ; -1 = EVEN
    ADDQ.W  #1,D3
.SX:    SUB.W   D4,D3
    CMP.W   OOFF(A0),D3
    BNE ERROR60
    ADD.W   D4,D3
    MOVE.W  D4,(A6)+
    BRA.S   .TLL
.TLLO:  BTST    #0,D3
    BEQ.S   .S3
    MOVE.W  #-1,(A6)+
;   ADDQ.W  #1,D3
.S3:    CLR.W   (A6)+
    MOVEM.L (A7)+,D3/D4/A0-A1
.TLO:   MOVE.L  D6,A6

    MOVE.L  A4,CURACODE     ;
    JSR CHECK3          ; CHECK
    ADDQ.L  #2,A0
.L1:    MOVE.W  (A0)+,D1        ; D1=STACK-INTERIM
    BEQ .3
    CMP.W   #1,D1           ; *** gen static list code
    BNE.S   .4
    MOVE.L  (A0)+,D0
    MOVE.W  #-1,(A0)+       ; NO STACK OFFSET NEEDED
    BRA.S   .SI
.4: CMP.W   #3,D1
    BEQ.S   .SC
    MOVEQ   #0,D0
.SI:    MOVE.W  (A6)+,D2
    BEQ.S   .REP
    BMI.S   .EVEN
    TST.W   -2(A0)
    BEQ.S   .SB
    CMP.W   #2,D2
    BEQ.S   .INT
    BMI.S   .CHAR
    BSR.S   .SETO
    MOVE.L  D0,(A4)+
    BRA.S   .L1
.SC:    MOVEQ   #3,D0
    ADDQ.L  #2,A0
    CLR.W   (A0)+
    BRA.S   .SI
.SB:    CMP.W   #4,D2
    BNE ERROR31
    MOVE.W  #-2,-2(A0)
    MOVE.W  -4(A0),D0
    MOVE.L  A0,-(A7)
    BSR ADDBRANCHRELOC
    MOVE.L  (A7)+,A0
    BRA.S   .L1
.EVEN:  MOVE.B  #0,(A4)+
    BRA.S   .SI
.REP:   MOVE.L  D6,A6
    BRA.S   .SI
.INT:   BSR.S   .SETO
    CHKW    D0,D2,ERROR31
    MOVE.W  D0,(A4)+
    BRA .L1
.CHAR:  BSR.S   .SETO
    CHKB    D0,D2,ERROR31
    MOVE.B  D0,(A4)+
    BRA .L1
.SETO:  CMP.W   #-1,-2(A0)
    BEQ.S   .SO
    MOVE.L  A4,D1
    SUB.L   A2,D1
    LSL.L   #3,D1
    ADD.W   D2,D1
    MOVE.W  D1,-2(A0)
.SO:    RTS
.3: MOVE.L  A4,CURACODE     ;
    JSR CHECK3          ; CHECK 
    MOVE.L  A4,D0
    BTST    #0,D0
    BEQ.S   .S2
    MOVE.B  #0,(A4)+
.S2:    MOVE.L  A4,D0
    SUB.L   A2,D0           ; CALC BRANCH
    ADDQ.L  #4,D0
    MOVE.W  D0,-4(A2)

    MOVEQ   #0,D0           ; D0=COUNT
    SUBQ.L  #2,A0
.L2:    MOVE.W  -(A0),D1        ; D1=ST.INT.
    BEQ.S   .5
    CMP.W   #-1,D1          ; SET VALUES=-1 FOR L2
    BNE.S   .6
    SUBQ.L  #6,A0
    BRA.S   .L2
.6: CMP.W   #-2,D1
    BNE.S   .6B
    SUBQ.L  #4,A0
    BRA.S   .L2
.6B:    MOVE.L  D1,D0           ; *** gen stack retrieval
    LSR.W   #3,D0
    EXT.L   D0
    AND.W   #7,D1
    SUBQ.W  #1,D1
    LSL.W   #2,D1
    CMP.W   #12,D1
    BNE.S   .S4
    SUBQ.L  #4,D1
    BRA.S   .S5
.S4:    MOVE.W  .STR(PC),(A4)+      ; was: .STR(PC,D1.W)
.S5:    MOVE.W  .7(PC,D1.W),(A4)+
    MOVE.W  D0,(A4)+
    MOVE.L  A4,CURACODE     ;
    JSR CHECK3          ; CHECK
    BRA.S   .L2

.5: MOVE.W  D7,-2(A2)
    MOVEQ   #1,D5
    BRA EXPLOOP
.7: MOVE.B  D1,4(A0)
    MOVE.W  D1,4(A0)
    MOVE.L  (A7)+,4(A0)
.STR:   MOVE.L  (A7)+,D1
.8: LEA .9(PC),A0
    MOVE.L  A0,D0
    BRA .5
    DC.W    0
.9:
.VALM:  CMP.W   #VALUE,2(A3)
    BNE.W   .VALMB
.VAL:   MOVEM.L D3/D4/A0,-(A7)
    BSR ASM_GRABVALUE
    MOVEM.L (A7)+,D3/D4/A0
    MOVE.W  (A3),D2
    CMP.W   #30,D2
    BEQ.S   .V1
    CMP.W   #COM,D2
    BNE ERROR0          ; WHATELSE? INTERIM=TRASHED
.V1:    MOVE.W  #1,(A5)+
    MOVE.L  D1,(A5)+
    MOVE.W  #1,(A5)+
    BRA .R
.2: ADDQ.L  #2,A3
    LEA .EL(PC),A0
    MOVE.L  (A0)+,(A4)+
    MOVE.L  (A0)+,(A4)+
    MOVE.W  (A0)+,(A4)+
    MOVEQ   #1,D5
    BRA EXPLOOP
.EL:    MOVE.W  #0,D0
    LEA .EL+4(PC),A0
    MOVE.L  A0,D0

.STRI:  MOVE.W  #3,(A5)+
    BSR NEWLABEL
    MOVE.W  D0,(A5)+
    MOVE.W  #3,(A5)+
    GETM    A6          ; A6=NODE
    MOVE.L  STRINGLINK(PC),(A6)
    MOVE.L  A6,STRINGLINK
    ADDQ.L  #4,A6
    MOVE.W  D0,(A6)+
    ADDQ.L  #4,A3
    MOVE.W  (A3)+,D0
    MOVE.L  A3,(A6)+
    CLR.L   (A6)+
    LSL.W   #1,D0
    ADD.W   D0,A3
    DONEM   A6
    BRA .R
;*-*

;; +-*/
EXPOPERATOR:
    CMP.W   #17,D0
    BPL .1
    CMP.W   #0,D5
    BEQ ERROR0
    SUBQ.W  #6,D0
    CMP.W   #3,D0
    SPl     D1
    AND.w   #2,D1
    ADD.W   D1,D0
    MOVE.W  D0,EXPTYPE
    CMP.W   #-1,D5
    BEQ     .0
    MOVEQ   #0,D5
    BRA EXPLOOP
.0: CMP.W   -2(A3),D0
    BNE ERROR0
    MOVEQ   #0,D5
    BRA EXPLOOP
.1: CMP.W   #IOFF+31,D0
    BPL EXPBACK
    CMP.W   #IOFF+29,D0
    BMI .2
    CMP.W   #0,D5
    BEQ ERROR0
    MOVEQ   #3,D0
    CMP.W   #IOFF+30,-2(A3)
    SEQ D1
    aNDI.L  #1,D1
    ADD.W   D1,D0
    move.w  D0,EXPTYPE
    MOVEQ   #0,D5
    BRA EXPLOOP
.2: CMP.W   #49,D0
    BLT EXPBACK
    CMP.W   #51,D0
    BGT EXPBACK
    MOVE.W  #13,D2
    CMP.W   #50,D0
    SEQ D1
    ANd.L   #1,d1
    add.w   d1,d2
    move.w  d2,EXPTYPE
    moveq   #0,d5
    bra EXPLOOP
;*-*
;; Value
EXPVALUE:             ; ENTRY
    TST.W   FLTFLAG
    BNE ERROR87

    CMP.W   #1,D5
    BEQ ERROR0
    MOVEQ   #1,D5
    MOVE.W  EXPTYPE(PC),D0
    LEA CODE_SET00(PC),A0
    CMP.W   #5,D0
    BPL     .0
    MOVE.W  (A0,D0.W*8),(A4)+
    MOVe.L  (A3)+,(A4)+
    BRA EXPLOOP
.0: CMP.W   #7,D0
    BPL     .1
    MOVE.W  (A0,D0.W*8),(A4)+
    ADDQ.L  #2,A3
    MOVE.W  (A3)+,(A4)+
    BRA EXPLOOP
.1: CMP.W   #13,D0
    BPL     .2
    MOVEQ   #7,D1
    MOVE.W  (A0,D1.W*8),(A4)+
    MOVE.L  (A3)+,(A4)+
    ADDQ.L  #1,D0
    MOVE.W  (A0,D1.W*8),(A4)+
    BSR EXP_EXTD0
    BRA EXPLOOP
.2: MOVE.W  .C0(PC),(A4)+
    MOVE.L  (A3)+,(A4)+
    LEA CODE_SET20(PC),A0
    MOVE.W  (A0,D0.W*2),(A4)+
    BRA EXPLOOP
.C0:MOVE.L  #0,D1
;*-*
;; Variables
EXPVAR:
    MOVE.L  (A3)+,A0
    CMP.W   #-1,D5
    BEQ     .2
.1:
    CMP.W   #1,D5
    BEQ ERROR0
    BRA     .3
.4:
    MOVEQ   #1,D5
    MOVE.W  EXPTYPE(PC),D0
    LEA CODE_SET10(PC),A1

    CMP.W   #7,D0
    BPL     .0
    CMP.W   #5,D0
    BPL     .5
    MOVE.W  (A1,D0.W*4),(A4)+

    JSR GVA0D0_0
    BRA EXPLOOP
.0:
    CMP.W   #13,D0
    BPL     .5
    MOVEQ   #7,D1
    MOVE.W  (A0,D1.W*4),(A4)+
    MOVE.L  (A3)+,A1
    JSR GVA1D0_0
    ADDQ.L  #1,D0
    MOVE.W  (A0,D0.W*4),(A4)+
    BSR EXP_EXTD0
    BRA EXPLOOP
.2:
    CMP.W   #4,(a3)
    BNE     .1      

    MOVE.L  A0,-(A7)
    BSR     EXP
    MOVE.L  (A7)+,A1
    MOVE.W  .C0(PC),(A4)+
    JSR GVA1D2_9
    MOVEQ   #1,D5
    BRA EXPLOOP
.3: CMP.W   #17,(A3)
    BEQ EXPOWNFUNC
    CMP.W   #33,(A3)
    BEQ EXPVARC
    CMP.W   #34,(A3)
    BEQ EXPVARC
    CMP.W   #35,(A3)
    BEQ EXPVARC
    CMP.W   #41,(A3)
    BEQ EXPVARC
    CMP.W   #29,(A3)
    BEQ EXPVARC
    BRA .4

.5: MOVE.W  .C1(PC),(A4)+
    JSR GVA0D2_9
    LEA CODE_SET20(PC),A0
    MOVE.W  (A0,D0.W*2),(A4)+
    MOVEQ   #1,D5
    bRA EXPLOOP

.C0:MOVE.L  D0,2(A5)
.C1:MOVE.L  2(A5),D1
LASTVAR:
    DC.L    0
;*-*
;; pointer typing...
EXPVARC:
    TST.B   4(A0)
    BEQ ERROR22
    CMP.B   #LAB,4(A0)
    BEQ ERROR6
    CMP.W   #42,2(A3)
    BEQ.S   .2
    MOVEQ   #1,D0
    SUBQ.L  #6,A3
    BSR EADDRESSMODI

.0: CMP.W   #-1,D5
    BEQ.S   .1
    BSR CLOSEEXP
.1: MOVEQ   #1,D5
    BRA EXPLOOP
.2: CMP.W   #35,D0
    BNE EXPVARC
    TST.B   4(A0)
    BEQ ERROR22
    ADDQ.L  #2,A3
    MOVE.L  A0,METHODIDENT      ; DO METHOD CALL HERE!
    BSR SD0
    CLR.L   METHODSPEC
    BSR     EXPCALLMETHOD
    BSR RD0
    MOVEQ   #1,D5
    BRA EXPLOOP

METHODIDENT:    DC.L    0
METHODSPEC: DC.L    0
METHODFREEZ:    DC.L    0   ; FROZEN CALL WITH THIS OBJECT
;*-*
;; CodeSets
; each includes:
; -. normal mc68k
; -. normal fp88x
; -. single prec. fp88x
; -. single prec. fp0x0

;; immediates
CODE_SET00:
    MOVE.L  #0,D0       ; 8
    NOP
    ADD.L   #0,D0       ; 8
    NOP
    SUB.L   #0,D0       ; 8
    NOP
    ORI.L   #0,D0       ; 8
    NOP
    ANDI.L  #0,D0       ; 8
    NOP
    MULS.W  #0,D0       ; 8 (4+2+2)
    NOP
    NOP
    DIVS.W  #0,D0       ; 8
    NOP
    NOP
    CMP.L   #0,D0       ; 8
    NOP
    SEQ     D0          ; 8
    NOP
    NOP
    NOP
    SLT     D0
    NOP
    NOP
    NOP
    SGT     D0
    NOP
    NOP
    NOP
    SLE     D0
    NOP
    NOP
    NOP
    SGE     D0
    NOP
    NOP
    NOP
    SNE     D0
    NOP
    NOP
    NOP
    LSL.L   D1,D0
    NOP
    NOp
    NOP
    LSR.L   D1,D0
    NOP
    NOp
    NOP
CODE_SET01:
    FMOVE.L #0,FP0      ; 8
    FADD.L  #0,FP0
    FSUB.L  #0,FP0
    DC.L    -1,-1
    DC.L    -1,-1
    FMUL.L  #0,FP0
    FDIV.L  #0,FP0
    FCMP.L  #0,FP0
    FSEQ    D0
    NOP
    NOP
    FSLT    D0
    NOP
    NOP
    FSGT    D0
    NOP
    NOP
    FSLE    D0
    NOP
    NOP
    FSGE    D0
    NOP
    NOP
    FSNE    D0
    NOP
    NOP
    DC.L    -1,-1
    DC.L    -1,-1
CODE_SET02:
    FMOVE.S #0,FP0      ; 8
    FADD.S  #0,FP0
    FSUB.S  #0,FP0
    DC.L    -1,-1
    DC.L    -1,-1
    FMUL.S  #0,FP0
    FDIV.S  #0,FP0
    FCMP.S  #0,FP0
    FSEQ    D0
    NOP
    NOP
    FSLT    D0
    NOP
    NOP
    FSGT    D0
    NOP
    NOP
    FSLE    D0
    NOP
    NOP
    FSGE    D0
    NOP
    NOP
    FSNE    D0
    NOP
    NOP
    DC.L    -1,-1
    DC.L    -1,-1
CODE_SET03:
    FSMOVE.S #0,FP0      ; 8
    FSADD.S #0,FP0
    FSSUB.S #0,FP0
    DC.L    -1,-1
    DC.L    -1,-1
    FSMUL.S #0,FP0
    FSDIV.S #0,FP0
    FCMP.S  #0,FP0
    FSEQ    D0
    NOP
    NOP
    FSLT    D0
    NOP
    NOP
    FSGT    D0
    NOP
    NOP
    FSLE    D0
    NOP
    NOP
    FSGE    D0
    NOP
    NOP
    FSNE    D0
    NOP
    NOP
    DC.L    -1,-1
    DC.L    -1,-1
;*-*
;; variables
CODE_SET10:
    MOVE.L  2(A5),D0    ; 4
    ADD.L   2(A5),D0    ; 4
    SUB.L   2(A5),D0    ; 4
    OR.L    2(A5),D0    ; 4
    AND.L   2(A5),D0    ; 4
    MULS.W  2(A5),D0    ; 4
    DIVS.W  2(A5),D0    ; 4
    CMP.L   2(A5),D0    ; 4
    SEQ     D0          ; 4 (2+2)
    NOP
    SLT     D0
    NOP
    SGT     D0
    NOP
    SLE     D0
    NOP
    SGE     D0
    NOP
    SNE     D0
    NOP
    LSL.L   D1,D0
    NOP
    LSR.L   D1,D0
    NOP
CODE_SET11:
    FMOVE.L 2(A5),FP0   ; 6+2
    NOP
    FADD.L  2(A5),FP0   ; 8
    NOP
    FSUB.L  2(A5),FP0
    NOP
    DC.L    -1,-1
    DC.L    -1,-1
    FMUL.L  2(A5),FP0
    NOP
    FDIV.L  2(A5),FP0
    NOP
    FCMP.L  2(A5),FP0
    NOP
    FSEQ     D0
    NOP
    NOP
    FSLT     D0
    NOP
    NOP
    FSGT     D0
    NOP
    NOP
    FSLE     D0
    NOP
    NOP
    FSGE     D0
    NOP
    NOP
    FSNE     D0
    NOP
    NOP
    DC.L    -1,-1
    DC.L    -1,-1
CODE_SET12:
    FMOVE.S 2(A5),FP0   ; 6+2
    NOP
    FADD.S  2(A5),FP0   ; 8
    NOP
    FSUB.S  2(A5),FP0
    NOP
    DC.L    -1,-1
    DC.L    -1,-1
    FMUL.S  2(A5),FP0
    NOP
    FDIV.S  2(A5),FP0
    NOP
    FCMP.S  2(A5),FP0
    NOP
    FSEQ    D0
    NOP
    NOP
    FSLT    D0
    NOP
    NOP
    FSGT    D0
    NOP
    NOP
    FSLE    D0
    NOP
    NOP
    FSGE    D0
    NOP
    NOP
    FSNE    D0
    NOP
    NOP
    DC.L    -1,-1
    DC.L    -1,-1
CODE_SET13:
    FSMOVE.S 2(A5),FP0   ; 6+2
    NOP
    FSADD.S 2(A5),FP0   ; 8
    NOP
    FSSUB.S 2(A5),FP0
    NOP
    DC.L    -1,-1
    DC.L    -1,-1
    FSMUL.S 2(A5),FP0
    NOP
    FSDIV.S 2(A5),FP0
    NOP
    FCMP.S  2(A5),FP0
    NOP
    FSEQ    D0
    NOP
    NOP
    FSLT    D0
    NOP
    NOP
    FSGT    D0
    NOP
    NOP
    FSLE    D0
    NOP
    NOP
    FSGE    D0
    NOP
    NOP
    FSNE    D0
    NOP
    NOP
    DC.L    -1,-1
    DC.L    -1,-1
;*-*
CODE_SET20:
    MOVE.L  D1,D0       ; 2
    ADD.L   D1,D0       ; 2
    SUB.L   D1,D0       ; 2...
    OR.L    D1,D0
    AND.L   D1,D0
    MULS.W  D1,D0
    DIVS.W  D1,D0
    CMP.L   D1,D0
    SEQ     D0
    SLT     D0
    SGT     D0
    SLE     D0
    SGE     D0
    SNE     D0
    LSL.L   D1,D0
    LSR.L   D1,D0
;*-*

;; FindMethod
; WANTS   OBJ=A6,NAME=D0
; TRASHES A0
; RETURNS D1=METHOD | NIL

FINDMETHOD:
    LEA OMETHOD(A6),A6
    MOVE.L  A6,D1
.XL:MOVE.L  D1,A6
    MOVE.L  (A6),D1
    BEQ .ERR
    MOVE.L  D1,A6
    MOVE.L  M_NAME(A6),A0
    MOVE.L  D0,A6
.CL:    CMPM.B  (A0)+,(A6)+
    BNE.S   .XL
    TST.B   -1(A0)
    BNE.S   .CL
.ERR:   RTS
;*-*
;; CallMethod
EXPCALLMETHOD:            ; IDENTENTRY IN METHODIDENT,
    CMP.W   #42,(A3)+       ; A3 JUST PAST "."
    BNE ERROR40
    MOVE.L  METHODSPEC(PC),D0
    BNE.S   .NS1
    MOVE.L  METHODIDENT(PC),A6
    MOVE.L  (A6),D0
.NS1:   CMP.L   #5,D0
    BMI ERROR40
    MOVE.L  D0,A6           ; A6=OBJECT
    MOVE.L  (A3)+,D0        ; D0=NAME
    BSR FINDMETHOD
    TST.L   D1
    BEQ .ERR
    MOVE.L  METHODSPEC(PC),-(A7)
    BEQ.S   .MS4
    MOVE.W  .SA0(PC),(A4)+
.MS4:   MOVE.L  METHODFREEZ(PC),-(A7)
    MOVE.L  D1,-(A7)        ; STACK: S.L, F.L, M.L, I.L, COUNT.W
    CMP.W   #17,(A3)+
    BNE ERROR23
    MOVE.L  METHODIDENT,-(A7)
    CLR.W   -(A7)
    CMP.W   #18,(A3)
    BEQ.S   .2
.3: MOVE.W  #16,EAREQUEST
    BSR EAEXP
    TST.L   D0
    BNE.S   .OPT
    MOVE.W  .4(PC),(A4)+
.OPT:   ADDQ.W  #4,(A7)
    CMP.W   #COM,(A3)+
    BEQ.S   .3
    SUBQ.L  #2,A3
.2: CMP.W   #18,(A3)+       ; OUT
    BNE ERROR23

    MOVEQ   #0,D0
    MOVE.W  (A7)+,D0        ; D0=ARGCOUNT
    MOVE.L  4(A7),A6
    MOVE.L  M_PROC(A6),A6
    BSR DODEFARGS

    MOVE.L  (A7)+,A0        ; A0.L=IDENT
    MOVE.L  (A7)+,A6        ; A6.L=METHOD
    MOVE.L  (A7)+,METHODFREEZ
    MOVE.L  (A7)+,METHODSPEC
    BNE.W   .MS2
    MOVE.W  .7(PC),(A4)+
    BSR GVA0D1_0
    MOVE.L  (A0),A0         ; A0=OBJ
    BRA.S   .MS3
.MS2:   MOVE.L  METHODSPEC(PC),A0
    MOVE.W  .GA0(PC),(A4)+
    MOVE.W  D0,(A4)+
    ADDQ.W  #4,D0
.MS3:
    TST.L   METHODFREEZ
    BNE.S   .FR

    TST.W   ODELOFF(A0)
    BMI ERROR71
    BHI .U
    MOVE.W  .6(PC),(A4)+
.UB:    BRA.S   .NFR

.FR:    MOVEM.L A0/A6,-(A7)     ; FREEZ!
    MOVE.L  METHODFREEZ(PC),A6
    GETM    A0          ; ADD TO SUPER-ACCESS
    MOVE.L  OACC(A6),(A0)
    MOVE.L  A0,OACC(A6)
    ADDQ.L  #4,A0
    MOVE.W  .GOBJ(PC),(A4)+     ; GEN: PUT SUPER-DEL IN a1
    MOVE.L  A4,(A0)+
    CLR.W   (A4)+
    CLR.W   (A0)+
    DONEM   A0
    MOVEM.L (A7)+,A0/A6

.NFR:   MOVE.W  .6A(PC),(A4)+
    MOVE.W  M_OFF(A6),(A4)+
    MOVE.W  .6B(PC),(A4)+
    TST.W   D0
    BEQ.S   .NOA
    MOVE.W  .5(PC),(A4)+
    MOVE.W  D0,(A4)+
.NOA:   RTS
.4: MOVE.L  D0,-(A7)
.5: LEA -8(A7),A7
.7: MOVEA.L 2(A5),A0
.6: MOVE.L  (A0),A1
.6X:    MOVE.L  2(A0),A1
.6A:    MOVE.L  4(A1),A1
.6B:    JSR (A1)
.U: MOVE.W  .6X(PC),(A4)+
    MOVE.W  ODELOFF(A0),(A4)+
    BRA.W   .UB
.SA0:   MOVE.L  A0,-(A7)
.GA0:   MOVE.L  2(A7),A0
.ERR:   CMP.W   #17,(A3)
    BEQ ERROR54
    BRA ERROR42
.GOBJ:  MOVE.L  4(A4),A1
;*-*

;; Procedure
EXPOWNFUNC:           ; A0=IDENTENTRY
    BTST    #4,5(A0)
    BNE ERROR4
    CMP.B   #LAB,4(A0)
    BNE EXPVARPROCCALL
    MOVE.L  6(A0),A6        ; A6=PROC!!
    MOVE.L  A6,D6
    BEQ ERROR25
    CMP.W   #17,(A3)+
    BNE ERROR23
    BSR SD0
    MOVEQ   #0,D0           ; #OF ARGS
    CMP.W   #18,(A3)
    BEQ.S   .2
.3: MOVEM.L D0/A0/A6,-(A7)
    MOVE.W  #16,EAREQUEST
    BSR EAEXP
    TST.L   D0
    BNE.S   .OPT
    MOVE.W  .4(PC),(A4)+
.OPT:   MOVEM.L (A7)+,D0/A0/A6
    ADDQ.L  #4,D0
    CMP.W   #COM,(A3)+
    BEQ.S   .3
    SUBQ.L  #2,A3
.2: CMP.W   #18,(A3)+       ; OUT
    BNE ERROR23
    BSR DODEFARGS
    MOVEM.L D0/A0,-(A7)

    MOVE.W  10(A0),D0
    BMI.S   .MINM
    MOVE.L  .1(PC),(A4)+
    MOVE.W  .1L(PC),NEWOP
    BSR ADDBRANCH
    BRA.S   .D
.MINM:  MOVE.W  .1L(PC),(A4)+       ; ADR OF LABEL OF OTHER MODULE
    MOVEM.L A1/A6,-(A7)
    GETM    A6
    MOVE.L  VARHEAVY(A0),A1     ; A1=PTR TO PROCCLASS
    MOVE.L  PC_ACC(A1),D0
    MOVE.L  A6,PC_ACC(A1)
    MOVE.L  D0,(A6)+
    MOVE.L  A4,(A6)+
    DONEM   A6
    MOVEM.L (A7)+,A1/A6
    CLR.L   (A4)+
.D:
    MOVEM.L (A7)+,D0/A0
    MOVE.L  6(A0),A6
    TST.W   (A6)
    BEQ.S   .NOA
    BTST    #0,2(A6)
    BNE.S   .NOA
    MOVE.W  .5(PC),(A4)+
    MOVE.W  D0,(A4)+
.NOA:   BSR RD0
    MOVEQ   #1,D5
    BRA EXPLOOP
.1: BSR .1
.1L:    JSR .1
.4: MOVE.L  D0,-(A7)
.5: LEA -8(A7),A7

DOREGARGS:
    MOVE.L  D0,D6
    LSR.L   #2,D6
    CMP.W   (A6),D6
    BNE     ERROR23
    move.l  6(a6),a6
    subq.l  #1,d6

    move.w  (a6)+,d0
    lsl.w   #1,d0
    add.w   d0,a6
    lsr.w   #1,d0
.L1:
    subq.l  #2,a6
    cmp.b   #5,(a6)
    seq     d0
    and.l   #$40,d0
    ror.l   #8,d0
    move.b  1(a6),d0
    and.w   #7,d0
    lsl.w   #1,d0
    rol.l   #8,d0
    move.w  .C1(PC),(A4)
    or.w    d0,(a4)+

    dbf     d6,.L1

    rts
.C1:MOVe.L  (A7)+,D0



DODEFARGS:
    BTST    #5,2(A6)
    BNE     DOREGARGS
    MOVE.L  D0,D6           ; DEAL WITH DEFARGS
    LSR.L   #2,D6
    CMP.W   (A6),D6
    BEQ.S   .R
    BPL ERROR23
    MOVE.W  (A6),D0
    EXT.L   D0
    LSL.L   #2,D0
    SUB.W   (A6),D6
    NEG.W   D6          ; D6=NARG WE STILL NEED
    MOVE.L  6(A6),A6
    MOVE.L  A6,D7
    BEQ ERROR23
    MOVE.W  (A6)+,D7
    BEQ ERROR23
    SUB.W   D6,D7
    BMI ERROR23
    LSL.W   #2,D7
    EXT.L   D7
    ADD.L   D7,A6
    SUBQ.L  #1,D6
.DAL:   MOVE.L  (A6)+,D7
    SWAP    D7
    TST.W   D7
    BEQ.S   .DP0
    CMP.W   #-1,D7
    BEQ.S   .DP1
.LP:    SWAP    D7
    MOVE.W  .P2(PC),(A4)+
    MOVE.L  D7,(A4)+
    BRA.S   .N
.DP0:   TST.L   D7
    BMI.S   .LP
    BRA.S   .DP
.DP1:   TST.L   D7
    BPL.S   .LP
.DP:    SWAP    D7
    MOVE.W  .P1(PC),(A4)+
    MOVE.W  D7,(A4)+
.N: DBRA    D6,.DAL
.R: RTS
.P1:    PEA $0.W
.P2:    PEA $0
;*-*
;; Var proc
EXPVARPROCCALL:           ; A0=IDENTENTRY
    TST.B   4(A0)
    BEQ ERROR22
    CMP.W   #17,(A3)+
    BNE ERROR23
    BSR SD0
    MOVE.L  A0,-(A7)
    CLR.W   -(A7)
    CMP.W   #18,(A3)
    BEQ.S   .2
.3: MOVE.W  #16,EAREQUEST
    BSR EAEXP
    TST.L   D0
    BNE.S   .OPT
    MOVE.W  .4(PC),(A4)+
.OPT:
    ADDQ.W  #4,(A7)
    CMP.W   #COM,(A3)+
    BEQ.S   .3
    SUBQ.L  #2,A3
.2: CMP.W   #18,(A3)+       ; OUT
    BNE ERROR23
    MOVE.W  (A7)+,D0
    MOVE.L  (A7)+,A0
    MOVE.W  .7(PC),(A4)+
    BSR GVA0D1_0
    MOVE.W  .6(PC),(A4)+
    TST.W   D0
    BEQ.S   .NOA
    MOVE.W  .5(PC),(A4)+
    MOVE.W  D0,(A4)+
.NOA:   BSR RD0
    MOVEQ   #1,D5
    BSET    #5,WARNINGS+3
    BRA EXPLOOP
.4: MOVE.L  D0,-(A7)
.5: LEA -8(A7),A7
.7: MOVEA.L 2(A5),A0
.6: JSR (A0)

;*-*
;; Library
NUMRECSAVE = 8

EXPLIBCALL:
    CMP.W   #1,D5
    BEQ ERROR0
    LEA EXPLCHECK(PC),A0    ; HERE WE CHECK LOOPED CALLS!
    TST.W   (A0)
    BEQ.S   .1          ; NO NEED TO
    MOVEQ   #NUMRECSAVE-1,D0
.2: MOVE.L  (A0)+,-(A7)     ; SHOVE NUMRECSAVE LONGS UP STACK
    DBRA    D0,.2
.1: SUB.L   A6,A6           ; NEED OF REGS
    MOVE.W  (A3)+,EXPLBASE
    MOVE.W  (A3)+,EXPLOFF
    MOVE.L  (A3)+,A2
    MOVE.W  (A3)+,D2
    MOVE.W  (A3)+,EXPLEXCEPT
    MOVE.W  D2,EXPLMASK
    MOVEQ   #0,D0           ; D0=# OF REGS
    LEA EXPLREGS(PC),A0
    MOVE.W  D5,-(A7)        ; SAVE D5
EXPLLOOP:
    MOVEQ   #0,D1
    MOVE.B  (A2)+,D1        ; D1=REG#
    CMP.W   #16,D1
    BPL.S   EXPLNEXT
    ADDQ.L  #1,D0
    MOVEQ   #13,D6
    MOVEQ   #0,D7           ; D7=POS
    CMP.W   #12,D1
    BMI .1          ; A4/A5 CALL
    ADDQ.L  #1,A6
.1: MOVEQ   #13,D5
    SUB.W   D6,D5
    CMP.W   D1,D5
    BEQ.S   .X
    BTST    D5,D2
    BEQ.S   .2
    ADDQ.L  #1,D7
.2: DBRA    D6,.1
.X: MOVE.B  D7,(A0)+
    BRA.S   EXPLLOOP
      EXPLNEXT:
    MOVE.W  (A7)+,D5        ; RESTORE D5
    MOVE.B  #-1,(A0)+
    MOVE.W  D0,EXPLNUM
    CMP.W   #17,(A3)+       ; CHECK INCOMING (
    BNE ERROR23
    BSR SD0
    TST.W   EXPLNUM
        BEQ.S   EXPLNOARGS
        BSR.S   EXPLIBARG
        BRA.S   EXPLFIN
EXPLNOARGS:
    BSR.W   EXPLIBJSR
      EXPLFIN:

    MOVE.W  EXPLEXCEPT(PC),D7   ; USE D7/A6
    BMI.S   .NR
    MULU    #10,D7
    MOVE.L  #LIBRAISE,A6
    LEA 0(A6,D7.W),A6
    BSR EXPRAISE
.NR:
    BSR RD0
    ADDQ.L  #2,A3           ; EAT )
    MOVEQ   #1,D5
    LEA EXPLCHECK(PC),A0    ; PUT LOOPED CALLS BACK AGAIN
    TST.W   (A0)
    BEQ.S   .3          ; NO NEED TO
    LEA NUMRECSAVE*4(A0),A0
    MOVEQ   #NUMRECSAVE-1,D0
.2: MOVE.L  (A7)+,-(A0)
    DBRA    D0,.2
.3: BRA EXPLOOP

EXPLIBARG:            ; IN CASE OF Func(arg,...)
    LSAVER  EXPLMASK,D1
    MOVE.W  D1,EXPLRSM
    CMP.W   #0,A6
    BEQ.S   .1
    MOVE.L  SAVE45(PC),(A4)+    ; NO OPTI IF A4/A5 USED
    BRA.S   .2
.1: 
    TST.W   D1          ; NO OPTI IF D3-D7 USED
    BNE.S   .2

    MOVE.L  A3,D1           ; CHECK IF OPTI POSSIBLE
.XL:MOVE.W  (A3)+,D0
    CMP.W   #8,D0
    BNE.S   .T1
    CMP.W   #VALUE,(A3)+
    BNE.S   .XB
    ADDQ.L  #4,A3
    BRA.S   .C
.T1:    CMP.W   #VALUE,D0
    BNE.S   .T2
    ADDQ.L  #4,A3
    BRA.S   .C
.T2:    CMP.W   #IDENT,D0
    BNE.S   .T3
    ADDQ.L  #4,A3
    BRA.S   .C
.T3:    CMP.W   #STR,D0
    BNE.S   .XB
    ADDQ.L  #2,A3
    MOVE.W  (A3)+,D7
    LSL.W   #1,D7
    ADD.W   D7,A3
    BTST    #2,CODEPREFS+3
    BNE.S   .XB
.C: CMP.W   #COM,(A3)+
    BEQ.S   .XL
    CMP.W   #18,-2(A3)
    BNE.S   .XB
    MOVEQ   #-1,D0
    BRA.S   .O
.XB: MOVEQ   #0,D0
.O: MOVE.L  D1,A3

; OPTFLAG NOW IN D0, CHOOSE BETWEEN TWO:

    TST.L   D0
    BNE OPTIARGS

.2: MOVE.W  EXPLNUM(PC),D0
    MOVE.W  D0,D1
    MULU    #-4,D1
    MOVE.W  EXPGETSTACK(PC),(A4)+
    MOVE.W  D1,(A4)+
    SUBQ.W  #1,D0
    LEA EXPLREGS(PC),A0
EXPLARGLOOP:
    MOVEM.L D0/A0/A6,-(A7)
    MOVE.W  EXPLCHECK(PC),-(A7)
    MOVE.W  #-1,EXPLCHECK
    BSR EXP
    MOVE.W  (A7)+,EXPLCHECK     ; RESTORE PREVIOUS VALUE
    MOVEM.L (A7)+,D0/A0/A6
    MOVE.B  (A0)+,D1
    EXT.W   D1
    LSL.W   #2,D1
    MOVE.W  EXPTOSTACK(PC),(A4)+
    MOVE.W  D1,(A4)+    
    TST.W   D0
    BEQ.S   EXPLARGOUT
    CMP.W   #COM,(A3)+
    BNE ERROR5
    DBRA    D0,EXPLARGLOOP
EXPLARGOUT:
    MOVE.W  EXPGETBASE(PC),(A4)+
    MOVE.W  EXPLBASE(PC),D0
    BSR DOOFF
    MOVE.W  D0,(A4)+
    MOVE.W  EXPMOVEM(PC),(A4)+
    MOVE.W  EXPLMASK(PC),(A4)+
    MOVE.W  EXPJSR(PC),(A4)+
    MOVE.W  EXPLOFF(PC),(A4)+
    CMP.W   #0,A6
    BEQ.S   .1
    MOVE.L  RETRIEVE45(PC),(A4)+
.1: MOVE.W  EXPLRSM(PC),D0
    RESTR   D0
    RTS

OPTIARGS:
    MOVE.W  EXPLNUM(PC),D0
    SUBQ.W  #1,D0
    MOVE.L  -10(A3),A0
.1: MOVE.B  (A0)+,D1
    MOVEM.L D0/A0/A6,-(A7)
    MOVE.W  EXPLCHECK(PC),-(A7)
    MOVE.W  #-1,EXPLCHECK
    EXT.W   D1
    MOVE.W  D1,EAREQUEST
    BSR EAEXP
    TST.L   D0
    BEQ.S   .3
    MOVE.W  (A7)+,EXPLCHECK
    MOVEM.L (A7)+,D0/A0/A6
    TST.W   D0
    BEQ.S   .2
    CMP.W   #COM,(A3)+
    BNE ERROR5
    DBRA    D0,.1
.2: MOVE.W  EXPGETBASE(PC),(A4)+
    MOVE.W  EXPLBASE(PC),D0
    BSR DOOFF
    MOVE.W  D0,(A4)+
    MOVE.W  EXPJSR(PC),(A4)+
    MOVE.W  EXPLOFF(PC),(A4)+
    RTS
.3: INTERN  100

EXPLIBJSR:            ; IN CASE OF Func()
    MOVE.W  EXPGETBASE(PC),(A4)+
    MOVE.W  EXPLBASE(PC),D0
    BSR DOOFF
    MOVE.W  D0,(A4)+
    MOVE.W  EXPJSR(PC),(A4)+
    MOVE.W  EXPLOFF(PC),(A4)+
    RTS

EXPJSR:       JSR -30(A6)
EXPGETBASE:   MOVE.L  -40(A4),A6
EXPGETSTACK:  LEA 4(A7),A7
EXPMOVEM:     MOVEM.L (A7)+,D0/A0
EXPTOSTACK:   MOVE.L  D0,4(A7)
SAVE45:       MOVEM.L A4/A5,-(A7)
RETRIEVE45:   MOVEM.L (A7)+,A4/A5

EXPLCHECK:    DC.W    0   ; NOTE: THESE DATA=NUMRECSAVE LONGS!
EXPLBASE:     DC.W    0
EXPLOFF:      DC.W    0
EXPLMASK:     DC.W    0
EXPLNUM:      DC.W    0
EXPLEXCEPT:   DC.W    0
EXPLOPTI:     DC.W    0
EXPLRSM:      DC.W    0
EXPLREGS:     DC.L    0,0,0,0
;*-*
;; EFunction
EXPEFUNC:
    CMP.W   #1,D5
    BEQ ERROR0
    MOVE.L  (A3)+,A0        ; A0=FUNCTABENTRY

    MOVE.L  A0,D0
    SUB.L   #EFUNCTAB,D0
    DIVU    #EFUNCENTRYSIZE,D0
    LSL.W   #1,D0
    LEA     EFUNCFLAGSTAB,A6
    MOVE.W  0(A6,D0),D2
    BTST    #8,D2
    BNE     EXPINLINE

    MOVEQ   #0,D0           ; D0=COUNT ARGS
    MOVEQ   #-100,D2
    TST.L   8(A0)           ; WRITEF/PRINTF?
    BPL.S   .3
    MOVE.L  8(A0),D2
    SUBQ.L  #1,D2
    ASL.L   #2,D2
.3: CMP.W   #17,(A3)+
    BNE ERROR23
    BSR SD0
    SUBA.L  A6,A6           ; NO BACKPATCH SOFAR

.1: CMP.W   #18,(A3)
    BEQ.S   .2
    ADDQ.L  #4,D2
    BMI.S   .4
    TST.L   D2
    BNE.S   .1C
    MOVE.L  A4,A6           ; A6=BACKPATCH
    MOVE.L  .LEA(PC),(A4)+
.1C:    MOVEM.L A0/D0/D2/A6,-(A7)
    BSR.W   EXP
    MOVEM.L (A7)+,A0/D0/D2/A6
    TST.L   D2
    BNE.S   .1B
    MOVE.W  WRITEFARG+4(PC),(A4)+
    BRA.S   .6
.1B:    MOVE.W  WRITEFARG(PC),(A4)+
    MOVE.W  D2,(A4)+
    BRA.S   .6
.4: MOVEM.L A0/D0/D2/A6,-(A7)
    MOVE.W  #16,EAREQUEST
    BSR.W   EAEXP
    TST.L   D0
    BNE.S   .NUS
    MOVE.W  UPSTACK(PC),(A4)+
.NUS:   MOVEM.L (A7)+,A0/D0/D2/A6
.6: ADDQ.L  #1,D0
    CMP.W   #COM,(A3)+
    BEQ.S   .1
    SUBQ.L  #2,A3

.2: TST.L   8(A0)
    BMI.S   .5
    CMP.L   8(A0),D0
    BEQ .DAB
    BSR EFUNDA
.DAB:   BRA.S   .5B
.5: CMP.L   #-4,D2          ; ATLEAST 1-3 ARGS
    BMI ERROR23
    MOVE.L  A6,D1
    BEQ.S   .5C
    ADDQ.L  #4,D2
    NEG.L   D2
    MOVE.W  D2,2(A6)
.5C:    MOVE.L  D0,D2
    ADD.L   8(A0),D2
    ADDQ.L  #1,D0
    LSL.L   #2,D2
    MOVE.W  .P(PC),(A4)+
    MOVE.W  D2,(A4)+
.5B:    MOVE.L  EFUNCJUMP(PC),(A4)+
    MOVE.L  D0,D2
    MOVE.L  A0,D0
    SUB.L   #EFUNCTAB,D0
    DIVU.W  #EFUNCENTRYSIZE,D0
    LSL.W   #1,D0

    MOVE.L  A0,-(A7)
    LEA     EFUNCFLAGSTAB,A0
    MOVE.W  0(A0,D0),D7
    BTST    #0,D7
    BEQ.S   .T0
    BSET    #3,CODEPREFS+1
.T0:BTST    #1,D7
    BEQ.S   .T1
    BSET    #4,CODEPREFS+1
.T1:BTST    #2,D7
    BEQ     .T2
    CMP.W   #37,OSVERSION
    BLT     ERROR78
.T2:BTST    #3,D7
    BEQ     .T3
    CMP.W   #39,OSVERSION
    BLT     ERROR78
.T3:BTST    #4,D7
    BEQ     .T4
    CMP.W   #1,ECPU
    BLT     ERROR53
.T4:BTST    #5,D7
    BEQ     .T5
    CMP.W   #2,ECPU
    BLT     ERROR53
.T5:BTST    #6,D7
    BEQ     .T6
    CMP.W   #1,EFPU
    BLT     ERROR53
.T6:BTST    #7,D7
    BEQ     .T7
    CMP.W   #2,EFPU
    BLT     ERROR53
.T7:BTST    #8,D7
    BEQ     .T8
    BTST    #7,CODEPREFS
    BEQ     ERROR0
.T8:BTST    #10,D7
    BEQ     .T9
    BSET    #3,CODEPREFS
.T9:BTST    #11,D7
    BEQ     .TA
    BTST    #6,CODEPREFS
    BEQ     ERROR85
.TA:
    MOVE.L  (A7)+,A0

    LSR.W   #1,D0
    MOVE.L  D0,D7           ; INDEX
    ADD.W   #10,D0

    TSTMOD
    BNE.S   .MOD
    MOVE.W  EFUNCJUMPL(PC),NEWOP
    BSR ADDBRANCH
    BRA.S   .CC
.MOD:   SUBQ.L  #4,A4
    MOVE.W  EFUNCJUMPL(PC),(A4)+
    BSR ADDBRANCHRELOC
    MOVE.W  D0,-2(A4)
.CC:
    MULU    #10,D7
    MOVE.L  #EFUNCRAISE,A6
    LEA 0(A6,D7.W),A6
    TST.W   (A6)
    BEQ.S   .NR
    BSR EXPRAISE
.NR:
    TST.W   D2
    BEQ.S   .E
    MOVE.W  EXPGETSTACK(PC),(A4)+
    LSL.L   #2,D2
    MOVE.W  D2,(A4)+
.E: BSR RD0
    CMP.W   #18,(A3)+       ; EAT )
    BNE ERROR23
    MOVEQ   #1,D5
    BRA EXPLOOP
.LEA:   LEA 4(A7),A7
.P: PEA 0.W

EFUNDA: ADDQ.L  #1,D0
    CMP.L   8(A0),D0
    BNE ERROR23
    MOVE.L  12(A0),D6
    BEQ ERROR23
    CMP.L   #-1,D6
    BNE.S   .SK
    MOVEQ   #0,D6
.SK:    MOVE.L  D6,D1           ;
    AND.L   #$FFFFFF00,D1       ; not really needed?
    BNE ERROR23         ;
    EXT.W   D6
    MOVE.W  .P(PC),(A4)+
    MOVE.W  D6,(A4)+
    RTS
.P: PEA 0.W

UPSTACK:
    MOVE.L  D0,-(A7)
EFUNCJUMP:
    BSR EFUNCJUMP
EFUNCJUMPL:
    JSR EFUNCJUMP
WRITEFARG:
    MOVE.L  D0,4(A7)
    MOVE.L  D0,(A7)


EXPRAISE:             ; GETS PTR TO RAISESTRUCT IN A6,
    MOVEM.L D0/D1/A0,-(A7)      ; TRHASHES ONLY A6
    TST.L   6(A6)
    BEQ.S   .Z
    MOVE.W  .1(PC),(A4)+
    MOVE.L  6(A6),(A4)+
    BRA.S   .Z2
.Z: MOVE.W  .1B(PC),(A4)+
.Z2:    MOVE.W  (A6),D0
    SUB.W   #11,D0
    LSL.W   #1,D0
    MOVE.W  .2(PC,D0.W),(A4)+
    MOVE.L  A4,A0
    MOVE.W  .3(PC),(A4)+
    MOVE.L  2(A6),(A4)+
    MOVE.L  .4(PC),(A4)+
    MOVEQ   #92,D0          ; CAUSE
    MOVE.B  #-1,EFUNCBYTE+82
    MOVEM.L D0/A0,-(A7)


    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:

    MOVEM.L (A7)+,D0/A0
    MOVE.L  A4,D0
    SUB.L   A0,D0
    MOVE.B  D0,-1(A0)
    MOVEM.L (A7)+,D0/D1/A0
    RTS
.1: CMP.L   #1,D0
.1B:    TST.L   D0
.2: BNE.S   .1
    BLE.S   .1
    BGE.S   .1
    BLT.S   .1
    BGT.S   .1
    BEQ.S   .1
.3: MOVE.L  #1,-(A7)
.4: BSR.W   .3
.5: JSR .3

;*-*
;; EXPINLINE
EXPINLINE:
    tst.l   d5
    bgt     ERROR0
    bmi     .n_d
    BSR     SD0
.n_d:
    cmp.w   #17,(a3)+
    bne     ERROR0
    MOVE.L  D0,-(A7)
    LSL.W   #1,D0
    LEA     INLINETAB,A0
    MOVE.L  0(A0,D0),A0
    JSR     (A0)

    tst.l   d5
    bmi     .exit
    bsr     RD0
.exit:
    MOVe.L  (A7)+,D0
    MOVE.L  A0,-(A7)
    LEA     EFUNCFLAGSTAB,A0
    MOVE.W  0(A0,D0),D7
    BTST    #0,D7
    BEQ.S   .T0
    BSET    #3,CODEPREFS+1
.T0:BTST    #1,D7
    BEQ.S   .T1
    BSET    #4,CODEPREFS+1
.T1:BTST    #2,D7
    BEQ     .T2
    CMP.W   #37,OSVERSION
    BLT     ERROR78
.T2:BTST    #3,D7
    BEQ     .T3
    CMP.W   #39,OSVERSION
    BLT     ERROR78
.T3:BTST    #4,D7
    BEQ     .T4
    CMP.W   #1,ECPU
    BLT     ERROR53
.T4:BTST    #5,D7
    BEQ     .T5
    CMP.W   #2,ECPU
    BLT     ERROR53
.T5:BTST    #6,D7
    BEQ     .T6
    CMP.W   #1,EFPU
    BLT     ERROR53
.T6:BTST    #7,D7
    BEQ     .T7
    CMP.W   #2,EFPU
    BLT     ERROR53
.T7:BTST    #10,D7
    BEQ     .T8
    BSET    #3,CODEPREFS
.T8:BTST    #11,D7
    BEQ     .T9
    BTST    #6,CODEPREFS
    BEQ     ERROR85
.T9:
    MOVE.L  (A7)+,A0

    moveq   #1,d5
    cmp.w   #18,(a3)+
    bne     ERROR74 
    bra     EXPLOOP

;*-*
;; LibFunc
EXPLIBFUNC:
    CMP.W   #1,D5
    BEQ     ERROR0

    MOVE.L  (A3)+,-(A7)

    CMP.W   #17,(A3)+
    BNE     ERROR0
    MOVEQ   #0,D6
    MOVE.W  D6,.TARGS
    tst.l   d5
    bmi     .X1
    BSR SD0
.X1:
    MOVE.W  #0,-(A7)
    CMP.W   #18,(A3)
    BEQ .NARGS
.ARGLOOP:
    ADDQ.W  #1,(A7)
    MOVE.W  #16,EAREQUEST
    BSR     EAEXP
    TST.L   D0
    BNE.S   .OPT
    MOVE.W  .4(PC),(A4)+
.OPT:
    CMP.W   #COM,(A3)+
    BEQ .ARGLOOP
    SUBQ.L  #2,A3
.NARGS:
    MOVE.W  (A7)+,.TARGS
    MOVEM.L  (A7)+,A6
    MOVEQ   #0,D6
    MOVE.W  .TARGS,D6
    CMP.W   #18,(A3)+
    BNE     ERROR74
    TST.W   LIB_ARGS(A6)
    BPL     .ARGSPLUS

    MOVEQ   #0,D2
    MOVE.L  D6,D0
    ADDQ.L  #1,D6
    MOVE.W  LIB_ARGS(A6),D2
    EXT.L   D2
    NEG.L   D2
    SUBQ.L  #1,D2

    SUB.L   D2,D0
    BMI ERROR23
    LSL.L   #2,D0

    MOVE.W  .45(PC),(A4)+
    MOVE.W  .46(PC),(A4)+
    MOVE.W  D0,(A4)+
    MOVE.L  D0,D2
    LSR.L   #3,D2
    SUBQ.L  #1,D2
    BMI .CD
.XYZ:
    MOVE.L  .47(PC),(A4)+
    MOVE.W  .47+4(PC),(A4)+
    DBF     D2,.XYZ
.CD:
    SWAP    D0
    TST.W   D0
    BNE     .LOADS
    SWAP D0
    MOVE.W  .43(PC),(A4)+
    MOVE.W  D0,(A4)+
    BRA .ARGSPLUS2
.LOADS:
    SWAP    D0
    MOVE.W  .44(PC),(A4)+
    MOVE.L  D0,(A4)+
    BRA .ARGSPLUS2
.ARGSPLUS:
    CMP.W   LIB_ARGS(A6),D6
    BNE     ERROR23
.ARGSPLUS2:
    CMP.W   #1,LIB_TYPE(a6)
    beq .INLINE

    BSR     PUTLIBBRANCH

    LSL.W   #2,D6
    TST.L   D6
    BEQ .EXIT
    MOVE.W  .LEA(PC),(A4)+
    MOVE.W  D6,(A4)+
.EXIT:
    tst.l   d5
    bmi     .X2
    BSR RD0
.X2:
    MOVEQ   #1,D5
    BRA EXPLOOP

.TARGS:
    DC.W    0
.LEA:
    LEA     4(A7),A7
.4:
    MOVE.L  D0,-(A7)
.42:
    MOVE.L  (A7)+,D0
.43:
    PEA $0.W
.44:
    PEA $0
.45:
    MOVE.L  A7,A0
.46:
    LEA 4(A7),A1
.47:
    MOVE.L  (A0),D0
    MOVE.L  -(A1),(A0)+
    MOVE.L  D0,(A1)

.INLINE:
    MOVE.W  LIB_ARGS(A6),D5
    BEQ     .INLCNT
    SUBQ.L  #1,D5
.INLMOVE:
    MOVE.W  .42(PC),(A4)
    MOVEQ   #0,D0
    MOVE.B  20(a6,d5),d0
    cmp.b   #4,d0
    SPL     D1
    AND.W   #$40,D1
    OR.W    D1,(A4)
    AND.B   #3,D0
    LSL.L   #8,D0
    LSL.L   #1,D0
    OR.W    D0,(A4)+
    DBF D5,.INLMOVE
.INLCNT:
    MOVE.L  A6,-(A7)
    MOVE.L  LIB_CODE(A6),A6
    MOVE.L  (A6)+,D0
    LSR.L   #1,D0
    SUBQ.L  #1,D0
    MOVE.L  A4,-(A7)
.INLCPY:
    MOVE.W  (A6)+,(A4)+
    DBF D0,.INLCPY
    MOVE.L  (A7)+,A6
    MOVe.L  (A7)+,d0
    move.l  a0,-(a7)
    move.l  d0,a0
    subq.l  #4,a6
    JSR FIXRELOC
    move.l  (a7)+,a0
    BRA .EXIT

;*-*

;; GetExp
; params: D0 -> final storage
EA_GETEXP:
    move.l  d0,-(a7)

    BSR.W   EXP

    move.l  (a7)+,d0
    TST.W   D0
    BEQ     .x
    move.w  .res(PC),(A4)
    OR.W    D0,(A4)+
.x:
    RTS
.res:
    MOVE.L  D0,D0
;*-*

;; <=>
; WARNING: AMAZING FEATURE AHEAD!

EXPUNIFY:
    CMP.W   #1,D5
    BNE ERROR0
    MOVEQ   #-1,D7          ; D7 = LEVEL/#OF_AX_USED
    BSR NEWLABEL
    MOVE.L  D0,D6           ; D6 = FALSELABEL
    CLR.W   NEWOP
    BSR.S   .R

    CMP.W   #1,EXPRECC
    BNE.S   .DI
    TST.W   EXPSTAT
    BNE .SR

.DI:    CMP.W   #-2,D7
    BEQ.S   .SH
    MOVE.L  .TRUE(PC),(A4)+
    MOVE.L  D6,D0
    BSR ADDLABEL
    MOVE.W  .FALSE(PC),(A4)+
    BRA EXPLOOP
.SH:    MOVE.W  .TRUE(PC),(A4)+
    BRA EXPLOOP

.SR:    MOVE.L  D6,D0
    BSR ADDLABEL
    BRA EXPLOOP

.R: MOVE.W  (A3)+,D0        ; RECURSIVE PART
    CMP.W   #VALUE,D0
    BNE.S   .1
.0: MOVE.L  (A3)+,D0
.0B:    TST.L   D7          ; VALUE
    BMI.S   .1B
    MOVE.W  .CMP2(PC),(A4)
    OR.W    D7,(A4)+
    BRA.S   .1C
.1B:    MOVE.W  .CMP(PC),(A4)+
.1C:    MOVE.L  D0,(A4)+
    MOVE.L  .BNE(PC),(A4)+
    MOVE.L  D6,D0
    BSR ADDBRANCH
    BRA .X

.1: CMP.W   #IDENT,D0
    BNE .2
    TST.L   D7          ; IDENT
    BMI.S   .2B
    MOVE.W  .M2(PC),(A4)
    OR.W    D7,(A4)+
    BRA.S   .2C
.2B:    MOVE.W  .M(PC),(A4)+
    SUBQ.L  #1,D7           ; AT TOP LEVEL: ALWAYS TRUE
.2C:    MOVE.L  (A3)+,A0
    BSR GVA0D0_9
    BRA.W   .X

.2: CMP.W   #29,D0
    BNE.S   .3
    ADDQ.L  #4,A3           ; LIST
    CLR.W   -(A7)           ; TOP STACK = NUM ELEMENTS
    TST.L   D7
    BMI.S   .3B
    MOVE.W  .GET2(PC),(A4)
    OR.W    D7,(A4)
    BRA.S   .3C
.3B:    MOVE.W  .GET(PC),(A4)
.3C:    ADDQ.L  #1,D7
    CMP.W   #4,D7
    BEQ ERROR46
    MOVE.L  D7,D0
    MOVEQ   #9,D1
    LSL.W   D1,D0
    OR.W    D0,(A4)+
    MOVE.W  .LEN(PC),(A4)
    OR.W    D7,(A4)+
    MOVE.L  A4,A6           ; A6=PATCHBACK
    MOVE.W  D0,(A4)+        ; DUM D0
    MOVE.W  #-2,(A4)+
    MOVE.L  .BNE(PC),(A4)+
    MOVE.L  D6,D0
    BSR ADDBRANCH
.XL:MOVE.L  A6,-(A7)
    BSR.W   .R
    MOVE.L  (A7)+,A6
    ADDQ.W  #1,(A7)
    CMP.W   #COM,(A3)+
    BEQ.S   .XL
    CMP.W   #30,-2(A3)
    BNE ERROR34
    MOVE.W  (A7)+,(A6)
    SUBQ.L  #1,D7
    BRA.W   .X

.3: CMP.W   #8,D0
    BNE.S   .4
    CMP.W   #VALUE,(A3)+        ; -VALUE
    BNE ERROR30
    NEG.L   (A3)
    BRA .0

.4: CMP.W   #13,D0          ; <CONS|CELL>
    BNE.S   .5
    TST.L   D7
    BMI.S   .4B
    MOVE.W  .GET2(PC),(A4)      ; GET CELL IN A0
    OR.W    D7,(A4)
    BRA.S   .4C
.4B:    MOVE.W  .GET(PC),(A4)
.4C:    ADDQ.L  #1,D7
    CMP.W   #4,D7
    BEQ ERROR46
    MOVE.L  D7,D0
    MOVEQ   #9,D1
    LSL.W   D1,D0
    OR.W    D0,(A4)+
.4L:    BSR.W   .R
    CMP.W   #COM,(A3)+
    BNE.S   .4D
    MOVE.W  .CDR(PC),(A4)

    MOVE.L  D7,D0
    MOVEQ   #9,D1
    LSL.W   D1,D0
    OR.W    D7,D0
    OR.W    D0,(A4)+

    BRA.S   .4L
.4D:    CMP.W   #46,-(A3)
    BNE.S   .4E
    ADDQ.L  #2,A3
    BSR.W   .R
    BRA.W   .4F
.4E:    ; TEST CDR=0 HERE

    MOVE.W  .NIL(PC),(A4)
    MOVE.L  D7,D0
    OR.W    D7,(A4)+
    MOVE.L  .BNE(PC),(A4)+
    MOVE.L  D6,D0
    BSR ADDBRANCH

.4F:    CMP.W   #12,(A3)+
    BNE ERROR0
    SUBQ.L  #1,D7
    BRA.S   .X

.5: CMP.W   #16,D0
    BNE.S   .6
    MOVEQ   #0,D0
    BRA.W   .0B

.6: ; OTHER TYPES
    BRA ERROR0

.X: RTS

.CMP:   CMPI.L  #1,D0
.CMP2:  CMPI.L  #1,(A0)+
.M: MOVE.L  D0,2(A5)
.M2:    MOVE.L  (A0)+,2(A5)
.BNE:   BNE .CMP
.TRUE:  MOVEQ   #-1,D0
    BRA.S   .FALSE+2
.FALSE: MOVEQ   #0,D0
.GET:   MOVE.L  D0,A0
.GET2:  MOVE.L  (A0)+,A0
.LEN:   CMPI.W  #1,-2(A0)
.CDR:   MOVE.L  (A0),A0
.NIL:   TST.L   (A0)

;*-*
;*-*
    ENDC
;; Linker
; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ;
;   The Unit Linking Subroutines.               ;
; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ;

;; Link module
MMODE:    DC.W    0       ; =D1
THISMOD:  DC.L    0

MINIMUMMODULE:
    MOVEQ   #2,D1           ; MODULE IN MAIN FROM OTHER MODULE
    BRA.S   MODULESTART
MODULEJOBENTRY:
    MOVEQ   #0,D1           ; NORMAL MODULE IN MAIN
    TSTMOD
    BEQ.S   MODULESTART
    MOVEQ   #1,D1           ; MODULE IN MODULE
MODULESTART:
    MOVE.W  D1,MMODE
    CLR.W   LOADEDVERSION
DOMODULEJOB:          ; A0=PTR JOBCODE
    MOVE.W  MMODE(PC),D1
    MOVE.W  (A0)+,D0        ; CAN TRASH ANYTHING
    BEQ.S   .1
    CMP.W   #1,D0
    BEQ ADDCONST
    CMP.W   #2,D0
    BEQ ADDOBJECT
    CMP.W   #3,D0
    BEQ ADDCODE
    CMP.W   #4,D0
    BEQ ADDPROCS
    CMP.W   #5,D0
    BEQ ADDSYSCONST
    CMP.W   #6,D0
    BEQ BINDOTHERLIB
    CMP.W   #7,D0
    BEQ ADDRELOC
    CMP.W   #8,D0
    BEQ ADDGLOBSENTRY
    CMP.W   #9,D0
    BEQ ADDMODULES
    CMP.W   #10,D0
    BEQ.S   ADDDEBUG
    CMP.W   #11,D0
    BEQ.S   ADDMACROS
    BRA ERROR36         ; SUPPOSED TO BE OTHER JOBCODES
.1: RTS
;; AddMacros
ADDMACROS:
    JSR PREPREADMACROS
    BRA DOMODULEJOB
;*-*
;; AddDebug
ADDDEBUG:
    MOVE.L  A0,A6           ; A6=DEBUGHUNK
    MOVE.L  4(A6),D0
    ADDQ.L  #2,D0
    LSL.L   #2,D0
    ADD.L   D0,A0           ; skip LINE debug
    CMP.W   #1,D1
    BEQ.S   .NL
    GETM    A2
    MOVE.L  CODELIST(PC),D0
    BNE.S   .NN
    MOVE.L  A2,CODELIST
    BRA.S   .C
.NN:    MOVE.L  CODETAIL(PC),A1
    MOVE.L  A2,(A1)
.C: MOVE.L  A2,CODETAIL
    CLR.L   (A2)+
    MOVE.W  #8,(A2)+
    MOVE.L  DEBUGLIST,(A2)
    MOVE.L  A2,DEBUGLIST
    ADDQ.L  #4,A2
    MOVE.L  A6,(A2)+
    CLR.L   (A2)+
    DONEM   A2
.NL:    CMP.L   #$3F1,(A0)
    BNE.S   .NL2
    MOVE.L  4(A0),D0
    ADDQ.L  #2,D0
    LSL.L   #2,D0
    ADD.L   D0,A0           ; skip EVAR debug
.NL2:   TST.L   (A0)+           ; BLANK TERMINATOR
    BNE ERROR36
    BRA DOMODULEJOB
;*-*
;; AddModules
ADDMODULES:
    MOVE.L  (A0)+,D0
    CMP.W   #1,D1
    BNE.S   .XL
    ADD.L   D0,A0
    BRA.W   DOMODULEJOB
.XL:MOVE.W  (A0)+,D0
    BEQ.W   .X
    MOVE.L  A0,A1           ; A1=MODNAME
    ADD.W   D0,A0
    MOVE.L  A1,A2
.C: TST.B   (A2)+
    BNE.S   .C
    MOVE.L  A2,CACHENAMEEND
    MOVE.L  A1,CACHENAMESTART
    JSR SEARCHINMODLIST
    GETM    A3
    TST.L   D0
    BNE.S   .L2
    ADDQ.W  #1,AGAIN        ; SIGNAL NEW MODULES
    MOVE.L  MODINFOLIST,(A3)    ; MI_NEXT
    MOVE.L  A3,MODINFOLIST
    ADDQ.L  #4,A3
    MOVE.W  #$100,(A3)+     ; MI_FLAGS
    SUB.L   A1,A2
    MOVE.L  A2,(A3)+        ; MI_NAMELEN
    CLR.L   (A3)+           ; MI_MOD
    CLR.L   (A3)+           ; MI_LIST
    MOVE.L  A1,(A3)+        ; MI_NAMEPTR
.L2:    MOVE.W  (A0)+,D0
    BEQ.S   .D
    MOVE.W  (A0)+,D1
    MOVE.L  A0,A1           ; A1=PROCCLASS NAME
    ADD.W   D1,A0
    MOVE.L  CODELIST(PC),D1     ; HOOKUP TAIL OF CODEREM
    BNE.S   .NN
    MOVE.L  A3,CODELIST
    BRA.S   .CC
.NN:    MOVE.L  CODETAIL(PC),A2
    MOVE.L  A3,(A2)
.CC:    MOVE.L  A3,CODETAIL
    CLR.L   (A3)+
    CMP.W   #1,D0
    BEQ.S   .CL
    MOVE.W  #5,(A3)+        ; PROC/LAB ACCESS
    MOVE.L  A1,(A3)+
    MOVE.L  A0,(A3)+
    ADDQ.L  #2,A0
    MOVE.W  (A0)+,D0
    LSL.W   #2,D0
    ADD.W   D0,A0
    BRA.S   .L2
.CL:    MOVE.W  #6,(A3)+        ; CLASS ACCESS
    MOVE.L  A1,(A3)+
    MOVE.L  A0,(A3)+
    MOVE.W  (A0)+,D0
    MULU    #6,D0
    ADD.W   D0,A0
    BRA.S   .L2
.D: DONEH   A3
    BRA.W   .XL
.X: BRA.W   DOMODULEJOB
;*-*
;; AddGlobals
ADDGLOBSENTRY:
    MOVEQ   #0,D2
    CMP.W   #SKIPMARK,(A0)
    BNE.S   .1
    ADDQ.L  #2,A0
    MOVE.L  (A0)+,D2
.1: CMP.W   #1,D1
    BNE.S   ADDGLOBS
    ADD.L   D2,A0
    TST.L   D2
    BNE.W   DOMODULEJOB
    INTERN  103
ADDGLOBS:
    MOVE.W  (A0)+,D0        ; D0=LEN
    BMI.W   DOMODULEJOB
    MOVE.L  A0,A1           ; A1=NAME
    ADD.W   D0,A0
    MOVE.L  A0,A2           ; A2=OFFSETSTAB
    MOVE.W  LOADEDVERSION(PC),D2
    SUB.W   #10,D2
.XL:TST.L   (A0)+
    BEQ.S   .OUT
    TST.W   D2
    BMI.S   .XL
    ADDQ.L  #2,A0
    BRA.S   .XL
.OUT:   TST.W   D0          ; NOW FIND OFFSET
    BNE.S   VREF
    GETM    A5          ; NOT LINKED INTO HASH TABLE!
    MOVE.L  #.NAME,(A5)+        ; ANONYMOUS VARIABLE
    MOVE.B  #GLOBV,(A5)+        ; SET GLOBAL(=2)
    MOVE.B  #5,(A5)+        ; REF+EXPORT
    CLR.L   (A5)+
    SUBQ.W  #4,NRGLOB
    MOVE.W  NRGLOB,D2
    MOVE.W  D2,(A5)+        ; SET OFFS
    EXT.L   D2
    DONEM   A5
    MOVE.L  A5,D2
    SUBQ.L  #8,D2
    SUBQ.L  #4,D2
    BRA ODONE
.NAME:  DC.B    0,0
VREF:   MOVE.L  A1,A3           ; SEARCH FOR VAR
    HASH    A3,D2,D1
    LSL.L   #2,D2
    ADD.L   #IDENTHASH,D2
    MOVE.L  D2,A3           ; A3=HASHENTRYPTR
    LEA 4(A3),A4
.SL:    MOVE.L  -(A4),A4
    MOVE.L  A4,D2
    BEQ.S   .NOTF
    MOVE.L  (A4),A5
    MOVE.L  A1,A6
.CL:    CMPM.B  (A5)+,(A6)+
    BNE.S   .SL
    TST.B   -1(A5)
    BNE.S   .CL
    MOVE.L  A4,D2           ; JAAAH, BESTAAT REEDS!
    BRA.S   ODONE
.NOTF:  GETM    A5          ; LINKED INTO HASH TABLE!
    MOVE.L  (A3),(A5)+
    MOVE.L  A5,(A3)
    MOVE.L  A1,(A5)+        ; ASCIIPTR
    MOVE.B  #GLOBV,(A5)+        ; SET GLOBAL(=2)
    MOVE.B  #5,(A5)+        ; REF+EXPORT
    CLR.L   (A5)+
    SUBQ.W  #4,NRGLOB
    MOVE.W  NRGLOB,D2
    MOVE.W  D2,(A5)+        ; SET OFFS
    MOVE.L  A5,D2
    SUBQ.L  #8,D2
    SUBQ.L  #4,D2
    DONEM   A5
    ;BRA    ODONE
ODONE:  GETM    A3          ; GOT VAR IN D2, NOW HANG IN CODEREM LIST
    MOVE.L  CODELIST(PC),D1
    BNE.S   .NN
    MOVE.L  A3,CODELIST
    BRA.S   .C
.NN:    MOVE.L  CODETAIL(PC),A4
    MOVE.L  A3,(A4)
.C: MOVE.L  A3,CODETAIL
    CLR.L   (A3)+
    MOVE.W  #4,(A3)+
    MOVE.L  A2,(A3)+
    MOVE.L  D2,(A3)+
    MOVE.W  LOADEDVERSION(PC),(A3)+
    DONEM   A3
    BRA ADDGLOBS
;*-*
;; AddCode
ADDCODE:
    MOVE.L  (A0)+,D7
    CMP.W   #1,D1
    BEQ.S   .SKIP
    GETM    A2
    MOVE.L  CODELIST(PC),D0
    BNE.S   .NN
    MOVE.L  A2,CODELIST
    BRA.S   .C
.NN:    MOVE.L  CODETAIL(PC),A1
    MOVE.L  A2,(A1)
.C: MOVE.L  A2,CODETAIL
    CLR.L   (A2)+
    MOVE.W  #2,(A2)+
    MOVE.L  A0,(A2)+
    MOVE.L  D7,(A2)+
    LSL.L   #2,D7
    ADD.L   D7,A0
    DONEM   A2
    BRA DOMODULEJOB
.SKIP:  LSL.L   #2,D7
    ADD.L   D7,A0
    BRA DOMODULEJOB
;*-*
CODELIST:     DC.L    0
CODETAIL:     DC.L    0
;; AddReloc
ADDRELOC:
    MOVE.L  (A0)+,D7
    CMP.W   #1,D1
    BEQ.S   .SKIP
    GETM    A2
    MOVE.L  CODELIST(PC),D0
    BNE.S   .NN
    MOVE.L  A2,CODELIST
    BRA.S   .C
.NN:    MOVE.L  CODETAIL(PC),A1
    MOVE.L  A2,(A1)
.C: MOVE.L  A2,CODETAIL
    CLR.L   (A2)+
    MOVE.W  #3,(A2)+
    MOVE.L  A0,(A2)+
    MOVE.L  D7,(A2)+
    CLR.L   (A2)+
    LSL.L   #2,D7
    ADD.L   D7,A0
    DONEM   A2
    BRA DOMODULEJOB
.SKIP:  LSL.L   #2,D7
    ADD.L   D7,A0
    BRA DOMODULEJOB
;*-*
;; AddSysConst
ADDSYSCONST:
    MOVE.L  (A0)+,D0
    CMP.W   #1,D1
    BEQ.S   .S1
    ADD.L   D0,MINSTACK     ; ADD USED TO STACK
.S1:    MOVE.W  (A0)+,D0
    CMP.W   OSVERSION,D0        ; HIGHEST OSVERSION
    BLE.S   .1
    MOVE.W  D0,OSVERSION
    BSET    #4,WARNINGS+3
.1: MOVE.L  (A0)+,D0
    AND.L   #%110000000000000000000,D0  ; ONLY INTERESTING BITS
    OR.L    D0,CODEPREFS
    MOVE.W  (A0)+,D0
    CMP.W   ECPU,D0         ; BEST CPU
    BLE.S   .2
    MOVE.W  D0,ECPU
    BSET    #4,WARNINGS+3
.2: MOVE.W  (A0)+,D0        ; BEST FPU
    CMP.W   EFPU,D0
    BLE.S   .3
    MOVE.W  D0,EFPU
    BSET    #4,WARNINGS+3
.3: MOVE.W  (A0)+,D0        ; OR BITSET
    MOVE.W  ASMCPU,D3
    OR.W    D3,D0
    CMP.W   D3,D0
    BEQ.S   .4
    MOVE.W  D0,ASMCPU
    BSET    #4,WARNINGS+3
.4: MOVE.W  (A0)+,D0        ; VERSION
    BNE.S   .5
    ADDQ.W  #1,D0           ; 0 is version 1
.5: MOVE.W  D0,LOADEDVERSION
    CMP.W   #CURVERSION,D0
    BHI ERROR51
    ADDQ.L  #4,A0           ; RESERVED
    JSR     PATCHER
    BRA DOMODULEJOB
;*-*
;; AddProcs
ADDPROCS:
.XL:MOVE.W  (A0)+,D0
    CMP.W   #-1,D0
    BEQ .EX
    GETM    A4
    EXT.L   D0
    MOVE.L  A0,A1
    HASH    A1,D1,D2
    LSL.L   #2,D1
    MOVE.L  #IDENTHASH,A1
    ADD.L   D1,A1
    MOVE.L  (A1),(A4)+
    MOVE.L  A4,(A1)
    MOVE.L  A4,D6           ; REMIND THIS IDENT=D6
    MOVE.L  A0,(A4)+
    MOVE.B  #LAB,(A4)+
    MOVE.B  #1,(A4)+        ; FLAGS: USED  (NEVER EXPORT!)
    ADD.L   D0,A0
    MOVE.L  (A0)+,D7        ; D7=OFFSET
    CMP.W   #1,(A0)+
    BNE.S   .LAB
    LEA 14(A4),A3           ; note: 14
    MOVE.L  A3,(A4)+        ; Next PROC
    MOVE.W  #-2,(A4)+       ; nr args
    CLR.L   (A4)+           ; EXTRA!!
    MOVE.L  PROCLIST,(A4)+
    MOVE.L  A4,PROCLIST
    MOVE.W  (A0)+,(A4)+     ; INIT PROC STRUCT
    CLR.W   (A4)+           ; FLAGS,REGVARS
    MOVE.W  (A0)+,(A4)+     ; nr loc
    CMP.W   #-1,(A0)
    BEQ     .REGSONLY
    MOVE.L  A0,(A4)+        ; DEFARGS
.REGSBACK:
    CLR.L   (A4)+           ; of_object
    MOVE.L  D6,(A4)+        ; IDENT
    CLR.L   (A4)+           ; SELF
    CLR.L   (A4)+           ; METHOD
    MOVE.W  (A0)+,D0
    LSL.W   #2,D0
    ADD.W   D0,A0
    MOVE.W  (A0)+,D0
    ADD.W   D0,A0
    BRA.S   .CODE
.REGSONLY:
    ADDQ.L  #2,A0
    MOVE.W  (A0),D0
    ADD.L   D0,D0
    BSET    #5,-4(a4)
    move.l  a0,(a4)+
    ADD.L   D0,A0
    ADDQ.L  #2,A0
    bra     .REGSBACK

.LAB:   CLR.L   (A4)+           ; LABEL
    MOVE.W  #-1,(A4)+
    CLR.L   (A4)+           ; EXTRA!!
.CODE:  CMP.W   #1,MMODE        ; CHECK IF MOD IN MOD
    BEQ.S   .1
    MOVE.L  CODETAIL(PC),A1
    MOVE.L  A4,(A1)
    MOVE.L  A4,CODETAIL
    CLR.L   (A4)+
    MOVE.W  #1,(A4)+
    MOVE.L  D6,(A4)+
    MOVE.L  D7,(A4)+
.2: DONEM   A4
    BRA .XL
.EX:    BRA DOMODULEJOB
.1: MOVE.L  THISMOD(PC),A1      ; A1=MODINFO
    MOVE.L  D6,A2           ; A2=ID
    SUBQ.W  #2,10(A2)
    MOVE.L  MI_LIST(A1),(A4)    ; PC_NEXT
    MOVE.L  A4,MI_LIST(A1)
    MOVE.L  A4,VARHEAVY(A2)
    ADDQ.L  #4,A4
    MOVE.W  #2,(A4)+        ; PC_TYPE
    MOVE.L  D6,(A4)+        ; PC_INFO
    CLR.L   (A4)+           ; PC_ACC
    BRA.S   .2
;*-*
;; FixProcCode
FIXPROCCODE:          ; RESOLVE ADDRESSES OF CODE IN MODULES
    MOVEM.L A0-A3/D0-D4/A5,-(A7)    ; EXPECTS CODE IN A4
    LEA CODELIST(PC),A0     ; A0=CODEREM
    MOVE.L  LABM+8,A2       ; A2=LABELS
.XL:MOVE.L  (A0),A0
    MOVE.L  A0,D0
    BEQ .E
    MOVE.W  4(A0),D0
    CMP.W   #2,D0
    BNE.S   .ID
    MOVE.L  6(A0),A1        ; CODE + LEN
    MOVE.L  10(A0),D1
    SUBQ.L  #1,D1
    MOVE.L  A4,D2           ; D2=COPIED CODEBASE
    MOVE.L  D2,10(A0)       ; SET LEN FIELD TO CODEBASE!

    MOVE.L  D1,D0           ;
    LSL.L   #2,D0           ;
    ADD.L   A4,D0           ; CHECK CODEBUF
    MOVE.L  D0,CURACODE     ;
    JSR CHECK3          ;
    MOVE.L  A4,CURACODE     ;

.C: MOVE.L  (A1)+,(A4)+
    DBRA    D1,.C
    BRA.S   .XL
.ID:    CMP.W   #1,D0
    BNE.S   .REL
    MOVE.L  6(A0),A3
    MOVEQ   #0,D3
    MOVE.W  10(A3),D3
    LSL.L   #2,D3
    MOVE.L  10(A0),D1       ; OFFSET
    ADD.L   D2,D1
    MOVE.L  D1,0(A2,D3.L)       ; SET LABEL
    BRA.S   .XL

.REL:   CMP.W   #3,D0
    BNE.S   .GLOB
    MOVE.L  A4,-(A7)
    MOVE.L  6(A0),A3
    MOVE.L  10(A0),D3
    SUBQ.L  #1,D3
    MOVE.L  A0,-(A7)
    MOVE.L  #EFUNCBYTE,A1
    MOVE.L  D2,D4
    SUB.L   ACODE,D4        ; D4=MOD OFFSET
.RELL:
    MOVE.L  (A3),D0
    BPL.S   .NEXT
    MOVEQ   #31,D1
    BCLR    D1,D0
    MOVE.L  D0,A4
    ADD.L   D2,A4
    MOVE.W  2(A4),D0
    BSR ADDBRANCHRELOC
    MOVE.B  #-1,-10(A1,D0)

    ADDQ.L  #4,A3
    DBRA    D3,.RELL
    BRA.S   .Q
.NEXT:
    ADDQ.L  #4,A3           ; WAS: ADD.L    D4,(A3)+
    ADD.L   D2,D0
    MOVE.L  D0,A5
    ADD.L   D4,(A5)         ; PATCH NEW CODE
    DBRA    D3,.RELL
.Q: MOVE.L  (A7)+,A0
    MOVE.L  (A7)+,A4
    BRA .XL

.GLOB:  CMP.W   #4,D0
    BNE.S   .CLSSX
    MOVE.L  10(A0),A3
    MOVE.W  10(A3),D0       ; D0.W=A4OFFSET
    MOVE.L  6(A0),A3
    CMP.W   #10,14(A0)
    BPL.S   .NG
.GLL:   MOVE.L  (A3)+,D1
    BEQ .XL
    MOVE.L  D1,A1
    ADD.L   D2,A1   
    MOVE.W  D0,(A1)
    BRA .GLL
.NG:    ADDQ.W  #4,D0           ; VERSION WITH EXTRA OPERSIZE
.NGLL:  MOVE.L  (A3)+,D1
    BEQ .XL
    MOVE.L  D1,A1
    ADD.L   D2,A1
    MOVE.W  D0,D3
    SUB.W   (A3)+,D3
    MOVE.W  D3,(A1)
    BRA .NGLL

.CLSSX: CMP.W   #7,D0           ; CLASSX ACC RESOLVE HERE
    BNE.W   .CLASS
    MOVE.L  10(A0),D0
    ADD.L   D2,D0           ; D0=ABS DELCODE
    MOVE.L  6(A0),A1        ; A1=OBJH
    MOVE.L  D0,ODCODE(A1)
    MOVE.L  14(A0),A3       ; A3=ACCVALS
    LEA OACC(A1),A1     ; A1=ACCLIST
    MOVE.L  A0,-(A7)
.CLL:   MOVE.W  (A3)+,D0
    CMP.W   #-1,D0
    BEQ.S   .CLLX
    GETM    A0
    MOVE.L  (A1),(A0)
    MOVE.L  A0,(A1)
    ADDQ.L  #4,A0
    MOVE.L  (A3)+,D1
    ADD.L   D2,D1
    MOVE.L  D1,(A0)+
    MOVE.W  D0,(A0)+
    DONEM   A0
    BRA.S   .CLL
.CLLX:  MOVE.L  (A7)+,A0
    BRA .XL

.DEBUG: CMP.W   #8,D0
    BNE.S   .PROC
    MOVE.L  D2,D1
    SUB.L   ACODE,D1
    MOVE.L  D1,14(A0)
    BRA .XL

.PROC:  CMP.W   #5,D0
    ;BNE.S  .           ; PROC ACC RESOLVE HERE
    BRA .XL

.CLASS: CMP.W   #6,D0           ; CLASS ACC RESOLVE HERE
    BNE.S   .DEBUG
    MOVE.L  6(A0),D1
    JSR FINDOBJ
    TST.L   D0
    BEQ.S   .NOTF
    MOVE.L  D0,A1           ; A1=OBJ
    LEA OACC(A1),A1
    MOVE.L  10(A0),A3       ; A3=ACCL
    MOVE.W  (A3)+,D0
    SUBQ.L  #1,D0
.CAL:   GETM    A6
    MOVE.L  (A1),(A6)
    MOVE.L  A6,(A1)
    ADDQ.L  #4,A6
    MOVE.L  (A3)+,D1
    ADD.L   D2,D1
    MOVE.L  D1,(A6)+
    MOVE.W  (A3)+,(A6)+
    DONEM   A6
    DBRA    D0,.CAL
    BRA .XL
.NOTF:  MOVE.L  D1,ERROROBJ
    BRA ERROR57

.E: MOVEM.L (A7)+,A0-A3/D0-D4/A5
    RTS
;*-*
;; AddConst
ADDCONST:
    CMP.W   #6,LOADEDVERSION
    BMI.S   .XL
    MOVE.L  (A0)+,D0
    CMP.W   #2,D1
    BNE.S   .XL
    ADD.L   D0,A0
    BRA DOMODULEJOB
.XL:MOVE.W  (A0)+,D0        ; D0=LEN ASC
    BEQ.S   .1
    GETM    A5
    MOVE.L  (A0)+,D1
    MOVE.L  A0,A1
    HASH    A1,D2,D3
    LSL.L   #2,D2
    ADD.L   #CONSTHASH,D2
    MOVE.L  D2,A1
    MOVE.L  (A1),(A5)
    MOVE.L  A5,(A1)
    ADDQ.L  #4,A5
    MOVE.L  A0,(A5)+
    MOVE.L  D1,(A5)+
    CLR.W   (A5)+
    EXT.L   D0
    ADD.L   D0,A0
    DONEM   A5
    BRA.S   .XL
.1: BRA DOMODULEJOB
;*-*
;; AddObject
ADDOBJECT:
    CMP.W   #6,LOADEDVERSION
    BMI.S   .1
    MOVE.L  (A0)+,D0
    ;CMP.W  #2,D1           ; ever?
    ;BNE.S  .1
    ;ADD.L  D0,A0
    ;BRA    DOMODULEJOB
.1: ADDQ.W  #1,OBJCOUNT
    MOVE.W  OBJCOUNT(PC),D5
    GETM    A5
    MOVE.W  (A0)+,D0        ; D0=LEN ASC
    BEQ ERROR39             ; module crashed
    MOVE.W  (A0)+,D1        ;
    CMP.W   #-1,D1          ;
    BNE ERROR39             ; must be object header
    MOVE.L  OLIST,(A5)+     ;
    MOVE.L  A5,OLIST        ;
    ADDQ.L  #2,A0           ; OFF MAKES NO SENSE FOR HEAD
    CLR.W   (A5)+           ; DELEGATESIZE=0
    MOVE.W  #%1000000000,(A5)+  ; SET IMPORT
    MOVE.L  A5,A4           ; A4=SIZE.W OBJ
    CLR.W   (A5)+           ; STILL 0
    MOVE.W  D5,(A5)+
    MOVE.L  A0,(A5)+

    cmp.l   #"exec",(A0)
    bne     .0
    CMP.L   #"base",4(a0)
    bne     .0
    cmp.b   #0,8(a0)
    bne     .0
    move.l  OLIST,OBJ_EXECBASE
.0:
    MOVE.L  A5,A6           ; A6=_TAIL_ MEMBER LIST
    CLR.L   (A5)+           ; MEMBERLIST=0
    CLR.L   (A5)+           ; METHODLIST=0
    CLR.L   (A5)+           ; SUPERCLASS=0
    CLR.L   (A5)+           ; DELEGATECODE=NIL
    CLR.L   (A5)+           ; ACCESLIST
    MOVE.L  #-1,(A5)+       ; DELOFFSET+DESTRUCTOFF
    EXT.L   D0
    ADD.L   D0,A0
    DONEM   A5
ADDOBJECTLOOP:
    MOVE.W  (A0)+,D0        ; D0=LEN ASC
    BEQ.S   .1              ; last one
    GETM    A5              ;
    MOVE.W  (A0)+,D1        ;
    CLR.L   (A5)+           ; ONEXT
    MOVE.L  A5,(A6)         ;
    LEA ONEXT(A5),A6        ;
    CLR.L   (A6)            ;
    MOVE.W  (A0)+,(A5)+     ; OOFF
    CLR.W   (A5)+           ; OFLAGS
    MOVE.W  D1,(A5)+        ; OSIZE
    MOVE.W  D5,(A5)+        ; OID
    TST.W   D0
    BMI.S   .PRIV
    MOVE.L  A0,(A5)+        ; OASCII
    EXT.L   D0
    ADD.L   D0,A0
    BRA.S   .3
.PRIV:
    CLR.L   (A5)+           ; OASCII
.3: CMP.W   #6,LOADEDVERSION
    BMI.S   .4
    MOVEQ   #0,D0
    MOVE.W  (A0)+,D0
    BEQ.S   .4
    BPL.S   .5
    MOVE.W  (A0)+,D0
    ; HERE WE CAN SEARCH FOR AN OBJECT THAT EQUALS A0
    MOVE.L  A0,(A5)+
    ADD.W   D0,A0
    MOVE.L  OBJTYPELIST(PC),D0
    MOVE.L  A5,OBJTYPELIST
.5: MOVE.L  D0,(A5)+
    BSET    #1,OFLAGS+4(A6)
.4: DONEM   A5
    BRA.S   ADDOBJECTLOOP
.1: MOVE.W  (A0)+,D0
    BTST    #0,D0
    BEQ.S   .2
    ADDQ.W  #1,D0
.2: MOVE.W  D0,(A4)         ; SET OBJSIZE

    CMP.W   #7,LOADEDVERSION
    BMI.W   .NC
    MOVE.W  (A0)+,D0
    BEQ.W   .NC
    MOVE.L  OLIST,A1        ; A1=OBJECTHEAD
    MOVE.W  D0,ODEL(A1)
    MOVE.L  (A0)+,D0        ; DELCODE
    CMP.W   #1,MMODE
    BEQ.S   .NDC

    GETM    A3
    MOVE.L  CODELIST(PC),D1     ; HOOKUP TAIL OF CODEREM
    BNE.S   .NN
    MOVE.L  A3,CODELIST
    BRA.S   .CC
.NN:    MOVE.L  CODETAIL(PC),A2
    MOVE.L  A3,(A2)
.CC:    MOVE.L  A3,CODETAIL
    MOVE.L  A3,D7           ; D7=CODEREM_STRUCT
    CLR.L   (A3)+
    MOVE.W  #7,(A3)+
    MOVE.L  A1,(A3)+
    MOVE.L  D0,(A3)+
    CLR.L   (A3)+
    DONEM   A3
    BRA.S   .CONT

.NDC:
    MOVEM.L A6/A5,-(A7)
    MOVE.L  THISMOD(PC),A6      ; A6=MODINFO
    CLR.L   ODCODE(A1)
    GETM    A5
    MOVE.L  MI_LIST(A6),(A5)    ; PC_NEXT
    MOVE.L  A5,MI_LIST(A6)
    ADDQ.L  #4,A5
    MOVE.W  #1,(A5)+        ; PC_TYPE
    MOVE.L  A1,(A5)+        ; PC_INFO
    CLR.L   (A5)+           ; PC_ACC
    DONEM   A5
    MOVEM.L (A7)+,A6/A5

.CONT:  ADD.W   (A0)+,A0        ; SKIP SUPER
    MOVE.L  (A0)+,ODELOFF(A1)   ; DELOFF+DESTR
    LEA OMETHOD(A1),A3      ; A3=METHODLIST
.ML:    MOVE.W  (A0)+,D0
    CMP.W   #-1,D0
    BEQ.S   .MX
    GETM    A2          ; A2=MEM
    MOVE.L  A2,A4           ; A4=METHOD
    MOVE.L  (A3),(A2)       ; M_NEXT
    MOVE.L  A4,(A3)
    ADDQ.L  #8,A2
    MOVE.W  D0,(A2)+        ; M_TYPE+M_FLAGS
    MOVE.W  (A0)+,(A2)+     ; M_OFF
    MOVE.W  (A0)+,D0
    MOVE.L  A0,(A2)+        ; M_NAME
    ADD.W   D0,A0
    MOVE.L  A2,4(A4)        ; M_PROC
    MOVE.W  (A0)+,(A2)+     ; PROC_NARGS
    MOVE.L  #$2000000,(A2)+     ; flags=method
    CLR.L   (A2)+
    MOVE.W  (A0)+,D0
    BEQ.S   .NDA
    MOVE.L  A0,-4(A2)       ; PROC_DEFARGS
    SUBQ.L  #2,-4(A2)
    LSL.W   #2,D0
    ADD.W   D0,A0
.NDA:   MOVE.L  A1,(A2)+        ; PROC_OFOBJECT
    CLR.L   (A2)+
    CLR.L   (A2)+
    MOVE.L  A4,(A2)+        ; PROC_METHOD
    DONEM   A2
    BRA.S   .ML
.MX:
    CMP.W   #1,MMODE
    BEQ.S   .AS
    MOVE.L  D7,A2
    MOVE.L  A0,14(A2)
.AS:
.AL:    CMP.W   #-1,(A0)+
    BEQ.S   .AX
    ADDQ.L  #4,A0
    BRA.S   .AL
.AX:
.NC:    BRA DOMODULEJOB
;*-*
OBJTYPELIST:  DC.L    0

;; FixObjTypes
FIXOBJTYPES:
    LEA OBJTYPELIST(PC),A6
.XL:MOVE.L  (A6),D0
    BEQ.S   .X
    MOVE.L  D0,A6
    MOVE.L  -4(A6),D1
    JSR FINDOBJ
    TST.L   D0
    BEQ.S   .ER
.R: MOVE.L  D0,-4(A6)
    BRA.S   .XL
.X: RTS
.ER:    MOVEQ   #4,D0
    BRA.S   .R
    
;   MOVE.L  -4(A6),ERROROBJ
;   BRA ERROR62
;*-*
;; BindOtherLib
BINDOTHERLIB:
    CMP.W   #2,D1           ; JUST DONE IF LIBINFOS IN SECONDARY
    BNE.S   .1
    RTS
.1: TST.B   (A0)+           ; SKIP LIBNAME FOR NOW
    BNE.S   .1
    MOVE.L  A0,A1
    HASH    A1,D0,D1
    LSL.L   #2,D0
    ADD.L   #IDENTHASH,D0
    MOVE.L  D0,A1

    MOVE.L  A1,A4
    ADDQ.L  #4,A4
.SL:    MOVE.L  -(A4),D0
    BEQ.S   .SD
    MOVE.L  D0,A4
    MOVE.L  (A4),A5
    MOVE.L  A0,A6
.SC:    CMPM.B  (A5)+,(A6)+
    BNE.S   .SL
    TST.B   -1(A5)
    BNE.S   .SC
    CMP.B   #GLOBV,4(A4)
    BNE.S   .SL
    MOVE.W  10(A4),D7
    BRA.W   BLABLABLA
    
.SD:    GETM    A5          ; ADD BASE AS VAR
    MOVE.L  (A1),(A5)+
    MOVE.L  A5,(A1)
    MOVE.L  A0,(A5)+        ; SET ASCIIPTR
    MOVE.B  #GLOBV,(A5)+        ; SET GLOBAL(=2)
    MOVE.B  #4,(A5)+        ; UNREF+SYSTEMVAR+EXPORT
    CLR.L   (A5)+
    SUBQ.W  #4,NRGLOB
    MOVE.W  NRGLOB,(A5)+        ; SET OFFS
    DONEM   A5
BLURP:
    LEA -12(A5),A5
    TSTMOD
    BEQ.S   .3          ; REMEMBER OFFSET
    GETM    A1
    MOVE.L  OFFSLIST(PC),(A1)+
    MOVE.L  A5,(A1)+
    DONEM   A1
    SUBQ.L  #8,A1
    MOVE.L  A1,OFFSLIST
.3: GINFO   A0,A1,A5
    MOVE.W  NRGLOB,D7       ; BASE OF LIB

BLABLABLA:
.2: TST.B   (A0)+
    BNE.S   .2
    MOVE.L  A0,A5
    MOVE.L  A0,-(A7)
    BSR.W   ADDLIBS2
    MOVE.L  (A7)+,A0
    RTS
OFFSLIST: DC.L    0

DOOFF:                ; GETS OFF IN D0, PRESERVES D0
    TSTMOD
    BEQ.S   .1
    CMP.W   #GLOBOFF+8,D0
    BPL.S   .1
    MOVEM.L A0/A1/D1,-(A7)
    LEA OFFSLIST(PC),A0
.XL:MOVE.L  (A0),A0
    MOVE.L  A0,D1
    BEQ.S   .3
    MOVE.L  4(A0),A1
    CMP.W   10(A1),D0
    BNE.S   .XL
    GENGI   A1,D1
    MOVEM.L (A7)+,A0/A1/D1
.1: RTS
.3: INTERN  101
;*-*

SETUPLIBS:
    BSR ADDLIBS
    RTS

SETUPUTIL:
    LEA UTIL(PC),A5
    MOVE.W  #-124,D7
    BSR     ADDLIBS2
    RTS

ADDLIBS:
    LEA EXEC(PC),A5
    MOVE.W  #-40,D7
    BSR.S   ADDLIBS2
    LEA DOS(PC),A5
    MOVE.W  #-44,D7
    BSR.S   ADDLIBS2
    LEA INTUI(PC),A5
    MOVE.W  #-48,D7
    BSR.S   ADDLIBS2
    LEA GFX(PC),A5
    MOVE.W  #-52,D7
    BSR.S   ADDLIBS2
;   LEA MATH(PC),A5
;   MOVE.W  #-56,D7
;   BSR.S   ADDLIBS2
    RTS

ADDLIBS2:             ; PAR: A5=LIB DATA, D7=OFFSET OF CUR. LIB.
    MOVE.W  #-30,D6         ; D6=OFFSET OF CUR. CALL
    MOVE.L  CURLIBASC,A4        ; A4=LIBSTRUCTS
    JSR CHECK3
.XL:CMP.B   #-1,(A5)
    BEQ.S   .OUT
    MOVE.L  A5,(A4)+        ; ptr to ascii
    MOVE.W  D7,(A4)+        ; xbase offset
    MOVE.W  D6,(A4)+        ; own offset
    MOVE.W  #-1,(A4)+       ; EXCEPTION INDEX
    SUBQ.W  #6,D6
.F: CMP.B   #32,(A5)+       ; NOW GET TO THE NEXT
    BPL .F
    CMP.B   #16,-1(A5)
    BEQ.S   .XL
.F2:    TST.B   (A5)
    BMI.S   .XL
    CMP.B   #16,(A5)
    BPL.S   .XL
    ADDQ.L  #1,A5
    BRA.S   .F2
.OUT:   MOVE.L  A4,CURLIBASC
    CLR.L   (A4)
    CLR.L   4(A4)
    CLR.L   8(A4)
    RTS
;*-*
;; ParseObjectFile
PARSEOBJECTFILE:
; Gets start of "module" in D0,
; it's len in d1,
; it's real pos in d2
; and real len in d3
;
; d2 and d3 are for the binaries, when d0 and d1 are for plain text!!!

    MOVEM.L D0-D7/A0-A6,-(A7)
    MOVE.L  D0,A0   ;start
    MOVe.L  A0,A1
    ADD.L   D1,A1   ;end
    move.l  d2,a2
    move.l  a2,a3
    add.l   d3,a3   ;if not enough, raise error
.LOOP1:
    CMP.L   A1,A0
    BPL     .EXIT
    moveq   #0,d0

    MOVE.B  (A0)+,D0
    BEQ     .EXIT
    CMP.b   #" ",D0
    BEQ     .LOOP1
    CMP.b   #10,D0
    BEQ     .LOOP1
    CMP.b   #9,D0
    BEQ     .LOOP1
    CMP.b   #"/",D0
    BEQ     .TRYCOM
    CMP.b   #"-",D0
    BEQ     .TRYCOM2
    CMP.b   #"P",D0
    BEQ     .PROC
    CMP.b   #"I",D0
    BEQ     .INLINE
    CMP.b   #"S",D0
    BEQ     .STARTUPCODE
    BRA     ERROR88
.EXIT:
    MOVEM.L (A7)+,D0-D7/A0-A6
    RTS

;; parse /* */ //
.TRYCOM:
    CMP.B   #"/",(A0)
    BEQ     .SHORT
    CMP.B   #"*",(A0)
    BNE     ERROR88
.LOOP2:
    CMPA.L  A1,A0
    BPL     ERROR88
    CMP.B   #"*",(A0)+
    BNE     .LOOP2
    CMP.B   #"/",(A0)
    BNE     .LOOP2
    ADDQ.L  #1,A0
    BRA     .LOOP1
;*-*
;; parse ->
.TRYCOM2:
    CMP.B   #">",(A0)
    BEQ     .SHORT
    BRA     ERROR88
;*-*
;; do // ->
.SHORT:
    CMPA.L  A1,A0
    BPL     ERROR88
    CMP.B   #10,(A0)+
    BNE     .SHORT
    BRA     .LOOP1
;*-*
;; proc
.PROC:
    MOVE.L  A1,-(A7)
    LEA     .HEAVYTAB,A6
    cmp.b   #"R",(A0)+
    Bne     ERROR88
    cmp.b   #"O",(a0)+
    bne     ERROR88
    cmp.b   #"C",(a0)+
    BNE     ERROR88

    BSR .SKIPWHITE

    GETM    A4
    move.l  a4,a5           ; a5 = name

    move.b  (a0)+,D0
    MOVE.B  D0,(A4)+
    MOVE.B  (A6,D0),D0
    CMP.B   #2,D0
    BNE     ERROR88


.LP:

    MOVE.B  (A0)+,D0
    mOVE.b  D0,(a4)+
    TST.B   (A6,D0)
    BNE .LP
    subq.l  #1,a0

    MOVE.B  #0,-1(A4)       ; NULL-TERMINATED NAME OF COMMAND
    move.l  a4,d0
    btst    #0,d0
    beq     .LS1
    clr.b   (a4)+
.LS1:
    CLR.L   (A4)+
    move.l  a5,LIB_NAME(a4)        ;

    BSR LIBCHASH

    BSR .SKIPWHITE

    CMP.b   #"(",(A0)+
    BNE ERROR88
    MOVEQ   #0,D5           ; NO OF ARGS

    BSR .SKIPWHITE

    MOVEQ   #0,D0

    MOVE.B  (A0)+,D0
    CMP.B   #")",D0
    BEQ     .LX
    SUBQ.L  #1,A0

.NEXT:
    BSR .SKIPWHITE
    MOVE.L  A0,D2
    MOVE.B  (A0)+,D0
    TST.B   (A6,D0)
    BEQ     ERROR88
    ADDQ.L  #1,D5
.LP3:
    MOVE.B  (A0)+,D0
    TST.B   (A6,D0)
    BNE     .LP3

    subq.l  #1,a0

    BSR     .SKIPWHITE
    CMP.B   #",",(A0)+
    BEQ     .NEXT
    CMP.B   #":",-1(A0)
    BEQ .LY
    CMP.B   #")",-1(A0)
    BNE     ERROR88
    BRA .LX
.LY:
    LEA .STREAM(PC),A6
    BSR .CHECK
    NEG.L   D5
    bsr .SKIPWHITE
    CMP.B   #")",(A0)+
    BNE ERROR88

.LX:
    MOVE.W  D5,LIB_ARGS(A4)
    CLR.W   LIB_TYPE(A4)       ;type
    clr.l   LIB_CODE(a4)
    CLR.L   LIB_CLEN(A4)
    CLR.L   LIB_USED(A4)       ;code-rel/use
    CLR.W   LIB_CPU(A4)
    CLR.W   LIB_FPU(A4)
    CLR.W   LIB_MMU(A4)
    MOVE.W  #33,LIB_OSVERS(A4)
    BSR     .FINDCODE
    ADD.L   #LIB_SIZE,A4
    DONEM   A4
    MOVE.L  (A7)+,A1
    BRA     .LOOP1
;*-*
;; inline
.INLINE:
    MOVE.L  A1,-(A7)
    LEA .INL_NAME(PC),A6
    BSR .CHECK
    BSR .SKIPWHITE

    LEA .HEAVYTAB(PC),A6

    GETM    A4
    move.l  a4,a5           ; a5 = name

    move.b  (a0)+,D0
    MOVE.B  D0,(A4)+
    MOVE.B  (A6,D0),D0
    CMP.B   #2,D0
    BLT     ERROR88

;    movem.l d0-a6,-(A7)
;    move.l  a0,d2
;    move.l  #6,d3
;    jsr WRITECON
;    movem.l (a7)+,d0-a6


.INL_LP:

    MOVE.B  (A0)+,D0
    mOVE.b  D0,(a4)+
    TST.B   (A6,D0)
    BNE .INL_LP
    subq.l  #1,a0

    MOVE.B  #0,-1(A4)       ; NULL-TERMINATED NAME OF COMMAND
    move.l  a4,d0
    btst    #0,d0
    beq     .INL_LS1
    clr.b   (a4)+
.INL_LS1:
    clr.l   (a4)+
    move.l  a5,LIB_NAME(a4)        ;

    BSR LIBCHASH

    BSR .SKIPWHITE

    CMP.b   #"(",(A0)+
    BNE ERROR88
    MOVEQ   #0,D5           ; NO OF ARGS

    BSR .SKIPWHITE

    MOVEQ   #0,D0

    MOVE.B  (A0)+,D0
    CMP.B   #")",D0
    BEQ     .INL_LX
    SUBQ.L  #1,A0

.INL_NEXT:
    BSR .SKIPWHITE
    MOVEQ   #0,D2
    MOVE.B  (A0)+,D0
    TST.B   (A6,D0)
    BEQ     ERROR88
    ADDQ.L  #1,D5
.INL_LP3:
    MOVE.B  (A0)+,D0
    TST.B   (A6,D0)
    BNE     .INL_LP3

    subq.l  #1,a0

    CMP.B   #":",(A0)+
    BNE     ERROR88
    MOVE.B  (A0)+,D0
    CMP.B   #"A",D0
    BNE     .INL_SKXX1
    ADDQ.L  #4,D2
    BRA     .INL_SKXX2
.INL_SKXX1:
    CMP.B   #"D",D0
    BNE     ERROR88
.INL_SKXX2:
    MOVE.B  (A0)+,D0
    CMP.B   #"0",D0
    BLT     ERROR88
    CMP.B   #"3",D0
    BGT     ERROR88
    SUB.L   #"0",D0
    AND.L   #3,d0
    add.b   d0,d2
    CMP.B   #3,d2
    beq     ERROR88
    move.b  d2,LIB_TARR-1(a4,d5); Dx/Ax reg, e.g. INLINE Whatever(what:D0,where,A0)

    BSR     .SKIPWHITE

    CMP.B   #",",(A0)+
    BEQ     .INL_NEXT
    CMP.B   #")",-1(A0)
    BNE     ERROR88

.INL_LX:
    MOVE.W  D5,LIB_ARGS(A4)
    MOVE.W  #1,LIB_TYPE(A4) ; type
    CLR.W   LIB_CPU(A4)
    CLR.W   LIB_FPU(A4)
    CLR.W   LIB_MMU(A4)
    mOVE.W  #33,LIB_OSVERS(A4)
    BSR     .FINDCODE
    CLR.L   LIB_USED(A4)    ;code-rel/use

    ADD.L   #LIB_SIZE,A4
    DONEM   A4
    MOVE.L  (A7)+,A1
    BRA     .LOOP1
;*-*
;; startup code
.STARTUPCODE:
    MOVE.L  A1,-(A7)
    LEA .STC_NAME(PC),A6
    BSR .CHECK
    BSR .SKIPWHITE

    LEA .HEAVYTAB(PC),A6

    GETM    A4
    move.l  a4,a5           ; a5 = name

    move.b  (a0)+,D0
    MOVE.B  D0,(A4)+
    MOVE.B  (A6,D0),D0
    CMP.B   #2,D0           ; only capital letters..
    BNE     ERROR88

.STC_LP:

    MOVE.B  (A0)+,D0
    mOVE.b  D0,(a4)+
    CMP.B   #2,(A6,D0)      ; CAPITAL LETTERS ONLY
    BEQ .STC_LP
    subq.l  #1,a0

    MOVE.B  #0,-1(A4)       ; NULL-TERMINATED NAME OF CODE
    move.l  a4,d0
    btst    #0,d0
    beq     .STC_LS1
    clr.b   (a4)+
.STC_LS1:
    move.l  LIBLIST(PC),(A4)+
    move.l  A4,LIBLIST
    move.l  a5,LIB_NAME(a4)        ;

    BSR .SKIPWHITE

    MOVE.W  #0,LIB_ARGS(A4)
    MOVE.W  #2,LIB_TYPE(A4) ; type
    BSR     .FINDCODE

    ADD.L   #LIB_SIZE,A4
    DONEM   A4
    MOVE.L  (A7)+,A1
    BRA     .LOOP1
;*-*

;; Check
; A0 - src
; A6 - dest
.CHECK:
    CMPM.B  (A0)+,(A6)+
    BEQ     .CHECK
    TST.B   -1(A6)
    BNE     ERROR88
    sUBQ.L  #1,A0
    CMP.B   #32,(A0)
    BEQ     .CHX
    CMP.B   #")",(A0)
    BEQ     .CHX
    CMP.B   #9,(A0)
    BNE     ERROR88
.CHX:
    RTS
;*-*
;; SKIP WHITESPACES
.SKIPWHITE
    cmp.b   #" ",(a0)+
    beq     .SKIPWHITE
    cmp.b   #9,-1(a0)
    beq     .SKIPWHITE
    SUBQ.L  #1,A0
    RTS
;*-*

.HEAVYTAB:
    DC.B    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    DC.B    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    DC.B    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    DC.B    1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0
    DC.B    1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 ; -O
    DC.B    2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,2 ; -_
    DC.B    0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3 ; -o
    DC.B    3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0 ; -DEL
    DC.B    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    DC.B    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    DC.B    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    DC.B    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    DC.B    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    DC.B    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    DC.B    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    DC.B    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

.INL_NAME:
    DC.B    'NLINE',0
.STC_NAME:
    DC.B    'TARTUP',0
.STREAM:
    DC.B    'STREAM',0
    EVEN

;; code
;; FindCode
.FINDCODE
    MOVEM.L D0-D7/A0-A1/A4-A6,-(A7)
    CMPA.L  A3,A2       ; check if enough code
    BPL     ERROR28     ;

    cmp.l   #$3e7,(a2)  ; we're doing a link object
    bne     ERROR28     ; !
.LC1:
    CMPA.L  A3,A2
    BPL     ERROR28     ; file truncated?

    MOVe.L  (A2)+,D0
    CMP.L   #$3F2,D0
    BEQ     .X

    MOVe.L  (A2)+,D1    ; size of hunk/whatever

    sub.l   #$3e7,d0
    lsl.w   #2,d0
    move.l  .TABLE(PC,d0),A0
    JSR     (a0)
    bra     .LC1
.X: MOVEM.L (A7)+,D0-D7/A0-A1/a4-A6
    RTS
;*-*
.TABLE:
    DC.L    .SKIP, .SKIP, .CODE, .ERRR, .ERRR, .RELO, .ERRR, .ERRR
    DC.L    .XTNS, .ERRR, .SKIP, .ERRR, .ERRR, .ERRR, .ERRR, .ERRR
    DC.L    .ERRR, .ERRR, .ERRR, .ERRR, .ERRR, .ERRR, .ERRR, .ERRR
.CURRENT:
    DC.L    0
;; code
.CODE:
    LSL.L   #2,D1
    MOVE.L  D1,LIB_CLEN(A4)
    MOVE.L  A2,LIB_CODE(A4)
    CLR.L   LIB_RELO(A4)
    ADD.L   D1,A2
    RTS
;*-*
;; skip
.SKIP:
    LSL.L   #2,D1
    ADD.L   D1,A2
    rTS
;*-*
;; extn
.XTNS:
    MOVE.L  A2,LIB_XTNS(A4)
    SUB.L   #4,LIB_XTNS(A4)
.EXTN:
    MOVE.L  d1,d2
    beq .XIT

    MOVE.L  A2,A5
    LOWER A2,D0
    MOVe.L  A5,A2

    rol.l   #8,d2
    and.l   #$FF,D2
    and.l   #$FFFFFF,d1
    cmp.w   #$83,d2
    beq     .0x83
    cmp.w   #$02,d2
    beq     .0x02
.EXT_1:
    lsl.l   #2,d1
    add.l   d1,a2
    move.l  (a2)+,d1
    cmp.w   #$80,d2
    bmi .EXT_2
    lsl.l   #2,d1
    add.l   d1,a2
.EXT_2:
    move.l  (a2)+,d1
    bra .EXTN
.XIT:
    rts
;*-*
;; errr
.ERRR:
    BRA ERROR28
;*-*
;; relo
.RELO:
    SUBQ.L  #8,A2       ;also reloc type!
    MOVE.L  A2,LIB_RELO(A4)
    addq.l  #2,d1
    LSL.L   #2,D1
    ADD.L   D1,A2
    addq.l  #8,a2       ; hunk 1 hunk 0

    rTS
;*-*

;; 0xXX
;; 0x83:
.0x83:
    MOVE.L  A5,A2       ; dos base
    MOVEQ   #-44,D3
    LEA .DBASE,A6
    BSR .CHECK2
    BEQ .0x83_FILL

    MOVEQ   #-48,D3     ; intuition base
    MOVE.L  A5,A2
    LEA .IBASE,A6
    BSR .CHECK2
    BEQ .0x83_FILL

    MOVEQ   #-52,d3     ; gfx base
    MOVE.L  A5,A2
    LEA .GBASE,A6
    BSR .CHECK2
    BEQ .0x83_FILL

    MOVEQ   #-8,d3      ; stdout
    MOVE.L  A5,A2
    LEA .SOUT,A6
    BSR .CHECK2
    BEQ .0x83_FILL

    MOVEQ   #-16,d3     ; stdrast
    MOVE.L  A5,A2
    LEA .SRAST,A6
    BSR .CHECK2
    BEQ .0x83_FILL

    MOVEQ   #-32,d3     ; arg
    MOVE.L  A5,A2
    LEA .ARG,A6
    BSR .CHECK2
    BEQ .0x83_FILL

    MOVEQ   #-36,d3     ; wbmessage
    MOVE.L  A5,A2
    LEA .WBMSG,A6
    BSR .CHECK2
    BEQ .0x83_FILL

    MOVEQ   #-56,D3     ; mathieeesingbas base
    MOVE.L  A5,A2
    LEA .SBBASE,A6
    BSR .CHECK2
    BNE .0x83_skp1
    BSET    #3,CODEPREFS+1
    BRA .0x83_FILL
.0x83_skp1:
    MOVEQ   #-60,D3     ; mathieeesingtrans base
    MOVE.L  A5,A2
    LEA .STBASE,A6
    BSR .CHECK2
    BNE .0x83_skp2
    BSET    #4,CODEPREFS+1
    BRA .0x83_FILL
.0x83_skp2:
    MOVE.L  #-84,D3     ; exception
    MOVE.L  A5,A2
    LEA .XCP,A6
    BSR .CHECK2
    BEQ .0x83_FILL

    MOVE.L  #-96,D3     ; exceptioninfo
    MOVE.L  A5,A2
    LEA .XCPI,A6
    BSR .CHECK2
    BEQ .0x83_FILL

    MOVE.L  #-92,D3     ; stdin
    MOVE.L  A5,A2
    LEA .SIN,A6
    BSR .CHECK2
    BEQ .0x83_FILL

    MOVE.L  #-120,D3    ; pool
    MOVE.L  A5,A2
    LEA .POOL,A6
    BSR .CHECK2
    BNE .0x83_skp3
    BSET    #6,CODEPREFS
    BRA .0x83_FILL
.0x83_skp3:
    MOVE.L  #-124,D3    ; utillib
    MOVE.L  A5,A2
    LEA .UBASE,A6
    BSR .CHECK2
    BNE .0x83_skp4
    BSET    #7,CODEPREFS
    BRA .0x83_FILL
.0x83_skp4:
    CMP.W   #2,LIB_TYPE(A4)
    BEQ .0x83_skp5      ; startup code - additional fields below
    BRA ERROR28
.0x83_skp5:
    MOVE.L  #0,D3
    BRA .0x83_FILL

;; Fill
.0x83_FILL:
    MOVE.L  A5,A2
    LSL.L   #2,D1
    ADD.L   D1,A2
    MOVE.L  (A2)+,D1
    SUBQ.L  #1,D1
    MOVE.L  LIB_CODE(A4),A6
.0x83_DBLOOP:
    MOVE.L  (A2)+,D0
    MOVE.W  D3,(A6,D0.L)
    DBF D1,.0x83_DBLOOP
    MOVE.L  (A2)+,D1
    BRA .EXTN
;*-*
;*-*
;; 0x02:
.0x02:
    MOVE.L  #LIB_CPU,D2
    MOVE.L  A5,A2       ; cpu
    MOVEQ   #-44,D3
    LEA .CPU,A6
    BSR .CHECK2
    BEQ .0x02_FILL

    MOVE.L  #LIB_FPU,D2
    MOVE.L  A5,A2       ; fpu
    MOVEQ   #-44,D3
    LEA .FPU,A6
    BSR .CHECK2
    BEQ .0x02_FILL

    MOVE.L  #LIB_MMU,D2
    MOVE.L  A5,A2       ; mmu
    MOVEQ   #-44,D3
    LEA .MMU,A6
    BSR .CHECK2
    BEQ .0x02_FILL

    MOVE.L  #LIB_OSVERS,D2
    MOVE.L  A5,A2       ; osversion
    MOVEQ   #-44,D3
    LEA .OSV,A6
    BSR .CHECK2
    BEQ .0x02_FILL

    BRA ERROR22
;; sub codes
.0x02_FILL:
    lsl.l   #2,d1
    move.l  a5,a2
    add.l   d1,a2
    move.l  (a2)+,d3
    cmp.l   #LIB_CPU,D2
    beq .A
    cmp.l   #LIB_FPU,d2
    beq .B_
    cmp.l   #LIB_MMU,D2
    beq .C
    move.w  D3,(A4,D2)
._EXIT:
    move.l  (a2)+,d1
    bra .EXTN
;; cpu
.A:
    CMP.L   #$68000,d3
    bpl     .A1
    cmp.l   #$10,d3
    bpl     .A2
    MULU.W  #20,D3
    MOVE.W  D3,(A4,D2)
    BRA ._EXIT
.A2:
    MOVE.W  D3,(A4,D2)
    BRA ._EXIT
.A1:
    SUB.L   #$68000,D3
    MOVE.W  D3,(A4,D2)
    BRA ._EXIT
;*-*
;; fpu
.B_:
    cMP.l   #$68000,d3
    bpl .B1
    cmp.l   #$040,d3
    bpl .B2
    move.w  d3,(A4,D2)
    bra ._EXIT
.B1:
    cmp.l   #$68881,d3
    bpl .B11
    move.w  #2,(a4,d2)
    bra ._EXIT
.B11:
    move.w  #1,(a4,d2)
    bra ._EXIT
.B2:
    cmp.l   #$881,d3
    bpl .B21
    move.w  #2,(a4,d2)
    bra ._EXIT
.B21:
    move.w  #1,(a4,d2)
    bra ._EXIT
;*-*
;; mmu
.C:
    cmp.l   #$68851,d3
    beq .C1
    move.w  #2,(a4,d2)
    bra ._EXIT
.C1:
    move.w  #1,(a4,d2)
    bra ._EXIT
;*-*
;*-*
;*-*
;; Check2
; A2 - src
; A6 - dest
.CHECK2:
    MOVEQ   #1,D0
    CMPM.B  (A2)+,(A6)+
    BNE     .CH2X
    TST.B   -1(A2)
    BNE .CHECK2

    BNE     .CH2X
    MOVEQ   #0,D0
.CH2X:
    TST.L   D0
    RTS
;*-*
;; 0x83 names
.DBASE:
    DC.B    '_dosbase',0
.IBASE:
    DC.B    '_intuitionbase',0
.GBASE:
    DC.B    '_gfxbase',0
.SOUT:
    DC.B    '_stdout',0
.SRAST:
    DC.B    '_stdrast',0
.ARG:
    DC.B    '_arg',0
.WBMSG:
    DC.B    '_wbmessage',0
.SBBASE:
    DC.B    '_mathieeesingbasbase',0
.STBASE:
    DC.B    '_mathieeesingtransbase',0
.XCP:
    DC.B    '_exception',0
.XCPI:
    Dc.B    '_exceptioninfo',0
.SIN:
    DC.B    '_stdin',0
.UBASE:
    DC.B    '_utilitybase',0
.POOL:
    DC.B    '_pool',0

    EVEN
;*-*
;; 0x02 names
.CPU:
    DC.B    '__cpu',0
.FPU:
    DC.B    '__fpu',0
.MMU:
    DC.B    '__mmu',0
.OSV:
    DC.B    '__osversion',0
;*-*
;*-*
;*-*
;; hash
LIBCHASH:
    MOVEM.L D0-A6,-(A7)
    MOVE.L  #LIBHASH,A0     ; A0=TABLE
    HASH    A5,D0,D1
    LSL.L   #2,D0
    LEA     0(A0,D0.L),A2
    MOVE.L  (A2),LIB_NEXT(A4)     ; READ PREVIOUS LIST (OR NIL)
    MOVE.L  A4,(A2)         ; PUT ENTRY IN LIST
    MOVEM.L (A7)+,D0-A6
    RTS
;*-*
LIBLIST:
    DC.L    0

;*-*
;HEADER
;; Exec
; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ;
;   The InitCode and ExitCode Part ....         ;
; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ;


STACKPOKE:        DC.L    0,0
AFTERDELEGATESLEA:    DC.L    0
BEFORESECONDLEA:      DC.L    0
TOTALDELSIZE:     DC.L    0

BUILDDELEGATECONSTRUCTORS:
    MOVE.L  CURACODE,A4     ; A4=CODE
    MOVEQ   #6,D0
    BSR ADDLABEL

    LEA OLIST+4,A5      ; A5=OLIST
    MOVEQ   #1,D6           ; D6=NUM
.CO:    MOVE.L  -(A5),D0
    BEQ.S   .COX
    MOVE.L  D0,A5
    TST.W   ODEL(A5)
    BEQ.S   .CO
    ADDQ.L  #1,D6
    BRA.S   .CO
.COX:   LSL.L   #2,D6
    MOVEQ   #4,D4           ; D4=CUR_DEL_PTR_OFF

    LEA OLIST+4,A5      ; A5=OLIST
.XL:MOVE.L  -(A5),D0
    BEQ.W   .X
    MOVE.L  D0,A5
    MOVE.W  ODEL(A5),D7     ; D7=DELSIZE
    BEQ.S   .XL

    GETM    A1
    MOVE.L  .GET(PC),(A4)+
    MOVE.L  D6,(A4)+
    MOVE.W  .GET2(PC),(A4)+
    MOVE.L  OACC(A5),(A1)       ; ADD TO ACCESSLIST OF THIS OBJECT
    MOVE.L  A1,OACC(A5)
    ADDQ.L  #4,A1
    MOVE.L  A4,(A1)+
    CLR.W   (A1)+
    DONEM   A1
    CLR.W   (A4)+

    EXT.L   D7
    MOVE.L  ODCODE(A5),A3       ; A3=CODE
    MOVE.L  A3,D0
    BEQ ERROR50

    MOVE.L  A3,D0
    SUB.L   A4,D0
    CMP.L   #-32000,D0
    BMI .LL
    SUBQ.L  #2,D0
    MOVE.W  .BSR(PC),(A4)+
    MOVE.W  D0,(A4)+
    BRA.S   .LD
.LL:    ADD.L   A4,D0
    SUB.L   ACODE,D0
    MOVE.W  .JSR(PC),(A4)+
    MOVE.L  D0,D1
    MOVE.L  A4,D0
    JSR ADDDIVRELOC
    MOVE.L  D1,(A4)+
.LD:
    BSR .ACC
    ADD.L   D7,D6
    ADDQ.L  #4,D4
    BRA.W   .XL
.X: SUBQ.L  #4,D6
    MOVE.L  D6,TOTALDELSIZE
    BSR MATHINITETC
    MOVE.W  .RTS(PC),(A4)+
    MOVE.L  A4,CURACODE
    JSR CHECK3
.RTS:   RTS
.BSR:   BSR .X
.JSR:   JSR .X
.GET:   MOVE.L  A4,A0
    ADD.L   #1,A0
.GET2:  MOVE.L  A0,4(A4)

.ACC:   LEA OACC(A5),A3
    MOVE.L  ODCODE(A5),D5
    SUB.L   ACODE,D5
.AL:    MOVE.L  (A3),D0
    BEQ.S   .AX
    MOVE.L  D0,A3
    MOVE.L  4(A3),A2
    MOVE.W  8(A3),D0
    BNE.S   .AA
    MOVE.W  D4,(A2)
    BRA.S   .AN
.AA:    MOVE.L  D5,(A2)
    MOVE.L  A2,D0
    BSR ADDDIVRELOC
.AN:    BRA.S   .AL
.AX:    RTS


MAKEEXITCODE:
    MOVE.W  #11,CURSPOT
    BTST    #3,CODEPREFS+3
    BNE .EX
    TSTMOD
    BNE .EX
    BTST    #5,CODEPREFS
    BNE .EX
    BTST    #2,CODEPREFS
    BNE     OTHEREXITCODE
    BSR BUILDDELEGATECONSTRUCTORS
    BSR BUILDLIBFUNS
    MOVE.L  TOTALDELSIZE(PC),D1 ; PATCH DELSIZE
    MOVE.L  D1,D2
    MOVE.L  BEFORESECONDLEA(PC),D0
    BEQ.S   .1
    MOVE.L  D0,A0
    MOVE.L  D2,2(A0)
.1: NEG.L   D2
    MOVE.L  AFTERDELEGATESLEA(PC),A0
    MOVE.L  D2,-4(A0)
    MOVE.L  MINSTACK(PC),D0     ; GLOBAL + ALL_LOCAL + DELEGATES
    ADD.L   GLOBSTACK(PC),D0
    ADD.L   D1,D0
    MOVE.L  CODESTACK,D1
    BNE.S   .S
    ADD.L   #MINSTACKSIZE,D0
    MOVE.L  LIBINFO(PC),D1
    BEQ.S   .NL
    SUB.L   #MINSTACKSIZE-MINSTACKSIZELIB,D0
.NL:    MOVE.L  D0,CODESTACK
    BSET    #0,CODEPREFS+3
    BRA.S   .NS
.S: CMP.L   D0,D1
    BPL.S   .S2
    BSET    #2,WARNINGS+3
.S2:    ADD.L   #4000,D0
    CMP.L   D0,D1
    BPL.S   .S3
    BSET    #1,WARNINGS+3   
    BCLR    #2,WARNINGS+3   
.S3:
.NS:    MOVE.L  CODESTACK,D0
    LEA STACKPOKE(PC),A0
    MOVE.L  (A0)+,A1
    MOVE.L  D0,(A1)
    MOVE.L  (A0),A1
    MOVE.L  D0,(A1)
.EX:    RTS

MAKEINITCODE:
    MOVE.W  #3,CURSPOT
    MOVE.L  CURACODE,A4
    BTST    #3,CODEPREFS+3
    BNE .EX
    TSTMOD
    BNE .EX
    BTST    #5,CODEPREFS
    BNE .EX
    BTST    #2,CODEPREFS
    BNE OTHERINITCODE
    TST.L   LIBINFO
    BNE LMAKEINITCODE
    BTST    #4,CODEPREFS
    BNE NSMAKEINITCODE
    LEA FIRSTSTART(PC),A0   ; NEW STACK
    MOVE.L  (A0)+,(A4)+
    MOVE.L  (A0)+,(A4)+
    MOVE.W  (A0)+,(A4)+
    MOVE.L  A4,STACKPOKE
    ADDQ.L  #4,A4
    ADDQ.L  #4,A0
    MOVE.L  #LINKC2,D0
    BSR COPYC
    MOVE.L  A4,AFTERDELEGATESLEA    ; PATCH IN SIZE LATER
    MOVE.W  LINKC2(PC),(A4)+
    MOVE.W  NRGLOB,D7
    MOVE.W  D7,(A4)+
    LEA REALSTART(PC),A0
    MOVE.L  A4,A6           ; BACKUP
    MOVE.L  #MIDC,D0
    BSR COPYC
    LEA POKESTRING-REALSTART(A6),A6
    MOVE.L  ARGBYTE,A5
    BTST    #0,(A5)
    BNE.S   .ARGU
    MOVE.L  #$4E714E71,(A6)
    MOVE.W  #$4E71,4(A6)
.ARGU:
;    BTST    #0,CODEPREFS+2
;    BEQ.S   .NVERS
;    MOVE.W  OSVERSION,D0
;    MOVE.B  D0,POKE37-POKESTRING+1(A6)
.NVERS: MOVE.W  GLOBJUMP(PC),(A4)+
    MOVEQ   #5,D0
    BSR ADDBRANCHRELOC
    MOVE.W  EXITC(PC),(A4)+     ; DELEGATES
    MOVEQ   #8,D0
    BSR ADDBRANCHRELOC
    LEA EXITC2(PC),A0
    MOVE.L  #ENDC2,D0
    BSR COPYC
    LEA ENDC2(PC),A0
    MOVE.L  A4,BEFORESECONDLEA
    MOVE.L  (A0)+,(A4)+
    MOVE.L  (A0)+,(A4)+
    MOVE.L  A4,STACKPOKE+4
    ADDQ.L  #4,A4
    ADDQ.L  #4,A0
    MOVE.L  #ST2,D0
    BSR COPYC
    MOVE.L  ST2,(A4)+
    BSR FIXPROCCODE
    MOVE.L  A4,CURACODE
.EX:    RTS

MAINRTS:    RTS

FIRSTSTART:           ; CHANGES ALSO TO LFIRSTART!!!
    MOVE.L  4.W,A6
    MOVE.L  A0,A5           ; SAVE A0/D0 TO A5/D7
    MOVE.L  D0,D7
    MOVE.L  #20000,D0       ; THIS .L IS CHANGED!
    MOVE.L  #$10000,D1
    MOVE.L  D0,D2
    JSR -198(A6)
    TST.L   D0
    BNE.S   EXE_1
    MOVEQ   #20,D0          ; NO FUCKIN' MEM !
    RTS
A4STORAGE_EXE:
    DC.L    0
EXE_1:
    MOVE.L  D0,D6           ; D6=BOTTOMSTACK
    ADD.L   D2,D0
    JSR -132(A6)        ; --> FORBID
    EXG.L   D0,A7
    MOVE.L  D0,-(A7)
    ADD.L   #1,A7           ; SIZE IS PATCHED IN
LINKC2:
    LINK    A4,#-4
REALSTART:
    JSR -138(A6)        ; --> PERMIT
    MOVE.L  D6,-64(A4)
    SUBA.L  A1,A1           ; check for wbstartup
    JSR -294(A6)        ; findtasK
    MOVE.L  D0,A3
    TST.L   172(A3)
    BNE.S   NOWBST
    LEA 92(A3),A0
    JSR -384(A6)        ; waitport
    LEA 92(A3),A0
    JSR -372(A6)        ; getmsg
    MOVE.L  D0,-36(A4)
    LEA ZEROSPOT(PC),A0
    MOVE.L  A0,-32(A4)      ; WB=NO ARGS
    BRA.S   NOARGSET
NOWBST:
    MOVE.L  A5,A0
    MOVE.L  D7,D0
    MOVE.L  A0,-32(A4)
POKESTRING:
    MOVE.B  #0,-1(A0,D0.W)
NOARGSET:
    MOVE.L  A6,-40(A4)      ; INIT VARS
    LEA EXITC(PC),A0
    MOVE.L  A0,-24(A4)

    LEA INITINTUI(PC),A1    ; OPEN LIBS
POKE37:
    MOVEQ   #33,D0          ; OR V37!
    JSR -552(A6)
    MOVE.L  D0,-48(A4)
    BEQ CLINT

    LEA INITGFX(PC),A1
    MOVEQ   #33,D0
    JSR -552(A6)
    MOVE.L  D0,-52(A4)
    BEQ CLGFX

    LEA INITDOS(PC),A1
    MOVEQ   #33,D0          ; WE WILL USE FUNCTIONS NOT IN V32
    JSR -552(A6)
    MOVE.L  D0,-44(A4)
    BEQ CLDOS

    MOVE.L  D0,A6
    JSR -60(A6)         ; GET STDOUT, MAY BE 0
    MOVE.L  D0,-8(A4)
    JSR -54(A6)         ; GET STDIN
    MOVE.L  D0,-92(A4)
    MOVE.L  A7,-4(A4)
    LEA     A4STORAGE_EXE(PC),A1
    MOVE.L  A4,(A1)
    BRA.S   GLOBJUMP
INITDOS:      DC.B    "dos.library",0
INITINTUI:    DC.B    "intuition.library",0
INITGFX:      DC.B    "graphics.library",0
ZEROSPOT:     DC.B    0
    EVEN
MIDC:
GLOBJUMP:
    JSR GLOBJUMP
EXITC:
    JSR EXITC
EXITC2:
    MOVE.L  -4(A4),A7
    MOVE.L  4.W,A6
    MOVE.L  -20(A4),A2      ; CLEANUP MEMORY
    MOVE.L  A2,D0
    BEQ.S   .3
.4: MOVE.L  A2,A1
    MOVE.L  4(A2),D0
    MOVE.L  (A2),A2
    JSR -210(A6)
    MOVE.L  A2,D0
    BNE.S   .4  
.3:
    MOVE.L  -44(A4),A1
    JSR -414(A6)        ; closedos
CLDOS:  MOVE.L  -52(A4),A1
    JSR -414(A6)        ; closegfx
CLGFX:  MOVE.L  -48(A4),A1
    JSR -414(A6)        ; closeintui
CLINT:  MOVE.L  -36(A4),D3
    BEQ.S   .1
    JSR -132(A6)        ; no unloadseg until we're done
    MOVE.L  D3,A1
    JSR -378(A6)        ; reply WB message
.1: MOVE.L  -28(A4),D2      ; EXITCODE
    UNLK    A4
ENDC2:
    ADD.L   #1,A7
    MOVE.L  #$20000,D0
    MOVE.L  (A7)+,A1
    EXG.L   A1,A7
    SUBA.L  D0,A1
    JSR -210(A6)
ST2:
    MOVE.L  D2,D0
    RTS
ENDC:
;*-*
;; library
; sample.library

VERSION         = 37
REVISION        = 1

LIBB_DELEXP     = 3
LIB_NEGSIZE     = $10
LIB_POSSIZE     = $12
LIB_OPENCNT     = $20

TASKTABSIZE     = 16
NUMTASKTAB      = 8
NUMTASKS        = TASKTABSIZE*NUMTASKTAB
TASKTABSTOREMASK    = %1110000000 ; 16*8BYTES=128=7BIT CLEAR

sb_Flags        = 34    ; LIB_SIZE
sb_pad          = 35
sb_SysLib       = 36
sb_DosLib       = 40
sb_SegList      = 44
sb_TASKS        = 48            ; TASKID+A4
SampleBase_SIZEOF   = NUMTASKS*8+sb_TASKS

Remove          = -$FC
FreeMem         = -$D2

PoolSize        = 256*10+4  ; 256 places for [task:LONG,a4:LONG,open:INT]+4bytes for link

Start:  MOVEQ   #-1,d0
    rts

RomTag: DC.W    $4AFC       ; UWORD RT_MATCHWORD
    DC.L    RomTag-Start    ; APTR  RT_MATCHTAG [R]
    DC.L    EndCode-Start   ; APTR  RT_ENDSKIP [R]
    DC.B    $80     ; UBYTE RT_FLAGS
    DC.B    VERSION     ; UBYTE RT_VERSION
    DC.B    9       ; UBYTE RT_TYPE
    DC.B    0       ; BYTE  RT_PRI
    DC.L    LibName-Start   ; APTR  RT_NAME [R]
    DC.L    IDString-Start  ; APTR  RT_IDSTRING [R]
    DC.L    InitTable-Start ; APTR  RT_INIT  table for InitResident()

InitTable:
    DC.L    34+8;SampleBase_SIZEOF   ; size of library base data space
    DC.L    0               ; pointer to function initializers
    DC.L    dataTable-Start     ; pointer to data initializers
    DC.L    initRoutine-Start   ; routine to run

dataTable:
    DC.W    -$5FF8
    DC.B    $9,0
    DC.W    -$7FF6
    DC.L    LibName-Start
    DC.W    -$5FF2,$600,-$6FEC,VERSION,-$6FEA,REVISION,-$7FE8
    DC.L    IDString-Start,0

;; init
initRoutine:
    movem.l a1/a5,-(sp)
    move.l  d0,a5
PatchLib1:
    LEA     34(A5),A1
    MOVE.L  A0,(A1)         ; seg list
    MOVE.L  #0,4(A1)        ; task list
    move.l  a5,d0
    movem.l (sp)+,a1/a5
    rts
;*-*
;; open
Open:
    addq.w  #1,LIB_OPENCNT(A6)  ; ( libptr:a6, version:d0 )
    BSR.W   GETTC
    CMPA.L  #0,A0
    BNE     .EXIT
    BSR     NEWTC
    BRA     .OKAY
.FAIL:
    SUBQ.W  #1,LIB_OPENCNT(A6)  ;
    MOVEQ   #0,D0               ; AAARGH!!! ERROR!!
    RTS
.OKAY:
    MOVEM.L D2-D7/A0/A2-A6,-(A7)
    MOVE.L  A0,A5               ; AO POS BEWAREN OM A4 ..
    BSR LFIRSTSTART
    MOVEM.L (A7)+,D2-D7/A0/A2-A6
    TST.L   D0
    BEQ.S   .FAIL
.EXIT:
    ADD.W   #1,4(A0)
    move.l  a6,d0
    rts
;*-*
;; close
Close:
    BSR     GETTC
    CMPA.L  #0,A0
    BEQ     .1
    SUB.W   #1,4(A0)
    MOVEQ   #0,D0
    TST.W   4(A0)
    BNE     .1

    MOVEM.L D2-D7/A2-A6,-(A7)
    MOVE.L  (A0),A4
    CLR.L   (A0)
    CLR.L   -(A0)               ; change is multitask safe
    BSR LEXITC
    MOVEM.L (A7)+,D2-D7/A2-A6
    moveq   #0,d0               ; ( libptr:a6 )
    subq.w  #1,LIB_OPENCNT(a6)
    bne.s   .1
    bsr Expung
.1: rts
;*-*
;; Expunge
Expung:
    movem.l d2/d7/a4/a5/a6,-(sp)          ; ( libptr: a6 )
PatchLib2:
    LEA     34(a6),a4
    move.l  a6,a5
    tst.w   LIB_OPENCNT(a5)
    beq .1                              ; juz zamknieta :)
    moveq   #0,d0                       ; albo i nie :)
    bra.s   ExpEnd                      ;
.1:
    move.l  (a4),d7                     ; seg list
    MOVE.L  $4,A6
    move.l  4(a4),a4
.L1:
    MOVE.L  A4,a1
    move.l  (a1),a4
    move.l  #PoolSize,D0
    JSR     -210(a6)                    ; free mem
    cmpa.l  #0,a4
    bne     .L1

    move.l  a5,a1                       ; library
    jsr Remove(A6)                      ; remove
    moveq   #0,d0                       ;
    move.l  a5,a1                       ;
    move.w  LIB_NEGSIZE(a5),d0
    sub.l   d0,a1
    add.w   LIB_POSSIZE(a5),d0
    jsr FreeMem(A6)                     ; free library extra fields
    move.l   d7,d0
ExpEnd:
    movem.l (sp)+,d2/d7/a4/a5/a6        ; bye
    rts
;*-*

Null:   moveq   #0,d0
    rts


;; GETTC
GETTC:
    LEA     38(a6),a0
    move.l  (a0),a0
    MOVE.L  4.W,A1              ; COPY IN GETA4!!!!!!!!
    MOVE.L  276(A1),d0          ; A1=THISTASK
.L1:
    cmpa.l  #0,a0
    BEQ     .LX
    move.l  a0,a1               ; current
    move.l  (a1),a0             ; next
    addq.l  #8,a1
    move.l  #255,d1
.L2:
    cmp.l   -4(a1),d0
    beq     .X
    lea     10(a1),a1
    dbf     d1,.L2
    BRA     .L1
.LX:rts
.X: MOVE.L  A1,A0
    RTS
;*-*
;; NEWTC
NEWTC:
    LEA 38(a6),a0
    move.l  (a0),a0
    move.l  $4.W,A1
    MOVE.L  276(a1),d0
.L1:
    cmpa.l  #$0,A0
    BEQ     .LX
    move.l  a0,a1               ; current
    move.l  (a1),a0             ; next
    addq.l  #8,a1
    move.l  #255,d1
.L2:
    tst.l   -4(a1)
    beq     PatchLibX
    lea     10(a1),a1
    dbf     d1,.L2
    bra     .L1
.LX:
    movem.l d0/a6,-(a7)
    move.l  $4.W,A6
    move.l  #PoolSize,D0
    move.l  #$10001,d1
    jsr     -198(a6)
    move.l  d0,a0
    movem.l (a7)+,d0/a6
PatchLib3:
    lea     38(a6),a1
    move.l  (a1),(a0)
    move.l  a0,(a1)
    addq.l  #8,a0
    move.l  d0,-4(a0)
    rts
PatchLibX:
    MOVE.L  A1,A0
    move.l  d0,-4(a0)
    RTS
;*-*

EndCode:

; same thing, only now for libraries

LFIRSTSTART:          ; a5 here = ptr to put a4 in
    MOVE.L  A7,A3           ; A3 = ORIG STACK
    MOVE.L  4.W,A6
    MOVE.L  #20000,D0       ; THIS .L IS CHANGED!
    MOVE.L  #$10000,D1
    MOVE.L  D0,D2
    JSR -198(A6)
    TST.L   D0
    BEQ.W   LNOMEM
    MOVE.L  D0,D6           ; D6=BOTTOMSTACK
    ADD.L   D2,D0
    JSR -132(A6)        ; --> FORBID
    MOVE.L  D0,A7
    ADD.L   #1,A7           ; SIZE IS PATCHED IN
LLINKC2:
    LINK    A4,#-4
LREALSTART:
    JSR -138(A6)        ; --> PERMIT
    MOVE.L  A3,-4(A4)
    MOVE.L  D6,-64(A4)
    MOVE.L  A6,-40(A4)      ; INIT VARS
    LEA LINITINTUI(PC),A1   ; OPEN LIBS
LPOKE37:
    MOVEQ   #33,D0          ; OR V37!
    JSR -552(A6)
    MOVE.L  D0,-48(A4)
    BEQ LCLINT
    LEA LINITGFX(PC),A1
    MOVEQ   #33,D0
    JSR -552(A6)
    MOVE.L  D0,-52(A4)
    BEQ LCLGFX
    LEA LINITDOS(PC),A1
    MOVEQ   #33,D0          ; WE WILL USE FUNCTIONS NOT IN V32
    JSR -552(A6)
    MOVE.L  D0,-44(A4)
    BEQ LCLDOS
    MOVE.L  A4,(A5)         ; PUT A4 IN TABLE
    BRA.S   LGLOBJUMP
LINITDOS:     DC.B    "dos.library",0
LINITINTUI:   DC.B    "intuition.library",0
LINITGFX:     DC.B    "graphics.library",0
LZEROSPOT:    DC.B    0
    EVEN
LMIDC:
LGLOBJUMP:
    JMP LGLOBJUMP
LNOMEM:
LRTS:
    RTS
LEXITC:               ; START OF CLOSE, A4=A4
    JSR LEXITC
LEXITC3:
    JSR LRTS
LEXITC2:
    MOVE.L  A7,-4(A4)
    MOVE.L  4.W,A6
    MOVE.L  -20(A4),A2      ; CLEANUP MEMORY
    MOVE.L  A2,D0
    BEQ.S   .3
.4: MOVE.L  A2,A1
    MOVE.L  4(A2),D0
    MOVE.L  (A2),A2
    JSR -210(A6)
    MOVE.L  A2,D0
    BNE.S   .4  
.3: MOVE.L  -44(A4),A1
    JSR -414(A6)        ; closedos
LCLDOS: MOVE.L  -52(A4),A1
    JSR -414(A6)        ; closegfx
LCLGFX: MOVE.L  -48(A4),A1
    JSR -414(A6)        ; closeintui
LCLINT:
LENDC2:
    MOVE.L  #$20000,D0
    MOVE.L  -64(A4),A1
    MOVE.L  -4(A4),A7
    JSR -210(A6)
    MOVEQ   #0,D0           ; FAIL (OPEN ONLY)
    RTS
LENDC:

LibName:
IDString:

ENDFUNTAB:

COPYC:                ; A0=START,D0=END,A4=DEST
    SUB.L   A0,D0
    LSR.L   #1,D0
    SUBQ.L  #1,D0
.1: MOVE.W  (A0)+,(A4)+
    DBRA    D0,.1
    RTS

COPYRELOC:
    MOVE.L  A4,D0
    MOVE.L  (A0)+,(A4)+
    BSR ADDDIVRELOC
    RTS

LMAKEINITCODE:
    MOVE.L  LIBINFO(PC),A6      ; A6=LIBINFO
    MOVE.L  12(A6),D2
    SUB.L   (A6),D2
    LEA Start(PC),A0
    MOVE.L  (A0)+,(A4)+
    MOVE.W  (A0)+,(A4)+
    BSR.S   COPYRELOC       ; MATCHTAG
    BSR.S   COPYRELOC       ; ENDSKIP
    MOVE.B  (A0)+,(A4)+
    ADDQ.L  #1,A0
    MOVE.B  7(A6),(A4)+     ; VERSION
    MOVE.W  (A0)+,(A4)+
    BSR.S   COPYRELOC       ; LIBNAME
    BSR.S   COPYRELOC       ; IDSTRING
    ADD.L   D2,-4(A4)
    BSR.S   COPYRELOC       ; INIT
    MOVE.L  (A0)+,(A4)+
    MOVE.L  A4,FUNTABADR
    ADDQ.L  #4,A0
    CLR.L   (A4)+           ; FUN INIT
    BSR.S   COPYRELOC       ; DATA INIT
    BSR.S   COPYRELOC       ; RUN
    MOVE.L  (A0)+,(A4)+
    MOVE.W  (A0)+,(A4)+
    BSR.S   COPYRELOC       ; LIBNAME
    MOVE.L  (A0)+,(A4)+
    MOVE.W  (A0)+,(A4)+
    ADDQ.L  #2,A0
    MOVE.W  6(A6),(A4)+     ; VERSION
    MOVE.W  (A0)+,(A4)+
    ADDQ.L  #2,A0
    MOVE.W  10(A6),(A4)+        ; REVISION
    MOVE.W  (A0)+,(A4)+
    BSR.S   COPYRELOC       ; IDSTRING
    ADDQ.L  #4,A0
    CLR.L   (A4)+
    ADD.L   D2,-4(A4)
    MOVE.L  #EndCode,D0
    BSR.S   COPYC
    LEA LFIRSTSTART(PC),A0  ; NEW STACK
    MOVE.L  (A0)+,(A4)+
    MOVE.L  (A0)+,(A4)+
    MOVE.L  A4,STACKPOKE
    ADDQ.L  #4,A4
    ADDQ.L  #4,A0
    MOVE.L  #LLINKC2,D0
    BSR.W   COPYC
    MOVE.L  A4,AFTERDELEGATESLEA    ; PATCH IN SIZE LATER
    MOVE.W  LLINKC2(PC),(A4)+
    MOVE.W  NRGLOB,D7
    MOVE.W  D7,(A4)+
    LEA LREALSTART(PC),A0
    MOVE.L  A4,A6           ; BACKUP
    MOVE.L  #LMIDC,D0
    BSR.W   COPYC
;    BTST    #0,CODEPREFS+2
;    BEQ.S   .NVERS
;    LEA LPOKE37-LMIDC+1(A4),A6
;    MOVE.W  OSVERSION,D0
;    MOVE.B  D0,(A6)
.NVERS: LEA LGLOBJUMP(PC),A2
    MOVE.W  (A2),(A4)+
    MOVEQ   #5,D0
    JSR ADDBRANCHRELOC
    MOVE.W  6(A2),(A4)+
    MOVE.W  LEXITC(PC),(A4)+    ; DELEGATES
    MOVEQ   #8,D0
    JSR ADDBRANCHRELOC

    MOVE.W  LEXITC3(PC),(A4)+   ; this bit links in close()
    MOVEM.L D3-D4/A1-A3,-(A7)
    LEA .CLOSE(PC),A3
    HASH    A3,D3,D4
    LEA IDENTHASH,A3
    LSL.L   #2,D3
    ADD.L   D3,A3
    ADDQ.L  #4,A3
.CL:    MOVE.L  -(A3),A3        ; A3=IDENT
    MOVE.L  A3,D4
    BEQ.S   .NF
    MOVE.L  (A3),A2
    LEA .CLOSE(PC),A1
.IL:    CMPM.B  (A2)+,(A1)+
    BNE.S   .CL
    TST.B   -1(A2)
    BNE.S   .IL
    CMPI.B  #LAB,4(A3)
    BNE.S   .CL
    MOVE.L  6(A3),D4        ; NO LABELS
    BEQ.S   .CL
    MOVE.L  D4,A2           ; A2=PROC
    BTST    #1,2(A2)
    BNE ERROR70         ; NO METHODS
    TST.W   (A2)
    BNE ERROR70         ; NO ARGS
    BSET    #0,5(A3)
    MOVE.W  10(A3),D0
    JSR ADDBRANCHRELOC
    BRA.S   .CN
.CLOSE: DC.B    "close",0
.NF:    MOVE.L  A4,D0
    BSR ADDDIVRELOC
    MOVE.L  A4,D3
    SUB.L   #LEXITC3-LRTS+2,D3
    SUB.L   ACODE,D3
    MOVE.L  D3,(A4)+
.CN:    MOVEM.L (A7)+,D3-D4/A1-A3

    LEA LEXITC2(PC),A0
    MOVE.L  #LENDC2,D0
    BSR COPYC
    LEA LENDC2(PC),A0
    MOVE.W  (A0)+,(A4)+
    MOVE.L  A4,STACKPOKE+4
    ADDQ.L  #4,A4
    ADDQ.L  #4,A0
    MOVE.L  #LENDC,D0
    BSR COPYC
    MOVE.L  LIBINFO(PC),A6
    MOVE.L  (A6),A0
.1: MOVE.B  (A0)+,(A4)+
    BNE.S   .1
    MOVE.L  12(A6),A0
.2: MOVE.B  (A0)+,(A4)+
    BNE.S   .2
    MOVE.L  A4,D0
    BTST    #0,D0
    BEQ.S   .3
    CLR.B   (A4)+
.3: BSR FIXPROCCODE
    MOVE.L  A4,CURACODE
    RTS

FUNTABADR:    DC.L    0

funcTable:
    dc.l    Open-Start
    dc.l    Close-Start
    dc.l    Expung-Start
    dc.l    Null-Start

;; GETA4
GETA4:
    MOVEM.L D0/D1/A0/A1,-(A7)
    LEA     38(a6),a0
    move.l  (a0),a0
    MOVE.L  4.W,A1              ; COPY IN GETA4!!!!!!!!
    MOVE.L  276(A1),d0          ; A1=THISTASK
.L1:
    move.l  a0,a1               ; current
    move.l  (a1),a0             ; next
    addq.l  #8,a1
    move.l  #255,d1
.L2:
    cmp.l   -4(a1),d0
    beq     .X
    lea     10(a1),a1
    dbf     d1,.L2
    cmpa.l  #0,a0
    bne     .L1
    suba.l  a4,a4               ; not found
    rts
.X: MOVE.L  (A1),A4
    MOVEM.L (A7)+,D0/D1/A0/A1
    RTS
ENDGETA4:
;*-*

BUILDLIBFUNS:
    MOVE.L  LIBINFO(PC),D6
    BEQ.W   .X
    MOVE.L  D6,A6           ; A6 = LIBINFO
    MOVE.L  CURACODE,A4     ; A4 = CODE
    MOVE.L  FUNTABADR(PC),A5
    MOVE.L  A4,D0
    SUB.L   ACODE,D0
    MOVE.L  D0,(A5)
    MOVE.L  A5,D0
    BSR ADDDIVRELOC
    LEA funcTable(PC),A0
    BSR COPYRELOC
    BSR COPYRELOC
    BSR COPYRELOC
    BSR COPYRELOC
    MOVE.L  A4,A2           ; A2 = LIBTAB
    MOVE.W  18(A6),D0
    LSL.W   #2,D0
    ADD.W   D0,A4
    MOVE.L  #-1,(A4)+
    MOVE.L  A4,D7           ; D7 = GETA4ADDR
    LEA GETA4(PC),A0
    MOVE.L  #ENDGETA4,D0
    BSR COPYC
    LEA 20(A6),A6       ; A6 = FUNTAB
.XL:MOVE.L  (A6)+,D0
    BEQ.W   .C
    ADD.W   #20-4,A6
    MOVE.L  D0,A5           ; A5 = IDENT
    CMP.B   #LAB,4(A5)
    BNE ERROR70
    BTST    #4,5(A5)
    BNE ERROR70
    MOVE.L  6(A5),D0
    BEQ ERROR70
    MOVE.L  D0,A3           ; A3 = PROC
    TST.L   10(A3)
    BNE ERROR70
    MOVE.L  A2,D0
    BSR ADDDIVRELOC
    MOVE.L  A4,D0
    SUB.L   ACODE,D0
    MOVE.L  D0,(A2)+
    MOVE.L  .M1(PC),(A4)+
    MOVE.W  -2(A6),D4
    BMI.S   .NS
    CMP.W   (A3),D4         ; BOTH LIBFUN DECLS NARGS
    BNE ERROR70
.NS:    MOVE.W  (A3),D4
    BEQ.W   .R
    CMP.W   #13,D4
    BPL ERROR70
    TST.W   -4(A6)
    BMI.S   .NS2

    MOVEM.L D0/D1/A0,-(A7)
    LEA -16(A6),A0
    MOVE.W  -2(A6),D0
    SUBQ.W  #1,D0
    MOVEQ   #0,D1
.RML:   MOVE.B  (A0)+,D1
    MOVE.W  .MV1(PC),(A4)
    OR.W    D1,(A4)+
    DBRA    D0,.RML
    MOVEM.L (A7)+,D0/D1/A0

    BRA.S   .R
.NS2:   CMP.W   #1,D4
    BEQ.W   .ONE
    SUBQ.W  #2,D4
    LSL.W   #1,D4
    MOVE.W  .M1(PC),(A4)+
    MOVE.W  .TAB(PC,D4.W),(A4)+
.R: MOVE.W  .BSR(PC),(A4)+      ; 2XENTRY
    MOVE.L  D7,D0
    SUB.L   A4,D0
    MOVE.W  D0,(A4)+
    MOVE.W  10(A5),D0
    MOVE.W  .JSR(PC),NEWOP
    MOVE.L  .BSR(PC),(A4)+
    JSR ADDBRANCH
    MOVE.W  (A3),D4
    BEQ.S   .R2
    CMP.W   #1,D4
    BEQ.S   .ONEA
    CMP.W   #2,D4
    BEQ.S   .TWOA
    LSL.W   #2,D4
    MOVE.W  .LEA(PC),(A4)+
    MOVE.W  D4,(A4)+
.R2:    MOVE.L  .M2(PC),(A4)+
    MOVE.W  .RTS(PC),(A4)+
    BRA.W   .XL
.C: MOVE.L  A4,CURACODE
.X: RTS
.TAB:   DC.W    %1000000010000000   ; 2
    DC.W    %1100000010000000   ; 3
    DC.W    %1100000011000000   ; 4
    DC.W    %1110000011000000   ; 5
    DC.W    %1110000011100000   ; 6
    DC.W    %1111000011100000   ; 7
    DC.W    %1111000011110000   ; 8
    DC.W    %1111100011110000   ; 9
    DC.W    %1111110011110000   ; 10
    DC.W    %1111111011110000   ; 11
    DC.W    %1111111111110000   ; 12
.M1:    MOVEM.L D2/A2-A6,-(A7)
.M2:    MOVEM.L (A7)+,D2/A2-A6
.MV1:   MOVE.L  D0,-(A7)
.RTS:   RTS
.BSR:   BSR .X
.JSR:   JSR .X
.LEA:   LEA 4(A7),A7
.ADD1:  ADDQ.L  #4,A7
.ADD2:  ADDQ.L  #8,A7
.ONE:   MOVE.W  .MV1(PC),(A4)+
    BRA.W   .R
.ONEA:  MOVE.W  .ADD1(PC),(A4)+
    BRA.S   .R2
.TWOA:  MOVE.W  .ADD2(PC),(A4)+
    BRA.S   .R2

WRITELIBMOD:
    MOVE.L  LIBINFO,D0
    BEQ.W   .X
    MOVE.L  D0,A5           ; A5=LIBINFO
    MOVE.L  (A5),D1         ; D1/A2=LIBNAME
    MOVE.L  D1,A2
    MOVE.L  D1,A3           ; A3=DOTLOCATION
.XL:TST.B   (A3)
    BEQ.S   .F
    CMP.B   #".",(A3)+
    BNE.S   .XL
.F: MOVE.B  #"m",(A3)+
    CLR.B   (A3)+
    MOVE.L  D1,D0
    JSR FLUSHMODULE
    MOVE.L  #1006,D2
    MOVE.L  DOSBASE,A6
    JSR -30(A6)
    MOVE.L  D0,HANDLE
    BEQ ERROR17
    CLR.B   1(A3)
    MOVE.B  #"e",(A3)
    MOVE.B  #"s",-(A3)
    MOVE.B  #"a",-(A3)
    MOVE.B  #"b",-(A3)
    MOVE.L  #ESTACKBUF,A4       ; A4=BUF,D4=BEGIN
    MOVE.L  A4,D4
    MOVE.L  #"EMOD",(A4)+
    MOVE.W  #6,(A4)+
    CLR.B   (A4)+
.BL:    MOVE.B  (A2)+,(A4)+
    BNE.S   .BL
    LEA 20(A5),A5
.NL:    MOVE.L  (A5)+,D0
    BEQ.W   .FL
    ADD.W   #20-4,A5
    MOVE.L  D0,A3           ; A3=IDENT
    MOVE.L  (A3),A2
    MOVE.B  (A2)+,D0
    CMP.B   #"a",D0
    BPL.W   .UP
.UPB:   MOVE.B  D0,(A4)+
.CL:    MOVE.B  (A2)+,(A4)+
    BNE.S   .CL
    SUBQ.L  #1,A4

    MOVE.L  6(A3),A3        ; A3=PROC
    MOVE.W  (A3),D0
    BEQ.W   .NRG

    TST.W   -2(A5)
    BMI.S   .NRA
    LEA -16(A5),A3
    SUBQ.L  #1,D0
.CRA:   MOVE.B  (A3)+,(A4)+
    DBRA    D0,.CRA
    BRA.S   .NRGB
    
.NRA:   MOVE.W  D0,D1
    MOVEQ   #0,D2
    LSR.W   #1,D1
    TST.W   D1
    BEQ.S   .DR
    CMP.W   #5,D1
    BMI.S   .AR
    MOVEQ   #4,D1
.AR:    MOVE.W  D1,D2
    SUBQ.W  #1,D1
.ARL:   MOVE.B  D1,D3
    ADD.B   #8,D3
    MOVE.B  D3,(A4)+
    DBRA    D1,.ARL
.DR:    SUB.W   D2,D0
    SUBQ.W  #1,D0
.DRL:   MOVE.B  D0,(A4)+
    DBRA    D0,.DRL

.NRGB:  CHESTB  A4,D0,3,ERROR37
    BRA.W   .NL
    
.FL:    MOVE.B  #-1,(A4)+
    MOVE.L  A4,D3
    MOVE.L  D4,D2
    SUB.L   D2,D3
    JSR WRITEFILE
    MOVE.L  DOSBASE,A6
    MOVE.L  HANDLE,D1
    JSR -36(A6)
.X: RTS
.UP:    CMP.B   #"z"+1,D0
    BPL.W   .UPB
    SUB.B   #32,D0
    BRA.W   .UPB
.NRG:   MOVE.B  #16,(A4)+
    BRA.S   .NRGB
;*-*
;; Nostartup
; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ;
;   and again mit kein startup routines
; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ;

NSMAKEINITCODE:
    MOVE.W  #3,CURSPOT
    MOVE.L  CURACODE,A4
    BTST    #3,CODEPREFS+3
    BNE .EX
    TSTMOD
    BNE .EX
    LEA NSFIRSTSTART(PC),A0   ; NEW STACK
    MOVE.L  (A0)+,(A4)+
    MOVE.L  (A0)+,(A4)+
    MOVE.W  (A0)+,(A4)+
    MOVE.L  A4,STACKPOKE
    ADDQ.L  #4,A4
    ADDQ.L  #4,A0
    MOVE.L  #NSLINKC2,D0
    BSR COPYC
    MOVE.L  A4,AFTERDELEGATESLEA    ; PATCH IN SIZE LATER
    MOVE.W  NSLINKC2(PC),(A4)+
    MOVE.W  NRGLOB,D7
    MOVE.W  D7,(A4)+
    LEA NSREALSTART(PC),A0
    MOVE.L  A4,A6           ; BACKUP
    MOVE.L  #NSMIDC,D0
    BSR COPYC
    MOVE.W  NSGLOBJUMP(PC),(A4)+
    MOVEQ   #5,D0
    JSR ADDBRANCHRELOC
    MOVE.W  NSEXITC(PC),(A4)+     ; DELEGATES
    MOVEQ   #8,D0
    JSR ADDBRANCHRELOC
    LEA NSEXITC2(PC),A0
    MOVE.L  #NSENDC2,D0
    BSR COPYC
    LEA NSENDC2(PC),A0
    MOVE.L  A4,BEFORESECONDLEA
    MOVE.L  (A0)+,(A4)+
    MOVE.L  (A0)+,(A4)+
    MOVE.L  A4,STACKPOKE+4
    ADDQ.L  #4,A4
    ADDQ.L  #4,A0
    MOVE.L  #NSST2,D0
    BSR COPYC
    MOVE.L  NSST2,(A4)+
    BSR FIXPROCCODE
    MOVE.L  A4,CURACODE
.EX:    RTS

NSFIRSTSTART:         ; CHANGES ALSO TO LFIRSTART!!!
    MOVE.L  4.W,A6
    MOVE.L  A0,A5           ; SAVE A0/D0 TO A5/D7
    MOVE.L  D0,D7
    MOVE.L  #20000,D0       ; THIS .L IS CHANGED!
    MOVE.L  #$10000,D1
    MOVE.L  D0,D2
    JSR     -198(A6)
    TST.L   D0
    BNE.S   NOST_1
    MOVEQ   #20,D0          ; NO FUCKIN' MEM !
    RTS
A4STORAGE_NOST:
    DC.L    0
NOST_1:
    MOVE.L  D0,D6           ; D6=BOTTOMSTACK
    ADD.L   D2,D0
    JSR -132(A6)        ; --> FORBID
    EXG.L   D0,A7
    MOVE.L  D0,-(A7)
    ADD.L   #1,A7           ; SIZE IS PATCHED IN
NSLINKC2:
    LINK    A4,#-4
NSREALSTART:
    JSR -138(A6)        ; --> PERMIT
    MOVE.L  D6,-64(A4)

    MOVE.L  A6,-40(a4)
    MOVE.L  A7,-4(A4)
    LEA     A4STORAGE_NOST(PC),A1
    MOVE.L  A4,(A1)

NSMIDC:
NSGLOBJUMP:
    JSR NSGLOBJUMP
NSEXITC:
    JSR NSEXITC
NSEXITC2:
    MOVE.L  -4(A4),A7
    MOVE.L  4.W,A6
    MOVE.L  -20(A4),A2      ; CLEANUP MEMORY
    MOVE.L  A2,D0
    BEQ.S   .3
.4: MOVE.L  A2,A1
    MOVE.L  4(A2),D0
    MOVE.L  (A2),A2
    JSR -210(A6)
    MOVE.L  A2,D0
    BNE.S   .4  
.3:
    MOVE.L  -28(A4),D2      ; EXITCODE
    UNLK    A4
NSENDC2:
    ADD.L   #1,A7
    MOVE.L  #$20000,D0
    MOVE.L  (A7)+,A1
    EXG.L   A1,A7
    SUBA.L  D0,A1
    JSR -210(A6)
NSST2:
    MOVE.L  D2,D0
    RTS
NSENDC:
;*-*
;; Other!

OTHEREXITCODE:
    MOVE.W  #11,CURSPOT
    BSR BUILDDELEGATECONSTRUCTORS
    BSR FIXSTARTUPCODE
    RTS


OTHERINITCODE:
    MOVEM.L D0-A6,-(A7)
    LEA STCNAME,A0
    LEA LIBLIST+4,A1
.L1:
    MOVe.L  A0,A3
    MOVE.L  LIB_NEXT(A1),D0
    BEQ ERROR42
    MOVE.L  D0,A1
    CMP.W   #2,LIB_TYPE(A1)
    BNE .L1
    MOVE.L  LIB_NAME(A1),A2
.L2:
    CMP.B   (A2)+,(A3)+
    BNE .L1
    TST.B   -1(A3)
    BNE .L2

    MOVE.L  LIB_CODE(A1),STARTUP_CODE
    MOVE.L  LIB_CLEN(A1),STARTUP_SIZE
    MOVE.L  LIB_XTNS(A1),STARTUP_XTNS
    MOVE.L  A1,STARTUP_NODE
    MOVEM.L (A7)+,D0-A6

    MOVE.L  CURACODE,A4
    MOVE.L  A4,A6

    MOVE.L  STARTUP_CODE,A0
    MOVE.L  STARTUP_SIZE,D0
    LSR.W   #1,D0
    SUBQ.L  #1,D0
.LOOP:
    MOVE.W  (A0)+,(A4)+
    DBF D0,.LOOP

    BSR FIXSTARTUPCODE2

    BSR FIXPROCCODE

    MOVEM.L  A0/A6,-(A7)
    MOVE.L  CURACODE,A6
    MOVE.L  STARTUP_NODE,A0
    BSR FIXRELOC
    MOVEM.L (A7)+,A0/A6

    MOVE.L  A4,CURACODE
    RTS

;; FIXSTARTUPCODE
FIXSTARTUPCODE:
    MOVEM.L D0-A6,-(A7)
    MOVE.L  ACODE,A0
    MOVE.L  STARTUP_XTNS,A1
.X_LOOP:
    MOVE.L  (A1)+,D0
    BNE.S   .X_CONT
    MOVEM.L (A7)+,D0-A6
    RTS
.X_CONT:
    MOVE.L  D0,D1
    ROL.L   #8,D1
    AND.L   #255,D1
    AND.L   #$FFFFFF,D0

    MOVE.L  A1,A5
    LOWER2 A1,D2
    MOVE.L  A5,A1

    CMP.W   #$81,D1
    BEQ     .x81
    CMP.W   #$83,D1
    BEQ     .x83

    LSL.L   #2,D0
    ADD.L   D0,A1
    MOVE.L  (A1)+,D0
    CMP.W   #$80,D1
    BMI .X_LOOP
    LSL.L   #2,D0
    ADD.L   D0,A0
    BRA     .X_LOOP
;; Check
.CHECKNAME:
    MOVE.L  A1,-(A7)
    MOVEQ   #0,D2
.CHECKTST:
    CMPM.B  (A1)+,(A2)+
    BNE .CHECKF
    TST.B   -1(A1)
    BNE .CHECKTST
    MOVEQ   #-1,D2
.CHECKF:
    MOVE.L  (A7)+,A1
    RTS
;*-*
;; 0x81
.x81:
    LEA ._SETUP(PC),A2
    BSR .CHECKNAME
    TST.L   D2
    BNE .x81_SETUP

    LEA ._DELMEM(PC),A2
    BSR .CHECKNAME
    TST.L   D2
    BNE .x81_DELMEM

    LEA ._STKSIZE(PC),A2
    BSR .CHECKNAME
    TST.L   D2
    BNE .x81_STKSIZE

    MOVEQ   #0,D1
    MOVE.W  OSVERSION,D1
    LEA .OSVERSION(PC),A2
    BSR .CHECKNAME
    TST.L   D2
    BNE .x81_FILL

    MOVE.W  ASMCPU,D1
    LEA .CPUFLAGS(PC),A2
    BSR .CHECKNAME
    TST.L   D2
    BNE .x81_FILL

    LEA ._CLEANUP(PC),A2
    BSR .CHECKNAME
    TST.L   D2
    BNE .x81_CLEANUP

    CLR.W   ERRWHERE
    BRA ERROR42

;; names
._SETUP:
    DC.B    '_setup',0
._CLEANUP:
    DC.B    '_cleanup',0
._DELMEM:
    DC.B    '_delmem',0
._STKSIZE:
    DC.B    '_stksize',0
    EVEN
;*-*
;; subcodes
;; Fill
.x81_FILL:
    LSL.L   #2,D0
    ADD.L   D0,A1
    MOVE.L  (A1)+,D2
    SUBQ.L  #1,D2
.x81_FILL_LOOP:
    MOVE.L  A0,A4
    ADD.L   (A1)+,A4
    MOVE.L  D1,(A4)
    DBF D2,.x81_FILL_LOOP
    BRA .X_LOOP
;*-*
;; SETUP
.x81_SETUP:
    LSL.L   #2,D0
    ADD.L   D0,A1
    MOVE.L  (A1)+,D2
    SUBQ.L  #1,D2
.x81_SETUP_LOOP:
    MOVE.L  A0,A4
    ADD.L   (A1)+,A4
    MOVEQ   #5,D0
    MOVEm.L  D1/A0,-(A7)
    JSR ADDBRANCHRELOC
    MOVEm.L  (a7)+,d1/a0
    DBF D2,.x81_SETUP_LOOP
    BRA .X_LOOP
;*-*
;; CLEANUP
.x81_CLEANUP:
    LSL.L   #2,D0
    ADD.L   D0,A1
    MOVE.L  (A1)+,D2
    SUBQ.L  #1,D2
    BSET    #6,ICODEPREFS+3
.x81_CLEANUP_LOOP:
    MOVE.L  A0,A4
    ADD.L   (A1)+,A4
    MOVEQ   #8,D0
    MOVEm.L  D1/A0,-(A7)
    JSR ADDBRANCHRELOC
    MOVEm.L  (a7)+,d1/a0
    DBF D2,.x81_CLEANUP_LOOP
    BRA .X_LOOP
;*-*
;; DELMEM
.x81_DELMEM:
    LSL.L   #2,D0
    ADD.L   D0,A1
    MOVE.L  (A1)+,D2
    SUBQ.L  #1,D2
.x81_DELMEM_LOOP:
    MOVE.L  A0,A4
    ADD.L   (A1)+,A4
    MOVE.L  TOTALDELSIZE(PC),(A4)
    DBF D2,.x81_DELMEM_LOOP
    BRA .X_LOOP
;*-*
;; STKSIZE
.x81_STKSIZE:
    LSL.L   #2,D0
    ADD.L   D0,A1
    MOVE.L  (A1)+,D2
    SUBQ.L  #1,D2
    MOVE.L  TOTALDELSIZE(PC),D1
    ADD.L   MINSTACK,D1
    ADD.L   GLOBSTACK,D1
    BSR .x81_STKSIZE_CHECK
.x81_STKSIZE_LOOP:
    MOVE.L  A0,A4
    ADD.L   (A1)+,A4
    MOVE.L  D1,(A4)
    DBF D2,.x81_STKSIZE_LOOP
    BRA .X_LOOP

.x81_STKSIZE_CHECK:
    MOVE.L  CODESTACK,D3
    BEQ     .x81_STKSIZE_EXIT2
    CMP.L   D1,D3
    BPL.S   .x81_STKSIZE_CHECK2
    BSET    #2,WARNINGS+3
.x81_STKSIZE_CHECK2:
    ADD.L   #4000,D1
    CMP.L   D1,D3
    BPL.S   .x81_STKSIZE_EXIT
    BSET    #1,WARNINGS+3
    BCLR    #2,WARNINGS+3
.x81_STKSIZE_EXIT:
    RTS
.x81_STKSIZE_EXIT2:
    ADD.L   #MINSTACKSIZE,D1
    RTS
;*-*
;*-*
;*-*
;; 0x83
.x83:
    MOVE.W  NRGLOB,D1
    LEA ._STKFRAME(PC),A2
    BSR .CHECKNAME
    TST.L   D2
    BNE .x83_FILL

    MOVEQ   #-44,D1
    LEA .DBASE(PC),A2
    BSR .CHECKNAME
    TST.L   D2
    BNE .x83_FILL

    MOVEQ   #-48,D1
    LEA .IBASE(PC),A2
    BSR .CHECKNAME
    TST.L   D2
    BNE .x83_FILL

    MOVEQ   #-52,d1
    LEA .GBASE(PC),A2
    BSR .CHECKNAME
    TST.L   D2
    BNE .x83_FILL

    MOVEQ   #-8,d1
    LEA .SOUT(PC),A2
    BSR .CHECKNAME
    TST.L   D2
    BNE .x83_FILL

    MOVEQ   #-16,d1
    LEA .SRAST(PC),A2
    BSR .CHECKNAME
    TST.L   D2
    BNE .x83_FILL

    MOVEQ   #-32,d1
    LEA .ARG(PC),A2
    BSR .CHECKNAME
    TST.L   D2
    BNE .x83_FILL

    MOVEQ   #-36,d1
    LEA .WBMSG(PC),A2
    BSR .CHECKNAME
    TST.L   D2
    BNE .x83_FILL

    MOVEQ   #-56,D1
    LEA .SBBASE(PC),A2
    BSR .CHECKNAME
    TST.L   D2
    BNE .x83_FILL

    MOVEQ   #-60,D1
    LEA .STBASE(PC),A2
    BSR .CHECKNAME
    TST.L   D2
    BNE .x83_FILL

    MOVE.L  #-96,D1
    LEA .XCPI(PC),A2
    BSR .CHECKNAME
    TST.L   D2
    BNE .x83_FILL

    MOVE.L  #-92,D1
    LEA .SIN(PC),A2
    BSR .CHECKNAME
    TST.L   D2
    BNE .x83_FILL

    MOVE.L  #-120,D1
    LEA .POOL(PC),A2
    BSR .CHECKNAME
    TST.L   D2
    BNE .x83_FILL

    MOVE.L  #-124,D1
    LEA .UBASE(PC),A2
    BSR .CHECKNAME
    TST.L   D2
    BNE .x83_FILL

    MOVE.L  #-4,D1
    LEA .STKRET(PC),A2
    BSR .CHECKNAME
    TST.L   D2
    BNE .x83_FILL

    MOVE.L  #-20,D1
    LEA .MEMLIST(PC),A2
    BSR .CHECKNAME
    TST.L   D2
    BNE .x83_FILL

    MOVE.L  #-24,D1
    LEA .EXITCODE(PC),A2
    BSR .CHECKNAME
    TST.L   D2
    BNE .x83_FILL

    MOVE.L  #-40,D1
    LEA .EBASE(PC),A2
    BSR .CHECKNAME
    TST.L   D2
    BNE .x83_FILL

    MOVE.L  #-28,D1
    LEA .RETVAL(PC),A2
    BSR .CHECKNAME
    TST.L   D2
    BNE .x83_FILL

    MOVE.L  #-64,D1
    LEA .BTMSTK(PC),A2
    BSR .CHECKNAME
    TST.L   D2
    BNE .x83_FILL

    MOVE.L  #-128,D1
    LEA .FILELIST(PC),A2
    BSR .CHECKNAME
    TST.L   D2
    BNE .x83_FILL

    MOVEQ   #0,D1
    MOVE.W  OSVERSION,D1
    LEA .OSVERSION(PC),A2
    BSR .CHECKNAME
    TST.L   D2
    BNE .x83_FILL

    MOVE.W  ASMCPU,D1
    LEA .CPUFLAGS(PC),A2
    BSR .CHECKNAME
    TST.L   D2
    BNE .x83_FILL

    CLR.W   ERRWHERE
    BRA ERROR42
;; names
.STKRET:
    DC.B    '_stkreturn',0
.MEMLIST:
    Dc.b    '_memlist',0
.EXITCODE:
    DC.B    '_exitcode',0
.BTMSTK:
    dc.b    '_bottomstk',0
.FILELIST:
    DC.B    '_filelist',0
.RETVAL:
    DC.B    '_clireturnvalue',0
._STKFRAME:
    DC.B    '_stkframe',0
.DBASE:
    DC.B    '_dosbase',0
.IBASE:
    DC.B    '_intuitionbase',0
.GBASE:
    DC.B    '_gfxbase',0
.EBASE:
    DC.B    '_execbase',0
.SOUT:
    DC.B    '_stdout',0
.SRAST:
    DC.B    '_stdrast',0
.ARG:
    DC.B    '_arg',0
.WBMSG:
    DC.B    '_wbmessage',0
.SBBASE:
    DC.B    '_mathieeesingbasbase',0
.STBASE:
    DC.B    '_mathieeesingtransbase',0
.XCP:
    DC.B    '_exception',0
.XCPI:
    Dc.B    '_exceptioninfo',0
.SIN:
    DC.B    '_stdin',0
.UBASE:
    DC.B    '_utilitybase',0
.POOL:
    DC.B    '_pool',0
.OSVERSION:
    DC.B    '_osversion',0
.CPUFLAGS:
    DC.B    '_cpuflags',0
    EVEN
;*-*
;; subcode(s)
;; Fill
.x83_FILL:
    LSL.L   #2,D0
    ADD.L   D0,A1
    MOVE.L  (A1)+,D2
    SUBQ.L  #1,D2
.x83_FILL_LOOP:
    MOVE.L  A0,A4
    ADD.L   (A1)+,A4
    MOVE.W  D1,(A4)
    DBF D2,.x83_FILL_LOOP
    BRA .X_LOOP
;*-*
;*-*
;*-*
;*-*
;; FIXSTARTUPCODE2
FIXSTARTUPCODE2:
    MOVEM.L D0-A6,-(A7)
    MOVE.L  ACODE,A0
    MOVE.L  STARTUP_XTNS,A1
.X_LOOP:
    MOVE.L  (A1)+,D0
    BNE.S   .X_CONT
    MOVEM.L (A7)+,D0-A6
    RTS
.X_CONT:
    MOVE.L  D0,D1
    ROL.L   #8,D1
    AND.L   #255,D1
    AND.L   #$FFFFFF,D0

    MOVE.L  A1,A5
    LOWER2  A1,D2
    MOVE.L  A5,A1

    CMP.W   #$01,D1
    BEQ     .x01

    LSL.L   #2,D0
    ADD.L   D0,A1
    MOVE.L  (A1)+,D0
    CMP.W   #$80,D1
    BMI .X_LOOP
    LSL.L   #2,D0
    ADD.L   D0,A0
    BRA     .X_LOOP
;; Check
.CHECKNAME:
    MOVE.L  A1,-(A7)
    MOVEQ   #0,D2
.CHECKTST:
    CMPM.B  (A1)+,(A2)+
    BNE .CHECKF
    TST.B   -1(A1)
    BNE .CHECKTST
    MOVEQ   #-1,D2
.CHECKF:
    MOVE.L  (A7)+,A1
    RTS
;*-*
;; x01
.x01:
    LEA ._A4STORAGE(PC),A2
    BSR .CHECKNAME
    TST.L   D2
    BNE .x01_A4STORAGE

    CLR.W   ERRWHERE
    BRA ERROR42
;; names
._A4STORAGE:
    DC.B    '_a4storage',0
    EVEN
;*-*
;; subcodes
;; A4STORAGE
.x01_A4STORAGE:
    LSL.L   #2,D0
    ADD.L   D0,A1
    MOVE.L  (A1)+,A4STORAGEADR
    BRA .X_LOOP
;*-*
;*-*
;*-*
;*-*
;*-*

A4STORAGEADR:
    DC.L    A4STORAGE_NOST-NSFIRSTSTART

; NEEDS TO GEN T/F IN D2
;; Additional code - init
MATHINITETC:          ; A4=CODE
    BTST    #5,CODEPREFS
    BEQ     ._1
    RTS
._1:
    BTST    #6,ICODEPREFS+3
    BNE .0
    BTST    #2,CODEPREFS
    BEQ.S   .0
    RTS
.0: MOVE.W  .T(PC),(A4)+
    BTST    #3,CODEPREFS+1
    BEQ.S   .1
    LEA OPENMATHBAS(PC),A0
    MOVE.L  #OPENBASEND,D0
    BSR CCOPY
.1: BTST    #4,CODEPREFS+1
    BEQ.S   .2
    LEA OPENMATHTRANS(PC),A0
    MOVE.L  #OPENTRANSEND,D0
    BSR CCOPY
.2: BTST    #7,CODEPREFS
    BEQ     .3
    BTST    #4,CODEPREFS
    BNE     ERROR50
    LEA OPENUTIL(PC),A0
    MOVE.L  #OPENUTILEND,D0
    BSR CCOPY
.3: BTST    #6,CODEPREFS
    BEQ     .4
    BTST    #4,CODEPREFS
    BNE     ERROR50
    LEA OPENPOOL(PC),A0
    MOVE.L  #OPENPOOLEND,D0
    BSR CCOPY
.4: BTST    #3,CODEPREFS
    BEQ     .5
    LEA OPENFILES(PC),A0
    MOVE.L  #OPENFILESEND,D0
    BSR CCOPY
.5: CMP.W   #37,OSVERSION
    BLT     .6
    BTST    #4,CODEPREFS
    BNE     .6
    LEA OPENCON37P(PC),A0
    MOVE.L  #OPENCON37PEND,D0
    BSR CCOPY
.6: TST.W   ASMCPU
    BEQ     .7
    BTST    #4,CODEPREFS
    BNE     .7
    LEA CHECK_CPU_FPU(PC),A0
    MOVE.W  ASMCPU,2(A0)
    MOVE.L  #CHECK_CPU_FPU_END,D0
    BSR CCOPY
.7: BTST    #0,CODEPREFS+2
    BEQ     .8
    BTST    #4,CODEPREFS
    BNE     .8
    LEA CHECK_OSVERSION(PC),A0
    MOVE.W  OSVERSION,2(A0)
    MOVE.L  #CHECK_OSVERSION_END,D0
    BSR CCOPY
.8:
    RTS
.T: MOVEQ   #-1,D2
;*-*
;; Additional code - exit
MATHEXITETC:
    TSTMOD
    BNE .EX
    BTST    #5,CODEPREFS
    BNE .EX
    BTST    #6,ICODEPREFS+3
    BNE .0
    BTST    #2,CODEPREFS
    BNE .EX
.0:
    MOVE.L  CURACODE,A4     ; A4=CODE
    MOVEQ   #8,D0
    JSR ADDLABEL
    BTST    #3,CODEPREFS+1
    BEQ.S   .1
    LEA CLOSEMATHBAS(PC),A0
    MOVE.L  #CLOSEBASEND,D0
    BSR CCOPY
.1: BTST    #4,CODEPREFS+1
    BEQ.S   .2
    LEA CLOSEMATHTRANS(PC),A0
    MOVE.L  #CLOSETRANSEND,D0
    BSR CCOPY
.2: BTST    #7,CODEPREFS
    BEQ     .3
    BTST    #4,CODEPREFS
    BNE     ERROR50
    LEA CLOSEUTIL(PC),A0
    MOVE.L  #CLOSEUTILEND,D0
    BSR CCOPY
.3: BTST    #6,CODEPREFS
    BEQ     .4
    BTST    #4,CODEPREFS
    BNE     ERROR50
    LEA CLOSEPOOL(PC),A0
    MOVE.L  #CLOSEPOOLEND,D0
    BSR CCOPY
.4: BTST    #3,CODEPREFS
    BEQ     .5
    LEA CLOSEFILES(PC),A0
    MOVE.L  #CLOSEFILESEND,D0
    BSR CCOPY
.5: CMP.W   #37,OSVERSION
    BLT     .5_5
    LEA CLOSECON37P(PC),A0
    MOVE.L  #CLOSECON37PEND,D0
    BSR CCOPY
    BRA .6
.5_5:
    LEA CLOSECON33_37(PC),A0
    MOVE.L  #CLOSECON33_37END,D0
    BSR CCOPY
.6:
    MOVE.W  .RTS(PC),(A4)+
    MOVE.L  A4,CURACODE
    JSR CHECK3
.EX:
.RTS:   RTS
;*-*

;; Copy
CCOPY:
    SUB.L   A0,D0
    LSR.L   #1,D0
    SUBQ.L  #1,D0
.XL:MOVE.W  (A0)+,(A4)+
    DBRA    D0,.XL
    RTS
;*-*

;; Check CPU/FPU
CHECK_CPU_FPU:
    MOVE.W  #0,D0
    MOVE.L  $4.W,A6
    AND.W   296(A6),D0
    BNE     CHECK_CPU_FPU_END
    BRA.S   .X
.M: DC.B    'This program requires a better CPU/FPU',10,0
.X:
    MOVE.L  -44(A4),A6
    LEA     .M(PC),A0
    MOVE.L  A0,D2
    MOVE.L  -8(A4),D1
    MOVE.L  #.X-.M,D3
    JSR     -48(A6)
    MOVE.L  -24(A4),A0
    move.l  #20,-28(a4)
    JMP     (A0)
CHECK_CPU_FPU_END:
;*-*
;; Check OSVersion
CHECK_OSVERSION:
    MOVE.W  #0,D0
    MOVE.L  $4.W,A6
    CMP.W   20(a6),D0
    BLE     CHECK_OSVERSION_END
    BRA.S   .X
.M: DC.B    'This program requires a newer OS',10,0
.X:
    MOVE.L  -44(A4),A6
    LEA     .M(PC),A0
    MOVE.L  A0,D2
    MOVE.L  -8(A4),D1
    MOVE.L  #.X-.M,D3
    JSR     -48(A6)
    MOVE.L  -24(A4),A0
    move.l  #20,-28(a4)
    JMP     (A0)
CHECK_OSVERSION_END:
;*-*
;; OpenCon37+
OPENCON37P:
    BRA.S   .X
    DC.B    'CON:0/11/640/80/Output/AUTO/CLOSE/WAIT',0
    EVEN
.X: MOVE.L  -44(A4),A6
    LEA     OPENCON37P+2(PC),A0
    MOVE.L  A0,D1
    MOVE.L  #1006,d2
    JSR     -30(a6)
    MOVE.L  D0,-12(A4)
    TST.L   -8(A4)
    BNE.S   OPENCON37PEND
    MOVE.L  D0,-8(A4)
OPENCON37PEND:
;*-*
;; OpenPool
OPENPOOL:
    MOVE.L  #$10001,D0
    MOVE.L  #10240,D1
    MOVE.L  #256,D2
    MOVE.L  $4,A6
    JSR     -696(A6)
    MOVE.L  D0,-120(A4)
OPENPOOLEND:
;*-*
;; OpenUtil
OPENUTIL:
    BRA.S   OPENUTIL2
UTILNAME:
    DC.B    "utility.library",0
    EVEN
OPENUTIL2:
    MOVE.L  $4.W,A6
    LEA UTILNAME(PC),A1
    MOVEQ   #33,D0
    JSR -552(A6)
    MOVE.L  D0,-124(A4)
    BNE.S   OPENUTILEND
    MOVEQ   #0,D2
OPENUTILEND:
;*-*
;; OpenMathBas
OPENMATHBAS:
    BRA.S   BASCONT
INITMATH:
    DC.B    "mathieeesingbas.library",0
    EVEN
BASCONT:
    MOVE.L  4.W,A6
    LEA INITMATH(PC),A1
    MOVEQ   #33,D0
    JSR -552(A6)
    MOVE.L  D0,-56(A4)
    BNE.S   OPENBASEND
    MOVEQ   #0,D2
OPENBASEND:
;*-*
;; OpenMathTrans
OPENMATHTRANS:
    BRA.S   TRANSCONT
INITMATHT:
    DC.B    "mathieeesingtrans.library",0
    EVEN
TRANSCONT:
    MOVE.L  4.W,A6
    LEA INITMATHT(PC),A1
    MOVEQ   #33,D0
    JSR -552(A6)
    MOVE.L  D0,-60(A4)
    BNE.S   OPENTRANSEND
    MOVEQ   #0,D2
OPENTRANSEND:
;*-*
;; OpenFiles
OPENFILES:
    MOVE.L  #256*4+4,D0
    MOVE.L  #$10001,D1
    MOVE.L  $4.W,A6
    JSR     -198(A6)
    MOVE.L  D0,-128(A4)
OPENFILESEND:
;*-*
;; ClosePool
CLOSEPOOL:
    MOVE.L  $4.W,A6
    MOVE.L  -120(A4),A0
    JSR     -702(A6)
CLOSEPOOLEND:
;*-*
;; CloseUtil
CLOSEUTIL:
    MOVE.L $4.W,A6
    MOVE.L -124(A4),D0
    BEQ CLOSEUTILEND
    MOVE.L D0,A1
    JSR -414(A6)
CLOSEUTILEND:
;*-*
;; CloseMathBas
CLOSEMATHBAS:
    MOVE.L  4.W,A6
    MOVE.L  -56(A4),D0
    BEQ.S   CLOSEBASEND
    MOVE.L  D0,A1
    JSR -414(A6)
CLOSEBASEND:
;*-*
;; CloseMathTrans
CLOSEMATHTRANS:
    MOVE.L  4.W,A6
    MOVE.L  -60(A4),D0
    BEQ.S   CLOSETRANSEND
    MOVE.L  D0,A1
    JSR -414(A6)
CLOSETRANSEND:
;*-*
;; CloseFiles
CLOSEFILES:
    MOVE.L  -128(A4),D6
.LOOP:
    MOVE.L  -44(A4),A6
    MOVE.L  D6,A3
    MOVE.L  A3,D5
    MOVE.L  (A3)+,D6
    MOVE.L  #255,D7
.LOOP2:
    MOVE.L  (A3)+,D1
    BEQ.S   .SKP
    JSR     -36(A6)
.SKP:
    DBF     D7,.LOOP2
    MOVE.L  #256*4+4,D0
    MOVE.L  D5,A1
    MOVE.L  $4.W,A6
    JSR     -210(A6)
    TST.L   D6
    BNE.S   .LOOP
CLOSEFILESEND:
;*-*
;; CloseCon37+
CLOSECON37P:
    MOVE.L  -12(A4),D1
    BEQ     CLOSECON37PEND
    MOVE.L  -44(a4),A6
    JSR     -36(A6)
    CLR.L   -12(A4)
CLOSECON37PEND:
;*-*
;; CloseCon33-37
CLOSECON33_37:
    MOVE.L  -12(A4),D1
    BEQ     CLOSECON33_37END
    MOVE.L  -44(a4),A6
    MOVE.L  D1,D4
    MOVEQ   #0,D2
    MOVEQ   #0,D3
    JSR     -42(A6)
    MOVE.L  D4,D1
    JSR     -36(A6)
    CLR.L   -12(A4)
CLOSECON33_37END:
;*-*

;; Add global vars
ADDGLOBVARS:
    BTST    #3,CODEPREFS+3
    BEQ.S   .C
    RTS
.C: GETM    A5
    LEA GLOBVARTAB(PC),A4
.1: MOVE.L  (A4)+,D7
    MOVE.L  (A4)+,D6
    BEQ.S   .2
    CMP.L   #GLOBVARTAB+24,A4
    BNE.S   .NARG
    LEA 9(A5),A1
    MOVE.L  A1,ARGBYTE
.NARG:  MOVE.L  D7,A1
    HASH    A1,D0,D1
    LSL.L   #2,D0
    MOVE.L  #IDENTHASH,A1
    ADD.L   D0,A1
    MOVE.L  (A1),(A5)+
    MOVE.L  A5,(A1)
    MOVE.L  D7,(A5)+        ; SET ASCIIPTR
    MOVE.B  #GLOBV,(A5)+    ; SET GLOBAL(=2)
    MOVE.B  #2,(A5)+        ; UNREF+SYSTEMVAR
    CLR.L   (A5)+
    MOVE.W  D6,(A5)+        ; SET OFFS
    BRA.S   .1
.2: DONEH   A5
BURP:   MOVEQ   #NRSYSCONST,D0
    SUBQ.W  #1,D0
    GETM    A0
    LEA SYSCONST(PC),A1
.3: MOVE.L  (A1)+,A2
    MOVE.L  A2,A3
    HASH    A3,D1,D2
    LSL.L   #2,D1
    ADD.L   #CONSTHASH,D1
    MOVE.L  D1,A3
    MOVE.L  (A3),(A0)
    MOVE.L  A0,(A3)
    ADDQ.L  #4,A0
    MOVE.L  A2,(A0)+
    CMPA.L  #SYSCONST+36,A1
    BNE.S   .SL
    MOVE.L  A0,STRLENADR
.SL:    MOVE.L  (A1)+,(A0)+
    CLR.W   (A0)+
    DBRA    D0,.3
    DONEH   A0
    RTS

NRSYSCONST  = 20
STRLENADR:  DC.L    0

SYSCONST:
    DC.L    .1,-1,.2,0,.3,0,.4,-1,.5,0,.6,120,.7,1005,.8,1006,.9,0,.10,0
    DC.L    .11,0,.12,1,.13,2,.14,.3,.15,$80000000,.16,-1,.17,-1,.18,0,.19,1,.20,1004

.1: DC.B    "TRUE",0
.2: DC.B    "FALSE",0
.3: DC.B    "NIL",0
.4: DC.B    "ALL",0
.5: DC.B    "STRLEN",0      ; MUST BE #5
.6: DC.B    "GADGETSIZE",0
.7: DC.B    "OLDFILE",0
.8: DC.B    "NEWFILE",0
.9: DC.B    "EMPTY",0
.10:DC.B    "TAG_DONE",0
.11:DC.B    "TAG_END",0
.12:DC.B    "TAG_IGNORE",0
.13:DC.B    "TAG_MORE",0
.14:DC.B    "TAG_SKIP",0
.15:DC.B    "TAG_USER",0
.16:DC.B    "OFFSET_BEGINNING",0
.17:DC.B    "OFFSET_BEGINING",0
.18:DC.B    "OFFSET_CURRENT",0
.19:DC.B    "OFFSET_END",0
.20:DC.B    "READWRITE",0
    EVEN

ARGBYTE:  DC.L    0       ; EXACT BYTE LOC OF "arg".FLAGS

GLOBVARTAB:
    DC.L    .1,-8
    DC.L    .2,-12
    DC.L    .3,-32          ; must be 16..24 bytes offset
    DC.L    .4,-40
    DC.L    .5,-44
    DC.L    .6,-48
    DC.L    .7,-52
    DC.L    .8,-16
    DC.L    .9,-36
;   DC.L    .10,-56
    DC.L    .11,-84
    DC.L    .12,-92
    DC.L    .13,-96
    DC.L    .14,-120
    DC.L    .15,-124
    DC.L    0,0

.1: DC.B    "stdout",0
.2: DC.B    "conout",0
.3: DC.B    "arg",0         ; MUST BE 3RD
.4: DC.B    "execbase",0
.5: DC.B    "dosbase",0
.6: DC.B    "intuitionbase",0
.7: DC.B    "gfxbase",0
.8: DC.B    "stdrast",0
.9: DC.B    "wbmessage",0
;.10:   DC.B    "mathieeesingbasbase",0
.11:    DC.B    "exception",0
.12:    DC.B    "stdin",0
.13:    DC.B    "exceptioninfo",0
.14:    DC.B    "__pool",0
.15:    DC.B    "utilitybase",0
    EVEN
;*-*
;; Init funcs
INITFUNCS:            ; init efuncs
    MOVE.L  #EFUNCBYTE,A0
    MOVE.L  #EFUNCRAISE,A1
    MOVE.W  #NREFUNC,D0
    SUBQ.W  #1,D0
    MOVEQ   #0,D1
.1: MOVE.B  D1,(A0)+
    MOVE.W  D1,(A1)+
    ADDQ.L  #8,A1
    DBRA    D0,.1
    RTS
;*-*
;; Link delegate constructors
LINKDELEGATECONSTRUCTORS:
    LEA OLIST+4,A0
.XL:MOVE.L  -(A0),D0
    BEQ .X
    MOVE.L  D0,A0
    TST.W   ODEL(A0)
    BEQ.S   .XL
    BTST    #1,OFLAGS(A0)
    BNE.S   .XL
    MOVE.L  CURACODE,A4     ; 32K VERWEG !
    MOVE.L  A4,ODCODE(A0)       ; SET DCODE FOR THIS OBJECT
    MOVE.L  OSUPER(A0),D0
    BEQ.S   .NSUP
    MOVE.L  D0,A2           ; A2=SUPER
    TST.W   (A2)            ; CHECK IF SUPER HAS DELCONSTRUCTOR
    BEQ.S   .NSUP
    GETM    A1
    MOVE.L  OACC(A2),(A1)       ; ADD TO ACCESSLIST OF SUPER
    MOVE.L  A1,OACC(A2)
    ADDQ.L  #4,A1
    MOVE.W  .J(PC),(A4)+        ; MAKE JSR SUPERDELEGATECONSTR.
    MOVE.L  A4,(A1)+
    MOVE.W  #1,(A1)+
    DONEM   A1
    CLR.L   (A4)+
.NSUP:  MOVE.W  .GL(PC),(A4)+
    MOVEQ   #0,D0
    MOVE.W  OSIZE(A0),D0
    MOVE.L  D0,(A4)+
    MOVE.L  OMETHOD(A0),A1      ; A1=METHODLIST
.ML:    BTST    #0,M_FLAGS(A1)
    BNE.S   .N
    MOVE.L  M_PROC(A1),A2
    MOVE.L  14(A2),A2       ; A2=IDENT
    MOVE.L  .MLEA(PC),(A4)+
    MOVE.W  .MLEA2(PC),NEWOP
    MOVE.W  10(A2),D0
    MOVE.L  A0,A3
    JSR ADDBRANCH
    MOVE.L  A3,A0
    MOVE.W  .MM(PC),(A4)+
    MOVE.W  M_OFF(A1),(A4)+
.N: MOVE.L  (A1),A1
    MOVE.L  A1,D0
    BNE.S   .ML
    MOVE.W  .RTS(PC),(A4)+
    MOVE.L  A4,CURACODE
    JSR CHECK3
    BRA .XL
.X: RTS
.J: JSR .X
.MLEA:  LEA .X(PC),A1
.MLEA2: LEA .X,A1
.MM:    MOVE.L  A1,4(A0)
.RTS:   RTS
.GL:    MOVE.L  #1,(A0)
;*-*
;; Link funcs
LINKFUNCS:
    MOVEM.L A6/D7,-(A7)
    TSTMOD
    BNE.S   .X
    LEA     EFUNCFLAGSTAB,A6
    MOVE.L  #EFUNCBYTE,A3
    MOVE.W  #NREFUNC,D2
    SUBQ.W  #1,D2
    MOVE.L  #EFUNCTAB,D4
    MOVEQ   #0,D3
    MOVE.L  CURACODE,A4     ; 32K VERWEG !
.1: TST.B   (A3)+
    BEQ.S   .2
    MOVE.W  D3,D0           ;
    LSL.W   #1,D0           ;
    MOVE.W  0(A6,D0),D7     ;

    MOVE.L  D4,A1
    MOVE.L  D3,D0
    MULU    #EFUNCENTRYSIZE,D0
    ADD.L   D0,A1
    MOVE.L  4(A1),A2       ; BEG CODE
    MOVE.L  8(A1),D1       ; END CODE
    MOVE.L  D3,D0
    ADD.L   #10,D0
    JSR ADDLABEL
    SUB.L   A2,D1
    LSR.L   #1,D1
    SUBQ.L  #1,D1
.3: MOVE.W  (A2)+,(A4)+
    DBRA    D1,.3
.2: ADDQ.L  #1,D3
    MOVE.L  A4,CURACODE
    JSR CHECK3
    DBRA    D2,.1
.X: MOVEM.L (A7)+,A6/D7
    RTS
;*-*
;; Link lib
LINKLIB:
    MOVEM.L D6/D7/A0-A2/A5/A6,-(A7)
    MOVE.L  #LIBHASH,A2
    MOVE.l  #255,D6
    MOVE.L  CURACODE,A4
.1:
    MOVE.L  (A2)+,D0
.LOOP:
    TST.L   D0
    BEQ.S   .EXIT
    MOVE.L  D0,A0
    MOVE.L  LIB_NEXT(A0),D0
    TST.L   LIB_USED(A0)
    BEQ     .LOOP
    CMP.W   #1,LIB_TYPE(A0)
    BEQ     .LOOP
    CMP.W   #2,LIB_TYPE(A0)
    BEQ     .LOOP

    MOVE.L  A4,A6
    MOVE.L  A4,LIB_USED(A0)
    MOVE.L  LIB_CLEN(A0),d7
    move.l  LIB_CODE(a0),a1

    lsr.l   #2,d7
    subq.l  #1,d7
    move.l  a4,a6
.COPY:
    move.l  (a1)+,(a4)+
    dbf     d7,.COPY
    bsr     FIXRELOC
    bra     .LOOP
.EXIT:
    DBRA    D6,.1
    MOVE.L  A4,CURACODE
    movem.l (a7)+,D6/d7/A0-A2/A5/a6
    rts
;*-*

;; FixReloc
FIXRELOC:
; A6 - copied code start
; A0 - code node
    MOVEM.L D0-A6,-(A7)
    MOVE.L  LIB_RELO(A0),d1       ; reloc
    BEQ     .EXIT
    MOVE.L  D1,A1

    cmp.l   #$3EC,(A1)+
    BNE     ERROR51
    move.l  (a1)+,d3
    addq.l  #4,a1           ; code
    subq.l  #1,d3
.LOOP:
    MOVE.L  (a1)+,d2
    move.l  a6,a4
    add.l   d2,a4
    move.l  (a4),d0

    add.l   a6,d0
    sub.l   ACODE,d0
    jsr     FORCEABSHERE
    dbf D3,.LOOP
.EXIT:
    MOVEM.L (A7)+,D0-A6
    RTS
;*-*
;*-*
;; GenVars
; THESE ARE SHARED!

GVA0D0D5_0:
    GENVAR  0,A0,D0,D5      ; IIII
    RTS


GVA0D0_0:
    GENVAR  0,A0,10(A0),D0      ; III
    RTS
GVA1D0_0:
    GENVAR  0,A1,10(A1),D0      ; III
    RTS
GVA0D1_0:
    GENVAR  0,A0,10(A0),D1      ; IIIII
    RTS
GVA0D2_0:
    MOVE.L  D1,-(A7)
    MOVE.L  D2,D1
    BSR     GVA0D1_0        ; II
    MOVE.L  (A7)+,D1
    RTS
GVA0D3_0:
    MOVE.L  D1,-(A7)
    MOVE.L  D3,D1
    BSR.W   GVA0D1_0        ; I
    MOVE.L  (A7)+,D1
    RTS
GVA0D4_0:
    MOVE.L  D1,-(A7)
    MOVE.L  D4,D1
    BSR.W   GVA0D1_0        ; I
    MOVE.L  (A7)+,D1
    RTS
GVA1D2_0:
    GENVAR  0,A1,10(A1),D2      ; I
    RTS
GVA6D3_0:
    GENVAR  0,A6,10(A6),D3      ; I
    RTS


GVA0D0_9:
    GENVAR  9,A0,10(A0),D0      ; II
    RTS
GVA0D2_9:
    MOVE.L  D0,-(A7)
    MOVE.L  D2,D0
    BSR.W   GVA0D0_9        ; I
    MOVE.L  (A7)+,D0
    RTS
GVA0D4_9:
    MOVE.L  D0,-(A7)
    MOVE.L  D4,D0
    BSR.W   GVA0D0_9        ; II
    MOVE.L  (A7)+,D0
    RTS
GVA0D5_9:
    MOVE.L  D0,-(A7)
    MOVE.L  D5,D0
    BSR.W   GVA0D0_9        ; I
    MOVE.L  (A7)+,D0
    RTS
GVA0D7_9:
    MOVE.L  D0,-(A7)
    MOVE.L  D7,D0
    BSR.W   GVA0D0_9        ; I
    MOVE.L  (A7)+,D0
    RTS

GVA1D2_9:
    GENVAR  9,A1,10(A1),D2      ; I
    RTS
GVA6D0_9:
    GENVAR  9,A6,10(A6),D0      ; I
    RTS
GVA6D3_9:
    MOVE.L  D0,-(A7)
    MOVE.L  D3,D0
    BSR.W   GVA6D0_9        ; II
    MOVE.L  (A7)+,D0
    RTS
;*-*

;; Inlines
;; Table
INLINETAB:
    DC.L    .E,INL_MUL,INL_DIV,.E,.E,.E,.E,.E,.E,.E   ; 0-9
    DC.L    .E,.E,INL_LONG,INL_INT,INL_CHAR,INL_PLONG,INL_PINT,INL_PCHAR,.E,INL_CLEANUP   ; 10-9
    DC.L    .E,.E,INL_AND,INL_OR,INL_NOT,.E,.E,.E,.E,.E   ; 20-9
    DC.L    .E,.E,.E,.E,.E,.E,.E,.E,.E,.E   ; 30-9
    DC.L    .E,.E,.E,.E,.E,.E,.E,INL_MOUSEX,INL_MOUSEY,.E   ; 40-9
    DC.L    .E,.E,.E,.E,.E,.E,.E,INL_EVEN,INL_ODD,INL_EVAL   ; 50-9
    DC.L    .E,.E,.E,INL_ABS,INL_SHL,INL_SHR,.E,.E,.E,.E   ; 60-9
    DC.L    .E,.E,.E,.E,.E,INL_MSGCODE,INL_MSGQUAL,INL_MSGIADR,.E,INL_RNDQ   ; 70-9
    DC.L    INL_MOD,INL_EOR,.E,.E,.E,.E,.E,.E,.E,.E   ; 80-9
    DC.L    .E,.E,.E,.E,.E,.E,.E,.E,INL_FABS,INL_FFLOOR   ; 90-9
    DC.L    INL_FCEIL,INL_FSIN,INL_FCOS,INL_FTAN,INL_FEXP,INL_FLOG,INL_FPOW,INL_FSQRT,INL_FLOG10,.E   ; 100-9
    DC.L    .E,.E,.E,.E,.E,.E,.E,.E,INL_CAR,INL_CDR   ; 110-9
    DC.L    .E,.E,INL_FATAN,INL_FSINCOS,INL_FSINH,INL_FCOSH,INL_FTANH,INL_FTIEEE,INL_FFIEEE,INL_FASIN   ; 120-9
    DC.L    INL_FACOS,.E,.E,.E,.E,.E,.E,.E,.E,.E   ; 130-9
    DC.L    .E,.E,.E,.E,.E,.E,.E,.E,.E,.E   ; 140-9
    DC.L    .E,.E,.E,INL_GETA4,.E,.E,.E,.E,.E,.E   ; 150-9
    DC.L    .E,.E,.E,.E,.E,.E,.E,.E,.E,.E   ; 160-9
    DC.L    .E,.E,.E,.E,.E,.E,.E,.E,.E,.E   ; 170-9
;; ERROR
.E:
    JMP     ERROR0
;*-*
;*-*
;; GetA4
INL_GETA4:
    tst.l   LIBINFO
    BEQ .1
    JMP ERROR86
.1:
    MOVE.W  #$2879,(a4)+
    MOVE.L  A4STORAGEADR(PC),D0
    BEq ERROR89
    JSR     FORCEABSHERE
    RTS
;*-*
;; Long
INL_LONG:
    MOVEQ   #$40,D0
    BSR     EA_GETEXP
    MOVE.W  #$2010,(a4)+
    RTS
;*-*
;; Int
INL_INT:
    MOVEQ   #$40,D0
    BSR     EA_GETEXP
    MOVE.W  #$3010,(a4)+
    move.w  #$48C0,(A4)+
    RTS
;*-*
;; Char
INL_CHAR:
    MOVEQ   #$40,D0
    BSR     EA_GETEXP
    MOVE.W  #$1010,(a4)+
    BSR     EXP_EXTD0
    RTS
;*-*
;; Mul
INL_MUL:
    MOVE.L  #$F00,D0
    BSR     EA_GETEXP
    CMP.W   #COM,(A3)+
    BEQ     .1
    JMP     ERROR5
.1:
    MOVE.L  #$200,D0
    BSR     EA_GETEXP
    MOVE.W  #$201F,(A4)+        ; MOVE.L    (A7)+,D0
    MOVE.L  #$4C010c01,(a4)+    ; MULS.L    D1,D1:D0
    RTS
;*-*
;; Div
INL_DIV:
    MOVE.L  #$F00,D0
    BSR     EA_GETEXP
    CMP.W   #COM,(A3)+
    BEQ     .1
    JMP     ERROR5
.1:
    MOVE.L  #$200,D0
    BSR     EA_GETEXP
    MOVE.W  #$201F,(A4)+        ; MOVE.L    (A7)+,D0
    move.w  #$7400,(a4)+        ; MOVEQ     #0,D2
    MOVE.L  #$4C410C02,(a4)+    ; DIVS.L    D1,D2:D0
    MOVE.W  #$2202,(A4)+        ; MOVE.L    D2,D1
    RTS
;*-*
;; And
INL_AND:
    MOVE.L  #$F00,D0
    BSR     EA_GETEXP
    CMP.W   #COM,(A3)+
    BEQ     .1
    JMP     ERROR5
.1:
    MOVE.L  #$200,D0
    BSR     EA_GETEXP
    MOVE.W  #$201F,(A4)+        ; MOVE.L    (A7)+,D0
    MOVE.W  #$C081,(A4)+        ; AND.L     D1,D0
    RTS
;*-*
;; Or
INL_OR:
    MOVE.L  #$F00,D0
    BSR     EA_GETEXP
    CMP.W   #COM,(A3)+
    BEQ     .1
    JMP     ERROR5
.1:
    MOVE.L  #$200,D0
    BSR     EA_GETEXP
    MOVE.W  #$201F,(A4)+        ; MOVE.L    (A7)+,D0
    MOVE.W  #$8081,(A4)+        ; OR.W      D1,D0
    RTS
;*-*
;; Not
INL_NOT:
    MOVEQ   #0,D0
    BSR     EA_GETEXP
    MOVE.W  #$4680,(A4)+        ; NOT.L     D0
    RTS
;*-*
;; PutLong
INL_PLONG:
    MOVE.L  #$F00,D0
    BSR     EA_GETEXP           ; MOVE.L    D0,-(A7)
    CMP.W   #COM,(A3)+
    BEQ     .1
    JMP     ERROR5
.1:
    MOVEQ   #$0,D0
    BSR     EA_GETEXP
    MOVE.W  #$205f,(A4)+
    MOVE.W  #$2080,(A4)+        ; MOVE.L    D0,(A0)
    RTS
;*-*
;; PutInt
INL_PINT:
    MOVE.L  #$F00,D0
    BSR     EA_GETEXP           ; MOVE.L    D0,-(A7)
    CMP.W   #COM,(A3)+
    BEQ     .1
    JMP     ERROR5
.1:
    MOVEQ   #0,D0
    BSR     EA_GETEXP
    MOVE.W  #$205f,(A4)+
    MOVE.W  #$3080,(A4)+        ; MOVE.W    D0,(A0)
    RTS
;*-*
;; PutChar
INL_PCHAR:
    MOVE.L  #$F00,D0
    BSR     EA_GETEXP           ; MOVE.L    D0,-(A7)
    CMP.W   #COM,(A3)+
    BEQ     .1
    JMP     ERROR5
.1:
    MOVEQ   #0,D0
    BSR     EA_GETEXP
    MOVe.W  #$205F,(a4)+        ; MOVE.L    (A7)+,A0
    MOVE.W  #$1080,(A4)+        ; MOVE.B    D0,(A0)
    RTS
;*-*
;; Eor
INL_EOR:
    MOVE.L  #$F00,D0
    BSR     EA_GETEXP
    CMP.W   #COM,(A3)+
    BEQ     .1
    JMP     ERROR5
.1:
    MOVE.L  #$200,D0
    BSR     EA_GETEXP
    MOVE.W  #$201F,(A4)+        ; MOVE.L    (A7)+,D0
    MOVE.W  #$B380,(A4)+        ; EOR.L     D1,D0
    RTS
;*-*
;; Eval
INL_EVAL:
    MOVEQ   #$40,D0
    BSR     EA_GETEXP
    MOVE.W  #$4E90,(A4)+        ; JSR       (A0)
    RTS
;*-*
;; Even
INL_EVEN:
    MOVEQ   #0,D0
    BSR     EA_GETEXP
    move.l  #$8000000,(a4)+     ; BTST      #0,D0
    move.w  #$57c0,(a4)+        ; SEQ       D0
    bsr     EXP_EXTD0
    RTS
;*-*
;; Odd
INL_ODD:
    MOVEQ   #0,D0
    BSR     EA_GETEXP
    move.l  #$8000000,(a4)+     ; BTST      #0,D0
    move.w  #$56c0,(a4)+        ; SNE       D0
    bsr     EXP_EXTD0
    RTS
;*-*
;; Abs
INL_ABS:
    MOVEQ   #0,D0
    BSR     EA_GETEXP
    MOVE.L  #$4A806a02,(a4)+        ; TST.L D0/BPL *+2
    MOVE.W  #$4480,(A4)+            ; NEG.L D0
    RTS
;*-*
;; Shl
INL_SHL:
    MOVE.L  #$F00,D0
    BSR     EA_GETEXP
    CMP.W   #COM,(A3)+
    BEQ     .1
    JMP     ERROR5
.1:
    MOVE.L  #$200,D0
    BSR     EA_GETEXP
    MOVE.W  #$201F,(A4)+        ; MOVE.L    (A7)+,D0
    MOVE.W  #$E3A0,(A4)+        ; ASL.L     D1,D0
    RTS
;*-*
;; Shr
INL_SHR:
    MOVE.L  #$F00,D0
    BSR     EA_GETEXP
    CMP.W   #COM,(A3)+
    BEQ     .1
    JMP     ERROR5
.1:
    MOVE.L  #$200,D0
    BSR     EA_GETEXP
    MOVE.W  #$201F,(A4)+        ; MOVE.L    (A7)+,D0
    MOVE.W  #$E2A0,(A4)+        ; ASL.L     D1,D0
    RTS
;*-*
;; Mod
INL_MOD:
    MOVE.L  #$F00,D0
    BSR     EA_GETEXP
    CMP.W   #COM,(A3)+
    BEQ     .1
    JMP     ERROR5
.1:
    MOVE.L  #$200,D0
    BSR     EA_GETEXP
    MOVE.W  #$201F,(A4)+        ; MOVE.L    (A7)+,D0
    move.w  #$7400,(a4)+        ; MOVEQ     #0,D2
    MOVE.L  #$4C410C02,(a4)+    ; DIVS.L    D1,D2:D0
    MOVE.L  #$C540C541,(A4)+    ; EXG.L     D2,D0; EXG.L    D2,D1
    RTS                         ; D0=MODULO, D1=A/B
;*-*
;; CleanUp
INL_CLEANUP:
    MOVE.L  #$940,D0
    BSR EA_GETEXP
    MOVE.W  #-28,(A4)+
    MOVE.L  #$206cFFE8,(A4)+
    move.w  #$4ed0,(a4)+
    RTS
;*-*
;; RndQ
INL_RNDQ:
    BSR EA_GETEXP
    MOVE.L  #$D0806206,(A4)+        ; ADD.L D0,D0 / BHI.S *+8
    MOVE.L  #$0A801d87,(A4)+        ; EORI.L    #$1d872b41,D0
    MOVE.W  #$2b41,(A4)+
    RTS
;*-*
;; MouseX
INL_MOUSEX:
    MOVEQ   #$40,D0
    BSR     EA_GETEXP
    MOVE.W  #$7000,(A4)+
    MOVE.L  #$3028000E,(A4)+
    RTS
;*-*
;; MouseY
INL_MOUSEY:
    MOVEQ   #$40,D0
    BSR     EA_GETEXP
    MOVE.W  #$7000,(A4)+
    MOVE.L  #$3028000C,(A4)+
    RTS
;*-*

;; Fabs
INL_FABS:
    MOVEQ   #0,D0
    BSR EA_GETEXP
    MOVE.L  #$2C6CFFC8,(A4)+
    MOVE.L  #$4EAEFFCA,(A4)+
    RTS
;*-*
;; Floor
INL_FFLOOR:
    MOVEQ   #0,D0
    BSR EA_GETEXP
    MOVE.L  #$2C6CFFC8,(A4)+
    MOVE.L  #$4EAEFFA6,(A4)+
    RTS
;*-*
;; Fceil
INL_FCEIL:
    MOVEQ   #0,D0
    BSR EA_GETEXP
    MOVE.L  #$2C6CFFC8,(A4)+
    MOVE.L  #$4EAEFFA0,(A4)+
    RTS
;*-*
;; Fsin
INL_FSIN:
    MOVEQ   #0,D0
    BSR EA_GETEXP
    MOVE.L  #$2C6CFFC4,(A4)+
    MOVE.L  #$4EAEFFDC,(A4)+
    RTS
;*-*
;; Fcos
INL_FCOS:
    MOVEQ   #0,D0
    BSR EA_GETEXP
    MOVE.L  #$2C6CFFC4,(A4)+
    MOVE.L  #$4EAEFFD6,(A4)+
    RTS
;*-*
;; Ftan
INL_FTAN:
    MOVEQ   #0,D0
    BSR EA_GETEXP
    MOVE.L  #$2C6CFFC4,(A4)+
    MOVE.L  #$4EAEFFD0,(A4)+
    RTS               
;*-*
;; Fexp
INL_FEXP:
    MOVEQ   #0,D0
    BSR EA_GETEXP
    MOVE.L  #$2C6CFFC4,(A4)+
    MOVE.L  #$4EAEFFB2,(A4)+
    RTS               
;*-*
;; Flog
INL_FLOG:
    MOVEQ   #0,D0
    BSR EA_GETEXP
    MOVE.L  #$2C6CFFC4,(A4)+
    MOVE.L  #$4EAEFFAC,(A4)+
    RTS               
;*-*
;; Fpow
INL_FPOW:
    MOVE.L  #$F00,D0            ; move.l    d0,-(a7)
    BSR EA_GETEXP
    JSR ASM_COMMA
    MOVEQ   #0,D0
    BSR EA_GETEXP
    MOVE.W  #$221F,(A4)+        ; move.l    (a7)+,d1
    MOVE.L  #$2C6CFFC4,(A4)+
    MOVE.L  #$4EAEFFA6,(A4)+
    RTS               
;*-*
;; Fsqrt
INL_FSQRT:
    MOVEQ   #0,D0
    BSR EA_GETEXP
    MOVE.L  #$2C6CFFC4,(A4)+
    MOVE.L  #$4EAEFFA0,(A4)+
    RTS               
;*-*
;; Flog10
INL_FLOG10:
    MOVEQ   #0,D0
    BSR EA_GETEXP
    MOVE.L  #$2C6CFFC4,(A4)+
    MOVE.L  #$4EAEFF82,(A4)+
    RTS               
;*-*
;; Fatan
INL_FATAN:
    MOVEQ   #0,D0
    BSR EA_GETEXP
    MOVE.L  #$2C6CFFC4,(A4)+
    MOVE.L  #$4EAEFFE2,(A4)+
    RTS               
;*-*
;; FsinCos
INL_FSINCOS:
    MOVE.L  #$F00,D0            ; move.l    d0,-(a7)
    BSR EA_GETEXP
    JSR ASM_COMMA
    MOVEQ   #0,D0
    BSR EA_GETEXP
    MOVE.W  #$205F,(A4)+        ; move.l    (a7)+,A0
    MOVE.L  #$2C6CFFC4,(A4)+
    MOVE.L  #$4EAEFFCA,(A4)+
    RTS               
;*-*
;; FsinH
INL_FSINH:
    MOVEQ   #0,D0
    BSR EA_GETEXP
    MOVE.L  #$2C6CFFC4,(A4)+
    MOVE.L  #$4EAEFFC4,(A4)+
    RTS               


    MOVE.L  4(A7),D0
    MOVE.L  -60(A4),A6
    JSR 60(A6)
    RTS
;*-*
;; FcosH
INL_FCOSH:
    MOVEQ   #0,D0
    BSR EA_GETEXP
    MOVE.L  #$2C6CFFC4,(A4)+
    MOVE.L  #$4EAEFFbe,(A4)+
    RTS
;*-*
;; FtanH
INL_FTANH:
    MOVEQ   #0,D0
    BSR EA_GETEXP
    MOVE.L  #$2C6CFFC4,(A4)+
    MOVE.L  #$4EAEFFb8,(A4)+
    RTS               
;*-*
;; Ftieee
INL_FTIEEE:
    MOVEQ   #0,D0
    BSR EA_GETEXP
    MOVE.L  #$2C6CFFC4,(A4)+
    MOVE.L  #$4EAEFF9A,(A4)+
    RTS               
;*-*
;; Fieee
INL_FFIEEE:
    MOVEQ   #0,D0
    BSR EA_GETEXP
    MOVE.L  #$2C6CFFC4,(A4)+
    MOVE.L  #$4EAEFF94,(A4)+
    RTS               
;*-*
;; Fasin
INL_FASIN:
    MOVEQ   #0,D0
    BSR EA_GETEXP
    MOVE.L  #$2C6CFFC4,(A4)+
    MOVE.L  #$4EAEFF8e,(A4)+
    RTS               
;*-*
;; Facos
INL_FACOS:
    MOVEQ   #0,D0
    BSR EA_GETEXP
    MOVE.L  #$2C6CFFC4,(A4)+
    MOVE.L  #$4EAEFF88,(A4)+
    RTS               
;*-*

;; MsgCode
INL_MSGCODE:
    MOVE.w  #$7000,(a4)+
    move.l  #$302cffbc,(a4)+
    RTS
;*-*
;; MsgQual
INL_MSGQUAL:
    move.w  #$7000,(a4)+
    move.l  #$302cffbe,(a4)+
    RTS
;*-*
;; MsgIaddr
INL_MSGIADR:
    MOVE.L  #$202cffb8,(a4)+
    RTS
;*-*

;; Car
INL_CAR:
    MOVEQ   #$40,D0
    BSR EA_GETEXP
    MOVE.W  #$2010,(a4)+
    RTS
;*-*
;; Cdr
INL_CDR:
    MOVEQ   #$40,D0
    BSR EA_GETEXP
    MOVE.L  #$20280004,(a4)+
    RTS
;*-*
;*-*
;; Data
;; LibCalls


; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ;
;   The Internal LIBRARYCALLS               ;
; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ;


EXEC:
 DC.B "Supervisor",13,16,16,16,16,16,16,"InitCode",0
 DC.B 1,"InitStruct",9,10,0,"MakeLibrary",8,9,10,0,1,"MakeFunctions",8,9,10
 DC.B "FindResident",9,"InitResident",9,1,"Alert",7,"Debug",0,"Disable",16
 DC.B "Enable",16,"Forbid",16,"Permit",16,"SetSR",0,1,"SuperState",16
 DC.B "UserState",0,"SetIntVector",0,9,"AddIntServer",0,9,"RemIntServer",0,9
 DC.B "Cause",9,"Allocate",8,0,"Deallocate",8,9,0,"AllocMem",0,1,"AllocAbs",0
 DC.B 9,"FreeMem",9,0,"AvailMem",1,"AllocEntry",8,"FreeEntry",8,"Insert",8,9
 DC.B 10,"AddHead",8,9,"AddTail",8,9,"Remove",9,"RemHead",8,"RemTail",8
 DC.B "Enqueue",8,9,"FindName",8,9,"AddTask",9,10,11,"RemTask",9,"FindTask",9
 DC.B "SetTaskPri",9,0,"SetSignal",0,1,"SetExcept",0,1,"Wait",0,"Signal",9,0
 DC.B "AllocSignal",0,"FreeSignal",0,"AllocTrap",0,"FreeTrap",0,"AddPort",9
 DC.B "RemPort",9,"PutMsg",8,9,"GetMsg",8,"ReplyMsg",9,"WaitPort",8,"FindPort"
 DC.B 9,"AddLibrary",9,"RemLibrary",9,"OldOpenLibrary",9,"CloseLibrary",9
 DC.B "SetFunction",9,8,0,"SumLibrary",9,"AddDevice",9,"RemDevice",9
 DC.B "OpenDevice",8,0,9,1,"CloseDevice",9,"DoIO",9,"SendIO",9,"CheckIO",9
 DC.B "WaitIO",9,"AbortIO",9,"AddResource",9,"RemResource",9,"OpenResource",9
 DC.B 16,16,16,"RawDoFmt",8,9,10,11,"GetCC",16,"TypeOfMem",9,"Procure",8,9
 DC.B "Vacate",8,9,"OpenLibrary",9,0,"InitSemaphore",8,"ObtainSemaphore",8
 DC.B "ReleaseSemaphore",8,"AttemptSemaphore",8,"ObtainSemaphoreList",8
 DC.B "ReleaseSemaphoreList",8,"FindSemaphore",9,"AddSemaphore",9
 DC.B "RemSemaphore",9,"SumKickData",16,"AddMemList",0,1,2,8,9,"CopyMem",8,9,0
 DC.B "CopyMemQuick",8,9,0,"CacheClearU",16,"CacheClearE",8,0,1,"CacheControl"
 DC.B 0,1,"CreateIORequest",8,0,"DeleteIORequest",8,"CreateMsgPort",16
 DC.B "DeleteMsgPort",8,"ObtainSemaphoreShared",8,"AllocVec",0,1,"FreeVec",9
 DC.B "CreatePool",0,1,2,"DeletePool",8,"AllocPooled",8,0,"FreePooled",8,9,0
 DC.B "AttemptSemaphoreShared",8,"ColdReboot",16,"StackSwap",8,"ChildFree",0
 DC.B "ChildOrphan",0,"ChildStatus",0,"ChildWait",0,"CachePreDMA",8,9,0
 DC.B "CachePostDMA",8,9,0,"AddMemHandler",9,"RemMemHandler",9
 DC.B "ObtainQuickVector",8,"ÿ",0,0,0,0

GFX:
 DC.B "BltBitMap",8,0,1,9,2,3,4,5,6,7,10
 DC.B "BltTemplate",8,0,1,9,2,3,4,5,"ClearEOL",9,"ClearScreen",9,"TextLength"
 DC.B 9,8,0,"Text",9,8,0,"SetFont",9,8,"OpenFont",8,"CloseFont",9
 DC.B "AskSoftStyle",9,"SetSoftStyle",9,0,1,"AddBob",8,9,"AddVSprite",8,9
 DC.B "DoCollision",9,"DrawGList",9,8,"InitGels",8,9,10,"InitMasks",8
 DC.B "RemIBob",8,9,10,"RemVSprite",8,"SetCollision",0,8,9,"SortGList",9
 DC.B "AddAnimOb",8,9,10,"Animate",8,9,"GetGBuffers",8,9,0,"InitGMasks",8
 DC.B "DrawEllipse",9,0,1,2,3,"AreaEllipse",9,0,1,2,3,"LoadRGB4",8,9,0
 DC.B "InitRastPort",9,"InitVPort",8,"MrgCop",9,"MakeVPort",8,9,"LoadView",9
 DC.B "WaitBlit",16,"SetRast",9,0,"Move",9,0,1,"Draw",9,0,1,"AreaMove",9,0,1
 DC.B "AreaDraw",9,0,1,"AreaEnd",9,"WaitTOF",16,"Qblit",9,"InitArea",8,9,0
 DC.B "SetRGB4",8,0,1,2,3,"QbSBlit",9,"BltClear",9,0,1,"RectFill",9,0,1,2,3
 DC.B "BltPattern",9,8,0,1,2,3,4,"ReadPixel",9,0,1,"WritePixel",9,0,1,"Flood"
 DC.B 9,2,0,1,"PolyDraw",9,0,8,"SetAPen",9,0,"SetBPen",9,0,"SetDrMd",9,0
 DC.B "InitView",9,"Cbump",9,"Cmove",9,0,1,"Cwait",9,0,1,"VbeamPos",16
 DC.B "InitBitMap",8,0,1,2,"ScrollRaster",9,0,1,2,3,4,5,"WaitBOVP",8
 DC.B "GetSprite",8,0,"FreeSprite",0,"ChangeSprite",8,9,10,"MoveSprite",8,9,0
 DC.B 1,"LockLayerRom",13,"UnlockLayerRom",13,"SyncSBitMap",8,"CopySBitMap",8
 DC.B "OwnBlitter",16,"DisownBlitter",16,"InitTmpRas",8,9,0,"AskFont",9,8
 DC.B "AddFont",9,"RemFont",9,"AllocRaster",0,1,"FreeRaster",8,0,1
 DC.B "AndRectRegion",8,9,"OrRectRegion",8,9,"NewRegion",16,"ClearRectRegion"
 DC.B 8,9,"ClearRegion",8,"DisposeRegion",8,"FreeVPortCopLists",8
 DC.B "FreeCopList",8,"ClipBlit",8,0,1,9,2,3,4,5,6,"XorRectRegion",8,9
 DC.B "FreeCprList",8,"GetColorMap",0,"FreeColorMap",8,"GetRGB4",8,0
 DC.B "ScrollVPort",8,"UcopperListInit",8,0,"FreeGBuffers",8,9,0
 DC.B "BltBitMapRastPort",8,0,1,9,2,3,4,5,6,"OrRegionRegion",8,9
 DC.B "XorRegionRegion",8,9,"AndRegionRegion",8,9,"SetRGB4CM",8,0,1,2,3
 DC.B "BltMaskBitMapRastPort",8,0,1,9,2,3,4,5,6,10,16,16,"AttemptLockLayerRom"
 DC.B 13,"GfxNew",0,"GfxFree",8,"GfxAssociate",8,9,"BitMapScale",8,"ScalerDiv"
 DC.B 0,1,2,"TextExtent",9,8,0,10,"TextFit",9,8,0,10,11,1,2,3,"GfxLookUp",8
 DC.B "VideoControl",8,9,"OpenMonitor",9,0,"CloseMonitor",8,"FindDisplayInfo"
 DC.B 0,"NextDisplayInfo",0,16,16,16,"GetDisplayInfoData",8,9,0,1,2
 DC.B "FontExtent",8,9,"ReadPixelLine8",8,0,1,2,10,9,"WritePixelLine8",8,0,1,2
 DC.B 10,9,"ReadPixelArray8",8,0,1,2,3,10,9,"WritePixelArray8",8,0,1,2,3,10,9
 DC.B "GetVPModeID",8,"ModeNotAvailable",0,"WeighTAMatch",8,9,10,"EraseRect",9
 DC.B 0,1,2,3,"ExtendFont",8,9,"StripFont",8,"CalcIVG",8,9,"AttachPalExtra",8
 DC.B 9,"ObtainBestPenA",8,1,2,3,9,16,"SetRGB32",8,0,1,2,3,"GetAPen",8
 DC.B "GetBPen",8,"GetDrMd",8,"GetOutlinePen",8,"LoadRGB32",8,9,"SetChipRev",0
 DC.B "SetABPenDrMd",9,0,1,2,"GetRGB32",8,0,1,9,16,16,"AllocBitMap",0,1,2,3,8
 DC.B "FreeBitMap",8,"GetExtSpriteA",10,9,"CoerceMode",8,0,1,"ChangeVPBitMap"
 DC.B 8,9,10,"ReleasePen",8,0,"ObtainPen",8,0,1,2,3,4,"GetBitMapAttr",8,1
 DC.B "AllocDBufInfo",8,"FreeDBufInfo",9,"SetOutlinePen",8,0,"SetWriteMask",8
 DC.B 0,"SetMaxPen",8,0,"SetRGB32CM",8,0,1,2,3,"ScrollRasterBF",9,0,1,2,3,4,5
 DC.B "FindColor",11,1,2,3,4,16,"AllocSpriteDataA",10,9,"ChangeExtSpriteA",8,9
 DC.B 10,11,"FreeSpriteData",10,"SetRPAttrsA",8,9,"GetRPAttrsA",8,9
 DC.B "BestModeIDA",8,"WriteChunkyPixels",8,0,1,2,3,10,4,"ÿ",0,0,0,0


INTUI:
 DC.B "OpenIntuition",16,"Intuition",8
 DC.B "AddGadget",8,9,0,"ClearDMRequest",8,"ClearMenuStrip",8,"ClearPointer",8
 DC.B "CloseScreen",8,"CloseWindow",8,"CloseWorkBench",16,"CurrentTime",8,9
 DC.B "DisplayAlert",0,8,1,"DisplayBeep",8,"DoubleClick",0,1,2,3,"DrawBorder"
 DC.B 8,9,0,1,"DrawImage",8,9,0,1,"EndRequest",8,9,"GetDefPrefs",8,0
 DC.B "GetPrefs",8,0,"InitRequester",8,"ItemAddress",8,0,"ModifyIDCMP",8,0
 DC.B "ModifyProp",8,9,10,0,1,2,3,4,"MoveScreen",8,0,1,"MoveWindow",8,0,1
 DC.B "OffGadget",8,9,10,"OffMenu",8,0,"OnGadget",8,9,10,"OnMenu",8,0
 DC.B "OpenScreen",8,"OpenWindow",8,"OpenWorkBench",16,"PrintIText",8,9,0,1
 DC.B "RefreshGadgets",8,9,10,"RemoveGadget",8,9,"ReportMouse",0,8,"Request",8
 DC.B 9,"ScreenToBack",8,"ScreenToFront",8,"SetDMRequest",8,9,"SetMenuStrip",8
 DC.B 9,"SetPointer",8,9,0,1,2,3,"SetWindowTitles",8,9,10,"ShowTitle",8,0
 DC.B "SizeWindow",8,0,1,"ViewAddress",16,"ViewPortAddress",8,"WindowToBack",8
 DC.B "WindowToFront",8,"WindowLimits",8,0,1,2,3,"SetPrefs",8,0,1
 DC.B "IntuiTextLength",8,"WbenchToBack",16,"WbenchToFront",16,"AutoRequest",8
 DC.B 9,10,11,0,1,2,3,"BeginRefresh",8,"BuildSysRequest",8,9,10,11,0,1,2
 DC.B "EndRefresh",8,0,"FreeSysRequest",8,"MakeScreen",8,"RemakeDisplay",16
 DC.B "RethinkDisplay",16,"AllocRemember",8,0,1,"AlohaWorkbench",8
 DC.B "FreeRemember",8,0,"LockIBase",0,"UnlockIBase",8,"GetScreenData",8,0,1,9
 DC.B "RefreshGList",8,9,10,0,"AddGList",8,9,0,1,10,"RemoveGList",8,9,0
 DC.B "ActivateWindow",8,"RefreshWindowFrame",8,"ActivateGadget",8,9,10
 DC.B "NewModifyProp",8,9,10,0,1,2,3,4,5,"QueryOverscan",8,9,0
 DC.B "MoveWindowInFrontOf",8,9,"ChangeWindowBox",8,0,1,2,3,"SetEditHook",8
 DC.B "SetMouseQueue",8,0,"ZipWindow",8,"LockPubScreen",8,"UnlockPubScreen",8
 DC.B 9,"LockPubScreenList",16,"UnlockPubScreenList",16,"NextPubScreen",8,9
 DC.B "SetDefaultPubScreen",8,"SetPubScreenModes",0,"PubScreenStatus",8,0
 DC.B "ObtainGIRPort",8,"ReleaseGIRPort",8,"GadgetMouse",8,9,10,16
 DC.B "GetDefaultPubScreen",8,"EasyRequestArgs",8,9,10,11
 DC.B "BuildEasyRequestArgs",8,9,0,11,"SysReqHandler",8,9,0
 DC.B "OpenWindowTagList",8,9,"OpenScreenTagList",8,9,"DrawImageState",8,9,0,1
 DC.B 2,10,"PointInImage",0,8,"EraseImage",8,9,0,1,"NewObjectA",8,9,10
 DC.B "DisposeObject",8,"SetAttrsA",8,9,"GetAttr",0,8,9,"SetGadgetAttrsA",8,9
 DC.B 10,11,"NextObject",8,16,"MakeClass",8,9,10,0,1,"AddClass",8
 DC.B "GetScreenDrawInfo",8,"FreeScreenDrawInfo",8,9,"ResetMenuStrip",8,9
 DC.B "RemoveClass",8,"FreeClass",8,16,16,16,16,16,16,16,16
 DC.B "AllocScreenBuffer",8,9,0,"FreeScreenBuffer",8,9,"ChangeScreenBuffer",8
 DC.B 9,"ScreenDepth",8,0,9,"ScreenPosition",8,0,1,2,3,4,"ScrollWindowRaster"
 DC.B 9,0,1,2,3,4,5,"LendMenus",8,9,"DoGadgetMethodA",8,9,10,11
 DC.B "SetWindowPointerA",8,9,"TimedDisplayAlert",0,8,1,9,"HelpControl",8,0
 DC.B "ÿ",0,0,0,0

DOS:
 DC.B "Open",1,2,"Close",1,"Read",1,2,3,"Write",1,2,3
 DC.B "Input",16,"Output",16,"Seek",1,2,3,"DeleteFile",1,"Rename",1,2,"Lock",1
 DC.B 2,"UnLock",1,"DupLock",1,"Examine",1,2,"ExNext",1,2,"Info",1,2
 DC.B "CreateDir",1,"CurrentDir",1,"IoErr",16,"CreateProc",1,2,3,4,"Exit",1
 DC.B "LoadSeg",1,"UnLoadSeg",1,16,16,"DeviceProc",1,"SetComment",1,2
 DC.B "SetProtection",1,2,"DateStamp",1,"Delay",1,"WaitForChar",1,2
 DC.B "ParentDir",1,"IsInteractive",1,"Execute",1,2,3,"AllocDosObject",1,2
 DC.B "FreeDosObject",1,2,"DoPkt",1,2,3,4,5,6,7,"SendPkt",1,2,3,"WaitPkt",16
 DC.B "ReplyPkt",1,2,3,"AbortPkt",1,2,"LockRecord",1,2,3,4,5,"LockRecords",1,2
 DC.B "UnLockRecord",1,2,3,"UnLockRecords",1,"SelectInput",1,"SelectOutput",1
 DC.B "FgetC",1,"FputC",1,2,"UnGetC",1,2,"Fread",1,2,3,4,"Fwrite",1,2,3,4
 DC.B "Fgets",1,2,3,"Fputs",1,2,"VfWritef",1,2,3,"VfPrintf",1,2,3,"Flush",1
 DC.B "SetVBuf",1,2,3,4,"DupLockFromFH",1,"OpenFromLock",1,"ParentOfFH",1
 DC.B "ExamineFH",1,2,"SetFileDate",1,2,"NameFromLock",1,2,3,"NameFromFH",1,2
 DC.B 3,"SplitName",1,2,3,4,5,"SameLock",1,2,"SetMode",1,2,"ExAll",1,2,3,4,5
 DC.B "ReadLink",1,2,3,4,5,"MakeLink",1,2,3,"ChangeMode",1,2,3,"SetFileSize",1
 DC.B 2,3,"SetIoErr",1,"Fault",1,2,3,4,"PrintFault",1,2,"ErrorReport",1,2,3,4
 DC.B 16,"Cli",16,"CreateNewProc",1,"RunCommand",1,2,3,4,"GetConsoleTask",16
 DC.B "SetConsoleTask",1,"GetFileSysTask",16,"SetFileSysTask",1,"GetArgStr",16
 DC.B "SetArgStr",1,"FindCliProc",1,"MaxCli",16,"SetCurrentDirName",1
 DC.B "GetCurrentDirName",1,2,"SetProgramName",1,"GetProgramName",1,2
 DC.B "SetPrompt",1,"GetPrompt",1,2,"SetProgramDir",1,"GetProgramDir",16
 DC.B "SystemTagList",1,2,"AssignLock",1,2,"AssignLate",1,2,"AssignPath",1,2
 DC.B "AssignAdd",1,2,"RemAssignList",1,2,"GetDeviceProc",1,2,"FreeDeviceProc"
 DC.B 1,"LockDosList",1,"UnLockDosList",1,"AttemptLockDosList",1,"RemDosEntry"
 DC.B 1,"AddDosEntry",1,"FindDosEntry",1,2,3,"NextDosEntry",1,2,"MakeDosEntry"
 DC.B 1,2,"FreeDosEntry",1,"IsFileSystem",1,"Format",1,2,3,"Relabel",1,2
 DC.B "Inhibit",1,2,"AddBuffers",1,2,"CompareDates",1,2,"DateToStr",1
 DC.B "StrToDate",1,"InternalLoadSeg",0,8,9,10,"InternalUnLoadSeg",1,9
 DC.B "NewLoadSeg",1,2,"AddSegment",1,2,3,"FindSegment",1,2,3,"RemSegment",1
 DC.B "CheckSignal",1,"ReadArgs",1,2,3,"FindArg",1,2,"ReadItem",1,2,3
 DC.B "StrToLong",1,2,"MatchFirst",1,2,"MatchNext",1,"MatchEnd",1
 DC.B "ParsePattern",1,2,3,"MatchPattern",1,2,16,"FreeArgs",1,16,"FilePart",1
 DC.B "PathPart",1,"AddPart",1,2,3,"StartNotify",1,"EndNotify",1,"SetVar",1,2
 DC.B 3,4,"GetVar",1,2,3,4,"DeleteVar",1,2,"FindVar",1,2,16,"CliInitNewcli",8
 DC.B "CliInitRun",8,"WriteChars",1,2,"PutStr",1,"Vprintf",1,2,16
 DC.B "ParsePatternNoCase",1,2,3,"MatchPatternNoCase",1,2,16,"SameDevice",1,2
 DC.B "ExAllEnd",1,2,3,4,5,"SetOwner",1,2,"ÿ",0,0,0,0

UTIL:
 DC.B "FindTagItem",0,8,"GetTagData",0,1,8,"PackBoolTags",0,8,9,"NextTagItem",8
 DC.B "FilterTagChanges",8,9,0,"MapTags",8,9,0,"AllocateTagItems",0,"CloneTagItems",8
 DC.B "FreeTagItems",8,"RefreshTagItemClones",8,9,"TagInArray",0,8,"FilterTagItems"
 DC.B 8,9,0,"CallHookPkt",8,10,9,16,16,"Amiga2Date",0,8,"Date2Amiga",8,"CheckDate",8
 DC.B "Smult32",0,1,"Umult32",0,1,"SdivMod32",0,1,"UdivMod32",0,1,"Stricmp",8,9
 DC.B "Strnicmp",8,9,0,"ToUpper",0,"ToLower",0,"ApplyTagChanges",8,9,"Smult64",0,1
 DC.B "Umult64",0,1,"PackStructureTags",8,9,10,"UnpackStructureTags",8,9,10
 DC.B "AddNamedObject",8,9,"AllocNamedObjectA",8,9,"AttemptRemNamedObject",8
 DC.B "FindNamedObject",8,9,10,"FreeNamedObject",8,"NamedObjectName",8,"ReleaseNamedObject"
 DC.B 8,"RemNamedObject",8,9,"GetUniqueID",16,"ÿ",0,0,0,0

 EVEN
;*-*
;; #date data
LongMonths:
    DC.L    .01,.02,.03,.04,.05,.06,.07,.08,.09,.10,.11,.12
.01:DC.B    "January",0
.02:DC.B    "February",0
.03:DC.B    "March",0
.04:DC.B    "April",0
.05:DC.B    "May",0
.06:DC.B    "June",0
.07:DC.B    "July",0
.08:DC.B    "August",0
.09:DC.B    "September",0
.10:DC.B    "October",0
.11:DC.B    "November",0
.12:DC.B    "December",0
    EVEN
ShortMonths:
    DC.L    .01,.02,.03,.04,.05,.06,.07,.08,.09,.10,.11,.12
.01:DC.B    "Jan",0
.02:DC.B    "Feb",0
.03:DC.B    "Mar",0
.04:DC.B    "Apr",0
.05:DC.B    "May",0
.06:DC.B    "Jun",0
.07:DC.B    "Jul",0
.08:DC.B    "Aug",0
.09:DC.B    "Sep",0
.10:DC.B    "Oct",0
.11:DC.B    "Nov",0
.12:DC.B    "Dec",0
    EVEN

LongDays:
    DC.L    .0,.1,.2,.3,.4,.5,.6
.0: DC.B    "Sunday",0
.1: DC.B    "Monday",0
.2: DC.B    "Tuesday",0
.3: DC.B    "Wednesday",0
.4: DC.B    "Thursday",0
.5: DC.B    "Friday",0
.6: DC.B    "Saturday",0
    EVEN

ShortDays:
    DC.L    .0,.1,.2,.3,.4,.5,.6
.0: DC.B    "Su",0
.1: DC.B    "Mo",0
.2: DC.B    "Tu",0
.3: DC.B    "We",0
.4: DC.B    "Th",0
.5: DC.B    "Fr",0
.6: DC.B    "Sa",0
    EVEN
;*-*
;; Errors
ERRORTAB:
    DC.L     .0, .1, .2, .3, .4, .5, .6, .7, .8, .9
    DC.L    .10,.11,.12,.13,.14,.15,.16,.17,.18,.19
    DC.L    .20,.21,.22,.23,.24,.25,.26,.27,.28,.29
    DC.L    .30,.31,.32,.33,.34,.35,.36,.37,.38,.39
    DC.L    .40,.41,.42,.43,.44,.45,.46,.47,.48,.49
    DC.L    .50,.51,.52,.53,.54,.55,.56,.57,.58,.59
    DC.L    .60,.61,.62,.63,.64,.65,.66,.67,.68,.69
    DC.L    .70,.71,.72,.73,.74,.75,.76,.77,.78,.79
    DC.L    .80,.81,.82,.83,.84,.85,.86,.87,.88,.89
    DC.L    .90,.91,.92,.93,.94,.95,.96

    DC.L    NOERMESSAGE

.0: DC.B    'syntax error',0
.1: DC.B    'unknown keyword/const',0
.2: DC.B    '":=" expected',0
.3: DC.B    'unexpected characters in line',0
.4: DC.B    'label expected',0
.5: DC.B    '"," expected',0
.6: DC.B    'variable expected',0
.7: DC.B    'value does not fit in 32 bit',0
.8: DC.B    'missing apostrophe/quote',0
.9: DC.B    'incoherent programstructure',0
.10:    DC.B    'illegal commandline option',0
.11:    DC.B    'division and multiplication 16bit only',0
.12:    DC.B    'superfluous items in expression/statement',0
.13:    DC.B    'procedure "main" not available',0
.14:    DC.B    'double declaration of label',0
.15:    DC.B    'unsafe use of "*" or "/"',0
.16:    DC.B    "reading sourcefile didn`t succeed",0
.17:    DC.B    "writing executable/module didn`t succeed",0
.18:    DC.B    'bad args (try: EC ?)',0
.19:    DC.B    'unknown/illegal addressing mode',0
.20:    DC.B    'unmatched parentheses',0
.21:    DC.B    'double declaration',0
.22:    DC.B    'unknown identifier',0
.23:    DC.B    'incorrect # of args or use of ()',0
.24:    DC.B    'unknown e/library function',0
.25:    DC.B    'illegal function call',0
.26:    DC.B    'unknown format code following "\"',0
.27:    DC.B    '/* not properly nested comment structure */',0
.28:    DC.B    'could not load binary',0
.29:    DC.B    '"}" expected',0
.30:    DC.B    'immediate value expected',0
.31:    DC.B    'incorrect size of value',0
.32:    DC.B    'no E code allowed in assembler mode',0
.33:    DC.B    'illegal/inappropriate type',0
.34:    DC.B    '"]" expected',0
.35:    DC.B    'statement out of local/global scope',0
.36:    DC.B    'could not read module correctly',0
.37:    DC.B    'workspace full!',0
.38:    DC.B    'not enough memory while (re-)allocating',0
.39:    DC.B    'incorrect object definition',0
.40:    DC.B    'illegal use of/reference to object',0
.41:    DC.B    'incomplete if-then-else expression',0
.42:    DC.B    'unknown object identifier',0
.43:    DC.B    'double declaration of object identifier',0
.44:    DC.B    'reference(s) out of 32k range: switch to LARGE model',0
.45:    DC.B    'reference(s) out of 256 byte range',0
.46:    DC.B    'too sizy expression',0
.47:    DC.B    'incomplete exception handler definition',0
.48:    DC.B    'not allowed in a module',0
.49:    DC.B    'allowed in modules only',0
.50:    DC.B    "this doesn't make sense",0
.51:    DC.B    'you need a newer version of EC for this :-)',0
.52:    DC.B    'no matching "["',0
.53:    DC.B    'this instruction needs a better CPU/FPU (see OPT)',0
.54:    DC.B    "object doesn't understand this method",0
.55:    DC.B    "method doesn't have same #of args as method of baseclass",0
.56:    DC.B    'too many register variables in this function',0
.57:    DC.B    "Linker can't find all symbols",0
.58:    DC.B    'could not open "mathieeesingbas.library"',0
.59:    DC.B    'illegal destructor definition',0
.60:    DC.B    'implicit initialisation of private members',0
.61:    DC.B    'double method declaration',0
.62:    DC.B    'object referenced by other object not found',0
.63:    DC.B    'unknown preprocessor keyword',0
.64:    DC.B    'illegal macro definition',0
.65:    DC.B    'incoherent #ifdef/#ifndef nesting',0
.66:    DC.B    'macro redefinition',0
.67:    DC.B    'syntax error in #ifdef/#ifndef/#endif',0
.68:    DC.B    'macro(s) nested too deep',0
.69:    DC.B    'method definition out of object/module scope',0
.70:    DC.B    'library definition problem',0
.71:    DC.B    'object not known at this point',0
.72:    DC.B    'unknown HEX value after \x',0
.73:    DC.B    'value expected',0
.74:    DC.B    '")" expected',0
.75:    DC.B    'even number expected',0
.76:    DC.B    'you need a newer OS for this',0
.77:    DC.B    'unable to open resource',0
.78:    DC.B    'this instruction needs a newer OS version (see OPT)',0
.79:    DC.B    'illegal size',0
.80:    DC.B    'fpu register expected',0
.81:    DC.B    '":" expected',0
.82:    DC.B    'mmu register expected',0
.83:    DC.B    'control register expected',0
.84:    DC.B    'cpu register expected',0
.85:    DC.B    'this instruction works only in pool mode',0
.86:    DC.B    'not allowed in library mode',0
.87:    DC.B    'sorry, feature is not available yet',0
.88:    DC.B    'syntax error in lib file',0
.89:    DC.B    'a4 storage not defined in startup code',0
.90:    DC.B    'only RTR and RTE allowed',0
.91:    DC.B    'illegal scale factor',0
.92:    DC.B    'address/pc register expected',0
.93:    DC.B    'value does not fit in 16 bit',0
.94:    DC.B    'value does not fit in 8 bit',0
.95:    DC.B    'address/data register expected',0
.96:    DC.B    '',0
    EVEN

NOERMESSAGE:
    DC.B    'no errors'
NEMEND:
    EVEN
;*-*

;; AssemblerInstructions
ASM_INSTAB:
    DC.L    .1,0,.2,0,.3,0,.4,0,.5,0,.6,0,.7,0,.8,0,.9,0,.10,0,.11,0,.12,0,.13,0,.14,0,.15,0,.16,0,.17,0
    DC.L    .18,0,.19,0,.20,0,.21,0,.22,0,.23,0,.24,0,.25,0,.26,0,.27,0,.28,0,.29,0,.30,0,.31,0,.32,0
    DC.L    .33,0,.34,0,.35,0,.36,0,.37,0,.38,0,.39,0,.40,0,.41,0,.42,0,.43,0,.44,0,.45,0,.46,0
    DC.L    .47,0,.48,0,.49,0,.50,0,.51,0,.52,0,.53,0,.54,0,.55,0,.56,0,.57,0,.58,0,.59,0,.60,0
    DC.L    .61,0,.62,0,.63,0,.64,0,.65,0,.66,0,.67,0,.68,0,.69,0,.70,0,.71,0,.72,0,.73,0,.74,0
    DC.L    .75,0,.76,0,.77,0,.78,0,.79,0,.80,0,.81,0,.82,0,.83,0,.84,0,.85,0,.86,0,.87,0,.88,0
    DC.L    .89,0,.90,0,.91,0,.92,0,.93,0,.94,0,.95,0,.96,0,.97,0,.98,0,.99,0,.100,0,.101,0,.102,0
    DC.L    .103,0,.104,0,.105,0,.106,0,.107,0,.108,0,.109,0,.110,0,.111,0,.112,0
    DC.L    .113,0,.114,0,.115,0,.116,0,.117,0,.118,0,.119,0,.120,0,.121,0,.122,0
    DC.L    .123,0,.124,0,.125,0,.126,0,.127,0,.128,0,.129,0,.130,0,.131,0,.132,0
    DC.L    .133,0,.134,0,.135,0,.136,0,.137,0,.138,0,.139,0,.140,0,.141,0,.142,0
    DC.L    .143,0,.144,0,.145,0,.146,0,.147,0,.148,0,.149,0,.150,0,.151,0,.152,0
    DC.L    .153,0,.154,0,.155,0,.156,0,.157,0,.158,0,.159,0,.160,0,.161,0,.162,0
    DC.L    .163,0,.164,0,.165,0,.166,0,.167,0,.168,0,.169,0,.170,0,.171,0,.172,0
    DC.L    .173,0,.174,0,.175,0,.176,0,.177,0,.178,0,.179,0,.180,0,.181,0,.182,0
    DC.L    .183,0,.184,0,.185,0,.186,0,.187,0,.188,0,.189,0,.190,0,.191,0,.192,0
    DC.L    .193,0,.194,0,.195,0,.196,0,.197,0,.198,0,.199,0,.200,0,.201,0,.202,0
    DC.L    .203,0,.204,0,.205,0,.206,0,.207,0,.208,0,.209,0,.210,0,.211,0,.212,0
    DC.L    .213,0,.214,0,.215,0,.216,0,.217,0,.218,0,.219,0,.220,0,.221,0,.222,0
    DC.L    .223,0,.224,0,.225,0,.226,0,.227,0,.228,0,.229,0,.230,0,.231,0,.232,0
    DC.L    .233,0,.234,0,.235,0,.236,0,.237,0,.238,0,.239,0,.240,0,.241,0,.242,0
    DC.L    .243,0,.244,0,.245,0,.246,0,.247,0,.248,0,.249,0,.250,0,.251,0,.252,0
    DC.L    .253,0,.254,0,.255,0,.256,0,.257,0,.258,0,.259,0,.260,0,.261,0,.262,0
    DC.L    .263,0,.264,0,.265,0,.266,0,.267,0,.268,0,.269,0,.270,0,.271,0,.272,0
    DC.L    .273,0,.274,0,.275,0,.276,0,.277,0,.278,0,.279,0,.280,0,.281,0,.282,0
    DC.L    .283,0,.284,0,.285,0,.286,0,.287,0,.288,0,.289,0,.290,0,.291,0,.292,0
    DC.L    .293,0,.294,0,.295,0,.296,0,.297,0,.298,0,.299,0,.300,0,.301,0,.302,0
    DC.L    .303,0,.304,0,.305,0,.306,0,.307,0,.308,0,.309,0,.310,0,.311,0,.312,0
    DC.L    .313,0,.314,0,.315,0,.316,0,.317,0,.318,0,.319,0,.320,0,.321,0,.322,0
    DC.L    .323,0,.324,0,.325,0,.326,0,.327,0,.328,0,.329,0,.330,0,.331,0,.332,0
    DC.L    .333,0,.334,0,.335,0,.336,0,.337,0,.338,0,.339,0,.340,0,.341,0,.342,0
    DC.L    .343,0,.344,0,.345,0,.346,0,.347,0,.348,0,.349,0,.350,0,.351,0,.352,0
    DC.L    .353,0,.354,0,.355,0,.356,0,.357,0,.358,0,.359,0,.360,0,.361,0,.362,0
    DC.L    .363,0,.364,0,.365,0,.366,0,.367,0,.368,0,.369,0,.370,0,.371,0,.372,0
    DC.L    .373,0,.374,0,.375,0,.376,0,.377,0,.378,0,.379,0,.380,0,.381,0,.382,0
    DC.L    .383,0,.384,0,.385,0,.386,0,.387,0,.388,0,.389,0,.390,0,.391,0,.392,0
    DC.L    .393,0,.394,0,.395,0,.396,0,.397,0,.398,0,.399,0,.400,0,.401,0,.402,0
    DC.L    .403,0,.404,0,.405,0,.406,0,.407,0,.408,0,.409,0,.410,0,.411,0,.412,0
    DC.L    .413,0,.414,0,.415,0,.416,0,.417,0,.418,0,.419,0,.420,0,.421,0,.422,0

    DC.L    0,0

.1: DC.B    "MOVE",0
.2: DC.B    "RTS",0
.3: DC.B    "ADD",0
.4: DC.B    "SUB",0
.5: DC.B    "MOVEQ",0
.6: DC.B    "ASR",0
.7: DC.B    "BSR",0
.8: DC.B    "CLR",0
.9: DC.B    "CMP",0
.10:    DC.B    "EOR",0
.11:    DC.B    "JMP",0
.12:    DC.B    "JSR",0
.13:    DC.B    "LSL",0
.14:    DC.B    "LSR",0
.15:    DC.B    "SUBQ",0
.16:    DC.B    "ADDQ",0
.17:    DC.B    "OR",0
.18:    DC.B    "ROL",0
.19:    DC.B    "ROR",0
.20:    DC.B    "AND",0
.21:    DC.B    "ASL",0
.22:    DC.B    "BTST",0
.23:    DC.B    "MOVEM",0
.24:    DC.B    "ADDA",0
.25:    DC.B    "ADDI",0
.26:    DC.B    "ADDX",0
.27:    DC.B    "CMPA",0
.28:    DC.B    "CMPM",0
.29:    DC.B    "CMPI",0
.30:    DC.B    "MOVEA",0
.31:    DC.B    "BRA",0
.32:    DC.B    "NEGX",0
.33:    DC.B    "ORI",0
.34:    DC.B    "SUBA",0
.35:    DC.B    "SUBI",0
.36:    DC.B    "SUBX",0
.37:    DC.B    "NOT",0
.38:    DC.B    "MULS",0
.39:    DC.B    "MULU",0
.40:    DC.B    "NEG",0
.41:    DC.B    "TST",0
.42:    DC.B    "SWAP",0
.43:    DC.B    "LEA",0
.44:    DC.B    "DIVS",0
.45:    DC.B    "DIVU",0
.46:    DC.B    "EXG",0
.47:    DC.B    "STOP",0
.48:    DC.B    "RTR",0
.49:    DC.B    "RTE",0
.50:    DC.B    "ABCD",0
.51:    DC.B    "SBCD",0
.52:    DC.B    "MOVEP",0
.53:    DC.B    "NOP",0
.54:    DC.B    "ROXL",0
.55:    DC.B    "ROXR",0
.56:    DC.B    "BCHG",0
.57:    DC.B    "BCLR",0
.58:    DC.B    "BSET",0
.59:    DC.B    "CHK",0
.60:    DC.B    "EXT",0
.61:    DC.B    "LINK",0
.62:    DC.B    "UNLK",0
.63:    DC.B    "NBCD",0
.64:    DC.B    "PEA",0
.65:    DC.B    "RESET",0
.66:    DC.B    "TRAP",0
.67:    DC.B    "TRAPV",0
.68:    DC.B    "BHI",0
.69:    DC.B    "BLS",0
.70:    DC.B    "BCC",0
.71:    DC.B    "BCS",0
.72:    DC.B    "BNE",0
.73:    DC.B    "BEQ",0
.74:    DC.B    "BVC",0
.75:    DC.B    "BVS",0
.76:    DC.B    "BPL",0
.77:    DC.B    "BMI",0
.78:    DC.B    "BGE",0
.79:    DC.B    "BLT",0
.80:    DC.B    "BGT",0
.81:    DC.B    "BLE",0
.82:    DC.B    "DBRA",0
.83:    DC.B    "DBF",0
.84:    DC.B    "DBT",0
.85:    DC.B    "DBHI",0
.86:    DC.B    "DBLS",0
.87:    DC.B    "DBCC",0
.88:    DC.B    "DBCS",0
.89:    DC.B    "DBNE",0
.90:    DC.B    "DBEQ",0
.91:    DC.B    "DBVC",0
.92:    DC.B    "DBVS",0
.93:    DC.B    "DBPL",0
.94:    DC.B    "DBMI",0
.95:    DC.B    "DBGE",0
.96:    DC.B    "DBLT",0
.97:    DC.B    "DBGT",0
.98:    DC.B    "DBLE",0
.99:    DC.B    "SHI",0
.100:   DC.B    "SLS",0
.101:   DC.B    "SCC",0
.102:   DC.B    "SCS",0
.103:   DC.B    "SNE",0
.104:   DC.B    "SEQ",0
.105:   DC.B    "SVC",0
.106:   DC.B    "SVS",0
.107:   DC.B    "SPL",0
.108:   DC.B    "SMI",0
.109:   DC.B    "SGE",0
.110:   DC.B    "SLT",0
.111:   DC.B    "SGT",0
.112:   DC.B    "SLE",0
.113:   DC.B    "ST",0
.114:   DC.B    "SF",0
.115:   DC.B    "ANDI",0
.116:   DC.B    "EORI",0
.117:   DC.B    "ILLEGAL",0
.118:   DC.B    "RTD",0
.119:   DC.B    "FABS",0
.120:   DC.B    "FACOS",0
.121:   DC.B    "FASIN",0
.122:   DC.B    "FATAN",0
.123:   DC.B    "FATANH",0
.124:   DC.B    "FCOS",0
.125:   DC.B    "FCOSH",0
.126:   DC.B    "FETOX",0
.127:   DC.B    "FETOXM1",0
.128:   DC.B    "FGETEXP",0
.129:   DC.B    "FGETMAN",0
.130:   DC.B    "FINT",0
.131:   DC.B    "FINRZ",0
.132:   DC.B    "FLOG10",0
.133:   DC.B    "FLOG2",0
.134:   DC.B    "FLOGN",0
.135:   DC.B    "FLOGNP1",0
.136:   DC.B    "FNEG",0
.137:   DC.B    "FSIN",0
.138:   DC.B    "FSINH",0
.139:   DC.B    "FSQRT",0
.140:   DC.B    "FTAN",0
.141:   DC.B    "FTANH",0
.142:   DC.B    "FTENTOX",0
.143:   DC.B    "FTWOTOX",0
.144:   DC.B    "FADD",0
.145:   DC.B    "FCMP",0
.146:   DC.B    "FDIV",0
.147:   DC.B    "FMOD",0
.148:   DC.B    "FMUL",0
.149:   DC.B    "FREM",0
.150:   DC.B    "FSCALE",0
.151:   DC.B    "FSGLDIV",0
.152:   DC.B    "FSGLMUL",0
.153:   DC.B    "FSUB",0
.154:   DC.B    "FBF",0
.155:   DC.B    "FBEQ",0
.156:   DC.B    "FBOGT",0
.157:   DC.B    "FBOGE",0
.158:   DC.B    "FBOLT",0
.159:   DC.B    "FBOLE",0
.160:   DC.B    "FBOGL",0
.161:   DC.B    "FBOR",0
.162:   DC.B    "FBUN",0
.163:   DC.B    "FBUNE",0
.164:   DC.B    "FBUGT",0
.165:   DC.B    "FBUGE",0
.166:   DC.B    "FBULT",0
.167:   DC.B    "FBULE",0
.168:   DC.B    "FBNE",0
.169:   DC.B    "FBT",0
.170:   DC.B    "FBSF",0
.171:   DC.B    "FBSEQ",0
.172:   DC.B    "FBGT",0
.173:   DC.B    "FBGE",0
.174:   DC.B    "FBLT",0
.175:   DC.B    "FBLE",0
.176:   DC.B    "FBGL",0
.177:   DC.B    "FBGLE",0
.178:   DC.B    "FBNGLE",0
.179:   DC.B    "FBNGL",0
.180:   DC.B    "FBNLE",0
.181:   DC.B    "FBNLT",0
.182:   DC.B    "FBNGE",0
.183:   DC.B    "FBNGT",0
.184:   DC.B    "FBSNE",0
.185:   DC.B    "FBST",0
.186:   DC.B    "PBBS",0
.187:   DC.B    "PBBC",0
.188:   DC.B    "PBLS",0
.189:   DC.B    "PBLC",0
.190:   DC.B    "PBSS",0
.191:   DC.B    "PBSC",0
.192:   DC.B    "PBAS",0
.193:   DC.B    "PBAC",0
.194:   DC.B    "PBWS",0
.195:   DC.B    "PBWC",0
.196:   DC.B    "PBIS",0
.197:   DC.B    "PBIC",0
.198:   DC.B    "PBGS",0
.199:   DC.B    "PBGC",0
.200:   DC.B    "PBCS",0
.201:   DC.B    "PBCC",0
.202:   DC.B    "FSADD",0
.203:   DC.B    "FDADD",0
.204:   DC.B    "FSDIV",0
.205:   DC.B    "FDDIV",0
.206:   DC.B    "FSMOVE",0
.207:   DC.B    "FDMOVE",0
.208:   DC.B    "FSMUL",0
.209:   DC.B    "FDMUL",0
.210:   DC.B    "FSNEG",0
.211:   DC.B    "FDNEG",0
.212:   DC.B    "FSSQRT",0
.213:   DC.B    "FDSQRT",0
.214:   DC.B    "FSSUB",0
.215:   DC.B    "FDSUB",0
.216:   DC.B    "FDBF",0
.217:   DC.B    "FDBEQ",0
.218:   DC.B    "FDBOGT",0
.219:   DC.B    "FDBOGE",0
.220:   DC.B    "FDBOLT",0
.221:   DC.B    "FDBOLE",0
.222:   DC.B    "FDBOGL",0
.223:   DC.B    "FDBOR",0
.224:   DC.B    "FDBUN",0
.225:   DC.B    "FDBUNE",0
.226:   DC.B    "FDBUGT",0
.227:   DC.B    "FDBUGE",0
.228:   DC.B    "FDBULT",0
.229:   DC.B    "FDBULE",0
.230:   DC.B    "FDBNE",0
.231:   DC.B    "FDBT",0
.232:   DC.B    "FDBSF",0
.233:   DC.B    "FDBSEQ",0
.234:   DC.B    "FDBGT",0
.235:   DC.B    "FDBGE",0
.236:   DC.B    "FDBLT",0
.237:   DC.B    "FDBLE",0
.238:   DC.B    "FDBGL",0
.239:   DC.B    "FDBGLE",0
.240:   DC.B    "FDBNGLE",0
.241:   DC.B    "FDBNGL",0
.242:   DC.B    "FDBNLE",0
.243:   DC.B    "FDBNLT",0
.244:   DC.B    "FDBNGE",0
.245:   DC.B    "FDBNGT",0
.246:   DC.B    "FDBSNE",0
.247:   DC.B    "FDBST",0
.248:   DC.B    "PDBBS",0
.249:   DC.B    "PDBBC",0
.250:   DC.B    "PDBLS",0
.251:   DC.B    "PDBLC",0
.252:   DC.B    "PDBSS",0
.253:   DC.B    "PDBSC",0
.254:   DC.B    "PDBAS",0
.255:   DC.B    "PDBAC",0
.256:   DC.B    "PDBWS",0
.257:   DC.B    "PDBWC",0
.258:   DC.B    "PDBIS",0
.259:   DC.B    "PDBIC",0
.260:   DC.B    "PDBGS",0
.261:   DC.B    "PDBGC",0
.262:   DC.B    "PDBCS",0
.263:   DC.B    "PDBCC",0
.264:   DC.B    "FSF",0
.265:   DC.B    "FSEQ",0
.266:   DC.B    "FSOGT",0
.267:   DC.B    "FSOGE",0
.268:   DC.B    "FSOLT",0
.269:   DC.B    "FSOLE",0
.270:   DC.B    "FSOGL",0
.271:   DC.B    "FSOR",0
.272:   DC.B    "FSUN",0
.273:   DC.B    "FSUNE",0
.274:   DC.B    "FSUGT",0
.275:   DC.B    "FSUGE",0
.276:   DC.B    "FSULT",0
.277:   DC.B    "FSULE",0
.278:   DC.B    "FSNE",0
.279:   DC.B    "FST",0
.280:   DC.B    "FSSF",0
.281:   DC.B    "FSSEQ",0
.282:   DC.B    "FSGT",0
.283:   DC.B    "FSGE",0
.284:   DC.B    "FSLT",0
.285:   DC.B    "FSLE",0
.286:   DC.B    "FSGL",0
.287:   DC.B    "FSGLE",0
.288:   DC.B    "FSNGLE",0
.289:   DC.B    "FSNGL",0
.290:   DC.B    "FSNLE",0
.291:   DC.B    "FSNLT",0
.292:   DC.B    "FSNGE",0
.293:   DC.B    "FSNGT",0
.294:   DC.B    "FSSNE",0
.295:   DC.B    "FSST",0
.296:   DC.B    "PSBS",0
.297:   DC.B    "PSBC",0
.298:   DC.B    "PSLS",0
.299:   DC.B    "PSLC",0
.300:   DC.B    "PDSS",0
.301:   DC.B    "PSSC",0
.302:   DC.B    "PSAS",0
.303:   DC.B    "PSAC",0
.304:   DC.B    "PSWS",0
.305:   DC.B    "PSWC",0
.306:   DC.B    "PSIS",0
.307:   DC.B    "PSIC",0
.308:   DC.B    "PSGS",0
.309:   DC.B    "PSGC",0
.310:   DC.B    "PSCS",0
.311:   DC.B    "PSCC",0
.312:   DC.B    "FMOVE",0
.313:   DC.B    "FNOP",0
.314:   DC.B    "FMOVECR",0
.315:   DC.B    "FMOVEM",0
.316:   DC.B    "FRESTORE",0
.317:   DC.B    "FSAVE",0
.318:   DC.B    "FSINCOS",0
.319:   DC.B    "FTRAPF",0
.320:   DC.B    "FTRAPEQ",0
.321:   DC.B    "FTRAPOGT",0
.322:   DC.B    "FTRAPOGE",0
.323:   DC.B    "FTRAPOLT",0
.324:   DC.B    "FTRAPOLE",0
.325:   DC.B    "FTRAPOGL",0
.326:   DC.B    "FTRAPOR",0
.327:   DC.B    "FTRAPUN",0
.328:   DC.B    "FTRAPUNE",0
.329:   DC.B    "FTRAPUGT",0
.330:   DC.B    "FTRAPUGE",0
.331:   DC.B    "FTRAPULT",0
.332:   DC.B    "FTRAPULE",0
.333:   DC.B    "FTRAPNE",0
.334:   DC.B    "FTRAPT",0
.335:   DC.B    "FTRAPSF",0
.336:   DC.B    "FTRAPSEQ",0
.337:   DC.B    "FTRAPGT",0
.338:   DC.B    "FTRAPGE",0
.339:   DC.B    "FTRAPLT",0
.340:   DC.B    "FTRAPLE",0
.341:   DC.B    "FTRAPGL",0
.342:   DC.B    "FTRAPGLE",0
.343:   DC.B    "FTRAPNGLE",0
.344:   DC.B    "FTRAPNGL",0
.345:   DC.B    "FTRAPNLE",0
.346:   DC.B    "FTRAPNLT",0
.347:   DC.B    "FTRAPNGE",0
.348:   DC.B    "FTRAPNGT",0
.349:   DC.B    "FTRAPSNE",0
.350:   DC.B    "FTRAPST",0
.351:   DC.B    "PTRAPBS",0
.352:   DC.B    "PTRAPBC",0
.353:   DC.B    "PTRAPLS",0
.354:   DC.B    "PTRAPLC",0
.355:   DC.B    "PTRAPSS",0
.356:   DC.B    "PTRAPSC",0
.357:   DC.B    "PTRAPAS",0
.358:   DC.B    "PTRAPAC",0
.359:   DC.B    "PTRAPWS",0
.360:   DC.B    "PTRAPWC",0
.361:   DC.B    "PTRAPIS",0
.362:   DC.B    "PTRAPIC",0
.363:   DC.B    "PTRAPGS",0
.364:   DC.B    "PTRAPGC",0
.365:   DC.B    "PTRAPCS",0
.366:   DC.B    "PTRAPCC",0
.367:   DC.B    "FTST",0
.368:   DC.B    "PSAVE",0
.369:   DC.B    "PRESTORE",0
.370:   DC.B    "PFLUSHA",0
.371:   DC.B    "PFLUSH",0
.372:   DC.B    "PFLUSHS",0
.373:   DC.B    "PFLUSHR",0
.374:   DC.B    "PLOADR",0
.375:   DC.B    "PLOADW",0
.376:   DC.B    "PTESTR",0
.377:   DC.B    "PTESTW",0
.378:   DC.B    "PMOVE",0
.379:   DC.B    "PFLUSHAN",0
.380:   DC.B    "PFLUSHN",0
.381:   DC.B    "PLPAR",0
.382:   DC.B    "PLPAW",0
.383:   DC.B    "BKPT",0
.384:   DC.B    "MOVEC",0
.385:   DC.B    "MOVES",0
.386:   DC.B    "BFCHG",0
.387:   DC.B    "BFCLR",0
.388:   DC.B    "BFEXTS",0
.389:   DC.B    "BFEXTU",0
.390:   DC.B    "BFFFO",0
.391:   DC.B    "BFSET",0
.392:   DC.B    "BFTST",0
.393:   DC.B    "BFINS",0
.394:   DC.B    "DIVSL",0
.395:   DC.B    "DIVUL",0
.396:   DC.B    "EXTB",0
.397:   DC.B    "TRAPCC",0
.398:   DC.B    "TRAPCS",0
.399:   DC.B    "TRAPEQ",0
.400:   DC.B    "TRAPF",0
.401:   DC.B    "TRAPGE",0
.402:   DC.B    "TRAPGT",0
.403:   DC.B    "TRAPHI",0
.404:   DC.B    "TRAPLE",0
.405:   DC.B    "TRAPLS",0
.406:   DC.B    "TRAPLT",0
.407:   DC.B    "TRAPMI",0
.408:   DC.B    "TRAPNE",0
.409:   DC.B    "TRAPPL",0
.410:   DC.B    "TRAPT",0
.411:   DC.B    "TRAPVC",0
.412:   DC.B    "TRAPVS",0
.413:   DC.B    "CINVL",0
.414:   DC.B    "CINVP",0
.415:   DC.B    "CINVA",0
.416:   DC.B    "CPUSHL",0
.417:   DC.B    "CPUSHP",0
.418:   DC.B    "CPUSHA",0
.419:   DC.B    "MOVE16",0
.420:   DC.B    "LPSTOP",0
.421:   DC.B    "HALT",0
.422:   DC.B    "PULSE",0
    EVEN
;*-*
;; AssemblerJobs
; ADDR. MODE MASKS

; TODO:
;  - MOVE -> Condition register support
;  - Implement: CALLM, CAS, CAS2, CHK2, CMP2, PACK, UNPK, RTM
;  -

;; Sizes
;----------------QDPXSLWB---

SIZE_BWL=       %00000111
SIZE_SBWL=      %00001111
SIZE_BL=        %00000101
SIZE_WL=        %00000110
SIZE_L=         %00000100
SIZE_B=         %00000001
SIZE_BWLSXPD=   %01111111
SIZE_S=         %00001000
SIZE_D=         %01000000
SIZE_W=         %00000010
SIZE_BWLSXD=    %01011111
SIZE_X=         %00010000
SIZE_LX=        %00010100
SIZE_WLQ=       %10000110
;*-*
;; Adressing modes
ASRC    = %111111111111
NASRC   = %111111111101
MMSRC   = %011111101100
PSRC    = %011111100000

DEST    = %000111111101
MDEST   = %000111111100
QDEST   = %000111111111
BTDEST  = %011111111101
MMDEST  = %011111110100
PMDEST  = %011111111100

JLEA    = %011111100100
FSAVEM  = %000111110100
FRESTM  = %000111101100
;*-*
;; Jobs
;---------------------------------------

SIZE    = 2
SIZEM   = 3
SIZEA   = 16
SIZEE   = 17
SIZEF   = 26    ; FIXED SIZE

EA  = 4
EAM = 5

COMMA   = 6

ADDSUB  = 7
IMMMQ   = 8
IMMQ    = 9

BCC = 10
DBCC    = 11
DOEXG   = 19
CMPM    = 20
MOVEM   = 21
TRAP    = 22
MOVEP   = 23
CMP_I   = 24

ADRREG  = 12
DATAREG = 14

SHIFT   = 13
BIT = 15
XREG    = 18

CPUSUP  = 25
SIZE0   = 27
SIZEO   = 28
FPM     = 29
FPUSUP  = 30
WARN46  = 31
FPD     = 32
MMUSUP  = 33
COPY    = 34
FPMOVE  = 35
FMOVECR = 36
FMOVEM  = 37
FSINCOS = 38
TRAPCC  = 39
FTST    = 40
PMMSTD  = 41
PMMLDX  = 42
PMMTST  = 43
PMMMOVE = 44
PMMEA   = 45
IMMBK   = 46
MOVEC   = 47
MOVES   = 48
BITFLD1 = 49
BITFLD2 = 50
BITFLD3 = 51
MULDIV  = 52
LINK    = 53
CPCACHE = 54
MOVE16  = 55
LPSTOP  = 56
DOMOVE  = 57
DOANDI  = 58
DOEORI  = 59
DOORI   = 60
;*-*
ASM_INSJOB:
    DC.L    .1,.2,.3,.4,.5,.6,.7,.8,.9,.10,.11,.12,.13,.14,.15,.16,.17
    DC.L    .18,.19,.20,.21,.22,.23,.24,.25,.26,.27,.28,.29,.30,.31,.32
    DC.L    .33,.34,.35,.36,.37,.38,.39,.40,.41,.42,.43,.44,.45,.46
    DC.L    .47,.48,.49,.50,.51,.52,.53,.54,.55,.56,.57,.58,.59,.60
    DC.L    .61,.62,.63,.64,.65,.66,.67,.68,.69,.70,.71,.72,.73,.74
    DC.L    .75,.76,.77,.78,.79,.80,.81,.82,.83,.84,.85,.86,.87,.88
    DC.L    .89,.90,.91,.92,.93,.94,.95,.96,.97,.98,.99,.100,.101,.102
    DC.L    .103,.104,.105,.106,.107,.108,.109,.110,.111,.112
    DC.L    .113,.114,.115,.116,.117,.118,.119,.120,.121,.122
    DC.L    .123,.124,.125,.126,.127,.128,.129,.130,.131,.132
    DC.L    .133,.134,.135,.136,.137,.138,.139,.140,.141,.142
    DC.L    .143,.144,.145,.146,.147,.148,.149,.150,.151,.152
    DC.L    .153,.154,.155,.156,.157,.158,.159,.160,.161,.162
    DC.L    .163,.164,.165,.166,.167,.168,.169,.170,.171,.172
    DC.L    .173,.174,.175,.176,.177,.178,.179,.180,.181,.182
    DC.L    .183,.184,.185,.186,.187,.188,.189,.190,.191,.192
    DC.L    .193,.194,.195,.196,.197,.198,.199,.200,.201,.202
    DC.L    .203,.204,.205,.206,.207,.208,.209,.210,.211,.212
    DC.L    .213,.214,.215,.216,.217,.218,.219,.220,.221,.222
    DC.L    .223,.224,.225,.226,.227,.228,.229,.230,.231,.232
    DC.L    .233,.234,.235,.236,.237,.238,.239,.240,.241,.242
    DC.L    .243,.244,.245,.246,.247,.248,.249,.250,.251,.252
    DC.L    .253,.254,.255,.256,.257,.258,.259,.260,.261,.262
    DC.L    .263,.264,.265,.266,.267,.268,.269,.270,.271,.272
    DC.L    .273,.274,.275,.276,.277,.278,.279,.280,.281,.282
    DC.L    .283,.284,.285,.286,.287,.288,.289,.290,.291,.292
    DC.L    .293,.294,.295,.296,.297,.298,.299,.300,.301,.302
    DC.L    .303,.304,.305,.306,.307,.308,.309,.310,.311,.312
    DC.L    .313,.314,.315,.316,.317,.318,.319,.320,.321,.322
    DC.L    .323,.324,.325,.326,.327,.328,.329,.330,.331,.332
    DC.L    .333,.334,.335,.336,.337,.338,.339,.340,.341,.342
    DC.L    .343,.344,.345,.346,.347,.348,.349,.350,.351,.352
    DC.L    .353,.354,.355,.356,.357,.358,.359,.360,.361,.362
    DC.L    .363,.364,.365,.366,.367,.368,.369,.370,.371,.372
    DC.L    .373,.374,.375,.376,.377,.378,.379,.380,.381,.382
    DC.L    .383,.384,.385,.386,.387,.388,.389,.390,.391,.392
    DC.L    .393,.394,.395,.396,.397,.398,.399,.400,.401,.402
    DC.L    .403,.404,.405,.406,.407,.408,.409,.410,.411,.412
    DC.L    .413,.414,.415,.416,.417,.418,.419,.420,.421,.422

    DC.L    0

.1:     DC.W    $0000,SIZEM,2,SIZE_BWL,12,DOMOVE,0                                      ; MOVE
.2:     DC.W    $4E75,SIZE0,0                                                           ; RTS
.3:     DC.W    $D000,SIZE,2,SIZE_BWL,6,ADDSUB,$0600,0                                  ; ADD
.4:     DC.W    $9000,SIZE,2,SIZE_BWL,6,ADDSUB,$0400,0                                  ; SUB
.5:     DC.W    $7000,SIZEO,3,SIZE_L,IMMMQ,0                                            ; MOVEQ
.6:     DC.W    $E000,SIZEO,2,SIZE_BWL,SHIFT,$E0C0,0                                    ; ASR
.7:     DC.W    $6100,SIZEO,2,SIZE_SBWL,BCC,$61FF,0                                     ; BSR
.8:     DC.W    $4200,SIZE,2,SIZE_BWL,6,EA,DEST,0,0                                     ; CLR
.9:     DC.W    $B000,SIZE,2,SIZE_BWL,6,CMP_I,EA,ASRC,0,COMMA,DATAREG,9,0               ; CMP
.10:    DC.W    $B100,SIZE,2,SIZE_BWL,6,DATAREG,9,COMMA,EA,DEST,0,0                     ; EOR
.11:    DC.W    $4EC0,SIZE0,EA,JLEA,0,0                                                 ; JMP
.12:    DC.W    $4E80,SIZE0,EA,JLEA,0,0                                                 ; JSR
.13:    DC.W    $E108,SIZEO,2,SIZE_BWL,SHIFT,$E3C0,0                                    ; LSL
.14:    DC.W    $E008,SIZEO,2,SIZE_BWL,SHIFT,$E2C0,0                                    ; LSR
.15:    DC.W    $5100,SIZE,2,SIZE_BWL,6,IMMQ,COMMA,EA,QDEST,0,0                         ; SUBQ
.16:    DC.W    $5000,SIZE,2,SIZE_BWL,6,IMMQ,COMMA,EA,QDEST,0,0                         ; ADDQ
.17:    DC.W    $8000,SIZE,2,SIZE_BWL,6,ADDSUB,0,0                                      ; OR
.18:    DC.W    $E118,SIZEO,2,SIZE_BWL,SHIFT,$E7C0,0                                    ; ROL
.19:    DC.W    $E018,SIZEO,2,SIZE_BWL,SHIFT,$E6C0,0                                    ; ROR
.20:    DC.W    $C000,SIZE,2,SIZE_BWL,6,ADDSUB,$0200,0                                  ; AND
.21:    DC.W    $E100,SIZEO,2,SIZE_BWL,SHIFT,$E1C0,0                                    ; ASL
.22:    DC.W    $0100,SIZEO,2,SIZE_BL,BIT,$0800,0                                       ; BTST
.23:    DC.W    $4880,SIZEE,2,SIZE_WL,MOVEM,0                                           ; MOVEM
.24:    DC.W    $D0C0,SIZEA,2,SIZE_WL,EA,ASRC,0,COMMA,ADRREG,9,0                        ; ADDA
.25:    DC.W    $0600,SIZE,2,SIZE_BWL,6,EA,$800,-1,COMMA,EA,DEST,0,0                    ; ADDI
.26:    DC.W    $D100,SIZE,2,SIZE_BWL,6,XREG,0                                          ; ADDX
.27:    DC.W    $B0C0,SIZEA,2,SIZE_WL,EA,ASRC,0,COMMA,ADRREG,9,0                        ; CMPA
.28:    DC.W    $B108,SIZE,2,SIZE_BWL,6,CMPM,0                                          ; CMPM
.29:    DC.W    $0C00,SIZE,2,SIZE_BWL,6,EA,$800,-1,COMMA,EA,DEST,0,0                    ; CMPI
.30:    DC.W    $0040,SIZEM,2,SIZE_WL,12,EA,ASRC,0,COMMA,ADRREG,9,0                     ; MOVEA
.31:    DC.W    $6000,SIZEO,2,SIZE_SBWL,BCC,$60FF,0                                     ; BRA
.32:    DC.W    $4000,SIZE,2,SIZE_BWL,6,EA,DEST,0,0                                     ; NEGX
.33:    DC.W    $0000,SIZE,2,SIZE_BWL,6,DOORI,0                                         ; ORI
.34:    DC.W    $90C0,SIZEA,2,SIZE_WL,EA,ASRC,0,COMMA,ADRREG,9,0                        ; SUBA
.35:    DC.W    $0400,SIZE,2,SIZE_BWL,6,EA,$800,-1,COMMA,EA,DEST,0,0                    ; SUBI
.36:    DC.W    $9100,SIZE,2,SIZE_BWL,6,XREG,0                                          ; SUBX
.37:    DC.W    $4600,SIZE,2,SIZE_BWL,6,EA,DEST,0,0                                     ; NOT
.38:    DC.W    $C1C0,SIZEO,2,SIZE_WL,MULDIV,$4c00,$0c00,0                              ; MULS
.39:    DC.W    $C0C0,SIZEO,2,SIZE_WL,MULDIV,$4c00,$0400,0                              ; MULU
.40:    DC.W    $4400,SIZE,2,SIZE_BWL,6,EA,DEST,0,0                                     ; NEG
.41:    DC.W    $4A00,SIZE,2,SIZE_BWL,6,EA,DEST,0,0                                     ; TST
.42:    DC.W    $4840,SIZE0,DATAREG,0,0                                                 ; SWAP
.43:    DC.W    $41C0,SIZEO,3,SIZE_L,EA,JLEA,0,COMMA,ADRREG,9,0                         ; LEA
.44:    DC.W    $81C0,SIZEO,2,SIZE_WL,MULDIV,$4c40,$0c00,0                              ; DIVS
.45:    DC.W    $80C0,SIZEO,2,SIZE_WL,MULDIV,$4c40,$0400,0                              ; DIVU
.46:    DC.W    $C100,SIZE0,DOEXG,0                                                     ; EXG
.47:    DC.W    $4E72,SIZE0,EA,$800,-1,0                                                ; STOP
.48:    DC.W    $4E77,SIZE0,0                                                           ; RTR
.49:    DC.W    $4E73,SIZE0,0                                                           ; RTE
.50:    DC.W    $C100,SIZEO,1,SIZE_B,XREG,0                                             ; ABCD
.51:    DC.W    $8100,SIZEO,1,SIZE_B,XREG,0                                             ; SBCD
.52:    DC.W    $0108,SIZEE,2,SIZE_WL,MOVEP,0                                           ; MOVEP
.53:    DC.W    $4E71,SIZE0,0                                                           ; NOP
.54:    DC.W    $E110,SIZEO,2,SIZE_BWL,SHIFT,$E5C0,0                                    ; ROXL
.55:    DC.W    $E010,SIZEO,2,SIZE_BWL,SHIFT,$E4C0,0                                    ; ROXR
.56:    DC.W    $0140,SIZEO,3,SIZE_BL,BIT,$0840,0                                       ; BCHG
.57:    DC.W    $0180,SIZEO,3,SIZE_BL,BIT,$0880,0                                       ; BCLR
.58:    DC.W    $01C0,SIZEO,3,SIZE_BL,BIT,$08C0,0                                       ; BSET
.59:    DC.W    $4180,SIZEO,2,SIZE_WL,EA,NASRC,0,COMMA,DATAREG,9,0                      ; CHK
.60:    DC.W    $4880,SIZEE,2,SIZE_WL,DATAREG,0,0                                       ; EXT
.61:    DC.W    $4E50,SIZEO,2,SIZE_WL,LINK,0                                            ; LINK
.62:    DC.W    $4E58,SIZE0,ADRREG,0,0                                                  ; UNLK
.63:    DC.W    $4800,SIZEO,1,SIZE_B,EA,DEST,0,0                                        ; NBCD
.64:    DC.W    $4840,SIZEO,3,SIZE_L,EA,PSRC,0,0                                        ; PEA
.65:    DC.W    $4E70,SIZE0,0                                                           ; RESET
.66:    DC.W    $4E40,SIZE0,TRAP,0                                                      ; TRAP
.67:    DC.W    $4E76,SIZE0,0                                                           ; TRAPV
.68:    DC.W    $6200,SIZEO,2,SIZE_SBWL,BCC,$62FF,0                                     ; Bcc
.69:    DC.W    $6300,SIZEO,2,SIZE_SBWL,BCC,$63FF,0
.70:    DC.W    $6400,SIZEO,2,SIZE_SBWL,BCC,$64FF,0
.71:    DC.W    $6500,SIZEO,2,SIZE_SBWL,BCC,$65FF,0
.72:    DC.W    $6600,SIZEO,2,SIZE_SBWL,BCC,$66FF,0
.73:    DC.W    $6700,SIZEO,2,SIZE_SBWL,BCC,$67FF,0
.74:    DC.W    $6800,SIZEO,2,SIZE_SBWL,BCC,$68FF,0
.75:    DC.W    $6900,SIZEO,2,SIZE_SBWL,BCC,$69FF,0
.76:    DC.W    $6A00,SIZEO,2,SIZE_SBWL,BCC,$6AFF,0
.77:    DC.W    $6B00,SIZEO,2,SIZE_SBWL,BCC,$6BFF,0
.78:    DC.W    $6C00,SIZEO,2,SIZE_SBWL,BCC,$6CFF,0
.79:    DC.W    $6D00,SIZEO,2,SIZE_SBWL,BCC,$6DFF,0
.80:    DC.W    $6E00,SIZEO,2,SIZE_SBWL,BCC,$6EFF,0
.81:    DC.W    $6F00,SIZEO,2,SIZE_SBWL,BCC,$6FFF,0
.82:    DC.W    $51C8,SIZE0,DBCC,0                                                      ; DBRA
.83:    DC.W    $51C8,SIZE0,DBCC,0                                                      ; DBF
.84:    DC.W    $50C8,SIZE0,DBCC,0                                                      ; DBT
.85:    DC.W    $52C8,SIZE0,DBCC,0                                                      ; DBcc
.86:    DC.W    $53C8,SIZE0,DBCC,0
.87:    DC.W    $54C8,SIZE0,DBCC,0
.88:    DC.W    $55C8,SIZE0,DBCC,0
.89:    DC.W    $56C8,SIZE0,DBCC,0
.90:    DC.W    $57C8,SIZE0,DBCC,0
.91:    DC.W    $58C8,SIZE0,DBCC,0
.92:    DC.W    $59C8,SIZE0,DBCC,0
.93:    DC.W    $5AC8,SIZE0,DBCC,0
.94:    DC.W    $5BC8,SIZE0,DBCC,0
.95:    DC.W    $5CC8,SIZE0,DBCC,0
.96:    DC.W    $5DC8,SIZE0,DBCC,0
.97:    DC.W    $5EC8,SIZE0,DBCC,0
.98:    DC.W    $5FC8,SIZE0,DBCC,0
.99:    DC.W    $52C0,SIZEO,1,SIZE_B,EA,DEST,0,0                                        ; Scc
.100:   DC.W    $53C0,SIZEO,1,SIZE_B,EA,DEST,0,0
.101:   DC.W    $54C0,SIZEO,1,SIZE_B,EA,DEST,0,0
.102:   DC.W    $55C0,SIZEO,1,SIZE_B,EA,DEST,0,0
.103:   DC.W    $56C0,SIZEO,1,SIZE_B,EA,DEST,0,0
.104:   DC.W    $57C0,SIZEO,1,SIZE_B,EA,DEST,0,0
.105:   DC.W    $58C0,SIZEO,1,SIZE_B,EA,DEST,0,0
.106:   DC.W    $59C0,SIZEO,1,SIZE_B,EA,DEST,0,0
.107:   DC.W    $5AC0,SIZEO,1,SIZE_B,EA,DEST,0,0
.108:   DC.W    $5BC0,SIZEO,1,SIZE_B,EA,DEST,0,0
.109:   DC.W    $5CC0,SIZEO,1,SIZE_B,EA,DEST,0,0
.110:   DC.W    $5DC0,SIZEO,1,SIZE_B,EA,DEST,0,0
.111:   DC.W    $5EC0,SIZEO,1,SIZE_B,EA,DEST,0,0
.112:   DC.W    $5FC0,SIZEO,1,SIZE_B,EA,DEST,0,0
.113:   DC.W    $50C0,SIZEO,1,SIZE_B,EA,DEST,0,0                                        ; ST
.114:   DC.W    $51C0,SIZEO,1,SIZE_B,EA,DEST,0,0                                        ; SF
.115:   DC.W    $0200,SIZE,2,SIZE_BWL,6,DOANDI,0                                        ; ANDI
.116:   DC.W    $0A00,SIZE,2,SIZE_BWL,6,DOEORI,0                                        ; EORI
.117:   DC.W    $4AFC,SIZE0,0                                                           ; ILLEGAL
.118:   DC.W    $4E74,SIZE0,CPUSUP,%11111110,EA,$800,-1,0                               ; RTD=118!!!
.119:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPM,$0018,0,FPUSUP,3,WARN46,0                 ; FABS
.120:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPM,$001C,0,FPUSUP,3,WARN46,0                 ; FACOS
.121:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPM,$000C,0,FPUSUP,3,WARN46,0                 ; FASIN
.122:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPM,$000A,0,FPUSUP,3,WARN46,0                 ; FATAN
.123:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPM,$000D,0,FPUSUP,3,WARN46,0                 ; FATANH
.124:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPM,$001D,0,FPUSUP,3,WARN46,0                 ; FCOS
.125:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPM,$0019,0,FPUSUP,3,WARN46,0                 ; FCOSH
.126:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPM,$0010,0,FPUSUP,3,WARN46,0                 ; FETOX
.127:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPM,$0008,0,FPUSUP,3,WARN46,0                 ; FETOXM1
.128:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPM,$001E,0,FPUSUP,3,WARN46,0                 ; FGETEXP
.129:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPM,$001F,0,FPUSUP,3,WARN46,0                 ; FGETMAN
.130:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPM,$0001,0,FPUSUP,3,WARN46,0                 ; FINT
.131:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPM,$0003,0,FPUSUP,3,WARN46,0                 ; FINTRZ
.132:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPM,$0015,0,FPUSUP,3,WARN46,0                 ; FLOG10
.133:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPM,$0016,0,FPUSUP,3,WARN46,0                 ; FLOG2
.134:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPM,$0014,0,FPUSUP,3,WARN46,0                 ; FLOGN
.135:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPM,$0006,0,FPUSUP,3,WARN46,0                 ; FLOGNP1
.136:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPM,$001A,0,FPUSUP,3,0                        ; FNEG
.137:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPM,$000E,0,FPUSUP,3,WARN46,0                 ; FSIN
.138:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPM,$0002,0,FPUSUP,3,WARN46,0                 ; FSINH
.139:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPM,$0004,0,FPUSUP,3,0                        ; FSQRT
.140:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPM,$000F,0,FPUSUP,3,WARN46,0                 ; FTAN
.141:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPM,$0009,0,FPUSUP,3,WARN46,0                 ; FTANH
.142:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPM,$0012,0,FPUSUP,3,WARN46,0                 ; FTWOTOX
.143:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPM,$0011,0,FPUSUP,3,WARN46,0                 ; FTWOTOX
.144:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPD,$0022,0,FPUSUP,3,0                        ; FADD
.145:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPD,$0038,0,FPUSUP,3,0                        ; FCMP
.146:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPD,$0020,0,FPUSUP,3,0                        ; FDIV
.147:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPD,$0021,0,FPUSUP,3,WARN46,0                 ; FMOD
.148:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPD,$0023,0,FPUSUP,3,0                        ; FMUL
.149:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPD,$0025,0,FPUSUP,3,WARN46,0                 ; FREM
.150:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPD,$0026,0,FPUSUP,3,WARN46,0                 ; FSCALE
.151:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPD,$0024,0,FPUSUP,3,WARN46,0                 ; FSGLDIV
.152:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPD,$0027,0,FPUSUP,3,WARN46,0                 ; FSGLMUL
.153:   DC.W    $F200,SIZEO,5,SIZE_BWLSXD,FPD,$0028,0,FPUSUP,3,0                        ; FSUB
.154:   DC.W    $F280,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$F2C0,0                              ; FBF
.155:   DC.W    $F281,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$F2C1,0
.156:   DC.W    $F282,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$f2C2,0
.157:   DC.W    $F283,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$F2C3,0
.158:   DC.W    $F284,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$F2C4,0
.159:   DC.W    $F285,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$F2C5,0
.160:   DC.W    $F286,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$F2C6,0
.161:   DC.W    $F287,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$F2C7,0
.162:   DC.W    $F288,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$F2C8,0
.163:   DC.W    $F289,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$F2C9,0
.164:   DC.W    $F28A,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$F2CA,0
.165:   DC.W    $F28B,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$F2CB,0
.166:   DC.W    $F28C,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$F2CC,0
.167:   DC.W    $F28D,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$F2CD,0
.168:   DC.W    $F28E,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$F2CE,0
.169:   DC.W    $F28F,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$F2CF,0
.170:   DC.W    $F290,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$F2D0,0
.171:   DC.W    $F291,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$F2D1,0
.172:   DC.W    $F292,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$F2D2,0
.173:   DC.W    $F293,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$F2D3,0
.174:   DC.W    $F294,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$F2D4,0
.175:   DC.W    $F295,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$F2D5,0
.176:   DC.W    $F296,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$F2D6,0
.177:   DC.W    $F297,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$F2D7,0
.178:   DC.W    $F298,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$F2D8,0
.179:   DC.W    $F299,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$F2D9,0
.180:   DC.W    $F29A,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$F2DA,0
.181:   DC.W    $F29B,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$F2DB,0
.182:   DC.W    $F29C,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$F2DC,0
.183:   DC.W    $F29D,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$F2DD,0
.184:   DC.W    $F29E,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$F2DE,0
.185:   DC.W    $F29F,SIZEO,2,SIZE_WL,FPUSUP,3,BCC,$F2DF,0
.186:   DC.W    $F2A0,SIZEO,2,SIZE_WL,MMUSUP,3,BCC,$F2E0,0
.187:   DC.W    $F2A1,SIZEO,2,SIZE_WL,MMUSUP,3,BCC,$F2E1,0
.188:   DC.W    $F2A2,SIZEO,2,SIZE_WL,MMUSUP,3,BCC,$F2E2,0
.189:   DC.W    $F2A3,SIZEO,2,SIZE_WL,MMUSUP,3,BCC,$F2E3,0
.190:   DC.W    $F2A4,SIZEO,2,SIZE_WL,MMUSUP,3,BCC,$F2E4,0
.191:   DC.W    $F2A5,SIZEO,2,SIZE_WL,MMUSUP,3,BCC,$F2E5,0
.192:   DC.W    $F2A6,SIZEO,2,SIZE_WL,MMUSUP,3,BCC,$F2E6,0
.193:   DC.W    $F2A7,SIZEO,2,SIZE_WL,MMUSUP,3,BCC,$F2E7,0
.194:   DC.W    $F2A8,SIZEO,2,SIZE_WL,MMUSUP,3,BCC,$F2E8,0
.195:   DC.W    $F2A9,SIZEO,2,SIZE_WL,MMUSUP,3,BCC,$F2E9,0
.196:   DC.W    $F2AA,SIZEO,2,SIZE_WL,MMUSUP,3,BCC,$F2EA,0
.197:   DC.W    $F2AB,SIZEO,2,SIZE_WL,MMUSUP,3,BCC,$F2EB,0
.198:   DC.W    $F2AC,SIZEO,2,SIZE_WL,MMUSUP,3,BCC,$F2EC,0
.199:   DC.W    $F2AD,SIZEO,2,SIZE_WL,MMUSUP,3,BCC,$F2ED,0
.200:   DC.W    $F2AE,SIZEO,2,SIZE_WL,MMUSUP,3,BCC,$F2EE,0
.201:   DC.W    $F2AF,SIZEO,2,SIZE_WL,MMUSUP,3,BCC,$F2EF,0
.202:   DC.W    $F200,SIZEO,4,SIZE_S,FPD,$0062,0,FPUSUP,2,0                             ; FSADD
.203:   DC.W    $F200,SIZEO,7,SIZE_D,FPD,$0066,0,FPUSUP,2,0                             ; FDADD
.204:   DC.W    $F200,SIZEO,4,SIZE_S,FPD,$0060,0,FPUSUP,2,0                             ; FSDIV
.205:   DC.W    $F200,SIZEO,7,SIZE_D,FPD,$0064,0,FPUSUP,2,0                             ; FDDIV
.206:   DC.W    $F200,SIZEO,4,SIZE_S,FPD,$0040,1,FPUSUP,2,0                             ; FSMOVE
.207:   DC.W    $F200,SIZEO,7,SIZE_D,FPD,$0044,1,FPUSUP,2,0                             ; FDMOVE
.208:   DC.W    $F200,SIZEO,4,SIZE_S,FPD,$0063,0,FPUSUP,2,0                             ; FSMUL
.209:   DC.W    $F200,SIZEO,7,SIZE_D,FPD,$0067,0,FPUSUP,2,0                             ; FDMUL
.210:   DC.W    $F200,SIZEO,4,SIZE_S,FPM,$005A,0,FPUSUP,2,0                             ; FSNEG
.211:   DC.W    $F200,SIZEO,7,SIZE_D,FPM,$005E,0,FPUSUP,2,0                             ; FDNEG
.212:   DC.W    $F200,SIZEO,4,SIZE_S,FPM,$0041,0,FPUSUP,2,0                             ; FSSQRT
.213:   DC.W    $F200,SIZEO,7,SIZE_D,FPM,$0045,0,FPUSUP,2,0                             ; FDSQRT
.214:   DC.W    $F200,SIZEO,4,SIZE_S,FPD,$0068,0,FPUSUP,2,0                             ; FSSUB
.215:   DC.W    $F200,SIZEO,7,SIZE_D,FPD,$006C,0,FPUSUP,2,0                             ; FDSUB
.216:   DC.W    $F24F,COPY,$0000,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0                  ; FDBF
.217:   DC.W    $F24F,COPY,$0001,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0
.218:   DC.W    $F24F,COPY,$0002,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0
.219:   DC.W    $F24F,COPY,$0003,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0
.220:   DC.W    $F24F,COPY,$0004,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0
.221:   DC.W    $F24F,COPY,$0005,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0
.222:   DC.W    $F24F,COPY,$0006,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0
.223:   DC.W    $F24F,COPY,$0007,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0
.224:   DC.W    $F24F,COPY,$0008,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0
.225:   DC.W    $F24F,COPY,$0009,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0
.226:   DC.W    $F24F,COPY,$000a,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0
.227:   DC.W    $F24F,COPY,$000b,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0
.228:   DC.W    $F24F,COPY,$000c,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0
.229:   DC.W    $F24F,COPY,$000d,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0
.230:   DC.W    $F24F,COPY,$000e,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0
.231:   DC.W    $F24F,COPY,$000f,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0
.232:   DC.W    $F24F,COPY,$0010,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0
.233:   DC.W    $F24F,COPY,$0011,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0
.234:   DC.W    $F24F,COPY,$0012,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0
.235:   DC.W    $F24F,COPY,$0013,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0
.236:   DC.W    $F24F,COPY,$0014,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0
.237:   DC.W    $F24F,COPY,$0015,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0
.238:   DC.W    $F24F,COPY,$0016,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0
.239:   DC.W    $F24F,COPY,$0017,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0
.240:   DC.W    $F24F,COPY,$0018,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0
.241:   DC.W    $F24F,COPY,$0019,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0
.242:   DC.W    $F24F,COPY,$001a,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0
.243:   DC.W    $F24F,COPY,$001b,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0
.244:   DC.W    $F24F,COPY,$001c,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0
.245:   DC.W    $F24F,COPY,$001d,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0
.246:   DC.W    $F24F,COPY,$001e,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0
.247:   DC.W    $F24F,COPY,$001f,SIZEO,2,SIZE_W,FPUSUP,3,WARN46,DBCC,0
.248:   DC.W    $F24F,COPY,$0020,SIZEO,2,SIZE_W,MMUSUP,3,DBCC,0
.249:   DC.W    $F24F,COPY,$0021,SIZEO,2,SIZE_W,MMUSUP,3,DBCC,0
.250:   DC.W    $F24F,COPY,$0022,SIZEO,2,SIZE_W,MMUSUP,3,DBCC,0
.251:   DC.W    $F24F,COPY,$0023,SIZEO,2,SIZE_W,MMUSUP,3,DBCC,0
.252:   DC.W    $F24F,COPY,$0024,SIZEO,2,SIZE_W,MMUSUP,3,DBCC,0
.253:   DC.W    $F24F,COPY,$0025,SIZEO,2,SIZE_W,MMUSUP,3,DBCC,0
.254:   DC.W    $F24F,COPY,$0026,SIZEO,2,SIZE_W,MMUSUP,3,DBCC,0
.255:   DC.W    $F24F,COPY,$0027,SIZEO,2,SIZE_W,MMUSUP,3,DBCC,0
.256:   DC.W    $F24F,COPY,$0028,SIZEO,2,SIZE_W,MMUSUP,3,DBCC,0
.257:   DC.W    $F24F,COPY,$0029,SIZEO,2,SIZE_W,MMUSUP,3,DBCC,0
.258:   DC.W    $F24F,COPY,$002a,SIZEO,2,SIZE_W,MMUSUP,3,DBCC,0
.259:   DC.W    $F24F,COPY,$002b,SIZEO,2,SIZE_W,MMUSUP,3,DBCC,0
.260:   DC.W    $F24F,COPY,$002c,SIZEO,2,SIZE_W,MMUSUP,3,DBCC,0
.261:   DC.W    $F24F,COPY,$002d,SIZEO,2,SIZE_W,MMUSUP,3,DBCC,0
.262:   DC.W    $F24F,COPY,$002e,SIZEO,2,SIZE_W,MMUSUP,3,DBCC,0
.263:   DC.W    $F24F,COPY,$002f,SIZEO,2,SIZE_W,MMUSUP,3,DBCC,0
.264:   DC.W    $F240,COPY,$0000,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0             ; FSF
.265:   DC.W    $F240,COPY,$0001,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0
.266:   DC.W    $F240,COPY,$0002,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0
.267:   DC.W    $F240,COPY,$0003,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0
.268:   DC.W    $F240,COPY,$0004,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0
.269:   DC.W    $F240,COPY,$0005,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0
.270:   DC.W    $F240,COPY,$0006,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0
.271:   DC.W    $F240,COPY,$0007,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0
.272:   DC.W    $F240,COPY,$0008,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0
.273:   DC.W    $F240,COPY,$0009,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0
.274:   DC.W    $F240,COPY,$000a,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0
.275:   DC.W    $F240,COPY,$000b,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0
.276:   DC.W    $F240,COPY,$000c,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0
.277:   DC.W    $F240,COPY,$000d,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0
.278:   DC.W    $F240,COPY,$000e,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0
.279:   DC.W    $F240,COPY,$000f,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0
.280:   DC.W    $F240,COPY,$0010,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0
.281:   DC.W    $F240,COPY,$0011,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0
.282:   DC.W    $F240,COPY,$0012,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0
.283:   DC.W    $F240,COPY,$0013,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0
.284:   DC.W    $F240,COPY,$0014,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0
.285:   DC.W    $F240,COPY,$0015,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0
.286:   DC.W    $F240,COPY,$0016,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0
.287:   DC.W    $F240,COPY,$0017,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0
.288:   DC.W    $F240,COPY,$0018,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0
.289:   DC.W    $F240,COPY,$0019,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0
.290:   DC.W    $F240,COPY,$001a,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0
.291:   DC.W    $F240,COPY,$001b,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0
.292:   DC.W    $F240,COPY,$001c,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0
.293:   DC.W    $F240,COPY,$001d,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0
.294:   DC.W    $F240,COPY,$001e,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0
.295:   DC.W    $F240,COPY,$001f,SIZEO,1,SIZE_B,EA,DEST,0,FPUSUP,3,WARN46,0
.296:   DC.W    $F240,COPY,$0020,SIZEO,1,SIZE_B,EA,DEST,0,MMUSUP,3,0
.297:   DC.W    $F240,COPY,$0021,SIZEO,1,SIZE_B,EA,DEST,0,MMUSUP,3,0
.298:   DC.W    $F240,COPY,$0022,SIZEO,1,SIZE_B,EA,DEST,0,MMUSUP,3,0
.299:   DC.W    $F240,COPY,$0023,SIZEO,1,SIZE_B,EA,DEST,0,MMUSUP,3,0
.300:   DC.W    $F240,COPY,$0024,SIZEO,1,SIZE_B,EA,DEST,0,MMUSUP,3,0
.301:   DC.W    $F240,COPY,$0025,SIZEO,1,SIZE_B,EA,DEST,0,MMUSUP,3,0
.302:   DC.W    $F240,COPY,$0026,SIZEO,1,SIZE_B,EA,DEST,0,MMUSUP,3,0
.303:   DC.W    $F240,COPY,$0027,SIZEO,1,SIZE_B,EA,DEST,0,MMUSUP,3,0
.304:   DC.W    $F240,COPY,$0028,SIZEO,1,SIZE_B,EA,DEST,0,MMUSUP,3,0
.305:   DC.W    $F240,COPY,$0029,SIZEO,1,SIZE_B,EA,DEST,0,MMUSUP,3,0
.306:   DC.W    $F240,COPY,$002a,SIZEO,1,SIZE_B,EA,DEST,0,MMUSUP,3,0
.307:   DC.W    $F240,COPY,$002b,SIZEO,1,SIZE_B,EA,DEST,0,MMUSUP,3,0
.308:   DC.W    $F240,COPY,$002c,SIZEO,1,SIZE_B,EA,DEST,0,MMUSUP,3,0
.309:   DC.W    $F240,COPY,$002d,SIZEO,1,SIZE_B,EA,DEST,0,MMUSUP,3,0
.310:   DC.W    $F240,COPY,$002e,SIZEO,1,SIZE_B,EA,DEST,0,MMUSUP,3,0
.311:   DC.W    $F240,COPY,$002f,SIZEO,1,SIZE_B,EA,DEST,0,MMUSUP,3,0
.312:   DC.W    $f200,COPY,$0000,SIZEO,5,SIZE_BWLSXPD,FPUSUP,3,FPMOVE,0                 ; FMOVE
.313:   DC.W    $f280,COPY,$0000,SIZE0,FPUSUP,3,0                                       ; FNOP
.314:   DC.W    $F200,COPY,$5C00,SIZEO,5,SIZE_X,FPUSUP,3,FMOVECR,WARN46,0               ; FMOVECR
.315:   DC.W    $F200,COPY,$0000,SIZEO,5,SIZE_LX,FPUSUP,3,FMOVEM,0                      ; FMOVEM
.316:   DC.W    $F340,SIZE0,EA,FRESTM,0,FPUSUP,3,0                                      ; FRESTORE
.317:   DC.W    $F300,SIZE0,EA,FSAVEM,0,FPUSUP,3,0                                      ; FSAVE
.318:   DC.W    $F200,COPY,$0030,SIZEO,5,SIZE_BWLSXD,FPUSUP,3,WARN46,FSINCOS,0          ; FSINCOS
.319:   DC.W    $F27a,COPY,$0000,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0                      ; FSF
.320:   DC.W    $F27a,COPY,$0001,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0
.321:   DC.W    $F27a,COPY,$0002,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0
.322:   DC.W    $F27a,COPY,$0003,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0
.323:   DC.W    $F27a,COPY,$0004,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0
.324:   DC.W    $F27a,COPY,$0005,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0
.325:   DC.W    $F27a,COPY,$0006,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0
.326:   DC.W    $F27a,COPY,$0007,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0
.327:   DC.W    $F27a,COPY,$0008,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0
.328:   DC.W    $F27a,COPY,$0009,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0
.329:   DC.W    $F27a,COPY,$000a,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0
.330:   DC.W    $F27a,COPY,$000b,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0
.331:   DC.W    $F27a,COPY,$000c,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0
.332:   DC.W    $F27a,COPY,$000d,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0
.333:   DC.W    $F27a,COPY,$000e,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0
.334:   DC.W    $F27a,COPY,$000f,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0
.335:   DC.W    $F27a,COPY,$0010,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0
.336:   DC.W    $F27a,COPY,$0011,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0
.337:   DC.W    $F27a,COPY,$0012,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0
.338:   DC.W    $F27a,COPY,$0013,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0
.339:   DC.W    $F27a,COPY,$0014,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0
.340:   DC.W    $F27a,COPY,$0015,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0
.341:   DC.W    $F27a,COPY,$0016,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0
.342:   DC.W    $F27a,COPY,$0017,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0
.343:   DC.W    $F27a,COPY,$0018,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0
.344:   DC.W    $F27a,COPY,$0019,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0
.345:   DC.W    $F27a,COPY,$001a,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0
.346:   DC.W    $F27a,COPY,$001b,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0
.347:   DC.W    $F27a,COPY,$001c,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0
.348:   DC.W    $F27a,COPY,$001d,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0
.349:   DC.W    $F27a,COPY,$001e,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0
.350:   DC.W    $F27a,COPY,$001f,SIZEO,2,SIZE_WL,TRAPCC,FPUSUP,3,0
.351:   DC.W    $F27a,COPY,$0020,SIZEO,2,SIZE_WL,TRAPCC,MMUSUP,3,0
.352:   DC.W    $F27a,COPY,$0021,SIZEO,2,SIZE_WL,TRAPCC,MMUSUP,3,0
.353:   DC.W    $F27a,COPY,$0022,SIZEO,2,SIZE_WL,TRAPCC,MMUSUP,3,0
.354:   DC.W    $F27a,COPY,$0023,SIZEO,2,SIZE_WL,TRAPCC,MMUSUP,3,0
.355:   DC.W    $F27a,COPY,$0024,SIZEO,2,SIZE_WL,TRAPCC,MMUSUP,3,0
.356:   DC.W    $F27a,COPY,$0025,SIZEO,2,SIZE_WL,TRAPCC,MMUSUP,3,0
.357:   DC.W    $F27a,COPY,$0026,SIZEO,2,SIZE_WL,TRAPCC,MMUSUP,3,0
.358:   DC.W    $F27a,COPY,$0027,SIZEO,2,SIZE_WL,TRAPCC,MMUSUP,3,0
.359:   DC.W    $F27a,COPY,$0028,SIZEO,2,SIZE_WL,TRAPCC,MMUSUP,3,0
.360:   DC.W    $F27a,COPY,$0029,SIZEO,2,SIZE_WL,TRAPCC,MMUSUP,3,0
.361:   DC.W    $F27a,COPY,$002a,SIZEO,2,SIZE_WL,TRAPCC,MMUSUP,3,0
.362:   DC.W    $F27a,COPY,$002b,SIZEO,2,SIZE_WL,TRAPCC,MMUSUP,3,0
.363:   DC.W    $F27a,COPY,$002c,SIZEO,2,SIZE_WL,TRAPCC,MMUSUP,3,0
.364:   DC.W    $F27a,COPY,$002d,SIZEO,2,SIZE_WL,TRAPCC,MMUSUP,3,0
.365:   DC.W    $F27a,COPY,$002e,SIZEO,2,SIZE_WL,TRAPCC,MMUSUP,3,0
.366:   DC.W    $F27a,COPY,$002f,SIZEO,2,SIZE_WL,TRAPCC,MMUSUP,3,0
.367:   DC.W    $f200,COPY,$003a,SIZEO,5,SIZE_BWLSXD,FPUSUP,3,FTST,0                    ; FTST
.368:   DC.W    $F100,SIZE0,EA,FSAVEM,0,MMUSUP,3,0                                      ; PSAVE
.369:   DC.W    $F140,SIZE0,EA,FRESTM,0,MMUSUP,3,0                                      ; PRESTORE
.370:   DC.W    $F000,COPY,$2400,SIZE0,MMUSUP,3,0                                       ; PFLUSHA
.371:   DC.W    $F000,COPY,$3000,SIZE0,MMUSUP,3,PMMSTD,1,$f508,0                        ; PFLUSH
.372:   DC.W    $F000,COPY,$3400,SIZE0,MMUSUP,3,PMMSTD,0,0                              ; PFLUSHS
.373:   DC.W    $F000,COPY,$A000,SIZE0,MMUSUP,3,EA,PMDEST,0,0                           ; PFLUSHR
.374:   DC.W    $f000,COPY,$2200,SIZE0,MMUSUP,3,PMMLDX,0                                ; PLOADR
.375:   DC.W    $F000,COPY,$2000,SIZE0,MMUSUP,3,PMMLDX,0                                ; PLOADW
.376:   DC.W    $F000,COPY,$8200,SIZE0,MMUSUP,3,PMMTST,1,$f568,0                        ; PTESTR
.377:   DC.W    $F000,COPY,$8000,SIZE0,MMUSUP,3,PMMTST,1,$f548,0                        ; PTESTW
.378:   DC.W    $F000,COPY,$0000,SIZEO,8,SIZE_WLQ,PMMMOVE,0                             ; PMOVE
.379:   DC.W    $F510,SIZE0,MMUSUP,2,CPUSUP,%11000,0                                    ; PFLUSHAN
.380:   DC.W    $F500,SIZE0,MMUSUP,2,CPUSUP,%11000,EA,4,0,0                             ; PFLUSHN
.381:   DC.W    $F5C8,SIZE0,MMUSUP,2,CPUSUP,%10000,PMMEA,4,0,0                          ; PLPAR
.382:   DC.W    $F588,SIZE0,MMUSUP,2,CPUSUP,%10000,PMMEA,4,0,0                          ; PLPAW
.383:   DC.W    $4848,SIZE0,IMMBK,CPUSUP,%111111,0                                      ; BKPT
.384:   DC.W    $4E7A,COPY,0,SIZEO,3,SIZE_L,CPUSUP,%111111,MOVEC,0                      ; MOVEC
.385:   DC.W    $0E00,COPY,0,SIZEO,2,SIZE_BWL,CPUSUP,%111111,MOVES,0                    ; MOVES
.386:   DC.W    $EAC0,COPY,0,SIZE0,CPUSUP,%111110,BITFLD1,0                             ; BFCHG
.387:   DC.W    $ECC0,COPY,0,SIZE0,CPUSUP,%111110,BITFLD1,0                             ; BFCLR
.388:   DC.W    $EBC0,COPY,0,SIZE0,CPUSUP,%111110,BITFLD2,0                             ; BFEXTS
.389:   DC.W    $E9C0,COPY,0,SIZE0,CPUSUP,%111110,BITFLD2,0                             ; BFEXTU
.390:   DC.W    $EDC0,COPY,0,SIZE0,CPUSUP,%111110,BITFLD2,0                             ; BFFFO
.391:   DC.W    $EEC0,COPY,0,SIZE0,CPUSUP,%111110,BITFLD1,0                             ; BFSET
.392:   DC.W    $E8C0,COPY,0,SIZE0,CPUSUP,%111110,BITFLD1,0                             ; BFTST
.393:   DC.W    $EFC0,COPY,0,SIZE0,CPUSUP,%111110,BITFLD3,0                             ; BFINS
.394:   DC.W    $4C40,SIZEO,3,SIZE_L,CPUSUP,%111110,WARN46,MULDIV,$4C40,$0800,0         ; DIVSL
.395:   DC.W    $4C40,SIZEO,3,SIZE_L,CPUSUP,%111110,WARN46,MULDIV,$4C40,$0000,0         ; DIVUL
.396:   DC.W    $49C0,SIZEO,3,SIZE_L,CPUSUP,%111110,DATAREG,0,0                         ; EXTB
.397:   DC.W    $54FA,SIZEO,2,SIZE_WL,CPUSUP,%111110,TRAPCC,0                           ; TRAPCC
.398:   DC.W    $55FA,SIZEO,2,SIZE_WL,CPUSUP,%111110,TRAPCC,0
.399:   DC.W    $57FA,SIZEO,2,SIZE_WL,CPUSUP,%111110,TRAPCC,0
.400:   DC.W    $51FA,SIZEO,2,SIZE_WL,CPUSUP,%111110,TRAPCC,0
.401:   DC.W    $5CFA,SIZEO,2,SIZE_WL,CPUSUP,%111110,TRAPCC,0
.402:   DC.W    $5EFA,SIZEO,2,SIZE_WL,CPUSUP,%111110,TRAPCC,0
.403:   DC.W    $52FA,SIZEO,2,SIZE_WL,CPUSUP,%111110,TRAPCC,0
.404:   DC.W    $5FFA,SIZEO,2,SIZE_WL,CPUSUP,%111110,TRAPCC,0
.405:   DC.W    $53FA,SIZEO,2,SIZE_WL,CPUSUP,%111110,TRAPCC,0
.406:   DC.W    $5DFA,SIZEO,2,SIZE_WL,CPUSUP,%111110,TRAPCC,0
.407:   DC.W    $5BFA,SIZEO,2,SIZE_WL,CPUSUP,%111110,TRAPCC,0
.408:   DC.W    $56FA,SIZEO,2,SIZE_WL,CPUSUP,%111110,TRAPCC,0
.409:   DC.W    $5AFA,SIZEO,2,SIZE_WL,CPUSUP,%111110,TRAPCC,0
.410:   DC.W    $50FA,SIZEO,2,SIZE_WL,CPUSUP,%111110,TRAPCC,0
.411:   DC.W    $58FA,SIZEO,2,SIZE_WL,CPUSUP,%111110,TRAPCC,0
.412:   DC.W    $59FA,SIZEO,2,SIZE_WL,CPUSUP,%111110,TRAPCC,0
.413:   DC.W    $F448,SIZE0,CPUSUP,%111000,CPCACHE,1,0                                  ; CINVL
.414:   DC.W    $F450,SIZE0,CPUSUP,%111000,CPCACHE,1,0                                  ; CINVP
.415:   DC.W    $F458,SIZE0,CPUSUP,%111000,CPCACHE,0,0                                  ; CINVA
.416:   DC.W    $F468,SIZE0,CPUSUP,%111000,CPCACHE,1,0                                  ; CPUSHL
.417:   DC.W    $F470,SIZE0,CPUSUP,%111000,CPCACHE,1,0                                  ; CPUSHP
.418:   DC.W    $F478,SIZE0,CPUSUP,%111000,CPCACHE,0,0                                  ; CPUSHA
.419:   DC.W    $f610,SIZE0,CPUSUP,%111000,MOVE16,0                                     ; MOVE16
.420:   DC.W    $F800,COPY,$01C0,SIZE0,CPUSUP,%110000,LPSTOP,0                          ; LPSTOP
.421:   DC.W    $4ACB,SIZE0,CPUSUP,%110000,0                                            ; HALT
.422:   DC.W    $4ACC,SIZE0,CPUSUP,%110000,0                                            ; PULSE
;*-*
;; AssemblerKeywords
ASM_KWORDS:
        DC.L    .01,0,.02,0,.03,0,.04,0,.05,0,.06,0,.07,0,.08,0,.09,0,.10,0
        DC.L    .11,0,.12,0,.13,0,.14,0,.15,0,.16,0,.17,0,.18,0,.19,0,.20,0
        DC.L    .21,0,.22,0,.23,0,.24,0,.25,0,.26,0,.27,0,.28,0,.29,0,.30,0
        DC.L    .31,0,.32,0,.33,0,.34,0,.35,0,.36,0,.37,0,.38,0,.39,0,.40,0
        DC.L    .41,0,.42,0,.43,0,.44,0,.45,0,.46,0,.47,0,.48,0,.49,0,.50,0
        DC.L    .51,0,.52,0,.53,0,.54,0,.55,0,.56,0,.57,0,.58,0,.59,0,0,0

.01:    DC.B    "SFC",0
.02:    DC.B    "DFC",0
.03:    DC.B    "CACR",0
.04:    DC.B    "TC",0
.05:    DC.B    "ITT0",0
.06:    DC.B    "ITT1",0
.07:    DC.B    "DTT0",0
.08:    DC.B    "DTT1",0
.09:    DC.B    "BUSCR",0
.10:    DC.B    "USP",0
.11:    DC.B    "VBR",0
.12:    DC.B    "CAAR",0
.13:    DC.B    "MSP",0
.14:    DC.B    "ISP",0
.15:    DC.B    "MMUSR",0
.16:    DC.B    "URP",0
.17:    DC.B    "SRP",0
.18:    DC.B    "PCR",0
.19:    DC.B    "CRP",0
.20:    DC.B    "TT0",0
.21:    DC.B    "TT1",0
.22:    DC.B    "BAD0",0
.23:    DC.B    "BAC0",0
.24:    DC.B    "PCSR",0
.25:    DC.B    "CAL",0
.26:    DC.B    "VAL",0
.27:    DC.B    "SCC",0
.28:    DC.B    "DRP",0
.29:    DC.B    "FP0",0
.30:    DC.B    "FP1",0
.31:    DC.B    "FP2",0
.32:    DC.B    "FP3",0
.33:    DC.B    "FP4",0
.34:    DC.B    "FP5",0
.35:    DC.B    "FP6",0
.36:    DC.B    "FP7",0
.37:    DC.B    "FPSR",0
.38:    DC.B    "FPCR",0
.39:    DC.B    "FPIAR",0
.40:    DC.B    "CCR",0
.41:    DC.B    "SR",0
.42:    DC.B    "BAD1",0
.43:    DC.B    "BAD2",0
.44:    DC.B    "BAD3",0
.45:    DC.B    "BAD4",0
.46:    DC.B    "BAD5",0
.47:    DC.B    "BAD6",0
.48:    DC.B    "BAD7",0
.49:    DC.B    "BAC1",0
.50:    DC.B    "BAC2",0
.51:    DC.B    "BAC3",0
.52:    DC.B    "BAC4",0
.53:    DC.B    "BAC5",0
.54:    DC.B    "BAC6",0
.55:    DC.B    "BAC7",0
.56:    DC.B    "DC",0
.57:    DC.B    "IC",0
.58:    DC.B    "BC",0
.59:    DC.B    "NC",0

    EVEN
;*-*

;; Instable
INSTABLE:             ; +IOFF
    DC.L    .0,0,.1,0,.2,0,.3,0,.4,0,.5,0,.6,0,.7,0,.8,0,.9,0,.10,0,.11,0
    DC.L    .12,0,.13,0,.14,0,.15,0,.16,0,.17,0,.18,0,.19,0,.20,0,.21,0
    DC.L    .22,0,.23,0,.24,0,.25,0,.26,0,.27,0,.28,0,.29,0,.30,0,.31,0
    DC.L    .32,0,.33,0,.34,0,.35,0,.36,0,.37,0,.38,0,.39,0,.40,0,.41,0
    DC.L    .42,0,.43,0,.44,0,.45,0,.46,0,.47,0,.48,0,.49,0,.50,0,.51,0
    DC.L    .52,0,.53,0,.54,0,.55,0,.56,0,.57,0,.58,0,.59,0,.60,0,.61,0
    DC.L    .62,0,.63,0,.64,0,.65,0,.66,0,.67,0,.68,0,.69,0,.70,0,.71,0
    DC.L    .72,0,.73,0,.74,0,.75,0,.76,0,.77,0,.78,0,.79,0,.80,0,.81,0
    DC.L    .82,0,0,0

.0:     DC.B    'PROC',0
.1:     DC.B    'ENDPROC',0
.2:     DC.B    'IF',0
.3:     DC.B    'ENDIF',0
.4:     DC.B    'VOID',0
.5:     DC.B    'WHILE',0
.6:     DC.B    'ENDWHILE',0
.7:     DC.B    'FOR',0
.8:     DC.B    'ENDFOR',0
.9:     DC.B    'SELECT',0
.10:    DC.B    'CASE',0
.11:    DC.B    'DEFAULT',0
.12:    DC.B    'ENDSELECT',0
.13:    DC.B    'REPEAT',0
.14:    DC.B    'UNTIL',0
.15:    DC.B    'JUMP',0
.16:    DC.B    'DEF',0
.17:    DC.B    0           ; IS NOG _WEL_ LOCAL !!!
.18:    DC.B    'ELSE',0
.19:    DC.B    'INCBIN',0
.20:    DC.B    'LONG',0
.21:    DC.B    'INT',0
.22:    DC.B    'CHAR',0
.23:    DC.B    'INC',0
.24:    DC.B    'DEC',0
.25:    DC.B    'THEN',0
.26:    DC.B    'LOOP',0
.27:    DC.B    'ENDLOOP',0
.28:    DC.B    'DO',0
.29:    DC.B    'AND',0
.30:    DC.B    'OR',0
.31:    DC.B    'CONST',0
.32:    DC.B    'OPT',0
.33:    DC.B    'MODULE',0
.34:    DC.B    'STACK',0
.35:    DC.B    'EXIT',0
.36:    DC.B    'LARGE',0
.37:    DC.B    'ASM',0
.38:    DC.B    'NOWARN',0
.39:    DC.B    'TO',0
.40:    DC.B    'STEP',0
.41:    DC.B    'ARRAY',0
.42:    DC.B    'STRING',0
.43:    DC.B    'DIR',0
.44:    DC.B    'PTR',0
.45:    DC.B    'OF',0
.46:    DC.B    'ELSEIF',0
.47:    DC.B    'LIST',0
.48:    DC.B    'OBJECT',0
.49:    DC.B    'ENDOBJECT',0
.50:    DC.B    'SIZEOF',0
.51:    DC.B    'RETURN',0
.52:    DC.B    'OSVERSION',0
.53:    DC.B    'ENUM',0
.54:    DC.B    'SET',0
.55:    DC.B    'BUT',0
.56:    DC.B    'HANDLE',0
.57:    DC.B    'EXCEPT',0
.58:    DC.B    'RAISE',0
.59:    DC.B    'EXPORT',0
.60:    DC.B    'REG',0
.61:    DC.B    'END',0
.62:    DC.B    'IS',0
.63:    DC.B    'NEW',0
.64:    DC.B    'PUBLIC',0
.65:    DC.B    'PRIVATE',0
.66:    DC.B    'SUPER',0
.67:    DC.B    'PREPROCESS',0
.68:    DC.B    'LIBRARY',0
.69:    DC.B    'UTILLIB',0
.70:    DC.B    'POOL',0
.71:    DC.B    'NOSTARTUP',0
.72:    DC.B    'LINKABLE',0
.73:    DC.B    'EXTRA',0
.74:    DC.B    'INLINE',0
.75:    DC.B    'UNION',0
.76:    DC.B    'INCLIB',0
.77:    DC.B    'STARTUP',0
.78:    DC.B    'WITH',0
.79:    DC.B    'ELSEWHILE',0
.80:    DC.B    'ALWAYS',0
.81:    DC.B    'FPEXP',0
.82:    DC.B    'FLOAT',0
    EVEN
;*-*
;*-*

;; Patcher main
PATCHER:
    MOVEM.L D0-A6,-(A7)
    LEA     EFUNCTAB,A6
    LEA     PATCHES,A5
    LEA     EFUNCFLAGSTAB,A3
.LOOP:
    CLR.W   .INL
    MOVE.L  (A5)+,D0
    BMI     .EXIT
    SUBQ.L  #1,D0
    MULU.W  #EFUNCENTRYSIZE,D0
    LEA     0(A6,D0),A4             ; function to be patched
    MOVE.L  (A5)+,D0
    BTST    #31,D0
    BEQ     .SK1
    MOVE.W  #-1,.INL
    BCLR    #31,D0
.SK1:
    LSL.W   #2,D0
    MOVE.L  .OFFS(PC,D0.W),A2
    JMP     (A2)
.OFFS:
    DC.L    .1,.2,.3,.4,.5,.6
.1: MOVE.L  (A5)+,D0
    CMP.W   OSVERSION,D0
    BGT     .BAD
    BRA     .CONT
.2: MOVEQ   #0,D0
    MOVE.W  ASMCPU,D0
    AND.L   (A5)+,D0
    BEQ     .BAD
    BRA     .CONT
.3: MOVE.L  (A5)+,D0
    AND.W   EFPU,D0
    BEQ     .BAD
    BRA     .CONT
.4: ADDQ.L  #4,A5
    BTST    #7,CODEPREFS
    BEQ     .BAD
    BRA     .CONT
.5: ADDQ.L  #4,A5
    BTST    #6,CODEPREFS
    BEQ     .BAD
    BRA     .CONT
.6: ADDQ.L  #4,A5
    BRA     .CONT
.BAD:
    ADDQ.L  #8,A5
    BRA     .LOOP
.CONT:
    TST.W   .INL
    BEQ     .CONT2
    BTST    #7,ICODEPREFS+3
    BEQ     .BAD
;    MOVE.L  #I_CODEEND,4(A4)
;    MOVE.L  #I_CODEEND,8(A4)
    MOVE.L  -12(A5),D0
    BCLR    #31,D0
    SUBQ.L  #1,D0
    LSL.W   #1,D0
    OR.W    #$100,0(A3,D0)
    ADDQ.L  #8,A5
    BRA     .LOOP
.CONT2:
    MOVE.L  (A5)+,4(A4)
    MOVE.L  (A5)+,8(A4)
    BRA     .LOOP
.EXIT:
    MOVEM.L (A7)+,d0-A6
    RTS
.INL:
    DC.W    0
;*-*
;; Patcher data
PCH_OS      =       0
PCH_CPU     =       1
PCH_FPU     =       2
PCH_UTIL    =       3
PCH_POOL    =       4
PCH_INL     =       5       ; = NONE!!!
INL         =       $80000000
; structure:
;       cmd_nr:LONG, pch_type:LONG, pch_param:LONG, start:LONG, end:LONG


PATCHES:
        DC.L    1,      PCH_OS,         37,         I_PRINTF37,         I_PRINTF37_E
        DC.L    87,     PCH_OS,         37,         I_PRINTF37,         I_PRINTF37_E
        DC.L    150,    PCH_OS,         37,         I_PUTF37,           I_PUTF37_E

        DC.L    13,     INL+PCH_INL,    0,          0,                  0
        DC.L    14,     INL+PCH_INL,    0,          0,                  0
        DC.L    15,     INL+PCH_INL,    0,          0,                  0
        DC.L    16,     INL+PCH_INL,    0,          0,                  0
        DC.L    17,     INL+PCH_INL,    0,          0,                  0
        DC.L    18,     INL+PCH_INL,    0,          0,                  0
        DC.L    20,     INL+PCH_INL,    0,          0,                  0
        DC.L    23,     INL+PCH_INL,    0,          0,                  0
        DC.L    24,     INL+PCH_INL,    0,          0,                  0
        DC.L    25,     INL+PCH_INL,    0,          0,                  0
        DC.L    48,     INL+PCH_INL,    0,          0,                  0
        DC.L    49,     INL+PCH_INL,    0,          0,                  0
        DC.L    58,     INL+PCH_INL,    0,          0,                  0
        DC.L    59,     INL+PCH_INL,    0,          0,                  0
        DC.L    60,     INL+PCH_INL,    0,          0,                  0
        DC.L    64,     INL+PCH_INL,    0,          0,                  0
        DC.L    65,     INL+PCH_INL,    0,          0,                  0
        DC.L    66,     INL+PCH_INL,    0,          0,                  0
        DC.L    76,     INL+PCH_INL,    0,          0,                  0
        DC.L    77,     INL+PCH_INL,    0,          0,                  0
        DC.L    78,     INL+PCH_INL,    0,          0,                  0
        DC.L    80,     INL+PCH_INL,    0,          0,                  0
        DC.L    81,     INL+PCH_INL,    0,          0,                  0
        DC.L    82,     INL+PCH_INL,    0,          0,                  0
        DC.L    99,     INL+PCH_INL,    0,          0,                  0
        DC.L    100,    INL+PCH_INL,    0,          0,                  0
        DC.L    101,    INL+PCH_INL,    0,          0,                  0
        DC.L    102,    INL+PCH_INL,    0,          0,                  0
        DC.L    103,    INL+PCH_INL,    0,          0,                  0
        DC.L    104,    INL+PCH_INL,    0,          0,                  0
        DC.L    105,    INL+PCH_INL,    0,          0,                  0
        DC.L    106,    INL+PCH_INL,    0,          0,                  0
        DC.L    107,    INL+PCH_INL,    0,          0,                  0
        DC.L    108,    INL+PCH_INL,    0,          0,                  0
        DC.L    109,    INL+PCH_INL,    0,          0,                  0
        DC.L    118,    INL+PCH_INL,    0,          0,                  0
        DC.L    119,    INL+PCH_INL,    0,          0,                  0
        DC.L    123,    INL+PCH_INL,    0,          0,                  0
        DC.L    124,    INL+PCH_INL,    0,          0,                  0
        DC.L    125,    INL+PCH_INL,    0,          0,                  0
        DC.L    126,    INL+PCH_INL,    0,          0,                  0
        DC.L    127,    INL+PCH_INL,    0,          0,                  0
        DC.L    128,    INL+PCH_INL,    0,          0,                  0
        DC.L    129,    INL+PCH_INL,    0,          0,                  0
        DC.L    130,    INL+PCH_INL,    0,          0,                  0
        DC.L    131,    INL+PCH_INL,    0,          0,                  0

        DC.L    2,      INL+PCH_CPU,    %01110,     0,                  0
        DC.L    3,      INL+PCH_CPU,    %01110,     0,                  0
        DC.L    81,     INL+PCH_CPU,    %01110,     0,                  0

        DC.L    13,     PCH_CPU,        %11110,     I_LONG020,          I_INT020
        DC.L    14,     PCH_CPU,        %11110,     I_INT020,           I_CHAR020
        DC.L    15,     PCH_CPU,        %11110,     I_CHAR020,          I_PATCHEND



        DC.L    -1,     0,              0,          0,                  0
;*-*

;;FUNCS

; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ;
;   ALL BUILDIN E FUNCTIONS                 ;
; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ;

EFUNCFLAGSTAB:
    DC.w    $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 ;  1-10
    DC.w    $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 ; 11-20
    DC.w    $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 ; 21-30
    DC.w    $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 ; 31-40
    DC.w    $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 ; 41-50
    DC.w    $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 ; 51-60
    DC.w    $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 ; 61-70
    DC.w    $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 ; 71-80
    DC.w    $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 ; 81-90
    DC.w    $0000,$0000,$0000,$0000,$0000,$0000,$0001,$0001,$0001,$0001 ; 91-100
    DC.w    $0001,$0002,$0002,$0002,$0002,$0002,$0002,$0002,$0002,$0000 ; 101-110
    DC.w    $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 ; 111-120
    DC.w    $0000,$0000,$0002,$0002,$0002,$0002,$0002,$0002,$0002,$0002 ; 121-130
    DC.w    $0002,$0004,$0004,$0004,$0004,$0004,$0004,$0004,$0004,$0004 ; 131-140
    DC.w    $0004,$0000,$0000,$0000,$0000,$0000,$0400,$0400,$0808,$0808 ; 141-150
    DC.w    $0000,$0000,$0000,$0100,$0000                               ; 151-160

; BITS: 0 = math                ; uses mathbas
;       1 = math                ; uses mathtrans
;       2 = OS 37+              ; OS
;       3 = OS 39+              ; OS
;       4 = 020+                ; CPU
;       5 = 040+                ; CPU
;       6 = 881+                ; FPU
;       7 = 040+                ; FPU
;       8 = INLINE              ; Inline instruction
;       9 = UTILLIB             ; uses utillib
;      10 = FILES               ; autoclose files
;      11 = POOLS               ; uses pools

EFUNCENTRYSIZE=4*5
FOFF        = $100
NREFUNC     = 155

EFUNCTAB:
    DC.L    .1,     I_WRITEF,       I_MUL,          -1,0    ; = WRITEF SPECIAL ARGS
    DC.L    .2,     I_MUL,          I_DIV,          2,0     ; -> Mul 000+
    DC.L    .3,     I_DIV,          I_OPENW,        2,0     ; -> Div 000+
    DC.L    .4,     I_OPENW,        I_OPENS,        11,-1
    DC.L    .5,     I_OPENS,        I_MOUSE,        6,-1
    DC.L    .6,     I_MOUSE,        I_PLOT,         0,0
    DC.L    .7,     I_PLOT,         I_LINE,         3,1
    DC.L    .8,     I_LINE,         I_TEXTF,        5,1
    DC.L    .9,     I_TEXTF,        I_COLOR,        -3,0     ; NARGS*-1
    DC.L    .10,    I_COLOR,        I_SETRAST,      2,-1
    DC.L    .11,    I_SETRAST,      I_SETOUT,       1,0
    DC.L    .12,    I_SETOUT,       I_LONG,         1,0
    DC.L    .13,    I_LONG,         I_INT,          1,0
    DC.L    .14,    I_INT,          I_CHAR,         1,0
    DC.L    .15,    I_CHAR,         I_PUTLONG,      1,0
    DC.L    .16,    I_PUTLONG,      I_PUTINT,       2,0
    DC.L    .17,    I_PUTINT,       I_PUTCHAR,      2,0
    DC.L    .18,    I_PUTCHAR,      I_NEW,          2,0
    DC.L    .19,    I_NEW,          I_EXIT,         1,0
    DC.L    .20,    I_EXIT,         I_CLOSEW,       1,-1
    DC.L    .21,    I_CLOSEW,       I_CLOSES,       1,0
    DC.L    .22,    I_CLOSES,       I_AND,          1,0
    DC.L    .23,    I_AND,          I_OR,           2,0
    DC.L    .24,    I_OR,           I_NOT,          2,0
    DC.L    .25,    I_NOT,          I_BOOLGAD,      1,0
    DC.L    .26,    I_BOOLGAD,      I_SETTOPAZ,     8,0
    DC.L    .27,    I_SETTOPAZ,     I_STRCMP,       1,8
    DC.L    .28,    I_STRCMP,       I_STRCOPY,      3,$FF
    DC.L    .29,    I_STRCOPY,      I_STRADD,       3,$FF
    DC.L    .30,    I_STRADD,       I_STRLEN,       3,$FF
    DC.L    .31,    I_STRLEN,       I_ESTRLEN,      1,0
    DC.L    .32,    I_ESTRLEN,      I_ESTRMAX,      1,0
    DC.L    .33,    I_ESTRMAX,      I_STRING,       1,0
    DC.L    .34,    I_STRING,       I_RIGHTSTR,     1,0
    DC.L    .35,    I_RIGHTSTR,     I_MIDSTR,       3,0
    DC.L    .36,    I_MIDSTR,       I_STRINGF,      4,$FF
    DC.L    .37,    I_STRINGF,      I_VAL,          -2,0
    DC.L    .38,    I_VAL,          I_INSTR,        2,-1
    DC.L    .39,    I_INSTR,        I_TRIMSTR,      3,-1
    DC.L    .40,    I_TRIMSTR,      I_UPPERSTR,     1,0
    DC.L    .41,    I_UPPERSTR,     I_LOWERSTR,     1,0
    DC.L    .42,    I_LOWERSTR,     I_READSTR,      1,0
    DC.L    .43,    I_READSTR,      I_OUT,          2,0
    DC.L    .44,    I_OUT,          I_INP,          2,0
    DC.L    .45,    I_INP,          I_VERSION,      1,0
    DC.L    .46,    I_VERSION,      I_FILELENGTH,   1,0
    DC.L    .47,    I_FILELENGTH,   I_MOUSEX,       1,0
    DC.L    .48,    I_MOUSEX,       I_MOUSEY,       1,0
    DC.L    .49,    I_MOUSEY,       I_FREESTACK,    1,0
    DC.L    .50,    I_FREESTACK,    I_CTRLC,        0,0
    DC.L    .51,    I_CTRLC,        I_LIST,         0,0
    DC.L    .52,    I_LIST,         I_LISTCOPY,     1,0
    DC.L    .53,    I_LISTCOPY,     I_LISTADD,      3,$FF
    DC.L    .54,    I_LISTADD,      I_LISTCMP,      3,$FF
    DC.L    .55,    I_LISTCMP,      I_LISTLEN,      3,$FF
    DC.L    .56,    I_LISTLEN,      I_LISTMAX,      1,0
    DC.L    .57,    I_LISTMAX,      I_EVEN,         1,0
    DC.L    .58,    I_EVEN,         I_ODD,          1,0
    DC.L    .59,    I_ODD,          I_EVAL,         1,0
    DC.L    .60,    I_EVAL,         I_FORALL,       1,0
    DC.L    .61,    I_FORALL,       I_EXISTS,       3,0
    DC.L    .62,    I_EXISTS,       I_MAPLIST,      3,0
    DC.L    .63,    I_MAPLIST,      I_ABS,          4,0
    DC.L    .64,    I_ABS,          I_SHL,          1,0
    DC.L    .65,    I_SHL,          I_SHR,          2,0
    DC.L    .66,    I_SHR,          I_BOX,          2,0
    DC.L    .67,    I_BOX,          I_DISP,         5,1
    DC.L    .68,    I_DISP,         I_DISPL,        1,0
    DC.L    .69,    I_DISPL,        I_LINK,         1,0
    DC.L    .70,    I_LINK,         I_NEXT,         2,0
    DC.L    .71,    I_NEXT,         I_FORWARD,      1,0
    DC.L    .72,    I_FORWARD,      I_SETSTR,       2,0
    DC.L    .73,    I_SETSTR,       I_SETLIST,      2,0
    DC.L    .74,    I_SETLIST,      I_WAITMSG,      2,0
    DC.L    .75,    I_WAITMSG,      I_MSGCODE,      1,0
    DC.L    .76,    I_MSGCODE,      I_MSGQUAL,      0,0
    DC.L    .77,    I_MSGQUAL,      I_MSGIADR,      0,0
    DC.L    .78,    I_MSGIADR,      I_RND,          0,0
    DC.L    .79,    I_RND,          I_RNDQ,         1,0
    DC.L    .80,    I_RNDQ,         I_MOD,          1,0
    DC.L    .81,    I_MOD,          I_EOR,          2,0
    DC.L    .82,    I_EOR,          I_CAUSE,        2,0
    DC.L    .83,    I_CAUSE,        I_LISTITEM,     1,-1
    DC.L    .84,    I_LISTITEM,     I_NEWR,         2,0
    DC.L    .85,    I_NEWR,         I_SIGN,         1,0
    DC.L    .86,    I_SIGN,         I_PRINTF,       1,0
    DC.L    .87,    I_PRINTF,       I_WAITLEFTMOUSE,-1,0
    DC.L    .88,    I_WAITLEFTMOUSE,I_LEFTMOUSE,    1,0
    DC.L    .89,    I_LEFTMOUSE,    I_SETIN,        1,0
    DC.L    .90,    I_SETIN,        I_THROW,        1,0
    DC.L    .91,    I_THROW,        I_RETHROW,      2,0
    DC.L    .92,    I_RETHROW,      I_SELECTLIST,   0,0
    DC.L    .93,    I_SELECTLIST,   I_SETCOLOUR,    4,0
    DC.L    .94,    I_SETCOLOUR,    I_NEWM,         5,0
    DC.L    .95,    I_NEWM,         I_BOUNDS,       2,0
    DC.L    .96,    I_BOUNDS,       I_REALF,        3,0
    DC.L    .97,    I_REALF,        I_REALVAL,      3,0
    DC.L    .98,    I_REALVAL,      I_FABS,         1,0
    DC.L    .99,    I_FABS,         I_FFLOOR,       1,0
    DC.L    .100,   I_FFLOOR,       I_FCEIL,        1,0
    DC.L    .101,   I_FCEIL,        I_FSIN,         1,0
    DC.L    .102,   I_FSIN,         I_FCOS,         1,0
    DC.L    .103,   I_FCOS,         I_FTAN,         1,0
    DC.L    .104,   I_FTAN,         I_FEXP,         1,0
    DC.L    .105,   I_FEXP,         I_FLOG,         1,0
    DC.L    .106,   I_FLOG,         I_FPOW,         1,0
    DC.L    .107,   I_FPOW,         I_FSQRT,        2,0
    DC.L    .108,   I_FSQRT,        I_FLOG10,       1,0
    DC.L    .109,   I_FLOG10,       I_FASTDISPOSE,  1,0
    DC.L    .110,   I_FASTDISPOSE,  I_FASTNEW,      2,0
    DC.L    .111,   I_FASTNEW,      I_MIN,          1,0
    DC.L    .112,   I_MIN,          I_MAX,          2,0
    DC.L    .113,   I_MAX,          I_OSTRCMP,      2,0
    DC.L    .114,   I_OSTRCMP,      I_ASTRCOPY,     3,$FF
    DC.L    .115,   I_ASTRCOPY,     I_CELL,         3,$FF
    DC.L    .116,   I_CELL,         I_FREECELLS,    1,0
    DC.L    .117,   I_FREECELLS,    I_SETCHUNKSIZE, 0,0
    DC.L    .118,   I_SETCHUNKSIZE, I_CAR,          1,0
    DC.L    .119,   I_CAR,          I_CDR,          1,0
    DC.L    .120,   I_CDR,          I_CONS,         1,0
    DC.L    .121,   I_CONS,         I_FASTDISPOSELIST,0,0
    DC.L    .122,   I_FASTDISPOSELIST,I_FATAN,      1,0
    DC.L    .123,   I_FATAN,        I_FSINCOS,      1,0
    DC.L    .124,   I_FSINCOS,      I_FSINH,        2,0
    DC.L    .125,   I_FSINH,        I_FCOSH,        1,0
    DC.L    .126,   I_FCOSH,        I_FTANH,        1,0
    DC.L    .127,   I_FTANH,        I_FTIEEE,       1,0
    DC.L    .128,   I_FTIEEE,       I_FFIEEE,       1,0
    DC.L    .129,   I_FFIEEE,       I_FASIN,        1,0
    DC.L    .130,   I_FASIN,        I_FACOS,        1,0
    DC.L    .131,   I_FACOS,        I_DOMETHOD,     1,0
    DC.L    .132,   I_DOMETHOD,     I_DOMETHODA,    -1,0
    DC.L    .133,   I_DOMETHODA,    I_CRCMETHOD,    2,0
    DC.L    .134,   I_CRCMETHOD,    I_CRCMETHODA,   -2,0
    DC.L    .135,   I_CRCMETHODA,   I_DOSMETHOD,    3,0
    DC.L    .136,   I_DOSMETHOD,    I_DOSMETHODA,   -2,0
    DC.L    .137,   I_DOSMETHODA,   I_SET,          3,0
    DC.L    .138,   I_SET,          I_SETS,         -1,0
    DC.L    .139,   I_SETS,         I_GET,          3,0
    DC.L    .140,   I_GET,          I_GETS,         3,0
    DC.L    .141,   I_GETS,         I_CTRLD,        2,0
    DC.L    .142,   I_CTRLD,        I_CTRLE,        0,0
    Dc.L    .143,   I_CTRLE,        I_CTRLF,        0,0
    DC.L    .144,   I_CTRLF,        I_CHK,          0,0
    DC.L    .145,   I_CHK,          I_EOF,          1,0
    DC.L    .146,   I_EOF,          I_FOPEN,        1,0
    DC.L    .147,   I_FOPEN,        I_FCLOSE,       2,0
    DC.L    .148,   I_FCLOSE,       I_ALLOC,        1,0
    DC.L    .149,   I_ALLOC,        I_FREE,         1,0
    DC.L    .150,   I_FREE,         I_PUTF,         1,0
    DC.L    .151,   I_PUTF,         I_READB,        -3,0
    DC.L    .152,   I_READB,        I_WRITEB,       4,0
    DC.L    .153,   I_WRITEB,       I_SIZE,         4,0
    DC.L    .154,   I_CODEEND,      I_CODEEND+2,    0,0
    DC.L    .155,   I_SIZE,         I_CODEEND,      1,0
    DC.L    0,I_CODEEND,0,0

.1: DC.B    'WriteF',0
.2: DC.B    'Mul',0
.3: DC.B    'Div',0
.4: DC.B    'OpenW',0
.5: DC.B    'OpenS',0
.6: DC.B    'Mouse',0
.7: DC.B    'Plot',0
.8: DC.B    'Line',0
.9: DC.B    'TextF',0
.10:    DC.B    'Colour',0
.11:    DC.B    'SetStdRast',0
.12:    DC.B    'SetStdOut',0
.13:    DC.B    'Long',0
.14:    DC.B    'Int',0
.15:    DC.B    'Char',0
.16:    DC.B    'PutLong',0
.17:    DC.B    'PutInt',0
.18:    DC.B    'PutChar',0
.19:    DC.B    'New',0
.20:    DC.B    'CleanUp',0
.21:    DC.B    'CloseW',0
.22:    DC.B    'CloseS',0
.23:    DC.B    'And',0
.24:    DC.B    'Or',0
.25:    DC.B    'Not',0
.26:    DC.B    'Gadget',0
.27:    DC.B    'SetTopaz',0
.28:    DC.B    'StrCmp',0
.29:    DC.B    'StrCopy',0
.30:    DC.B    'StrAdd',0
.31:    DC.B    'StrLen',0
.32:    DC.B    'EstrLen',0
.33:    DC.B    'StrMax',0
.34:    DC.B    'String',0
.35:    DC.B    'RightStr',0
.36:    DC.B    'MidStr',0
.37:    DC.B    'StringF',0
.38:    DC.B    'Val',0
.39:    DC.B    'InStr',0
.40:    DC.B    'TrimStr',0
.41:    DC.B    'UpperStr',0
.42:    DC.B    'LowerStr',0
.43:    DC.B    'ReadStr',0
.44:    DC.B    'Out',0
.45:    DC.B    'Inp',0
.46:    DC.B    'KickVersion',0
.47:    DC.B    'FileLength',0
.48:    DC.B    'MouseX',0
.49:    DC.B    'MouseY',0
.50:    DC.B    'FreeStack',0
.51:    DC.B    'CtrlC',0
.52:    DC.B    'List',0
.53:    DC.B    'ListCopy',0
.54:    DC.B    'ListAdd',0
.55:    DC.B    'ListCmp',0
.56:    DC.B    'ListLen',0
.57:    DC.B    'ListMax',0
.58:    DC.B    'Even',0
.59:    DC.B    'Odd',0
.60:    DC.B    'Eval',0
.61:    DC.B    'ForAll',0
.62:    DC.B    'Exists',0
.63:    DC.B    'MapList',0
.64:    DC.B    'Abs',0
.65:    DC.B    'Shl',0
.66:    DC.B    'Shr',0
.67:    DC.B    'Box',0
.68:    DC.B    'Dispose',0
.69:    DC.B    'DisposeLink',0
.70:    DC.B    'Link',0
.71:    DC.B    'Next',0
.72:    DC.B    'Forward',0
.73:    DC.B    'SetStr',0
.74:    DC.B    'SetList',0
.75:    DC.B    'WaitIMessage',0
.76:    DC.B    'MsgCode',0
.77:    DC.B    'MsgQualifier',0
.78:    DC.B    'MsgIaddr',0
.79:    DC.B    'Rnd',0
.80:    DC.B    'RndQ',0
.81:    DC.B    'Mod',0
.82:    DC.B    'Eor',0
.83:    DC.B    'Raise',0
.84:    DC.B    'ListItem',0
.85:    DC.B    'NewR',0
.86:    DC.B    'Sign',0
.87:    DC.B    'PrintF',0
.88:    DC.B    'WaitLeftMouse',0
.89:    DC.B    'LeftMouse',0
.90:    DC.B    'SetStdIn',0
.91:    DC.B    'Throw',0
.92:    DC.B    'ReThrow',0
.93:    DC.B    'SelectList',0
.94:    DC.B    'SetColour',0
.95:    DC.B    'NewM',0
.96:    DC.B    'Bounds',0
.97:    DC.B    'RealF',0
.98:    DC.B    'RealVal',0
.99:    DC.B    'Fabs',0
.100:   DC.B    'Ffloor',0
.101:   DC.B    'Fceil',0
.102:   DC.B    'Fsin',0
.103:   DC.B    'Fcos',0
.104:   DC.B    'Ftan',0
.105:   DC.B    'Fexp',0
.106:   DC.B    'Flog',0
.107:   DC.B    'Fpow',0
.108:   DC.B    'Fsqrt',0
.109:   DC.B    'Flog10',0
.110:   DC.B    'FastDispose',0
.111:   DC.B    'FastNew',0
.112:   DC.B    'Min',0
.113:   DC.B    'Max',0
.114:   DC.B    'OstrCmp',0
.115:   DC.B    'AstrCopy',0
.116:   DC.B    'Cell',0
.117:   DC.B    'FreeCells',0
.118:   DC.B    'SetChunkSize',0
.119:   DC.B    'Car',0
.120:   DC.B    'Cdr',0
.121:   DC.B    '_Cons',0
.122:   DC.B    'FastDisposeList',0
.123:   DC.B    'Fatan',0
.124:   DC.B    'Fsincos',0
.125:   DC.B    'Fsinh',0
.126:   DC.B    'Fcosh',0
.127:   DC.B    'Ftanh',0
.128:   DC.B    'Ftieee',0
.129:   DC.B    'Ffieee',0
.130:   DC.B    'Fasin',0
.131:   DC.B    'Facos',0
.132:   DC.B    'DoMethod',0
.133:   DC.B    'DoMethodA',0
.134:   DC.B    'CoerceMethod',0
.135:   DC.B    'CoerceMethodA',0
.136:   DC.B    'DoSuperMethod',0
.137:   DC.B    'DoSuperMethodA',0
.138:   dc.b    'Set',0
.139:   dc.b    'Sets',0
.140:   dc.b    'Get',0
.141:   dc.b    'Gets',0
.142:   DC.B    'CtrlD',0
.143:   DC.B    'CtrlE',0
.144:   DC.B    'CtrlF',0
.145:   DC.B    'Chk',0
.146:   DC.B    'Eof',0
.147:   DC.B    'Fopen',0
.148:   DC.B    'Fclose',0
.149:   DC.B    'Alloc',0
.150:   DC.B    'Free',0
.151:   DC.B    'PutF',0
.152:   DC.B    'ReadB',0
.153:   DC.B    'WriteB',0
.154:   DC.B    'GetA4',0
.155:   DC.B    'Size',0
    EVEN
;*-*
;; FunctionsCode
; NOTE: ALL THIS CODE SAVES D3-D7/A4/A5/A7 BEFORE THRASHING


; P - w. Patch, U - Unused, F - Fixed/Optimized, I - Inline, O - obsolete
; e.g. PI = has an inline patch

;; WriteF                   P
I_WRITEF:
    TST.L   -8(A4)          ;STDIO
    BEQ .2
.3: LEA 8(A7),A1
    MOVE.L  4(A7),D0
    MOVE.L  8(A7,D0.L),A0
    LEA     .1(PC),A2
    MOVE.L  4.W,A6
    MOVE.L  -64(A4),A3
    MOVE.L  A3,D2
    JSR     -522(A6)
    MOVE.L  -8(A4),D1
    MOVE.L  D2,A0
.5: TST.B   (A0)+
    BNE .5
    SUB.L   D2,A0
    MOVE.L  D3,A3           ; BACKUP
    MOVE.L  A0,D3
    SUBQ.L  #1,D3
    MOVE.L  -44(A4),A6
    JSR     -48(A6)
    MOVE.L  D3,D0
    MOVE.L  A3,D3
    RTS
.1: MOVE.B  D0,(A3)+        ; RDF DUMP
    RTS
.2: LEA .4(PC),A0
    MOVE.L  A0,D1           ;OPEN CON
    MOVE.L  #1006,D2
    MOVE.L  -44(A4),A6
    JSR -30(A6)
    MOVE.L  D0,-12(A4)
    MOVE.L  D0,-8(A4)
    TST.L   D0
    BNE.S   .3
    MOVEQ   #20,D0
    MOVE.L  D0,-28(A4)
    MOVE.L  -24(A4),A0
    JMP (A0)
.4: DC.B    "CON:0/11/640/80/Output",0
    EVEN
;*-*
;; Mul                      PI
I_MUL:
    MOVE.L  D3,A3
    MOVE.L  4(A7),D1
    MOVE.L  8(A7),D0
    MOVE.L  D0,D2
    MOVE.L  D0,D3
    MULU    D1,D0
    SWAP    D3
    MULU    D1,D3
    SWAP    D3
    CLR.W   D3
    ADD.L   D3,D0
    SWAP    D1
    MULU    D1,D2
    SWAP    D2
    CLR.W   D2
    ADD.L   D2,D0
    MOVE.L  A3,D3
    RTS
;*-*
;; Div                      PI
I_DIV:
;   MOVE.L  D3,A3
;   MOVE.L  8(A7),D1
;   MOVE.L  4(A7),D0
;   MOVEQ   #32,D3
;   MOVEQ   #0,D2
;.1:    SUB.L   D0,D2
;   BCC.B   .2
;   ADD.L   D0,D2
;.2:    ROXL.L  #1,D1
;   ROXL.L  #1,D2
;   DBF     D3,.1
;   NOT.L   D1
;   MOVE.L  D1,D0
;   MOVE.L  A3,D3
;   RTS


; maxon:

    MOVE.L  8(A7),D0
    MOVE.L  4(A7),D1

L6:      tst.l    d0
         bmi.s    L8
         tst.l    d1
         bpl.s    L9
         neg.l    d1
L7:      bsr.s    L9
         neg.l    d0
         rts      

L8:      neg.l    d0
         tst.l    d1
         bpl.s    L7
         neg.l    d1
L9:      swap     d1
         tst.w    d1
         bne.s    L10
         move.l   d3,-(a7)
         swap     d1
         move.w   d1,d3
         move.w   d0,d2
         clr.w    d0
         swap     d0
         divu     d3,d0
         move.l   d0,d1
         swap     d0
         move.w   d2,d1
         divu     d3,d1
         move.w   d1,d0
         clr.w    d1
         swap     d1
         move.l   (a7)+,d3
         rts      

L10:     swap     d1
E11:     movem.l  d3-d4,-(a7)
         moveq    #$1f,d2
         moveq    #$00,d3
         moveq    #$00,d4
L12:     asl.l    #$1,d3
         asl.l    #$1,d0
         roxl.l   #$1,d4
         cmp.l    d1,d4
         bcs.s    L13
         sub.l    d1,d4
         addq.l   #$1,d3
L13:     dbf      d2,L12
         move.l   d4,d1
         move.l   d3,d0
         movem.l  (a7)+,d3-d4
         rts      
;*-*
;; OpenW                    F
I_OPENW:
    LEA .1(PC),A0
    LEA 4(A7),A1
    MOVE.L  (A1)+,48(A0)        ;4(A7)
    MOVE.L  (A1)+,18(A0)        ;8(A7)
    ADDQ.L  #2,A1
    MOVE.W  (A1)+,46(A0)        ;14(A7)
    MOVE.L  (a1)+,30(A0)        ;16(A7)
    MOVE.L  (A1)+,26(A0)        ;20(A7)
    MOVE.L  (A1)+,D0            ;24(A7)

    MOVEQ   #18,D1
    BSET    D1,D0
    MOVE.L  D0,14(A0)
    MOVE.L  (A1)+,10(A0)        ;28(A7)
    ADDQ.L  #2,A1
    MOVE.W  (A1)+,6(A0)         ;34(A7)
    ADDQ.L  #2,A1
    MOVE.W  (A1)+,4(A0)         ;38(A7)
    ADDQ.L  #2,A1
    MOVE.W  (A1)+,2(A0)         ;42(A7)
    ADDQ.L  #2,A1
    MOVE.W  (A1)+,(A0)          ;46(A7)
    MOVE.L  -48(A4),A6
    JSR     -$CC(A6)
    MOVE.L  D0,A0
    MOVE.L  A0,D0
    BEQ.S   .2
    MOVE.L  50(A0),D1
    MOVE.L  D1,-16(A4)
.2: RTS
.1: DC.W    0,0,0,0,-1
    DC.L    0,0,0,0,0,0,0
    DC.W    80,25,-1,-1,0,0,0
;*-*
;; OpenS
I_OPENS:
    LEA .1(PC),A0
    MOVE.L  4(A7),32(A0)
    MOVE.L  8(A7),20(A0)
    MOVE.W  14(A7),12(A0)
    MOVE.W  18(A7),8(A0)
    MOVE.W  22(A7),6(A0)
    MOVE.W  26(A7),4(A0)
    MOVE.L  -48(A4),A6
    JSR -198(A6)
    MOVE.L  D0,D1
    BEQ.S   .2
    ADD.L   #84,D1
    MOVE.L  D1,-16(A4)
.2: RTS
.1: DC.W    0,0,640,256,1,$0001,$8000,$100F
    DC.L    0,0,0,0,0
;*-*
;; Mouse                    F
I_MOUSE:
    MOVEQ   #0,D0
    BTST    #6,$BFE001
    BNE.S   .1
    MOVEQ   #1,D0
.1: LEA     $DFF016,A0
    MOVE.W  (A0),D1
    BTST    #10,D1
    BNE.S   .2
    BSET    #1,D0
.2: BTST    #8,D1
    BNE.S   .3
    BSET    #2,D0
.3: RTS
;*-*
;; Plot
I_PLOT:
    MOVE.L  -16(A4),A1
    MOVE.L  A1,D0
    BEQ.S   .1
    MOVE.L  -52(A4),A6
    MOVE.L  4(A7),D0
    JSR -342(A6)
    MOVE.L  -16(A4),A1
    MOVE.L  12(A7),D0
    MOVE.L  8(A7),D1
    JSR -324(A6)    
.1: RTS
;*-*
;; Line                     F
I_LINE:
    MOVE.L  -16(A4),A1
    MOVE.L  A1,D0
    BEQ.S   .1
    LEA     4(A7),A3
    MOVE.L  -52(A4),A6
    MOVE.L  (A3)+,D0
    JSR -342(A6)
    MOVE.L  -16(A4),A1
    MOVE.L  (A3)+,D1
    MOVE.L  (A3)+,D0
    JSR -240(A6)    
    MOVE.L  -16(A4),A1
    MOVE.L  (A3)+,D1
    MOVE.L  (A3)+,D0
    JSR -246(A6)    
.1: RTS
;*-*
;; TextF                    F
I_TEXTF:
    MOVE.L  4(A7),D0
    MOVE.L  8(A7,D0.L),A0
    LEA     8(A7),A1
    LEA     .3(PC),A2
    MOVE.L  4.W,A6
    MOVE.L  -64(A4),A3      ; BETTER!
    MOVE.L  A3,D2
    JSR     -522(A6)        ; RAWDOFMT

    MOVE.L  -16(A4),A1
    MOVE.L  A1,D0
    BEQ.S   .1
    MOVE.L  -52(A4),A6
    MOVE.L  4(A7),D0
    LEA     12(A7,D0),A2
    MOVE.L  (A2)+,D1
    MOVE.L  (A2)+,D0
    JSR -240(A6)            ; MOVE

    MOVE.L  -16(A4),A1
    MOVE.L  D2,A0
    MOVE.L  A0,A2
.2: TST.B   (A2)+
    BNE.S   .2
    MOVE.L  A2,D0
    SUB.L   A0,D0
    SUBQ.L  #1,D0
    MOVE.L  D0,D2
    JSR -60(A6)             ; TEXT

    MOVE.L  D2,D0
.1: RTS
.3: MOVE.B  D0,(A3)+        ;RDF DUMP
    RTS
;*-*
;; Color                    F
I_COLOR:
    MOVE.L  -16(A4),A1
    MOVE.L  A1,D2
    BEQ.S   .1
    MOVE.L  -52(A4),A6
    MOVE.L  8(A7),D0
    JSR     -342(A6)    ; SetAPen
    MOVE.L  D2,A1
    MOVE.L  4(A7),D0
    JSR     -348(A6)    ; SetBPen
.1: RTS
;*-*
;; SetRast
I_SETRAST:
    MOVE.L  -16(A4),D0
    MOVE.L  4(A7),D1
    BEQ.S   .1
    MOVE.L  D1,-16(A4)
.1: RTS
;*-*
;; SetOut
I_SETOUT:
    MOVE.L  -8(A4),D0
    MOVE.L  4(A7),D1
    BEQ.S   .1
    MOVE.L  D1,-8(A4)
.1: RTS
;*-*
;; Long                     I
I_LONG:
    MOVE.L  4(A7),A0
    MOVE.L  (A0),D0
    RTS
;*-*
;; Int                      I
I_INT:
    MOVE.L  4(A7),A0
    MOVEQ   #0,D0
    MOVE.W  (A0),D0
    RTS
;*-*
;; Char                     I
I_CHAR:
    MOVE.L  4(A7),A0
    MOVEQ   #0,D0
    MOVE.B  (A0),D0
    RTS
;*-*
;; PutLong                  I
I_PUTLONG:
    MOVE.L  8(A7),A0
    MOVE.L  4(A7),(A0)
    RTS
;*-*
;; PutInt                   I
I_PUTINT:
    MOVE.L  8(A7),A0
    MOVE.W  6(A7),(A0)
    RTS
;*-*
;; PutChar                  I
I_PUTCHAR:
    MOVE.L  8(A7),A0
    MOVE.B  7(A7),(A0)
    RTS
;*-*
;; New
I_NEW:
    MOVE.L  4(A7),D0
    MOVE.L  #$10000,D1
    ADDQ.L  #8,D0
    MOVE.L  D0,D2
    MOVE.L  4.W,A6
    JSR -198(A6)
    TST.L   D0
    BEQ.S   .1
    MOVE.L  D0,A0
    MOVE.L  -20(A4),(A0)
    MOVE.L  D2,4(A0)
    MOVE.L  D0,-20(A4)
    ADDQ.L  #8,D0
.1: RTS
;*-*
;; CleanUp                  I
I_EXIT:
    MOVE.L  4(A7),-28(A4)
    MOVE.L  -24(A4),A0
    JMP (A0)
;*-*
;; CloseW
I_CLOSEW:
    MOVE.L  4(A7),A0
    MOVE.L  A0,D0
    BEQ.S   .1
    CLR.L   -16(A4)
    MOVE.L  -48(A4),A6
    JSR -72(A6)
.1: RTS
;*-*
;; CloseS
I_CLOSES:
    MOVE.L  4(A7),A0
    MOVE.L  A0,D0
    BEQ.S   .1
    CLR.L   -16(A4)
    MOVE.L  -48(A4),A6
    JSR -66(A6)
.1: RTS
;*-*
;; And                      I
I_AND:
    MOVE.L  8(A7),D0
    AND.L   4(A7),D0
    RTS
;*-*
;; Or                       I
I_OR:
    MOVE.L  8(A7),D0
    OR.L    4(A7),D0
    RTS
;*-*
;; Not                      I
I_NOT:
    MOVE.L  4(A7),D0
    NOT.L   D0
    RTS
;*-*
;; BoolGad
I_BOOLGAD:
    MOVE.L  32(A7),D2
    MOVE.L  D2,A1           ; A1,D2=GADGET
    MOVE.L  A1,A2
    MOVEQ   #28,D0
.XL:CLR.L   (A2)+
    DBRA    D0,.XL
    LEA 44(A1),A0       ; A0   =BORDER1
    LEA 16(A0),A2       ; A2   =INTUITEXT
    LEA 20(A2),A3       ; A3   =20 empty bytes
    MOVE.L  24(A7),40(A1)       ; --> INIT GADGET
    MOVE.W  18(A7),4(A1)
    MOVE.W  14(A7),6(A1)
    MOVE.W  10(A7),D0
    MOVE.W  D0,8(A1)
    MOVE.W  #12,10(A1)      ; D0,D1 = W,H
    SUBQ.W  #1,D0
    MOVEQ   #11,D1
    MOVE.W  #$0,12(A1)      ; FLAGS
    MOVE.W  #$1,14(A1)      ; ACTIVATEFLAGS
    MOVE.W  #$1,16(A1)      ; TYPEFLAGS
    BTST    #0,23(A7)
    BEQ.S   .5
    BSET    #0,14(A1)
.5: BTST    #1,23(A7)
    BEQ.S   .6
    BSET    #7,13(A1)
.6: MOVE.L  A2,26(A1)
    MOVE.L  A0,18(A1)
    MOVE.W  D0,8(A3)        ; --> INIT VECTORZ
    MOVE.W  D0,12(A3)
    MOVE.W  D1,6(A3)
    MOVE.W  D1,10(A3)
    MOVE.L  4(A7),D0
    MOVE.L  D0,12(A2)       ; --> INIT INTUITEXT
    MOVE.L  #$01000100,(A2)
    MOVE.W  #$2,6(A2)
    MOVE.L  D0,A6
.7: TST.B   (A6)+
    BNE.S   .7
    SUB.L   D0,A6
    SUBQ.L  #1,A6
    MOVE.L  8(A7),D1
    MOVE.L  A6,D0
    LSL.W   #3,D0
    SUB.L   D0,D1
    LSR.W   #1,D1
    MOVE.W  D1,4(A2)
    MOVEQ   #0,D0
    MOVE.L  D0,(A0)         ; --> INIT BORDER
    MOVE.L  #$01000005,4(A0)
    MOVE.L  A3,8(A0)
    LEA .3(PC),A3       ; --> TOPAZ
    LEA 8(A3),A0
    MOVE.L  A0,(A3)
    MOVE.L  A3,8(A2)
    MOVE.L  28(A7),A0       ; --> LINK GLIST
    MOVE.L  A0,D0
    BEQ.S   .2
    MOVE.L  (A0),D0         ; NEXTNODE OF PRED
    MOVE.L  A1,(A0)         ; HANG ONTO PRED
    MOVE.L  D0,(A1)         ; CONNECT NEXTNODE
.2: MOVE.L  D2,D0
    ADD.L   #120,D0
    RTS
.3: DC.L    0,$80060
.4: DC.B    "topaz.font",0,0
;*-*
;; SetTopaz
I_SETTOPAZ:
    MOVE.L  -52(A4),A6
    LEA .2(PC),A0
    LEA .3(PC),A1
    MOVE.L  A1,(A0)
    MOVE.W  6(A7),4(A0)
    JSR -72(A6)         ; OPENFONT
    TST.L   D0
    BEQ.S   .1
    MOVE.L  D0,A0
    MOVE.L  -16(A4),A1
    MOVE.L  A1,D0
    BEQ.S   .1
    JSR -66(A6)         ; SETFONT
.1: RTS
.2: DC.L    0,$80060
.3: DC.B    "topaz.font",0,0
;*-*
;; StrCmp
I_STRCMP:
    MOVEQ   #0,D0
    MOVE.L  12(A7),A0
    MOVE.L  8(A7),A1
    MOVE.W  6(A7),D0
    ADDQ.L  #1,D0
.1: SUBQ.L  #1,D0
    BEQ.S   .3
    CMPM.B  (A0)+,(A1)+
    BNE.S   .2
    CMP.B   #0,-1(A0)
    BNE.S   .1
.3: MOVEQ   #-1,D0
    RTS
.2: MOVEQ   #0,D0
    RTS
;*-*
;; StrCopy
I_STRCOPY:
    MOVEQ   #0,D0
    MOVE.W  6(A7),D0        ; LEN
    MOVE.L  8(A7),A1        ; STR
    MOVE.L  12(A7),A0       ; ESTR
    MOVE.L  A0,A2
    MOVEQ   #0,D1
    MOVE.W  -4(A0),D1
    CMP.L   D0,D1
    BPL.S   .1
    MOVE.L  D1,D0
.1: MOVE.L  D0,D2
    BEQ.S   .4
    SUBQ.L  #1,D0           ; D0=COPYLEN
.2: MOVE.B  (A1)+,(A0)+
    BEQ.S   .3
    DBRA    D0,.2
    MOVE.B  #0,(A0)+
.3: ADDQ.W  #1,D0
    SUB.W   D0,D2
    MOVE.W  D2,-2(A2)
    MOVE.L  A2,D0
.4: RTS
;*-*
;; StrAdd
I_STRADD:
    MOVE.L  D3,A3
    MOVEQ   #0,D0
    MOVE.W  6(A7),D0        ; LEN
    MOVE.L  8(A7),A1        ; STR
    MOVE.L  12(A7),A0       ; ESTR
    MOVEQ   #0,D3
    MOVE.W  -2(A0),D3
    MOVE.L  A0,A2
    MOVEQ   #0,D1
    MOVE.W  -4(A0),D1
    SUB.L   D3,D1
    ADD.L   D3,A0
    CMP.L   D0,D1
    BPL.S   .1
    MOVE.L  D1,D0
.1: MOVE.W  D0,D2
    BEQ.S   .4
    SUBQ.L  #1,D0           ; D0=COPYLEN
.2: MOVE.B  (A1)+,(A0)+
    BEQ.S   .3
    DBRA    D0,.2
    MOVE.B  #0,(A0)+
.3: ADDQ.W  #1,D0
    SUB.W   D0,D2
    ADD.W   D3,D2
    MOVE.W  D2,-2(A2)
.4: MOVE.L  A3,D3
    MOVE.L  A2,D0
    RTS
;*-*
;; StrLen
I_STRLEN:
    MOVE.L  4(A7),A0
    MOVE.L  A0,D1
.1: TST.B   (A0)+
    BNE.S   .1
    SUBQ.L  #1,A0
    MOVE.L  A0,D0
    SUB.L   D1,D0
    RTS
;*-*
;; EstrLen
I_ESTRLEN:
    MOVE.L  4(A7),A0
    MOVEQ   #0,D0
    MOVE.W  -2(A0),D0
    RTS
;*-*
;; EstrMax
I_ESTRMAX:
    MOVE.L  4(A7),A0
    MOVEQ   #0,D0
    MOVE.W  -4(A0),D0
    RTS
;*-*
;; String
I_STRING:
    MOVE.L  D3,A3
    MOVE.L  4(A7),D0
    CMP.L   #$7FF0,D0
    BPL.S   .1
    MOVE.L  D0,D3
    ADD.L   #17,D0          ; 8 (LIST) + 4 (LINK) + 4 (LENGTHS) + 1 (ZERO)
    MOVE.L  #$10000,D1
    MOVE.L  D0,D2
    MOVE.L  4.W,A6
    JSR -198(A6)
    TST.L   D0
    BEQ.S   .1
    MOVE.L  D0,A0
    MOVE.W  D3,12(A0)
    MOVE.L  -20(A4),(A0)
    MOVE.L  D2,4(A0)
    MOVE.L  D0,-20(A4)
    ADDQ.L  #8,D0
    ADDQ.L  #8,D0
    MOVE.L  A3,D3
    RTS
.1: MOVEQ   #0,D0
    MOVE.L  A3,D3
    RTS
;*-*
;; RightStr
I_RIGHTSTR:
    MOVEQ   #0,D0
    MOVE.L  12(A7),A0
    MOVE.L  8(A7),A1
    MOVE.W  -2(A1),D0
    SUB.L   4(A7),D0
    TST.L   D0
    BPL.S   .4
    MOVEQ   #0,D0
.4: ADD.L   D0,A1
    MOVE.L  #$FFFF,D0
    MOVE.L  A0,A2
    MOVEQ   #0,D1
    MOVE.W  -4(A0),D1
    CMP.L   D0,D1
    BPL.S   .1
    MOVE.L  D1,D0
.1: MOVE.L  D0,D2
    SUBQ.L  #1,D0           ; D0=COPYLEN
.2: MOVE.B  (A1)+,(A0)+
    BEQ.S   .3
    DBRA    D0,.2
    MOVE.B  #0,(A0)+
.3: ADDQ.W  #1,D0
    SUB.W   D0,D2
    MOVE.W  D2,-2(A2)
    MOVE.L  A2,D0
    RTS
;*-*
;; MidStr
I_MIDSTR:
    MOVEQ   #0,D0
    MOVE.W  6(A7),D0        ; LEN
    MOVE.L  12(A7),A1       ; STR
    ADD.L   8(A7),A1        ; +OFFSET
    MOVE.L  16(A7),A0       ; ESTR
    MOVE.L  A0,A2
    MOVEQ   #0,D1
    MOVE.W  -4(A0),D1
    CMP.L   D0,D1
    BPL.S   .1
    MOVE.L  D1,D0
.1: MOVE.L  D0,D2
    SUBQ.L  #1,D0           ; D0=COPYLEN
.2: MOVE.B  (A1)+,(A0)+
    BEQ.S   .3
    DBRA    D0,.2
    MOVE.B  #0,(A0)+
.3: ADDQ.W  #1,D0
    SUB.W   D0,D2
    MOVE.W  D2,-2(A2)
    MOVE.L  A2,D0
    RTS
;*-*
;; StringF
I_STRINGF:
    MOVE.L  4(A7),D0
    MOVE.L  8(A7,D0.L),A0       ; formatstr
    LEA 8(A7),A1        ; argarray
    LEA     .1(PC),A2       ; putfun
    MOVE.L  4.W,A6
    ;MOVE.L  276(A6),A3
    ;MOVE.L  58(A3),A3
    MOVE.L  -64(A4),A3      ; BETTER!
    MOVE.L  A3,D2           ; both bottom OWN stack
    JSR     -522(A6)
    MOVE.L  D2,A1
    MOVE.L  4(A7),D0
    MOVE.L  12(A7,D0.L),A0      ; ESTR
    MOVE.L  A0,A2
    MOVEQ   #0,D0
    MOVE.W  -4(A0),D0
    MOVE.L  D0,D2
    SUBQ.L  #1,D0           ; D0=COPYLEN
.2: MOVE.B  (A1)+,(A0)+
    BEQ.S   .3
    DBRA    D0,.2
    MOVE.B  #0,(A0)+
.3: ADDQ.W  #1,D0
    SUB.W   D0,D2
    MOVE.W  D2,-2(A2)
    MOVE.L  D2,D1
    EXT.L   D1
    MOVE.L  A2,D0
    RTS
.1: MOVE.B  D0,(A3)+        ;RDF DUMP
    RTS
;*-*
;; Val
I_VAL:
    MOVEM.L D3-D6,-(A7)     ; 16 OFF STACK
    MOVE.L  24(A7),A2
    MOVE.L  20(A7),D5       ; D5=READLENADR
    MOVEQ   #0,D6           ; D6=MINUSFLAG
.5: MOVE.B  (A2)+,D0        ; reg d0,a2
    BEQ VALER
    CMP.B   #33,D0
    BMI.S   .5
    SUBQ.L  #1,A2
    CMP.B   #"-",(A2)
    BNE.S   .NM
    ADDQ.L  #1,A2
    MOVEQ   #-1,D6
.NM:    CMP.B   #'$',(A2)
    BEQ HEX
    CMP.B   #'%',(A2)
    BEQ BIN
    LEA 11(A2),A1       ; reg d0-d3,a0-a3
    MOVE.L  A2,A0
.4: MOVE.B  (A2)+,D0
    CMP.B   #58,D0
    BPL.S   .6
    CMP.B   #48,D0
    BPL.S   .4
.6: SUBQ.L  #1,A2
    MOVE.L  A2,D4           ; D4=TOREADLEN
    CMPA.L  A2,A0
    BEQ.S   VALER
    MOVEQ   #0,D0           ; RESULT
    CMPA.L  A1,A2
    BPL.S   VALER
    LEA .2(PC),A3
.1: MOVEQ   #0,D3
    MOVE.B  -(A2),D3
    MOVE.L  (A3)+,D2
    SUB.B   #48,D3
    MOVE.L  D3,D1
    MULU    D2,D3
    SWAP    D2
    MULU    D2,D1
    SWAP    D1
    ADD.L   D1,D3
    ADD.L   D3,D0
    BCS.S   VALER
    CMPA.L  A0,A2
    BNE.S   .1
    BRA.S   ISIND0
.2: DC.L    1,10,100,1000,10000,100000,1000000
    DC.L    10000000,100000000,1000000000
ISIND0: SUB.L   24(A7),D4
    TST.L   D5
    BEQ.S   .NP
    MOVE.L  D5,A0
    MOVE.L  D4,(A0)
.NP:    TST.L   D6
    BEQ.S   .NN
    NEG.L   D0
.NN:    MOVE.L  D4,D1
    MOVEM.L (A7)+,D3-D6
    RTS
VALER:  MOVEQ   #0,D0
    MOVEQ   #0,D1
    TST.L   D5
    BEQ.S   .NP
    MOVE.L  D5,A0
    CLR.L   (A0)
.NP:    MOVEM.L (A7)+,D3-D6
    RTS
HEX:    ADDQ.L  #1,A2
    MOVE.L  A2,A0           ; reg d0-d3,a0,a2
    MOVE.L  A0,D3
    MOVEQ   #0,D1           ; RESULT
    MOVEQ   #0,D2           ; #OF SHIFTS
.4: MOVE.B  (A0)+,D0
    CMP.B   #"G",D0
    BPL.S   .2B
    CMP.B   #"0",D0
    BMI.S   .1
    CMP.B   #"9"+1,D0
    BPL.S   .2
    BRA.S   .4
.1: SUBQ.L  #1,A0
    MOVE.L  A0,D4           ; SET TOREADLEN
    CMP.L   A0,D3
    BEQ.S   VALER
.3: CMP.L   A0,D3
    BEQ.S   .5
    MOVEQ   #0,D0
    MOVE.B  -(A0),D0
    CMP.B   #"A",D0
    BPL.S   .10
    SUB.B   #"0",D0
.11:    CMP.W   #32,D2
    BEQ VALER
    LSL.L   D2,D0
    ADD.L   D0,D1
    ADDQ.L  #4,D2
    BRA.S   .3
.5: MOVE.L  D1,D0
    BRA.S   ISIND0
.2: CMP.B   #"A",D0
    BPL.S   .4
    BRA.S   .1
.2B:    CMP.B   #"a",D0
    BMI.S   .1
    CMP.B   #"g",D0
    BPL.S   .1
    BRA.S   .4
.10:    CMP.B   #"a",D0
    BPL.S   .10B
    SUB.B   #55,D0
    BRA.S   .11
.10B:   SUB.B   #55+32,D0
    BRA.S   .11
BIN:    ADDQ.L  #1,A2
    MOVE.L  A2,A0           ; reg d0-d3,a0,a2
    MOVE.L  A0,D3
    MOVEQ   #0,D1           ; RESULT
    MOVEQ   #0,D2           ; BITNUM
.4: MOVE.B  (A0)+,D0
    CMP.B   #"1",D0
    BEQ.S   .4
    CMP.B   #"0",D0
    BEQ.S   .4
.1: SUBQ.L  #1,A0
    MOVE.L  A0,D4           ; SET TOREADLEN
    CMP.L   A0,D3
    BEQ VALER
.3: CMP.L   A0,D3
    BEQ.S   .5
    MOVEQ   #0,D0
    MOVE.B  -(A0),D0
    CMP.B   #"0",D0
    BEQ.S   .10
    BSET    D2,D1
.10:    CMP.W   #32,D2
    BEQ VALER
    ADDQ.L  #1,D2
    BRA.S   .3
.5: MOVE.L  D1,D0
    BRA ISIND0
;*-*
;; InStr
I_INSTR:
    MOVE.L  8(A7),A1        ; STRING TO FIND
    MOVE.L  12(A7),A0       ; THE STRING
    MOVE.L  A0,D2
    ADD.L   4(A7),A0
    MOVE.B  (A1)+,D0        ; FIRST CHAR
.1: MOVE.B  (A0)+,D1
    BEQ.S   .2
    CMP.B   D0,D1
    BNE.S   .1
    MOVE.L  A0,A2
    MOVE.L  A1,A3
.3: MOVE.B  (A3)+,D1
    BEQ.S   .4
    CMP.B   (A2)+,D1
    BNE.S   .1
    BEQ.S   .3
.4: SUBQ.L  #1,A0
    MOVE.L  A0,D0
    SUB.L   D2,D0
    RTS
.2: MOVEQ   #-1,D0
    RTS
;*-*
;; TrimStr
I_TRIMSTR:
    MOVE.L  4(A7),A2
    MOVEQ   #0,D0
.1: MOVE.B  (A2)+,D0
    BEQ.S   .2
    CMP.W   #33,D0
    BMI.S   .1
.2: SUBQ.L  #1,A2
    MOVE.L  A2,D0
    RTS
;*-*
;; UpperStr
I_UPPERSTR:
    MOVE.L  4(A7),A0
    MOVE.L  A0,A1
.1: MOVE.B  (A0)+,D0
    BEQ.S   .2
    CMP.B   #97,D0
    BMI.S   .1
    CMP.B   #123,D0
    BPL.S   .1
    SUB.B   #32,D0
    MOVE.B  D0,-1(A0)
    BRA.S   .1
.2: MOVE.L  A1,D0
    RTS
;*-*
;; LowerStr
I_LOWERSTR:
    MOVE.L  4(A7),A0
    MOVE.L  A0,A1
.1: MOVE.B  (A0)+,D0
    BEQ.S   .2
    CMP.B   #91,D0
    BPL.S   .1
    CMP.B   #65,D0
    BMI.S   .1
    ADD.B   #32,D0
    MOVE.B  D0,-1(A0)
    BRA.S   .1
.2: MOVE.L  A1,D0
    RTS
;*-*
;; ReadStr
I_READSTR:
    MOVEM.L D3/D4/D6/D7,-(A7)
    MOVE.L  20(A7),A2       ; ESTR
    MOVE.L  A2,D4
    MOVE.L  24(A7),D7       ; FH
    MOVEQ   #0,D6
    MOVE.W  -4(A2),D6       ; MAXLEN
    ADD.L   A2,D6
    MOVE.L  -44(A4),A6
    MOVEQ   #1,D3
.1: CMP.L   D6,A2
    BEQ.S   .4
    MOVE.L  D7,D1
    MOVE.L  A2,D2
    ADDQ.L  #1,A2
    JSR -42(A6)
    CMP.W   #1,D0
    BMI.S   .5
    CMP.B   #10,-1(A2)
    BNE.S   .1
    MOVEQ   #0,D0
    SUBQ.L  #1,A2
.4: MOVE.L  A2,D1
    MOVE.B  #0,(A2)+
    SUB.L   D4,D1
    MOVE.L  D4,A0
    MOVE.W  D1,-2(A0)
    MOVEM.L (A7)+,D3/D4/D6/D7
    RTS
.5: SUBQ.L  #1,A2
    MOVEQ   #-1,D0
    BRA.S   .4
;*-*

;; Out
I_OUT:
    MOVE.L  D3,A3
    MOVE.L  8(A7),D1
    LEA 7(A7),A0
    MOVE.L  A0,D2
    MOVEQ   #1,D3
    MOVE.L  -44(A4),A6
    JSR -48(A6)
    MOVE.L  A3,D3
    RTS
;*-*
;; Inp
I_INP:
    MOVE.L  D3,A3
    MOVE.L  4(A7),D1
    MOVEQ   #1,D3
    LEA 4(A7),A0
    MOVE.L  A0,D2
    MOVE.L  -44(A4),A6
    JSR -42(A6)
    MOVE.L  A3,D3
    TST.L   D0
    BEQ.S   .1
    MOVEQ   #0,D0
    MOVE.B  4(A7),D0
    RTS
.1: MOVEQ   #-1,D0
    RTS
;*-*
;; Version
I_VERSION:
    MOVE.L  4(A7),D0        ; V. REQUESTED
    MOVE.L  4.W,A6
    MOVE.W  20(A6),D1       ; V. CURRENTLY RUNNING
    CMP.W   D0,D1
    BMI.S   .1
    MOVEQ   #-1,D0          ; TRUE=RIGHT KICK
    RTS
.1: MOVEQ   #0,D0           ; FALSE
    RTS
;*-*
;; FileLength
I_FILELENGTH:
    MOVEM.L D4/D6/D7,-(A7)
    MOVE.L  16(A7),D1
    MOVEQ   #-2,D2
    MOVE.L  -44(A4),A6
    JSR -84(A6)
    MOVE.L  D0,D7           ; LOCK
    BEQ.S   .1
    MOVE.L  D0,D1
    MOVE.L  #-260,D4        ; FRAME WITH BCPL ADDRESS CONV.
    MOVE.L  A7,D0
    BTST    #1,D0
    BEQ.S   .4
    SUBQ.L  #2,D4
.4: LEA 0(A7,D4.L),A7
    MOVE.L  A7,D2
    JSR -102(A6)        ; EXAMINE
    MOVE.L  124(A7),D6      ; GET LENGTH FROM FIB
    NEG.L   D4
    LEA 0(A7,D4.L),A7
    TST.L   D0
    BEQ.S   .2
    BSR .3
    MOVE.L  D6,D0
    MOVEM.L (A7)+,D4/D6/D7
    RTS
.3: MOVE.L  D7,D1           ; UNLOCK
    JSR -90(A6)
    RTS
.2: BSR.S   .3
.1: MOVEQ   #-1,D0
    MOVEM.L (A7)+,D4/D6/D7
    RTS
;*-*
;; MouseX                   I
I_MOUSEX:
    MOVEQ   #0,D0
    MOVE.L  4(A7),A0
    MOVE.W  14(A0),D0
    RTS
;*-*
;; MouseY                   I
I_MOUSEY:
    MOVEQ   #0,D0
    MOVE.L  4(A7),A0
    MOVE.W  12(A0),D0
    RTS
;*-*
;; FreeStack
I_FREESTACK:
    MOVE.L  A7,D0
    SUB.L   -64(A4),D0
    SUB.L   #1000,D0
    RTS
;*-*
;; CtrlC
I_CTRLC:
    MOVEQ   #0,D0
    MOVEQ   #0,D1
    MOVE.L  4.W,A6
    JSR -306(A6)
    BTST    #12,D0          ; NOTE: 13=CTRLD ETC.
    BEQ.S   .1
    MOVEQ   #0,D0
    MOVE.L  #4096,D1
    JSR -306(A6)
    MOVEQ   #-1,D0
    RTS
.1: MOVEQ   #0,D0           ; D0<--TRUE/FALSE
    RTS
;*-*

;; List
I_LIST:
    MOVE.L  D3,A3
    MOVE.L  4(A7),D0
    CMP.L   #$7FF0,D0
    BPL.S   .1
    MOVE.L  D0,D3           ; LEN
    LSL.L   #2,D0
    ADD.L   #16,D0          ; 8 (LIST) + 4 (LINK) + 4 (LENGTHS)
    MOVE.L  #$10000,D1
    MOVE.L  D0,D2           ; SLEN
    MOVE.L  4.W,A6
    JSR -198(A6)
    TST.L   D0
    BEQ.S   .1
    MOVE.L  D0,A0
    MOVE.W  D3,12(A0)
    MOVE.L  -20(A4),(A0)
    MOVE.L  D2,4(A0)
    MOVE.L  D0,-20(A4)
    ADDQ.L  #8,D0
    ADDQ.L  #8,D0
    MOVE.L  A3,D3
    RTS
.1: MOVEQ   #0,D0
    MOVE.L  A3,D3
    RTS
;*-*

;; ListCopy
I_LISTCOPY:
    LEA 6(A7),A1
    MOVE.w  (A1)+,D0 ; len
    MOVe.L  (A1)+,A0 ; src
    move.l  (a1)+,a1 ; dst
    MOVE.L  A1,A2
    CMP.W   #-1,D0
    BNE.S   .1
    MOVE.W  -2(A0),D0
.1: CMP.W   -4(A1),D0
    BMI.S   .2
    MOVE.W  -4(A1),D0
.2: CMP.W   #1,D0
    BMI.S   .3
    MOVE.W  D0,-2(A1)
    SUBQ.W  #1,D0
.XL:MOVE.L  (A0)+,(A1)+
    DBRA    D0,.XL
.3: MOVE.L  A2,D0
    RTS
;*-*
;; ListAdd
I_LISTADD:
    MOVE.W  6(A7),D0        ; LEN
    MOVE.L  8(A7),A0        ; SRC
    MOVE.L  12(A7),A1       ; DEST
    MOVE.L  A1,A2
    CMP.W   #-1,D0
    BNE.S   .1
    MOVE.W  -2(A0),D0
.1: MOVE.W  -4(A1),D1
    SUB.W   -2(A1),D1
    CMP.W   D1,D0
    BMI.S   .2
    MOVE.W  D1,D0
.2: CMP.W   #1,D0
    BMI.S   .3
    MOVE.W  -2(A1),D1
    ADD.W   D0,-2(A1)
    EXT.L   D1
    LSL.L   #2,D1
    ADD.L   D1,A1
    SUBQ.W  #1,D0
.XL:MOVE.L  (A0)+,(A1)+
    DBRA    D0,.XL
.3: MOVE.L  A2,D0
    RTS
;*-*
;; ListCmp
I_LISTCMP:
    MOVE.W  6(A7),D0        ; LEN
    MOVE.L  8(A7),A0        ; SRC
    MOVE.L  12(A7),A1       ; DEST
    CMP.W   #-1,D0
    BNE.S   .1
    MOVE.W  -2(A0),D0
.1: CMP.W   -2(A1),D0
    BNE.S   .4          ; LENDEST<>LENSRC
    CMP.W   #1,D0
    BMI.S   .3
    SUBQ.W  #1,D0
.XL:CMPM.L  (A0)+,(A1)+
    BNE.S   .4
    DBRA    D0,.XL
.3: MOVEQ   #-1,D0
    RTS
.4: MOVEQ   #0,D0
    RTS
;*-*
;; ListLen
I_LISTLEN:
    MOVE.L  4(A7),A0
    MOVEQ   #0,D0
    MOVE.W  -2(A0),D0
    RTS
;*-*
;; ListMax
I_LISTMAX:
    MOVE.L  4(A7),A0
    MOVEQ   #0,D0
    MOVE.W  -4(A0),D0
    RTS
;*-*
;; Even                     I
I_EVEN:
    BTST    #0,7(A7)
    BEQ.S   .1
    MOVEQ   #0,D0
    RTS
.1: MOVEQ   #-1,D0
    RTS
;*-*
;; Odd                      I
I_ODD:
    BTST    #0,7(A7)
    BNE.S   .1
    MOVEQ   #0,D0
    RTS
.1: MOVEQ   #-1,D0
    RTS
;*-*
;; Eval                     I
I_EVAL:
    MOVE.L  4(A7),A0
    JSR (A0)            ; ACTIONNES DANGEREUSES !!!
    RTS
;*-*
;; ForAll
I_FORALL:
    MOVE.L  4(A7),A0        ; code
    MOVE.L  8(A7),A1        ; list
    MOVE.L  12(A7),A2       ; VAR
    MOVEQ   #-1,D0          ; TRUTH VALUE ->D1
    MOVE.W  -2(A1),D2       ; COUNT
    BEQ.S   .1
    SUBQ.L  #1,D2
    MOVE.L  D0,D1
.XL:MOVE.L  (A1)+,(A2)
    MOVEM.L D1-D2/A0-A2,-(A7)
    JSR (A0)
    MOVEM.L (A7)+,D1-D2/A0-A2
    TST.L   D0
    BEQ.S   .2
    DBRA    D2,.XL
    BRA.S   .3
.2: MOVEQ   #0,D1
    DBRA    D2,.XL
.3: MOVE.L  D1,D0
.1: RTS
;*-*
;; Exists
I_EXISTS:
    MOVE.L  4(A7),A0        ; code
    MOVE.L  8(A7),A1        ; list
    MOVE.L  12(A7),A2       ; VAR
    MOVEQ   #0,D0           ; TRUTH VALUE ->D1
    MOVE.W  -2(A1),D2       ; COUNT
    BEQ.S   .1
    SUBQ.L  #1,D2
    MOVE.L  D0,D1
.XL:MOVE.L  (A1)+,(A2)
    MOVEM.L D1-D2/A0-A2,-(A7)
    JSR (A0)
    MOVEM.L (A7)+,D1-D2/A0-A2
    TST.L   D0
    BNE.S   .2
    DBRA    D2,.XL
    BRA.S   .3
.2: MOVEQ   #-1,D1
    DBRA    D2,.XL
.3: MOVE.L  D1,D0
.1: RTS
;*-*
;; MapList
I_MAPLIST:
    MOVE.L  4(A7),A0        ; code
    MOVE.L  8(A7),A3        ; DESTLIST
    MOVE.L  12(A7),A1       ; SRClist
    MOVE.L  16(A7),A2       ; VAR
    MOVE.L  A3,-(A7)
    MOVE.W  -4(A3),D0
    CMP.W   -2(A1),D0
    BMI.S   .1
    MOVE.W  -2(A1),-2(A3)
    MOVE.W  -2(A1),D2       ; COUNT
    BEQ.S   .1
    SUBQ.L  #1,D2
;   MOVE.L  D0,D1
.XL: MOVE.L  (A1)+,(A2)
    MOVEM.L D2/A0-A3,-(A7)
    JSR (A0)
    MOVEM.L (A7)+,D2/A0-A3
    MOVE.L  D0,(A3)+
    DBRA    D2,.XL
.1: MOVE.L  (A7)+,D0
    RTS
;*-*
;; Abs                      I
I_ABS:
    MOVE.L  4(A7),D0
    BPL.S   .1
    NEG.L   D0
.1: RTS
;*-*
;; Shl                      I
I_SHL:
    MOVE.L  8(A7),D0
    MOVE.L  4(A7),D1
    ASL.L   D1,D0
    RTS
;*-*
;; Shr                      I
I_SHR:
    MOVE.L  8(A7),D0
    MOVE.L  4(A7),D1
    ASR.L   D1,D0
    RTS
;*-*
;; Box
I_BOX:
    MOVE.L  D3,A3
    MOVE.L  -16(A4),A1      ; rast
    MOVE.L  A1,D0
    BEQ.S   .1
    MOVE.L  -52(A4),A6
    MOVE.L  4(A7),D0
    JSR -342(A6)        ; setapen
    MOVE.L  -16(A4),A1
    MOVE.L  20(A7),D0
    MOVE.L  16(A7),D1
    MOVE.L  12(A7),D2
    MOVE.L  8(A7),D3
    JSR -306(A6)        ; rectfill
.1: MOVE.L  A3,D3
    RTS
;*-*

;; Dispose
I_DISP:
    MOVE.L  4(A7),D0
    BEQ.S   .1
    SUBQ.L  #8,D0
    LEA -20(A4),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: RTS
;*-*
;; DisposeList
I_DISPL:
    MOVE.L  4(A7),A3        ; A3=STRING
.ML:    MOVE.L  A3,D0
    BEQ.S   .1
    MOVE.L  -8(A3),A3
    SUBQ.L  #8,D0
    SUBQ.L  #8,D0           ; D0=MEM
    LEA -20(A4),A1
.XL:MOVE.L  (A1),D1
    BEQ.S   .ML
    MOVE.L  A1,A2           ; 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)
    BRA.S   .ML
.1: RTS
;*-*

;; Link
I_LINK:
    MOVE.L  8(A7),A0
    MOVE.L  A0,D0
    BEQ.S   .1
    MOVE.L  4(A7),-8(A0)
.1: RTS
;*-*
;; Next
I_NEXT:
    MOVE.L  4(A7),D0
    BEQ.S   .1
    MOVE.L  D0,A0
    MOVE.L  -8(A0),D0
.1: RTS
;*-*
;; Forward
I_FORWARD:
    LEA 8(A7),A0        ; LIST
    MOVE.L  4(A7),D1        ; NUM
    ADDQ.L  #1,D1
.XL:MOVE.L  (A0),D0
    BEQ.S   .1
    MOVE.L  D0,A0
    SUBQ.L  #8,A0
    SUBQ.L  #1,D1
    BNE.S   .XL
.1: RTS
;*-*
;; SetStr
I_SETSTR:
    MOVE.W  6(A7),D0
    MOVE.L  8(A7),A0
    CMP.W   -4(A0),D0
    BHI.S   .1
    MOVE.W  D0,-2(A0)
    MOVE.B  #0,0(A0,D0.W)
.1: RTS
;*-*
;; SetList
I_SETLIST:
    MOVE.W  6(A7),D0
    MOVE.L  8(A7),A0
    CMP.W   -4(A0),D0
    BHI.S   .1
    MOVE.W  D0,-2(A0)
.1: RTS
;*-*
;; WaitMsg
I_WAITMSG:
    MOVE.L  4(A7),A0
    MOVE.L  $56(A0),A2      ; A2=PORT
    MOVE.L  4.W,A6
    MOVE.L  A2,A0
    JSR -372(A6)        ; GETMSG
    MOVE.L  D0,A3           ; A3=MES
    TST.L   D0
    BNE.S   .1
.2: MOVE.L  A2,A0
    JSR -384(A6)        ; WAITPORT
    MOVE.L  A2,A0
    JSR -372(A6)        ; GETMSG
    MOVE.L  D0,A3
    TST.L   D0
    BEQ.S   .2
.1: MOVE.L  28(A3),-72(A4)
    MOVE.L  24(A3),-68(A4)
    MOVE.L  20(A3),D2
    MOVE.L  A3,A1
    JSR -378(A6)        ; REPLY
    MOVE.L  D2,D0           ; CLASS
    RTS
;*-*
;; MsgCode                  I
I_MSGCODE:
    MOVEQ   #0,D0
    MOVE.W  -68(A4),D0
    RTS
;*-*
;; MsgQual                  I
I_MSGQUAL:
    MOVEQ   #0,D0
    MOVE.W  -66(A4),D0
    RTS
;*-*
;; MsgIaddr                 I
I_MSGIADR:
    MOVE.L  -72(A4),D0
    RTS
;*-*
;; Rnd
I_RND:                ; rand16:=RangeRand(max16)
    MOVE.L  4(A7),D2        ; 6(a7) was E(a7) ????
    BMI.S   .SET
    MOVE.W  D2,D1           ; RangeRand(1000) --> 0..999
    SUBQ.W  #$1,D1
    MOVE.L  .S(PC),D0       ; randnr:=Rnd(max)
.2: ADD.L   D0,D0
    BHI.S   .3
    EORI.L  #$1D872B41,D0
.3: LSR.W   #$1,D1
    BNE.S   .2
    LEA .S(PC),A0
    MOVE.L  D0,(A0)
    TST.W   D2
    BNE.S   .4
    SWAP    D0
    BRA.S   .5
.4: MULU    D2,D0
.5: CLR.W   D0
    SWAP    D0
    RTS
.SET:   NEG.L   D2
    LEA .S(PC),A0
    MOVE.L  D2,(A0)
    RTS
.S: DC.L    0
;*-*
;; RndQ
I_RNDQ:               ;   seed32:=FastRand(seed32)
    MOVE.L  $0004(A7),D0
    ADD.L   D0,D0           ;   seed:=RndQ(seed)
    BHI.S   .1
    EORI.L  #$1D872B41,D0
.1: RTS      
;*-*
;; Mod                      PI
I_MOD:
    MOVE.L  8(A7),D0
    DIVS    6(A7),D0
    MOVE.L  D0,D1
    SWAP    D0
    EXT.L   D0
    EXT.L   D1
    RTS
;*-*
;; Eor                      I
I_EOR:
    MOVE.L  4(A7),D0
    MOVE.L  8(A7),D1
    EOR.L   D1,D0
    RTS
;*-*
;; Cause
; see also NEWR(), Throw() and ReThrow()

I_CAUSE:
    MOVE.L  4(A7),-84(A4)       ; FILL "EXCEPTION" VAR
    MOVE.L  -76(A4),D0
    BEQ.S   .1
    MOVE.L  D0,A0           ; A0=CODE TO JUMP TO
    MOVE.L  -80(A4),A7      ; STACK BACK
    MOVE.L  -88(A4),A5
    MOVE.L  (A7)+,-88(A4)       ; (A5)
    MOVE.L  (A7)+,-76(A4)       ; PUT PREVIOUS HANDLER BACK (CODE)
    MOVE.L  (A7)+,-80(A4)       ; (STACK)
    JMP (A0)
.1: MOVE.L  -24(A4),A0      ; PERFORM CLEANUP(0)
    JMP (A0)
;*-*
;; ListItem
I_LISTITEM:           ; SIMPLE, BUT EFFECTIVE !
    MOVE.L  4(A7),D0
    LSL.L   #2,D0
    MOVE.L  8(A7),A0
    MOVE.L  0(A0,D0.L),D0
    RTS
;*-*

;; NewR
I_NEWR:
    MOVE.L  4(A7),D0        ; COPY OF New()
    MOVE.L  #$10000,D1
    ADDQ.L  #8,D0
    MOVE.L  D0,D2
    MOVE.L  4.W,A6
    JSR -198(A6)
    TST.L   D0
    BEQ.S   .1
    MOVE.L  D0,A0
    MOVE.L  -20(A4),(A0)
    MOVE.L  D2,4(A0)
    MOVE.L  D0,-20(A4)
    ADDQ.L  #8,D0
    RTS
.1: MOVE.L  #"MEM",-84(A4)      ; COPY OF Raise()
    MOVE.L  -76(A4),D0
    BEQ.S   .2
    MOVE.L  D0,A0
    MOVE.L  -80(A4),A7
    MOVE.L  -88(A4),A5
    MOVE.L  (A7)+,-88(A4)
    MOVE.L  (A7)+,-76(A4)
    MOVE.L  (A7)+,-80(A4)
    JMP (A0)
.2: MOVE.L  -24(A4),A0
    JMP (A0)
    RTS
;*-*

;; Sign
I_SIGN:
    MOVE.L  4(A7),D0
    BMI.S   .1
    BEQ.S   .2
    MOVEQ   #1,D0
    RTS
.1: MOVEQ   #-1,D0
    RTS
.2: MOVEQ   #0,D0
    RTS
;*-*
;; PrintF
I_PRINTF:
    TST.L   -8(A4)          ;STDIO
    BEQ .2
.3: MOVE.L  4(A7),D0
    MOVE.L  8(A7,D0.L),A0
    LEA 8(A7),A1
    LEA .1(PC),A2
    MOVE.L  4.W,A6
    MOVE.L  -64(A4),A3
    MOVE.L  A3,D2
    JSR -522(A6)
    MOVE.L  -8(A4),D1
    MOVE.L  -44(A4),A6
    JSR -342(A6)
    MOVE.L  D2,A0           ; JUST FOR LEN!
.C: TST.B   (A0)+
    BNE.S   .C
    SUB.L   D2,A0
    SUBQ.L  #1,A0
    MOVE.L  A0,D0
    RTS
.1: MOVE.B  D0,(A3)+        ; RDF DUMP
    RTS
.2: LEA .4(PC),A0
    MOVE.L  A0,D1           ; OPEN CON
    MOVE.L  #1006,D2
    MOVE.L  -44(A4),A6
    JSR -30(A6)
    MOVE.L  D0,-12(A4)
    MOVE.L  D0,-8(A4)
    TST.L   D0
    BNE.S   .3
    MOVEQ   #20,D0
    MOVE.L  D0,-28(A4)
    MOVE.L  -24(A4),A0
    JMP (A0)
.4: DC.B    "CON:0/11/640/80/Output",0
    EVEN
;*-*
;; WaitLeftMouse
I_WAITLEFTMOUSE:
    MOVE.L  4(A7),A3        ; A3=WIN
    MOVE.L  82(A3),D0
    BTST    #3,D0
    BNE.S   .3          ; CHECK IDCMP CONTAINS MOUSE
    BSET    #3,D0
    MOVE.L  -48(A4),A6
    MOVE.L  A3,A0
    JSR -150(A6)        ; MODIFYIDCMP
.3: MOVE.L  $56(A3),A2      ; A2=PORT
    MOVE.L  4.W,A6
    MOVE.L  A2,A0
    JSR -372(A6)        ; GETMSG
    MOVE.L  D0,A3           ; A3=MES
    TST.L   D0
    BNE.S   .1
.2: MOVE.L  A2,A0
    JSR -384(A6)        ; WAITPORT
    MOVE.L  A2,A0
    JSR -372(A6)        ; GETMSG
    MOVE.L  D0,A3
    TST.L   D0
    BEQ.S   .2
.1: MOVE.L  A3,A1           ; MES
    MOVE.L  20(A1),D2
    JSR -378(A6)        ; REPLY
    MOVE.L  D2,D0           ; CLASS
    BTST    #3,D0
    BEQ.S   .2
    RTS
;*-*
;; LeftMouse
I_LEFTMOUSE:
    MOVE.L  4(A7),A3        ; A3=WIN
    MOVE.L  82(A3),D0
    BTST    #3,D0
    BNE.S   .3          ; CHECK IDCMP CONTAINS MOUSE
    BSET    #3,D0
    MOVE.L  -48(A4),A6
    MOVE.L  A3,A0
    JSR -150(A6)        ; MODIFYIDCMP
.3: MOVE.L  $56(A3),A2      ; A2=PORT
    MOVE.L  4.W,A6
    MOVE.L  A2,A0
    JSR -372(A6)        ; GETMSG
    TST.L   D0
    BNE.S   .1
    RTS
.1: MOVE.L  D0,A1           ; MES
    MOVE.L  20(A1),D2
    JSR -378(A6)        ; REPLY
    MOVE.L  D2,D0           ; CLASS
    BTST    #3,D0
    BEQ.S   .2
    MOVEQ   #-1,D0
    RTS
.2: MOVEQ   #0,D0
    RTS
;*-*
;; SetIn
I_SETIN:
    MOVE.L  -8(A4),D0
    MOVE.L  4(A7),D1
    BEQ.S   .1
    MOVE.L  D1,-92(A4)
.1: RTS
;*-*
;; Throw
I_THROW:
    MOVE.L  8(A7),-84(A4)       ; FILL "EXCEPTION" VAR
    MOVE.L  4(A7),-96(A4)       ; FILL "EXCEPTIONINFO" VAR
    MOVE.L  -76(A4),D0
    BEQ.S   .1
    MOVE.L  D0,A0               ; A0=CODE TO JUMP TO
    MOVE.L  -80(A4),A7          ; STACK BACK
    MOVE.L  -88(A4),A5
    MOVE.L  (A7)+,-88(A4)       ; (A5)
    MOVE.L  (A7)+,-76(A4)       ; PUT PREVIOUS HANDLER BACK (CODE)
    MOVE.L  (A7)+,-80(A4)       ; (STACK)
    JMP (A0)
.1: MOVE.L  -24(A4),A0          ; PERFORM CLEANUP(0)
    JMP (A0)
    RTS
;*-*
;; ReThrow
I_RETHROW:
    TST.L   -84(A4)         ; NO RETHROW() IF EXC=0
    BEQ.S   .2
    MOVE.L  -76(A4),D0
    BEQ.S   .1
    MOVE.L  D0,A0           ; A0=CODE TO JUMP TO
    MOVE.L  -80(A4),A7      ; STACK BACK
    MOVE.L  -88(A4),A5
    MOVE.L  (A7)+,-88(A4)       ; (A5)
    MOVE.L  (A7)+,-76(A4)       ; PUT PREVIOUS HANDLER BACK (CODE)
    MOVE.L  (A7)+,-80(A4)       ; (STACK)
    JMP (A0)
.1: MOVE.L  -24(A4),A0      ; PERFORM CLEANUP(0)
    JMP (A0)
.2: RTS
;*-*
;; SelectList
I_SELECTLIST:
    MOVE.L  4(A7),A0        ; code
    MOVE.L  8(A7),A3        ; DESTLIST
    MOVE.L  A3,A6
    MOVE.L  12(A7),A1       ; SRClist
    MOVE.L  16(A7),A2       ; VAR
    MOVE.W  -2(A1),D2       ; COUNT
    BEQ.S   .1
    SUBQ.L  #1,D2
.XL:MOVE.L  (A1)+,(A2)
    MOVEM.L D2/A0-A3/A6,-(A7)
    JSR (A0)
    MOVEM.L (A7)+,D2/A0-A3/A6
    TST.L   D0
    BEQ.S   .2
    MOVE.L  (A2),(A3)+
    ADDQ.W  #1,-2(A6)
    MOVE.W  -4(A6),D0
    CMP.W   -2(A6),D0
    BEQ.S   .1
.2: DBRA    D2,.XL
.1: MOVE.W  -2(A6),D0
    EXT.L   D0
    RTS
;*-*
;; SetColour
I_SETCOLOUR:
    MOVE.L  D3,A3
    MOVE.L  D4,A2
    MOVE.L  4(A7),D3
    MOVE.L  8(A7),D2
    MOVE.L  12(A7),D1
    MOVE.L  16(A7),D0
    MOVE.L  20(A7),A0
    ADD.W   #44,A0
    MOVE.L  4.W,A6
    MOVE.W  20(A6),D4
    MOVE.L  -52(A4),A6
    CMP.W   #39,D4
    BPL.S   .39
    LSR.L   #4,D1
    LSR.L   #4,D2
    LSR.L   #4,D3
    JSR -$120(A6)
    MOVE.L  A3,D3
    MOVE.L  A2,D4
    RTS
.39:    MOVEQ   #24,D4
    LSL.L   D4,D1
    LSL.L   D4,D2
    LSL.L   D4,D3
    JSR -852(A6)
    MOVE.L  A3,D3
    MOVE.L  A2,D4
    RTS
;*-*

;; NewM
I_NEWM:
    MOVE.L  8(A7),D0        ; COPY OF New()
    MOVE.L  4(A7),D1
    ADDQ.L  #8,D0
    MOVE.L  D0,D2
    MOVE.L  4.W,A6
    JSR -198(A6)
    TST.L   D0
    BEQ.S   .1
    MOVE.L  D0,A0
    MOVE.L  -20(A4),(A0)
    MOVE.L  D2,4(A0)
    MOVE.L  D0,-20(A4)
    ADDQ.L  #8,D0
    RTS
.1: MOVE.L  #"MEM",-84(A4)      ; COPY OF Raise()
    MOVE.L  -76(A4),D0
    BEQ.S   .2
    MOVE.L  D0,A0
    MOVE.L  -80(A4),A7
    MOVE.L  -88(A4),A5
    MOVE.L  (A7)+,-88(A4)
    MOVE.L  (A7)+,-76(A4)
    MOVE.L  (A7)+,-80(A4)
    JMP (A0)
.2: MOVE.L  -24(A4),A0
    JMP (A0)
    RTS
;*-*

;; Bounds
I_BOUNDS:
    MOVE.L  12(A7),D0       ; D0=VALUE
    MOVE.L  4(A7),D1        ; D1=HIGHERBOUND FIRST
    CMP.L   D1,D0
    BMI.S   .1
    MOVE.L  D1,D0
    BRA.S   .X
.1: MOVE.L  8(A7),D1        ; NOW TRY LOWERBOUND
    CMP.L   D1,D0
    BPL.S   .X
    MOVE.L  D1,D0
.X: RTS
;*-*
;; RealF
I_REALF:
    MOVE.L  12(A7),A2
    CLR.W   -2(A2)
    MOVE.L  8(A7),D2        ; D2=FLOAT
    MOVE.L  -56(A4),A6
    MOVE.L  D2,D0
    JSR -48(A6)
    BPL.S   .3
    MOVE.B  #"-",D0
    BSR.S   .ADDS
    MOVE.L  D2,D0
    JSR -54(A6)         ; ABS
    MOVE.L  D0,D2
.3: MOVE.L  4(A7),D1
    LSL.L   #2,D1
    MOVE.L  .RTAB(PC,D1.L),D1
    MOVE.L  D2,D0
    JSR -66(A6)
    MOVE.L  D0,D2
    MOVEQ   #-1,D1
    BSR.W   .ADD
    CMP.L   #1,4(A7)
    BMI.S   .DONE
    MOVE.L  -56(A4),A6
    MOVE.B  #".",D0
    BSR.S   .ADDS
    MOVE.L  D2,D0
    JSR -90(A6)         ; floor
    MOVE.L  D0,D1
    MOVE.L  D2,D0
    JSR -72(A6)         ; sub
    MOVE.L  4(A7),D1
    SUBQ.L  #1,D1
    LSL.L   #2,D1
    MOVE.L  .TAB(PC,D1.L),D1
    JSR -78(A6)         ; mul
    BSR.S   .ADD
.DONE:  MOVE.L  12(A7),D0
    RTS
.PROC:  MOVE.B  D0,(A3)+
    RTS
.ADDS:  MOVE.W  -2(A2),D1
    CMP.W   -4(A2),D1
    BPL.S   .1
    MOVE.B  D0,0(A2,D1.W)
    CLR.B   1(A2,D1.W)
    ADDQ.W  #1,-2(A2)
.1: RTS
.RTAB:  DC.L    $3f000000,$3d4ccccd,$3ba3d70a   ; okay for 8 digits
    DC.L    $3a03126f,$3851b717,$36a7c5ac
    DC.L    $350637bd,$3356bf95,$31abcc77
.TAB:   DC.L    $41200000,$42c80000,$447a0000   ; same here
    DC.L    $461c4000,$47c35000,$49742400
    DC.L    $4b189680,$4cbebc20 ; ,$4cbebc20
.ADD:   MOVE.L  D1,-(A7)
    JSR -90(A6)         ; FLOOR
    JSR -30(A6)         ; FIX, D0=INT
    MOVE.L  (A7)+,D1
    LEA -32(A7),A7
    MOVE.L  A7,A3
    LEA .PROC(PC),A2
    LEA 16(A3),A0
    MOVE.B  #"%",(A0)+
    TST.L   D1
    BMI.S   .2
    MOVE.L  4+4+32(A7),D1
    ADD.W   #$30,D1
    MOVE.B  #"0",(A0)+
    MOVE.B  D1,(A0)+
    MOVE.B  #".",(A0)+
    MOVE.B  D1,(A0)+
.2: MOVE.B  #"l",(A0)+
    MOVE.B  #"d",(A0)+
    CLR.B   (A0)+
    LEA 16(A3),A0
    LEA 28(A3),A1
    MOVE.L  D0,(A1)
    MOVE.L  4.W,A6
    JSR -522(A6)
    MOVE.L  4+12+32(A7),A2      ; A2=STRING
    MOVE.L  A7,A3
.XL:MOVE.B  (A3)+,D0
    BEQ.S   .O
    BSR.W   .ADDS
    BRA.S   .XL
.O: LEA 32(A7),A7
    RTS
;*-*
;; RealVal
I_REALVAL:
    MOVE.L  D3,A3
    MOVE.L  4(A7),A0        ; A0=STR
.XL:MOVE.B  (A0)+,D0
    CMP.B   #33,D0
    BMI.S   .XL
    MOVEQ   #0,D1
    CMP.B   #"-",D0
    BNE.S   .NNEG
    MOVEQ   #-1,D1
    MOVE.B  (A0)+,D0
.NNEG:  MOVE.W  D1,A6           ; A6=SIGN
    MOVEQ   #0,D2           ; D2=DOTFLAG
    MOVEQ   #1,D1           ; D1=DIVDOT
    MOVEQ   #0,D3           ; D3=RESULT SOFAR
    SUB.L   A1,A1           ; A1=COUNT
.L2:    CMP.B   #"9"+1,D0
    BPL.S   .D
    CMP.B   #".",D0
    BEQ.S   .DOT
    CMP.B   #"0",D0
    BMI.S   .D
    EXT.W   D0
    EXT.L   D0
    SUB.W   #"0",D0
    MOVE.L  D3,A2
    LSL.L   #2,D3
    ADD.L   A2,D3
    LSL.L   #1,D3           ; D3*10
    ADD.L   D0,D3
    TST.L   D2
    BEQ.S   .1
    MOVE.L  D1,A2
    LSL.L   #2,D1
    ADD.L   A2,D1
    LSL.L   #1,D1           ; D1*10
.1: ADDQ.L  #1,A1
.N: MOVE.B  (A0)+,D0
    BRA.S   .L2
.D: MOVE.L  A1,D0
    BEQ.S   .FAIL
    MOVE.L  A0,-(A7)
    MOVE.L  A6,A2
    MOVE.L  D1,D0
    MOVE.L  -56(A4),A6
    JSR -36(A6)
    MOVE.L  D0,D2
    MOVE.L  D3,D0
    JSR -36(A6)
    MOVE.L  D2,D1
    JSR -84(A6)
    MOVE.L  A2,D1
    BEQ.S   .2
    JSR -60(A6)
.2: MOVE.L  A3,D3
    MOVE.L  (A7)+,D1
    SUBQ.L  #1,D1
    SUB.L   4(A7),D1
    RTS
.DOT:   TST.L   D2
    BNE.S   .D
    MOVEQ   #1,D2
    BRA.S   .N
.FAIL:  MOVEQ   #0,D1
    MOVEQ   #0,D0
    RTS
;*-*
;; Fabs
I_FABS:
    MOVE.L  4(A7),D0
    MOVE.L  -56(A4),A6
    JSR -54(A6)
    RTS
;*-*
;; Floor
I_FFLOOR:
    MOVE.L  4(A7),D0
    MOVE.L  -56(A4),A6
    JSR -90(A6)
    RTS
;*-*
;; Fceil
I_FCEIL:
    MOVE.L  4(A7),D0
    MOVE.L  -56(A4),A6
    JSR -96(A6)
    RTS
;*-*
;; Fsin
I_FSIN:
    MOVE.L  4(A7),D0
    MOVE.L  -60(A4),A6
    JSR -36(A6)
    RTS
;*-*
;; Fcos
I_FCOS:
    MOVE.L  4(A7),D0
    MOVE.L  -60(A4),A6
    JSR -42(A6)
    RTS
;*-*
;; Ftan
I_FTAN:
    MOVE.L  4(A7),D0
    MOVE.L  -60(A4),A6
    JSR -48(A6)
    RTS
;*-*
;; Fexp
I_FEXP:
    MOVE.L  4(A7),D0
    MOVE.L  -60(A4),A6
    JSR -78(A6)
    RTS
;*-*
;; Flog
I_FLOG:
    MOVE.L  4(A7),D0
    MOVE.L  -60(A4),A6
    JSR -84(A6)
    RTS
;*-*
;; Fpow
I_FPOW:
    MOVE.L  4(A7),D0
    MOVE.L  8(A7),D1
    MOVE.L  -60(A4),A6
    JSR -90(A6)
    RTS
;*-*
;; Fsqrt
I_FSQRT:
    MOVE.L  4(A7),D0
    MOVE.L  -60(A4),A6
    JSR -96(A6)
    RTS
;*-*
;; Flog10
I_FLOG10:
    MOVE.L  4(A7),D0
    MOVE.L  -60(A4),A6
    JSR -126(A6)
    RTS
;*-*

;; FastDispose
I_FASTDISPOSE:            ; SEE ALSO: FASTDISPOSELIST!!!!!
    MOVE.L  8(A7),D0        ; parms(ptr,size)
    BEQ.S   .oute
    MOVE.L  D0,A0
    MOVE.L  4(A7),D0
    CMP.L   #257,D0
    BPL.S   .free
    ADDQ.L  #3,D0
    AND.W   #%1111111100,D0
    LEA GLOBOFFNEWTAB(A4),A1
    ADD.L   D0,A1
    MOVE.L  (A1),(A0)
    MOVE.L  A0,(A1)
.oute:  RTS
.free:  SUBQ.L  #8,A0
    LEA -20(A4),A1
.loop:  MOVE.L  (A1),D1
    BEQ.S   .out
    MOVE.L  A1,A2           ; ADR TO LINK BACK TO
    MOVE.L  D1,A1
    CMPA.L  D1,A0
    BNE.S   .loop
    MOVE.L  4(A1),D0        ; MEMSIZE
    MOVE.L  (A1),(A2)       ; LINK BACK
    MOVE.L  $4.W,A6
    JSR -210(A6)        ; FREEMEM
.out:   RTS
;*-*
;; FastNew
I_FASTNEW:
    MOVE.L  4(A7),D0        ; 1st arg = size 0..
    CMP.L   #257,D0
    BPL.S   .mem
    ADDQ.L  #3,D0
    AND.W   #%1111111100,D0
    BEQ.S   .outn
    MOVE.L  D0,A3
    LEA GLOBOFFNEWTAB(A4),A0
    ADD.L   A3,A0
    MOVE.L  (A0),D0
    BEQ.S   .chop
    MOVE.L  D0,A1
    MOVE.L  (A1),(A0)
    MOVE.L  A3,D1
    LSR.W   #2,D1
    SUBQ.L  #1,D1
    MOVEQ   #0,D2
.clrl:  MOVE.L  D2,(A1)+
    DBRA    D1,.clrl
.outn:  RTS
.chop:  MOVE.L  CHOPMEM(A4),D0
    BEQ.S   .alloc
    MOVE.L  A3,D1
    SUB.L   D1,CHOPLEFT(A4)
    BMI.S   .alloc
    ADD.L   D1,CHOPMEM(A4)
    RTS
.alloc: MOVE.L  #FMEMSIZE+8,D0
    BSR.S   .al
    MOVE.L  D0,CHOPMEM(A4)
    MOVE.L  #FMEMSIZE,CHOPLEFT(A4)
    BRA.S   .chop
.mem:   ADDQ.L  #8,D0
.al:    MOVE.L  D0,D2           ; COPY OF New()
    MOVE.L  #$10000,D1
    MOVE.L  $4.W,A6
    JSR -198(A6)
    TST.L   D0
    BEQ.S   .raise
    MOVE.L  D0,A0
    MOVE.L  -20(A4),(A0)
    MOVE.L  D2,4(A0)
    MOVE.L  D0,-20(A4)
    ADDQ.L  #8,D0
    RTS
.raise: MOVE.L  #"MEM",-84(A4)      ; COPY OF Raise()
    MOVE.L  -76(A4),D0
    BEQ.S   .clean
    MOVE.L  D0,A0
    MOVE.L  -80(A4),A7
    MOVE.L  -88(A4),A5
    MOVE.L  (A7)+,-88(A4)
    MOVE.L  (A7)+,-76(A4)
    MOVE.L  (A7)+,-80(A4)
    JMP (A0)
.clean: MOVE.L  -24(A4),A0
    JMP (A0)
;*-*

;; Min
I_MIN:
    MOVE.L  4(A7),D0
    MOVE.L  8(A7),D1
    CMP.L   D0,D1
    BMI.S   .1
    RTS
.1: MOVE.L  D1,D0
    RTS
;*-*
;; Max
I_MAX:
    MOVE.L  4(A7),D0
    MOVE.L  8(A7),D1
    CMP.L   D0,D1
    BPL.S   .1
    RTS
.1: MOVE.L  D1,D0
    RTS
;*-*
;; OstrCmp
I_OSTRCMP:
    MOVEQ   #0,D0
    MOVE.W  6(A7),D0
    MOVE.L  8(A7),A1
    MOVE.L  12(A7),A0
    ADDQ.L  #1,D0
.1: SUBQ.L  #1,D0
    BEQ.S   .3
    CMPM.B  (A0)+,(A1)+
    BGT.S   .2
    BMI.S   .4
    CMP.B   #0,-1(A0)
    BNE.S   .1
.3: MOVEQ   #0,D0
    RTS
.2: MOVEQ   #1,D0
    RTS
.4: MOVEQ   #-1,D0
    RTS
;*-*
;; AstrCopy
I_ASTRCOPY:
    MOVEQ   #0,D0
    MOVE.W  6(A7),D0
    BEQ.S   .x2
    MOVE.L  8(A7),A1
    MOVE.L  12(A7),A0
    ADDQ.L  #1,D0
.al:    SUBQ.L  #1,D0
    BEQ.S   .x
    MOVE.B  (A1)+,(A0)+
    BNE.S   .al
    BRA.S   .x2
.x: CLR.B   -(A0)
.x2:    RTS

;*-*

;; Some shitty comments
; Yet Another MileStone:
;
; Conservative Mark-Sweep Garbage-Collected Lisp-Cells in E
;
; speed of nrev500_10 test on 128k space (includes 1 collection):
;
; 4.5 x BinProLog, 15.5 x SBP, 26 x Gofer
;
; TODO:
; + stack checking?
; + chunk changable -> own chunksize var. only change if <>0
; + DBRA limit? -> now DBL. should be able to do >2meg
; + collect delegates? -> no.
; + request non-empty mem.
; + previous freelist is added ok now in new.
; + Cell() function
; - multiple args
; - special syntax + pattern matching
; - Root(x) etc.
; - 25% not ideal with small spaces and growing cell usage.


CELLSMEM    = -108
CELLSFREE   = -112
CHUNKSIZE   = -116
CHUNK       = 128*1024      ; must be multiple of 256, >1024

; mem layout:
;
; OBJECT cellmem
;   next:PTR TO cellmem         ; 0
;   end:PTR TO cellmem+SIZEOF cellmem   ; 4
;   cells[n]:ARRAY OF cell      ; 8
; ENDOBJECT
;   bits[n]:ARRAY OF BIT
;*-*

;; Cell
I_CELL:
    MOVE.L  4(A7),D0
    BEQ.S   .false          ; NIL
    MOVE.L  D0,D1
    AND.W   #%111,D1
    BNE.S   .false          ; not cell-aligned
    MOVE.L  CELLSMEM(A4),A0
.cloop: CMP.L   A0,D0
    BMI.S   .cnext          ; lower than bottom
    CMP.L   4(A0),D0
    BPL.S   .cnext          ; higher than top
    MOVEQ   #-1,D0
    RTS
.cnext: MOVE.L  (A0),A0
    MOVE.L  A0,D1
    BNE.S   .cloop
.false: MOVEQ   #0,D0
    RTS

I_FREECELLS:
    LEA CELLSFREE(A4),A0
    MOVEQ   #0,D0
.ccl:   MOVE.L  (A0),D1
    BEQ.S   .cco
    ADDQ.L  #1,D0
    MOVE.L  D1,A0
    BRA.S   .ccl
.cco:   RTS
;*-*
;; SetChunkSize
I_SETCHUNKSIZE:
    TST.L   CHUNKSIZE(A4)
    BNE.S   .chd
    MOVE.L  4(A7),D0
    MOVEQ   #10,D1
    LSL.L   D1,D0
    MOVE.L  D0,CHUNKSIZE(A4)
.chd:   RTS
;*-*
;; Car                      I
I_CAR:
    MOVE.L  4(A7),A0
    MOVE.L  (A0),D0
    RTS
;*-*
;; Cdr                      I
I_CDR:
    MOVE.L  4(A7),A0
    MOVE.L  4(A0),D0
    RTS
;*-*
;; FreeChunks
I_CONS:
    MOVE.L  CELLSFREE(A4),D0    ; Yep, this is IT!
    BEQ.S   .gc
    MOVE.L  D0,A0
    MOVE.L  (A0),A2
    MOVE.L  12(A7),(A0)
    MOVE.L  8(A7),4(A0)
    MOVE.W  6(A7),D1
    BEQ.S   .1
    LSR.W   #2,D1
    SUBQ.W  #1,D1
    LEA 16(A7),A1
.2: MOVE.L  A2,D2
    BEQ.S   .gc
    EXG D0,D2
    MOVE.L  (A2),A3
    MOVE.L  D2,4(A2)
    MOVE.L  (A1)+,(A2)
    MOVE.L  A3,A2
    DBRA    D1,.2
.1: MOVE.L  A2,CELLSFREE(A4)
    RTS

.gc:    CLR.L   CELLSFREE(A4)
    MOVE.L  CELLSMEM(A4),D0
    BEQ .new
    MOVEM.L D3-D7,-(A7)     ; roots too
    MOVE.L  D0,D7           ; D7=space
    MOVE.L  A7,A0           ; A0=roots
.grab:  CMPA.L  A0,A4           ; grab roots until A4
    BLE .sweep
    MOVE.L  (A0)+,D0
    PEA .grab(PC)
.trace: BEQ.S   .ex         ; NIL
    MOVE.L  D0,D1
    AND.W   #%111,D1
    BNE.S   .ex         ; not cell-aligned
    MOVE.L  D7,A2
.tloop: CMP.L   A2,D0
    BMI.S   .tnext          ; lower than bottom
    CMP.L   4(A2),D0
    BPL.S   .tnext          ; higher than top
    MOVE.L  D0,A1
    SUB.L   A2,D0
    LSR.L   #3,D0
    MOVE.L  D0,D1
    LSR.L   #3,D0
    MOVE.L  4(A2),A3        ; mark the sucker
    BSET    D1,0(A3,D0.L)       ; already marked? great!
    BNE.S   .ex
    MOVE.L  4(A1),-(A7)     ; save cdr for later
    MOVE.L  A7,D0
    SUBQ.L  #8,D0
    CMP.L   -64(A4),D0
    BMI .raises
    MOVE.L  (A1),D0         ; go do car now
    BSR.S   .trace          ; OOPS! stack!!!
    MOVE.L  (A7)+,D0
    BRA.S   .trace
.tnext: MOVE.L  (A2),A2
    MOVE.L  A2,D1
    BNE.S   .tloop
.ex:    RTS

.sweep: MOVEQ   #0,D0           ; D0=num cells collected
    MOVE.L  CELLSFREE(A4),A6    ; A6=freelist
.sl:    MOVE.L  D7,A0           ; A0=space
    MOVE.L  4(A0),A1        ; A1=endspace
    MOVE.L  (A0),D5         ; D5=next
    MOVEQ   #0,D1           ; D1=current bit
.sloop: ADDQ.L  #8,A0
    ADDQ.L  #1,D1
    CMPA.L  A0,A1
    BEQ.S   .snext
    MOVE.L  D1,D2
    LSR.L   #3,D2
    BCLR    D1,0(A1,D2.L)
    BNE.S   .sloop
    ADDQ.L  #1,D0
    MOVE.L  A6,(A0)         ; sweep the sucker!
    MOVE.L  A0,A6
    BRA.S   .sloop
.snext: MOVE.L  D5,D7
    BNE.S   .sl
    MOVE.L  A6,CELLSFREE(A4)
    MOVEM.L (A7)+,D3-D7
    MOVE.L  CHUNKSIZE(A4),D1
    LSR.L   #5,D1           ; /4 = 25% must be empty
    CMP.L   D1,D0
    BMI.S   .new
    BRA I_CONS

.new:   MOVE.L  CHUNKSIZE(A4),D0
    BNE.S   .cs
    MOVE.L  #CHUNK,D0
    MOVE.L  D0,CHUNKSIZE(A4)
.cs:    MOVE.L  D0,D1
    LSR.L   #6,D1           ; markspace
    ADD.L   D1,D0
    BSR .alloc
    MOVE.L  D0,A0
    MOVE.L  CELLSMEM(A4),(A0)   ; previous cellspace
    ADD.L   CHUNKSIZE(A4),D0
    MOVE.L  D0,4(A0)        ; end_of_cells
    MOVE.L  D0,A2           ; markspace
    MOVE.L  A0,CELLSMEM(A4)
    MOVE.L  CHUNKSIZE(A4),D0    ; now chop free cells
    LSR.L   #5,D0
    SUBQ.L  #2,D0           ; numcells
    MOVE.L  CELLSFREE(A4),A1
    ADDQ.L  #8,A0
    MOVE.L  A1,(A0)
.chop:  LEA 8(A0),A1        ; freelist in new cell
    MOVE.L  A0,(A1)         ; loop unrolled!!!
    LEA 8(A1),A0        ; 20 cycles per cell!!!
    MOVE.L  A1,(A0)         ; 4 cells in one loop
    LEA 8(A0),A1
    MOVE.L  A0,(A1)
    LEA 8(A1),A0
    MOVE.L  A1,(A0)
    DBRA    D0,.chop
    SUB.L   #$10000,D0
    BCC.S   .chop
    MOVE.L  A0,CELLSFREE(A4)
    MOVE.L  CHUNKSIZE(A4),D0    ; now clear mark space
    LSR.L   #8,D0
    SUBQ.L  #1,D0
    MOVEQ   #0,D1
.clmark:MOVE.L  D1,(A2)+
    DBRA    D0,.clmark
    SUB.L   #$10000,D0
    BCC.S   .clmark
    BRA I_CONS          ; try again!

.alloc: ADDQ.L  #8,D0
    MOVE.L  D0,D2           ; COPY OF New()
    MOVEQ   #0,D1           ; MOVE.L    #$10000,D1
    MOVE.L  $4.W,A6
    JSR -198(A6)
    TST.L   D0
    BEQ.S   .raise
    MOVE.L  D0,A0
    MOVE.L  -20(A4),(A0)
    MOVE.L  D2,4(A0)
    MOVE.L  D0,-20(A4)
    ADDQ.L  #8,D0
    RTS

.raises:MOVE.L  #"STCK",-84(A4)
    BRA.S   .rraise
.raise: MOVE.L  #"MEM",-84(A4)      ; COPY OF Raise()
.rraise:MOVE.L  -76(A4),D0
    BEQ.S   .clean
    MOVE.L  D0,A0
    MOVE.L  -80(A4),A7
    MOVE.L  -88(A4),A5
    MOVE.L  (A7)+,-88(A4)
    MOVE.L  (A7)+,-76(A4)
    MOVE.L  (A7)+,-80(A4)
    JMP (A0)
.clean: MOVE.L  -24(A4),A0
    JMP (A0)
;*-*
;; FastDisposeList
I_FASTDISPOSELIST:        ; ALMOST SAME AS FASTDIPOSE!!!!!
    MOVE.L  4(A7),D0        ; parms(ptr)
    BEQ.S   .oute
    MOVE.L  D0,A0
    MOVE.L  -(A0),D0
    EXT.L   D0
    LSL.L   #2,D0
    ADDQ.L  #4,D0
    CMP.L   #257,D0
    BPL.S   .free
    ADDQ.L  #3,D0
    AND.W   #%1111111100,D0
    LEA GLOBOFFNEWTAB(A4),A1
    ADD.L   D0,A1
    MOVE.L  (A1),(A0)
    MOVE.L  A0,(A1)
.oute:  RTS
.free:  SUBQ.L  #8,A0
    LEA -20(A4),A1
.loop:  MOVE.L  (A1),D1
    BEQ.S   .out
    MOVE.L  A1,A2           ; ADR TO LINK BACK TO
    MOVE.L  D1,A1
    CMPA.L  D1,A0
    BNE.S   .loop
    MOVE.L  4(A1),D0        ; MEMSIZE
    MOVE.L  (A1),(A2)       ; LINK BACK
    MOVE.L  $4.W,A6
    JSR -210(A6)        ; FREEMEM
.out:   RTS
;*-*

;; Fatan
I_FATAN:
    MOVE.L  4(A7),D0
    MOVE.L  -60(A4),A6
    JSR -30(A6)
    RTS
;*-*
;; FsinCos
I_FSINCOS:
    MOVE.L  8(A7),A0
    MOVE.L  4(A7),D0
    MOVE.L  -60(A4),A6
    JSR -54(A6)
    RTS
;*-*
;; FsinH
I_FSINH:
    MOVE.L  4(A7),D0
    MOVE.L  -60(A4),A6
    JSR 60(A6)
    RTS
;*-*
;; FcosH
I_FCOSH:
    MOVE.L  4(A7),D0
    MOVE.L  -60(A4),A6
    JSR -66(A6)
    RTS
;*-*
;; FtanH
I_FTANH:
    MOVE.L  4(A7),D0
    MOVE.L  -60(A4),A6
    JSR -72(A6)
    RTS
;*-*
;; Ftieee
I_FTIEEE:
    MOVE.L  4(A7),D0
    MOVE.L  -60(A4),A6
    JSR -102(A6)
    RTS
;*-*
;; Fieee
I_FFIEEE:
    MOVE.L  4(A7),D0
    MOVE.L  -60(A4),A6
    JSR -108(A6)
    RTS
;*-*
;; Fasin
I_FASIN:
    MOVE.L  4(A7),D0
    MOVE.L  -60(A4),A6
    JSR -114(A6)
    RTS
;*-*
;; Facos
I_FACOS:
    MOVE.L  4(A7),D0
    MOVE.L  -60(A4),A6
    JSR -120(A6)
    RTS
;*-*

;; DoMethod
I_DOMETHOD:
    MOVE.L  4(A7),D0
    MOVE.L  8(A7,D0.L),A2   ; object
    LEA     8(A7),A1
    MOVE.L  -4(A2),A0
    move.l  8(a0),a3
    JMP     (A3)
;*-*
;; DoMethodA
I_DOMETHODA:
    MOVE.L  8(A7),A2        ; object
    MOVE.L  -4(A2),A0       ; class
    MOVE.L  4(A7),A1        ; message
    move.l  8(a0),a3
    MOVEM.L D3-D7/A4-a6,-(A7)
    JSR     (A3)
    MOVEM.L (A7)+,D3-D7/A4-a6
    RTS
;*-*
;; CoerceMethod
I_CRCMETHOD:
    MOVE.L  4(A7),D0
    MOVE.L  8(A7,D0),A2     ; object
    MOVE.L  12(A7,D0),A0    ; class
    LEA     8(A7),A1        ; message
    move.l  8(a0),a3
    MOVEM.L D3-D7/A4-a6,-(A7)
    JSR     (A3)
    MOVEM.L (A7)+,D3-D7/A4-a6
    RTS
;*-*
;; CoerceMethodA
I_CRCMETHODA:
    MOVE.L  8(A7),A2    ; object
    MOVE.L  12(A7),A0   ; class
    MOVE.L  4(A7),A1    ; message
    move.l  8(a0),a3
    MOVEM.L D3-D7/A4-a6,-(A7)
    JSR     (A3)
    MOVEM.L (A7)+,D3-D7/A4-a6
    RTS
;*-*
;; DoSuperMethod
I_DOSMETHOD:
    MOVE.L  4(A7),D0
    LEA     8(A7),A1
    MOVE.L  8(A7,D0),A2
    MOVE.L  12(A7,D0),A0
    MOVE.L  24(A0),A0
    MOVE.L  8(A0),A3
    JMP     (A3)
;*-*
;; DoSuperMethodA
I_DOSMETHODA:
    MOVE.L  4(A7),A1    ; message
    MOVE.L  8(A7),A2    ; object
    MOVE.L  12(A7),A0   ; class
    move.l  24(a0),a0
    MOVE.L  8(a0),a3
    JMP     (A3)
;*-*
;; Set
I_SET:
    MOVE.L  -48(A4),A6
    MOVE.L  4(A7),D0
    MOVE.L  8(A7,D0),A0
    LEA     8(A7),A1
    JMP     -648(A6)
;*-*
;; Sets
I_SETS:
    MOVE.L  -48(A4),A6
    LEA     .T(PC),A1
    MOVE.L  4(A7),4(A1)
    MOVE.L  8(A7),(A1)
    MOVE.L  12(A7),A0
    JMP     -648(A6)
.T: DC.L    0,0,0
;*-*
;; Get
I_GET:
    MOVE.L  -48(A4),A6
    MOVE.L  4(A7),A1
    MOVE.L  8(A7),D0
    LEA     12(A7),A0
    JMP     -654(A6)
;*-*
;; Gets
I_GETS:
    MOVE.L  -48(A4),A6
    LEA     .T(PC),A1
    MOVE.L  4(A7),D0
    MOVE.L  8(A7),A0
    JSR     -654(A6)
    MOVE.L  .T(PC),D0
    RTS
.T: DC.L    0
;*-*
;; CtrlD
I_CTRLD:
    MOVEQ   #0,D0
    MOVEQ   #0,D1
    MOVE.L  4.W,A6
    JSR -306(A6)
    BTST    #13,D0
    BEQ.S   .1
    MOVEQ   #0,D0
    MOVE.L  #8192,D1
    JSR -306(A6)
    MOVEQ   #-1,D0
    RTS
.1: MOVEQ   #0,D0
    RTS
;*-*
;; CtrlE
I_CTRLE:
    MOVEQ   #0,D0
    MOVEQ   #0,D1
    MOVE.L  4.W,A6
    JSR -306(A6)
    BTST    #14,D0
    BEQ.S   .1
    MOVEQ   #0,D0
    MOVE.L  #16384,D1
    JSR -306(A6)
    MOVEQ   #-1,D0
    RTS
.1: MOVEQ   #0,D0
    RTS
;*-*
;; CtrlF
I_CTRLF:
    MOVEQ   #0,D0
    MOVEQ   #0,D1
    MOVE.L  4.W,A6
    JSR -306(A6)
    BTST    #15,D0
    BEQ.S   .1
    MOVEQ   #0,D0
    MOVE.L  #32768,D1
    JSR -306(A6)
    MOVEQ   #-1,D0
    RTS
.1: MOVEQ   #0,D0
    RTS
;*-*
;; Chk
I_CHK:
    MOVEQ   #0,D0
    TST.L   4(A7)
    BEQ.S   .1
    MOVEQ   #-1,D0
.1: RTS
;*-*
;; Eof
I_EOF:
    move.l  4(a7),d1
    movem.l d3-d7,-(a7)
    move.l  -44(a4),a6
    move.l  d1,d7
    moveq   #0,d2
    moveq   #1,d3
    jsr     -66(a6)         ; seek to end
    move.l  d0,d6
    move.l  d0,d2
    moveq   #-1,d3
    move.l  d7,d1
    jsr     -66(a6)         ; and back again
    cmp.l   d0,d6
    seq     d0
    ext.w   d0
    ext.l   d0
    movem.l (a7)+,d3-d7
    rts
;*-*
;; Fopen
I_FOPEN:
    MOVE.L  4(A7),D2
    MOVE.L  8(A7),D1
    MOVE.L  -44(A4),A6
    JSR     -30(A6)
    MOVEM.L D3-D7,-(A7)
    MOVE.L  d0,-(a7)

    MOVE.L  -128(A4),D6         ; first is already set
.LOOP:
    MOVE.L  D6,A1
    MOVe.L  (A1)+,D6
    MOVE.L  #255,D7
.LOOP2:
    TST.L   (A1)
    BEQ     .HERE
    ADDQ.L  #4,A1
    DBF     D7,.LOOP2
    TST.L   D6
    BNE     .LOOP
    MOVE.L  #256*4+4,D0
    MOVE.L  #$10001,D1
    MOVE.L  $4.W,A6
    JSR     -198(A6)
    MOVE.L  D0,A1
    MOVE.L  -128(A4),(A1)
    MOVE.L  A1,-128(A4)
    ADDq.L  #4,A1
.HERE:
    MOVE.L  (A7),(A1)+
    MOVE.L  (A7)+,D0
    MOVEM.L (A7)+,D3-D7
    RTS
;*-*
;; Fclose
I_FCLOSE:
    MOVE.L  4(A7),D1
    MOVE.L  -44(A4),A6
    MOVEM.L D3-D7,-(A7)

    MOVE.L  -128(A4),D6         ; first is already set
.LOOP:
    MOVE.L  D6,A1
    MOVe.L  (A1)+,D6
    MOVE.L  #255,D7
.LOOP2:
    CMP.L   (A1)+,D1
    BEQ     .HERE
    DBF     D7,.LOOP2
    TST.L   D6
    BNE     .LOOP
    RTS                         ; not opened with Fopen()
.HERE:
    CLR.L   -4(A1)
    JSR     -36(A6)
    MOVEM.L (A7)+,D3-D7
    RTS
;*-*
;; Alloc
I_ALLOC:
    MOVE.L  -120(A4),A0
    MOVe.L  4(A7),D0
    ADDQ.L  #4,D0
    MOVE.L  D0,D2
    MOVE.L  $4.W,A6
    JSR     -708(A6)
    MOVE.L  D0,A0
    MOVE.L  D2,(A0)+
    MOVE.L  A0,D0
    RTS
;*-*
;; Free
I_FREE:
    MOVE.L  4(A7),A1
    MOVE.L  -(A1),D0
    MOVE.L  -120(A4),A0
    MOVE.L  $4.W,A6
    JSR     -714(A6)
    RTS
;*-*
;; PutF
I_PUTF:
.3: LEA 8(A7),A1
    MOVE.L  4(A7),D0
    MOVE.L  8(A7,D0.L),A0
    LEA     .1(PC),A2
    MOVE.L  4.W,A6
    MOVE.L  -64(A4),A3
    MOVE.L  A3,D2
    JSR     -522(A6)
    MOVE.L  D2,A0
.5: TST.B   (A0)+
    BNE .5
    SUB.L   D2,A0
    MOVE.L  D3,A3           ; BACKUP
    MOVE.L  A0,D3
    SUBQ.L  #1,D3
    MOVE.L  -44(A4),A6
    MOVE.L  4(A7),D0
    MOVE.L  12(A7,D0),D1
    JSR     -48(A6)
    MOVE.L  D3,D0
    MOVE.L  A3,D3
    RTS
.1: MOVE.B  D0,(A3)+        ; RDF DUMP
    RTS
;*-*
;; ReadB
I_READB:
    MOVE.L  D3,A3
    MOVE.L  16(A7),D1
    MOVE.L  12(A7),D0
    MOVEQ   #0,D2
    MOVE.L  8(A7),D3
    SUBQ.L  #1,D3

.LP:ADD.L   D0,D2
    DBF     D3,.LP

    MOVE.L  -44(A4),A6
    MOVE.L  4(A7),D3
    EXG     D2,D3
    JSR     -42(A6)

    MOVEQ   #-1,D1
    MOVE.L  12(A7),D2
.LD:ADDQ.L  #1,D1
    SUB.L   D2,D0
    BPL     .LD
    MOVE.L  D1,D0
    MOVE.L  A3,D3
    RTS
;*-*
;; WriteB
I_WRITEB:
    MOVE.L  D3,A3
    MOVE.L  16(A7),D1
    MOVE.L  12(A7),D0
    MOVEQ   #0,D2
    MOVE.L  08(A7),D3
    SUBQ.L  #1,D3

.LP:ADD.L   D0,D2
    DBF     D3,.LP

    MOVE.L  -44(A4),A6
    MOVE.L  04(A7),D3
    EXG     D2,D3
    JSR     -48(A6)

    MOVEQ   #-1,D1
    MOVE.L  12(A7),D2
.LD:ADDQ.L  #1,D1
    SUB.L   D2,D0
    BPL     .LD
    MOVE.L  D1,D0
    MOVE.L  A3,D3
    RTS
;*-*
;; Size
I_SIZE:
    MOVE.L  4(A7),D1
    MOVE.L  D3,A3
    MOVEQ   #0,D2
    MOVEQ   #1,D3
    MOVE.L  -44(a4),A6
    JSR     -66(a6)

    move.l  4(a7),d1
    move.l  d0,d2
    moveQ   #-1,d3
    jsr     -66(a6)
    move.l  a3,d3
    rts
;*-*

I_CODEEND:
    NOP

;xxx:
;   lea .1(pc),a0
;   HASH    a0,d0,d1
;   rts
;.1:    dc.b    "left",0,0
;*-*
;; Patch codes
;; PrintF (37+)
I_PRINTF37:
    MOVE.L  -8(A4),D1
    MOVE.L  4(A7),D0
    MOVE.L  8(A7,D0),D2
    MOVE.L  A7,D3
    ADDQ.L  #8,D3
    MOVE.L  -44(a4),A6
    JSR     -354(A6)
    MOVE.L  -8(A4),D1
    JSR     -360(A6)
    RTS
I_PRINTF37_E:
;*-*
;; PutF (37+)
I_PUTF37:
    MOVE.L  4(A7),D0
    MOVE.L  8(A7,D0),D2
    MOVE.L  12(A7,D0),D1
    MOVE.L  A7,D3
    ADDQ.L  #8,D3
    MOVE.L  -44(a4),A6
    JSR     -354(A6)
    MOVE.L  -8(A4),D1
    JSR     -360(A6)
    RTS
I_PUTF37_E:
;*-*
;; Long (020+)
I_LONG020:
    MOVE.L  ([4.W,A7]),D0
    RTS
;*-*
;; Int (020+)
I_INT020:
    MOVEQ   #0,D0
    MOVE.W  ([4.W,A7]),D0
    RTS
;*-*
;; Char (020+)
I_CHAR020:
    MOVEQ   #0,D0
    MOVE.B  ([4.W,A7]),D0
    RTS
;*-*
I_PATCHEND:
;*-*

;; BBS section

; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ;
;   UnInitialized DataSection for E Compiler        ;
; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ;

        SECTION EDATA,BSS
FIB:        DS.B    300
        EVEN
NAMEBUF:    DS.B    300
        EVEN
SRCDIRBUF:  DS.B    300
        EVEN
DIRNAME:    DS.B    300
        EVEN
PRINTBUF:   DS.B    300
        EVEN
STCNAME:    DS.B    256
        EVEN
WORKBUF:    DS.B    MAXIDENT+2
        EVEN
ESTACKBUF:  DS.B    MAXSTACK+2
        EVEN
EFUNCBYTE:  DS.B    NREFUNC+10
        EVEN
EFUNCRAISE: DS.B    (NREFUNC+10)*10
        EVEN
LIBRAISE:   DS.B    MAXLIBRAISE*10
        EVEN
BRACKETSBUF:    DS.B    MAXBRACK*4
        EVEN
HASHBUFS:               ; CONTIGUOUS BLOCKS
KEYHASH:    DS.B    1024
ASMHASH:    DS.B    1024
AKWHASH:    DS.B    1024
CONSTHASH:  DS.B    1024
IDENTHASH:  DS.B    1024
MACROHASH:  DS.B    1024
LIBHASH:    DS.B    1024
ENDHASHBUFS:
;*-*
END

