Это - достаточно беспорядочный архив сообщений конференций сети 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)