229 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			229 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								divert(-1)  # do not output this trash to C
							 | 
						||
| 
								 | 
							
								# a macro to get the hd of a list
							 | 
						||
| 
								 | 
							
								define(m4_hd,`ifelse(index(`$1',`,'),-1,`substr(`$1',1,eval(len(`$1')-2))',dnl
							 | 
						||
| 
								 | 
							
								`substr(`$1',1,decr(index(`$1',`,')))')')
							 | 
						||
| 
								 | 
							
								# a macro to get the tail of a list
							 | 
						||
| 
								 | 
							
								define(m4_tl,`ifelse(index(`$1',`,'),-1,`',dnl
							 | 
						||
| 
								 | 
							
								`(substr(`$1',incr(index(`$1',`,')))')')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#macros to split a string
							 | 
						||
| 
								 | 
							
								define(substr_up_to,`substr($1,0,index($1,$2))')
							 | 
						||
| 
								 | 
							
								define(substr_after,`substr($1,incr(index($1,$2)))')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# a macro to iterate over members of a list
							 | 
						||
| 
								 | 
							
								define(`foreach',dnl
							 | 
						||
| 
								 | 
							
								`pushdef(`$1',m4_hd(`$2'))_foreach(`$1',m4_tl(`$2'),`$3')popdef(`$1')')
							 | 
						||
| 
								 | 
							
								define(`_foreach',`$3'`ifelse($2,`',,dnl
							 | 
						||
| 
								 | 
							
								`define(`$1',m4_hd($2))_foreach(`$1',m4_tl(`$2'),`$3')')')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define(`m4_rev',`ifelse($#,0,,$#,1,``$1'',`m4_rev(shift($@)),`$1'')')
							 | 
						||
| 
								 | 
							
								# same as above but backwards
							 | 
						||
| 
								 | 
							
								define(`foreachb',`foreach(`$1',(m4_rev$2),`$3')')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# macros to process an absmi definition
							 | 
						||
| 
								 | 
							
								define(defami, `define(`m4_i_of',m4_inst_size)'`define(`m4_ami_args',(shift($*)))'
							 | 
						||
| 
								 | 
							
								 `case _$1:ifelse($2,`',`',
							 | 
						||
| 
								 | 
							
								    `foreach(`argspec',(shift($*)),`m4_arg(substr_up_to(argspec,:),substr_after(argspec,:))')')m4_redef(InstructionSize,m4_i_of)')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define(endami,
							 | 
						||
| 
								 | 
							
								`foreach(`argspec',m4_ami_args,`m4_endami(substr_up_to(argspec,:))')'`#undef InstructionSize')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define(m4_endami,`ifelse($1,,,#undef $1
							 | 
						||
| 
								 | 
							
								)')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define(m4_arg,`m4_redef($1,(*(($2 *) (S_P+m4_i_of))))define(`m4_i_of',eval(m4_i_of+m4_$2_size))')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define(m4_redef,`
							 | 
						||
| 
								 | 
							
								`#define' $1 $2')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define a multiple push operation
							 | 
						||
| 
								 | 
							
								define(multiple_push,`define(`m4_i',eval($#-1))$1 -= m4_i foreach(`m4arg',(shift($*)),`m4_push1($1,`m4arg')')')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define(m4_push1,`define(`m4_i',eval(m4_i-1))ifelse(m4arg,dummy,,`;
							 | 
						||
| 
								 | 
							
									$1[m4_i] = (CELL) (m4arg) ')')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define(m4_n_args,`define(`m4_n',$#)')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define a multiple pop operation
							 | 
						||
| 
								 | 
							
								define(multiple_pop,`define(`m4_i',0)foreachb(`m4arg',(shift($*)),`m4_pop1($1)')$1 += m4_i')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define(multiple_restore,`define(`m4_i',0)foreachb(`m4arg',(shift($*)),`m4_restore1($1)')')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define(multiple_shorten,`define(`m4_i',-1)foreach(`m4arg',(shift($*)),`m4_shorten1($1)')')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define(m4_pop1,`ifelse(m4arg,dummy,,`m4arg = (m4typeof(m4arg)) ($1[m4_i]);
							 | 
						||
| 
								 | 
							
									')define(`m4_i',eval(m4_i+1))')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define(m4_restore1,`ifelse(m4arg,dummy,,`m4arg = (m4typeof(m4arg)) ($1[m4_i]);
							 | 
						||
| 
								 | 
							
									')define(`m4_i',eval(m4_i+1))')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define(m4_shorten1,`ifelse(m4arg,dummy,,`m4arg = (m4typeof(m4arg)) ($1[m4_i]);
							 | 
						||
| 
								 | 
							
									')define(`m4_i',eval(m4_i-1))')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define(m4typeof,`ifelse($1,S_N,int,$1,old_s,CELL,typeof($1))')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define(typeof,`ifelse($1,X,`int',$1,S_B->cp_ap,`CELL',$1,reading,`int',`CELL *')')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# these are machine dependent
							 | 
						||
