short cut to ... [main] [news] [forum] [download] [Hall of Fame] [game] [cg] [link]

SYSINIT²òÀÏ
-------------------------------------------------------------------------------
¾ïÃó¤·¤¿SYSINITÆâ¤Ë¤¢¤ë¾ðÊó
-------------------------------------------------------------------------------
  ¾ïÃó¤·¤¿SYSINITÆâ¤Ë¤¢¤ë¾ðÊó

  offset 0x0118 : (8byte) "TOWNS   " (¸ÇÄê)
  offset 0x0120 : (dword) ¥Ç¡¼¥¿¥â¥¸¥å¡¼¥ë¥ê¥¹¥È¤Î¥¢¥É¥ì¥¹
  offset 0x0124 : (dword) ¥Ç¡¼¥¿¥â¥¸¥å¡¼¥ëÎΰ賫»Ï¥¢¥É¥ì¥¹
  offset 0x0128 : (dword) ³ÈÄ¥¥á¥â¥ê̤³ä¤êÅö¤ÆÎΰ賫»Ï¥¢¥É¥ì¥¹
                          (¥Ç¡¼¥¿¥â¥¸¥å¡¼¥ëÎΰ轪λ¥¢¥É¥ì¥¹¡Ü£±)

¡¡£Ò£Á£Í¾å¤Î¥Ç¡¼¥¿¥â¥¸¥å¡¼¥ë¤Ë¤Ï¥»¥ì¥¯¥¿ 0x40 ¤ò·Ðͳ¤·¤Æ¥¢¥¯¥»¥¹²Äǽ¡£


¡¦¥Ç¡¼¥¿¥â¥¸¥å¡¼¥ë¥ê¥¹¥È¤Î¹½Â¤
  offset 0x0000 : (dword) Æɤ߹þ¤ó¤À¥Ç¡¼¥¿¤Î¸Ä¿ô
  offset 0x0004 : (dword) Æɤ߹þ¤ó¤À¥Ç¡¼¥¿¤ÎÁí¥Ð¥¤¥È¿ô
  offset 0x0010¡Á         Æɤ߹þ¤Þ¤ì¤Æ¤¤¤ë³Æ¥Ç¡¼¥¿¤Î¾ðÊó(16¥Ð¥¤¥Èñ°Ì)
          +0x00 : (dword)¥Ç¡¼¥¿ÀèƬ¥¢¥É¥ì¥¹
          +0x04 : (4byte)¥Ç¡¼¥¿¼ïÊÌ(4ʸ»ú)
          +0x08 : (dword)¥Ç¡¼¥¿¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)
          +0x0c : (byte) »ÈÍÑ¥×¥í¥°¥é¥à¿ô
          +0x0e : (word) ³ä¤êÅö¤ÆºÑ¥»¥ì¥¯¥¿(̤³ä¤êÅö¤Æ¤Ê¤é 0)


¡¦¸½ºß³Îǧ¤Ç¤­¤Æ¤¤¤ë¥Ç¡¼¥¿¼ïÊÌ
  "FONT" : 12¥É¥Ã¥È¥Õ¥©¥ó¥È
  "ICON" : 24¥É¥Ã¥È¥¢¥¤¥³¥ó
  "SKBD" : T-OS V2.1¤Î¥½¥Õ¥È¥¦¥§¥¢¥­¡¼¥Ü¡¼¥É¥Ñ¥¿¡¼¥ó
  "MSGD" : ¥µ¥¦¥ó¥É¥á¥Ã¥»¡¼¥¸ÇÈ·Á¥Ç¡¼¥¿
  "FINF" : ¥Õ¥©¥ó¥È¾ðÊó¥Ç¡¼¥¿
  "CLIP" : ¥Ý¥±¥Ã¥ÈÍÑÎΰè
  "FO20" : 20¥É¥Ã¥ÈÌÀÄ«ÂÎ¥Õ¥©¥ó¥È

-------------------------------------------------------------------------------
t_os.lib ¤Î mma_allocSeg/mma_freeSeg ¤Ç¤Î´ÉÍý¤Î¤·¤«¤¿
-------------------------------------------------------------------------------

¡¦mma_allocSeg ¼ê½ç

£±¡¥SYSINIT ¾ïÃó³Îǧ

