Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.66/56: Рейтинг темы: голосов - 56, средняя оценка - 4.66
0 / 0 / 0
Регистрация: 04.10.2009
Сообщений: 11

При обращении напрямую к видеопамяти, вывести изображение

22.11.2009, 14:39. Показов 11507. Ответов 64
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Кто может помочь с решением задачи на Ассемблере, откликнитесь пожалуйста!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.11.2009, 14:39
Ответы с готовыми решениями:

Выдавать 404 при обращении напрямую к индексным файлам
Извените, возник ряд сложностей, так как в Apache разбираюсь не очень, итак : нужно сделать так, чтобы при обращении на прямую...

TASM + VESA чтение и запись видеопамяти напрямую
Столкнулся с проблемой: есть некоторое изображение представленное битами (14х20), его нужно вывести по заданным координатам. Режим 103h...

Не могу понять реальный объём видеопамяти. (Ноут за 10к с 6 ГБ видеопамяти О_о)
Друг реши себе ноут взять на авито. Вот вижу такое объявление: Тыц Заголовок товара: Мощный HP А8-6410, 8Гб, 6Гб вид, 120Гб SSD. ...

64
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
22.11.2009, 19:38
Студворк — интернет-сервис помощи студентам
Я предполагаю, что число битов на пиксел - один, и изображение без сжатия.

Добавлено через 3 минуты
Вот есть процедура открытия бмп файла. Надо её упростить, зная, что тут нету сжатия и 1 бит на пиксел.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
proc open_file
 
mov [ofn.Flags], OFN_FILEMUSTEXIST + OFN_PATHMUSTEXIST + OFN_EXPLORER
invoke GetOpenFileName,ofn
cmp eax,0
je .cancel
invoke CreateFile,fname,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
mov [hfile],eax ;сохраняем дескриптор открытого файла
invoke GetFileSize,[hfile],0
cmp eax,-1
je .failed
mov [FileSize],eax
 
cmp [pmem],0
jne .heap_realloc
;выделяем память
invoke GetProcessHeap
mov [hheap],eax
invoke HeapAlloc,[hheap],0,[FileSize]
mov [pmem],eax ;указатель на память, он же -
mov ebx,eax ;указатель на BITMAPFILEHEADER
jmp .read_file
.heap_realloc:
invoke HeapReAlloc,[hheap],0,[pmem],[FileSize]
mov [pmem],eax ;указатель на память, он же -
mov ebx,eax ;указатель на BITMAPFILEHEADER
 
.read_file:
invoke ReadFile,[hfile],[pmem],[FileSize],BytesRead,0
cmp eax,0
je .read_error
;проверим, все ли верно с картинкой
mov eax,[BytesRead] ;прочитано байт
mov cx,[ebx] ;первые два байта должны быть "BM", если это bmp-файл
mov edx,[ebx+2] ;размер файла, заявленный в заголовке
 
cmp eax,[FileSize]
jne .read_error
cmp eax,edx
jne .read_error
cmp cx,"BM"
jne .read_error
 
invoke CloseHandle,[hfile]
mov eax,sizeof.BITMAPFILEHEADER ;BITMAPINFO следует
add eax,ebx ;сразу за BITMAPFILEHEADER.
mov [pBMInfo],eax ;сохраним этот указатель.
 
sub eax,sizeof.BITMAPFILEHEADER.bfOffBits ;в eax указатель на BITMAPFILEHEADER.bfOffBits
add ebx,[eax] ; [pmem]+[BITMAPFILEHEADER.bfOffBits]=указатель на битовый массив картинки
mov [pBits],ebx
 
mov eax,sizeof.BITMAPINFOHEADER.biSize
add eax,[pBMInfo]
mov ebx,[eax]
mov [bWidth],ebx
add eax,sizeof.BITMAPINFOHEADER.biWidth
mov ebx,[eax]
mov [bHeight],ebx
 
invoke InvalidateRect,[hwnd],0,1
mov eax,0
ret
 
.read_error:
invoke HeapFree,[hheap],0,[pmem]
mov [pmem],0
.failed:
invoke CloseHandle,[hfile]
invoke MessageBox,0,0,0,0
.cancel:
ret
endp
Взято из этого журнала. http://www.nestor.minsk.by/kg/2009/10/kg91019.html