| 
								 | 
							
								define(m4_reg_size,1)
							 | 
						||
| 
								 | 
							
								define(m4_small_size,1)
							 | 
						||
| 
								 | 
							
								define(m4_long_size,1)
							 | 
						||
| 
								 | 
							
								define(m4_inst_size,1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define(ShadowRegister,`
							 | 
						||
| 
								 | 
							
								define(shadow_$1)
							 | 
						||
| 
								 | 
							
								#define LoadShadow_$1	S_$1 = (m4typeof(S_$1)) $1;
							 | 
						||
| 
								 | 
							
								#define StoreShadow_$1  $1 = (m4typeof($1))S_$1;
							 | 
						||
| 
								 | 
							
								')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define(ShadowRegisterDeclarations,
							 | 
						||
| 
								 | 
							
								`ifdef(shadow_P,`    register char *S_P;
							 | 
						||
| 
								 | 
							
								',)'
							 | 
						||
| 
								 | 
							
								`ifdef(shadow_Y,`    register CELL *S_Y;
							 | 
						||
| 
								 | 
							
								',)
							 | 
						||
| 
								 | 
							
								')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define(DerefA, dnl (ptr,NonVarCase,VarCase) 
							 | 
						||
| 
								 | 
							
								``  {
							 | 
						||
| 
								 | 
							
									register CELL *VarValue = (CELL *)$1, NonVarValue;
							 | 
						||
| 
								 | 
							
									while(1) {
							 | 
						||
| 
								 | 
							
									   if(IsVarTerm(NonVarValue = *VarValue) ) {
							 | 
						||
| 
								 | 
							
									    	if(NonVarValue == (CELL) VarValue) {
							 | 
						||
| 
								 | 
							
											$3;
							 | 
						||
| 
								 | 
							
											break;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									    	VarValue = (CELL *) NonVarValue;
							 | 
						||
| 
								 | 
							
									   } else {
							 | 
						||
| 
								 | 
							
										$2;
							 | 
						||
| 
								 | 
							
								      		break;
							 | 
						||
| 
								 | 
							
									   }
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								    }'')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define(DerefD, dnl (data,NonVarCase,VarCase)
							 | 
						||
| 
								 | 
							
								  ``{	
							 | 
						||
| 
								 | 
							
									register CELL *VarValue, NonVarValue=(CELL) $1;
							 | 
						||
| 
								 | 
							
									while(1) {
							 | 
						||
| 
								 | 
							
									    if(IsVarTerm(NonVarValue)) {
							 | 
						||
| 
								 | 
							
									        NonVarValue = *(VarValue = (CELL *) NonVarValue);
							 | 
						||
| 
								 | 
							
									        if(NonVarValue == (CELL) VarValue) {
							 | 
						||
| 
								 | 
							
										  $3;
							 | 
						||
| 
								 | 
							
										  break;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									    } else {
							 | 
						||
| 
								 | 
							
										$2;
							 | 
						||
| 
								 | 
							
										break;
							 | 
						||
| 
								 | 
							
									    }
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								    }'')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define(DerefD1, dnl (data,NonVarCase,VarCase)
							 | 
						||
| 
								 | 
							
								``    {
							 | 
						||
| 
								 | 
							
									register CELL *VarValue1, NonVarValue1=(CELL) $1;
							 | 
						||
| 
								 | 
							
									while(1) {
							 | 
						||
| 
								 | 
							
									   if(IsVarTerm(NonVarValue1)) {
							 | 
						||
| 
								 | 
							
									     NonVarValue1 = *(VarValue1 = (CELL *) NonVarValue1);
							 | 
						||
| 
								 | 
							
									     if(NonVarValue1 == (CELL) VarValue1) {
							 | 
						||
| 
								 | 
							
										$3;
							 | 
						||
| 
								 | 
							
										break;
							 | 
						||
| 
								 | 
							
									      }
							 | 
						||
| 
								 | 
							
									   } else {
							 | 
						||
| 
								 | 
							
										$2;
							 | 
						||
| 
								 | 
							
										break;
							 | 
						||
| 
								 | 
							
									   }
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								    }'')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define(DerefI, dnl (data,NonVarCase,VarCase)
							 | 
						||
| 
								 | 
							
								  ``{	
							 | 
						||
| 
								 | 
							
									register CELL *VarValue;
							 | 
						||
| 
								 | 
							
									I_R=(CELL) $1;
							 | 
						||
| 
								 | 
							
									while(1) {
							 | 
						||
| 
								 | 
							
									  if(IsVarTerm(I_R)) {
							 | 
						||
| 
								 | 
							
									    	I_R = *(VarValue = (CELL *) I_R);
							 | 
						||
| 
								 | 
							
									    	if(I_R == (CELL) VarValue) {
							 | 
						||
| 
								 | 
							
											$3;
							 | 
						||
| 
								 | 
							
											break;
							 | 
						||
| 
								 | 
							
									    	}
							 | 
						||
| 
								 | 
							
									   }
							 | 
						||
| 
								 | 
							
									  else { $2; break; }
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								    }'')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								divert
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define Y YENV
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define shadow_all() \
							 | 
						||
| 
								 | 
							
									TestCount = 0; \
							 | 
						||
| 
								 | 
							
									LoadShadow_P; \
							 | 
						||
| 
								 | 
							
									LoadShadow_Y; \
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define unshadow_all() \
							 | 
						||
| 
								 | 
							
									StoreShadow_P; \
							 | 
						||
| 
								 | 
							
									StoreShadow_Y;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef LoadShadow_CP
							 | 
						||
| 
								 | 
							
								#define S_CP CP
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef LoadShadow_ENV
							 | 
						||
| 
								 | 
							
								#define S_ENV ENV
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef LoadShadow_B
							 | 
						||
| 
								 | 
							
								#define S_B B
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef LoadShadow_H
							 | 
						||
| 
								 | 
							
								#define S_H H
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef LoadShadow_TR
							 | 
						||
| 
								 | 
							
								#define S_TR TR
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef LoadShadow_N
							 | 
						||
| 
								 | 
							
								#define S_N N
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef LoadShadow_BH
							 | 
						||
| 
								 | 
							
								#define LoadShadow_BH(X) HB = (CELL *) X
							 | 
						||
| 
								 | 
							
								#define S_BH  HB
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef LoadShadow_S
							 | 
						||
| 
								 | 
							
								#define LoadShadow_S()
							 | 
						||
| 
								 | 
							
								#define S_S	S
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef LoadShadow_P
							 | 
						||
| 
								 | 
							
								#define S_P	P
							 | 
						||
| 
								 | 
							
								#define	LoadShadow_P
							 | 
						||
| 
								 | 
							
								#define StoreShadow_P
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef LoadShadow_Y
							 | 
						||
| 
								 | 
							
								#define S_Y	Y
							 | 
						||
| 
								 | 
							
								#define	LoadShadow_Y
							 | 
						||
| 
								 | 
							
								#define StoreShadow_Y	
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define CHECK(B) if(--TestCount <= 0) { TestCount=10; B }
							 | 
						||
| 
								 | 
							
								#define ENSURECHECK() TestCount=1
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define small Int
							 | 
						||
| 
								 | 
							
								#define reg   Int
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 |