¡¡DOS-Extender ³ÈÄ¥ funciton ¤Î AX=2511h ¤òÍѤ¤¤Æ¡¢
¡¡int 21h / ah=52h (DOSÈó¸ø³«function / ÀèƬMCB¼èÆÀ) ¤òȯ¸ú¡£
¡¡MCB ¤ò½ç¤ËºÇ¸å¤Þ¤Ç¸¡º÷¤·¤Æ¡¢
¡¡MCBÀèƬ + 128h ¤Ë 'TOWN' ¤È¤¤¤¦Ê¸»úÎó¤Î¤¢¤ë¤â¤Î¤òõ¤·¤Æ¤¤¤ë¡£


£²¡¥´û¤ËÍøÍѤµ¤ì¤Æ¤¤¤ë¤«³Îǧ

¡¡¥Ç¡¼¥¿¥ê¥¹¥È¤Î³ºÅö¥Ç¡¼¥¿¤ò¸¡º÷¤¹¤ë¡£
¡¡+0ch(byte) ¤òÆɤ߽Ф·¡¢¤³¤ÎÃͤ¬ 7fh °Ê¾å¤Ê¤é³ä¤êÅö¤Æ¼ºÇÔ¡£

¡¡+0ch ¤¬ 0 ¤Ç¤Ê¤¤¾ì¹ç¤Ï¡¢´û¤Ë²¿¤é¤«¤Î¥×¥í¥°¥é¥à¤Ç»ÈÍѤµ¤ì¤Æ¤ë¤ÈȽÊ̤·
¡¡+0eh ¤«¤é¥»¥ì¥¯¥¿Ãͤò¥í¡¼¥É¡£¤½¤Î¥»¥ì¥¯¥¿¤Î¸ºß¥Ó¥Ã¥È¤òÄ´¤Ù¡¢
¡¡¤½¤Î¥»¥ì¥¯¥¿¤¬Â¸ºß¤¹¤ì¤Ð¡¢+0ch ¤ÎÃͤò¥¤¥ó¥¯¥á¥ó¥È¤·¡¢
¡¡´û¤Ë¸ºß¤¹¤ë¥»¥ì¥¯¥¿ÃͤòÊÖ¤·¤Æ¥ë¡¼¥Á¥ó½ªÎ»¡£

£³¡¤¥»¥ì¥¯¥¿¤Î¥¢¥í¥±¡¼¥·¥ç¥ó

¡¡¥µ¥¤¥º 0 ¥»¥ì¥¯¥¿¤òºîÀ®¤¹¤ë¡£
¡¡¤½¤Î¸å CR3 ¤ò¥ì¥¸¥¹¥¿¤ò»²¾È¤·¡¢¥»¥¯¥ì¥¿ 40h ¤ò»ÈÍѤ·¤Ê¤¬¤é¡¢
¡¡¡Ê¥»¥ì¥¯¥¿ 40h ¤¬ÊªÍý¥á¥â¥ê¤È£±ÂУ±¤Ç¤¢¤ë¤È²áÄø¤·¤Æ¤¤¤ë¡Ë
¡¡¥Ú¡¼¥¸¥Æ¡¼¥Ö¥ëµÚ¤Ó¥»¥°¥á¥ó¥È¥Ç¥£¥¹¥¯¥ê¥×¥¿¤òľÀÜÁàºî¡Ê¿ä¬¡Ë¡£

¡ô¾ÜºÙ¤Ï̤Ĵºº

£´¡¥ÃͤòÊÖ¤¹

¡¡+0ch ¤ÎÃͤò¥¤¥ó¥¯¥ê¥á¥ó¥È¡£
¡¡+0eh ¤Ë¥»¥ì¥¯¥¿ÃͤòÀßÄꤷ¤Æ¡¢¥ë¡¼¥Á¥ó½ªÎ»¡£


¡ö¤½¤Î¾¹Í»¡