Добавлено через 3 минуты
Я тут пока много флагов не знаю, но думаю, если это все упростить, то получим совсем немного кода. И думаю проверять правильно ли файл открылся, прочитался, точно ли это бмп файл не надо. Просто поместить этот файлик в папку с программой, и я думаю пользователь не настолько глуп, чтоб его открывать в этот момент. В крайнем случае повесим на него атрибут "скрытый или системный"
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
22.11.2009, 19:44
Во-первых в том файле, что прислали вы 8 бит на пиксел, а не 1.
Еще мне думается, что было бы гораздо проще для перекодирования, если бы каждая буква была в отдельном файле. Причем разрешение этого файла было пропорционально 320 : 200 чтобы было проще масштабировать.

Не по теме:

Что-то я ушел от темы :) А что пишем-то перекодировщик bmp в массив полигонов или программу, которая выведет букву на экран ?

1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
22.11.2009, 20:06
Так. Алгоритм:
1) Мы берем слово на русском языке - это строка символов, указатель на неё содержится в esi.
2) Берем каждую буковку и с помощью определенной процедурі(я её постараюсь написать) определяем какой номер этой буквы в русском алфавите.
3) Берем из нашего бмп файла кусок, который соответствует этой букве, разбиваем на массивы так как я писал и заносим в видеопамять. Тут стоит заметить, что я хочу сделать так: один длинный бмп, разбитый на 33 квадратика 40 на 40 (больше не надо, будет долго считать), и в каждом квадратике буква заглавная. Таким образом можно легко вычислить место в бмп файле, где началась буква например номер 8 (это - Ж), и не надо узнавать размер изображения. 40 на 40*33=1320
4) повторяем 1, 2, 3 для каждй буквы.

Добавлено через 4 минуты
Потом вызываем прерывание, чтобы то, что в видеопамяти вывелось на екран. А можно еще несколько по-другому. Завести большой массив, соответствующй разрешению экрана (построчно, верхняя слева - направо, сверху вниз) и просто заносить туда либо 0 либо 1, в зависимости от того закрашивать этот пиксел или нет. А потом запихнуть его в видеопамять, т. е. цвета пикселов в цикле поменять. Вот.

