98 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
# $Id$
 | 
						|
 | 
						|
This directory contains two programs:
 | 
						|
 | 
						|
mkswitch:
 | 
						|
	C program, necessary for regenerating the giant switch
 | 
						|
	needed for the disassembly function of the interpreter, 
 | 
						|
	which (still) works with Operand access method 2
 | 
						|
	(Intelligent Routines) as described in "The EM
 | 
						|
	interpreter".
 | 
						|
 | 
						|
mkiswitch:
 | 
						|
	C program, necessary for regenerating the giant switch
 | 
						|
	needed for finding the correct instruction handling routine 
 | 
						|
	for each opcode.  It works with Operand access method 3
 | 
						|
	(Intelligent Calls) as described in "The EM interpreter".
 | 
						|
	It constructs the operand of the instruction and passes
 | 
						|
	it to the appropriate routine with the operand as
 | 
						|
	argument.
 | 
						|
 | 
						|
The first program reads an input file which holds the interpreter
 | 
						|
opcode table (as shown in the [IR-81] report appendix B),
 | 
						|
and creates an output file which contains an enormous switch
 | 
						|
file.  This switch has entries for each possible opcode.  It's
 | 
						|
possible to supply a third filename, which is the name of file
 | 
						|
where all functions will be stored.  This is necessary if a new
 | 
						|
function implementation is needed.
 | 
						|
 | 
						|
The first argument to mkswitch is the prefix to be used in the
 | 
						|
generated function names.  For the interpreter proper this prefix
 | 
						|
is  Do.
 | 
						|
 | 
						|
The input file contains lines in the following format:
 | 
						|
 | 
						|
	Mnemonic Flags Count First-number
 | 
						|
 | 
						|
The created switch file will contain a switch, with each case
 | 
						|
having one of the following formats (? is the opcode):
 | 
						|
 | 
						|
	1) case ?: DoAz();
 | 
						|
	2) case ?: DoBm(val);
 | 
						|
	3) case ?: DoCs(hob, wsize);
 | 
						|
	4) case ?: DoDXY(wsize);
 | 
						|
 | 
						|
Ad 1)	This format shows that the corresponding opcode does not
 | 
						|
	have an argument.  Often the operand is popped from the
 | 
						|
	stack.
 | 
						|
 | 
						|
	e.g. DoNOPz(), this performs the NOP instruction.
 | 
						|
 | 
						|
Ad 2)	This is the format for a mini.  There is one implicit
 | 
						|
	argument (I) .
 | 
						|
 | 
						|
	e.g. DoLOCm(1), this is the LOC 1 instruction.
 | 
						|
 | 
						|
Ad 3)	This format corresponds with a shortie.  There is an implicit
 | 
						|
	argument (high order byte), and a one byte text argument
 | 
						|
	(low order byte).  W equals 'wsize' (if a word multiple),
 | 
						|
	otherwise it equals '1'.  H is the value of the high
 | 
						|
	order byte.
 | 
						|
 | 
						|
	e.g. DoLOEs(2, wsize), these are all LOE instructions,
 | 
						|
	with all addresses in the range:
 | 
						|
		(512 * wordsize) . . (767 * wordsize).
 | 
						|
	
 | 
						|
Ad 4)	This format is used for opcodes with 2 or more text arguments,
 | 
						|
	and no implicit arguments.  There are 6 types:
 | 
						|
 | 
						|
	XY = l2: two byte negative or positive text argument.
 | 
						|
	XY = n2: two byte negative text argument.
 | 
						|
	XY = p2: two byte positive text argument.
 | 
						|
	XY = l4: four byte negative or positive text argument.
 | 
						|
	XY = n4: four byte negative text argument.
 | 
						|
	XY = p4: four byte positive text argument.
 | 
						|
 | 
						|
	W equals 'wsize' (if a word multiple), otherwise it equals 1.
 | 
						|
 | 
						|
	e.g. DoLDLp2(wsize), these are all LDL instructions, with
 | 
						|
	negative local offsets, which are word multiples.
 | 
						|
 | 
						|
 | 
						|
When two file arguments are given to mkswitch (input file and output file),
 | 
						|
only the switch is generated.  If an additional third file name is
 | 
						|
given (another output file), this file is filled with all function
 | 
						|
calls in such a manner that mkfuncs will generate new function files.
 | 
						|
 | 
						|
Mkfuncs expects two arguments, an input file generated by
 | 
						|
mkswitch and the name of a directory where the new function
 | 
						|
files are stored.  These files (15) each represent one group (as
 | 
						|
proposed in [IR-81] sec 11.3) of instructions.  Each file will
 | 
						|
contain all functions needed to implement that specific group
 | 
						|
of instructions.  The functions will only contain a logging
 | 
						|
message, and a call to newPC() which is necessary to skip the
 | 
						|
arguments.  The names of the generated files are: do_XXX.c, where
 | 
						|
XXX is the name of the corresponding instruction group.
 | 
						|
 | 
						|
(Note: these remarks about mkfuncs are probably outdated now,
 | 
						|
since mkfuncs has disappeared. -rbf)
 |