5

さて、エミュレートされた環境 (DosBox) でダブル バッファリング手法を適用しようとしていますが、IDE Turbo C++ 3.0 を使用しています。Windows 7 64 ビットを実行しています (それが問題かどうかはわかりません)。バッファリング ルーチンを適切に実行する方法がわかりません。この環境で。

私が抱えている主な問題は、次の割り当てステートメントを実行できないように見えることです。

double_buffer = (byte_t far*)farmalloc((unsigned long)320*200);

(320 と 200 は画面サイズであることに注意してください)...割り当てに対して NULL を取得します。

DosBox のデフォルトの RAM 使用量を 16 から 32 に変更してみましたが、何も起こりませんでした。エミュレーターなのか、Turbo C のコードに何か問題があるのか​​はわかりません (問題なく準拠していることに注意してください)。

以下は、オンラインで見つけたサンプル プログラムです。

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <string.h>
#include <alloc.h>

typedef unsigned char byte_t;

byte_t far* video_buffer = (byte_t far*)0xA0000000;

void vid_mode(byte_t mode){
    union REGS regs;
    regs.h.ah = 0;
    regs.h.al = mode;
    int86(0x10,&regs,&regs);
}

void blit(byte_t far* what){
    _fmemcpy(video_buffer,what,320*200);
}

int main(){

    int x,y;
    byte_t far* double_buffer;

    double_buffer = (byte_t far*)farmalloc((unsigned long)320*200);
    if(double_buffer == NULL){
        printf("sorry, not enough memory.\n");
        return 1;
    }
    _fmemset(double_buffer,0,(unsigned long)320*200);

    vid_mode(0x13);

    while(!kbhit()){
        x = rand()%320;
        y = rand()%200;
        double_buffer[y * 320 + x] = (byte_t)(rand()%256);
        blit(double_buffer);
    }

    vid_mode(0x03);
    farfree(double_buffer);
    return 0;
}
4

1 に答える 1