+---------------------------------------------------------------+
|	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		<empty>
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 <object>
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/<obj>
extra: PTRTO/ARRAYOF INT/CHAR/LONG/<obj>

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 <n>
12	as [9], for 6
13	as [9], for 8
14	as [9], for 10
15	pop lab, define lab {6}
16	make <exp> 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 <n>+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 <exp>
61	version of [2] for IF <exp> 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 <object>
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=<size>	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=<ver>	v33	kick <ver>
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]
<exp>				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:

<no_opt>	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
  <defs>
  ** push [prev_stack,prev_code,a5]
  ** fill [code_return,stack_return]
  <body>
  ** restore prev
  ** bra endproc
EXCEPT
  (in Raise) -> restore prev
  <e_body>
  -> 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 <object>		PTR	0	ARRAY OF <object>, <object>

dependancies on usability:

			LONG	INT/CHAR/LONG	ARRAY	STRING/LIST	<obj>

in declaration:		*	-		*	*		*
as PTR TO / ARRAY OF	-	*		-	-		*
a member		-	*		1	-		*

1 = in restricted form, disguised as <object>


+---------------------------------------------------------------+
|	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.
<num>		abs. long, abs. short, addr. verpl., addr. index, pc index
<ident>		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!!!
