+---------------------------------------------------------------+ | interimcodes (tokens) | +---------------------------------------------------------------+ [hint: if 16bit ref prob in EC then move big data tables to end of exe] num type parameters -1 . end_of_interim 0 . end_of_statement [EOI] 1 value [VALUE] v:LONG 2 *X libcall [LIBC] off_lib:INT, off_call:INT, regs:PTR, movemmask:INT, exc:INT 3 *. "," [COM] 4 * ":=" [ASSIGN] 5 [X] ident [IDENT] id:PTR TO ident 6 string [STR] strlen:INT, wordlen:INT, strdata[wordlen]:ARRAY OF INT 7 * "+" 11 * "=" 15 * "<=" 8 * "-" 12 . ">" 16 "<>" 9 * "*" 13 * "<" 17 * "(" 10 * "/" 14 * ">=" 18 . ")" 19 . ":" 20 21 [] source_ptr line:INT, srclinenum 22 *X efunc entry:PTR TO tab 23 * "{" 24 "}" 25 const_resolved ascii:PTR TO STR, hashentry:LONG 26 ".W" 27 ".L" 28 ".B" 29 * "[" otherbracket:PTR TO interim_after_closing_bracket 30 . "]" 31 X objecthead o:PTR TO objectheader 32 * "^" 33 "++" 34 "--" 35 * "." 36 * "`" 37 "!" [was "|"] 38 *X libcallparse l:PTR TO table 39 X objectmember o:PTR TO member 40 *. "<=>" 41 * "::" 42 X objmemberascii a:PTR TO STR (method+shared ONLY) 43 floatvalue v:LONG 44 dummy (skip) [only after $04xx tokens] 45 X objectheadascii a:PTR TO STR (mutrec PTR TO in objs) 46 . "|" * = never end of stat . = next token to decide if ">" is part of a LISP-cell []/X/@ = mac prob/save/prev_token (for tokenised macromethod) NOTE: adding to this --> error reconstruction, skip etc. from offset IOFF | 0 * PROC | 1 ENDPROC | 2 * IF | 3 ENDIF | 4 * VOID | 5 * WHILE | 6 ENDWHILE | 7 * FOR | 8 ENDFOR | 9 * SELECT | 10 * CASE | 11 DEFAULT | 12 ENDSELECT | 13 REPEAT | 14 * UNTIL | 15 * JUMP | 16 * DEF | 17 * LOCAL (=DEF) | 18 . ELSE | 19 * INCBIN | 20 LONG 21 INT 22 CHAR 23 * INC 24 * DEC 25 *. THEN 26 LOOP 27 ENDLOOP 28 . DO 29 * AND 30 * OR 31 * CONST 32 * OPT 33 MODULE 34 STACK 35 EXIT 36 LARGE 37 ASM 38 NOWARN 39 * TO 40 * STEP 41 ARRAY 42 STRING 43 * DIR 44 * PTR 45 * OF 46 * ELSEIF 47 LIST 48 * OBJECT 49 ENDOBJECT | 50 * SIZEOF | 51 RETURN | 52 * OSVERSION | 53 * ENUM | 54 * SET | 55 *. BUT | 56 HANDLE | 57 EXCEPT | 58 * RAISE | 59 EXPORT 60 REG 61 * END | 62 * IS | 63 * NEW | 64 PUBLIC | 65 PRIVATE | 66 SUPER | 67 PREPROCESS | 68 * LIBRARY | = significant for idents to change: INSTABLE, INSJOBTAB, PARSEUPPER, HEAVYTABLE, CONTINUEKEY, PARSEGETIDENTNR, PARSEGETINSNR +---------------------------------------------------------------+ | run-time variables | +---------------------------------------------------------------+ those with "" are actual addressable variables -4 stack return [sys] -8 "stdout" [io] -12 "conout" [io] -16 "stdrast" [gfx] -20 linked memory list:PTR TO mem [sys] -24 exit jump code adr. [sys] -28 cli return value [os] -32 "arg" [os] -36 "wbmessage" [os] -40 "execbase" [base] -44 "dosbase" [base] -48 "intuitionbase" [base] -52 "gfxbase" [base] -56 "mathieeesingbasbase" [base] 97-101 -60 "mathieeesingtransbase" [base] 102-109 -64 stack bottom adr. [sys] -66.W qualifier [intui] -68.W code [intui] -72 iaddress [intui] -76 code_return [exc] -80 stack_return [exc] -84 "exception" [exc] -88 saved a5 [exc] -92 "stdin" [io] -96 "exceptioninfo" [exc] -100 chopmem [new] -104 chopleft [new] -108 cellsmem [gc] -112 cellsfree [gc] -116 chunksize [gc] +---------------------------------------------------------------+ | structures | +---------------------------------------------------------------+ OBJECT ident_lex_parse next:LONG -4 ascii:PTR TO STR 0 type:CHAR 4, [local,global,lab] = [1,2,3], 0=ndef flags:CHAR 5 pr:PTR TO proc 6, [proc,NIL,proc] info:INT 10 heavy:LONG VARHEAVY ENDOBJECT 0/1 1/2 2/4 3/8 4/16 flags = SET USED,SYS_VAR,EXPORT (*),REG,REAL|METHOD (*) = in mainsource var komt uit module, variable coalescing etype = PTR TO [1,2,4] | PTR TO info = [if_arg_then_offset,0,lab=-1 | proc=-2 | -3/-4 code in other module] offset = +arg, -localvar heavy: only for local+reg_alloc | labels from module [NIL|PTR TO procclass] OBJECT ident_parse_compile next:LONG -4 etype:LONG 0, [type,type,ascii] type:CHAR 4, [local,global,lab] = [1,2,3] flags:CHAR 5 pr:PTR TO proc 6, [proc,PTR TO globinfo|NIL,proc|NIL if lab] info:INT 10, [offset/regnum,offset,ID=label] ENDOBJECT OBJECT globinfo ascii:PTR TO STR 0 used:PTR TO offsetinfo 4 ENDOBJECT OBJECT offsetinfo next:PTR TO offsetinfo 0 off:LONG 4 offset from code opsize:INT 8 [1,2,4] (see GENGI) ENDOBJECT OBJECT proc next:PTR TO proc -4 nrargs:INT 0 flags:CHAR 2, SET COMPILE_RTD,METHOD,NO_REGALLOC,HAS_TAB numregvars:CHAR 3, 0..3 nrloc:INT 4, -(nrloc*4) defargs:PTR TO vallist 6 of_object:PTR TO objectheader 10 ident:PTR TO ident 14 self:PTR TO ident 18 method:PTR TO method 22 regtable:PTR TO LONG 26 if regalloc ENDOBJECT OBJECT const cnext:PTR TO const hashed cascii:PTR TO CHAR 4 cval:LONG 8 cflags:CHAR 12, bit 0=export dummy:CHAR _empty_spot_ ENDOBJECT OBJECT member onext:PTR TO member -4 ooff:INT 0, offset oflags:CHAR 2, SET PRIVATE,EXTRA_TYPED dummy:CHAR 3, _empty_spot_ osize:INT 4, fieldsize [1,2,4,0=array] oid:INT 6, object ID oascii:PTR TO STR 8, NIL if PRIVATE optrtype 12, if EXTRA_TYPED -+ asciiname ___ 0 info 16, if ptr_to_obj -+ next ENDOBJECT types in OBJECT till now: INT/CHAR/LONG/ARRAY/ extra: PTRTO/ARRAYOF INT/CHAR/LONG/ OBJECT objectheader onext:PTR TO member -4 odel:INT 0, delegate size + IS_OO flag otype:CHAR 2, flags: bit 0=export, 1=import dummy:CHAR 3, _empty_spot_ osize:INT 4, sizeof object oid:INT 6, object ID oascii:PTR TO STR 8 omemb:PTR TO member 12, memberlist omethod:PTR TO method 16, methodlist osuper:PTR TO objecthead|NIL 20, superclass -> needed in main? odelegatecode 24, initcode, NIL=not_here(MinM), adr=here|1=no_del_whatsoever oaccess:PTR TO access 28 odeloff:INT 32, offset from object (-1) odestructoff 34, -1=none ENDOBJECT OBJECT access next:PTR TO access 0 code:PTR 4, a4offset type:INT 8, 0=a4 (new, build del), 1=dcode (link del) ENDOBJECT OBJECT method m_next:PTR TO method 0 m_proc:PTR TO proc|NIL 4 m_type:CHAR 8 [0=METHOD, 1=FROZEN, 2=SHARED, 3=EMPTY] m_flags:CHAR 9 SET INHERITED,ARGERR,DESTRUCTOR m_off:INT 10 delegate offset m_name:PTR TO STR 12 ENDOBJECT OBJECT modlist mi_next:PTR TO modlist 0 mi_flags:CHAR 4 SET SECONDARY mi_dummy 5 _empty_spot_ mi_namelen:LONG 6 mi_mod:PTR TO emodule 10 mi_list:PTR TO procclass 14 mi_nameptr:LONG 18 ENDOBJECT OBJECT procclass pc_next:PTR TO procclass 0 pc_type:INT 4 [1=class, 2=lab/proc] pc_info:PTR 6 [TO ident|TO objectheader] pc_acc:PTR TO modaccess 10 empty for class ENDOBJECT OBJECT modaccess next, adr (adr=abs) ENDOBJECT OBJECT libasc ascii:PTR (met direct erachter regs) offset_base:INT b.v. -44 offset_func:INT b.v. -552 exception_index:INT -1=none ENDOBJECT OBJECT code_list fixproccode next:PTR TO code_list type:INT see # below: 1: OBJECT proc_offset identptr:PTR 6 offset:LONG 10 from codeblock ENDOBJECT 2: OBJECT code_block adr:PTR 6 codebegin:LONG 10 if putreloc ENDOBJECT 3: OBJECT reloc_block in putreloc adr:PTR 6 len:LONG 10 ENDOBJECT 4: OBJECT adr_patch adr:PTR 6 len:LONG 10 mod_vers:INT 14 ENDOBJECT 5: OBJECT proc_acc other proc access linking name:STR 6 proc/lab acc_list:PTR 10 [narg:INT,num:INT,LONG,...] ENDOBJECT 6: OBJECT class classname:STR 6 acclist:PTR 10 [INT,(LONG,INT),...] ENDOBJECT 7: OBJECT classx o:PTR TO obj 6 delcode:LONG 10 acclist:PTR 14 ENDOBJECT 8: OBJECT debug next:PTR 6 d:PTR TO linedebug 10 offset:LONG 14 ENDOBJECT ENDOBJECT OBJECT string_link next:PTR TO string_link label:INT 4, link with this label# first:LONG 6 ptrs:PTR TO list|NIL 10 [str,next] -> was: numpointers:INT 6 -> pointers:ARRAY OF STR 8, each has wordlen at -2(p) ENDOBJECT OBJECT runtime_string_or_list next:PTR TO runtime_bla size:LONG total allocated mem link:PTR TO string (here start non-dynamic version). maybe NIL max:INT -4 len:INT -2 data[max+1]:ARRAY OF x 0 ENDOBJECT OBJECT mem next,alloc_size,actual_mem[]:ARRAY ENDOBJECT OBJECT efunctab ascii:PTR TO STR NIL = endtab code_begin:PTR code_end is code_begin of next tabentry nrarg:LONG -(nrarg) --> vararg defarginfos:LONG see: default arguments ENDOBJECT OBJECT branch next:PTR TO branch operand_adr:PTR labelno:INT ENDOBJECT OBJECT label label_adr:PTR labelno is index on ARRAY OF label ENDOBJECT OBJECT reloc the odd reloc here and there next,code ENDOBJECT OBJECT offslist track libbasevars next, var ENDOBJECT OBJECT raiseinfo comparatortoken:INT exceptionval:LONG testagainstval:LONG ENDOBJECT OBJECT debug next:LONG 0 type:INT 4 1,2,3: arg/loc/glob vars beginline:INT 6 num:INT 8 codes[num]:ARRAY OF INT 10 code = offset tov A5 | 30000+regnum 4: procname num:INT 6 name[num]:ARRAY 8 5: len:INT (cur = 4, for future extensions) self_line:INT self_code:INT ENDOBJECT -> preprocessor: #ifdef #ifndef #endif #define OBJECT macro next:PTR TO macro 0 name:PTR TO CHAR 4 body:PTR TO CHAR 8 nargs:INT 12 flags:CHAR 14 bit 0:import dummy:CHAR 15 ENDOBJECT OBJECT libinfo name:STR 0 vers:LONG 4 rev:LONG 8 info:STR 12 dum:INT 16 numpr:INT 18 procs:ARRAY OF: 20 (20 bytes each: OBJECT proclibinfo i:PTR TO ident 0 regnums[12]:ARRAY OF CHAR 4 regs:INT 16 reverse movem nargs:INT 18 if regs/nargs = -1:LONG not opp (no manual regs) ENDOBJECT ... NIL ENDOBJECT +---------------------------------------------------------------+ | statements job codes | +---------------------------------------------------------------+ push,pop = keep track of this uitem on compile-stack (a5) store = set to current variables * = watch with variables 0 endjob 1* getlab, store {19} 2 getexp, make D0 3* getvar, store 4 getcomma 5 push ident 6 gen. newlab, push, store {15} 7 pop ident and check 8 unstore, make branch {6,21} 9 copy 2 bytes of jobcode to (a4) 10 as [9], for 4 11 as [9], for 12 as [9], for 6 13 as [9], for 8 14 as [9], for 10 15 pop lab, define lab {6} 16 make in D0, or moveq [ENDPROC,RETURN] 17 proc on, check 18 proc off 19* get lab, check, define lab {1} 20 newlab, define lab, push {21} 21 pop lab, store {20,6} 22** unstore var, make offset (see also [35]), [all,source] 23* push varoffset (unstore) 24* pop varoffset (unstore) 25 push lab (unstore) {21} 26 push lab (store) [second set] 27 pop lab (store) [second set] 28 like [6] [second set] 29 like [8] [second set] 30 set flag=1 31 skip +1 words if flag=0 32 set flag=0 33 do DEF/LOCAL/PROC: parse declarations 34 set size for LINK A5 35 like [22], now: move dest 36 get "(" 37 get ")" 38 do INCBIN 39 do LONG 40 do INT 41 do CHAR 42 statement, recursively 43 IF nextcode is available (f.e. ELSE) THEN continue ELSE stop 44 cause syntax error 45 like [43], only now instead of stop eat until 0 46 skip one word of jobcode 47 expect ":=" 48 expect TO 49 do mid-part of FOR 50 end global vars 51 make new endlab for IF (use with ELSEIF) 52 make branch to lab of [51] 53 define address 54 waiste lab 55 do OBJECT definition 56 IF case of [12], OPTIIF 57 set if-exp flag 58 do RETURN 59 like [8], but for 32bit reloc with BRA 60 version of [42] for IF 61 version of [2] for IF and WHILE, and REPEAT! 62 make STEP addq from stack 63 check for HANDLE after PROC 64 do EXCEPT 65 close exception handler in ENDPROC 66 push vartype 67 pop vartype 68 make RTS or RTD 69 do NEW 70 like 43, only now fixed for RETURN/IS 71 check and do SELECT OF 72 check for OF 73 saveregs PROC (restore in job 18) 74 do END 75 fill EXIT label 76 do SUPER +---------------------------------------------------------------+ | OPT bits and cli-flags | +---------------------------------------------------------------+ CODEPREFS bit flags opt clear set 0 +3 - - STACK= calc custom stack 1 - NILCHECK/S - - check "." and "[]" for NIL 2 l LARGE/S LARGE small large 3 a ASM/S ASM inline asm only 4 n NOWARN/S NOWARN warn no warnings 5 E ERRBYTE/S - 0/10 byte# errorspot 6 w WB/S - - wb_to_front 7 rX - REG DIY reg_alloc (max X regs) 8 0 +2 - - OSVERSION= v33 kick 9 1 b SHOWBUF/S - - show bufs 10 2 mX ADDBUF/N/K - add 1 add X 11 3 e ERRLINE/S - 0/10 line# errorspot 12 4 - - MODULE exe module 13 5 s SYM/S - - symbolhunk 14 6 - - EXPORT priv. exports all 15 7 q QUIET/S - messys quiet 16 0 +1 - - RTD use RTS use RTD for PROC call 17 1 c IGNORECACHE/S- cache don't use (ignore) cache 18 2 h HOLD/S - normal hold cli before cleanup 19 3 - - - don't use mathieeesingbas 20 4 - - - don't use mathieeesingtrans 21 5 L LINEDEBUG/S - - add line debug hunk 22 6 - DEBUG/S - - gen NOPs + linedebug + infos 23 7 - - PREPROCESS - macro def + use + condcompil 24 0 +0 25 1 26 2 27 3 28 4 29 5 30 6 31 7 SOURCE/A REG/N/K OPTI/S (REG=5) +---------------------------------------------------------------+ | module format | +---------------------------------------------------------------+ OBJECT emodule "EMOD":LONG firstjobcode:INT 0 EOF 1 OBJECT constdef skipsize:LONG if vers>=6 -> any # until len=0 len:INT value:LONG id[len]:ARRAY ENDOBJECT 2 OBJECT objectdef skipsize:LONG if vers>=6 -> any # until len=0 len:INT if -1 then no id, private (only v4) size:INT either membersize or -1 if objhead offset:INT zero for objhead id[len]:ARRAY ptrtype:INT if vers>=6 [0=none,1=char,2=int,4=long,-1=obj] len:INT if ptrtype=obj name[len] of object type pointed to ENDOBJECT first one is always head, after last 0 follows totalize.w. if -1, then then obj has nosize. after totalsize (if vers>=7): OBJECT classdef odel:INT if 0 then no further infos delcode:LONG offset len:INT superasc[len]:ARRAY -> not present for now deloff:INT destr:INT -> any #of these until type+flags = $FFFF type:CHAR flags:CHAR off:INT len:INT asc[len]:ARRAY methodname nargs:INT len:INT defargs[len]:ARRAY OF LONG -> any # until type = -1 type:INT access off:LONG ENDOBJECT 3 OBJECT codeblock nr_of_longs:LONG code[nr_of_longs]:ARRAY OF LONG ENDOBJECT 4 OBJECT labeldefs -> any number of these, until len=-1 len:INT length string+zeroes in bytes id[len]:ARRAY always even offset:LONG type:INT 1=proc, 2=lab nrarg:INT from here only if proc! nrloc:INT -(loc*4) numdefargs:INT defargs[num]:ARRAY OF LONG if >0 arglen:INT argstring[arglen]:ARRAY if >0 ENDOBJECT 5 OBJECT sysparams always as first one in module !!!!! stackused:LONG 0 osversion:INT 4 codeprefs:LONG 6 cpubitsets[3]:ARRAY OF INT 10, see elsewhere modversion:INT 16 [ 0(=1),2,3,4,... ] reserved:LONG 18 ENDOBJECT version 0 = no sysparams available, v2.1(b) with newer: 'could not read module' 1 = v2.3 .. v2.4b with newer: 'not right version' 2 = v2.4c+ 3 = v2.4e+ (with globals) 4 = v2.4f+ (with private members) 5 = v2.6d+ (skips + module in module) 6 = v2.7b+ (const/obj skips + new types in objects) 7 = v2.7d+ (classes in modules) 8 = v3.0c+ (debuginfos) 9 = v3.1a+ (more debuginfos) 10 = v3.1b+ (fix opersize globals) 6 LIBDEF only available with version=0. after this modulechunk no others. [1] libname, nilterm (only "\0" is ok too) [2] basename (nilterm) [3] any number of these until first byte = $FF - chars funcname (not nil-term) - register bytes [0..14] for args, if args=0 then byte 16 example: DC.B "Open",8,0,"Write",...,"FunNoArgs",16,"Bla",0,$FF 7 OBJECT relocinfos numreloc:LONG relocs[numreloc]:ARRAY OF LONG ENDOBJECT 8 OBJECT globals len:INT any #until len=-1 (*) ascii[len]:ARRAY if len>0 codeoff[]:ARRAY OF off (vers>=10)?(LONG,opersize:INT):LONG NIL:LONG ENDOBJECT (*) also 0 for private globals also $8000: next LONG is skipsize. real len follows (off=6) 9 OBJECT modinfo skiplen:LONG len:INT any #until len =0 name[len]:ARRAY type:INT 0=end, 1=class, 2=lab/proc len:INT name[len]:ARRAY 2 narg:INT (-1=lab) num:INT access[num]:ARRAY OF LONG 1 num:INT access[num]:ARRAY OF [LONG,INT] ENDOBJECT 10 OBJECT debug -> any #of hunks until $3F1=0 (same as hunk, i.e. 10:INT, $3F1, ...) ENOBJECT OBJECT debug_hunk $3F1:LONG len_from_here:LONG 0:LONG "LINE"|"L"+offs|"EVAR":LONG line -> len_name_in_longs:LONG name[len]:ARRAY OF LONG linedebug:ARRAY OF (linenum:LONG,offs:LONG) evar -> job:INT (0..4) 4: len:INT, name[len]:ARRAY 1,2,3: (see OBJECT debug) ENDOBJECT 11 OBJECT macros len:INT until len=0 name[len]:ARRAY nargs:INT flags:CHAR dummy:CHAR len:INT body[len]:ARRAY ENDOBJECT ENDOBJECT 0 1 2 skip 1 const r r [x] S [x] 2 object r r [x] r [ ] 3 codeblock r S [x] r [x] ok 4 lab/proc r M [x] r [x] - 5 sys r M [x] r [x] - 6 lib r r [x] S [x] 7 reloc r S [x] r [x] ok 8 glob r S [x] r [x] $8000 9 modinfo r [x] S [x] r [x] ok 10 debug r S r 11 macros r r S 0 = normal module in main source 2 = module from other module in main source 1 = module in module S = Skip (often: INT mark, LONG bytes_to_skip_from_after_this_long M = Special Action +---------------------------------------------------------------+ | identifier parsing | +---------------------------------------------------------------+ identifier predecessors: object head TO OF : SIZEOF :: object member . local/glob/label other OF outside of obj_def: ARRAY OF obj, SELECT var OF exp, PROC x() OF obj +---------------------------------------------------------------+ | register assignments etc. | +---------------------------------------------------------------+ TOKENIZE: a0 ptr to source a1 ptr to interim codes a2 ident work area d4 last token before this one d7/d6 current char, next char COMPILE: (a2) during jobinterpret only a3 interimcode a4 asmcode a5 compilerstack EXP: a3-a5 from COMPILE a1/d3/d4 set ins. / len opcode+operands d5 -1=startexp, 0=op, 1=val ASM_GRABVALUE: d0-d4/a0 thrashable d0 wasvalue:BOOL d1 if wasvalue then value ASM_COMPILE: a3/a4 interim/code a1 opcode a0 jobcode d1 size 1..3 a2/a5/a6 free GETIDENTNR: a0-a2 like in PARSE d3 PTR TO proc, (local) if any. d5/a5 PTR TO ident d5,a3/a4 freely used ADDLABEL: d0 lab a4 spot a0/d0 trash ADDBRANCH: a4 end.w instr d0 label# d1/a0 thrashable NEWOP.W opcode for long version | NIL ADDBRANCHRELOC: a4 voor rel. LONG rest like ADDBRANCH without NEWOP EADDRESSMODI: a1/d3-d5 saved from EXP d0 0 ea->d0 1 ea->d1 2 d0->ea $10000 no D2 a0 identptr a1 object or NIL d2 1=inc, 2=dec, 0=nix d3 unscaled array index [0..], -1=in d0 d4 readsize [0=lea,1,2,4] d5 objectsize code generation for ^p++ and p[i].member++ [subq objsize] d3=-1 d3=0, d3=other [push d0] compiler calc offset [pop d2/move.l d0,d2] [move d2] [lsl d2] [add d2] [ident -> a0] [moveq/ext] move (a0) / o(a0) / 0(a0,d2) [addq objsize] +---------------------------------------------------------------+ | bufusage | +---------------------------------------------------------------+ buffers type init border ------- ---- ---- ------ [1] Interim realloc 50 10 realloc1 / curinterim [2] Acode (+LibAsc) fixed SRC MAXSTACK (20) alloc3,check3 / curacode [3] Heap expand 10 2 alloc5,getm,donem,doneh / heap [4] Labels realloc 15 5 realloc6 / labm ESTACKBUF: lex .. start compile code/addr. buf compile stack after module buf upon error erstring buf +---------------------------------------------------------------+ | default args | +---------------------------------------------------------------+ StrCmp/Add/Copy -1 MidStr -1 Val 0 InStr 0 ListCmp/Add/Copy -1 Plot/Line/Box 1 Colour 0 SetTopaz 8 CleanUp 0 Raise 0 OpenS/OpenW 0 real longword used in funtab: NIL no defarg, no nothing 1..255 moveq val for defarg -1 0 defarg other adr [of new code?] +---------------------------------------------------------------+ | macros | +---------------------------------------------------------------+ HASHC d_hashdatareg, ea_chardata.b -> hash one char HASHE d_hashdatareg -> compute final hashvalue HASH a_string, d_hashdatareg, d_thrash -> do all hashing GENVAR bit:imm, ident:Ax, offset:EA.W, thrash:Dx opcode is already generated, A4 points directly after it. opcode must be must have x(A5) as main EA (set to A4 by macro). macros tests for undecl idents. bit is either 0 or 9. 0 means regular EA, 9 means MOVE dest. EA TSTMOD (NE -> module) CHKB d,dtr,erlab CHKW d,dtr,erlab SAVER savemask.ea, mask_for_restr.d RESTR rmask.ea LOWER trstring.a, dtr (after: Ax at 0-byte) GETM a DONEM a DONEH a (heavy-use version) GINFO asciiptr, atr, ident.a (builds globinfo if necessary) GENGI ident:Ax (geen A3-A5), Dx.tr CHESTB curstack.ea, tr.dx, howoftencheck, error (a5 check) INTERN num (cause internal error) +---------------------------------------------------------------+ | processors supported | +---------------------------------------------------------------+ OBJECT generate_code_for cpu:INT, fpu:INT, bitset:INT ENDOBJECT cpu 0 = 68000+ 1 = 68020+ 2 = 68040+ fpu 0 = FFP 1 = 68881+ 2 = 68040+ bits: 0 = 010 3 = 040 6 = EC040 9 = 882 1 = 020 4 = 060 7 = EC060 10 = 851 2 = 030 5 = EC030 8 = 881 combinations that make sense for now: 500, 600, 2000 OPT 020 1200, 4000/030 etc. OPT 020,881 2500, 3000, 1200/881, 4000/030/881, 4000/040 etc. +---------------------------------------------------------------+ | internal errors | +---------------------------------------------------------------+ [compilerpart,errornum,linenum,cookiesthrashed,pc_offset,...] compilerpart = [1..12] part of compiler in which error occured errornum = 0 error caused by own cookie-check = 1 for system guru (libraries etc.) = [2,3,4,5,...] processor guru (reboot advisable) = 100+ specific errors: 100 = lib opti failed 101 = libbase search fail 102 = no delegate offs at call 103 = beta module used (v1 .. v4) 104 = regalloc prob 105 = prep not empty line linenum = -1 if no lines were being processed = [0..] current linenum cookiesthrashed = #of cookies thrashed. reboot if >0 pc_offset = within EC +---------------------------------------------------------------+ | exception handling interna | +---------------------------------------------------------------+ global variables available after a HANDLE: code_return = PTR TO except_code (IF NIL THEN CleanUp()) stack_return = PTR TO base level of handler stack global variables available after an EXCEPT: exception = exception ID exceptioninfo = opt. attr value from Throw() scheme: PROC bla() HANDLE ** push [prev_stack,prev_code,a5] ** fill [code_return,stack_return] ** restore prev ** bra endproc EXCEPT (in Raise) -> restore prev -> close block? (prob when no EXCEPT?) ENDPROC +---------------------------------------------------------------+ | types and relations between them | +---------------------------------------------------------------+ only FOUR actual types exist in E: type: var: member: derived_types: PTR TO CHAR 1 1 ARRAY OF CHAR, STRING, LONG, <> PTR TO INT 2 2 ARRAY OF INT PTR TO LONG 4 4 ARRAY OF LONG, LIST PTR TO PTR 0 ARRAY OF , dependancies on usability: LONG INT/CHAR/LONG ARRAY STRING/LIST in declaration: * - * * * as PTR TO / ARRAY OF - * - - * a member - * 1 - * 1 = in restricted form, disguised as +---------------------------------------------------------------+ | label types | +---------------------------------------------------------------+ 0..9 system [1=main,5=initglob,6=initdel,7=pre?,8=post?] 10..numefuncs (255 alterable) E funcs (WriteF=10, Mul=11 etc.) numefuncs..x labels (proc+lab) x..y generated labels +---------------------------------------------------------------+ | inline assembler ea's | +---------------------------------------------------------------+ bit syntax mode reg 0 Dx 000 r 1 Ax 001 r 2 (Ax) 010 r 3 (Ax)+ 011 r 4 -(Ax) 100 r 5 off(Ax) 101 r 6 off(Ax,Rx.s) 110 7 4.W 111 000 8 4 111 001 9 lab(PC) 111 010 10 lab(PC,Rx.s) 111 011 11 #value 111 100 5 var 101 r r=4/5 5 libcall(A6) 101 r +---------------------------------------------------------------+ | inline assembler interim-codes | +---------------------------------------------------------------+ mnemonics = 1..112 + [$100,$200,$300]=[.B,.W..L] eamodi = 0..63 (6 bits ea) + $400 + ($100*bit) +---------------------------------------------------------------+ | inline assembler jobcodes | +---------------------------------------------------------------+ num func args:INT 1 not_implemented_yet 2 putsize bitoffset 3 putsize_move bitoffset 4 getea mask,offset 5 getea_move mask,offset 6 eat_comma 7 do_add_sub 8 do_moveq 9 do_addq_subq_imm 10 do_bcc 11 do_dbcc 12 put_addressreg offset 13 do_shift_asr_asl_lsr_lsl mem_opcode 14 put_datareg offset 15 do_bitins imm_opcode 16 size_a 17 size_e 18 do_xreg_abcd_subx 19 do_exg 20 do_cmpm 21 do_movem 22 do_trap 23 do_movep +---------------------------------------------------------------+ | inline assembler parsing | +---------------------------------------------------------------+ starts with: is: # imm D datareg A addressreg ( addr. indir., post inc. - pre decr. abs. long, abs. short, addr. verpl., addr. index, pc index rel pc, e_var, label, abs. long, abs. short +---------------------------------------------------------------+ | compile stack | +---------------------------------------------------------------+ stack frames used (id ALWAYS last!!!): id: construct: exit frame: (top..bottom) 1 PROC/ENDPROC id:INT 2 IF/ENDIF lab2, id:INT 3 WHILE/ENDWHILE * _lab_, jumpbacklab, id:INT 4 FOR/ENDFOR * jumbacklab, _lab_, step, var, id:INT 5 SELECT/CASE/ENDSELECT varoffs, lab, labend, id:INT 6 REPEAT/UNTIL jumbacklab, id:INT 7 LOOP/ENDLOOP id:INT 8 SELECT_OF has to become (ends with): FOR/WHILE/UNTIL: lab,jumpback,id +---------------------------------------------------------------+ | errors | +---------------------------------------------------------------+ [L]ex_parse, [C]ompile_parse, [D]os, [A]ddress_calc, [I]dentcheck, ... 0 L syntax 1 L unknown keyword/const/mnemonic 2 C := expected 3 L garbage in line 4 C label exp 5 C comma exp 6 C var exp 7 L LONG overflow 8 L missing ' 9 C block structure 10 D illegal commandline flag 11 C divmul 16bit only 12 C too many tokens in stat 13 C,A no main 14 C double label 15 C * or / with lowword = 0 16 D input source 17 D output exe/module 18 D no args 19 L,C illegal/unknown ea 20 L () structure 21 L double decl var 22 I undecl ident 23 C expecting () (wrong #of args) 24 L unknown E/Lib ident 25 C illegal funcall 26 L unknown formatting code 27 L error in /* */ 28 C INCBIN error 29 C } exp 30 C immediate val exp 31 C illegal size 32 C E used in OPT ASM-mode 33 C illegal type 34 C ] exp 35 C scope error 36 L MODULE read error 37 L,C workspace full 38 O allocmem fail 39 C object def 40 C object ref 41 C IF expr 42 C,L object ident unknown 43 L double object ident 44 A large model needed 45 A .S outof 256 bound 46 C too big expr ([]) / PROC-size / const-string-size 47 C handler def 48 C not allowed in module 49 C module only 50 C semantics error 51 M you need a newer compiler for this :-) 52 L [] structure sucks 53 Asm You need a better CPU/FPU for this 54 C object does not understand this method 55 C baseclass method <=> method #of args 56 C toomany regvars in function 57 LI linker can't find sym 58 D math lib 59 C illegal destructor def 60 C private member use/init 61 C double method 62 M object ptr not found 63 Prep unknown #keyword 64 Prep macrodef 65 Prep #if nesting 66 Prep macro double 67 Prep #if syntax 68 Prep macro nesting 69 C method def outside module 70 C libdef prob 71 C object not known at this point WARNINGS: bit 0 a4/a5 used 1 stack ? 2 stack ! 3 = assignment 4 hardware change because of opt in module 5 var proc call 6 code outside procs +---------------------------------------------------------------+ | REG_ALLOC factors | +---------------------------------------------------------------+ ... = weight factor spot, figures in (%) FOR ... ENDFOR 800 FOR ... DO ... 800 (idem for WHILE, LOOP, REPEAT) SELECT ... CASE ... ENDSELECT 1600 / 25 IF ... THEN ... ENDIF 100 / 50 PROC ... ENDPROC 100 (abs) +---------------------------------------------------------------+ | MODULE CACHE | +---------------------------------------------------------------+ naam: DC.B "EmoduleCache",0 OBJECT cache port:mp -> 0 cookie:LONG -> 34 modlist:PTR TO mod -> 38 debug:PTR TO debugdata -> 42 (only for use with EcDebug (tm)) lock:INT -> 46 [1=in_use] reserved:INT -> 48 portname[50]:ARRAY -> 50 ENDOBJECT -> SIZEOF cache = 100 OBJECT mod next:PTR TO mod -> 0 len:LONG -> 4 _all_inclusive_, +- 24+strlen+modlen+10 name:PTR TO STR -> 8 namelen:LONG -> 12 actual_len+1 module:PTR TO emodule -> 16 modulelen:LONG -> 20 checksum:LONG -> 24 reserved:LONG -> 28 data[...]:ARRAY -> 32 ENDOBJECT OBJECT debugdata objs:PTR TO PTR -> 0 pointer to real list-pointer procs:PTR TO PTR -> 4 identhash -> 8 dbugval -> 12, hex/dec value dbugadr -> 16, for dump modinfolist -> 20 codelist -> 24 ENDOBJECT +---------------------------------------------------------------+ | release/demoversion stuff | +---------------------------------------------------------------+ * large code model in ADDBRANCH deleted * check for 10000 codesize or so in compileloop [this part is checksummed by DOCHECKSUM called in SWAPVALUES: needs new checksum just before release!] do not forget for any dist: - announcement & readme! - exception catcher on 'INSTALLHANDLER' - demo version specifics 'DOCHECKSUM' - test on 68000, 1.3 etc. - own em: to modules dir - various other distros: beginner guide / EE - docs: all new features!!!