DiBR
обычная кошмарная
домашняя страничка
Ежекакполучится околокомпьютерное обозрение
 
  <<<  предыдущий Tech! archive #13 следующий  >>>  
   Последний выпуск       Архив       Ссылки       Полезности       humor.filtered       Фотки       О сайте   
          Это - достаточно беспорядочный архив сообщений конференций сети fidonet, которые на момент их прочтения мной показались полезными или интересными. Многие устарели, многие узкоспецифичны и малоинтересны, но может оказаться и что-то новое...
         
- __techs (2:5015/42) ----------------------------------------------- __techs -
Msg  : 13 of 1000                          Scn
From : Lout Roman                          2:463/586.20    26 Apr 96  21:40:00
To   : VLADIMIR MEDEIKO                                    02 May 96  08:11:18
Subj : DMA...  (Was: Быстpый вывод ...) [1/2]
-------------------------------------------------------------------------------
@AREA:DEMO.DESIGN
                          ---> Hi VLADIMIR! <---

[Чет Апp 25 1996, 02:02],  VLADIMIR MEDEIKO нашкрябал Oleg Sharonov:

VM>> Я лет 4-5-6 назад этим занимался...  Результаты были именно такими -
VM>> из VRAM - ok, RAM -> RAM - :-(((

  Я тоже этим интеpесовался (для меня было непонятно - как же это Second
Reality так быстpо кpутит битмапку лица, в то вpемя когда у меня даже пpостой
пеpенoс MEM->VMEM по REP MOVSW pаботает мендленее? Оказалось - нужно всего лишь
включить pежим с меньшим pазpешением). Hо зато мне пpислали следующий
исходник (не помню кто - Thanks!!!). Я не пpовеpял - сpазу повеpил
коментаpиям и забpосил эту идею.

============cut===============
/*

         Имя этого файла .... DMA106.C
            омер версии .... 1.06
                    Дата .... 22.06.93
               Copyright .... Vadim Madgazin, 2:5085/10
                Компилер .... TC++ 1.01

               (Это исправленная dma105.c)

                     Только для AT
       со свободной RAM (без работающих программ)
         в адресах 8000h-8FFFh и VGA-монитором !

                Старая версия (dma105.c):
                 Проверка DMA-перекачки
    Onboard RAM->Onboard RAM  или  Onboard RAM->Video RAM,
    в первом случае на несколько безрезультатных попыток
    приходится одна 100%-успешная (команды r,t,d,d,d,d,d),
    в последнем случае (RAM->VRAM) происходит передача
    только 1-2% байт (команды 0,1,2,3,4,5,6,7,8,9).

                       Эта версия:
      С видео-памятью все (почти) по-прежнему плохо, но для
    Onboard-RAM достигнута неплохая результативность (до 90%,
    1 сбой при 10 передачах).
    А дело все в том, что по совету Hиколы Бурова (2:5085/11)
    я переписал небольшую часть кода запуска DMA на ассемблере.
    За этим последовали достаточно мистические результаты, см.
    текст функции Dma();

*/

#pragma inline

#include <dos.h>

typedef unsigned char  byte;
typedef unsigned int   word;

//не более 32k !!!
#define DMA_COUNT  30000 //число передаваемых байт посредством DMA;

void Dma(byte srcpg,word srcad,byte dstpg,word dstad,word count);
int  Getscrmode(void);
void Scrmode(int mode,int safeoldscr);


void main(void)
{
byte srcpage,destpage; //страницы RAM источника/приёмника;
word srcadr,destadr;   //адреса RAM источника/приёмника;
word i;
word segment1,offset1;
word segment2,offset2;
int  cmd,err;
int  oldmode;
byte rampage,videorampage; //страницы для тестирования видео-RAM;
byte b1,b2;

oldmode=Getscrmode();
printf("\\n\\n*DMAtest* (C) Vadim Madgazin (2:5085/10), 1992-93.\\n\\n");
srand();

//при видеооперациях:
//страница RAM источника, меняется вводом цифры 0...9=>0...640k:
rampage=0;
//страница VGA RAM приёмника (0xA0000=>640K...704K):
videorampage=0x0A;

//это более-менее безопасная область RAM, которая скорее всего
//будет свободна при вызове ЭТОЙ программы только из DOS без
//наличия в памяти больших работающих программ :
srcpage=0x08;     //страница RAM источника (0...9 => 0...640K);
destpage=srcpage; //страница RAM приёмника -||-;
srcadr=0x0000;
//область приемника сразу за источником:
destadr=srcadr+(word)DMA_COUNT;

back:

cprintf("\\r\\nInput command  (r d 0...9 t q)  : ");
cmd=getche(); //ввод команды;
cprintf("\\r\\n");

switch (cmd)
{
  case 'r' : //заполнение src случайными байтами;
             cprintf("new random data->src\\r\\n");
             segment1=(word)srcpage << 12;
             offset1=srcadr;
             for (i=0; i<DMA_COUNT; i+=2)
                  poke(segment1,offset1+i,rand());
             sound(500); delay(25); nosound();
             break;
  case 'd' : //DMA передача;
             cprintf("DMA src->dest in progress...\\r\\n");
             Dma(srcpage,srcadr,destpage,destadr,(word)DMA_COUNT);
             sound(1000); delay(25); nosound();
             //break; - не надо!
  case 't' : //сравнение src с областью приёмника;
             cprintf("src==dest?\\r\\n");
             segment1=(word)srcpage << 12;
             offset1=srcadr;
             segment2=(word)destpage << 12;
             offset2=destadr;
             err=0;
             for (i=0; i<DMA_COUNT; ++i)
             {
               b1=(byte)peekb(segment1,offset1+i);
               b2=(byte)peekb(segment2,offset2+i);
               if (b1!=b2) err++;
             }
             sound(1500); delay(25); nosound();
             cprintf("total %i byte, errors in %i byte\\r\\n",i,err);
             break;
  default  : //переключение rampage источника по 0...9;
             if ((cmd>='0')&&(cmd<='9'))
             {
               rampage=(byte)(cmd-'0');
               Scrmode(0x13,0); //VGA графика 320x200x256;
               Dma(rampage,0,videorampage,0,(word)DMA_COUNT);
               sound(2000); delay(25); nosound();
               //проверка совпадения:
               segment1=(word)rampage << 12;
               offset1=0;
               segment2=(word)videorampage << 12;
               offset2=0;
               err=0;
               for (i=0; i<DMA_COUNT; ++i)
               {
                 b1=(byte)peekb(segment1,offset1+i);
                 b2=(byte)peekb(segment2,offset2+i);
                 if (b1!=b2) err++;
               }
               sound(1500); delay(25); nosound();
               //чтобы не испортить графэкран - это печатается после:
               printf("\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\npress any key !\\n");
               getch();
               Scrmode(oldmode,0);
               cprintf("total %i byte, errors in %i byte\\r\\n",i,err);
             }
             else
             {
               cprintf("No function, only   r d 0...9 t q   !\\r\\n");
             }
             break;
  case 'q' : return; //конец;
}
goto back;
}

int Getscrmode(void)
//возвращает текущую видео-моду;
{
_AH=0x0F;
geninterrupt(0x10);
_AH=0;
return _AX;
}

void Scrmode(int mode,int safeoldscr)
//установка видео-моды mode
//и очистка экрана, если safeoldscr равно нулю;
{
if (safeoldscr>0) safeoldscr=0x80;
mode=mode | safeoldscr;
_AL=mode;
_AH=0;
geninterrupt(0x10);
}
====================cut====================


                                            Sincerely Yours, ├┼AX

---
* Origin: ·Да мне за это шнобелевскую премию должны были дать ! (2:463/586.20)






<<<

архив dibr

>>>'