⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 virtual.h

📁 compiler
💻 H
字号:
/*@A (C) 1992 Allen I. Holub                                                */
#include <stdio.h>
#include <tools/debug.h>	/* For ANSI() and KnR() definitions.	*/
#undef SEG			/* Redefined in c-code.h.		*/
#undef P			/* Redefined below.			*/
#include <tools/c-code.h>

#ifdef __TURBOC__	/* If Borland/Turbo C, suppress warning caused   */
#pragma warn -rch	/* by unreachable code (mostly _T() invocations) */
#endif	 	/* that follow returns.				 */
#ifdef ALLOC
#    define I(x)  x
#    define CLASS /* empty */
#else
#    define I(x)  /* empty */
#    define CLASS extern
#endif
					/* Basic types		*/
typedef char  byte;			/* 8  bit 		*/
typedef short word;			/* 16 bit 		*/
typedef long  lword;			/* 32 bit 		*/
typedef char  *ptr;			/* Nominally 32 bit.	*/

typedef byte  array;			/* Aliases for "byte."	*/
typedef byte  record;


struct _words  { word	low, high; 	};
struct _bytes  { byte	b0, b1, b2, b3;	};	/* b0 is LSB, b3 is MSB */

typedef union reg
{
    char	   *pp;  	/* pointer 			*/
    lword   	   l;		/* long word			*/
    struct _words  w;		/* two 16-bit words     	*/
    struct _bytes  b;		/* four 8-bit bytes		*/
}
reg;

CLASS reg r0, r1, r2, r3, r4, r5, r6, r7 ;	/* Registers */
CLASS reg r8, r9, rA, rB, rC, rD, rE, rF ;

CLASS reg	stack[ SDEPTH ];		/* run-time stack */
CLASS reg	*__sp I(= &stack[ SDEPTH ]);	/* Stack pointer  */
CLASS reg	*__fp I(= &stack[ SDEPTH ]);	/* Frame pointer  */

#define fp	((char *) __fp)
#define sp	((char *) __sp)

#define SEG(segment)	/* empty */

#define public		/* empty */
#define common		/* empty */
#define private		static
#define external 	extern

#define	ALIGN(type)  /* empty */

#define W	* (word   *)
#define B	* (byte   *)
#define L	* (lword  *)
#define P	* (ptr    *)
#define WP	* (word  **)
#define BP	* (byte  **)
#define LP	* (lword **)
#define PP	* (ptr   **)

#define push(n)	        (--__sp)->l = (lword)(n)
#define pop(t)		(t)( (__sp++)->l )


#if ( 0 ANSI(+1) )
#define PROC(name,cls)	cls void name ( void ){
#else
#define PROC(name,cls)		cls name () {
#endif
#define ENDP(name)	_:ret();}			/* Name is ignored. */

#if ( 0  ANSI(+1) )
#define call(name)   ((--__sp)->pp = #name,        (*(void (*)(void))(name))())
#else
#define call(name) ((--__sp)->pp = "<ret addr>", (*(void (*)(    ))(name))())
#endif

#define ret()           __sp++; return
#define link(n)	  ((--__sp)->pp = (char *)__fp) , (__fp = __sp) , (__sp -= (n))

#define unlink()  (__sp = (reg *)__fp) , (__fp = (reg *)((__sp++)->pp))
#define lrs(x,n)   ((x) = ((unsigned long)(x) >> (n)))

#define ext_low(reg)	(reg.w.low  = (word )reg.b.b0	)
#define ext_high(reg)	(reg.w.high = (word )reg.b.b2	)
#define ext_word(reg)	(reg.l      = (lword)reg.w.low	)


#define EQ(a,b)		if( (long)(a) == (long)(b) )
#define NE(a,b)		if( (long)(a) != (long)(b) )
#define LT(a,b)		if( (long)(a) <  (long)(b) )
#define LE(a,b)		if( (long)(a) <= (long)(b) )
#define GT(a,b)		if( (long)(a) >  (long)(b) )
#define GE(a,b)		if( (long)(a) >= (long)(b) )

#define U_LT(a,b)	if( (unsigned long)(a) <  (unsigned long)(b) )
#define U_GT(a,b)	if( (unsigned long)(a) >  (unsigned long)(b) )
#define U_LE(a,b)	if( (unsigned long)(a) <= (unsigned long)(b) )
#define U_GE(a,b)	if( (unsigned long)(a) >= (unsigned long)(b) )

#define BIT(b,s)	if( (s) & (1 << (b)) )

#define  _main  main

ANSI( void pm(void); )
#ifdef ALLOC
void pm()
{
    reg *p;
    int i;

    /* Print the virtual machine (registers and top 16 stack elements). */

    printf("r0= %08lx  r1= %08lx  r2= %08lx  r3= %08lx\n",
	    r0.l,      r1.l,	  r2.l,	     r3.l 		);
    printf("r4= %08lx  r5= %08lx  r6= %08lx  r7= %08lx\n",
	    r4.l,      r5.l,	  r6.l,	     r7.l 		);
    printf("r8= %08lx  r9= %08lx  rA= %08lx  rB= %08lx\n",
	    r8.l,      r9.l,	  rA.l,	     rB.l 		);
    printf("rC= %08lx  rD= %08lx  rE= %08lx  rF= %08lx\n",
	    rC.l,      rD.l,	  rE.l,	     rF.l 		);

    if( __sp >= &stack[SDEPTH] )
	printf("Stack is empty\n");
    else
	printf("\nitem byte real addr   b3 b2 b1 b0      hi   lo          l\n");

    for( p = __sp, i=16; p < &stack[SDEPTH]  &&  --i>=0; ++p )
    {
	printf("%04d %04d %9p  [%02x|%02x|%02x|%02x] = [%04x|%04x] = [%08lx]",
	   p-__sp,             (p-__sp)*4,       MSC((void far *))p,
	   p->b.b3 & 0xff,     p->b.b2 & 0xff,   p->b.b1 & 0xff, p->b.b0 & 0xff,
	   p->w.high & 0xffff, p->w.low & 0xffff,
	   p->l
	);

	if( p == __sp ) printf("<-SP");
	if( p == __fp ) printf("<-FP");
	printf("\n");
    }
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -