*******************************************************************************
		PART 3   			(EMS,XMS)

				(2) XMS

				Takehito.Noda

           @̃y[WɊւ銴z͈ȉ̃AhXւ肢܂

                        YQL06220@niftyserve.or.jp

					Ver 1.00 : 1998/03/02(Mon) 13:17:20

*******************************************************************************

@XMSƂ́A

@XMŚAEMSƓlɁA1MByteȏ̋Ԃɂ郁DOSvO爵߂̎dg݂łB1MByteȏ̋Ԃɂ郁gƌ܂B
@XMSfoCXhCo͂̊g܂߂Ĉȉ̂R̃Rg[ׂ̋@\Ă܂B

(1) HMA(nC̈)

@HMAg̍ŏ64KBytełB̗̈CPUA[hœ쒆ɂ̂݃ANZX\łB܂̗̈ŃR[hs邱ƂłB
@̗̈̑傫64KByte - 16 BytełAJnAhXFFFF:0010hIAhXFFFF:FFFFh܂łɂB

(2) UMB(Abp[ubN)

@̗̈́ADOS640K1MB̋E̊ԂɔzûłB̗̈̓}VɃCXg[ꂽn[h̃A_v^J[h̎ނɂāA̐A傫ÃubN̔zu͕LςB

(3) EMB(gubN)

@HMAɔzuꂽA܂肢veNgƂ̂łB
@̗̈̓f[^̊i[ɂ̂ݎgp邱Ƃł܂B
@ʂɁAXMSt@NV̗͂̈̑ړIɂ܂B

@ȏ3ΏۂƂȂ郁̎ނłB
@āAEMSƂ̈ႢmĂ܂傤B
@XMS̓]t@NVgpāADOSveNg𑀍삵܂B@̂߁Af[^̊i[Aǂ݂̂߂ɖA]邱ƂɂȂ܂B
@̂߂̃X܂AEMSƂ͈ăy[WEɔY܂邱Ƃ͂ȂȂ܂B

 A20 Line

@80x86 CPU21Ԗڂ̃AhXBA20HMAɃANZX邱Ƃł邱ƂłB
 

@āAp̉񂾂ƂŁAt@NV̐Ɉڂ肽Ǝv܂B
@̑OɁAXMShCo풓Ă邱ƂmFĂĂB

===============================================================================
@XMSt@NV
===============================================================================

	yXMS֘A@INT CALLꗗz

		0x4300	XMShCȏ݊mF
	荞	INT	0x2F
			AH	0x43
			AL	0x00
	o		AL	Xe[^XR[h
				0x80	XMShCo݂
				!=0x80	XMShCo݂Ȃ
			XMShCo풓Ă邩mF܂B
			XMShCo풓Ă΁A0x80ԂĂ܂B

		0x4310	XMSt@NVR[AhX擾
	荞	INT	0x2F
			AH	0x43
			AL	0x10
	o		ES:BX	XMSt@NVR[AhX
			XMSt@NVR[AhX擾܂B
			XMSt@NV͂̃AhXFAR CALL邱Ƃɂ
			čs܂Biڂ͉̎ۂ̐菇̍ڎQƁj
	yXMSt@NVR[ꗗz

@t@NV:

        1. hCoo[WmF                       (0x00)
        2. HMA Rg[֘A                  (0x01 - 0x02)
        3. A20 Rg[֘A                  (0x03 - 0x07)
        4. EMB Rg[֘A                  (0x08 - 0x0F)
        5. UMB Rg[֘A                  (0x10 - 0x11)

	ȂAG[ꍇ́ABLɃG[R[hi[܂B
	ꗗ͉̍ڂQƂĂB

 @hCoo[WmF

		0x00	XMSo[W擾
			AH	0x00
	o		AH	XMShCõo[Wԍij
			AL	XMShCõo[Wԍij
			BH	XMShCõrWԍij
			BL	XMShCõrWԍij
			DX	HMȂݔ
				0	:	HMAȂ
				1	:	HMA
			XMShCõo[WArWԍ擾܂B
			킹āAHMÅmFs܂B

 @HMA Rg[֘A

		0x01	HMA̗v
			AH	0x01
			DX	HMA̕KvoCg
			   [ĂяoƂTSR or foCXhCȍꍇ]
				DX = ĂяoƂKvȃTCY
			   [ĂяoƂAvP[V̏ꍇ]
				DX = 0xFFFF
	o		AX	荇ĊmF
				0	:	蓖Ďs
				1	:	蓖Đ
			BL	G[R[h(G[R[hꗗQ)
			HAM̊蓖Ăs܂B

		0x02	HMẢ
			AH	0x02
	o		AX	mF
				0	:	s
				1	:	
			BL	G[R[h(G[R[hꗗQ)
			HAM̉s܂B

 @A20 Rg[֘A

		0x03	A20̃O[oȗL
			AH	0x03
	o		AX	LmF
				0	:	Ls
				1	:	L
			BL	G[R[h(G[R[hꗗQ)
			A20L܂B

		0x04	A20̃O[oȖ
			AH	0x04
	o		AX	mF
				0	:	s
				1	:	
			BL	G[R[h(G[R[hꗗQ)
			A20𖳌܂B

		0x05	A20̃[JȗL
			AH	0x05
	o		AX	LmF
				0	:	Ls
				1	:	L
			BL	G[R[h(G[R[hꗗQ)
			A20L܂B

		0x06	A20̃[JȖ
			AH	0x06
	o		AX	mF
				0	:	s
				1	:	
			BL	G[R[h(G[R[hꗗQ)
			A20𖳌܂B

		0x07	A20̏ԏ
			AH	0x07
	o		AX	
				0	:	A20͖
				1	:	A20͗L
			BL	G[R[h(G[R[hꗗQ)
			A20̏Ԃ擾܂B

 @EMB Rg[֘A

		0x08	EMB 󂫃TCY擾
			AH	0x08
	o		AX	EMB̍ő󂫃̃TCY
			DX	EMB̋󂫃̃TCY
			BL	G[R[h(G[R[hꗗQ)
			EMB̋󂫃TCY擾܂B

		0x09	EMB 蓖
			AH	0x09
			DX	蓖ĂEMB̃TCY(1KByteP)
	o		AX	蓖ĊmF
				0	:	蓖Ďs
				1	:	蓖Đ
			BL	G[R[h(G[R[hꗗQ)
			DX	蓖ăubÑnh
			EMB̃TCY蓖Ă܂Bimۂ܂j

		0x0A	EMB  
			AH	0x0A
			DX	ubÑnh
	o		AX	mF
				0	:	s
				1	:	
			BL	G[R[h(G[R[hꗗQ)
			EMB̉s܂B

		0x0B	EMB ubN]
			AH	0x0B
			DS:SI	]i[AhX
	o		AX	]mF
				0	:	]s
				1	:	]
			BL	G[R[h(G[R[hꗗQ)
			EMB̃ubN]s܂B̓]ׂ̈ɕKvȏ
			͈ȉ̃ubN̏ԂŋLqāÃt@NV
			n܂B
			
			0x0000	+--------------------------------+
				| ]f[^̃TCY(4Byte)  |
			0x0004	+--------------------------------+
				| ]̃nh      (2Byte)  |
			0x0006	+--------------------------------+
				| ]̃ItZbg    (4Byte)  |
			0x000A	+--------------------------------+
				| ]̃nh      (2Byte)  |
			0x000C	+--------------------------------+
				| ]̃ItZbg    (4Byte)  |
			0x0010	+--------------------------------+

				@]ubN

			
				ΏۂRxVi̎̓nh
				0ƂȂ܂B
				AhX̕WL@FARƓłB
				܂A
					SEGMENT : OFFSET ƂłB

		0x0C	EMB ̃bN
			AH	0x0C
			DX	bNEMBnh
	o		AX	bNmF
				0	:	bNs
				1	:	bN
			BL	G[R[h(G[R[hꗗQ)
			w肵nhbN܂B

		0x0D	EMB ̃AbN
			AH	0x0D
			DX	AbNEMBnh
	o		AX	AbNmF
				0	:	AbNs
				1	:	AbN
			BL	G[R[h(G[R[hꗗQ)
			w肵nhAbN܂B

		0x0E	EMBnh̎擾
			AH	0x0E
			DX	EMBnh
	o		AX	̎擾mF
				0	:	̎擾s
				1	:	̎擾
			BH	EMB̃bNJEg
			BL	EMB̋󂫃nh
			DX	EMB̃TCY
			w肵nh̏擾܂B

		0x0F	EMB ̍Ċ蓖
			AH	0x0F
			BX	Ċ蓖ĂEMB̃TCY
			DX	Ċ蓖ĂEMBnh
	o		AX	Ċ蓖ĊmF
				0	:	Ċ蓖Ďs
				1	:	Ċ蓖Đ
			BL	G[R[h(G[R[hꗗQ)
			w肵EMB̃TCYύX܂B

 @UMB Rg[֘A

		0x10	UMB ̊蓖
			AH	0x10
			DX	蓖ĂUMB̃TCY(pOtP)
	o		AX	蓖ĊmF
				0	:	蓖Ďs
				1	:	蓖Đ
			BX	UMB̃ZOg
			UMB蓖Ă܂B

		0x11	UMB ̉
			AH	0x11
			DX	UMB̃ZOg
	o		AX	mF
				0	:	s
				1	:	
			UMB܂B

		0x12	UMB ̍Ċ蓖
			AH	0x12
			BX	Ċ蓖ĂUMB̃TCY
			DX	UMB̃ZOg
	o		AX	Ċ蓖ĊmF
				0	:	Ċ蓖Ďs
				1	:	Ċ蓖Đ
			UMBmۂ܂B

	yG[R[hꗗz
									
	+----------+----------------------------------------------------+
	|Error Code|	@\						|
	+----------+----------------------------------------------------+
   BL = |0x80      |t@NV܂				|
        |0x81      |VDISKfoCXgpĂ܂			|
        |0x82      |A20G[					|
        |0x8E      |XMShCoG[				|
        |0x8F      |񕜕s\XMShCoG[			|
        |0x90      |HMA݂܂					|
        |0x91      |HMAłɗpĂ܂				|
        |0x92      |HMÄ̗悪vTCY			|
        |0x93      |HMA蓖ĂȂ	 			|
        |0x94      |A20Cl[uԂɂ܂			|
        |0xA0      |gp\EMBׂĊ蓖ĂĂ܂		|
        |0xA1      |SĂEMBnhgp				|
        |0xA2      |nhs					|
        |0xA3      |]̃nhs				|
        |0xA4      |]̃ItZbgs				|
        |0xA5      |]̃nhs				|
        |0xA6      |]̃ItZbgs				|
        |0xA7      |s						|
        |0xA8      |sȃI[o[bv				|
        |0xA9      |peBG[					|
        |0xAA      |EMBubNbNĂȂ			|
        |0xAB      |EMBubNbNĂ			|
        |0xAC      |EMBubÑbNJE^I[o[t[		|
        |0xAD      |EMBubÑbNɎs				|
        |0xB0      |wTCY菬UMBgp\			|
        |0xB1      |gp\UMB݂Ȃ				|
        |0xB2      |UMB̃ZOgls				|
	+----------+----------------------------------------------------+

===============================================================================
@ۂ̐菇
===============================================================================

@XMS̃t@NV͒ʏ̃t@NVR[Ƃ͊gp@邽߁A኱̒ӂ͂炤Kv܂B
@́At@NV̎sFAR CALLōsƂ_łB
@āAł͏ǂđ삵ĂĂ݂܂傤B

	1,XMShCȍ풓mF

@hCogđ삷̂ŁARhCȍ풓mFKv܂B
@̓t@NVR[pĊmFł̂ŁArIȒPłB
@gpt@NV́A

  Int0x2F : AH = 0x43 : AL = 0x00	(ڍׂ͏Q)

								łB

@̃R[ŊȒPɊmF邱Ƃł܂B

	2,XMSt@NVAhX̎擾

@ɁAXMSt@NVs邽߂ɕKvȃR[AhX擾܂B
@ȌAt@NV̎s͑SẴAhXFAR CALL邱Ƃōs܂B

@ł́A܂ł̉ߒȒPȃTvŋL܂B

Ex)(C)

/* XMSt@NVR[AhX */
unsigned long XMSFuncCallAddress;

/* XMS hCo풓mF */	/* ܂܂CCASMg܂B܂*/
unsigned char XMSDriverCheck(void)
{
unsigned char Status;

	_asm{
		mov	ax,4300h
		int	2fh
		mov	Status,al
	}
	return Status;
}
/* XMSt@NVR[AhX擾 */
/* XMS Function Call Adress Get */
void XMSFuncCallAddGet(void)
{
	/* O[oϐ : XMSFuncCallAddress ɃAhX */
	_asm{
		mov	ax,4310h
		int	2fh
		mov	word ptr [XMSFuncCallAddress],bx
		mov	word ptr [XMSFuncCallAddress+2],es
	}
}

	3,XMShCõo[WmF

@悤AXMShCõo[WmFĂ܂傤B̎XMS3.0Ƃɂč̂ŁAR3.0ȏ̃o[WłȂƍ܂ˁBƂ킯ŁAɂ܂t@NVA

  AH = 0x00 :  					(ڍׂ͏Q)

							ōs܂B

Ex)(C)

/* XMS hCoo[W擾mF */
/* o[W͐8BitA8Bitł邩璍 */
unsigned int XMSDriverVersionCheck(void)
{
unsigned int Version;

	_asm{
		mov	ah,00h
		call	dword ptr [XMSFuncCallAddress]
		mov	Version,ax
	}
	return Version;
}

	4,XMSubN̊m

@āAgɂ́AǂȎނ̃̏ꍇłAmۂȂƂ܂ˁB̏Ȃ܂B
@st@NV

  AH = 0x09 : DX = 蓖ĂEMB̃TCY(1KByteP)	(ڍׂ͏Q)

@łB
@ŕԂnh͍mۂubÑANZX̎̌ɂȂ̂ł̂ŁAۑĂKv܂B

	5ubNƃRxViԂ̓]s

@ŁA͊܂BƂ͎głÃt@NV̓p[^ubNŎ󂯓n܂BłÃp[^̈ӖԈႦȂ悤ɒӂĂB

  AH = 0x0B : DS:SI	]i[AhX	(ڍׂ͏Q)

ł́A܂ł̕ȒPɃTv܂傤B

Ex)(C)

/* EMB Memory 蓖Ă */
unsigned int XMSGet(void)
{
unsigned char Status,Handle;

	/* EMB 蓖ăt@NVR[ */
	_asm{
		mov	ah,9
		mov	dx,5		/* 5KByte蓖 */
		call	dword ptr [XMSFuncCallAddress]
		mov	Status,ax
		mov	Handle,dx
	}
	if(Status != 1){
		printf("EMB̊蓖ĂɎs\n");
		exit(-1);
	}else{
		printf("EMB̊蓖Ăɐ\n");
	}
	return Handle;
}
/* ԓ]s */
unsigned int XMSTransConvenToEMB(unsigned int Handle)
{
unsigned int Status,DataSeg,DataOff;
struct XMSTrans Data;
struct SREGS segregs;

	/* p[^ubÑZbg */
	Data.Length  = 4000;
	Data.OriginHandle = 0;			/* RxVi */
	Data.OriginOffset = 0xa0000000L;	/* TVRAM AhX */
	Data.CatchHandle  = Handle;		/* EMB nhw */
	Data.CatchOffset  = 0;			/* EMB ItZbgw */
	/* ݂DS 擾 (Small Model Only)*/
	segread(&segregs);
	DataSeg = segregs.ds;
	DataOff = (unsigned int)&Data;		/* ނAhX𓾂 */
	/* ]t@NVǂ݂ */
	_asm{
		mov	ah,0bh
		mov	ds,DataSeg
		mov	si,DataOff
		call	dword ptr [XMSFuncCallAddress]
		mov	Status,ax
	}
	return Status;
}
 iTv̗ႪASĂł͂܂B炸j

	6,gp̊J

@ăvOŎgṕAȊOɊJĒuƂAVłˁB
@Ƃ́AȂƎg郁̗ʂĂ܂Ă܂܂B

  AH = 0x0A : DX = nh			(ڍׂ͏Q)

/* EMB Memory  */
unsigned int XMSFree(unsigned int Handle)
{
unsigned int Status;

	/* EMB t@NVǂ݂ */
	_asm{
		mov	dx,Handle
		mov	ah,0ah
		call	dword ptr [XMSFuncCallAddress]
		mov	Status,ax
	}
	return Status;
}

@ŁAIłB쎩̂EMSȒPłB
@A̓ǂݏ̓|C^iAhXj𗝉ĂȂlɂ͊댯łAӂĂB
@荂xȏ]ޕ͑̎QlɂĂB
@ȏ̃Tv܂߂bvO𓯕Ă܂̂ŁAQlɂĂB
@T|[g@

@̃eLXĝႤƂ܂AЋĂB
@܂A͂̃X^CA{̃~XȂǂ܂AȂĂB
@tɁA̋LɍڂĂȂƂɕtĂ̎܂AЋĂBɗǂ̂ڎw܂̂ŁA肢܂B

@Ql@

@PC-9801 vO}[YBiBle	ȑEIC/	Zp]_
				 XMS

@eXtended Memory Specification (XMS), ver 3.0
				Copyright (c) 1988, Microsoft Corporation



