DosEmu のソースクエスト(追跡):

 /dosemu../src/command/emufs.S:DOS  のデバイスドライバの形式。 int
Linuxfs(=0xe6) で dosemu のシステムコールを呼んでいるだけ。

  /dosemu../src/base/init/init.c :: map_custom_bios() で割り込みベクタ
をセットしている。ここでは DOS_HELPER_INT = 0xe6

  /dosemu/src/base/bios/bios.S :: ここでは  0xe6  は  DOSHELPER_INT
と言う名前。呼出側。

  /dosemu/src/base/async/int.c :: dos_helper()。これが、0xe6  の実体
らしい。コマンドコードによる場合わけ。 DOS_HELPER_xx  と言う名前の定
数で  case  処理をしている。 DOS_HELPER_MFS_HELPER  では mfs_inte6() 
を呼んでいる。

 /dosemu/src/base/misc/dos2linux.c :: misc_e6_xx() という名前の関数がい
くつかある。環境変数関係?。

  /dosemu/src/dosext/mfs/mfs.c::mfs_inte6 ()  を見付けた。が・・、
dos_fs_dev() を呼んでいるだけ。

  /dosemu/src/dosext/mfs/mfs.c::dos_fs_dev()  ・・ここでドライブの初
期化を行っているらしい。ただし、ebx=0x500 と ebx=0  しか処理していな
い。ebx=0:初期化には dirnameptr  などというそれらしい名前が出てくる。
何をしているかというと・・、dirnameptr の10バイト前が "directory " 
なら、・・ふむふむ、ここらへんだ・・、dos_roots[i]に dirnameptr の文字
列をコピーしている。・・、えっ、そんだけ?。

 と・・、いうことは・・、dos_roots[i]<>NULL  の場合にはリヌクスのデ
ィレクトリとして別の処理をしている場所があるのだろう。

 dos_roots[i]<>NULL のときに calculate_drive_pointers()  を呼んでい
る場所がある。これは怪しい・・。
  cds = drive_cds(dd);
  cwd = cds_current_path(cds);
 あれ?。バグっているのではないか?。

    static cds_t cds_base;
    ・・・
    static int
    calculate_drive_pointers(int dd)
    {
      far_t cdsfarptr;
      char *cwd;
      cds_t cds_base;   ← これが余分(有害)ではないか。line=1422。
      ・・・
      cdsfarptr = lol_cdsfarptr(lol);
      cds_base = (cds_t) Addr_8086(cdsfarptr.segment, cdsfarptr.offset);
      cds = drive_cds(dd);

 これだと、関数内のローカルの cds_base にセットしているだけ。

 で・・・・、DosEmu の再コンパイルがしたくなった・・。

 * バグではなかった。次の実行コマンドである mfs.h はマクロで定義されて
    いたので、ローカルでもグローバルでも関係なかった。

#define drive_cds(dd) ((cds_t)(((int)cds_base)+(cds_record_size*(dd))))

 find / -name "*.[chS]" -print | xargs grep drive_cds
  ( p.103, SD, 1999-04 )

  find /dosemu-0.66.7 -name "*.[chS] | xargs grep "0x13" > /dos1/1
  :r /dos1/1
 
/dosemu-0.66.7/src/base/misc/disks.c:  case 0x13:

  int13() というのがある。ah=2 のとき read_sector。disk_open() を呼んでいる。
  disk_open() では・・、

  dp->fdesc = SILENT_DOS_SYSCALL(open(dp->dev_name, 
        dp->wantrdonly ? O_RDONLY : O_RDWR, 0));

  ふーむ。これは linux のデバイスのオープンだろうな。
 disk_open() でエミュレート可能なように、bp をセットしているのだろう。
 read_sectors() を呼んでいる。エミュレートされた処理をしているはず。
 どうやら、これらしい。明日みてみよう。

 −−

  find /dosemu-0.66.7 -name "*.[chS] | xargs grep "0x13" > /dos1/1
  :r /dos1/1

で出した一覧表:

/dosemu-0.66.7/src/base/misc/disks.c:  case 0x13:
/dosemu-0.66.7/src/base/async/int.c:  case 0x13:            /* BIOS disk */
/dosemu-0.66.7/src/base/async/int.c:  interrupt_function[0x13] = int13;
/dosemu-0.66.7/src/base/mouse/mouse.c:  case 0x13:          /* Set Maximum for mouse speed doubling */
/dosemu-0.66.7/src/base/mouse/mousevid.c:   { 0x13,'G',320,200,320,ORG_VGA,EGA_OFFS },
/dosemu-0.66.7/src/base/mouse/mousevid.c:  if (i < 0 || i > 0x13 || !videomodes[i].textgraph) {
/dosemu-0.66.7/src/base/bios/bios.S:.REPT (0x13-0x10) .align 16
/dosemu-0.66.7/src/base/bios/bios.S:            /* system-soft ints 0x13 .. 0x16 */
/dosemu-0.66.7/src/base/bios/bios.S:irqnum  set 0x13
/dosemu-0.66.7/src/base/bios/bios.S:.REPT (0x17-0x13) .align 16
/dosemu-0.66.7/src/base/bios/int10.c:case 0x13: /*Not finished ! */
/dosemu-0.66.7/src/base/bios/int10.c:  case 0x13:                    /* write string */
/dosemu-0.66.7/src/base/keyboard/n_serv_xlat.c:   0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,    /* 10-17 */
/dosemu-0.66.7/src/base/keyboard/n_serv_xlat.c:   0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,    /* 10-17 */
/dosemu-0.66.7/src/base/keyboard/n_keyb_slang.c:  0x13,         /* ^R */
/dosemu-0.66.7/src/base/keyboard/n_keyb_clients.c:    0x19, 0x10, 0x13, 0x1f, 0x14, 0x16, 0x2f, 0x11,   /* 0x50-0x57 */
/dosemu-0.66.7/src/base/keyboard/n_keyb_clients.c:    0x19, 0x10, 0x13, 0x1f, 0x14, 0x16, 0x2f, 0x11,   /* 0x70-0x77 */
/dosemu-0.66.7/src/base/keyboard/Xkeyb.c:    0x19, 0x10, 0x13, 0x1f, 0x14, 0x16, 0x2f, 0x11,
/dosemu-0.66.7/src/base/keyboard/Xkeyb.c:    0x19, 0x10, 0x13, 0x1f, 0x14, 0x16, 0x2f, 0x11,
/dosemu-0.66.7/src/base/keyboard/slang-keyboard.c:     {"\362", 0x1300 | ALT_MASK},    /* Alt R */
/dosemu-0.66.7/src/base/keyboard/slang-keyboard.c:     {"\033r",    0x1300 | ALT_MASK},    /* Alt R */
/dosemu-0.66.7/src/base/keyboard/slang-keyboard.c:   0x1312,                   /* ^R */
/dosemu-0.66.7/src/base/serial/fossil.c:  case 0x13:
/dosemu-0.66.7/src/dosext/dpmi/msdos.h: case 0x13:      /* Write String */
/dosemu-0.66.7/src/dosext/dpmi/msdos.h: case 0x13:      /* Delete using FCB */
/dosemu-0.66.7/src/dosext/drivers/cdrom.c:     case 0x13: /* q channel */
/dosemu-0.66.7/src/dosext/mfs/mfs.c:#define DELETE_FILE     0x13
/dosemu-0.66.7/src/dosext/mfs/mfs.c:  case DELETE_FILE:     /* 0x13 */
/dosemu-0.66.7/src/dosext/mfs/mfs.c:  case DELETE_FILE:     /* 0x13 */
/dosemu-0.66.7/src/dosext/mfs/mfs.h:#define WRITE_PROT_DISK     0x13
/dosemu-0.66.7/src/dosext/sound/sound.c:        /* 0x10 - 0x13: CD-ROM - SBPro ***IGNORED*** */
/dosemu-0.66.7/src/dosext/net/net/ipx.c: 0x00, 0x00, 0x1b, 0x33, 0x2b, 0x13};
/dosemu-0.66.7/src/arch/linux/debugger/dis8086.c:   case 0x13:
/dosemu-0.66.7/src/env/video/X.c: * 0x13 and very slow.
/dosemu-0.66.7/src/env/video/X.c:    case 0x13:
/dosemu-0.66.7/src/env/video/X.c:/*   if(video_mode==0x13)
/dosemu-0.66.7/src/env/video/vgaemu.c: *    - Very simplified vgaemu_get_changes_and_update_XImage_0x13()
/dosemu-0.66.7/src/env/video/vgaemu.c: *        vgaemu_get_changes_and_update_XImage_0x13() return an area.
/dosemu-0.66.7/src/env/video/vgaemu.c:  {0x13,  GRAPH,   320,  200,   8,  8,   40, 25,  256,  0xa0000, 0x10000,    P8},
/dosemu-0.66.7/src/env/video/vgaemu.c: * should be updated for other video modes than 0x13
/dosemu-0.66.7/src/env/video/vgaemu.c: * DANG_BEGIN_FUNCTION vgaemu_get_changes_and_update_XImage_0x13
/dosemu-0.66.7/src/env/video/vgaemu.c: * This is only for mode 0x13: 256 colors
/dosemu-0.66.7/src/env/video/vgaemu.c:int vgaemu_get_changes_and_update_XImage_0x13(unsigned char **base, unsigned long int *offset, unsigned long int *len, int method, int *modewidth)
/dosemu-0.66.7/src/env/video/vgaemu.c:      return(vgaemu_get_changes_and_update_XImage_0x13(base, offset, len, method, modewidth));
/dosemu-0.66.7/src/env/video/seqemu.c:#define CHIP_ID 0x13
/dosemu-0.66.7/src/env/video/cirrus.c:      port_out (0x13, 0x3C4);
/dosemu-0.66.7/src/env/video/cirrus.c:      port_out (0x13, 0x3C4);
/dosemu-0.66.7/src/include/cmos.h:#define CMOS_RESV2    0x13
/dosemu-0.66.7/src/include/vgaemu.h:/*int vgaemu_get_changes_and_update_XImage_0x13(unsigned char * data, int method, int *x, int *y, int *width, int *heigth);*/
/dosemu-0.66.7/src/include/vgaemu.h:int vgaemu_get_changes_and_update_XImage_0x13(unsigned char **base, unsigned long int *offset, unsigned long int *len, int method, int *modewidth);
/dosemu-0.66.7/src/include/iodev.h:#define CMOS_RESV2   0x13
/dosemu-0.66.7/src/include/keyboard.h:#define KEY_R     0x13
/dosemu-0.66.7/src/include/doshelpers.h:#define DOS_HELPER_PRINT_STRING     0x13 /* DS, DX point to a NULL terminated string */
/dosemu-0.66.7/src/commands/cdrom.S:    movb    ah,#0x13