Автор Гілка: bios interrupts  (Прочитано 2356 раз)

Сергій

  • Гість
bios interrupts
« : 2010-04-05 20:46:36 »
потрібо написати програму, що працює без операцйної та файлової системи. програма має бути записана на raw floppy/usb-flash. Є модливість використовувати лише функції bios. До сього часу такого робити не приходилось. Почав писати з boot-сектора. Наткнувся на проблему: далеко не всі функції bios виконуються, або виконуються, але не правильно. Наприклад є такий код:
.text
_start:
      movb      $0x0e,      %ah
      movb      $'s',      %al
      int      $0x10
      movb      $'t',      %al
      int      $0x10
      movb      $'r',      %al
      int      $0x10
      movb      $'i',      %al
      int      $0x10
      movb      $'n',      %al
      int      $0x10
      movb      $'g',      %al
      int      $0x10
      
      //get current video page
      movb      $0x0f,      %ah
      int      $0x10

      //get cursor pos
      movb      $0x03,      %ah
      int      $0x10
      
      //print str      
      movw      $0x07c0,      %ax
      movw      %ax,      %es
      movw      $0x1301,      %ax
      //bh already set
      movb      $0x07,      %bl      #attribute
      movw      $str_len,      %cx
      movw      $str,      %bp
      int      $0x10
cyrcle:
      jmp      cyrcle
.data
      str:      .string      "done"
      .set      str_len, . - str

компілюю так:
Цитата
gcc bootsect.s -C
ld bootsect.o -Ttext=0 -Tdata=50 -o bootsect -nostdlib --oformat binary
./fitcha < bootsect > bootsect.img

:) код фітчі:
#include <unistd.h>
#include <stdio.h>

#define IMG_SIZE      0x1000 /*2mb - img size*/

void panic(char* msg)
{
      fprintf(stderr,"%s",msg);
      exit(-1);
}

int main()
{
      char bufer[IMG_SIZE];
      int i;
      for (i=0; i<IMG_SIZE; bufer[i++]=0);

      i=read(0, bufer, 510);
      if (i<1)
            panic("can't read boot_sect file\n");      
      bufer[510]=0x55;
      bufer[511]=0xaa;

      if (write(1,bufer,IMG_SIZE)!=IMG_SIZE)
            panic("can't write boot img\n");
      return 0;
}
запускав усе під qemu
SeaBIOS 0.5.1 виводить лише посимвольно у режимі tty (%ah=$0x0e). Це не дуже зручно, бо стає дуже важко малювати інтерфейс та виводити текст цілими строками.
SeaBIOS 0.5.0 взагалі чорний екран.
Наскільки я розумію різні БСВВ (хоча б для ПК) мають підтримувати загальноприйняті функції. Дививися старючі коди лінуха 0.11, у котрому код, що був у бут сектору використовував функцію 0х1301. перевіряти не став, бо написаний на невідомому суржику intel/at&t, але ж, думаю, перед тим як викинути їх на кернел.орг спочатку дивляться на те, як воно працює.
Писати на дійсний носій шкода. флопі-рідера зараз немає, а флешка одна і форматувати її в raw (а потім ще й обратно) не хотілося б.
може я сліпий/тупий, але цілий день сиджу та не можу зрозуміти що не так. (якщо для когось помилка очевидна. Має виводитись на екран наступне: "stringdone", :))

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: bios interrupts
« Відповідей #1 : 2010-04-06 17:58:59 »
Ну так напишіть свою власну функцію, яка виводитиме текст посимвольно. Щось типу такого: http://www.google.com/codesearch/p?hl=en#5xqxyKXnn44/pub/ct/listings/9905-234.zip|pQ7e7to705w/ctpwr.S&q=lang:asm%20printstr
printstr:       push    ax
                push    bx
                push    cx
                mov     bx, dx

bios_print:     mov     al, byte ptr [bx]
                cmp     al, #0x24 ; Ende?
                je      print_done
                mov     ah, #0xe
                int     0x10
                inc     bx
                jmp     bios_print

print_done:     pop     cx
                pop     bx
                pop     ax
                ret
[Fedora Linux]

Сергій

  • Гість
Re: bios interrupts
« Відповідей #2 : 2010-04-07 10:43:13 »
Справа не у тому, що мені потрібно щось написати на екран. Мене цікавить чому функціі БСВВ не всі працюють. Підозрюю, що я щось не так передаю в регістрах. Якщо дозволяється використовувати функції БСВВ, то було б дуже бажаним використовувати саме їх, а не писати свої.

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: bios interrupts
« Відповідей #3 : 2010-04-07 10:54:44 »
Тому що не було тестів. Всі розробники тестували свої БСВВ на реальних системах. В основному, якщо MS DOS працює, то БСВВ вважається робочою.
[Fedora Linux]

Сергій

  • Гість
Re: bios interrupts
« Відповідей #4 : 2010-04-08 14:30:11 »
SeaBIOS насправді є достатньо відомою вільною реалізацією бсвв, що піддавалась тестам не один раз. Я більш прихильний вірити в те, що я десь щось не так передаю, ніж багадо ішних розробників не змогли написати функцію, що виводить на екран цілу строку.

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: bios interrupts
« Відповідей #5 : 2010-04-08 14:51:26 »
Можливо ви помилилися з константами. Напишіть функцію, яка виводить текст посимвольно і з допомогою неї робіть відлагодження програми. Або запусіть відлагоджувач в qemu і протрасуйте бсвв: http://jack.kiev.ua/docs/qemu-doc-ru.html#SEC23
[Fedora Linux]