Добавлено через 7 минут
Вот еще.
Цитата Сообщение от trans Посмотреть сообщение
С использованием встроенного ассемблера языка Borland Pascal в графическом видеорежиме 320x200 256
Так можно открытие файла и парсинг русского слова написать на на Паскале? Там это намного легче. А на ассемблере просто работу с видеопамятью писать.
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
22.11.2009, 20:45
Кстати trans, сделайте что-нибудь со строчкой
Pascal
1
(koord:5261;high:10;scale:22;naklon:0;naklon2:0;naklon3:0),
и будет вам счастье...
0
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
22.11.2009, 20:49
Goodwin98, кстати, почему HEX редактор у меня монохромное изображение откріл, и там вместо 1 и 0 - я, ь, Б и прочее((
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
22.11.2009, 22:00
Думается мне что это не HEX редактор открыл
Попробуйте WinHex'ом.

Добавлено через 1 час 7 минут
Кстати открывать файл с картинкой впринципе необязательно. Можно как я уже говорил вырезать у bmp заголовок, а сам битовый образ сохранить в самом exe(com) файле. С масмом идет утилита bintodb.exe. С ее помощью можно превратить бинарный файл в запись вида :
Assembler
1
2
3
4
5
6
7
8
9
db 0,0,0,0,0,0,0,0,0,7,7,7,0,0,0,0
db 0,0,0,0,0,0,7,7,7,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,7,7,7,0,0,0,0,0
db 0,0,0,0,0,7,7,7,0,0,0,0,0,0,0,0
db 0,0,7,7,7,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,7,7,7,7,7,7,7,7,7,7,7,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7
db 7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
22.11.2009, 22:50
Я хочу, чтобі ета программа использовала бмп файл и потом делала все сама, бе сторонних утилит

Добавлено через 6 минут
И там не обязательно заголовок вірезать. Зачем? спокойно в массив загнать тем кодом, что я привел и работать потом с массивом. Я просто хочу просмотреть содержимое файла этого бинарного.
0
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
27.11.2009, 02:53
Вот сделал конвертер. Вообщем надо этот код переписать на Паскаль или асм, хотя автор говорил, что можно писать на Паскале с асмовскими вставками. И сделать заполнение массивов полигонов, и вывод в видеопамять.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
{Данная программа преобразует монохромные изображения любого размера в битовую карту.}
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ComCtrls;
type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    ProgressBar1: TProgressBar;
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
  private
  f:file of word;
  f2:file of byte;
  fr:TextFile;
  p,rp:longint;
  width,height:word;
  a:byte;
  bt,vs:array of byte;
  q:array[1..8] of byte;
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
{$I+}
 
procedure TForm1.BitBtn1Click(Sender: TObject);
var i,j,kol:integer;
begin
if opendialog1.Execute then begin
 assignFile(f,opendialog1.Files[0]);
 reset(f);
 for i:=1 to 12 do begin read(f,height);
      if i=10 then width:=height;
       end;
  CloseFile(f);
 assignFile(f2,opendialog1.Files[0]);
 reset(f2); rp:=filesize(f2)-62; p:= rp div height; SetLength(bt, rp);
 for i:=1 to 62 do read(f2,a); Progressbar1.Position:=20;
 for i:=63 to rp do read(f2,bt[i-63]); CloseFile(f2); Progressbar1.Position:=40;
SetLength(vs, rp); kol:=0; Progressbar1.Position:=50; 
for i:=height - 1 downto 0 do
for j:=i*p to i*p+p-1 do begin
           vs[kol]:=bt[j];
           inc(kol);
           end;
SetLength(bt, rp*8); kol:=0; Progressbar1.Position:=70;
for i:=0 to length(vs) - 1 do begin
 for j:=1 to 8 do begin
     q[j]:=vs[i] mod 2;
     vs[i]:=vs[i] div 2;
     end;
 for j:=8 downto 1 do begin
     bt[kol]:= q[j];
     inc(kol);
     end;
     end;
     vs:=nil; Progressbar1.Position:=100;
 Form1.Text:=opendialog1.Files[0]; 
end;
end;
 
procedure TForm1.BitBtn2Click(Sender: TObject);
var i,j:integer;
begin
if savedialog1.Execute then begin Progressbar1.Position:=0;
assignFile(fr,savedialog1.Files[0]); rewrite(fr); writeln(fr,width,' ',height);
 for i:=0 to height - 1 do begin  Progressbar1.Position:=10;
   for j:=0 to width - 1 do write(fr,bt[i*p*8+j]);
 writeln(fr);
 end;
 bt:=nil;   Progressbar1.Position:=90;
 CloseFile(fr); Progressbar1.Position:=100;
 Form1.Text:=savedialog1.Files[0];
 end;
end;
end.
Исходники Конвертор.rar
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
05.12.2009, 18:26
Почему не компилирует
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
program Project2;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
 
{$G+,A+}
TYPE point = record
  koord: integer; {nachalo poligona}
  high: integer;  {kolichestvo strok}
  scale: integer; {shirina 1-oi stroki v pixel}
  naklon: integer;{estesstv naklon poligona sleva}
  naklon2:integer;{naklon poligona sprava}
  naklon3:integer;{estesstv naklon poligona sprava}
  end;
CONST points : array[1..10] of point=
  {----N-----}
  ((koord:6452;high:10;scale:16;naklon:0;naklon2:0;naklon3:0),
  (koord:76;high:42;scale:20;naklon:0;naklon2:0;naklon3:0),
  (koord:42;high:42;scale:20;naklon:0;naklon2:0;naklon3:0),
  {----E----}
  (koord:3324;high:22;scale:20;naklon:0;naklon2:0;naklon3:0),
  (koord:128;high:10;scale:52;naklon:0;naklon2:0;naklon3:0),
  (koord:10354;high:10;scale:52;naklon:0;naklon2:0;naklon3:0),
  (koord:5261;high:10;scale:22;naklon:0;naklon2:0;naklon3:0),
  {---N----}
  (koord:6644;high:10;scale:16;naklon:0;naklon2:0;naklon3:0),
  (koord:234;high:42;scale:20;naklon:0;naklon2:0;naklon3:0),
  (koord:268;high:42;scale:20;naklon:0;naklon2:0;naklon3:0));
 
  
  TestCount: word=10000;
var
  vidmode,scrpage: byte;
  minus: integer;
  time1, time2, time3, time4, time5, time6: word;
 
BEGIN
  asm
    mov ah,$f
    int 10h
    mov vidmode,al
    mov scrpage,bh
{--------------------------------------------------}
    mov ax,$13
    int 10h
    mov ax,$a000
    mov es,ax
 
    xor ah,ah    {timer}
    int 1ah
    mov time1,dx
    mov cx,TestCount
 
   @for_time:
   push cx
   lea si,points
   mov cx,10
   @new_pryam_polyg:
    mov ax,$f00f
    mov minus,0
    xor dx,dx
    xor bx,bx
    push cx
    mov di,[si]
    add si,2
    mov cx,[si]
    add si,2
 
    @new_line:
    push cx
    push bx
    push di
 
    mov cx,[si]
    //sub cx,minus
                 {dobavili 1 pixel esli nech addr}
    mov bx,di
    and bl,1
    jz @not_add_1pix_in_beg
    mov [es:di],ah
    inc di
    dec cx
    @not_add_1pix_in_beg:
                 {zalili po 2 pixel}
    shr cx,1
    rep stosw
                 {dobavili 1 pixel esli zalili ne vse}
    jnc @not_add_1pix_in_end
    mov [es:di],al
    @not_add_1pix_in_end:
 
    pop di
    add di,320
 
    mov bx,[si+6] {est naklon sprava}
    //add minus,bx
                         {kursivnii naklon}
    add dx,$7000
    sbb di,0
    pop bx
    add bx,[si+4]
    adc minus,0
 
    add di,[si+2]        {estesstvennii naklon sleva}
 
    not ax
    pop cx
    loop @new_line
    add si,8
    pop cx
   loop @new_pryam_polyg
    pop cx
    dec cx
   jnz @for_time
    xor ah,ah    {timer}
    int 1ah
    mov time2,dx
{------------------------------------------------------}
    mov ax,$13
    int 10h
    mov ax,$a000
    mov es,ax
 
    xor ah,ah    {timer}
    int 1ah
    mov time3,dx
    mov cx,TestCount
   @for_time2:
   push cx
   lea si,points
   mov cx,10
  @new_pryam_polyg2:
    db 66h
    mov ax,$f00f
    dw $f00f
    mov minus,0
    xor dx,dx
    xor bx,bx
    push cx
    mov di,[si]
    add si,2
    mov cx,[si]
    add si,2
 
   @new_line2:
    push cx
    push bx
    push di
 
    mov cx,[si]
    //sub cx,minus
                 {dobavili 1 pixel esli nech addr}
    mov bx,di
    shr bl,1
    jnc @not_add_1pix_in_beg2
    mov [es:di],ah
    inc di
    dec cx
    @not_add_1pix_in_beg2:
                {dobavili 2 pixel esli addr ne delitsya na 4}
    shr bl,1
    jnc @not_add_2pix_in_beg2
    stosw
    sub cx,2
    @not_add_2pix_in_beg2:
                {zalili po 4 pixel}
    push cx
    shr cx,2
    db 66h
    rep stosw
            {dobavili 2 pixel esli zalili ne vse}
    jnc @not_add_2pix_in_end2
    stosw
    @not_add_2pix_in_end2:
           {dobavili 1 pixel esli zalili ne vse}
    pop cx
    and cx,1
    rep stosb
 
    pop di
    add di,320
 
    mov bx,[si+6] {est naklon sprava}
    //add minus,bx
                         {kursivnii naklon}
    add dx,$7000
    sbb di,0
    pop bx
    add bx,[si+4]
    adc minus,0
 
    add di,[si+2]        {estesstvennii naklon sleva}
 
    db 66h
    not ax
    pop cx
   loop @new_line2
    add si,8
    pop cx
  loop @new_pryam_polyg2
    pop cx
    dec cx
   jnz @for_time2
    xor ah,ah    {timer}
    int 1ah
    mov time4,dx
 
    mov al,vidmode
    xor ah,ah
    int 10h
    mov ah,5
    mov al,scrpage
    int 10h
  end;
  if time2<time1 then time1:=65535-time1+time2
  else time1:=time2-time1;
  if time4<time3 then time3:=65535-time3+time4
  else time3:=time4-time3;
  if time6<time5 then time5:=65535-time5+time6
  else time5:=time6-time5;
  writeln('Results (fps):');
  writeln('1 and 2-bit universal zalivka     ',TestCount/(time1/18):10:0);
  writeln('1,2 and 4-bit universal zalivka   ',TestCount/(time3/18):10:0);
  
  readln;
  { TODO -oUser -cConsole Main : Insert code here }
end.
[Error] Project2.dpr(229): LOOP/JCXZ distance out of range

Добавлено через 2 минуты
Где там эта метка, у которой 1 байт отводится не пойму(
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
05.12.2009, 18:36
loop и все другие условные переходы могут быть не длиннее, чем на 127 байт. С виду в 204 строке далековато находится loop.

Добавлено через 3 минуты
Попробуйте поменять его на что-то вроде
Assembler
1
2
3
4
dec cx
jz l1
jmp @new_pryam_polyg
l1:
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
05.12.2009, 18:42
Так теперь в каждый loop заменять на jl, jg? Да?

Добавлено через 2 минуты
А этот код на выводу в видео-память можно упростить?

Добавлено через 2 минуты
Поменял. Таже ошибка.
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
05.12.2009, 19:08
Попробовал отдать этот код Турбо паскалю - съел и не подавился.
Дельфи разве может делать дос программы ?

Добавлено через 8 минут
Цитата Сообщение от galileopro Посмотреть сообщение
Так теперь в каждый loop заменять на jl, jg? Да?
Это тоже условные переходы и они тоже не могут быть дальше, чем на 127 байт. Хотя масм сам переделывает их в то, что я написал выше, возможно, что и другие компиляторы тоже.
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
05.12.2009, 19:11
Цитата Сообщение от Goodwin98 Посмотреть сообщение
Попробовал отдать этот код Турбо паскалю - съел и не подавился.
Дельфи разве может делать дос программы ?
Нет Я тоже скомпилил Паскалем. Сори. Вот вопрос: можно ли за небольшой промежуток времени этот код упростить, чтобы он по двумерному массиву 480 на 320 boolean либо рисовал пиксел, либо нет. Ну соответственно с обращением напрямую в видеопамять.
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
05.12.2009, 19:31
Но ведь там совсем не массив точек. Там массив полигонов, т.е. прямоугольников.
А вот насчет двумерного массива я не очень понял. Может проще завести массив подходящего типа и потом просто скопировать его в видеопамять за раз ? Т.е. так же как делали в программе с папоротником.
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
05.12.2009, 20:00
В папоротнике там вин апи рисовалось.
Я хочу сделать массив по размеру на весь экран и запихнуть его в видеопамять. А в этом массиве чтобы было 2 цвета. (я планирую читать этот массив из файлика с 1 или 0).

Добавлено через 16 минут
Вот отсюда пітаюсь смісл вікурить http://sizov.boom.ru/mem320.htm
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
05.12.2009, 20:02
Если будете делать под дос, в нем есть режимы, в которых пиксел кодируется одним битом, т.е. в 1 байте - 8 точек, идущих подряд. Не пойдет?
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
05.12.2009, 20:26
Если будете делать под дос, в нем есть режимы, в которых пиксел кодируется одним битом, т.е. в 1 байте - 8 точек, идущих подряд. Не пойдет?
Конечно подойдет) Так перевести я в состоянии. Вообще я не против использовать даже не столь изощренные режимы, а 256 цветные, там можно сделать массив из 0 и 255, щас я технически пытаюсь это сделать.

Добавлено через 21 минуту
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
.model small
.stack 256
.386
.data
saveMode    db ?    
xVal    dw ?
yVal    dw ?
 
.code
main proc
.startup            
 
    call    SetVideoMode    
    call    SetScreenBackground
    call    Draw_Some_Pixels
    call    RestoreVideoMode
    
.exit           ; return to OS
main endp
 
;----------------------------------------------------------
SetScreenBackground proc
;----------------------------------------------------------
    mov dx,3c8h     
    mov al,0        
    out dx,al
 
    mov dx,3c9h     
    mov al,0        
    out dx,al
    mov al,0        
    out dx,al
    mov al,35       
    out dx,al
    ret
SetScreenBackground endp
 
;----------------------------------------------------------
SetVideoMode proc
;----------------------------------------------------------
    mov  ah,0Fh     
    int  10h
    mov  saveMode,al    
 
           mov  ah,0        
           mov  al,13h      
    int 10h
 
    push    0A000h      
    pop es                      
    ret
SetVideoMode endp
 
;----------------------------------------------------------
RestoreVideoMode proc
;----------------------------------------------------------
    mov   ah,10h        
    int 16h
    mov ah,0        
    mov al,saveMode   
    int 10h
    ret
RestoreVideoMode endp
 
;----------------------------------------------------------
Draw_Some_Pixels proc
;----------------------------------------------------------
    mov dx,3c8h     
    mov al,1        
    out dx,al
 
    mov dx,3c9h     
    mov al,63       
    out dx,al
    mov al,63       
    out dx,al
    mov al,63       
    out dx,al
 
    mov xVal,160        
    mov yVal,100
    mov   ax,320        
    mul   yVal      
    add   ax,xVAl       
    
    mov cx,10       
    mov   di,ax     
 
DP1:
    mov byte ptr es:[di],1  
    add di,5        
    Loop    DP1
    ret
Draw_Some_Pixels endp
end
Говорит Error! E2063: file MODE13_1.obj(I:\нейросеть_лица\MODE13\MO DE13_1.ASM): invalid relocation for flat memory model at 00401002
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
05.12.2009, 21:33
Масм нормально скомпилировал.
Немного смущает фраза flat memory model at 00401002 . Откуда бы этому взяться в дос проге...

Необязательно работать через порты можно и просто в памяти.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.model small
.stack 256
.code
main:
    
    mov ax,13h
    int 10h ; установка режима
    
    mov ax,0a000h ; сегмент видеопамяти
    mov es,ax
    
    xor di,di
    mov dx,200 ; кол-во строк
frame:
    mov cx,320 ; т.к. экран 320x200
    xor al,al
@@:
    stosb
    inc al
    loop @b
    
    dec dx
    jnz frame
    
    mov ah,1
    int 21h
    mov ah,4ch
    int 21h
 
end main
Цитата Сообщение от galileopro Посмотреть сообщение
там можно сделать массив из 0 и 255
В случае работы без портов, лучше делать 0 (черный) и 14(белый).
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
06.12.2009, 15:37
Никак не скомпилирую этот код. Возможно ли это без загрузочной дискеты?
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
06.12.2009, 15:42
У меня все эти программы нормально компилируются и работают из-под встроеного эмулятора winXP. Знаю, что могут быть проблемы с их работой из под Win7, т.к. там драйвер не хочет переходить в полный экран, но компилироваться все-равно должно.
Опишите, что вы делаете.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.12.2009, 15:42

Вывести изображение при условии
Вывести изображение (id=&quot;step_№&quot;) при условии, что див &quot;numm-content&quot; имеет style=&quot;display: block;&quot; Т.е., если div с id=&quot;1&quot;...

Исключение при попытке вывести изображение
У меня выдает исключение на эту строку My_img.SetValue(Image.SourceProperty,...

Вывести изображение через HDMI при неработающем дисплее ноутбука
Здравствуйте! Такая проблема: есть ноутбук Acer Aspire V5ZRI с разбитым монитором (изображение не видно), на котором установлена...

Вывести значение напрямую из БД в блок
Здравствуйте! Интересует вопрос: Как можно вывести значение из БД в Drupal7? Последовательность действий такая: Создаю блок, формат...

Замена символа на экране при прямом доступе к видеопамяти
Нужно в процедуре обработать выведеную на экран строку следующим образом: с помощью видеопамяти загрузить символ с экрана и сравнить его с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru