; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ; ; Amiga E Compiler/Assembler/Linker by $#%! in 1991/92/93/94/95 ; ; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ; S: MOVE.L A7,INITSTACK BSR INITALL BSR INITBUFFERS BSR SETVARS BSR MAKEKEYHASH BSR MAKEASMHASH JSR SETUPLIBS JSR INITFUNCS JSR ADDGLOBVARS BSR GETCACHE BSR CHECKCOOKIES BSR TOKENIZE BSR CHECKCOOKIES BSR SECONDARYLOAD BSR CHECKIDENTS BSR SWAPVALUES JSR MAKEINITCODE BSR CHECKCOOKIES BSR PASS1 BSR CHECKCOOKIES JSR LINKDELEGATECONSTRUCTORS JSR MAKEEXITCODE JSR MATHEXITETC JSR LINKFUNCS JSR CALCADR BSR WRITEEXE JSR WRITELIBMOD BSR CHECKCOOKIES BSR NOERROR BSR WRITEBUFFERS BSR CLEANUPALL BSR 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 DEMOVERS = 0 ; set to 1 for demo restrictions DEMOSIZE = 8765 UNDEF = 0 ; ident types LOCV = 1 GLOBV = 2 LAB = 3 EOI = 0 ; interimcodes VALUE = 1 LIBC = 2 COM = 3 ASSGN = 4 IDENT = 5 STR = 6 ONEXT = -4 ; M O OBJECT STRUCTURE OFFSETS OOFF = 0 ; M ODEL = 0 ; O OFLAGS = 2 ; M O OSIZE = 4 ; M O OID = 6 ; M O OASCII = 8 ; M O OPTRTYPE= 12 ; M OMEMB = 12 ; O OMETHOD = 16 ; O OSUPER = 20 ; O ODCODE = 24 ; O OACC = 28 ; O ODELOFF = 32 ; O ODESTR = 34 ; O M_NEXT = 0 ; METHOD M_PROC = 4 M_TYPE = 8 M_FLAGS = 9 M_OFF = 10 M_NAME = 12 MT_METHOD = 0 ; METHODFLAGS MT_FROZEN = 1 MT_SHARED = 2 MT_EMPTY = 3 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... PC_NEXT = 0 ; PROC_OR_CLASS PC_TYPE = 4 PC_INFO = 6 PC_ACC = 10 CNEXT = 0 ; CONST STRUCTURE OFFSETS CASCII = 4 CVAL = 8 CFLAGS = 12 CURVERSION = 10 ; IMPORTANT, MODULE VERSION!! 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 CHOPMEM = -100 CHOPLEFT = -104 FMEMSIZE = 5000 GLOBOFF = -512 GLOBOFFNEWTAB = GLOBOFF+16 ; 16..256+16 NEWTABMAX = 256 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: MACRO BTST #4,CODEPREFS+2 ENDM ; RANGE CHECK MACROS 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) AND.L #$FFFFFF00,\2 TST.L \2 BNE \3 ENDM CHKW: MACRO ; \1=REG, \2=TRREG, \3=ERLAB MOVE.L \1,\2 BTST #31,\2 BEQ.S *+4 NEG.L \2 AND.L #$FFFF0000,\2 TST.L \2 BNE \3 ENDM ; HASHING MACROS HASHC: MACRO ; \1=HASHREG, \2=CHAR LSL.W #4,\1 ADD.B \2,\1 ENDM HASHE: MACRO ; \1=HASHREG DIVU #211,\1 SWAP \1 EXT.L \1 ENDM 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 ; GEN GLOB INFO: 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(PC),(\1)+ DONEM \1 MOVEM.L (A7)+,\1/A3 .GVNGI: ENDM OPLONG: MACRO MOVE.W #4,OPERSIZE ENDM OPINT: MACRO MOVE.W #2,OPERSIZE ENDM OPCHAR: MACRO MOVE.W #1,OPERSIZE ENDM ; OFF_1:IMM, IDENT_2:Ax, OFFSET_3:EA.W, THRASH_4:Dx ; NOT A3-A5!! GENVAR: MACRO MOVE.B 4(\2),\4 BEQ ERROR22 ; TEST FOR UNIDENT 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 IF \1=0 ANDI.W #%1111111111000000,-2(A4) ELSE AND.W #%1111000000111111,-2(A4) LSL.W #8,\4 LSL.W #1,\4 ENDIF 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: MACRO ; \1=BITNUM, \2=REG BTST #\1,\2 BEQ.S .SR\1 BSET #15-\1,\2 .SR\1: ENDM 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: 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: MACRO ; \1=SMASK.EA TST.W \1 BEQ.S .NORR MOVE.W MOVEMR,(A4)+ MOVE.W \1,(A4)+ .NORR: ENDM 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 ADD.B #32,\2 .LOWN: MOVE.B \2,(\1)+ BRA.S .LOWL .LOWO: ; ax points at 0-byte at end string ENDM ; FAST MEMORY ALLOCATION MACROS GETM: MACRO ; \1=Ax (START USING MEM) MOVE.L HEAP(PC),\1 ENDM DONEM: MACRO ; \1=Ax (DONE WITH MEM (LIGHT VERSION)) MOVE.L \1,HEAP SUBQ.W #1,CHECKHEAP BNE.S *+16 JSR EXPAND5 MOVE.W #5,CHECKHEAP ; MAX 200 BYTES EACH = IDENT OR STRUCT ENDM ; doesn't trash \1 !!!! DONEH: MACRO ; \1=Ax (HEAVY VERSION) MOVE.L \1,HEAP JSR EXPAND5 ENDM ; CREATE GLOBINFO STRUCTURE FOR IDENT 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: 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: MACRO ; \1=ERRNUM MOVE.W #\1,GURUNUM JMP DAMAGEDCOOKIES ENDM ;;PREP ; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ; ; The (Macro) PreProcessor ; ; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ; ; - recursive macros ; - check end_of_source at each "\n" skipped. MAC_NEXT = 0 MAC_NAME = 4 MAC_BODY = 8 MAC_NARGS = 12 MAC_FLAGS = 14 ; .B 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 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 BEQ.S PREPDEF CMP.B #"i",D6 BEQ.W PREPIF CMP.B #"e",D6 BEQ.W PREPENDIF BRA ERROR63 ; format: ; 32-255: normal chars ; "\t" and "\\\n" translated to " " ; "\n" is end of macro (0) ; chars 1-31 are args. ; ";" not allowed 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 ERROR64 .L: HASHC D1,D0 MOVE.B D0,(A5)+ MOVE.B (A0)+,D0 PREPIDR A6,D0 BPL.S .L 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 ERROR66 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(PC),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 ERROR64 .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 ERROR64 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 ERROR64 CMP.W #32,D0 BMI ERROR64 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 ERROR64 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(PC),A0 BPL ERROR64 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 PREPIF: ; #ifdef, #ifndef CMP.B #"f",(A0)+ BNE ERROR63 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(PC),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 ERROR67 .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 ERROR67 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 ERROR65 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(PC),A0 BPL ERROR65 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 PREPMAXSTACK = 10 PREPIFSTACK: DS.B PREPMAXSTACK PREPSTACKSIZE: DC.W 0 PREPENDIF: ; #endif LEA .1(PC),A6 BSR PREPKCMP MOVE.W PREPSTACKSIZE(PC),D0 SUBQ.W #1,D0 BMI ERROR65 MOVE.W D0,PREPSTACKSIZE ;LEA PREPIFSTACK(PC),A4 ;TST.B 0(A4,D0.W) ;BEQ ERROR65 BRA.S PREPDONE .1: DC.B "ndif",0,0 PREPDONE: MOVE.L STARTINTERIM(PC),A6 SUBQ.L #2,A6 CMPA.L A6,A1 BNE.S .1 MOVE.L WORK(PC),A2 BRA PARSELOOP .1: INTERN 105 PREPKCMP: CMPM.B (A6)+,(A0)+ BEQ.S PREPKCMP TST.B -(A6) BNE ERROR63 MOVE.B -(A0),D6 CMP.B #" ",D6 BEQ.S .1 CMP.B #10,D6 BEQ.S .1 CMP.B #9,D6 BNE ERROR63 .1: RTS 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: ; A6=LISTADR,A4=STR, OUT=D0/A6 MOVEM.L A0/A1,-(A7) .L: 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 .L TST.B -1(A0) BNE.S .CL .1: MOVEM.L (A7)+,A0/A1 RTS PREPEXPAND: MOVE.L WORK(PC),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 ERROR38 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 ERROR68 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 PREPESTACKSIZE = 20*8 PREPEBUFSIZE = 10*KB PREPETOTAL = PREPESTACKSIZE+PREPEBUFSIZE ; EACH STACKFRAME: LASTA0,LASTEBUF PREPESTACK: DC.L 0 PREPESTACKUSE: DC.W 0 PREPETEMP: DC.L 0 PREPEBUFEND: DC.L 0 PREPEBUFUSE: DC.L 0 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: 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 .L: CMP.B #10,-1(A0) BEQ.S .L2 CMP.B #";",-1(A0) BEQ.S .L2 TST.B -1(A0) BPL.S .KLUD .B: SUBQ.L #1,A0 BRA.S .L .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 .B ;ADDQ.L #1,A0 ; why? BRA.S .L2 PREPMACROMSG: DC.B 'MACRO: ',0 ; 7 PREPMACROBODYERR: DC.L 0 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 ; IN: A0=ASCII, A6=MACOBJ, D7.W=NARGS ; FILLS PREPBUFUSE++ TO MAX PREFBUFEND ; RET NEW ASCII IN D6 ; PROBLEMS: 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 ERROR37 MOVE.L A5,D6 ; D6=BEGIN CMP.B #"(",(A0)+ BNE ERROR0 MOVEQ #0,D5 ; D5=BRACKET RECURSION .BL: MOVE.L A0,(A4)+ ; SHOVE ADR FOR ARG .L: 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 ERROR3 ; ERROR = \N \0 /* -> CMP.B #";",D0 BEQ ERROR3 TST.B D0 BEQ ERROR3 CMP.B #"/",D0 BEQ.S .CM1 CMP.B #"-",D0 BEQ.S .CM2 BRA.S .L .COM: TST.L D5 BNE.S .L SUBQ.W #1,D7 BEQ ERROR0 .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 ERROR0 BRA.S .L .DOL: SUBQ.L #1,D5 BPL.S .L SUBQ.W #1,D7 BNE ERROR20 BRA.S .XBL .CM1: CMP.B #"*",(A0) BEQ ERROR0 BRA.W .L .CM2: CMP.B #">",(A0) BEQ ERROR0 BRA.W .L .STR: MOVE.B (A0)+,D1 CMP.B #10,D1 BEQ ERROR3 CMP.B D0,D1 BNE.S .STR CMP.B (A0),D0 BNE.W .L 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 ERROR37 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 ERROR37 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: 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 .L: CMP.L A4,D4 BEQ.S .X MOVE.L (A4)+,D0 BEQ.S .L 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 .L .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 ; A0=MOD,D1=MMODE(SKIP IF 2) PREPREADMACROS: .L: 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 .L 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 .L .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(PC),D0 LSR.L #1,D0 ; *1.5+50k ADD.L EBUFSIZE(PC),D0 ADD.L BUFADD(PC),D0 MOVE.L D0,CURACODE+20 BSR REALLOC1 BSR ALLOC3 BSR ALLOC5 BSR REALLOC6 MOVE.L HEAP+20(PC),GENERALSIZE RTS REALLOC1: MOVEM.L D6/A5,-(A7) LEA CURINTERIM(PC),A5 BSR REALLOC MOVEM.L (A7)+,D6/A5 RTS ALLOC3: MOVEM.L D6/A5,-(A7) LEA CURACODE(PC),A5 BSR REALLOC MOVEM.L (A7)+,D6/A5 RTS CHECK3: MOVEM.L D6/A5,-(A7) LEA CURACODE(PC),A5 BSR CHECK MOVEM.L (A7)+,D6/A5 RTS ALLOC5: MOVEM.L D6/A5,-(A7) LEA HEAP(PC),A5 BSR REALLOC MOVEM.L (A7)+,D6/A5 RTS EXPAND5: MOVEM.L D6/A5,-(A7) LEA HEAP(PC),A5 BSR EXPANDBUF MOVEM.L (A7)+,D6/A5 RTS REALLOC6: MOVEM.L D6/A5,-(A7) LEA LABM(PC),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 .L: 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 .L 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 ERROR38 CHECK: MOVE.L 8(A5),D6 ADD.L 12(A5),D6 SUB.L 16(A5),D6 CMP.L (A5),D6 BMI ERROR37 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 ERROR38 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 .L: 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 .L .X: CLR.L MEMLIST RTS CHECKCOOKIES: MOVE.L 4.W,A6 MOVE.L MEMLIST(PC),A2 .L: 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 .L .X: TST.W BUFSPOT BNE DAMAGEDCOOKIES RTS SWAPVALUES: JSR FIXOBJTYPES MOVE.L ACODE(PC),CURACODE BSR GETLINEBUF IF DEMOVERS=1 JSR DOCHECKSUM ENDIF 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 ERROR38 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 .L: MOVE.B (A1)+,(A0)+ BNE.S .L 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(PC),D0 ADDQ.L #1,D0 MOVE.L D0,(A0)+ MOVE.L A4,D0 SUB.L ACODE(PC),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(PC),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(PC),A0 CMP.L ENDECODE(PC),A0 BPL.S .1 BSR PARSELINE BRA.S .2 .1: TST.W PREPSTACKSIZE BNE ERROR65 MOVE.W LINENUM(PC),MAXLINENUM MOVE.L CURINTERIM(PC),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(PC),A0 MOVE.L CURINTERIM(PC),A1 MOVE.W #21,(A1)+ MOVE.W LINENUM2(PC),(A1)+ LEA 2(A1),A2 MOVE.L A2,STARTINTERIM MOVE.L WORK(PC),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 ! MOVE.W D7,D5 LSL.W #2,D5 MOVE.L JUMPTAB(PC,D5.W),A4 JMP (A4) 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,E,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,E ; 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 ERROR3 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 .L: CMP.B (A0)+,D0 BNE.S .L SUBQ.L #1,A0 BRA PARSELOOP PARSEPROD: ; / CMP.B #'/',D6 BEQ ERROR27 MOVEQ #9,D4 MOVE.W D4,(A1)+ BRA PARSELOOP PARSEDIV: ; * CMP.B #'*',D6 BEQ.S COMMENT MOVEQ #10,D4 MOVE.W D4,(A1)+ 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 .B: 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 ERROR27 .MA: TST.B (A0) BEQ.S .ER BRA.S .B PARSEQUOTE: ; ` MOVEQ #36,D4 MOVE.W D4,(A1)+ BRA PARSELOOP PARSEEQ: ; = MOVEQ #11,D4 MOVE.W D4,(A1)+ BRA PARSELOOP PARSEPTR: ; ^ MOVEQ #32,D4 MOVE.W D4,(A1)+ BRA PARSELOOP PARSEFLT: ; ! MOVEQ #37,D4 MOVE.W D4,(A1)+ BRA PARSELOOP PARSECONS: ; | MOVEQ #46,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 ERROR52 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 MOVEQ #12,D4 MOVE.W D4,(A1)+ BRA PARSELOOP .1: MOVEQ #14,D4 MOVE.W D4,(A1)+ ADDQ.L #1,A0 BRA PARSELOOP PARSESMALLER: CMP.B #'=',D6 BEQ.S .1 CMP.B #'>',D6 BEQ.S .2 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 PARSEBECOMES: CMP.B #'=',D6 BNE.S .1 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 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 ERROR20 SUBQ.W #1,PARSEBRACKET 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 LEA .TAB-(4*IOFF)(PC),A3 MOVE.L D0,D1 LSL.W #2,D1 MOVE.L 0(A3,D1.W),A3 JMP (A3) .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 .. FULL 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 .. DC.L .DONE,.DONE,.DONE,.DONE,.DONE,.DONE 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: 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: TST.W PARSEBRACKET BNE ERROR20 RTS .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: MOVE.W #-1,.DEFF MOVE.W #-1,INPROC CLR.W REGSTOP BSR.S .BRAK BRA.S .RESO .EP2: CMP.W #18,D4 ; RETURN PREC ")" OR BEQ.S .EP CMP.W #31,D4 BNE.S .DONE .EP: CLR.W INPROC BSR.S .BRAK BRA .DONE .OBJ: MOVE.L #-1,OBJECTD CLR.L OBJNAME BRA.S .DONE .EOBJ: CLR.L OBJECTD BRA.S .DONE .D: TST.L CONSTD BNE ERROR12 TST.W .DEFF BEQ.S .DONE MOVEQ #IOFF+17,D0 ; SET DEF TO LOCAL MOVE.W #17,CURINS ; FIX BRA.W .DONE .DEFF: DC.W 0 .RSE: MOVE.W #-1,BUSYRAISE BRA .RESO .SER: CMP.W #IOFF+33,D0 BNE ERROR12 BRA .DONE .EXP: MOVE.W #-1,EXPORTFLAG TSTMOD BEQ ERROR49 BRA .DONE .HAND: MOVE.L CPROC(PC),A2 BSET #2,2(A2) ; SET NO_REGALLOC MOVE.W #1,REGSTOP BRA .DONE .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 ERROR50 BSET #3,5(A3) MOVE.L 6(A3),A6 ; A6=PROC TST.W REGSTOP BNE ERROR56 ; NO :REG IN HANDLE ADDQ.B #1,3(A6) MOVE.B 3(A6),D7 EXT.W D7 CMP.W #MAXREGVARS+1,D7 BPL ERROR56 ; 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: TST.W REGSTOP BNE .HB MOVE.W D4,D0 SUB.W #IOFF,D0 ; D0=REL_KEY MOVE.L HEAVYNESS,D1 ; D1 BECOMES NEW HEAVYNESS LEA HEAVYTABLE(PC),A2 ADD.W D0,A2 MOVE.B (A2),D0 EXT.W D0 CMP.W #"s",D0 BEQ.S .SET1 CMP.W #"m",D0 BEQ.S .LOOP CMP.W #"d",D0 BEQ.S .ELOOP CMP.W #"i",D0 BEQ.S .IF CMP.W #"e",D0 BEQ.S .EIF CMP.W #"D",D0 BEQ.S .DO CMP.W #"S",D0 BEQ.S .SEL CMP.W #"U",D0 BEQ.S .UNTIL CMP.W #"E",D0 BEQ.S .ESEL .HEND: CMP.L #1,D1 BPL.S .HEND2 MOVEQ #1,D1 .HEND2: MOVE.L D1,HEAVYNESS BRA .HB .SET1: MOVE.L #MIDHEAVY,D1 BRA.S .HEND .LOOP: LSL.L #3,D1 ADDQ.W #3,POSTDFACTOR BRA.S .HEND .ELOOP: LSR.L #3,D1 BRA.S .HEND .IF: ADDQ.W #1,POSTDFACTOR MOVE.W #1,POSTACTION BRA.S .HEND .EIF: LSL.L #1,D1 BRA.S .HEND .SEL: LSL.L #4,D1 MOVE.W #2,POSTACTION BRA.S .HEND .ESEL: LSL.L #2,D1 BRA.S .HEND .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: ADDQ.W #3,POSTDFACTOR MOVE.W #1,POSTACTION BRA.S .HEND 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 PARSECONSTASM: MOVE.L WORK(PC),A2 BSR ASM_PARSE MOVE.L WORK(PC),A2 TST.L D0 BNE PARSELOOP MOVE.L #CONSTHASH,A3 MOVE.L HASHVAL,D0 LSL.L #2,D0 ADD.L D0,A3 ; A3=START CONST TABEL 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 ERROR1 XF: DC.W 0 ; 0=NO F-FUNC, -1=F PARSEUPLOW: ; Ins 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 ADDQ.L #8,A3 ADDQ.L #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)+ MOVE.L #EFUNCBYTE,A3 MOVE.B #-1,-1(A3,D3) BRA.S PLIBOUT 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 ERROR24 PLIBOUT: MOVE.L WORK(PC),A2 BRA PARSELOOP VAL: 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 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 ERROR7 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 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 ERROR7 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 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 ERROR8 CMP.L #-8,D1 BEQ ERROR8 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 LEA .SPT(PC),A3 .SPL: ADDQ.L #1,A3 CMP.B (A3),D2 BEQ.S .SPD TST.B (A3)+ BNE.S .SPL BRA ERROR26 .SPD: MOVE.B -(A3),D2 BRA.S .SPB .SPT: DC.B 10,"n",39,"a",34,"q",27,"e",9,"t","\","\",0,"0",13,"b" 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 MOVE.B CONTINUETAB(PC,D4.W),D6 ; CHECK FOR "," ETC. TST.B D6 BNE PCONTINUE BRA.S .1 .2TAB: MOVE.B CONTINUEKEY-IOFF(PC,D4.W),D6 ; CHECK FOR KEYWORDS TST.B D6 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 ERROR34 .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 ERROR20 .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 .. 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: 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+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 ERROR35 GETM A4 ; CONST CMP.W #25,(A3)+ BNE ERROR0 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 ERROR0 MOVE.L A0,-(A7) BSR ASM_GRABVALUE MOVE.L (A7)+,A0 CMP.W #-1,D0 BEQ ERROR30 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 ERROR0 BRA REBACK .OPT: CMP.W #1,STATS ; OPT BNE ERROR35 CLR.W STATS .2: MOVE.W (A3)+,D7 CMP.W #VALUE,D7 BEQ .CPU CMP.W #IOFF+34,D7 ; --> STACK=X BNE.S .4B CMP.L #$B0001,(A3)+ BNE ERROR0 MOVE.L (A3)+,D7 CMP.L #MINSTACKSIZE,D7 BMI ERROR31 BSET #0,CODEPREFS+3 MOVE.L D7,CODESTACK BRA .5 .4B: CMP.W #IOFF+67,D7 ; --> PREPROCESS BNE.S .4BB BSET #7,CODEPREFS+1 BRA .5 .4BB: CMP.W #IOFF+59,D7 ; --> EXPORT BNE.S .4C BSET #6,CODEPREFS+2 BRA .5 .4C: CMP.W #$276,D7 ; --> RTD BNE.S .4D ;BSET #0,CODEPREFS+1 ; probs with hooks/callbacks etc. BRA .5 .4D: CMP.W #IOFF+60,D7 ; --> REG=X BNE.S .6 CMP.L #$B0001,(A3)+ BNE ERROR0 MOVE.L (A3)+,D7 TST.L D7 BMI ERROR31 CMP.L #MAXREGVARS+1,D7 BPL ERROR31 MOVE.W D7,MAXREGALLOC BRA .5 .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 .7: CMP.W #IOFF+38,D7 ; --> NOWARN BNE.S .8 BSET #4,CODEPREFS+3 BRA .5 .8: CMP.W #IOFF+43,D7 ; --> DIR BNE.S .9 CMP.L #$B0006,(A3)+ BNE ERROR0 ADDQ.L #2,A3 MOVE.W (A3)+,D0 MOVE.L DIRNAMEX(PC),A4 SUBQ.W #1,D0 .L: MOVE.W (A3)+,(A4)+ DBRA D0,.L BRA.S .5 .9: CMP.W #IOFF+52,D7 ; --> OSVERSION BNE.S .10 BSET #0,CODEPREFS+2 CMP.L #$B0001,(A3)+ BNE ERROR0 MOVE.L (A3)+,D7 CMP.L #33,D7 BMI ERROR31 CMP.L #100,D7 BPL ERROR31 MOVE.W D7,OSVERSION BRA.S .5 .10: CMP.W #IOFF+36,D7 ; --> LARGE BNE.S .11 BSET #2,CODEPREFS+3 BRA.S .5 .11: CMP.W #IOFF+33,D7 ; --> MODULE (OPT) BNE ERROR1 BSET #4,CODEPREFS+2 .5: CMP.W #COM,(A3)+ BEQ .2 TST.W -2(A3) BNE ERROR0 BRA REBACK .CPU: MOVE.L (A3)+,D7 ; --> OPT 040 LEA CPUTAB(PC),A6 .CPUL: CMP.W #-1,(A6) BEQ ERROR31 ADDQ.L #8,A6 CMP.W (A6),D7 BNE.S .CPUL MOVE.W 2(A6),D0 BEQ.S .C1 TST.W ECPU BNE ERROR50 MOVE.W D0,ECPU .C1: MOVE.W 4(A6),D0 BEQ.S .C2 TST.W EFPU BNE ERROR50 MOVE.W D0,EFPU .C2: MOVE.W 6(A6),D0 MOVE.W ASMCPU(PC),D1 BSET D0,D1 MOVE.W D1,ASMCPU BRA.S .5 MODULELOAD: TST.W SCOPE BNE ERROR35 MOVEM.L A0/A1,-(A7) ; MODULE ; D4 GETRASHED! MODULELOOP: CLR.L THISMOD MOVE.L DOSBASE,A6 CMP.W #STR,(A3)+ BNE ERROR0 ADDQ.L #2,A3 MOVE.W (A3)+,D0 MOVE.L A3,A0 ; A0=MOD MOVE.L A0,A1 LOWER A1,D1 BLAAAAAARGH: EXT.L D0 LSL.L #1,D0 ADD.L D0,A3 CMP.B #"*",(A0) BNE.S .STD ADDQ.L #1,A0 MOVE.L #PRINTBUF,D1 CLR.B PRINTBUF BRA.S .CUR .STD: MOVE.L DIRNAMEX(PC),D1 .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)+ .2: MOVE.B (A0)+,(A1)+ 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 ERROR36 BMI ERROR36 MOVE.L #1005,D2 JSR -30(A6) ; OPEN MOVE.L D0,D5 ; D5=HANDLE BEQ ERROR36 MOVE.L D3,D0 ADDQ.L #8,D0 BSR NEWCACHE MOVE.L D0,D2 BEQ ERROR38 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 ERROR36 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 .L: MOVE.B (A2)+,(A1)+ BNE.S .L MOVE.L A1,D0 BTST #0,D0 BEQ.S .E CLR.B (A1)+ .E: DONEH A1 .GM: CMP.L #"EMOD",(A0)+ BNE ERROR36 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 ERROR0 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 .L: MOVE.L (A0),D0 BEQ.S .X MOVE.L D0,A0 CMP.L MI_NAMELEN(A0),D2 BNE.S .L MOVE.L MI_NAMEPTR(A0),A1 MOVE.L D1,A2 .CMP: CMPM.B (A1)+,(A2)+ BNE.S .L 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 .L: MOVE.L (A5),D0 BEQ.W .X MOVE.L D0,A5 BTST #0,MI_FLAGS(A5) BEQ.S .L 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 ERROR36 BMI ERROR36 MOVE.L MI_NAMEPTR(A5),D1 MOVE.L #1005,D2 JSR -30(A6) ; OPEN MOVE.L D0,D5 ; D5=HANDLE BEQ ERROR36 MOVE.L D3,D0 ADDQ.L #4,D0 BSR NEWCACHE MOVE.L D0,D2 BEQ ERROR38 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 ERROR36 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 ERROR36 MOVEM.L D0-D7/A0-A6,-(A7) JSR MINIMUMMODULE MOVEM.L (A7)+,D0-D7/A0-A6 BRA.W .L .X: TST.W AGAIN BNE.W .ML CLR.L ERROROBJ RTS PROCPARSE: ; PARSE 'PROC bla(a,b,c=1) OF o IS x\0' GETM A6 ; DEFARGSLIST CLR.W (A6)+ MOVE.L A6,.A6ST CLR.W .CNT CMP.W #IDENT,(A3)+ BNE ERROR4 MOVE.L (A3)+,A2 ; A2=PROCNAMEVAR CMP.B #LAB,4(A2) BNE ERROR4 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 ERROR14 CMP.W #17,(A3)+ BNE ERROR23 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.W #8,(A3) BNE.S .IS1 ADDQ.L #2,A3 NEG.L 2(A3) .IS1: CMP.W #1,(A3)+ BNE ERROR30 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 ERROR6 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.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 CMP.W #31,(A3)+ BNE .REX MOVE.L (A3)+,A3 ; A3=OBJECTHEAD, A2=PROC BTST #1,2(A3) BNE ERROR69 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 ERROR61 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 ERROR50 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 ERROR21 .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 ERROR33 CMP.W #IOFF+20,(A3) BPL.S .S2 CMP.W #31,(A3)+ BNE ERROR33 ADDQ.L #4,A3 RTS .S2: CMP.W #IOFF+23,(A3)+ BPL ERROR33 RTS .CNT: DC.W 0 .A6ST: DC.L 0 .A6MID: DC.L 0 DOENUM: TST.W INPROC BNE ERROR35 MOVEQ #0,D7 .1: GETM A4 ; ENUM CMP.W #25,(A3)+ BNE ERROR0 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 ERROR0 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 ERROR0 BRA REBACK DOSET: TST.W INPROC BNE ERROR35 MOVEQ #1,D7 .1: GETM A4 TST.L D7 ; SEE IF SET>32 BEQ ERROR7 CMP.W #25,(A3)+ BNE ERROR0 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 ERROR0 BRA REBACK DOLIBRARY: TST.W SCOPE BNE ERROR35 TSTMOD BNE ERROR50 MOVE.L LIBINFO(PC),D7 BNE ERROR50 CMP.W #STR,(A3)+ BNE ERROR0 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 ERROR5 CMP.W #VALUE,(A3)+ BNE ERROR30 MOVE.L (A3)+,(A4)+ ; VERSION CMP.W #COM,(A3)+ BNE ERROR5 CMP.W #VALUE,(A3)+ BNE ERROR30 MOVE.L (A3)+,(A4)+ ; REVISION CMP.W #COM,(A3)+ BNE ERROR5 CMP.W #STR,(A3)+ BNE ERROR0 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+62,(A3)+ BNE ERROR0 .L: CMP.W #IDENT,(A3)+ BNE ERROR4 MOVE.L (A3)+,(A4)+ BSR PARSE_REGLIST CMP.W #COM,(A3)+ BEQ .L TST.W -2(A3) BNE ERROR5 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 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 .L: MOVE.B (A3)+,D2 CMP.B #4,D2 BEQ.S .1 CMP.B #5,D2 BNE ERROR19 .1: MOVE.B (A3),(A4)+ MOVEQ #15,D2 ; REVERSE MASK SUB.B (A3)+,D2 BSET D2,D0 BNE ERROR50 ADDQ.L #1,D1 CMP.W #18,(A3) BEQ.S .BR CMP.W #COM,(A3)+ BNE ERROR5 BRA.S .L .BR: ADDQ.L #2,A3 MOVEQ #12,D2 SUB.W D1,D2 BMI ERROR70 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 ERROR35 .1: CMP.W #VALUE,(A3)+ BNE ERROR30 MOVE.L (A3)+,D7 ; RAISE ID CMP.W #IOFF+2,(A3)+ BNE ERROR0 ; 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 ERROR0 MOVE.L (A3)+,A4 ; LIBRECORD MOVE.W RAISENUM(PC),D0 MOVE.W D0,8(A4) CMP.W #MAXLIBRAISE,D0 BEQ ERROR37 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 ERROR23 MOVE.W (A3)+,D1 CMP.W #11,D1 BMI ERROR0 CMP.W #17,D1 BPL ERROR0 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 ERROR30 MOVE.L (A3)+,6(A4) CMP.W #COM,(A3)+ BEQ .1 TST.W -2(A3) BNE ERROR0 CLR.W BUSYRAISE ; ! BRA REBACK RAISENUM: DC.W 0 OSVERSION: DC.W 0 WARNINGS: DC.L 0 CODEPREFS: DC.L 0 CODESTACK: DC.L 0 MAXREGALLOC: DC.W 0 ECPU: DC.W 0 ; 0,1,2 = 000+, 020+, 040+ EFPU: DC.W 0 ; 0,1,2 = FFP, 881/882, 040 ASMCPU: DC.W 0 ; BITSET CPUTAB: DC.W 010,0,0,0 ; CPU,ECPUTYPE,EFPUTYPE,ASMCPUBIT# DC.W 020,1,0,1 DC.W 030,1,0,2 DC.W 040,2,2,3 DC.W 060,2,2,4 DC.W 881,0,1,8 DC.W 882,0,1,9 DC.W 851,0,0,10 DC.W -1 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 MOVEQ #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 ERROR21 ; LAB AS LOC OR LOC*2 CMP.L 6(A5),D3 BEQ ERROR21 ; 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 ERROR21 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 ERROR14 .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 ERROR21 ; 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: 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 .L: 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 .L 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 MOVEQ #31,D4 ; FOUND MOVE.W D4,(A1)+ MOVE.L D0,(A1)+ BEQ ERROR42 RTS .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 .L: 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 .L TST.B -1(A5) BNE.S .COMP CMP.W #IOFF+48,D4 ; 1. OBJECT BEQ ERROR43 MOVEQ #31,D4 ; FOUND MOVE.W D4,(A1)+ MOVE.L A6,(A1)+ RTS .MUT: CMP.W #IOFF+39,D4 ; ONLY "TO". ILLEGAL = "OF", ":" BNE ERROR42 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 ERROR39 .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 .C: DONEM A4 RTS .5: MOVE.L A3,OBJNAME MOVE.L WORK(PC),D1 BSR FINDOBJ TST.L D0 BNE ERROR43 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 ERROR7 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 ERROR7 .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 ERROR0 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 ERROR8 .SPEC: MOVE.B (A0)+,D1 CMP.B #'n',D1 BEQ.S .1 CMP.B #'a',D1 BEQ.S .2 CMP.B #'e',D1 BEQ.S .3 CMP.B #'t',D1 BEQ.S .4 CMP.B #'\',D1 BEQ.S .5 CMP.B #'0',D1 BEQ.S .6 CMP.B #'b',D1 BEQ .14 CMP.B #'d',D1 BEQ.S .7 CMP.B #'h',D1 BEQ.S .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 BRA ERROR26 .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.S DOFIELD MOVE.B #'l',(A1)+ MOVE.B #'d',(A1)+ BRA .LOOP .8: MOVE.B #'%',(A1)+ BSR.S DOFIELD MOVE.B #'l',(A1)+ MOVE.B #'x',(A1)+ BRA .LOOP .9: MOVE.B #'%',(A1)+ BSR.S 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 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 .L: MOVE.B (A5)+,(A1)+ BNE.S .L 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 ; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ; ; The ASSEMBLER part !!!!!!! ; ; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ; ASM_PARSE: MOVE.L #ASM_INSTAB,D2 MOVE.L WORK(PC),D0 MOVE.L D0,A2 MOVE.L (A2),D1 AND.L #$FFFFFF00,D1 CMP.L #'PC'*$10000,D1 BEQ ASM_PC 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 ADDQ.L #1,D6 MOVE.L D6,D0 ; D0=1..112 MOVE.W #$200,D1 CMP.B #'.',(A0) ; SEE IF THERE'S A: .B .W .L .S BNE.S .4 ADDQ.L #1,A0 MOVE.B (A0)+,D2 CMP.B #'L',D2 BNE.S .5 MOVE.W #$300,D1 BRA.S .4 .5: CMP.B #'W',D2 BNE.S .6 MOVE.W #$200,D1 BRA.S .4 .6: CMP.B #'B',D2 BNE.S .7 MOVE.W #$100,D1 BRA.S .4 .7: CMP.B #'S',D2 BNE ERROR0 MOVE.W #$100,D1 .4: ADD.W D1,D0 MOVE.W D0,D4 MOVE.W D0,(A1)+ RTS .2: MOVEQ #0,D0 ; 0=FAIL, ELSE=ISASM RTS ASM_PC: CMP.B #')',(A0) BEQ.S .1 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 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 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 MAKEASMHASH: ;lea xxx,a5 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 MOVE.L D0,A2 HASH A2,D0,D1 ;addq.b #1,0(a5,d0.w) 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 ;xxx: ds.b 256 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,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 EVEN ; ADDR. MODE MASKS ASRC = %111111111111 NASRC = %111111111101 MMSRC = %011111101100 PSRC = %011111100000 DEST = %000111111101 MDEST = %000111111100 QDEST = %000111111111 BTDEST = %011111111101 MMDEST = %011111110100 JLEA = %011111100100 ;--------------------------------------- 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 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,0 .1: DC.W $0000,SIZEM,12,EA,ASRC,0,COMMA,EAM,QDEST,6,0 ; MOVE .2: DC.W $4E75,0 ; RTS .3: DC.W $D000,SIZE,6,ADDSUB,$0600,0 ; ADD .4: DC.W $9000,SIZE,6,ADDSUB,$0400,0 ; SUB .5: DC.W $7000,IMMMQ,0 ; MOVEQ .6: DC.W $E000,SHIFT,$E0C0,0 ; ASR .7: DC.W $6100,BCC,0 ; BSR .8: DC.W $4200,SIZE,6,EA,DEST,0,0 ; CLR .9: DC.W $B000,SIZE,6,CMP_I,EA,ASRC,0,COMMA,DATAREG,9,0 ; CMP .10: DC.W $B100,SIZE,6,DATAREG,9,COMMA,EA,DEST,0,0 ; EOR .11: DC.W $4EC0,EA,JLEA,0,0 ; JMP .12: DC.W $4E80,EA,JLEA,0,0 ; JSR .13: DC.W $E108,SHIFT,$E3C0,0 ; LSL .14: DC.W $E008,SHIFT,$E2C0,0 ; LSR .15: DC.W $5100,SIZE,6,IMMQ,COMMA,EA,QDEST,0,0 ; SUBQ .16: DC.W $5000,SIZE,6,IMMQ,COMMA,EA,QDEST,0,0 ; ADDQ .17: DC.W $8000,SIZE,6,ADDSUB,0,0 ; OR .18: DC.W $E118,SHIFT,$E7C0,0 ; ROL .19: DC.W $E018,SHIFT,$E6C0,0 ; ROR .20: DC.W $C000,SIZE,6,ADDSUB,$0200,0 ; AND .21: DC.W $E100,SHIFT,$E1C0,0 ; ASL .22: DC.W $0100,BIT,$0800,0 ; BTST .23: DC.W $4880,SIZEE,MOVEM,0 ; MOVEM .24: DC.W $D0C0,SIZEA,EA,ASRC,0,COMMA,ADRREG,9,0 ; ADDA .25: DC.W $0600,SIZE,6,EA,$800,-1,COMMA,EA,DEST,0,0 ; ADDI .26: DC.W $D100,SIZE,6,XREG,0 ; ADDX .27: DC.W $B0C0,SIZEA,EA,ASRC,0,COMMA,ADRREG,9,0 ; CMPA .28: DC.W $B108,SIZE,6,CMPM,0 ; CMPM .29: DC.W $0C00,SIZE,6,EA,$800,-1,COMMA,EA,DEST,0,0 ; CMPI .30: DC.W $0040,SIZEM,12,EA,ASRC,0,COMMA,ADRREG,9,0 ; MOVEA .31: DC.W $6000,BCC,0 ; BRA .32: DC.W $4000,SIZE,6,EA,DEST,0,0 ; NEGX .33: DC.W $0000,SIZE,6,EA,$800,-1,COMMA,EA,DEST,0,0 ; ORI .34: DC.W $90C0,SIZEA,EA,ASRC,0,COMMA,ADRREG,9,0 ; SUBA .35: DC.W $0400,SIZE,6,EA,$800,-1,COMMA,EA,DEST,0,0 ; SUBI .36: DC.W $9100,SIZE,6,XREG,0 ; SUBX .37: DC.W $4600,SIZE,6,EA,DEST,0,0 ; NOT .38: DC.W $C1C0,SIZEF,2,EA,NASRC,0,COMMA,DATAREG,9,0 ; MULS .39: DC.W $C0C0,SIZEF,2,EA,NASRC,0,COMMA,DATAREG,9,0 ; MULU .40: DC.W $4400,SIZE,6,EA,DEST,0,0 ; NEG .41: DC.W $4A00,SIZE,6,EA,DEST,0,0 ; TST .42: DC.W $4840,DATAREG,0,0 ; SWAP .43: DC.W $41C0,EA,JLEA,0,COMMA,ADRREG,9,0 ; LEA .44: DC.W $81C0,SIZEF,2,EA,NASRC,0,COMMA,DATAREG,9,0 ; DIVS .45: DC.W $80C0,SIZEF,2,EA,NASRC,0,COMMA,DATAREG,9,0 ; DIVU .46: DC.W $C100,DOEXG,0 ; EXG .47: DC.W $4E72,EA,$800,-1,0 ; STOP .48: DC.W $4E77,0 ; RTR .49: DC.W $4E73,0 ; RTE .50: DC.W $C100,XREG,0 ; ABCD .51: DC.W $8100,XREG,0 ; SBCD .52: DC.W $0108,SIZEE,MOVEP,0 ; MOVEP .53: DC.W $4E71,0 ; NOP .54: DC.W $E110,SHIFT,$E5C0,0 ; ROXL .55: DC.W $E010,SHIFT,$E4C0,0 ; ROXR .56: DC.W $0140,BIT,$0840,0 ; BCHG .57: DC.W $0180,BIT,$0880,0 ; BCLR .58: DC.W $01C0,BIT,$08C0,0 ; BSET .59: DC.W $4180,EA,NASRC,0,COMMA,DATAREG,9,0 ; CHK .60: DC.W $4880,SIZEE,DATAREG,0,0 ; EXT .61: DC.W $4E50,ADRREG,0,COMMA,EA,$800,-1,0 ; LINK .62: DC.W $4E58,ADRREG,0,0 ; UNLK .63: DC.W $4800,EA,DEST,0,0 ; NBCD .64: DC.W $4840,EA,PSRC,0,0 ; PEA .65: DC.W $4E70,0 ; RESET .66: DC.W $4E40,TRAP,0 ; TRAP .67: DC.W $4E76,0 ; TRAPV .68: DC.W $6200,BCC,0 ; Bcc .69: DC.W $6300,BCC,0 .70: DC.W $6400,BCC,0 .71: DC.W $6500,BCC,0 .72: DC.W $6600,BCC,0 .73: DC.W $6700,BCC,0 .74: DC.W $6800,BCC,0 .75: DC.W $6900,BCC,0 .76: DC.W $6A00,BCC,0 .77: DC.W $6B00,BCC,0 .78: DC.W $6C00,BCC,0 .79: DC.W $6D00,BCC,0 .80: DC.W $6E00,BCC,0 .81: DC.W $6F00,BCC,0 .82: DC.W $51C8,DBCC,0 ; DBRA .83: DC.W $51C8,DBCC,0 ; DBF .84: DC.W $50C8,DBCC,0 ; DBT .85: DC.W $52C8,DBCC,0 ; DBcc .86: DC.W $53C8,DBCC,0 .87: DC.W $54C8,DBCC,0 .88: DC.W $55C8,DBCC,0 .89: DC.W $56C8,DBCC,0 .90: DC.W $57C8,DBCC,0 .91: DC.W $58C8,DBCC,0 .92: DC.W $59C8,DBCC,0 .93: DC.W $5AC8,DBCC,0 .94: DC.W $5BC8,DBCC,0 .95: DC.W $5CC8,DBCC,0 .96: DC.W $5DC8,DBCC,0 .97: DC.W $5EC8,DBCC,0 .98: DC.W $5FC8,DBCC,0 .99: DC.W $52C0,EA,DEST,0,0 ; Scc .100: DC.W $53C0,EA,DEST,0,0 .101: DC.W $54C0,EA,DEST,0,0 .102: DC.W $55C0,EA,DEST,0,0 .103: DC.W $56C0,EA,DEST,0,0 .104: DC.W $57C0,EA,DEST,0,0 .105: DC.W $58C0,EA,DEST,0,0 .106: DC.W $59C0,EA,DEST,0,0 .107: DC.W $5AC0,EA,DEST,0,0 .108: DC.W $5BC0,EA,DEST,0,0 .109: DC.W $5CC0,EA,DEST,0,0 .110: DC.W $5DC0,EA,DEST,0,0 .111: DC.W $5EC0,EA,DEST,0,0 .112: DC.W $5FC0,EA,DEST,0,0 .113: DC.W $50C0,EA,DEST,0,0 ; ST .114: DC.W $51C0,EA,DEST,0,0 ; SF .115: DC.W $0200,SIZE,6,EA,$800,-1,COMMA,EA,DEST,0,0 ; ANDI .116: DC.W $0A00,SIZE,6,EA,$800,-1,COMMA,EA,DEST,0,0 ; EORI .117: DC.W $4AFC,0 ; ILLEGAL .118: DC.W $4E74,CPUSUP,%11111110,EA,$800,-1,0 ; RTD=118!!! ;;ASM ASM_COMPILE: ; GETS INSCODE IN D7 MOVEM.L A2/A5,-(A7) ; JUST A3-A4 STAY PRESERVED MOVEQ #0,D0 MOVE.B D7,D0 ; D0=INSNR/ADDRESSMODENR MOVEQ #0,D1 LSR.W #8,D7 MOVE.B D7,D1 ; D1=1/2/3 OR 4-16 CMP.W #4,D1 BPL ERROR0 LEA ASM_INSJOB(PC),A0 SUBQ.L #1,D0 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: MACRO CMP.W #44,(A3) BNE.S *+4 ADDQ.L #4,A3 ENDM XR: SKIP244 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_NOTIMPL: ; 1 BRA ERROR1 ; TEMP ASM_PUTSIZE: ; 2 MOVE.L D1,D0 SUBQ.L #1,D0 MOVE.W (A0)+,D2 ; FIND OFFSET LSL.L D2,D0 OR.W D0,(A1) ; PUT IN INS.WORD RTS ASM_PUTSIZEMOVE: ; 3 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 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 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 ASM_COMMA: ; 6 CMP.W #COM,(A3)+ BNE ERROR5 RTS 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 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 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) SKIP244 RTS ASM_ANYEA: ; D7=SHIFT, res=d3.ea after shift BSR.W ASM_GETEA LSL.W D7,D3 ADD.W D3,(A1) RTS ASM_MOVEQ: ; 8 CMP.W #$0F00,(A3)+ BNE ERROR30 MOVEM.L A0/D1,-(A7) BSR ASM_GRABVALUE TST.L D0 BEQ 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.S ASM_GETDATAREG RTS 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 ASM_BCC: ; 10 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 CMP.W #1,D1 ; A Bcc.S ? BNE.S .1 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 ASM_DBCC: ; 11 BSR ASM_REGID CMP.B #4,(A3)+ BNE ERROR19 MOVE.B (A3)+,D0 OR.B D0,1(A1) 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 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 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 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) SKIP244 BSR ASM_COMMA BSR ASM_REGID CMP.B #4,(A3)+ BNE ERROR19 MOVE.B (A3)+,D3 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 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) SKIP244 RTS 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) 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 ASM_SIZEA: ; 16 CMP.W #1,D1 BEQ ERROR31 CMP.W #3,D1 BEQ.S .1 RTS .1: BSET #0,(A1) RTS ASM_SIZEE: ; 17 CMP.W #1,D1 BEQ ERROR31 CMP.W #3,D1 BEQ.S .1 RTS .1: BSET #6,1(A1) RTS ASM_XREG: ; 18 BSR ASM_REGID MOVE.B (A3)+,D2 MOVE.B (A3)+,D3 SKIP244 BSR ASM_COMMA BSR ASM_REGID MOVE.B (A3)+,D4 MOVE.B (A3)+,D5 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 ASM_DOEXG: ; 19 BSR ASM_REGID MOVE.B (A3)+,D2 MOVE.B (A3)+,D3 CMP.B #4,D2 BNE.S .1 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 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 SKIP244 BSET #7,1(A1) ; d,a BSET #3,1(A1) RTS .3: BSET #6,1(A1) ; a,a BSET #3,1(A1) RTS 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 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 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 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 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 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.S ASM_GETEA CMP.W #5,D0 BNE ERROR19 AND.W #7,D3 OR.W D3,(A1) RTS .1: BSR.S 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 ASM_CMPI: ; 24 CMP.W #$0F00,(A3) BEQ .1 RTS .1: MOVE.B #$C,(A1) ; SET TO CMPI BSR.S 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 ASM_CPUSUP: ; 25 MOVE.W ASMCPU(PC),D0 AND.W (A0)+,D0 BEQ ERROR53 RTS ASM_SIZEFIXED: CMP.W (A0)+,D1 BNE ERROR31 RTS ASM_GETEA: MOVE.W (A3)+,D0 CMP.W #$400,D0 ; COMPLEX OR BASIC ADR.MODE BMI .2 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 BRA.S .X .1: MOVEM.L D1/A0,-(A7) BSR ASM_GRABVALUE 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 # BRA.S .X .4: CMP.W #2,D1 BNE.S .5 CHKW D4,D5,ERROR31 MOVE.W D4,(A4)+ ; .W # BRA.S .X .5: CHKB D4,D5,ERROR31 MOVE.B #0,(A4)+ ; .B # MOVE.B D4,(A4)+ BRA.S .X .2: 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 MOVE.B (A3),D2 ; SEE WHAT'S NEXT CMP.B #4,D2 BMI.S .6 ; ABS OR INDEXED MODE 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,ERROR31 BRA .X .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)+ BRA .X .7: ADDQ.L #2,A3 ; ABS 4.W MOVE.W #%111000,D3 MOVEQ #7,D0 MOVE.W D4,(A4)+ CHKW D4,D5,ERROR31 BRA .X .9: ADDQ.L #2,A3 ; off(Ax,Rx.s), D4=off 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,ERROR31 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 SKIP244 AND.W #%111,D2 MOVEQ #12,D4 LSL.W D4,D2 OR.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)+ BRA .X 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 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 MOVE.W (A3)+,(A4)+ ADDQ.L #8,A3 CMP.B #6,(A3)+ BNE ERROR19 MOVE.B (A3)+,D3 AND.W #%111,D3 ADD.W #%101000,D3 MOVEQ #5,D0 RTS ; 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 .L: 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) .B: 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 .L .X2: SUBQ.L #4,A3 CMP.W #-1,D0 BEQ.S .5 SUBQ.L #2,A3 RTS .X: 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 .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 .B .ADD: ADD.L (A3)+,D1 BRA .B .SUB: SUB.L (A3)+,D1 BRA .B .AND: AND.L (A3)+,D1 BRA .B .OR: OR.L (A3)+,D1 BRA .B .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 .B ;.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 .B .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 .B ;;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 ; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ; ; 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(PC),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 .L: CMP.B (A0)+,D0 ; FIND LINE BNE.S .L DBRA D2,.L .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,"|" ; 45-46 .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 .L: 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 .L .X: BTST #7,CODEPREFS+2 BNE.S .11 MOVE.L #NOERMESSAGE,D2 MOVE.L #NEMEND-NOERMESSAGE,D3 BSR WRITECON BSR WRITELN .11: RTS 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 " ",0 .9: DC.B " ",0 EVEN 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 .L: 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 .L 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 .L .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 .L: 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 .L .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 .L: 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 .L 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 .L: MOVE.B (A0)+,(A1)+ BNE.S .L 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: ; BSR.S RESCHECK 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 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 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 .L: MOVE.B (A2)+,D3 BEQ ERROR10 MOVE.B (A2)+,D4 CMP.B D2,D3 BNE.S .L 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 ; 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 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: DC.B 'Amiga',160,'E',160,'Compiler' DC.B '/Assembler/Linker/PP',160,'v3.3a',160 IF DEMOVERS=0 DC.B 'registered' ELSE DC.B 'demo' ENDIF DC.B 160,'(c)',160,'''91-97',160,'Wouter',10 TITLEEND: DC.B 0 EVEN SPLITNAME: MOVE.L #NAMEBUF,A0 MOVE.L A0,A1 ; A1=BEGBUF LOWER A0,D0 .L: 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 .L .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 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 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 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 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 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 .L: 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,.L 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 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 #HUNK,D2 MOVEQ #32,D3 BSR WRITEFILE 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 .L: 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 .L .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: 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 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 .L: 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 .L .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 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 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 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 WRITEOBJECTINFOS: MOVE.L #ESTACKBUF,D5 MOVE.L D5,A5 ; D5,A5=BUF LEA OLIST+4,A3 ; A3=OLIST MOVEQ #0,D7 ; D7=OBJECT COUNT .L: MOVE.L ONEXT(A3),A3 MOVE.L A3,D0 BEQ.W .E TST.L OACC(A3) ; ; TEMP: HAVE TO EXPORT BNE.S .1 ; ; BTST #0,OFLAGS(A3) BEQ.S .L .1: BTST #1,OFLAGS(A3) ; ; BNE.S .L ; ; ADDQ.L #1,D7 MOVE.W #2,(A5)+ 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 .ML: MOVE.L ONEXT(A4),A4 MOVE.L A4,D0 BEQ.W .EOO MOVE.L A4,A0 BTST #0,OFLAGS(A0) BNE.S .ML BSR .DOREC BTST #1,OFLAGS(A0) BEQ.S .NT MOVE.L OPTRTYPE(A0),D0 MOVE.L D0,D4 AND.L #$FFFFFFF0,D4 BEQ.S .NO MOVE.L D0,A2 MOVEQ #-1,D0 .NO: MOVE.W D0,(A5)+ TST.L D0 BPL.S .NTS CLR.W (A5)+ MOVE.L A5,D4 MOVE.L OASCII(A2),A2 .CL: MOVE.B (A2)+,(A5)+ BNE.S .CL MOVE.L A5,D0 BTST #0,D0 BEQ.S .EE CLR.B (A5)+ .EE: MOVE.L A5,D0 SUB.L D4,D0 MOVE.L D4,A2 MOVE.W D0,-(A2) BRA.S .NTS .NT: CLR.W (A5)+ .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) TST.L D7 BEQ.S .LEAVE BSR WRITEFILE .LEAVE: RTS .DOREC: MOVE.W #-1,(A5)+ MOVE.W OSIZE(A0),(A5)+ MOVE.W OOFF(A0),(A5)+ MOVE.L A5,A1 MOVE.L OASCII(A0),A2 MOVE.L A2,D0 BEQ.S .PRIV .DL: MOVE.B (A2)+,(A5)+ BNE.S .DL MOVE.L A5,D0 BTST #0,D0 BEQ.S .EQ CLR.B (A5)+ .EQ: MOVE.L A5,D0 SUB.L A1,D0 MOVE.W D0,-6(A1) .PRIV: RTS .EOO: CLR.W (A5)+ 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 .L 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 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 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.S .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 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 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 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 .L: MOVE.L (A0),D0 BEQ.W .EX MOVE.L D0,A0 ; A0=MODINFO MOVE.L MI_LIST(A0),D0 BEQ.S .L 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 .L .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 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 CLEANUPALL: BSR CLOSECON BSR CLOSELOCK BSR FREEBUFFERS BSR SETOLDHANDLER BSR UNLOCKCACHE MOVE.L 4,A6 MOVE.L DOSBASE(PC),A1 JSR -414(A6) TST.L MATHBASE BEQ.S .1 MOVE.L MATHBASE(PC),A1 JSR -414(A6) .1: RTS 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: 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: 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: 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 CONNAME: DC.B 'CON:40/40/560/80/Amiga E Compiler Output',0 EVEN 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: BSR ERROR BSR KILLEXE LEAVEOTHERERROR: BSR CLEANUPALL LEAVEFAST: MOVE.L INITSTACK(PC),A7 BSR.S FIXRETVALUE RTS 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: 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: 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 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 ;;ERROR ERRORTAB: DC.L .0,.1,.2,.3,.4,.5,.6,.7,.8 DC.L .9,.10,.11,.12,.13,.14,.15,.16 DC.L .17,.18,.19,.20,.21,.22,.23,.24 DC.L .25,.26,.27,.28,.29,.30,.31,.32 DC.L .33,.34,.35,.36,.37,.38,.39,.40 DC.L .41,.42,.43,.44,.45,.46,.47,.48 DC.L .49,.50,.51,.52,.53,.54,.55,.56 DC.L .57,.58,.59,.60,.61,.62,.63,.64 DC.L .65,.66,.67,.68,.69,.70,.71,.72 .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 '',0 EVEN NOERMESSAGE: DC.B 'no errors' NEMEND: EVEN 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 ; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ; ; 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 IF DEMOVERS=1 CSUM: MOVE.L A4,D7 SUB.L ACODE(PC),D7 CMP.L #DEMOSIZE,D7 BPL ERROR37 CSUME: ENDIF 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 .L: 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 .L .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,JOBOUT,JOBOUT ; 75 DOBECOMESMETHOD: CMP.W #42,6(A3) BEQ DOEXP DOBECOMES: MOVE.L (A3)+,A1 CMP.W #ASSGN,(A3) BNE COMPLEXBECOMES MOVE.B 4(A1),D2 BEQ ERROR22 CMP.B #LAB,D2 BEQ ERROR6 ADDQ.L #2,A3 ; MOVEQ #0,D7 ; CMP.W #IDENT,(A3) ; CHECK IF a:=a+ ; BNE.S .NOPT ; CMPA.W 2(A3),A1 ; BNE.S .NOPT ; CMP.W #7,6(A3) ; BEQ.S .OPT ; CMP.W #8,6(A3) ; BNE.S .NOPT ;.OPT: ADDQ.L #6,A3 ; MOVE.W (A3)+,D7 ; FROM HERE D7.W, 0=MOVETO, 7=ADDTO, 8=SUBFROM ; ;.NOPT: MOVE.L A1,EAIDENT MOVE.W #17,EAREQUEST BSR EAEXP TST.L D0 BNE.W .OPT MOVE.W .1(PC),(A4)+ BSR GVA1D2_9 .OPT: BRA DOINSOUT .1: MOVE.L D0,2(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 .B CMP.W #36,D0 BMI.S EATLEXP .B: 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) .L: CMP.W #IDENT,(A3)+ ; SKIP VARS BNE ERROR6 ADDQ.L #4,A3 CMP.W #COM,(A3)+ BEQ.S .L 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)+ BSR 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: 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.S .2 ;;COMPILE ; NOTEZBIEN: DEZE MOGEN NIET MEER REGISTERS VERSTOREN! 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 NEWOP: DC.W 0 ; 0=NO32, X=NEWOP ADDBRANCH: ; D0 LABEL (A4 IS ADR. NA OP.) MOVE.L A4,D1 SUBQ.L #2,D1 ; +TRASH: D1/A0, -TRASH: D0 ! IF DEMOVERS=0 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: ENDIF GETM A0 MOVE.L BRANCHLIST(PC),(A0) MOVE.L A0,BRANCHLIST ADDQ.L #4,A0 MOVE.L D1,(A0)+ MOVE.W D0,(A0)+ DONEM A0 RTS 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)+ DONEM A0 RTS BRANCHLIST: DC.L 0 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 JOBEXP: ; 2 BSR EXP BRA JOBLOOP 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 GETCOMMA: ; 4 MOVE.W (A3)+,D6 CMP.B #COM,D6 BNE ERROR5 BRA JOBLOOP NEWLABEL: ; => D0 LAB MOVE.L CURLABNAME(PC),D0 ADDQ.L #1,CURLABNAME BSR CHECKLABBUF RTS SAVESTIDENT: ; 5 MOVE.W (A2)+,(A5)+ BRA JOBLOOP CHECKSTIDENT: ; 7 MOVE.W -(A5),D0 CMP.W (A2)+,D0 BNE ERROR9 BRA JOBLOOP FORWARDREFERENCE: ; 6 BSR.S NEWLABEL MOVE.L D0,(A5)+ MOVE.L D0,LABPRES BRA JOBLOOP REMINDCURPOS: ; 20 BSR.S NEWLABEL MOVE.L D0,(A5)+ BSR ADDLABEL BRA JOBLOOP MAKEBRANCH: ; 8 MOVE.L LABPRES,D0 CLR.W NEWOP BSR ADDBRANCH BRA JOBLOOP REMEMBERLAB: ; 15 MOVE.L -(A5),D0 BSR ADDLABEL BRA JOBLOOP POPLAB: ; 21 MOVE.L -(A5),LABPRES BRA JOBLOOP COPY2: ; 9 MOVE.W (A2)+,(A4)+ BRA JOBLOOP COPY4: ; 10 MOVE.L (A2)+,(A4)+ BRA JOBLOOP COPY6: ; 12 MOVE.L (A2)+,(A4)+ MOVE.W (A2)+,(A4)+ BRA JOBLOOP COPY8: ; 13 MOVE.L (A2)+,(A4)+ MOVE.L (A2)+,(A4)+ BRA JOBLOOP COPY10: ; 14 MOVE.L (A2)+,(A4)+ MOVE.L (A2)+,(A4)+ MOVE.W (A2)+,(A4)+ BRA JOBLOOP COPYN: ; 11 MOVE.W (A2)+,D0 COPYNLOOP: MOVE.W (A2)+,(A4)+ DBRA D0,COPYNLOOP BRA JOBLOOP ; 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 ;---------------------------- 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 .L: MOVE.W .P(PC),(A4)+ ADDQ.L #2,A3 BSR EXP ADDQ.W #1,.C CMP.W #COM,(A3) BEQ.S .L 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 EXPSTART(PC),(A4)+ BRA JOBLOOP MAKED0: ADDQ.L #2,A3 BRA JOBLOOP PROCFLAGON: ; 17 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 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 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 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 INSERTVAROFF: ; 22 SUBQ.L #2,A4 MOVE.L CURIDENTREC(PC),A0 BSR GVA0D2_0 BRA JOBLOOP INSERTVAROFFDEST: ; 35 SUBQ.L #2,A4 MOVE.L CURIDENTREC(PC),A0 BSR GVA0D2_9 BRA JOBLOOP PUSHVAR: ; 23 MOVE.L CURIDENTREC(PC),(A5)+ BRA JOBLOOP POPVAR: ; 24 MOVEA.L -(A5),A0 MOVE.L A0,CURIDENTREC MOVE.B 4(A0),TYPELAB MOVE.W 10(A0),VAROFFSET BRA JOBLOOP PUSHLAB: ; 25 MOVE.L LABPRES(PC),(A5)+ BRA JOBLOOP PUSHLAB2: ; 26 MOVE.L LABPRES2(PC),(A5)+ BRA JOBLOOP POPLAB2: ; 27 MOVE.L -(A5),LABPRES2 BRA JOBLOOP NEWLAB2: ; 28 BSR NEWLABEL MOVE.L D0,(A5)+ MOVE.L D0,LABPRES2 BRA JOBLOOP MAKEBRANCH2: ; 29 MOVE.L LABPRES2(PC),D0 CLR.W NEWOP BSR ADDBRANCH BRA JOBLOOP SETFLAG: ; 30 MOVE.W #-1,FLAG BRA JOBLOOP SKIPFLAG: ; 31 MOVE.W (A2)+,D0 TST.W FLAG BNE.S SKIPOUT SKIPLOOP: TST.W (A2)+ ; NOP DBRA D0,SKIPLOOP SKIPOUT: BRA JOBLOOP CLEARFLAG: ; 32 MOVE.W #0,FLAG BRA JOBLOOP ; was: "OUT" MAXINT=$7FF0 LDEF: MACRO TSTMOD BEQ.S *+12 CMP.W #3,-2(A2) BEQ ERROR48 ENDM ; 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 SKIPDEFLOCAL: ; 33 MOVEQ #0,D6 ; D6=DEFARGS COUNT MOVE.W (A2)+,D5 ; 1=PROC,2=LOCAL,3=DEF 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 .B .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. .B: MOVEQ #0,D0 ; D0=XTRA ARRAY STACKSPACE CMP.W #18,(A3) BEQ .BRCL .L: 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 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 .L 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 BRA.S .E .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 ERROR30 ADDQ.L #4,A3 ; SKIP VALUE MOVE.W (A3),D2 BRA .DAB .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)+ BSR 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+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 BSR.S .SETT BRA .1 .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 " MOVE.L (A3)+,A4 MOVE.L A4,(A0) MULU OSIZE(A4),D2 MOVE.L (A7)+,A4 BRA.S .SK .3: MOVE.L D2,D7 CMP.W #IOFF+45,(A3) ; "OF" BNE.S .SK2 ADDQ.L #2,A3 BSR.S .SETT .SK2: CMP.L #MAXINT,D2 BPL ERROR31 BSR.S .5 ; a[100]:ARRAY OF BRA .1 .4: MOVE.L D2,D7 ADDQ.L #1,D2 CMP.L #MAXINT,D2 BPL ERROR31 BSR.S .5 ; a[100]:STRING MOVE.W .11(PC),(A4)+ SWAP D7 MOVE.W .10(PC),(A4)+ MOVE.L D7,(A4)+ MOVE.W .LC(PC),(A4)+ CMP.W #3,D5 BEQ.S .14 ADDQ.L #8,XTRASTACK BRA .1 .14: ADDQ.L #8,GLOBSTACK BRA .1 .LIST: MOVE.W #4,2(A0) ; SET TO "PTR TO LONG" MOVE.L D2,D7 LSL.L #2,D2 CMP.L #MAXINT,D2 BPL ERROR31 BSR.S .5 ; a[25]:LIST MOVE.W .11(PC),(A4)+ SWAP D7 MOVE.W .10(PC),(A4)+ MOVE.L D7,(A4)+ MOVE.W .LC(PC),(A4)+ CMP.W #3,D5 BEQ.S .L1 ADDQ.L #8,XTRASTACK BRA .1 .L1: ADDQ.L #8,GLOBSTACK BRA .1 .5: CMP.L #1,D2 ; INIT ARRAY BMI ERROR31 MOVE.W .6(PC),(A4)+ BTST #0,D2 BEQ.S .7 ADDQ.L #1,D2 .7: BTST #1,D2 BEQ.S .7B ADDQ.L #2,D2 .7B: MOVE.L D2,D3 NEG.L D3 MOVE.W D3,(A4)+ ADD.L D2,D0 CMP.W #3,D5 BEQ.S .12 MOVE.L XTRASTACK(PC),D3 ; LOC BSR .C MOVE.L D3,XTRASTACK BRA.S .13 .12: MOVE.L GLOBSTACK(PC),D3 ; GLOB BSR .C MOVE.L D3,GLOBSTACK .13: MOVE.W .8(PC),(A4)+ MOVE.B 4(A0),D4 BEQ ERROR22 ; CMP.B #GLOBV,D4 ; ; BNE.S .20 ; SET REG ; BCLR #1,-2(A4) ; ;.20: MOVE.W 10(A0),(A4)+ ; CMP.B #GLOBV,D4 ; BEQ .9 ; BSET #1,-4(A4) BRA 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 GETNRLOC: ; 34 NRLOC IN -2(A4) MOVE.W NRLOC(PC),-2(A4) BRA JOBLOOP GETBRACKLEFT: ; 36 MOVE.W (A3)+,D6 CMP.W #17,D6 BNE ERROR23 BRA JOBLOOP GETBRACKRIGHT: ; 37 MOVE.W (A3)+,D6 CMP.W #18,D6 BNE ERROR23 BRA JOBLOOP 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 DOLONG: ; 39 .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)+,(A4)+ CMP.W #COM,(A3) BNE.S .1 ADDQ.L #2,A3 BRA.S .2 .1: BRA JOBLOOP 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 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 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 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 SERROR: BRA ERROR0 ; 44 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 JOBSKIP: ; 46 ADDQ.L #2,A2 BRA JOBLOOP EXPECTASSIGN: ; 47 CMP.W #ASSGN,(A3)+ BNE ERROR2 BRA JOBLOOP EXPECTTO: ; 48 CHOMEUR BRA JOBLOOP DOMIDFOR: ; 49 CMP.W #IOFF+39,(A3)+ ; MUST BE "TO" BNE ERROR0 BSR EXP ; AND MAKE NICE EXP FOR D0 MOVEQ #1,D7 ; D7=STEP CMP.W #IOFF+40,(A3) ; ANY "STEP" ? BNE.S .NS ADDQ.L #2,A3 CMP.W #8,(A3) BNE.S .NM NEG.L 4(A3) ADDQ.L #2,A3 .NM: CMP.W #VALUE,(A3)+ BNE ERROR30 MOVE.L (A3)+,D7 .NS: .1: MOVE.W .M2(PC),(A4)+ MOVE.L CURIDENTREC(PC),A0 BSR GVA0D1_0 BSR.W NEWLABEL MOVE.L D0,(A5)+ MOVE.L D0,LABPRES TST.L D7 BMI.S .5 MOVE.L .M3(PC),(A4)+ BRA.S .6 .5: MOVE.L .M5(PC),(A4)+ .6: MOVE.L LABPRES(PC),D0 CLR.W NEWOP BSR ADDBRANCH MOVE.L D7,(A5)+ ; STEP ON COMPILESTACK MOVE.L CURIDENTREC,(A5)+ BRA JOBLOOP .M2: CMP.L 2(A5),D0 .M3: BMI .6 .M5: BGT .6 ENDGLOBVAR: ; 50 TST.W SCOPE BNE JOBLOOP MOVE.W #-1,SCOPE TSTMOD 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 ELSEMAKELAB: ; 51 BSR.W NEWLABEL MOVE.L D0,(A5)+ BRA JOBLOOP ELSEUSELAB: ; 52 MOVE.L -(A5),D0 MOVE.L D0,D4 CLR.W NEWOP BSR ADDBRANCH MOVE.L D4,(A5)+ BRA JOBLOOP ELSEDEFLAB: ; 53 MOVE.L -(A5),D0 BSR ADDLABEL BRA JOBLOOP ELSEWAISTELAB: ; 54 SUBQ.L #4,A5 BRA JOBLOOP IF DEMOVERS=1 ; HERE WE HAVE THE SNEAKY DEMOSTUFF DOCHECKSUM: LEA HEAP(PC),A0 SUB.W #HEAP-CSUM,A0 MOVEQ #(CSUME-CSUM)/2-1,D1 MOVEQ #0,D0 .L: SUB.W (A0)+,D0 DBRA D1,.L CMP.W #$89A9,D0 BEQ.S .1 LEA INSJOBTAB(PC),A0 ADD.W #HUNK-INSJOBTAB,A0 CLR.L (A0) .1: RTS ENDIF 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 .L: 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 .L 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: MACRO ; \1=TR.DX MOVE.W (A3),\1 CMP.W #IOFF+64,\1 BNE.S *+12 CLR.W OBJPRIV ADDQ.L #2,A3 BRA.S *+18 CMP.W #IOFF+65,\1 BNE.S *+12 MOVE.W #1,OBJPRIV ADDQ.L #2,A3 ENDM FINDDOUBLEMEMBER: ; A0=MEMBER, A1=OBJH, USE D0, SAVE ALL MOVEM.L A3-A5,-(A7) LEA OMEMB+4(A1),A3 .L: MOVE.L ONEXT(A3),A3 MOVE.L A3,D0 BEQ.S .X CMP.L A3,A0 BEQ.S .L MOVE.L OASCII(A0),A4 MOVE.L OASCII(A3),A5 ; ASCII MOVE.L A5,D0 BEQ.S .L .L2: CMPM.B (A5)+,(A4)+ BNE.S .L TST.B -1(A5) BNE.S .L2 BRA ERROR43 .X: MOVEM.L (A7)+,A3-A5 RTS DOOBJECT: ; 55 MOVE.L A2,-(A7) CLR.W OBJPRIV ADDQ.W #1,OBJCOUNT MOVEQ #0,D1 ; D1=OFFSET ! CMP.W #31,(A3)+ 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 CHECKPR D0 TST.W (A3) BEQ.S .NOINH CMP.W #IOFF+45,(A3)+ ; OF BNE ERROR39 BSR INHERITOBJECT ; WANTS A1,A2, SAVES ALL CHECKPR D0 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 .L: CMPI.W #21,(A3)+ BNE ERROR39 MOVE.W (A3)+,LINENUM ; ERline CMP.W #IOFF+49,(A3) BEQ .X CHECKPR D0 TST.W (A3) BNE.S .L2 ADDQ.L #2,A3 BRA.S .L .L2: 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 ; : 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 .L CMP.W #COM,D0 BEQ .L2 BRA ERROR39 .X: ADDQ.L #2,A3 ; BTST #0,D1 ; BEQ.S .3 ; ADDQ.L #1,D1 ;.3: BTST #0,D1 BEQ.S .S ADDQ.W #1,D1 ; EVEN SIZED OBJECTS .S: 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 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 BNE ERROR33 MOVE.L D1,-(A7) MOVE.L (A3)+,D1 BSR FINDOBJ TST.L D0 BEQ ERROR42 MOVE.L (A7)+,D1 BRA.S .GTE OPTIIF: ; 56 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 DOELSECH: ; 57 MOVE.W #1,ELSECHECK BRA JOBLOOP 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) MAKEBRANCHL: ; 59, like 8 MOVE.L LABPRES,D0 MOVE.W .1(PC),NEWOP BSR ADDBRANCH BRA JOBLOOP .1: JMP .1 JOBINSIF: ; 60 TST.W EXPRECC BNE.S .1 BSR.W DOINSREC BRA JOBLOOP .1: BSR EXP BRA JOBLOOP JOBEXPIF: ; 61 MOVE.L LABPRES(PC),-(A7) BSR EXP MOVE.L (A7)+,LABPRES BRA JOBLOOP JOBFORSTEP: ; 62 MOVE.L -(A5),A1 ; A1=IDENTREC MOVE.L -(A5),D7 ; D7=STEP MOVEQ #9,D1 TST.L D7 BEQ ERROR30 BPL.S .POS NEG.L D7 ; GEN CODE FOR NEG STEP CMP.L #8,D7 BMI.S .NQ BGT.S .NL MOVEQ #0,D7 .NQ: MOVE.W .SQ(PC),D0 LSL.W D1,D7 OR.W D7,D0 MOVE.W D0,(A4)+ MOVEQ #0,D7 BRA.S .DONE .NL: MOVE.W .SL(PC),(A4)+ BRA.S .DONE .POS: CMP.L #8,D7 ; GEN CODE FOR POS STEP BMI.S .PQ BGT.S .PL MOVEQ #0,D7 .PQ: MOVE.W .AQ(PC),D0 LSL.W D1,D7 OR.W D7,D0 MOVE.W D0,(A4)+ MOVEQ #0,D7 BRA.S .DONE .PL: MOVE.W .AL(PC),(A4)+ .DONE: MOVE.L A4,D0 BSR GVA1D2_0 TST.L D7 BEQ.S .SK CMP.L A4,D0 BEQ.S .1 MOVE.W -(A4),D0 MOVE.L D7,(A4)+ MOVE.W D0,(A4)+ BRA.S .SK .1: MOVE.L D7,(A4)+ .SK: BRA JOBLOOP .AQ: ADDQ.L #8,2(A5) .SQ: SUBQ.L #8,2(A5) .AL: ADDI.L #8,2(A5) .SL: SUBI.L #8,2(A5) 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 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) 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 PUSHTYPE: ; 66 MOVE.W TYPELAB(PC),(A5)+ BRA JOBLOOP POPTYPE: ; 67 MOVE.W -(A5),TYPELAB BRA JOBLOOP RTSRTD: ; 68 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 DONEW: ; 69 ;SUBQ.L #2,A3 MOVEQ #1,D0 BSR NEWEXP BRA JOBLOOP 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 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 .L: 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 .L .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 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) 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 .L: BSET D1,D2 SUBQ.W #1,D1 DBRA D0,.L MOVE.W D2,PROCMASK SAVER #-1,D0 MOVE.W D0,PROCMASKREV .NR: BRA JOBLOOP 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 .B .0: MOVE.W .ST(PC),(A4)+ BSR GVA0D1_0 .B: 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 ; 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 -14(A5),D0 .D: BCHG #0,-4(A4) ; negate CC CLR.W NEWOP BSR ADDBRANCH BRA JOBLOOP DOSUPER: ; 76 BSR SUPEREXP BRA JOBLOOP ;;JOB ; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ; ; Instruction JobCode And Data Part ; ; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ; DUM: INSJOBTAB: DC.L .PROC,.ENDPROC,.IF,.ENDIF,.VOID,.WHILE,.ENDWHILE DC.L .FOR,.ENDFOR,.SELECT,.CASE,.DEFAULT,.ENDSELECT DC.L .REPEAT,.UNTIL,.JUMP,.DEF,.LOCAL,.ELSE,.INCBIN DC.L .LONG,.INT,.CHAR,.INC,.DEC,.THEN,.LOOP,.ENDLOOP DC.L .ERROR,.ERROR,.ERROR,.ERROR,.ERROR,.ERROR,.ERROR DC.L .EXIT,.ERROR,.ERROR,.ERROR,.ERROR,.ERROR,.ERROR DC.L .ERROR,.ERROR,.ERROR,.ERROR,.ELSEIF,.ERROR,.OBJECT DC.L .ERROR,.ERROR,.RETURN,.ERROR,.ERROR,.ERROR,.ERROR DC.L .ERROR,.EXCEPT,.ERROR,.ERROR,.ERROR,.END,.ERROR DC.L .NEW,.ERROR,.ERROR,.SUPER,.ERROR,.ERROR .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 68,0 .ENDPROC: DC.W 7,1,65,16,18,9 UNLK A5 DC.W 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 6,20,61,56 TST.L D0 BEQ DUM DC.W 8,5,3,43,IOFF+28,42,7,3,21,10 BRA DUM DC.W 8,15,0 .ENDWHILE: DC.W 7,3,21,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 20,49,5,4,43,IOFF+28,42,7,4,62,10 BRA DUM DC.W 15,21,8,0 .ENDFOR: DC.W 7,4,62,10 BRA DUM DC.W 15,21,8,0 .SELECT: DC.W 71,3,23,6,28,32,66,5,5,0 .CASE: DC.W 7,5,67,27,31,3,10 BRA DUM DC.W 29,30,15,2,24,10 CMP.L 2(A5),D0 DC.W 22,10 BNE DUM DC.W 23,6,8,26,66,5,5,0 .DEFAULT: DC.W 7,5,67,27,10 BRA DUM DC.W 29,15,24,23,6,26,66,5,5,0 .ENDSELECT: DC.W 7,5,67,15,15,24,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 ;;ADDRESS ; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ; ; The Calculate-Addresses-For-BRAnches Part ; ; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ; CALCADR: MOVE.W #10,CURSPOT MOVE.L ACODE(PC),D2 MOVE.L CURACODE(PC),A4 ; A4=CODE 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 TSTMOD BNE.S .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.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 #1,1(A0) BNE.S 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 NUMRELOC: DC.L 0 NUMRELADR: DC.L 0 ; LAST RELOC BYTE: ; BIT #0 CLR --> PCREL RELOC16 ; <001> SET --> BIT #1 CLR --> PCREL RELOC8 ; <101> SET --> BIT #1 CLR --> PCREL RELOC8 + ADJUST ; SET --> ABS RELOC32 (ENTRY IN RELOCTAB) 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 .L: 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 .L .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 .L .PROC: CMP.W #5,4(A0) BNE.S .L 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 .L 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 .L .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 D7,A1 MOVE.L D6,D5 LSL.L #4,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 ; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ; ; The Expression Calculation Part ; ; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ; ; 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) ; OPTI DONE, ..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 .L: 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 .L .L2: CMPM.B (A5)+,(A4)+ BNE.S .L TST.B -1(A5) BNE.S .L2 CMP.W OID(A3),D1 BNE.S .L ; 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 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.W (A3)+,D1 CMP.W #33,D1 ; SEE IF IDENT++ BPL PLX PLB: MOVE.L (A0),.SPEC CLR.B .TDRF .DREFL: 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) BNE.S .9 CMP.W #30,6(A3) BNE.S .9 MOVE.L 2(A3),D3 ; D3=OFFSET ADDQ.L #6,A3 BRA.S .10 .9: CMP.W #IDENT,(A3) BNE.S .9B CMP.W #30,6(A3) 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 .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)+ BNE ERROR40 MOVE.L (A3)+,A6 MOVE.W (A3)+,D1 .NCAST: CMP.W #35,D1 BNE .11 CMP.W #42,(A3) BEQ .EADDRMETHOD CMP.W #39,(A3)+ BNE ERROR40 CMP.W #17,4(A3) 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 ; ONLY 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 ; eXPRESSION 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 ; iMMEDIATE 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.S .23 TST.L D3 BPL.W .40 ; *** indexed version LSL.W #2,D0 MOVE.L .20(PC,D0.W),(A4)+ LSR.W #2,D0 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 .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 ; *** simple version .23: LSL.W #1,D0 MOVE.W .24(PC,D0.W),(A4)+ LSR.W #1,D0 BSR .EXTL CMP.W #2,D4 BEQ.W .21 BPL.S .25 TST.W D4 BEQ.S .DO ; SKIP MOVE.X SET BCLR #5,-2(A4) BRA.S .21 .25: BCLR #4,-2(A4) BRA.S .21 .24: MOVE.W (A0),D0 MOVE.W (A0),D1 MOVE.W D0,(A0) MOVE.W (A0),A0 LEA (A0),A0 LEA (A0),A0 LEA (A0),A0 LEA (A0),A0 ; *** relative(a0) version .40: 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 .21 BPL.S .41 TST.W D4 BEQ.S .DO ; SKIP MOVE.X SET BCLR #5,-4(A4) BRA.S .21 .41: BCLR #4,-4(A4) BRA.S .21 .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 ; LAST PARTS: .DO: SUB.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 .19B: EXT.L D0 EXT.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 .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 ; 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 ;;EXP EXPRECC: DC.W 0 ; RECURSION DEPTH OF EXP() EXP: ; GENERATES EXP FOR D0 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 ; 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 #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 #IOFF,D0 BMI ERROR0 EXPOUT: 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 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 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 ; 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 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 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 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 EXPCONS: CMP.W #1,D5 BEQ ERROR0 BSR.W SD0 CLR.W -(A7) .L: 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 .L 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: 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) 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 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 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.S RD0 MOVEQ #1,D5 BRA EXPLOOP ELSECHECK: DC.W 0 EXPRCODE1: MOVE.L D0,-(A7) EXPRCODE2: MOVE.L D0,D1 MOVE.L (A7)+,D0 EXTL: EXT.W D0 EXT.L D0 MOVEQ: MOVEQ #0,D0 CLOSEEXP: TST.W FLTFLAG BNE.S CLOSEFLT CLFLTB: CMP.W #2,D4 BEQ.S .1 MOVE.W 4(A1,D4.W),(A4)+ ; OP CMPI.L #EXPDIV,A1 BNE.S .2 MOVE.W D0EXT(PC),(A4)+ .2: RTS .1: MOVE.W 10(A1),(A4)+ ; CMP MOVE.W D3,(A4)+ MOVE.L EXTL(PC),(A4)+ RTS 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)+ MOVE.L EXTL(PC),(A4)+ .2: MOVE.L (A7)+,D0 RTS RD0: CMP.W #-1,D5 BEQ.S .1 MOVE.L EXPRCODE2(PC),(A4)+ BSR CLOSEEXP .1: RTS SD0: CMP.W #-1,D5 BEQ.S .1 MOVE.W EXPRCODE1(PC),(A4)+ .1: 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 #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) 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 #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)+ MOVE.L EXTL(PC),(A4)+ BRA EXPLOOP 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 VALUEFLOAT: CMP.W #-1,D5 BEQ.W VALFLTBACK CMP.L #EXPCMP,A1 ; NO AND/OR BMI.W VALFLTBACK EXPFLOATVAL: 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)+ MOVE.L EXTL(PC),(A4)+ .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 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 EXPVAR: CMP.W #1,D5 BEQ ERROR0 MOVE.L (A3)+,A0 MOVE.W (A3),D0 ; CHECK COMPLEX CMP.W #33,D0 BPL EXPVARC CMP.W #29,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 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 .2: CMP.W #-1,D5 ; SPXXX BEQ .4 CMP.L #EXPCMP,A1 ; NO AND/OR BMI .4 BLERK: MOVE.W .3(PC),(A4)+ BSR GVA0D0D5_0 MOVEQ #1,D5 BSR MAKEFLTOPER BRA EXPLOOP .3: MOVE.L 2(A5),D1 EXPVARCMP: TST.W FLTFLAG BNE .1 MOVE.W 6(A1),(A4)+ BSR GVA0D0D5_0 MOVEQ #1,D5 MOVE.W D3,(A4)+ MOVE.L EXTL(PC),(A4)+ BRA EXPLOOP .1: BLAARGH: BSET #3,CODEPREFS+1 ; USE MATHIEEESINGBAS MOVE.W .2(PC),(A4)+ ; SPCMP BSR GVA0D0D5_0 MOVEQ #1,D5 MOVE.L .3(PC),(A4)+ MOVE.L .3+4(PC),(A4)+ MOVE.W D3,(A4)+ MOVE.L EXTL(PC),(A4)+ BRA EXPLOOP .2: MOVE.L 2(A5),D1 .3: MOVE.L -56(A4),A6 JSR -42(A6) 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 CMP.W #-1,D5 BEQ.S .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 ; WANTS OBJ=A6,NAME=D0 ; TRASHES A0 ; RETURNS D1=METHOD | NIL FINDMETHOD: LEA OMETHOD(A6),A6 MOVE.L A6,D1 .L: 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 .L TST.B -1(A0) BNE.S .CL .ERR: RTS 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 MAKEFLTOPER: ; TRASHES D0 !!!! 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 .2: MOVE.L -56(A4),A6 .1: JSR -42(A6) ; = <> etc. JSR -66(A6) ; + JSR -72(A6) ; - JSR -78(A6) ; * JSR -84(A6) ; / EXPCOMPARATOR: CMP.W #17,D0 BPL EXPBACK2 CMP.W #1,D5 BNE .1 CMP.W #12,D0 BEQ.S .2 .3: 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 .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.S .3 .4: BRA EXPOUT 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 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 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 DODEFARGS: 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 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) 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 .L: MOVE.W (A3)+,D0 CMP.W #8,D0 BNE.S .T1 CMP.W #VALUE,(A3)+ BNE.S .B 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 .B ADDQ.L #2,A3 MOVE.W (A3)+,D7 LSL.W #1,D7 ADD.W D7,A3 BTST #2,CODEPREFS+3 BNE.S .B .C: CMP.W #COM,(A3)+ BEQ.S .L CMP.W #18,-2(A3) BNE.S .B MOVEQ #-1,D0 BRA.S .O .B: 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 EXPEFUNC: CMP.W #1,D5 BEQ ERROR0 MOVE.L (A3)+,A0 ; A0=FUNCTABENTRY 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 LSR.L #4,D0 MOVE.L D0,D7 ; INDEX ADD.W #10,D0 LEA EFUNCFLAGSTAB(PC),A6 MOVE.B 0(A6,D7.L),D1 BEQ.S .NOF BTST #0,D1 BEQ.S .F1 BSET #3,CODEPREFS+1 .F1: BTST #1,D1 BEQ.S .NOF BSET #4,CODEPREFS+1 .NOF: 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 ; 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 .L: MOVE.L A6,-(A7) BSR.W .R MOVE.L (A7)+,A6 ADDQ.W #1,(A7) CMP.W #COM,(A3)+ BEQ.S .L 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 ; 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) ; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ; ; The Unit Linking Subroutines. ; ; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ; 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: JSR PREPREADMACROS BRA DOMODULEJOB 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: MOVE.L (A0)+,D0 CMP.W #1,D1 BNE.S .L ADD.L D0,A0 BRA.W DOMODULEJOB .L: 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 .L .X: BRA.W DOMODULEJOB 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 .L: TST.L (A0)+ BEQ.S .OUT TST.W D2 BMI.S .L ADDQ.L #2,A0 BRA.S .L .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: 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: 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: 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 BRA DOMODULEJOB ADDPROCS: .L: 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)+ ; PROC MOVE.W #-2,(A4)+ 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)+ MOVE.L A0,(A4)+ ; DEFARGS 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 .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 .L .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: ; 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 .L: 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 .L .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 .L .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 .L .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 .L 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 .L 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 .L .DEBUG: CMP.W #8,D0 BNE.S .PROC MOVE.L D2,D1 SUB.L ACODE,D1 MOVE.L D1,14(A0) BRA .L .PROC: CMP.W #5,D0 ;BNE.S . ; PROC ACC RESOLVE HERE BRA .L .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 .L .NOTF: MOVE.L D1,ERROROBJ BRA ERROR57 .E: MOVEM.L (A7)+,A0-A3/D0-D4/A5 RTS ADDCONST: CMP.W #6,LOADEDVERSION BMI.S .L MOVE.L (A0)+,D0 CMP.W #2,D1 BNE.S .L ADD.L D0,A0 BRA DOMODULEJOB .L: 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 .L .1: BRA DOMODULEJOB 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 MOVE.W (A0)+,D1 CMP.W #-1,D1 BNE ERROR39 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)+ 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 GETM A5 MOVE.W (A0)+,D1 CLR.L (A5)+ ; ONEXT MOVE.L A5,(A6) LEA ONEXT(A5),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: LEA OBJTYPELIST(PC),A6 .L: 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 .L .X: RTS .ER: MOVEQ #4,D0 BRA.S .R ; MOVE.L -4(A6),ERROROBJ ; BRA ERROR62 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 .L: MOVE.L (A0),A0 MOVE.L A0,D1 BEQ.S .3 MOVE.L 4(A0),A1 CMP.W 10(A1),D0 BNE.S .L GENGI A1,D1 MOVEM.L (A7)+,A0/A1/D1 .1: RTS .3: INTERN 101 SETUPLIBS: BSR ADDLIBS 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 .L: 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 .L .F2: TST.B (A5) BMI.S .L CMP.B #16,(A5) BPL.S .L ADDQ.L #1,A5 BRA.S .F2 .OUT: MOVE.L A4,CURLIBASC CLR.L (A4) CLR.L 4(A4) CLR.L 8(A4) RTS ;;HEADER ; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ; ; 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 .L: MOVE.L -(A5),D0 BEQ.W .X MOVE.L D0,A5 MOVE.W ODEL(A5),D7 ; D7=DELSIZE BEQ.S .L 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 .L .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 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 TST.L LIBINFO BNE LMAKEINITCODE 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 .1 MOVEQ #20,D0 ; NO FUCKIN' MEM ! RTS .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) 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 TST.L -12(A4) BEQ.S .1 MOVE.L -44(A4),A6 ; CLEANUP CON MOVE.L -12(A4),D1 MOVE.L D1,D4 MOVEQ #0,D2 ; NO BYTES WRITTEN MOVEQ #0,D3 JSR -42(A6) MOVE.L D4,D1 JSR -36(A6) .1: 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: ; 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 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 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 initRoutine: move.l a5,-(sp) move.l d0,a5 move.l a6,sb_SysLib(a5) move.l a0,sb_SegList(a5) LEA sb_TASKS(a5),A0 ; list of opening tasks MOVEQ #NUMTASKS-1,D0 .L: CLR.L (A0)+ CLR.L (A0)+ DBRA D0,.L move.l a5,d0 move.l (sp)+,a5 rts Open: addq.w #1,LIB_OPENCNT(a6) ; ( libptr:a6, version:d0 ) bclr #LIBB_DELEXP,sb_Flags(a6) BSR.W GETTC MOVE.L A6,D0 MOVE.L 4.W,A6 JSR -132(A6) ; --> FORBID .L: TST.L (A0)+ ; FIND EMPTY SPOT. BEQ.S .S ADDQ.L #4,A0 DBRA D1,.L JSR -138(A6) ; --> PERMIT MOVE.L D0,A6 .FAIL: MOVEQ #0,D0 ; AAARGH!!! ERROR!! RTS .S: JSR -138(A6) ; --> PERMIT MOVE.L D0,A6 MOVEM.L D2-D7/A2-A6,-(A7) MOVE.L A0,A5 ; AO POS BEWAREN OM A4 .. MOVE.L A1,-(A0) ; .. IN TE STOPPEN LATER BSR LFIRSTSTART MOVEM.L (A7)+,D2-D7/A2-A6 TST.L D0 BEQ.S .FAIL move.l a6,d0 rts Close: BSR.S GETTC .L: CMPA.L (A0)+,A1 BEQ.S .F ADDQ.L #4,A0 DBRA D1,.L RTS ; OTHER TASK, SO NOP .F: MOVEM.L D2-D7/A2-A6,-(A7) MOVE.L (A0),A4 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 btst #LIBB_DELEXP,sb_Flags(a6) beq.s .1 bsr Expung .1: rts Expung: movem.l d2/a5/a6,-(sp) ; ( libptr: a6 ) move.l a6,a5 move.l sb_SysLib(a5),a6 tst.w LIB_OPENCNT(a5) beq .1 bset #LIBB_DELEXP,sb_Flags(a5) moveq #0,d0 bra.s ExpEnd .1: move.l sb_SegList(a5),d2 move.l a5,a1 jsr Remove(A6) 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) move.l d2,d0 ExpEnd: movem.l (sp)+,d2/a5/a6 rts Null: moveq #0,d0 rts GETTC: MOVE.L 4.W,A1 ; COPY IN GETA4!!!!!!!! MOVE.L 276(A1),A1 ; A1=THISTASK MOVE.L A1,D1 AND.W #TASKTABSTOREMASK,D1 LEA sb_TASKS(A6,D1.W),A0 ; A0=HASHED TASKTABLE MOVEQ #TASKTABSIZE-1,D1 ; D1=SIZE 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 BSR ADDBRANCHRELOC MOVE.W 6(A2),(A4)+ MOVE.W LEXITC(PC),(A4)+ ; DELEGATES MOVEQ #8,D0 BSR 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 BSR 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(PC),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: MOVE.L 4.W,A1 ; COPY IN GETTC!!! MOVE.L 276(A1),A1 ; A1=THISTASK MOVE.L A1,D1 AND.W #TASKTABSTOREMASK,D1 LEA sb_TASKS(A6,D1.W),A0 ; A0=HASHED TASKTABLE MOVEQ #TASKTABSIZE-1,D1 ; D1=SIZE .L: CMPA.L (A0)+,A1 BEQ.S .F ADDQ.L #4,A0 DBRA D1,.L SUB.L A4,A4 ; BIG PROBLEM HERE!!! RTS .F: MOVE.L (A0)+,A4 RTS ENDGETA4: BUILDLIBFUNS: MOVE.L LIBINFO(PC),D6 BEQ.W .X MOVE.L D6,A6 ; A6 = LIBINFO MOVE.L CURACODE(PC),A4 ; A4 = CODE MOVE.L FUNTABADR(PC),A5 MOVE.L A4,D0 SUB.L ACODE(PC),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 .L: 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(PC),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)+ BSR 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 .L .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(PC),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 .L: TST.B (A3) BEQ.S .F CMP.B #".",(A3)+ BNE.S .L .F: MOVE.B #"m",(A3)+ CLR.B (A3)+ MOVE.L D1,D0 JSR FLUSHMODULE MOVE.L #1006,D2 MOVE.L DOSBASE(PC),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 BSR WRITEFILE MOVE.L DOSBASE(PC),A6 MOVE.L HANDLE(PC),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 ; NEEDS TO GEN T/F IN D2 MATHINITETC: ; A4=CODE 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: RTS .T: MOVEQ #-1,D2 MATHEXITETC: TSTMOD BNE .EX MOVE.L CURACODE,A4 ; A4=CODE MOVEQ #8,D0 BSR 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: MOVE.W .RTS(PC),(A4)+ MOVE.L A4,CURACODE JSR CHECK3 .EX: .RTS: RTS CCOPY: SUB.L A0,D0 LSR.L #1,D0 SUBQ.L #1,D0 .L: MOVE.W (A0)+,(A4)+ DBRA D0,.L RTS 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: 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: CLOSEMATHBAS: MOVE.L 4.W,A6 MOVE.L -56(A4),D0 BEQ.S CLOSEBASEND MOVE.L D0,A1 JSR -414(A6) CLOSEBASEND: CLOSEMATHTRANS: MOVE.L 4.W,A6 MOVE.L -60(A4),D0 BEQ.S CLOSETRANSEND MOVE.L D0,A1 JSR -414(A6) CLOSETRANSEND: 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 = 9 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 .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 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 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 EVEN 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 LINKDELEGATECONSTRUCTORS: LEA OLIST+4,A0 .L: MOVE.L -(A0),D0 BEQ .X MOVE.L D0,A0 TST.W ODEL(A0) BEQ.S .L BTST #1,OFLAGS(A0) BNE.S .L 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 .L .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) LINKFUNCS: TSTMOD BNE.S .X 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.L D4,A1 MOVE.L D3,D0 LSL.L #4,D0 ADD.L D0,A1 MOVE.L 4(A1),A2 ; BEG CODE MOVE.L 20(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: RTS ; THESE ARE SHARED! GVA0D0D5_0: GENVAR 0,A0,D0,D5 ; IIII RTS GVA0D0_0: GENVAR 0,A0,10(A0),D0 ; III RTS GVA0D1_0: GENVAR 0,A0,10(A0),D1 ; IIIII RTS GVA0D2_0: MOVE.L D1,-(A7) MOVE.L D2,D1 BSR.S 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 ; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ; ; 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 EVEN 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,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 EVEN ;;FUNCS ; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ; ; ALL BUILDIN E FUNCTIONS ; ; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ; EFUNCFLAGSTAB: DC.B 0,0,0,0,0,0,0,0,0,0 ; 1-10 DC.B 0,0,0,0,0,0,0,0,0,0 ; 11-20 DC.B 0,0,0,0,0,0,0,0,0,0 ; 21-30 DC.B 0,0,0,0,0,0,0,0,0,0 ; 31-40 DC.B 0,0,0,0,0,0,0,0,0,0 ; 41-50 DC.B 0,0,0,0,0,0,0,0,0,0 ; 51-60 DC.B 0,0,0,0,0,0,0,0,0,0 ; 61-70 DC.B 0,0,0,0,0,0,0,0,0,0 ; 71-80 DC.B 0,0,0,0,0,0,0,0,0,0 ; 81-90 DC.B 0,0,0,0,0,0,1,1,1,1 ; 91-100 DC.B 1,2,2,2,2,2,2,2,2,0 ; 101-110 DC.B 0,0,0,0,0,0,0,0,0,0 ; 111-120 DC.B 0,0,0,0,0,0,0,0,0,0 ; 121-130 DC.B 0,0,0,0,0,0,0,0,0,0 ; 131-140 ; BITS: 0 = USES MATHBAS ; 1 = USES MATHTRANS FOFF = $100 NREFUNC = 131 EFUNCTAB: DC.L .1,I_WRITEF,-1,0 ; = WRITEF SPECIAL ARGS DC.L .2,I_MUL,2,0 DC.L .3,I_DIV,2,0 DC.L .4,I_OPENW,11,-1 DC.L .5,I_OPENS,6,-1 DC.L .6,I_MOUSE,0,0 DC.L .7,I_PLOT,3,1 DC.L .8,I_LINE,5,1 DC.L .9,I_TEXTF,-3,0 ; NARGS*-1 DC.L .10,I_COLOR,2,-1 DC.L .11,I_SETRAST,1,0 DC.L .12,I_SETOUT,1,0 DC.L .13,I_LONG,1,0 DC.L .14,I_INT,1,0 DC.L .15,I_CHAR,1,0 DC.L .16,I_PUTLONG,2,0 DC.L .17,I_PUTINT,2,0 DC.L .18,I_PUTCHAR,2,0 DC.L .19,I_NEW,1,0 DC.L .20,I_EXIT,1,-1 DC.L .21,I_CLOSEW,1,0 DC.L .22,I_CLOSES,1,0 DC.L .23,I_AND,2,0 DC.L .24,I_OR,2,0 DC.L .25,I_NOT,1,0 DC.L .26,I_BOOLGAD,8,0 DC.L .27,I_SETTOPAZ,1,8 DC.L .28,I_STRCMP,3,$FF DC.L .29,I_STRCOPY,3,$FF DC.L .30,I_STRADD,3,$FF DC.L .31,I_STRLEN,1,0 DC.L .32,I_ESTRLEN,1,0 DC.L .33,I_ESTRMAX,1,0 DC.L .34,I_STRING,1,0 DC.L .35,I_RIGHTSTR,3,0 DC.L .36,I_MIDSTR,4,$FF DC.L .37,I_STRINGF,-2,0 DC.L .38,I_VAL,2,-1 DC.L .39,I_INSTR,3,-1 DC.L .40,I_TRIMSTR,1,0 DC.L .41,I_UPPERSTR,1,0 DC.L .42,I_LOWERSTR,1,0 DC.L .43,I_READSTR,2,0 DC.L .44,I_OUT,2,0 DC.L .45,I_INP,1,0 DC.L .46,I_VERSION,1,0 DC.L .47,I_FILELENGTH,1,0 DC.L .48,I_MOUSEX,1,0 DC.L .49,I_MOUSEY,1,0 DC.L .50,I_FREESTACK,0,0 DC.L .51,I_CTRLC,0,0 DC.L .52,I_LIST,1,0 DC.L .53,I_LISTCOPY,3,$FF DC.L .54,I_LISTADD,3,$FF DC.L .55,I_LISTCMP,3,$FF DC.L .56,I_LISTLEN,1,0 DC.L .57,I_LISTMAX,1,0 DC.L .58,I_EVEN,1,0 DC.L .59,I_ODD,1,0 DC.L .60,I_EVAL,1,0 DC.L .61,I_FORALL,3,0 DC.L .62,I_EXISTS,3,0 DC.L .63,I_MAPLIST,4,0 DC.L .64,I_ABS,1,0 DC.L .65,I_SHL,2,0 DC.L .66,I_SHR,2,0 DC.L .67,I_BOX,5,1 DC.L .68,I_DISP,1,0 DC.L .69,I_DISPL,1,0 DC.L .70,I_LINK,2,0 DC.L .71,I_NEXT,1,0 DC.L .72,I_FORWARD,2,0 DC.L .73,I_SETSTR,2,0 DC.L .74,I_SETLIST,2,0 DC.L .75,I_WAITMSG,1,0 DC.L .76,I_MSGCODE,0,0 DC.L .77,I_MSGQUAL,0,0 DC.L .78,I_MSGIADR,0,0 DC.L .79,I_RND,1,0 DC.L .80,I_RNDQ,1,0 DC.L .81,I_MOD,2,0 DC.L .82,I_EOR,2,0 DC.L .83,I_CAUSE,1,-1 DC.L .84,I_LISTITEM,2,0 DC.L .85,I_NEWR,1,0 DC.L .86,I_SIGN,1,0 DC.L .87,I_PRINTF,-1,0 DC.L .88,I_WAITLEFTMOUSE,1,0 DC.L .89,I_LEFTMOUSE,1,0 DC.L .90,I_SETIN,1,0 DC.L .91,I_THROW,2,0 DC.L .92,I_RETHROW,0,0 DC.L .93,I_SELECTLIST,4,0 DC.L .94,I_SETCOLOUR,5,0 DC.L .95,I_NEWM,2,0 DC.L .96,I_BOUNDS,3,0 DC.L .97,I_REALF,3,0 DC.L .98,I_REALVAL,1,0 DC.L .99,I_FABS,1,0 DC.L .100,I_FFLOOR,1,0 DC.L .101,I_FCEIL,1,0 DC.L .102,I_FSIN,1,0 DC.L .103,I_FCOS,1,0 DC.L .104,I_FTAN,1,0 DC.L .105,I_FEXP,1,0 DC.L .106,I_FLOG,1,0 DC.L .107,I_FPOW,2,0 DC.L .108,I_FSQRT,1,0 DC.L .109,I_FLOG10,1,0 DC.L .110,I_FASTDISPOSE,2,0 DC.L .111,I_FASTNEW,1,0 DC.L .112,I_MIN,2,0 DC.L .113,I_MAX,2,0 DC.L .114,I_OSTRCMP,3,$FF DC.L .115,I_ASTRCOPY,3,$FF DC.L .116,I_CELL,1,0 DC.L .117,I_FREECELLS,0,0 DC.L .118,I_SETCHUNKSIZE,1,0 DC.L .119,I_CAR,1,0 DC.L .120,I_CDR,1,0 DC.L .121,I_CONS,0,0 DC.L .122,I_FASTDISPOSELIST,1,0 DC.L .123,I_FATAN,1,0 DC.L .124,I_FSINCOS,2,0 DC.L .125,I_FSINH,1,0 DC.L .126,I_FCOSH,1,0 DC.L .127,I_FTANH,1,0 DC.L .128,I_FTIEEE,1,0 DC.L .129,I_FFIEEE,1,0 DC.L .130,I_FASIN,1,0 DC.L .131,I_FACOS,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 EVEN ; NOTE: ALL THIS CODE SAVES D3-D7/A4/A5/A7 BEFORE THRASHING 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 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 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 I_OPENW: LEA .1(PC),A0 MOVE.L 4(A7),48(A0) MOVE.L 8(A7),18(A0) MOVE.W 14(A7),46(A0) MOVE.L 16(A7),30(A0) MOVE.L 20(A7),26(A0) MOVE.L 24(A7),D0 MOVEQ #18,D1 BSET D1,D0 MOVE.L D0,14(A0) MOVE.L 28(A7),10(A0) MOVE.W 34(A7),6(A0) MOVE.W 38(A7),4(A0) MOVE.W 42(A7),2(A0) MOVE.W 46(A7),(A0) 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 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 I_MOUSE: MOVEQ #0,D0 BTST #6,$BFE001 BNE.S .1 MOVEQ #1,D0 .1: BTST #10,$DFF016 BNE.S .2 BSET #1,D0 .2: BTST #8,$DFF016 BNE.S .3 BSET #2,D0 .3: RTS 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 I_LINE: 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 -240(A6) MOVE.L -16(A4),A1 MOVE.L 20(A7),D0 MOVE.L 16(A7),D1 JSR -246(A6) .1: RTS 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 276(A6),A3 ;MOVE.L 58(A3),A3 MOVE.L -64(A4),A3 ; BETTER! MOVE.L A3,D2 JSR -522(A6) MOVE.L -16(A4),A1 MOVE.L A1,D0 BEQ.S .1 MOVE.L -52(A4),A6 MOVE.L 4(A7),D0 MOVE.L 12(A7,D0.L),D1 MOVE.L 16(A7,D0.L),D0 JSR -240(A6) 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) MOVE.L D2,D0 .1: RTS .3: MOVE.B D0,(A3)+ ;RDF DUMP RTS I_COLOR: MOVE.L -16(A4),A1 MOVE.L A1,D0 BEQ.S .1 MOVE.L -52(A4),A6 MOVE.L 8(A7),D0 JSR -342(A6) MOVE.L -16(A4),A1 MOVE.L 4(A7),D0 JSR -348(A6) .1: RTS I_SETRAST: MOVE.L -16(A4),D0 MOVE.L 4(A7),D1 BEQ.S .1 MOVE.L D1,-16(A4) .1: RTS I_SETOUT: MOVE.L -8(A4),D0 MOVE.L 4(A7),D1 BEQ.S .1 MOVE.L D1,-8(A4) .1: RTS I_LONG: MOVE.L 4(A7),A0 MOVE.L (A0),D0 RTS I_INT: MOVE.L 4(A7),A0 MOVEQ #0,D0 MOVE.W (A0),D0 RTS I_CHAR: MOVE.L 4(A7),A0 MOVEQ #0,D0 MOVE.B (A0),D0 RTS I_PUTLONG: MOVE.L 8(A7),A0 MOVE.L 4(A7),(A0) RTS I_PUTINT: MOVE.L 8(A7),A0 MOVE.W 6(A7),(A0) RTS I_PUTCHAR: MOVE.L 8(A7),A0 MOVE.B 7(A7),(A0) RTS 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 I_EXIT: MOVE.L 4(A7),-28(A4) MOVE.L -24(A4),A0 JMP (A0) I_CLOSEW: CLR.L -16(A4) MOVE.L 4(A7),A0 MOVE.L A0,D0 BEQ.S .1 MOVE.L -48(A4),A6 JSR -72(A6) .1: RTS I_CLOSES: CLR.L -16(A4) MOVE.L 4(A7),A0 MOVE.L A0,D0 BEQ.S .1 MOVE.L -48(A4),A6 JSR -66(A6) .1: RTS I_AND: MOVE.L 8(A7),D0 AND.L 4(A7),D0 RTS I_OR: MOVE.L 8(A7),D0 OR.L 4(A7),D0 RTS I_NOT: MOVE.L 4(A7),D0 NOT.L D0 RTS I_BOOLGAD: MOVE.L 32(A7),D2 MOVE.L D2,A1 ; A1,D2=GADGET MOVE.L A1,A2 MOVEQ #28,D0 .L: CLR.L (A2)+ DBRA D0,.L 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 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 I_STRCMP: MOVEQ #0,D0 MOVE.W 6(A7),D0 ; LEN MOVE.L 8(A7),A1 ; STR1 MOVE.L 12(A7),A0 ; STR2 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 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 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 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 I_ESTRLEN: MOVE.L 4(A7),A0 MOVEQ #0,D0 MOVE.W -2(A0),D0 RTS I_ESTRMAX: MOVE.L 4(A7),A0 MOVEQ #0,D0 MOVE.W -4(A0),D0 RTS 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 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 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 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 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 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 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 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 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 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 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 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 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 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 I_MOUSEX: MOVEQ #0,D0 MOVE.L 4(A7),A0 MOVE.W 14(A0),D0 RTS I_MOUSEY: MOVEQ #0,D0 MOVE.L 4(A7),A0 MOVE.W 12(A0),D0 RTS I_FREESTACK: MOVE.L A7,D0 SUB.L -64(A4),D0 SUB.L #1000,D0 RTS 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 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 I_LISTCOPY: 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: 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 .L: MOVE.L (A0)+,(A1)+ DBRA D0,.L .3: MOVE.L A2,D0 RTS 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 .L: MOVE.L (A0)+,(A1)+ DBRA D0,.L .3: MOVE.L A2,D0 RTS 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 .L: CMPM.L (A0)+,(A1)+ BNE.S .4 DBRA D0,.L .3: MOVEQ #-1,D0 RTS .4: MOVEQ #0,D0 RTS I_LISTLEN: MOVE.L 4(A7),A0 MOVEQ #0,D0 MOVE.W -2(A0),D0 RTS I_LISTMAX: MOVE.L 4(A7),A0 MOVEQ #0,D0 MOVE.W -4(A0),D0 RTS I_EVEN: BTST #0,7(A7) BEQ.S .1 MOVEQ #0,D0 RTS .1: MOVEQ #-1,D0 RTS I_ODD: BTST #0,7(A7) BNE.S .1 MOVEQ #0,D0 RTS .1: MOVEQ #-1,D0 RTS I_EVAL: MOVE.L 4(A7),A0 JSR (A0) ; ACTIONNES DANGEREUSES !!! RTS 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 .L: 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,.L BRA.S .3 .2: MOVEQ #0,D1 DBRA D2,.L .3: MOVE.L D1,D0 .1: RTS 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 .L: 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,.L BRA.S .3 .2: MOVEQ #-1,D1 DBRA D2,.L .3: MOVE.L D1,D0 .1: RTS 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 .L: MOVE.L (A1)+,(A2) MOVEM.L D2/A0-A3,-(A7) JSR (A0) MOVEM.L (A7)+,D2/A0-A3 MOVE.L D0,(A3)+ DBRA D2,.L .1: MOVE.L (A7)+,D0 RTS I_ABS: MOVE.L 4(A7),D0 BPL.S .1 NEG.L D0 .1: RTS I_SHL: MOVE.L 8(A7),D0 MOVE.L 4(A7),D1 ASL.L D1,D0 RTS I_SHR: MOVE.L 8(A7),D0 MOVE.L 4(A7),D1 ASR.L D1,D0 RTS 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 I_DISP: MOVE.L 4(A7),D0 BEQ.S .1 SUBQ.L #8,D0 LEA -20(A4),A1 .L: 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 .L MOVE.L 4(A1),D0 ; MEMSIZE MOVE.L (A1),(A2) ; LINK BACK MOVE.L 4.W,A6 JSR -210(A6) .1: RTS 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 .L: 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 .L 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 I_LINK: MOVE.L 8(A7),A0 MOVE.L A0,D0 BEQ.S .1 MOVE.L 4(A7),-8(A0) .1: RTS I_NEXT: MOVE.L 4(A7),D0 BEQ.S .1 MOVE.L D0,A0 MOVE.L -8(A0),D0 .1: RTS I_FORWARD: LEA 8(A7),A0 ; LIST MOVE.L 4(A7),D1 ; NUM ADDQ.L #1,D1 .L: MOVE.L (A0),D0 BEQ.S .1 MOVE.L D0,A0 SUBQ.L #8,A0 SUBQ.L #1,D1 BNE.S .L .1: RTS 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 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 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 I_MSGCODE: MOVEQ #0,D0 MOVE.W -68(A4),D0 RTS I_MSGQUAL: MOVEQ #0,D0 MOVE.W -66(A4),D0 RTS I_MSGIADR: MOVE.L -72(A4),D0 RTS 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 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 I_MOD: MOVE.L 8(A7),D0 DIVS 6(A7),D0 MOVE.L D0,D1 SWAP D0 EXT.L D0 EXT.L D1 RTS I_EOR: MOVE.L 4(A7),D0 MOVE.L 8(A7),D1 EOR.L D1,D0 RTS ; 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) 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 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 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 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 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 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 I_SETIN: MOVE.L -8(A4),D0 MOVE.L 4(A7),D1 BEQ.S .1 MOVE.L D1,-92(A4) .1: RTS 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 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 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 .L: 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,.L .1: MOVE.W -2(A6),D0 EXT.L D0 RTS 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 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 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 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 .L: MOVE.B (A3)+,D0 BEQ.S .O BSR.W .ADDS BRA.S .L .O: LEA 32(A7),A7 RTS I_REALVAL: MOVE.L D3,A3 MOVE.L 4(A7),A0 ; A0=STR .L: MOVE.B (A0)+,D0 CMP.B #33,D0 BMI.S .L 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 I_FABS: MOVE.L 4(A7),D0 MOVE.L -56(A4),A6 JSR -54(A6) RTS I_FFLOOR: MOVE.L 4(A7),D0 MOVE.L -56(A4),A6 JSR -90(A6) RTS I_FCEIL: MOVE.L 4(A7),D0 MOVE.L -56(A4),A6 JSR -96(A6) RTS I_FSIN: MOVE.L 4(A7),D0 MOVE.L -60(A4),A6 JSR -36(A6) RTS I_FCOS: MOVE.L 4(A7),D0 MOVE.L -60(A4),A6 JSR -42(A6) RTS I_FTAN: MOVE.L 4(A7),D0 MOVE.L -60(A4),A6 JSR -48(A6) RTS I_FEXP: MOVE.L 4(A7),D0 MOVE.L -60(A4),A6 JSR -78(A6) RTS I_FLOG: MOVE.L 4(A7),D0 MOVE.L -60(A4),A6 JSR -84(A6) RTS I_FPOW: MOVE.L 4(A7),D0 MOVE.L 8(A7),D1 MOVE.L -60(A4),A6 JSR -90(A6) RTS I_FSQRT: MOVE.L 4(A7),D0 MOVE.L -60(A4),A6 JSR -96(A6) RTS I_FLOG10: MOVE.L 4(A7),D0 MOVE.L -60(A4),A6 JSR -126(A6) RTS 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 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) 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 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 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 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 ; 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 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 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 I_CAR: MOVE.L 4(A7),A0 MOVE.L (A0),D0 RTS I_CDR: MOVE.L 4(A7),A0 MOVE.L 4(A0),D0 RTS 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) 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 I_FATAN: MOVE.L 4(A7),D0 MOVE.L -60(A4),A6 JSR -30(A6) RTS I_FSINCOS: MOVE.L 8(A7),A0 MOVE.L 4(A7),D0 MOVE.L -60(A4),A6 JSR -54(A6) RTS I_FSINH: MOVE.L 4(A7),D0 MOVE.L -60(A4),A6 JSR 60(A6) RTS I_FCOSH: MOVE.L 4(A7),D0 MOVE.L -60(A4),A6 JSR -66(A6) RTS I_FTANH: MOVE.L 4(A7),D0 MOVE.L -60(A4),A6 JSR -72(A6) RTS I_FTIEEE: MOVE.L 4(A7),D0 MOVE.L -60(A4),A6 JSR -102(A6) RTS I_FFIEEE: MOVE.L 4(A7),D0 MOVE.L -60(A4),A6 JSR -108(A6) RTS I_FASIN: MOVE.L 4(A7),D0 MOVE.L -60(A4),A6 JSR -114(A6) RTS I_FACOS: MOVE.L 4(A7),D0 MOVE.L -60(A4),A6 JSR -120(A6) RTS I_CODEEND: ;xxx: ; lea .1(pc),a0 ; HASH a0,d0,d1 ; rts ;.1: dc.b "left",0,0 ; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ; ; 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 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 CONSTHASH: DS.B 1024 IDENTHASH: DS.B 1024 MACROHASH: DS.B 1024 ENDHASHBUFS: END