実際には、640 KBで十分です

画像






あきらめない



ビル・ゲイツは本当に「640 KBで十分だ」と言っていましたか? 彼女の話はかなりあいまいですが、ほとんどの場合、彼女はビルと称賛されているので、彼は本当にそう言ったのかもしれません。



彼はしばしばこれを笑されました。 合計640 KBのメモリ空間という考え方は、現代の標準ではばかげています。 ほとんどのインストーラーの実行可能ファイルでさえ、このサイズに収まりません。



比較のために:Windows 10の計算機はアイドル状態の16.2 MBのRAMを占有します-1980年代のDOSプログラムで利用可能なメモリ量のほぼ26倍です。



奇妙なもの



この時代遅れのプラットフォームを使用し、そのためのソフトウェアを開発している活発なコミュニティがまだあると言ったら私を信じますか?



おそらくあなたの最初の質問は「しかし、なぜですか?」であり、私はあなたをよく理解しています。 DOSへの投資にまだ関心があるグループのいくつかを見てみましょう。



レガシー開発者



現在、DOS上で実行されるプログラムはまだ多くあります。 産業管理プログラム、POSシステム、および科学ツールは、今日でもDOSが使用されているアプリケーションの例の一部にすぎません。 時間の経過とともに、これらのプログラムのほとんどは他のシステムに移植されるか、完全に書き直されましたが、一部はまだ保存されていました。



費用対効果の高いリアルタイムシステム



DOSは、本質的にはリアルタイムオペレーティングシステム(RTOS)です。 この目的のために特別に設計されたわけではありませんが、その最小限の設計により、他の同様のシステムに起因することができます。



RTOSは、ソフトウェアおよびハードウェアの要求の予測可能な遅延によって特徴付けられます。 DOSには内部マルチタスクを使用しない最小限のAPIがあるため、オペレーティングシステムの呼び出し遅延の安定性は非常に高くなっています。



設計が改善され、この目的のために特別に設計されたリアルタイムシステムのより新しい例がすでにありますが、アプリケーションと機器間の最高のDOSインターフェイスは、この使用分野で利点をもたらします。 FreeDOS(以下で説明します)などのシステムはオープンソースであり、無料で配布されるため、他のRTOSに代わる優れた手段です。



懐かしいビデオゲーム



現代のビデオゲームは素晴らしいです。 彼らは3Dの途方もない力を必要としますが、グラフィックス、サウンド、ゲームプレイは時々非常に現実的であり、現実と混同される可能性があります。 バーチャルリアリティ機器はこの感覚をさらに高め、プレイヤーがゲーム環境に完全に没頭できるようにします。



しかし、このすべての進歩にもかかわらず、80年代および90年代前半の子供であった多くのゲーマーは、原始的な(現代の基準による)グラフィックスとシンセサイザーサウンドが自分の想像力でギャップを埋めた時代を懐かしく思い出します。



機器がDOS時代の限界を大きく後回しにしているという事実にもかかわらず、DOSゲーマーにとってはまだ活発な場面があります。 懐かしさとプログラミングへの愛情に駆り立てられた開発者は、元々DOSに付属していたPCを含む古いシステムで実行されるゲームを作成します。



この市場が技術的な幼少期に戻ろうとする一握りの年金受給者によって制限されていると思うなら、あなたは間違っています。 YouTubeでThe 8-bit Guyとしてよく知られているDavid Murrayには、50万人以上の加入者がおり、毎週懐かしいコンピューターハードウェアの領域を探っています。 彼は、 PlanetX2と呼ばれるCommodore 64のリアルタイム戦略も作成しました 。 このプロジェクトは非常に成功したため、Davidはゲームで物理的なメディアの在庫をすべて売却し、DOSプラットフォームの続編を作成する予定です。



実行する



DOSを実行するには多くの方法があります。 たぶん、あなたはあなたがそれをすぐに実行できるコンピュータさえ持っているでしょう。 ただし、このオペレーティングシステムと密接に連携したいので、ほとんどすべてのコンピューターで動作するフリーソフトウェアを使用する方法を使用します。



