DOS связанный FAQ
 

DOS

FreeBASIC порт для DOS основан на DJGPP порте GNU toolchain для 32-битного защищенного режима DOS.

На сегодня этим занимается DrV.

Было написано: платформо-специфичная информация, отличия от Win32/Linux, отличия от QB?, туториалы, другое.

ТРЕБУЮТСЯ ТЕСТЕРЫ

DOS версия FreeBASIC нуждается в большем количестве тестеров. Если Вы интересуетесь использованием FreeBASIC на DOS, пожалуйста, не ждите релиза 1.0, начните работать прямо сейчас. Тестирование в DOS приветствуется и на старом и на новом PC(графика, ввод / вывод файла, последовательный порт...). Если что-то не работает, пожалуйста, поместите подробный отчет об ошибках на форуме или bug Tracker. Если все работает хорошо, вы также можете написать о своем успехе. Удостоверьтесь, что используете последнюю версию FB (отчеты по FB, более старой версии, ниже чем 0.20, вероятно, не будут рассматриваться и посчитаются устаревшими), и также проверьте этот документ прежде, чем жаловаться на что-либо.

Ограничения

Порт DOS довольно хорошо работает и актуально поддерживается. Несколько различий по сравнению с другими платформами существуют. В основном, это особенности, которые не поддерживаются операционной системой DOS или RinTime C:
  • Кросс-компиляция для другой платформы
  • Многопоточность (смотрите FAQ 23)
  • Графика в режиме окна и использование OpenGL
  • Установка ScreenRes с размерами не соответствующими разрешению, поддерживаемому видеокартой
  • Unicode не поддерживается в DOS, WString будет так же как ZString, наборы символов, кроме латинского, не поддерживаются. (Сделайте это самостоятельно)
  • Динамические библиотеки (DLL's) не создаются и не используются (по крайней мере, не "легко"), ограничено количество доступных статических внешних библиотек, используемых в DOS.

FreeBASIC DOS связанные вопросы:

- 1. FB 32-битный компилятор - я нуждаюсь в 32-битном DOS?
- 2. А как насчет FreeDOS-32? Будет ли FB работать на ней?
- 3. Когда запускаю FreeBASIC в DOS, я получаю 'Error: No DPMI' message!
- 4. Есть ли возможность, как избавиться от этих CWSDPMI.EXE и CWSDPMI.SWP?
- 5. Можно ли использовать другие расширители DOS, как DOS/4GW, Causeway, DOS/32A?
- 6. Где находится приятный синий экран со всеми... / где это IDE?
- 7. Как можно просмотреть документацию в формате CHM или PDF в DOS?
- 8. Как я могу написать / изменить свой исходный код?
- 9. Как я могу проиграть звук в DOS?
- 10. Как я могу использовать USB в DOS?
- 11. Как я могу использовать графику в DOS?
- 12. DEF SEG отсутствует в FB! Как я могу обойти это в своем коде?
- 13. Как я могу переписать QB вызовы прерываний/доступа DOS и прерывания BIOS?
- 14. Как я могу переписать QB обработку XMS / EMS?
- 15. FBC выдает 'cannot find lsupcxx' error!
- 16. Как я могу использовать последовательный или параллельный порт?
- 17. Как я могу использовать принтер?
- 18. Как я могу сделать скриншот FreeBASIC программы, работающей в DOS?
- 19. Графический режим не работает (замораживание / черный экран / мусор)!
- 20. Проблема мыши! Мышь не работает вообще в DOS / стрелка 'скачет' / и т.д....
- 21. Что относительно проблем c 64 KiB и 640 KiB / сколько памяти поддержано FB в DOS?
- 22. Моя программа вылетает, когда я пытаюсь использовать больше, чем cca 1 MiB RAM! Действительно ли это - ошибка в FreeBASIC?
- 23. Многопоточные функции игнорируются в DOS? Помогите!
- 24. Исполняемые файлы, сделанные с FB DOS раздуты!
- 25. Компиляция происходит очень медленно с FB!
- 26. SLEEP не работает! Как сделать паузу?
- 27. Производительность очень плохая в DOS!
- 28. Можно ли получить доступ к секторам диска с FB?
- 29. Могу ли я использовать inline ASM с расширенными инструкциями как SSE в DOS ?

См. также



FreeBASIC DOS связанные вопросы


1. FB 32-битный компилятор - я нуждаюсь в 32-битном DOS?
Нет, DOS версия FreeBASIC использует DOS extender, который позволяет выполнять 32-разрядный код поверх 16-битного DOS ядра. Вы можете использовать FreeDOS (16-bit), Улучшенный-Dr-DOS, старый закрытый Dr-DOS, или даже MS-DOS до версии cca 4.

2. А как насчет FreeDOS-32? Будет ли FB работать на ней?
Пакет FreeDOS-32 является экспериментальным к моменту написания данного комментария, но он должен выполнять приложения FreeBASIC без изменений. Хотя поддержка FB DOS уже работает на FreeDOS (16), он должен быть готов к FreeDOS-32 также.

3. Когда запускаю FreeBASIC в DOS, я получаю 'Error: No DPMI' message!
Вам нужно DPMI хост (DPMI kernel, DPMI server), файлы "CWSDPMI.EXE" (cca 20 KiB) или HDPMI32.EXE (cca 34 KiB). См. требования и FAQ 4 для более подробной информации.

4. Есть ли возможность, как избавиться от этих CWSDPMI.EXE и CWSDPMI.SWP?
 Да, 2 возможности. Чтобы избавиться от cwsdpmi.exe и создать автономный DOS исполняемый файл с вложенным CWSDPMI, вам нужен пакет CWSDPMI и файл "EXE2COFF.EXE". Используя EXE2COFF, вы удаляете загрузчик cwsdpmi.exe (файл теряет 2 KiB размера, в результате чего файл "COFF" без расширения), а затем склеиваете файл "CWSDSTUB.EXE" с этим COFF. Новый исполняемый файл на ~21 КБ больше, чем оригинал, но зато автономный, никаких дополнительных файлов не требуется. Чтобы избавиться от CWSDPMI.SWP, вы можете отредактировать свой исполняемый файл с помощью CWSPARAM.EXE, и отключить замену (иногда - неправильно - ссылки подкачки). Заметим однако, что это ограничит память, которая может быть выделена из количества физической памяти, установленной в системе. Эта работа может быть проделана как с FBC.EXE , так и со всеми исполняемыми файлами, созданными FBC. Данный метод также описан в документации CWSDPMI в пакете. Кроме того, вы можете использовать WDOSX или D3X extender. Они не заменяют, а создают автономные исполняемые файлы Так как они запускают исполняемый файл на кольце безопасности Ring 0, обработка аварийных ситуаций не очень хороша и может вызвать зависание или перезагрузку при багах, когда другие хосты выхода обращаются к дампу регистра. Кроме того, не все вызовы хорошо работают с WDOSX или D3X. Наконец, вы можете использовать HDPMI . Загрузите файл "HXRT.ZIP" (здесь: japheth.de/HX.html), распакуйте "HDPMI32.EXE" (cca 34 KiB) и "HDPMI.TXT" (не требуемый кодом, только для информации), и включить его в ваш запуск DOS ("HDPMI32 -r"). Это создаст HDPMI резидент и предотвратит все FreeBASIC (а также FreePascal и DJGPP) программы кричать об отсутствующем DPMI и замене. HDPMI еще не может (легко) быть включено в ваш исполняемый файл. Запуск исполняемого файла, содержащего D3X, CWSDPMI или какой-либо хост DPMI внутри под HDPMI или другим внешним хостом, сделает так, что встроенный хост будет просто пропускается. Использование DPMI, безусловно необходимо для FreeBASIC, так как FB не может генерировать 16-разрядный код в реальном режиме, и нет никакого другого хорошего способа для выполнения 32-разрядного кода в DOS.

5. Можно ли использовать другие расширители(extenders) DOS, как DOS/4GW, Causeway, DOS/32A?
Не каждый расширитель (extenders). Так называемые WATCOM подобные расширители(extenders) не могут использоваться из-за важных различий в управлении памятью и выполнимой структуре. WDOSX и D3X действительно работают, так как они - мультистандартные расширители(extenders). Вы также можете использовать PMODE/DJ (не "оригинальные" Tran's PMODE, и не PMODE/W (!), сэкономите cca 5 KiB по сравнению с CWSDPMI, может быть включен в EXE, но может бы затронута стабильность или работа), или, как вышеупомянутый, HDPMI

6. Где находится приятный синий экран со всеми... / где это IDE?
Проект FreeBASIC сосредотачивается на компиляторе, который производит исполняемые файлы из ваших источников BAS. Это выглядит не захватывающе, но является самым важным для качества программного обеспечения, развитого нами. Проект не включает IDE. Есть несколько сторонних IDE для FreeBASIC, но вероятно ни у одной из них нет версии DOS к настоящему времени. Если Вы действительно нуждаетесь в этом, вы могли бы попробовать Rhide, но стоит отметить, что он сложный и с багами, так что используйте его на свой страх и риск. См. также FAQ 7 и 8.

7. Как можно просмотреть документацию в формате CHM или PDF в DOS?
Нет хорошего способа для просмотра CHM или PDF файлов в DOS к настоящему времени. Но тем не менее вы можете просматривать FreeBASIC документацию. Один из разработчиков FreeBASIC coderJeff обеспечивает FreeBASIC просмотрщик документации в специальном формате, и есть также версия DOS. Он похож на QB встроенную справочную систему, но не содержит редактор или IDE. Скачать здесь: http://www.execulink.com/~coder/FreeBASIC/docs.html

8. Как я могу написать / изменить свой исходный код?
Есть много редакторов для DOS , но лишь немногие из них хороши - некоторые возможности имеет FreeDOS EDIT (используемая версия 0.7d (!!) или 0.9, с лимитом 64 KiB, субоптимальная стабильность (регулярно сохраняет свою работу)), SETEDIT, INFOPAD (поставляется с компилятором CC386, можно редактировать большие тексты, имеет подсветку синтаксиса для C и ASM, но не для BASIC).

9. Как я могу проиграть звук в DOS?
Есть 2 способа, как играть звук в DOS: («архаичный») динамик ПК, известный для звукового сигнала, или звуковая карта. Спикер легко контролировать, позволяет больше, чем можно было бы представить, даже для воспроизведения звуковых файлов (WAV, OGG Vorbis, MP3 с декомпрессией кода и т.д.), вы можете повторно использовать большую часть существующего кода QB легко (пример: o-bizz.de/qb...speaker.zip) или ASM код с включаемыми вставками ASM, но предоставляет один канал и только 6 бит и конечно качество значительно хуже, чем через звуковую карту, и на некоторых новейших (P4) качество ПК динамика очень плохое или его нет вообще. Для старых ISA звуковых карт, существует много примеров кода. Новые звуковые карты PCI могут быть доступны , если у них есть совместимость с DOS, либо используя совместимый драйвер «эмуляции» устройства SB16, если он конечно доступен для вашей карты (к сожалению, это становится все больше и больше не нужным, драйверы DOS редки или даже не существуют), или доступ к звуковой карте напрямую (это низкоуровневое программирование, связанное с оборудованием, вам потребуется немало знаний, а так же технические документы о карте). Существует несколько источников DOS аудио-плееров, например MPXPLAY (написан на C с небольшим кол-вом ASM), поддерживает оба метода (родной + «emu» драйвер), увидеть обновленный список здесь: drdos.org/...wiki...SoundCardChip. Поддержка звука в DOS это не дело для FB DOS порта, на самом деле FB не "поддерживает" звук на Win32 и Linux, а все сделанные игры для этих платформ используют сторонние библиотеки, но никак не встроенные команды FreeBasic. Для воспроизведения сжатых файлов (MP3, Ogg Vorbis, FLAC, ...), вам дополнительно понадобится код декомпрессии, существующие DJGPP порты этих библиотек могут быть удобными для этого.

10. Как я могу использовать USB в DOS?
Опять же, дело не в FB, вам нужен драйвер, FB не "поддерживает" USB на Win32 или Linux. См. вики: drdos.org/...wiki...USB о возможностях использования USB в DOS.

11. Как я могу использовать графику в DOS?
GUI или графика в DOS определенно возможны, есть несколько подходов:
    • Использование графической библиотеки FB. Она использует VESA (предпочтительно линейный, но также и поддерживает совмещение) чтобы получить доступ к видеокарте, и поддерживает любое разрешение, о котором сообщит VBE драйвер VESA, в дополнение к стандартным способам VGA.
Примечание: используйте предпочтительно версию 0.20 FB или более новую. Работа графики в DOS на FB 0.17 не очень хороша, а в более ранних версиях не работает вообще.
    • VGA режим 320x200x8bpp: очень простая, максимальная надежность и совместимость, но низкое разрешение и 256 цветов только, см. пример.
    • VGA "ModeX" 320x240x8bpp: похоже на прошлую, менее легкая, хорошая надежность и совместимость, но с низким разрешением и поддержкой 256 цветов только, см. пример.
    • VGA "выровненный" режим 640x480x4bpp: трудная установка пикселей, максимальная надежность и совместимость, но низкое разрешение и 16 цветов только, пока нет примера(?).
    • Некоторые другие "странные" VGA "ModeX" режимы (like 360x240x8bpp) : возможно, но для уродов только ;-)
    • Написать свой код VESA: Сложно, хорошая совместимость, возможно высокое разрешение и истинный цвет, могут быть проблемы с надежностью, если не реализовать тщательно.
    • Использование сторонних библиотек (DUGL, Allegro, MGL, WxWidgets): Позволяет создавать "дорогую" графику, & GUI's, раздувания размера EXE, нужно уважать лицензию библиотеки, возможные потери надежности.
Обратите внимание, что некоторые графические карты сообщают об ограниченных возможностях через VESA, в первую очередь меньше памяти (например 8 Мб вместо 64 Мбайт) или малые режимы (например, только режимы с 24 битами на пиксель видны, в то время как 32 бит на пиксель скрыт, только при более низких разрешениях видны (до CCA 1280x1024 ) в то время как более высокие скрыты, только "4:3" режимы видны, а «широкие» режимы скрыты). Это проблема карты, а не DOS или FreeBASIC. Вы увидите дополнительные возможности в других ( не DOS системах), или в DOS только с помощью инструментов определения оборудования, идущие до самого низкого уровня в обход VESA.

12. DEF SEG отсутствует в FB! Как я могу обойти это в своем коде?
DEF SEG связан с 16-разрядной  RM адресацией и был удален из-за этого. "Прямой" низкоуровневый доступ к VGA или других областям памяти не представляется возможным, потому что модель памяти FreeBASIC (так же, как DJGPP ) не с нуля. Для низкоуровневого доступа к памяти DOS, используйте DOSMEMGET и DOSMEMPUT см. в разделе "vga13h.bas" например, или "_dos_ds" селектор для ASM вставок, см. пример:

'' DOS только, пример ASM вставок, для низкоуровневого доступа к памяти 
'' Запускается только в текстовом режиме 80x25

'' Включение dos/go32.bi с объявлением "_dos_ds"
'' "Черчение" в GO32 блок

#include "dos/go32.bi" 

Dim As UInteger DDS

DDS=_dos_ds

? : ? "Hello world !"
? "_dos_ds=$";Hex$(DDS) 
? "This is just a tEst - abcd ABCD XYZ xyz @[`{ - press any key ..."

Do
  Sleep 1000
  If Inkey$<>"" Then Exit Do
  Asm
    mov  eax,[DDS] '' Непосредственное использование "_dos_ds" не будет работать здесь!!!
    push eax
    pop  gs        '' Только, чтобы быть уверенным, это обычно устанавливается
    Xor  ebx,ebx
    aa3:
    mov  al,[gs:0xB8000+2*ebx]
    cmp  al,65  '' "a"
    jb   aa1
    cmp  al,122 '' "z"
    ja   aa1   
    cmp  al,90  '' "Z"
    jbe  aa2
    cmp  al,97  '' "a"    
    jb   aa1 
    aa2: 
    Xor  al,32  '' Swap case
    aa1:
    mov  [gs:0xB8000+2*ebx],al
    inc  ebx
    cmp  ebx,2000
    jne  aa3
  End Asm  
Loop
? : ? "Bye"
End


13. Как я могу переписать QB вызовы прерываний/доступа DOS и прерывания BIOS?
Эти прерывания могут быть доступны только с помощью DOS версии FB.

Доступ к прерываниям происходит медленнее, чем в QB: с FB DPMI хостом придется делать 2 переключения контекста, переходить в реальный режим и возвращаться. Все это будет есть сотни часов в raw DOS и тысячи часов, если emm386 загружен или если в Windows DOS Box. Замедление может быть незначительным или относительным. Вы должны попытаться свести к минимуму количество таких вызовов, и обрабатывать больше данных за вызов - по крайней мере несколько КБ, а не один или несколько байт.

Используя DJGPP's DPMI враппер:

#include "dos/dpmi.bi"

Type RegTypeX As __dpmi_regs

#define INTERRUPTX(v,r) __dpmi_int( v, @r )


Кроме того, вы можете вызвать INT через inline ASM. Две важные вещи: вы должны подумать о том, что модель памяти FB не от нуля (см. также FAQ 12, "DEF SEG" вопрос), и, кроме того, "напрямую", передать адреса (как DS:[E]DX) INT не получится. Кроме вас, есть DPMI хост с "DOS API трансляцией".

14. Как я могу переписать QB обработку XMS / EMS?
Зависит от того, зачем это нужно. Если просто обойти низкоуровневые ограничения памяти, то просто удалите его и используйте «обычные» обращение  к типам данных/памяти FB. Если используется для (звука) DMA, вам не повезло и придется полностью перестраивать код, о звуке см. FAQ 9. Для DMA использовать предпочтительно низкоуровневую память (не должно быть большой проблемой, так как код приложения, и большинство буферов в памяти вместо DPMI), DMA в памяти DPMI возможно, но очень трудно.

15. FBC выдает 'cannot find lsupcxx' error!
Источником этой проблемы является файл libsupcxx.a в каталоге LIB\DOS\ , имеющий 9 символов в имени. Ваша неисправность скорее всего из-за того, что вы распаковали ZIP архив в системе Windows, а потом перенесли папку в DOS. И в результате в DOS без поддержки LFN данное имя выглядит так: LIBSUP ~ 1.А . Конечно же данный файл не может быть найден. Переименуйте файл в  LIBSUPCX.A (одна X только) или распаковывайте ZIP архив в DOS. Примечание: изменено в FB 0.18, повторное тестирование необходимо.

16. Как я могу использовать последовательный или параллельный порт?
DOS INT14 не очень полезный/эффективный, так как он отправляет/считывает только один символ при каждом вызове. Так что лучше использовать внешнюю DOS32 порт связи библиотеку. /* Может кто-то знает лучшее? */ FB до 0.18-2 версии не поддерживала OPEN COM на DOS, coderJeff имеет экспериментальную библиотеку/драйвер , включенную в FB 0.18.3.

17. Как я могу использовать принтер?
Ядро DOS не поможет вам здесь, так что вы должны подготовить текст(тривиально) или пиксельные данные (приемлемо и легко для принтеров, совместимых с "ESC/P" стандартом) самостоятельно и отправить в принтер через параллельный порт или USB. Использование дополнительных драйверов (см. FAQ 10). Так называемые "GDI" или "Windows" принтеры не могут работать в DOS , по крайней мере без заметных усилий.

18. Как я могу сделать скриншот FreeBASIC программы, работающей в DOS?
В идеале включите эту функцию в ваш собственный код. DOS TSR на основе screenshooters как SNARF будет работать с текстовыми экранами, но, вероятно, не будет работать с FREEBASIC GFX библиотекой. Это не совсем ошибка, это проблема «конструкции».

19. Графический режим не работает (замораживание / черный экран / мусор)!
Поместите отчет об ошибке на форуме. Чтобы сделать его полезным и как можно более продуктивным, действуйте с учетом шагов и предоставляя всю соответствующую информацию:
    • Графика не может хорошо/вообще на очень старых PC. Если ваш процессор имеет меньше чем 500 МГц, обеспечьте точную информацию об этом. Если вы не знаете как , используйте RayeR в CPUID или аналогичную программу для тестирования.
    • Необходима точная информация о видеокарте. Протестируйте на DOS с помощью VBEDIAG от DrV's (только информация) и RayeR VESATEST (пытаясь установить режим, выводит визуально результат). Узнайте, какие «полезные» режимы (640 x 480, 800 x 600) поддерживаются и с какой глубиной (8, 16, 24, 32 bpp).
    • Выяснить и описать, что именно неправильно («режим работает с VESATEST, но не с FB», «нет графики, но высвечивается ошибка», «черный экран и замораживание камеры», «графика является беспорядочной/неполной»,...).
    • Если некоторые сложные программы не работают, попробуйте минимальный тест, такой как размещение круга в середине экрана.
    • Попробуйте без драйвера мыши (это снижает "нагрузку" процессора).
    • Узнайте, какие режимы страдают. Если не работает режим, попробуйте уменьшить разрешение или глубину, не забудьте проверить «простые»/безопасные режимы 640x480 с 32/24/16/8 bpp, 640x480 с 4 bpp и 320x200 с 8bpp.
    • Для некоторых старых карт есть VESA доступные драйверы (S3VBE/UVIVBE). Тест как с ними, так и без так же желательно включать в отчет.
    • Удалите потенциально проблематичное содержание (менеджеры памяти, драйвера) из файлов загрузки DOS. Ничего такого не требуется для FB, за исключением DPMI-хоста (см. также FAQ 4.).
    • Разместите информацию о вашей видеокарты, процессоре (если старый), о версии DOS, об ошибке и простой пример кода.
RayeR VESATEST и CPUID могут быть взяты здесь: rayer.ic.cz/programm/programe.htm , VBEDIAG здесь drv.nu/vbediag/.

20. Проблема мыши! Мышь не работает вообще в DOS / стрелка 'скачет' / и т.д....
Чтобы использовать мышь в DOS, необходимо иметь совместимый драйвер, который признает вашу мышь, и признает FreeBASIC библиотеку. Для получения оптимальных результатов, вам нужен хороший драйвер и подходящая мыши.

Мышь: оптимальный выбор мышь PS/2. Старого типа мышь, также будет работать. Новейшая мышь USB не очень подходит для использования в DOS, так как требуется совместимый (INT33) USB драйвер (нет сейчас, только некоторые экспериментальные), или полагаться на эмуляции BIOS (не всегда доступны, или «неточны»).

Драйвер: предпочтительным выбором является CTMOUSE от проекта FreeDOS. Есть варианты 1.9a1, 2.0a4 и 2.1b4 от июля 2008 года. Это с (но не ограничиваясь) FreeDOS, или скачать версию отсюда: ibiblio.org/pub/...mouse . Ни один из них не является совершенным, но все же они часто лучше, чем большинство конкурентов. 1.9xx и 2.1xx будут сотрудничать с BIOS, позволяя эмулировать USB, 2.0xx обходит BIOS и таким образом эмуляция USB работать не будет. Также драйверы мыши Logitech обычно неплохо работают, скачать здесь: uwe-sieber.de/util_e.html - версия 6.50 является неплохой. Известные проблемы являются с DRMOUSE и некоторыми (старыми?) версиями MSMOUSE.

Если мышь не работает вообще, то скорее всего драйвер не загружается, не распознает мышь (см. сообщений драйвера), или не совместим с INT33 «стандартом». Для USB мыши активация «USB mouse emulation» в настройках BIOS может помочь.

Если элемент управления мыши «неточный», стрелка «прыгает», то скорее всего драйвер плохой , нужно поменять на более лучший или эмуляция BIOS плоха - решение состоит в том, чтобы купить мышь PS/2 тогда.

21. Что относительно проблем c 64 KiB и 640 KiB / сколько памяти поддержано FB в DOS?
Управление памятью дело DPMI хоста, а не компилятора. FreeBASIC и исполняемые файлы, порождаемые им, не страдают от этой проблемы, так как они используют 32-битный DPMI код, а не реальный режим. Вы можете использовать почти всю память вашего компьютера, с некоторыми ограничениями, но они гораздо выше 64 или 640 KiB. CWSDPMI R5 проверяется, чтобы хорошо работать только до 512 Мбайт, дополнительная память не рушит его (в отличие от некоторых более ранних версий), но игнорируется. HDPMI предполагает большую поддержку: до 4 GiB (предел 32-битной адресации), но большого тестирования не проводилось, проверялось только до ~1,5 GiB. FreeBASIC и код, сгенерированный им, не требуют классических менеджеров на основе DOS памяти (HIMEM / XMS и EMM386/EMS), но сосуществует с ними, если они присутствуют. Все это, конечно, относится к настоящему DOS. Такие вещи как "Dos Box" будут держать контроль над управлением памятью и дают лишь небольшой кусок памяти для вашего кода (зависит от самой программы, до ~64 MIB).

22. Моя программа вылетает, когда я пытаюсь использовать больше, чем cca 1 MiB RAM! Действительно ли это - ошибка в FreeBASIC?
Нет, это не ошибка в FreeBASIC и это не совсем DOS конкретно, см. также Компилятор FAQ. Для новичка, простым решением является использовать Shared для массивов. Более продвинутые пользователи могут рассмотреть возможность использования функции управления памятью, как Allocate. Это тем более важно в DOS, так как позволяет приложению работать на старых компьютерах с небольшим объемом памяти (и до сих пор редактировать по крайней мере небольшие тексты), а также использовать всю RAM при наличии (и редактировать огромные тексты).

23. Многопоточные функции игнорируются в DOS? Помогите!
Многопоточные функции не поддерживается для DOS порта, и скорее всего вряд ли это будет сделано. Причина проста: многопоточности нет ни в ядре ​​DOS, ни DPMI хосте/стандарте, ни в "GO32" DOS Extender, в отличие от Win32 или ядра Linux. Однако нет ничего невозможного в DOS: вы можете настроить потоки на вершине DPMI. Есть несколько возможностей, две из которых:
    • Настройка ISR, смотрите "ISR_TIMER.BAS" пример. Это не "полная" замена, но достаточна в некоторых случаях.
    • Существует Pthreads библиотека для DJGPP, позволяющая "эмулировать" Linux-подобную поточность до некоторой степени. Это не работает приемлемо для [P]7-ZIP DJGPP порта (написанного в C++), никаких тестов с FB еще не проделано.

24. Исполняемые файлы, сделанные с FB DOS раздуты!
Это верно, но нет простого/быстрого способа исправить. FB является 32-битным компилятором, и большая часть из размера импортируется из DJGPP. ! Напишите мне! (См. форум: freebasic.net/forum/viewtopic.php?t=11757 )

25. Компиляция происходит очень медленно с FB!
Проблема: "FBC компилирует программу "Hello world" ~10 секунд ! TurboBASIC / QBASIC / VBDOS / PowerBASIC тратит меньше секунды для этого задания..."

Верно, но это проблема "конструкции" : FB компилирует источники в 3 шага, сохраняя промежуточные файлы, как описано в CompilerCmdLine, в то время как многие старые компиляторы делают только 1 проход в памяти. Это связано главным образом с производительностью файлового ввода-вывода, см. FAQ 27 ниже о возможностях улучшения. Небольшое улучшение может быть достигнуто , создав резидент DPMI хоста (HDPMI32 - r или CWSDPMI -p, см FAQ 4 выше). Обратите внимание, что в больших проектах разница не будет столь ощутимой.

26. SLEEP не работает! Как сделать паузу?
Sleep не работает ... но имеет разрешение cca 55ms = 1/18s только, таким образом «SLEEP 500» нормально, хотя пример с помощью «SLEEP 2» для 2 миллисекунд не будет работать. !напишите мне!/!исправьте меня!
    • PIT / BIOS таймер (запускает 18.2 Гц по умолчанию), посмотрите таймер BIOS или ваш собственный, посмотрите пример "ISR_TIMER.BAS", поднимающий частоту PIT (использование с осторожностью)
    • Опрос таймера BIOS + PIT счетчик, метод из TIMERHLP.ASM от DKRNL32, позволяет повысить точность выше, не поднимая частоту PIT
    • RDTSC инструкция (Pentium и выше)
    • RTC clock
    • Задержка циклами

27. Производительность очень плохая в DOS!
Проблема: «производительность ужасна в DOS при сравнении с Win32 / Linux бинарными файлами, составленными из очень же источника!» или «что еще хуже, тот же двоичный файл DOS работает гораздо быстрее в NTVDM чем в DOS!»

Это может случиться, но DOS никоим образом не предопределен быть медленным, неэффективность может быть исправлена. Сначала вы должны определить области, где ваш код теряет производительность.

Файловый ввод-вывод : DOS по умолчанию использует очень мало памяти для своих буферов, в то время как другие системы используют гораздо больше и «агрессивно» с кэшированием файлов. Работа с большим количеством мелких файлов, приводит к серьезной потере производительности. Решение заключается в том, чтобы установить файловый кеш, например LBACache, или вы можете установить RAMDISK(один хороший: SRDISK) и скопируйте файлы (например FreeBASIC установки) туда и работать там (не забудьте частенько делать резервную копию вашей работы). Вам понадобится XMS хост (используйте HIMEMX). Также DOS по умолчанию использует BIOS для доступа к жестким дискам, в то время как другие системы, стараются использовать DMA. Протестируйте утилитой: IDECHECK от Japheth (скачать: japheth.de/Download/IDECheck.zip) - запустите его в режимах «I13» и «DMA» и сравните результаты. Если «DMA» намного быстрее (может быть в 1... 10 раз, в зависимости от модели компьютера), тогда установка драйвера DOS DMA (например XDMA 3.1 стоит попробовать) может принести к большому ускорению на больших файлах. Также убедитесь, что для чтения и записи данных используются большие куски (16 КБ по крайней мере), а не по байту. Другие операционные системы более снисходительны здесь, но на DOS каждый вызов файлового ввода-вывода вызывает небольшую задержку «добавку». Таким образом, эффективный код с хорошей буферизацией имеет решающее значение.

Графика : Pentium 2 и более новые процессоры имеют функцию кэша, связанную с именем "MTRR" для ускорения записи в память видео. Драйвера других ОС, как правило, включают его, а DOS нет (так как он не имеет дело с графикой вообще). Используйте утилиту "VESAMTRR" от Japheth (содержащегося в "HXGUI.ZIP" пакете), это даст ускорение. Переключайте разумно, чтобы избежать возможные , хоть и "не смертельные" сбои в приложениях, вплоть до перезагрузки. Возможный фактор ускорения варьируется в зависимости от модели ПК, в ~20 раз. Также обращение к мыши ест некоторую(иногда большую) производительность процессора на DOS, это известное слабое место ( DOS FB GFX не является "ужасным", это просто общий «стандарт» - что не очень хорошо), фикс теоретически возможен, но очень не прост. Вы же просто можете попробовать несколько драйверов мыши (см. FAQ 20).

28. Можно ли получить доступ к секторам диска с FB?
Вы можете..., но FreeBASIC не поможет вам слишком много здесь: нет «портативного» решения, использовать OS специфический низкоуровневый способ. Для DOS возможны 3 метода
    • Использование функций доступа к логическим дискам DOS для доступа к секторам в обход файловой системы, см. пример в форуме: freebasic.net/forum/viewtopic.php?t=11830
    • Использовать физический диск BIOS INT 13, минуя DOS
    • Использование портов ЦП, низкий уровень, минуя DOS и BIOS, смотрите форум freebasic.net/forum/viewtopic.php?t=16196, Источник IDECHECK из 27 FAQ выше, FASM форум или некоторые ресурсы развития ОС
Обратите внимание, что такие эксперименты немного «опасны» - можно легко потерять данные или сделать ваш компьютер не загружаемым, если что-то пойдет не так.

29. Могу ли я использовать inline ASM с расширенными инструкциями как SSE в DOS ?
Вы можете ... но инструкции SSE2 и выше должны быть включены. Это как правило дело хостов DPMI , HDPMI32 и CWSDPMI 7 , но с другими хостами это вряд ли будет работать. Убедитесь что CPUID правильно настроена перед использованием таких инструкций. Хорошей идеей будет проверить совместимость со старыми процессорами (Pentium, 80386).

См. также