¡¡¡¦¥»¥ì¥¯¥¿¤ò¿½Å¥¢¥í¥±¡¼¥·¥ç¥ó¤·¤Ê¤¤¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡£
¡¡¡¦¤ª¤½¤é¤¯¥Ú¡¼¥¸¥Æ¡¼¥Ö¥ë¤Ê¤É¤â¿½Å¥¢¥í¥±¡¼¥·¥ç¥ó¤·¤Ê¤¤¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤È
¡¡¡¡»×¤ï¤ì¤ë¡£
¡¡¡¦¥Ç¥£¥¹¥¯¥ê¥×¥¿¤¬Â¸ºß¤¹¤ë¤«³Îǧ¤¹¤ë¤È¤³¤í¤«¤é¡¢LDT ¤¬Ê£¿ô¤¢¤ë´Ä¶­¤«¡¢
¡¡¡¡¤Ï¤¿¤Þ¤¿ LDT ¤¬Ç˲õ¤µ¤ì¤¿¾õ¶·¤Ê¤É¤òÁÛÄꤷ¤Æ¤¤¤ë¤È»×¤ï¤ì¤ë¡£
¡¡¡¡¤½¤³¤«¤é¿ä¬¤¹¤ë¤Ë¡¢¥Ú¡¼¥¸¥Æ¡¼¥Ö¥ë¤¬´û¤Ë¹½ÃÛ¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ê¤É¤â
¡¡¡¡ÁÛÄꤷ¤Æ¤¤¤ë²ÄǽÀ­¤¬¤¢¤ë¡£

¡öÆæ

¡¡¡¦T-BIOS ¤ä CoCo ¤Î¤è¤¦¤Ë RUN386 ¤Ë¤½¤Îµ¡Ç½¤òÍ¿¤¨¤Ê¤«¤Ã¤¿¤Î¤¬Ææ¡£
¡¡¡¡¡ÊɬÍפʤȤ­¤·¤«¥¢¥í¥±¡¼¥·¥ç¥ó¤·¤Ê¤¤¤«¤é¡©¡Ë
¡¡¡¦DOS-Extender ³ÈÄ¥¥³¡¼¥ë¤ò»È¤ï¤ºÄ¾ÀÜ¥·¥¹¥Æ¥à¥ì¥¸¥¹¥¿¤òÁàºî¤·¤Æ¤ë¤Î¤¬Ææ¡£
¡¡¡¡¡Ê¥Ú¡¼¥¸¥Æ¡¼¥Ö¥ë¤¬Â­¤ê¤Ê¤¤²ÄǽÀ­¤ò¹Í¤¨¤Æ¡©¡©¡©¡Ë