まず、ライセンスについて少し話しましょう。 いくつかのレポートによると、MicrosoftはMS-DOS 6.22パブリックドメインを作成しましたが、この確認を見つけることができませんでした。 ソフトウェアはかなり安全なオンラインソースから簡単にダウンロードできるため、コピー権を侵害する可能性のあるものをインストールすることには賛成しません。 たとえ合法的に取得したコピーを持っているとしても(そして多くの人がそれを持っていると思う)、仮想マシンにインストールすることは法的に危険な行為です。



インストールを簡素化するために、FreeDOSを使用します。 FreeDOSは、ジムホールによって書かれたオープンソースのDOSクローンです。 Jimは、MicrosoftがMS-DOSの販売とサポートを終了すると発表した1994年6月に開発を開始しました。 数週間後、Pat VillanyとTim Normanがプロジェクトに参加しました。 わずか数か月で、バージョン0.01が登場しました。 今日は、2016年クリスマスにリリースされたバージョン1.2を使用しています。



まず、 FreeDOS Webサイトにアクセスして 、CD-ROMにある標準インストーラーのISOイメージをダウンロードします。 USBバージョンをダウンロードすることもできますが、ハードウェア、BIOSなどの違いを考慮してください。 ここではこの方法を検討しません。 代わりに、仮想化を使用します。



FreeDOSをVirtualBox OracleVMware Workstation / Playerの両方でテストしました。 どちらの製品も正常に機能しますが、VMwareはわずかに優れたBIOSエミュレーションを提供し、多くのDOSゲームで使用されているPCスピーカーをエミュレートします。 以下の例では、VMware Workstationを使用しますが、原則として、どのシステムでも使用できます。



FreeDOSのデフォルトのインストールオプションは、VirtualBoxとVMwareです。 RAMとディスク領域がほとんど割り当てられていないことに驚くかもしれません。 通常、DOS用に2ギガバイトのディスクを作成しますが、デフォルトで選択されている512 MBで十分です。



FreeDOSのインストールは簡単です。ISOイメージから仮想マシンを起動するだけで(起動時または仮想マシンの作成時にISOファイル要求が発行されます)、画面の指示に従います。 FreeDOSがディスクをクラッシュして再起動したら、「ハードディスクにインストール」を再度選択します。 動作を確認する場合は、「完全インストール」または「ソースを使用した完全インストール」を選択します。 あなたはこの記事を読んでいるので、ほとんどの場合、ソースもインストールしてみませんか?



インストール後、再起動する必要があります。 今回は、「ハードディスクにインストール」を選択する代わりに、CDのブートメニューで「システムハードディスクから起動」を選択します。 デフォルトのオプションであるJemmex(EMSなし)は、特に開発作業を行う場合の標準的なダウンロードに適しています。



技術的には、FreeDOSシステムはすぐに使用できますが、まだ完全に裸です。 この状態では、DOSゲームやプログラムを実行するのは便利ですが、重要なツールがないため、開発にはあまり適していません。



かわいいFDimples



今こそ、FreeDOSにいくつかのソフトウェアをインストールするときです。 OSには、パッケージFDimplesを管理するすばらしいシステムが含まれています。 使用するには、次を入力します。



fdimples
      
      





. — , . , , , .









.



. , ENTER — . , Development. TAB, OK, ENTER.



C++



, ? C++ , GNU Compiler Collection DOS.



, DOS CWSDPMI 32- . 640 . , !



, :



mkdir C:\src
mkdir c:\src\hello
rhide c:\src\hello\hello.cpp
      
      





RHIDE. Visual Studio, . Borland Turbo-C, .









.



:



#include <iostream>
using namespace std;

int main() {
  cout << “Hello, World!\n”;
  return 0;
}
      
      





«Run» ( ALT+R, R CTRL+F9). , . , , . - RHIDE, !





- . :



mkdir c:\src\example
rhide c:\src\example\example.cpp
      
      





, , VGA 320x200x256.



#include <iostream>
#include <dpmi.h>
#include <unistd.h>
#include <go32.h>
#include <sys/farptr.h>
#include <stdlib.h>
#include <dos.h>
 
