#define WIDTH 80
#define HEIGHT 25
ulong_t xpos,ypos;
void update_cursor()
{
ulong_t pos;
pos=xpos+ypos*WIDTH;
hal_outportb(0x3d4,0x0f);
hal_outportb(0x3d5,(uchar_t)(pos&0xff));
hal_outportb(0x3d4,0x0e);
hal_outportb(0x3d5,(uchar_t)((pos >> 8)&0xff));
}
void cursor_on()
{
hal_outportb(0x3d4,0x0a);
hal_outportb(0x3d5,0);
hal_outportb(0x3d4,0x0b);
hal_outportb(0x3d5,16); // Height=16
}
void cursor_off()
{
hal_outportb(0x3d4,0x0a);
hal_outportb(0x3d5,0);
hal_outportb(0x3d4,0x0b);
hal_outportb(0x3d5,0); // Height=0
}
Как вывести на экран строку, не используя команды ОС?
Желательно чтобы она могла хоть как нибудь продемонстрировать своё существование, например вывести что-нибудь на экран.
Проблема в том, что я не знаю как это сделать.
Помогите пожалуйста.
в каком смысле "без операционной системы" ?
Цитата: koderAlex
в каком смысле "без операционной системы" ?
Наверное, в смысле, прога в бут-секторе, и функции вывода из биоса.
если ему надо БЕЗ какой либо ОС, то это получится только из бут сектора.........
http://www.codenet.ru/progr/dos/int_0009.php надо заглянуть .
всё равно ему сюда
Цитата: koderAlex
всё равно ему сюда http://www.codenet.ru/progr/dos/int_0009.php надо заглянуть .
Спасибо, это именно то, что было нужно.
Цитата: koderAlex
всё равно ему сюда http://www.codenet.ru/progr/dos/int_0009.php надо заглянуть .
int 10h - это хорошо.
Можно и без биоса обойтись.
- Прямой доступ к видеопамяти.
Для текстового режима #3 например, сегментный адрес = 0B800h
Цитата: Zenhipster
int 10h - это хорошо.
Можно и без биоса обойтись.
- Прямой доступ к видеопамяти.
Для текстового режима #3 например, сегментный адрес = 0B800h
Можно и без биоса обойтись.
- Прямой доступ к видеопамяти.
Для текстового режима #3 например, сегментный адрес = 0B800h
А если у меня MDA или Hercules? ;)
А может у меня уже графический режим, или я использую переключение страниц?
Так установите нужный режим с нужной страницей и пишите в подходящий для него буфер! Правда, понадобится реализовать еще одно действие - перемещение курсора - у меня в оси это делается с помощью драйверных функций getsuperpos/setsuperpos (для тех, у кого есть исходники, это функции 4/5 устройства STDOUT - в каком файле искать, думаю, знаете сами :) )
Впрочем, надеюсь, что исходников у вас нет :) Вечером вывешу подпрограммку для вывода строки в потоковом (телетайпном) режиме и покажу, как управлять курсором на уровне портов ввода-вывода - у меня самого сейчас под рукой нет исходников...
Собственно работа с курсором:
Код:
VIDEO_M3_WIDTH equ 80
VIDEO_M3_HEIGHT equ 25
putstr: call getsuperpos
mov edi, eax
mov ah, 07h
cld
.next: lodsb
cmp al, 20h
jb byte .swch
.pchr: mov [videobuffer+2*edi], ax
inc edi
.scrl: cmp edi, VIDEO_M3_WIDTH*VIDEO_M3_HEIGHT
jb byte .next
sub edi, VIDEO_M3_WIDTH
push esi
push edi
mov esi, videobuffer+2*VIDEO_M3_WIDTH
mov edi, videobuffer
mov ecx, VIDEO_M3_WIDTH*(VIDEO_M3_HEIGHT-1)
rep movsw
mov eax, 0720h
mov ecx, VIDEO_M3_WIDTH
rep stosw
pop edi
pop esi
jmp byte .next
.attr: and al, 0Fh
mov ah, al
jmp byte .next
.cart: push eax
push ecx
mov eax, edi
mov cl, VIDEO_M3_WIDTH
div cl
shr eax, 8
sub edi, eax
pop ecx
pop eax
jmp byte .next
.linf: add edi, VIDEO_M3_WIDTH
jmp byte .scrl
.htab: mov al, 20h
jmp byte .pchr
.swch: cmp al, 0Fh
ja byte .attr
cmp al, 0Dh
je byte .cart
cmp al, 0Ah
je byte .linf
cmp al, 9
je byte .htab
cmp al, 0
jne byte .next
mov eax, edi
call setsuperpos
ret
VIDEO_M3_HEIGHT equ 25
putstr: call getsuperpos
mov edi, eax
mov ah, 07h
cld
.next: lodsb
cmp al, 20h
jb byte .swch
.pchr: mov [videobuffer+2*edi], ax
inc edi
.scrl: cmp edi, VIDEO_M3_WIDTH*VIDEO_M3_HEIGHT
jb byte .next
sub edi, VIDEO_M3_WIDTH
push esi
push edi
mov esi, videobuffer+2*VIDEO_M3_WIDTH
mov edi, videobuffer
mov ecx, VIDEO_M3_WIDTH*(VIDEO_M3_HEIGHT-1)
rep movsw
mov eax, 0720h
mov ecx, VIDEO_M3_WIDTH
rep stosw
pop edi
pop esi
jmp byte .next
.attr: and al, 0Fh
mov ah, al
jmp byte .next
.cart: push eax
push ecx
mov eax, edi
mov cl, VIDEO_M3_WIDTH
div cl
shr eax, 8
sub edi, eax
pop ecx
pop eax
jmp byte .next
.linf: add edi, VIDEO_M3_WIDTH
jmp byte .scrl
.htab: mov al, 20h
jmp byte .pchr
.swch: cmp al, 0Fh
ja byte .attr
cmp al, 0Dh
je byte .cart
cmp al, 0Ah
je byte .linf
cmp al, 9
je byte .htab
cmp al, 0
jne byte .next
mov eax, edi
call setsuperpos
ret
getsuperpos/setsuperpos - это просто "обертки" для обращения к драйверу. Я попробовал извлечь самую суть из соответствующих драйверных функций и вот что получилось...
Код:
getsuperpos: movzx eax, [video.superpos]
ret
setsuperpos: cmp eax, VIDEO_M3_WIDTH * VIDEO_M3_HEIGHT
jae byte @f
mov [video.superpos], ax
mov edx, 03D4h
mov al, 0Eh
out dx, ax
mov ah, byte [video.superpos]
mov al, 0Fh
out dx, ax
@@: ret
ret
setsuperpos: cmp eax, VIDEO_M3_WIDTH * VIDEO_M3_HEIGHT
jae byte @f
mov [video.superpos], ax
mov edx, 03D4h
mov al, 0Eh
out dx, ax
mov ah, byte [video.superpos]
mov al, 0Fh
out dx, ax
@@: ret
Забыл пояснить одну вещь... Коды 0x10 - 0x1F в строке устанавливают байт атрибутов для последующих символов, равным соответственно 0x00 - 0x0F.
Цитата:
Код:
.pchr: mov [videobuffer+2*edi], ax
Почти все :)