-------------------------------------------------------------------------------
¥Õ¥í¡¼²òÀÏ
-------------------------------------------------------------------------------
	mma_allocSeg(char *('NAME'))
	{
		mma_alloc(char *('NAME'),000)
	}


	mma_alloc('NAME', XXX)
	{
		s = _mma_scanDirTbl(*('NAME'), 4, 1)
		if (s==0) return 0;

		;s = 'NAME' ¥Ç¡¼¥¿¾ðÊ󤬤¢¤ëÀèƬ¥Ý¥¤¥ó¥¿¡Ê¥ê¥Ë¥¢¥¢¥É¥ì¥¹¡Ë

		edi = s;
		ebx = [edi + 8]  /* size */
		esi = [edi] & 0fffff000h;  /* data top */
		al  = [edi + 0ch]
		if (al > 7fh) return 0
		if (al != 0) {
			push ebx
			ebx = [edi + 0eh];
			call _mma_getDesc;	/* ASM ¤ÎÌÏÍÍ */
			eax = bx;
			pop ebx
			if (dl & 80h) goto RET:; /* ¥»¥ì¥¯¥¿¤¬Â¸ºß¤·¤Æ¤¤¤ë */
		}
		b [edi +0ch] = 0;
		eax =(ebx >>12);  /* eax = size [/page] */
		if (XXX==0)  call _mma_mapDatsSeg (esi, eax)
			else call _mma_mapCodeSeg (esi, eax)
				/* eax= return */

		/*** __mma_cleanup ***/
		push ebx
		ebx = eax;  /* ebx = selector */
		while (1)
		{
			s = _mma_scanDirTbl(ebx, 0eh, 0);
			if (s) {
				w [eax + 0eh] = 0h
				b [eax + 0ch] = 0h
			} else 	break;
		}
		eax = ebx;
		pop ebx
		[edi + 0eh] = ax;	/* alloc selector */
	RET:
		[edi + 0ch] ++;		/* »ÈÍÑ¥«¥¦¥ó¥¿? */
		edx = esi /* Ìá¤êÃÍ */
		ecx = ebx /* Ìá¤êÃÍ */
	}

	_mma_getDesc(¥ì¥¸¥¹¥¿ bx:¥»¥ì¥¯¥¿ÃÍ)
	{
		push ebx;
		ebx = bx;
		ecx = selector_size(bx) +1  /* lsl ecx,bx; ecx++; */
		ecx = ecx >>12; /* page ñ°Ì */
		ds  = LDT/GDT ¥¢¥¯¥»¥¹¥»¥ì¥¯¥¿ (bx ¤ÎÃͤÇȽÊÌ)
		ebx &= 0fff8h;
		eax = ¥»¥ì¥¯¥¿¥Ù¡¼¥¹¥ª¥Õ¥»¥Ã¥È;
		dx  = ¥»¥ì¥¯¥¿Â°À­;
		pop ebx
	}

	_mma_scanDirTbl('NAME', xx0, xx1 )
	{
		if (xx1) *(19eh)=66 else *(19eh)=90
		s = mma_getDirPtr()
		if (s==0) return 0;

		c = *(s)   /* ¥ê¥Ë¥¢¥¢¥É¥ì¥¹ word Æɤ߽Ф· */
		if (c==0) return 0;

		s += 10h;
		s += xx0;
		d  = 'NAME'

		/* ¥Æ¡¼¥Ö¥ë¤«¤é 'NAME' ¤òõ¤¹ */
		if (found = yes)
		{
			p = 'NAME'¤Î¤¢¤ë¥Ý¥¤¥ó¥¿;
			p &= 0ffff_fff0h;
			return p;
		} else  return 0;
	}

	mma_getDirPtr()
	{
		s = _mma_srch(char *buf)
		if (s==0) return 0;
		return [s + 20h]  << ¥ê¥Ë¥¢¥¢¥É¥ì¥¹
	}

	_mma_srch(char *buf)
	{
		buf ¤ò»È¤Ã¤Æ MCB ÀèƬ¼èÆÀ (int 21h / ah=52h)
		bx + 22h : UMB? ¤Î¸¡º÷
		bx - 2   : MCB ¤Î¸¡º÷
			MCB¤Îľ¸å¤Î¥Ñ¥é¥°¥é¥Õ¤¬ PSP ¤Ç¤¢¤ë¤³¤È¤ò³Îǧ¤·¤Æ¤¤¤ë
		'TOWN' ¤È¤¤¤¦Ê¸»úÎó¤òõ¤·¤Æ¤¤¤ë

		return MCB or 0 (=¼ºÇÔ)
	}
	
	mma_allocCodeAlias( sel )
	{
		int 21h / ax=2513 (make alias)
		return sel  / (¼ºÇԤʤé return 0)
	}

	_mma_mapCodeSeg (XX0, XX1)
	_mma_mapDataSeg (XX0, XX1)
	{
		if (_mma_mapCodeSeg) al = 93h  ¢«¥»¥ì¥¯¥¿Â°À­ R/W
		if (_mma_mapDataSeg) al = 9bh  ¢«¥»¥ì¥¯¥¿Â°À­ R/X
		ah = c0h;			¢«Æø¢¥ì¥Ù¥ë¤Ê¤É
		call _mma_mapSeg(XX0, XX1, eax)
	}
	_mma_mapSeg(XX0, XX1, eax)	/* ¤³¤ó¤Ê´Ø¿ô¤Ï¤Ê¤¤ */
	{
		sel = (int 21h / ah=48h);    ¢«Â礭¤µ 0 ¤Î¥»¥ì¥¯¥¿ºîÀ®
		if (¼ºÇÔ) return 0 (edx = ¥¨¥é¡¼¥³¡¼¥É);

		_mma_page(sel, XX0, XX1, eax);
		if (¼ºÇÔ) ºîÀ®¤·¤¿¥»¥ì¥¯¥¿¤òºï½ü¤·¤Æ return 0 (edx = sel);

		return sel; (À®¸ù sel != 0 ¤Ç¤¢¤ë)
	}


	_mma_page(sel, XX0, XX1, ACC)
	{
		¥Ú¡¼¥¸¥Æ¡¼¥Ö¥ë¤ÎľÀÜÁàºî¤Ë¤è¤ë¡¢
		ʪÍý¥á¥â¥ê¤ÎÄ¥¤ê¤Ä¤±¡£
	}




Ìá¤ë