#define COLOR_WHITE 15
#define MAX_WIDTH 320
#define MAX_HEIGHT 200

using namespace std;

void set_video_mode(int mode) {
  //    
  __dpmi_regs r;
 
  //  AX  
  r.x.ax = mode;
 
  //  int 10 (  BIOS)
  __dpmi_int(0x10, &r);
}

void put_pixel(int x, int y, int c) {
  //  VGA    A000,      .
  _farpokeb(_dos_ds, 0xA0000+y*320+x, c);
}

void clear_pixel(int x, int y) {
  //     0,   
  _farpokeb(_dos_ds, 0xA0000+y*320+x, 0);
}

void draw_effect() {
  //   x  y
  int x = 0;
  int y = 0;

  //    y_max  
  for (y = 0; y < MAX_HEIGHT, y++) {
    for (x=0; x < MAX_WIDTH, x++) {
      put_pixel(x, y, rand()%(15+1));
    }
  }
}

int main() {
  //   13h (320x200x256)
  set_video_mode(0x13);

  //  
  draw_effect();

  //    ENTER
  cin.ignore();

  //    
  set_video_mode(3);

  return 0;
}
      
      







. , . , .



#include <iostream>
#include <dpmi.h>
#include <unistd.h>
#include <go32.h>
#include <sys/farptr.h>
#include <stdlib.h>
#include <dos.h>

#define COLOR_WHITE 15
#define MAX_WIDTH 320
#define MAX_HEIGHT 200

#define KEY_ESC 283
#define KEY_UP 18432
#define KEY_DOWN 20480
#define KEY_LEFT 19200
#define KEY_RIGHT 19712

using namespace std;

void set_video_mode(int mode) {
  //    s
  __dpmi_regs r;
 
  //  AX  
  r.x.ax = mode;
 
  //  int 10 (  BIOS)
  __dpmi_int(0x10, &r);
}

void put_pixel(int x, int y, int c) {
  //  VGA    A000,      .
  _farpokeb(_dos_ds, 0xA0000+y*320+x, c);
}

void clear_pixel(int x, int y) {
  //     0,   
  _farpokeb(_dos_ds, 0xA0000+y*320+x, 0);
}

int get_key() {
  //    
  __dpmi_regs r;
  //  AH  00h   BIOS
  r.x.ax = 0x0000;
  //  int 16 (  BIOS)
  __dpmi_int(0x16, &r);
  //   AX ( -)
  return r.x.ax;
}

int main() {

  //   13h (320x200x256)
  set_video_mode(0x13);

  //  
  int running = 1;
  int curkey;
  //    
  int char_x = MAX_WIDTH / 2;
  int char_y = MAX_WIDTH / 2;
  while (running) {
    //   
    curkey = get_key();
    //    ,      
    clear_pixel(char_x, char_y);
    switch (curkey) {
      case KEY_ESC:
        //   ESC,   
        running = 0;
        break;
      case KEY_UP:
        char_y--;
        break;
      case KEY_DOWN:
        char_y++;
        break;
      case KEY_LEFT:
        char_x--;
        break;
      case KEY_RIGHT:
        char_x++;
        break;
    }
    //  ""  
    put_pixel(char_x, char_y, COLOR_WHITE);
  }
  
  //    
  set_video_mode(3);
  return 0;
}
      
      





, , . .



, INT 16. , , . INT 16 AH = 01 , . . , .



, put_pixel clear_pixel , , . memcpy(). - :



#include <sys/movedata.h>

char buffer[320x200];
int i;
 
//   ,    
 
//     
dosmemput(buffer, 320*200, 0xA0000);
      
      





/ , . , , — , .





, C++ — , , . . DOS BASIC , .



. , , C++, , DJGPP.



, , , , . DOS , 640 . , 640 . DOS- TSR ( ) 600 .



, , DOS EMS ( ). 600 , , 1 . DOS CWSDPMI !





, . DOS — . «», DJGPP .



, . . DOS, VGA (, , - ) C.



C++ , (, , ) . 4 ( , ), JPG . .



, . , .



— . .



All Articles