Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как вывести на экран строку, не используя команды ОС?

360
16 февраля 2007 года
P*t*
474 / / 15.02.2007
Хочу написать программу, работающую без операционной системы.
Желательно чтобы она могла хоть как нибудь продемонстрировать своё существование, например вывести что-нибудь на экран.
Проблема в том, что я не знаю как это сделать.

Помогите пожалуйста.
252
16 февраля 2007 года
koderAlex
1.4K / / 07.09.2005
в каком смысле "без операционной системы" ?
9
16 февраля 2007 года
Lerkin
3.0K / / 25.03.2003
Цитата: koderAlex
в каком смысле "без операционной системы" ?


Наверное, в смысле, прога в бут-секторе, и функции вывода из биоса.

261
16 февраля 2007 года
ahilles
1.5K / / 03.11.2005
если ему надо БЕЗ какой либо ОС, то это получится только из бут сектора.........
252
16 февраля 2007 года
koderAlex
1.4K / / 07.09.2005
всё равно ему сюда http://www.codenet.ru/progr/dos/int_0009.php надо заглянуть .
360
17 февраля 2007 года
P*t*
474 / / 15.02.2007
Цитата: koderAlex
всё равно ему сюда http://www.codenet.ru/progr/dos/int_0009.php надо заглянуть .



Спасибо, это именно то, что было нужно.

991
28 февраля 2007 года
Zenhipster
157 / / 14.01.2005
Цитата: koderAlex
всё равно ему сюда http://www.codenet.ru/progr/dos/int_0009.php надо заглянуть .



int 10h - это хорошо.
Можно и без биоса обойтись.
- Прямой доступ к видеопамяти.
Для текстового режима #3 например, сегментный адрес = 0B800h

9
28 февраля 2007 года
Lerkin
3.0K / / 25.03.2003
Цитата: Zenhipster
int 10h - это хорошо.
Можно и без биоса обойтись.
- Прямой доступ к видеопамяти.
Для текстового режима #3 например, сегментный адрес = 0B800h


А если у меня MDA или Hercules? ;)
А может у меня уже графический режим, или я использую переключение страниц?

349
01 марта 2007 года
Phantom-84
656 / / 27.10.2005
Так установите нужный режим с нужной страницей и пишите в подходящий для него буфер! Правда, понадобится реализовать еще одно действие - перемещение курсора - у меня в оси это делается с помощью драйверных функций getsuperpos/setsuperpos (для тех, у кого есть исходники, это функции 4/5 устройства STDOUT - в каком файле искать, думаю, знаете сами :) )
349
01 марта 2007 года
Phantom-84
656 / / 27.10.2005
Впрочем, надеюсь, что исходников у вас нет :) Вечером вывешу подпрограммку для вывода строки в потоковом (телетайпном) режиме и покажу, как управлять курсором на уровне портов ввода-вывода - у меня самого сейчас под рукой нет исходников...
1.9K
01 марта 2007 года
disasm
232 / / 06.02.2006
Собственно работа с курсором:

Код:
#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
}


Где xpos,ypos отсчитываются от нуля
349
01 марта 2007 года
Phantom-84
656 / / 27.10.2005
Вот подпрограмма...
Код:
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


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
Только нужно учитывать, что эти подпрограммы смогут выполняться, если уровень привилегий ввода-вывода не будет противоречить текущему уровню привилегий. Кстати, при необходимости все 32-разрядные регистры в обоих фрагментах можно заменить на 16-разрядные...
349
01 марта 2007 года
Phantom-84
656 / / 27.10.2005
Забыл пояснить одну вещь... Коды 0x10 - 0x1F в строке устанавливают байт атрибутов для последующих символов, равным соответственно 0x00 - 0x0F.
349
01 марта 2007 года
Phantom-84
656 / / 27.10.2005
Цитата:
 
Код:
.pchr:          mov     [videobuffer+2*edi], ax
Кстати, при необходимости все 32-разрядные регистры в обоих фрагментах можно заменить на 16-разрядные...

Почти все :)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог