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

📄 x16.h

📁 著名操作系统Plan 9的第三版的部分核心源代码。现在很难找到了。Plan 9是bell实验室开发的Unix后继者。
💻 H
字号:
/* * Can't write 16-bit code for 8a without getting into * lots of bother, so define some simple commands and * output the code directly. *  * N.B. CALL(x) kills DI, so don't expect it to be * saved across calls. */#define rAX		0		/* rX  */#define rCX		1#define rDX		2#define rBX		3#define rSP		4		/* SP */#define rBP		5		/* BP */#define rSI		6		/* SI */#define rDI		7		/* DI */#define rAL		0		/* rL  */#define rCL		1#define rDL		2#define rBL		3#define rAH		4		/* rH */#define rCH		5#define rDH		6#define rBH		7#define rES		0		/* rS */#define rCS		1#define rSS		2#define rDS		3#define rFS		4#define rGS		5#define xSI		4		/* rI (index) */#define xDI		5#define xBP		6#define xBX		7#define rCR0		0		/* rC */#define rCR2		2#define rCR3		3#define rCR4		4#define OP(o, m, ro, rm)	BYTE $o;	/* op + modr/m byte */	\			BYTE $(((m)<<6)|((ro)<<3)|(rm))#define OPrm(o, r, m)	OP(o, 0x00, r, 0x06);	/* general r <-> m */	\			WORD $m;#define OPrr(o, r0, r1)	OP(o, 0x03, r0, r1);	/* general r -> r */#define LW(m, rX)	OPrm(0x8B, rX, m)	/* m -> rX */#define LXW(x, rI, r)	OP(0x8B, 0x02, r, rI);	/* x(rI) -> r */	\			WORD $x#define LBPW(x, r)	OP(0x8B, 0x02, r, xBP);	/* x(rBP) -> r */	\			WORD $x#define LB(m, rB)	OPrm(0x8A, rB, m)	/* m -> r[HL] */#define LXB(x, rI, r)	OP(0x8A, 0x01, r, rI);	/* x(rI) -> r */	\			BYTE $x#define LBPB(x, r)	OP(0x8A, 0x01, r, xBP);	/* x(rBP) -> r */	\			BYTE $x#define SW(rX, m)	OPrm(0x89, rX, m)	/* rX -> m */#define SXW(r, x, rI)	OP(0x89, 0x02, r, rI);	/* r -> x(rI) */	\			WORD $x#define SBPW(r, x)	OP(0x89, 0x02, r, xBP);	/* r -> x(rBP) */	\			WORD $(x)#define SBPWI(i, x)	OP(0xC7, 0x01, 0, xBP);	/* i -> x(rBP) */	\			BYTE $(x); WORD $(i)#define STB(rB, m)	OPrm(0x88, rB, m)	/* rB -> m */#define SXB(r, x, rI)	OP(0x88, 0x01, r, rI);	/* rB -> x(rI) */	\			BYTE $x#define SBPB(r, x)	OP(0x88, 0x01, r, xBP);	/* r -> x(rBP) */	\			BYTE $x#define SBPBI(i, x)	OP(0xC6, 0x01, 0, xBP);	/* i -> x(rBP) */	\			BYTE $(x); BYTE $(i)#define LWI(i, rX)	BYTE $(0xB8+rX);	/* i -> rX */		\			WORD $i;#define LBI(i, rB)	BYTE $(0xB0+rB);	/* i -> r[HL] */	\			BYTE $i#define MW(r0, r1)	OPrr(0x89, r0, r1)	/* r0 -> r1 */#define MFSR(rS, rX)	OPrr(0x8C, rS, rX)	/* rS -> rX */#define MTSR(rX, rS)	OPrr(0x8E, rS, rX)	/* rX -> rS */#define MFCR(rC, rX)	BYTE $0x0F;		/* rC -> rX */		\			OP(0x20, 0x03, rC, rX)#define MTCR(rX, rC)	BYTE $0x0F;		/* rX -> rC */		\			OP(0x22, 0x03, rC, rX)#define ADC(r0, r1)	OPrr(0x11, r0, r1)	/* r0 + r1 -> r1 */#define ADD(r0, r1)	OPrr(0x01, r0, r1)	/* r0 + r1 -> r1 */#define ADDI(i, r)	OP(0x81, 0x03, 0x00, r);/* i+r -> r */		\			WORD $i;#define AND(r0, r1)	OPrr(0x21, r0, r1)	/* r0&r1 -> r1 */#define ANDI(i, r)	OP(0x81, 0x03, 0x04, r);/* i&r -> r */		\			WORD $i;#define CLR(r)		OPrr(0x31, r, r)	/* r^r -> r */#define CLRB(r)		OPrr(0x30, r, r)	/* r^r -> r */#define CMP(r0, r1)	OPrr(0x39, r0, r1)	/* r1-r0 -> flags */#define CMPI(i, r)	OP(0x81, 0x03, 0x07, r);/* r-i -> flags */	\			WORD $i;#define CMPB(r0, r1)	OPrr(0x38, r0, r1)	/* r1-r0 -> flags */#define DEC(r)		BYTE $(0x48|r)		/* r-1 -> r */#define DIV(r)		OPrr(0xF7, 0x06, r)	/* rDX:rAX/r -> rAX, rDX:rAX%r -> rDX */#define INC(r)		BYTE $(0x40|r)		/* r+1 -> r */#define MUL(r)		OPrr(0xF7, 0x04, r)	/* r*rAX -> rDX:rAX */#define IMUL(r0, r1)	BYTE $0x0F;		/* r0*r1 -> r1 */	\			OPrr(0xAF, r1, r0)	/* (signed) */#define OR(r0, r1)	OPrr(0x09, r0, r1)	/* r0|r1 -> r1 */#define ORB(r0, r1)	OPrr(0x08, r0, r1)	/* r0|r1 -> r1 */#define ORI(i, r)	OP(0x81, 0x03, 0x01, r);/* i|r -> r */		\			WORD $i;#define ROLI(i, r)	OPrr(0xC1, 0x00, r);	/* r<<>>i -> r */	\			BYTE $i;#define SHLI(i, r)	OPrr(0xC1, 0x04, r);	/* r<<i -> r */		\			BYTE $i;#define SHLBI(i, r)	OPrr(0xC0, 0x04, r);	/* r<<i -> r */		\			BYTE $i;#define SHRI(i, r)	OPrr(0xC1, 0x05, r);	/* r>>i -> r */		\			BYTE $i;#define SHRBI(i, r)	OPrr(0xC0, 0x05, r);	/* r>>i -> r */		\			BYTE $i;#define SUB(r0, r1)	OPrr(0x29, r0, r1)	/* r1-r0 -> r1 */#define SUBI(i, r)	OP(0x81, 0x03, 0x05, r);/* r-i -> r */		\			WORD $i;#define CALL(f)		LWI(f, rDI);		/* &f -> rDI */		\			BYTE $0xFF;		/* (*rDI) */		\			BYTE $0xD7;#define FARJUMP16(s, o)	BYTE $0xEA;		/* jump to ptr16:16 */	\			WORD $o; WORD $s#define FARJUMP32(s, o)	BYTE $0x66;		/* jump to ptr32:16 */	\			BYTE $0xEA; LONG $o; WORD $s#define	DELAY		BYTE $0xEB;		/* jmp .+2 */		\			BYTE $0x00#define SYSCALL(b)	INT $b			/* INT $b */#define PEEKW		BYTE $0x26;		/* MOVW	rES:[rBX], rAX  */	\			BYTE $0x8B; BYTE $0x07#define POKEW		BYTE $0x26;		/* MOVW	rAX, rES:[rBX] */	\			BYTE $0x89; BYTE $0x07#define OUTPORTB(p, d)	LBI(d, rAL);		/* d -> I/O port p */	\			BYTE $0xE6;					\			BYTE $p; DELAY#define PUSHA		BYTE $0x60#define PUSHR(r)	BYTE $(0x50|r)		/* r  -> (--rSP) */#define PUSHS(rS)	BYTE $(0x06|((rS)<<3))	/* rS  -> (--rSP) */#define PUSHI(i)	BYTE $0x68; WORD $i;	/* i -> --(rSP) */#define POPA		BYTE $0x61#define POPR(r)		BYTE $(0x58|r)		/* (rSP++) -> r */#define POPS(rS)	BYTE $$(0x07|((rS)<<3))	/* (rSP++) -> r */#define NOP		BYTE $0x90		/* nop *//* * Some MMU stuff. */#define SELGDT		(0<<3)			/* selector is in gdt */#define	SELLDT		(1<<3)			/* selector is in ldt */#define SELECTOR(i, t, p)	(((i)<<3) | (t) | (p))#define LGDT(gdtptr)	BYTE $0x0F;		/* LGDT */			\			BYTE $0x01; BYTE $0x16;					\			WORD $gdtptr#define SEGDATA	(0x10<<8)	/* data/stack segment */#define SEGEXEC	(0x18<<8)	/* executable segment */#define	SEGTSS	(0x9<<8)	/* TSS segment */#define SEGCG	(0x0C<<8)	/* call gate */#define	SEGIG	(0x0E<<8)	/* interrupt gate */#define SEGTG	(0x0F<<8)	/* task gate */#define SEGTYPE	(0x1F<<8)#define SEGP	(1<<15)		/* segment present */#define SEGPL(x) ((x)<<13)	/* priority level */#define SEGB	(1<<22)		/* granularity 1==4k (for expand-down) */#define SEGG	(1<<23)		/* granularity 1==4k (for other) */#define SEGE	(1<<10)		/* expand down */#define SEGW	(1<<9)		/* writable (for data/stack) */#define	SEGR	(1<<9)		/* readable (for code) */#define SEGD	(1<<22)		/* default 1==32bit (for code) */#define KZERO	0x80000000

⌨️ 快捷键说明

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