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)
{
¥Ú¡¼¥¸¥Æ¡¼¥Ö¥ë¤ÎľÀÜÁàºî¤Ë¤è¤ë¡¢
ʪÍý¥á¥â¥ê¤ÎÄ¥¤ê¤Ä¤±¡£
}
Ìá¤ë