[DOS][Video] Borland C 3.1. Графика, линейный буфер, память.

Тема в разделе "LANGS.C", создана пользователем Elusory Jo, 22 ноя 2007.

  1. Elusory Jo

    Elusory Jo New Member

    Публикаций:
    0
    Регистрация:
    26 янв 2006
    Сообщения:
    30
    Адрес:
    Moscow
    Добрый день.
    Впринципе, нужно иметь память под Z-буфер и 640х480 режим.
    В чистом realmode тяжко заиметь память под такой буфер, а и еще один буфер для смены кадра. (ну по крайней мере я не знаю способов как достать столько памяти, если подскажете - премного благодарен).

    Поэтому вот какие проблемсы:
    1) Нужен линейный буфер, а, соответственно Vesa 2.0
    2) Как решить проблему malloc'a больших областей памяти
    3) Как это ГРАМОТНО сделать в BC ? (на чистом ASM'e проблем нет, затруднений у меня ничто не вызовет..., но здесь нужно именно на BC 3.1)

    Самое нужное - чтобы BC скомпилил нормальный код и не бодался при смене режимов.

    Итак, уважаемый All, чем подсобите?

    С уважением.
     
  2. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    2) calloc() or dos_getmem()
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    AsmGuru62
    calloc()
    Скорее farmalloc, ибо %bc31root%\ctrl\calloc.c
    Код (Text):
    1. ...
    2. void * _FARFUNC calloc(size_t nelem, size_t elsize)
    3. {
    4.         unsigned long   msize;
    5.         register char   *cp;
    6.  
    7.         msize = (unsigned long)nelem * elsize;
    8.         cp = (msize > 0xFFFF) ? NULL : malloc((unsigned)msize);
    9.         if (cp)
    10.                 setmem(cp, (unsigned)msize, 0);
    11.         return(cp);
    12. }
    13. ...
    dos_getmem()
    Afaik такой в bc31 нет.

    Elusory Jo
    Как это ГРАМОТНО сделать в BC ? (на чистом ASM'e проблем нет
    Использовать inline ассемблере нельзя?
     
  4. Elusory Jo

    Elusory Jo New Member

    Публикаций:
    0
    Регистрация:
    26 янв 2006
    Сообщения:
    30
    Адрес:
    Moscow
    О, ну впринципе тогда по идее проблем нет, буду пробовать.

    Его-то как раз и собирался, просто опасался что может быть не совсем корректно возможно падение...
     
  5. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    _dos_allocmem ();

    Подзабыл TC 3.1 ... :)
    И совет: если большие аллокации есть в программе - с отладчиком такие аллокации могут возвратить NULL.
     
  6. CnCVK

    CnCVK New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2006
    Сообщения:
    108
    По умолчанию стоит размер для программы 64кб.
    изменяется в настройках.
     
  7. Elusory Jo

    Elusory Jo New Member

    Публикаций:
    0
    Регистрация:
    26 янв 2006
    Сообщения:
    30
    Адрес:
    Moscow
    CnCVK

    Мне нужно в процессе работы динамически выделить 1200кило под Z-buffer, настройки компилятора и линкера здесь непричем..
     
  8. Elusory Jo

    Elusory Jo New Member

    Публикаций:
    0
    Регистрация:
    26 янв 2006
    Сообщения:
    30
    Адрес:
    Moscow
    Блин, farmalloc при числе, большем 64К возвращает NULL... Что делать? Модели памяти пробовал разные, все равно... =(
     
  9. 10110111

    10110111 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    319
    Адрес:
    Санкт-Петербург
    На крайняк мона использовать окна видеопамяти и, если видеопамяти достаточно, брать место для Z-buffer'а и дополнительного буфера там. Правда, она не кэшируется, что сильно скажется на скорости работы.
    А вообще, можно перевести проц в нереальный режим, падения быть не должно - никто и не заметит этого. Только к памяти придется обращаться явно не сишными способами из-за необходимости подставлять 0x67-prefix.
     
  10. CnCVK

    CnCVK New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2006
    Сообщения:
    108
    мой совет посмотри - может это отладчик ограничивает свободную память.

    Тебе наверно придется использовать XMS или EMS.
     
  11. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Elusory Jo
    нужно в процессе работы динамически выделить 1200кило
    Afaik средствами BC31 столько не выделить. Его alloc'и работают в пределах 640кб.

    Что касается "использовать XMS или EMS" (c) CnCVK, то работают они так: в области памяти за пределами 1Мб можно выделить сколько-то памяти, получить доступ к ней напрямую нельзя. Для ems доступ через 64-х килобайтное окно (адрес которого фиксирован), т.е. сделал запрос, получил кусок в окно, поработал, оповестил, что можно забрать (вернуть за пределы 1Мб), запросил и получил следующий кусок, обработал его и т.д. Для xms можно получать куски большего размера по любому адресу в пределах 640кб. В итоге вся логика работы на твоих (твоей программы) плечах.
     
  12. Elusory Jo

    Elusory Jo New Member

    Публикаций:
    0
    Регистрация:
    26 янв 2006
    Сообщения:
    30
    Адрес:
    Moscow
    Пипец... =(
    Мне тут посоветовали DOS-экстендеры всякие.... Что скажете? (просто я ни разу с ними не работал)
     
  13. 10110111

    10110111 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    319
    Адрес:
    Санкт-Петербург
    DOS-extender - самый удобный вариант.
     
  14. CnCVK

    CnCVK New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2006
    Сообщения:
    108
    да все это я знаю.
    очень большое количество приложений используют эту технологию.
    специлизированное управление памятью, типа при обращении проверяем текущие EMS окно, меняем его и т.д.
    (например при обращении вызывать LockMemory и вызывать после UnlockMemory)
    И не надо говорить что все это просто ужас как сложно - это использовалось и весьма успешно.

    Попробуй скачай Open Watcom - там весьма и расшилители есть в комплекте
     
  15. Elusory Jo

    Elusory Jo New Member

    Публикаций:
    0
    Регистрация:
    26 янв 2006
    Сообщения:
    30
    Адрес:
    Moscow
    Хмм... Ясненько...

    А подскажите пожалуйста тогда... 2 вопроса:

    1) будет ли тогда прога с дос-экстендером работать под виндой?
    2) как прикручивать/компилить прогу с экстендером, возможно ли это на BC3.1? Как вообще с экстендером работать, а то я даже понятия не имею как и что, гугл ничего путного не выдал =(
     
  16. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Под Win2k и выше линейный буфер работать не будет в любом случае, независимо от того с DOS Extender'ом или без ты сделаеш программу.