Xms allocation error

Xms allocation error aladdin Как запустить Aladdin? Как запустить Аладдин с музыкой? Раньше (был 166ММХ/ZIDA 5STX/32RAM, Win95) я загружался в ДОС с ЕММ и все было ок. А сейчас, после апгрейда (Celeron333Mendocino/Chaintech 6BTM/128RAM, Win98), че-то не получается (при запуске Aladdin.exe пишет XMS allocation error) Думал что это из-за Win98, поставил Win95 — такая же […]

Xms allocation error aladdin

Как запустить Aladdin?

Как запустить Аладдин с музыкой?
Раньше (был 166ММХ/ZIDA 5STX/32RAM, Win95) я загружался в ДОС с ЕММ и все было ок.
А сейчас, после апгрейда (Celeron333Mendocino/Chaintech 6BTM/128RAM, Win98), че-то не получается (при запуске Aladdin.exe пишет XMS allocation error)

Думал что это из-за Win98, поставил Win95 — такая же ошибка.
Так что мне надо покупать 486-й, чтоб в Аладина поиграть?

2Aladdin
Из-за алладина ты переустановил винды?
Не ужели это так принципиально?
Ну тогда. как было сказано ранее, не мной правда,(замодерили) тебе бы надо поставить System Commander. Эта прога есть почти на всех CD для работы с Windows. Ну так вот. Эта прога позволяет разбивать винт на несколько независимых разделов и позволяет загружаться с разных операционнных систем. Т.е. первый вариант загрузки у тебя будет Windows, второй DOS 6.22. Ну а как настроить ДОС под игру я думаю ты знаешь (понял из твоих слов).
А ошибка выдаётся из-за того что не загружен EMM386.exe

Если что-то непонятно — у меня есть мыло (см.Инфо), обычно там все находят большинство ответов.

А System Commander для данной ситуации не слишком круто?
Вполне достаточно сделать раздельную, DOS/Windows, загрузку. То есть config.sys начать с
[MENU]
MENUITEM=WINDOWS
MENUITEM=DOS
. ну и так далее. И для ДОСа прописать всё что нужно. Нужны будут подробности — расскажу дальше.

——————
Поможем чем сможем.
Лучше маленький рубль, чем большое спасибо.

2BHunter
Да не будет алладин так работать! Памяти ему надо по-моему 580 кб.
Ну если ты хорошо память конфигурируешь и сможешь выделить 580 кб базовой памяти под ДОСом (ver. win95 и более), то пожалуйста, делай так.
А вообще, ненавижу я эти старые ДОСовские игрушки — они память базовую почти всю используют. Тут верхней немерено, десять таких игрушек в неё влезет целиком, а им базовую подавай, да побольше. Под завязку!.
В ДОС (ver.6.22) я делал 610кб доступной, выкинув всё лишнее.

——————
Не говорите, что мне нужно делать, и я не буду говорить, куда вам нужно идти.

Спасибо всем за то, что откликнулись.
System Commander пока не нашел, поэтому разовьем тему про раздельную загрузку.

:min_emm
c:systemncnc.exe
GOTO END

:dos
SET BLASTER=A240 I5 D1 H1 P330 T6
C:SYSTEMSBCDDRVMSCDEX.EXE /D:MSCD001 /V /M:8
c:systemmousemouse.com
c:systemrusrk.com
c:systemncnc.exe
GOTO END

:end
SET TEMP=C:RECYCLED
SET TMP=C:RECYCLED
mode con codepage prepare=((866) C:WINDOWSCOMMANDega3.cpi)
mode con codepage select=866
keyb ru,,C:WINDOWSCOMMANDkeybrd3.sys

[menu]
menucolor=7,0
menuitem min_emm, Minimum+Emm
menuitem dos, Dos standart
menuitem win, W i n d o w s 9 8
menudefault win,9

[min_emm]
break on
DEVICE=C:windowsHIMEM.SYS
DEVICE=C:windowsEMM386.EXE RAM
DOS=HIGH

[dos]
break on
DEVICE=C:SYSTEMSBCDDRVSBIDE.SYS /D:MSCD001 /P:1F0,14 /V
DEVICE=C:windowsHIMEM.SYS
DEVICE=C:windowsEMM386.EXE RAM
DOS=HIGH
FILES=40
BUFFERS=40

[win]
break on
DEVICE=C:windowsHIMEM.SYS
FILES=40
BUFFERS=40
STACKS=0,0

[common]
device=C:WINDOWSCOMMANDdisplay.sys con=(ega,,1)
Country=007,866,C:WINDOWSCOMMANDcountry.sys

При загрузке Minimum+Emm освобождается 602 144 байт памяти, при запуске аладдина – XMS allocation error.
Вы все говорите про DOS 6.22. Может у меня другая версия. Как это узнать? В ДОСе пишу: ver, получаю ответ: Windows 98 [Версия 4.10.2222].
А может версия здесь не причем? Где ошибка? Что делать? Подскажите.
Еще раз спасибо.

Надо бы попробовать разные параметры для Himem и Emm386. Поищи в основной папке Windows файл MSDOSDRV.TXT — там эти параметры очень подробно расписаны. Да, я бы ещё строку с DOS=HIGH записал так:
DOS=HIGH, UMB

Ты же собирался с музыкой играть. А установки для звуковой карты у тебя в меню [dos].
Windows 98 [Версия 4.10.2222] — это Win98 SE, значит DOS 7-й версии. По идее ничего страшного.

——————
Поможем чем сможем.
Лучше маленький рубль, чем большое спасибо.

2Aladdin
Правильно BHunter говорит. Ты с таким конфигом долго будешь музыку в алладине искать. Перенеси
DEVICE=C:SYSTEMSBCDDRVSBIDE.SYS /D:MSCD001 /P:1F0,14 /V
из [dos] в [min_emm] чтобы драйвер для звуковички грузился и поставь DOS=HIGH, UMB
Я вчера домой ездил и специально посмотрел настройку при алладине.
То же самое почти, что и у тебя, только память у меня явно указына
DEVICE=C:windowsEMM386.EXE RAM 2048 и работает.
И памяти аллдину надо не 580кб, а 570кб.(как было сказано ранее)
ЗЫЖ SET BLASTER=A240 I5 D1 H1 P330 T6 — это необязательный параметр, это просто указывается системе какие настройки бластера будут приняты по умолчанию. Используется в тех играх, где есть автоопределение настроек звуковой карты. Например Quake у меня никак не хотел под ДОСом со звуком работать пока я ему SET BLASTER не написал.
И ещё. Там есть такой файлик, называется setsnd.exe — это настройка звука. Сделай в нём настройки под свою звуковую плату.

——————
Не говорите, что мне нужно делать, и я не буду говорить, куда вам нужно идти.

Аладдин — очень извращенная гама, ей нужна сразу и EMS и XMS память, по два мега. А вообще, я лично видел своими глазами версию для виндовс95, сней нет этого геммороя

Переделал я
config:
[min_emm]
break on
DEVICE=C:SYSTEMSBCDDRVSBIDE.SYS /D:MSCD001 /P:1F0,14 /V
DEVICE=C:windowsHIMEM.SYS
DEVICE=C:windowsEMM386.EXE RAM 2048
DOS=HIGH, UMB

autoexec.bat остался такой же.

Запускаю Аладдин – та же ошибка.
Почему у вас работает, а у меня нет?

2Jameson:
У меня есть версия под В95.
Но, во-первых, для досовского Аладдина я отредактировал экзешник (бессмертие поставил), а во-вторых, это уже дело принципа.

2Aladdin
Может ему базовой памяти не хватает?
Хотя нет, он бы выдал соответствующую месагу.
Тады ХЕЗ. А на счёт экзешника: дык там тренер есть. А в виндах в принципе тоже можешь экзешник хакнуть. Или есть такая прога Cheat O’Matic называется, ломает игрушки под виндами.
А может у тя аладдин какой глюкнутый?
Я на выходные домой поеду, если не забуду, привезу свой аладдин и настройки, если хочешь конечно.

——————
Не говорите, что мне нужно делать, и я не буду говорить, куда вам нужно идти.

Попрбуй в таком порядке:

config:
[min_emm]
break on
DOS=HIGH, UMB
DEVICE=C:windowsHIMEM.SYS
DEVICE=C:windowsEMM386.EXE RAM 2048 всё же посмотри MSDOSDRV.TXT

autoexec
:min_emm
SET BLASTER=A240 I5 D1 H1 P330 T6
c:systemncnc.exe
GOTO END

Строку
DEVICE=C:SYSTEMSBCDDRVSBIDE.SYS /D:MSCD001 /P:1F0,14 /V
не обязательно включать, а если включаешь, то в autoexec.bat допиши
C:SYSTEMSBCDDRVMSCDEX.EXE /D:MSCD001 /V /M:8
Как я понимаю, параметры в этих двух строках прописаны автоматически при установке драйверов к звуковой карте, поэтому лучше не менять. Хотя.

——————
Поможем чем сможем.
Лучше маленький рубль, чем большое спасибо.

2Aladdin
дык DEVICE=C:SYSTEMSBCDDRVSBIDE.SYS /D:MSCD001 /P:1F0,14 /V
это у тя драйвер сидюка чтоли?
А где тогда звуковая? Или это всё вместе?

Можно попробовать освободть еще памяти. Например так:

[Options]
BootMulti=0
BootGUI=0
DoubleBuffer=0
AutoScan=1
Logo=1
WinVer=4.10.2222
;
;The following lines are required for compatibility with other programs.
;Do not remove them (MSDOS.SYS needs to be >1024 bytes).
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxa
. Тут этих иксов до фига, все я писать не буду.
.
.
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxs
——————————————————

config.sys:
——————————————————
[menu]
menucolor=7,0
menuitem dos, Dos standart
menuitem win, W i n d o w s 9 8
menudefault win,9

[dos]
DOS=NoAuto,High,UMB
FILES=40
BUFFERS=40
DEVICE=C:windowsHIMEM.SYS
DEVICE=C:windowsEMM386.EXE RAM
DEVICEHIGH=C:SYSTEMSBCDDRVSBIDE.SYS /D:MSCD001 /P:1F0,14 /V

OS
SET BLASTER=A240 I5 D1 H1 P330 T6
lh C:SYSTEMSBCDDRVMSCDEX.EXE /D:MSCD001 /V /M:8
lh c:systemmousemouse.com
lh c:systemrusrk.com
c:systemncnc.exe
Goto END

:WIN
SET TEMP=C:RECYCLED
SET TMP=C:RECYCLED
mode con codepage prepare=((866) C:WINDOWSCOMMANDega3.cpi)
mode con codepage select=866
keyb ru,,C:WINDOWSCOMMANDkeybrd3.sys
win
Goto END

2sect
Мышка и руссификатор для аладдина не нужны, так что их грузить не нужно. Да и нортон тоже впринципе, но с ним проще:из него можно просто выйти.
Я для подобных целей пользуюсь Volcov Commander’ом.(NC органически не перевариваю)
т.е. в autoexec.bat пишу: c:vcvc.com c:vcboot.bat
где boot.bat — это простой bat-файл, в котором написано что загрузить. При выходе из VC выгружается всё что было загружено из boot.bat . Это очень удобно по-моему.

DEVICE=C:SYSTEMSBCDDRVSBIDE.SYS /D:MSCD001 /P:1F0,14 /V
Оказался драйвер сидюка. Но даже, если в Аладдине поставить NO SOUND – все равно не запускается.
Со звуком, я думаю, можно разобраться позже.

2Sect: Да, памяти освободилось больше – около 610, но опять не запустился. Вообще, ему 570 надо.
Дело, наверное, не в памяти.

Аладдин у меня с диска «160 лучших игр». 1.70 мегабайт.
Если у кого-то другой какой-то, и он не очень большой, и это не будет очень сложно, нельзя ли его где-нибудь выложить на FTP?

Вообще, мне кажется, что причина в том, что у меня DOS 7.0.
А можно ли поставить DOS 6.22, оставив ОС W98SE? Если да, то как?
Или у кого-то под 7.0 работает?

2Aladdin
Остаётся попробовать качнуть другую версию. Например тут

Скачал. Запустил. XMS allocation error…
Наверное, дело все же в версии DOS.
В каких он файлах? Msdos.sys и Io.sys?
Чтобы поставить ДОС 6.22 надо стереть Win98SE и эти файлы, и поставить Win95? Правильно?
А как сделать так, чтобы можно было использовать две ОС. Без всяких system commander, через меню типа этого (см. выше). У меня два винта.

Без бут-менеджера — только если с дискеты грузиться. И стирать ничего не надо.

Кстати, в 95-х тоже 7-й ДОС.
——————
Поможем чем сможем.
Лучше маленький рубль, чем большое спасибо.

2Aladdin
Ну если два винта тады всё просто.
На второй винт ставишь ОС Ms-Dos 6.22 (не маздай, а дос 6.22) и при старте компа входишь в SETUP (клавишей DEL) и выбираешь с какого диска загружаться (т.е ставишь D дальше идёт перечень других дисков). Где это поставить надеюсь найдёшь.
Выходишь по F10 сохранив изменения. Комп заргузится с диска D т.е. со второго винта, под ДОСом 6.22
ЧТД (Что и Требовалось Доказать — прикол со школы ещё)

Извини что так всё сумбурно описАл.

ЗЫЖ Посмотри, кстати, темы
HDD и Хотелось бы поставить 98 мд с 2000 что бы оба работали , но как ?

2Aladdin
Съездил я домой, но сам понимаешь. праздники. Короче не до Aladdina мне было. Сорри. В следующий раз, если не забуду привезу

2Mips: Ничего, все окей. В следующий раз.

На счет предыдущего сообщения…
Как загрузиться с диска D я понял.
А как установить Dos 6.22?
Есть у меня setup, там файлы: Dos.dds, Msdos_1.ddi, …, Msdos_5.ddi.
Есть прога DiskDupe Pro 3 Version 7.0 (если я не ошибся, то с помощью этой программы надо устанавливать).
А вот как установить я не понял.
Есть там такая графа SOURCE. Здесь, как мне кажется, надо указать файл Dos.dds.
Есть графа DESTINATION. По-моему, здесь надо указать диск, на который надо установить ДОС (то бишь D). А как, если там кроме диска А ничего не выберешь? Есть правда еще какой-то CASCADE (какой-то диск там надо указать). Только что это я не знаю.
Расскажите, пожалуйста, как это сделать.

2Alladin
Я DiskDup’ом не пользуюсь.
Сделай так загрузись с дискеты ДОС 6.22
Напиши [sys d:] и нажми Enter. (на системной дискете должен быть файл sys.com)
Система установиться на диск D.(Выдасться сообщение: системные файлы скопированы)
Как загрузиться с диска D я написал выше.
ДОС 6.22 можешь скачать здесь. (1.4Мб)(системная дискета)
Чё не получиться-пиши, поможем.

Скачал. Загрузился.
После загрузки имеются диски А, В (тот же самый А) и С(сдром теперь) (если с драйверами грузиться).
Так как же мне скопировать на диск D, если его нет?
Или я че-то неправильно делаю?

2Alladin
хе-хе. да у тя ж FAT32 стоит на обоих дисках.
У ДОСа 6.22 есть такой прикол: он видит только FAT16
Отсюда вывод: Надо переформатировать диск D в FAT16, только тогда ДОС его увидит. И следовательно перенести туда гэйму.

2Aladdin
Ну чё, получилось?

В w’98 – Disk C – 13.5 GB (FAT 32), Disk D – 2,1 GB (недавно отформатированный)
Отформатировал под ФАТ16. Скопровал системные файлы командой [sys C] (теперь диск Д (фат 16) стал С, наверное потому, что диск С (фат 32) не видит.) Скопировал на него Аладдин (скаченный из Инета). Загрузился с дискеты, т.к. с диска фат 16 не гругзится. (почему? В биосе выбираю диск D).
Короче, че-то я тут непонятно, наверное, наговорил, но, в общем, после загрузки пишу ver – MSDOS 6.22, aladdin.exe – XMS allocation error.
Вот.
З.Ы. От форматирования диски портятся или нет? А то я уже его столько форматировал.

2Aladdin
Если простым форматированием, то не страшно. А если низкоуровневым, то может и начать сбоить. Был у меня как-то прикол: Отформатировал винт трижды низкоуровневым, дык он зараза до того медленно работать стал. ужас. Дос Нафигатор грузился минуты две. А про винды и говорить нечего, можно на ночь ставь, глядишь к утру загрузится.
А ещё ошибок на нём с каждым разом становилось всё больше и больше.
На счёт диска D — это верно. Так как щас у тя на одном ФАТ32, а на другом ФАТ16, видеть он будет только ФАТ16, т.е. диск, который был D станет диском C.
В сетапе надо ставить диск С, а не D. т.к. С у тя невидимый. Я так думаю во всяком случае. А чтобы на 100% быть увереным — убери диск С вообще с компа и грузись с С (т.е. оставь один диск ФАТ16)
У меня есть версия аладдина (ребята специально принесли), я её с виндов 98-мых запустил. Работает и ошибок не выдаёт. Только со звуком беда тоже. Windows Sound System он воспринимать не хочет, подавай ему досовкие настройки. А досовских у меня нет. Проснашался я с ним полдня, но звука так и не добился. Если у тя досовские драйвера есть на твою звуковичку, то я думаю этот аладдин у тя работать будет (даже под виндой). Он такой же как и все, отличий я не нашёл. Если есть желание могу на мыло те кинуть. Там два ARJ-файла, общим весом 1.7 метра.
А вот мой CONFIG.SYS (aladdin со звуком)

Dos=High,Umb
lastdrive=Z
files=60
devicehigh=a:himem.sys /TESTMEM:OFF
DEVICEHIGH=a:APINIT.EXE /F:SB /VD:1 /VA:220 /VI:5 /GD /ME /MA:330 /MI:9 /C /CA:340 /CD:3 /CI:10
devicehigh=a:emm386.exe RAM 2048

А вот AUTOEXEC.BAT

@lh a:vc.com a:boot.bat

Ну и наконец BOOT.BAT

@echo off
set blaster=a220 i5 d1 t4 ‘Бластер по умолчанию (для автоопределения)
mix /x ‘драйвер звуковички

Памяти ебстественно не хватает, поэтому приходится выходить из VC. При этом выгружается всё что было загружено из файла BOOT.BAT
ЗЫЖ Не удивляйся: Это настройки с домашнего компа, там винта нет, приходится извращаться с ramdrive.sys и drvspace чтобы сделать винт из памяти.

Ты уже отказался запускать аладдин?

Не, еще не отказался.
На счет форматирования. Если я просто в досе написал: format d:/c (были поврежденные кластеры, исправил), то это низкоуровневое форматирование или нет?

Если в сетапе ставить С, то грузится с фат32, а отключать винт лень. . С дискеты вроде дос 6.22 грузиться.
Мой Аладдин в Виндоусе тоже запускается без звука. Досовские настройки – это те, что в autoexec.bat прописаны: SET BLASTER=A240 I5 D1 H1 P330 T6 ? Они у меня прописываются, если устанавливать драйвера из виндов. В досе после этого звук появляется. Специально драйвера под дос у меня нет. Можно ли его найти? (Sound Blaster Vibra 16C).
На счет другой версии Аладдина: я думаю, что он действительно такой же.
У меня другая идея. Тут уже говорилось про версию Аладдина под Windows. Может кто-нить бессмертие сделает для него? А то у меня не получается.

Maxtradamus 22-11-2000 02:04:

Есть идейка, хотя может и неустроить.

Иди на pristavka.kulichki.net и там найди сеговского алладина. Только сперва эмулятор скачай.

2Aladdin
На счет форматирования. Если я просто в досе написал: format d:/c (были поврежденные кластеры, исправил), то это низкоуровневое форматирование или нет?
Нет, это форматирование верхнего уровня, фат как был 32, так и останется 32. Низкоуровневое в сетапе есть.

Если в сетапе ставить С, то грузится с фат32, а отключать винт лень. С дискеты вроде дос 6.22 грузиться.
Ну да, так и будет грузиться. Я ж грю если винт убираешь ставь С, а с винтом ставь D. ИМХО у тебя или на D система не стоит или ты глючную поставил. Есть и другой вариант. Ты поставил ДОС6.22 на фат 32, так система грузиться не будет. ДОС 6.22 понимает только фат16.

В досе после этого звук появляется.
т.е. проблема решена?

Специально драйвера под дос у меня нет. Можно ли его найти? (Sound Blaster Vibra 16C).
Я как-то с AP3200 долго мучался, но всё таки нашёл. Где непомню, попробуй поискать на www.drivers.ru

Тут уже говорилось про версию Аладдина под Windows. Может кто-нить бессмертие сделает для него? А то у меня не получается.
На счёт бесмертия не знаю, или ломай сам или воспользуйся прогой
Cheat O’Matic, любой поисковик даст тебе кучу ссылок на него. Эта прога позволяет ломать игры под винды, жалкое подобие GameWizard, хотя лучше я взломщика под винды не видел.

GoldenAndy 05-12-2000 03:33:

Запусти FDISK с диска С — тот, который с Виндозой.
На вопрос «Включить поддержку дисков большого размера ?»
скажи НЕТ — это выбор ФАТ16 (если ДА — то ФАТ32 будет)
Жми 5 — выбор физических дисков — выбери свой диск D (он под номером 2 будет). Удали с него все разделы. Всё удали. Потом создай раздел. Выйди. Перегрузись. В сетапе отключи первый винт. Загрузись с системной дискеты 6.22. Запусти FDISK . Сделай основной раздел активным ( Клавиша 2). Выйди. Перегрузись с дискеты. набери format c: /s /u . Имеешь системный диск 6.22 с ФАТ16.
Удачи!

Мда-а. Нувы даёте ребята! «Выдави из себя ламера!» По капле его, по капле. Пойду пошукаю — что ж такое етот «Аладин». Мож я в жизни чего пропустил.

Текущее время: 15:39

Powered by: vBulletin Version 2.0.1
Copyright © Jelsoft Enterprises Limited 2000, 2001.
Любое использование материалов сайта
возможно только с разрешения его администрации.

Источник

Please forgive my attempts at necromancy, but I actually need to write some code for 16-bit DOS (!). I have to verify that a piece of software executes correctly when built for a 16-bit platform, and I discovered that our XP workstations can actually run 16-bit DOS apps, which makes it possible to use the existing batch test system.

In any case, the software consists of one library and one database. Smaller databases (up to ~150kB) can either be defined as a static global array or read from file to a buffer allocated with halloc(), so I am fairly confident that the library and test tool is built correctly.

However, we also have some larger databases to test, up to ~1.8Mb. This is too large to allocate normally, so I wrote a small support library to allocate XMS memory. With this, I can successfully allocate, use (i.e. write and read data) and free up to 16Mb of data in a small toy program. However, when using the XMS facilities in the «real» application, I get the following error:

The NTVDM CPU has encountered an illegal instruction.
CS:0000 IP:00ba OP:0f 04 10 0e 51

Googling on this error gave little relevant results, this type of error seems to be usually blamed on miscellaneous malware.

The code base is strict C90, the compiler currently used for DOS builds is OpenWatcom 1.9 using the «large» memory model. No warnings or errors while building.

The XMS support library follows, the error seems to occurs after the call to xmsmalloc():

/* This file implements rudimentary XMS memory handling.
 * Documentation on the XMS API was found on http://www.qzx.com/pc-gpe/xms30.txt
 */

#include <stddef.h> /* Definition of NULL */
#include <limits.h> /* Definition of UINT_MAX */
#include <stdio.h>  /* fprintf and (FILE *) */

/* Allow external configuration of maximum concurrent XMS allocations */
#ifndef MAX_XMS_ALLOCATIONS
#define MAX_XMS_ALLOCATIONS 4
#endif

/* Address of the XMS driver */
static long XMSControl;

/* Mapping of XMS handle <-> normal pointer */
typedef struct {
    unsigned int XMSHandle;
    void huge * XMSPointer; 
} XMSHandleMap;

static XMSHandleMap allocMap[MAX_XMS_ALLOCATIONS];

/* Set up the XMS driver, returns 0 on success and non-zero on failure */
static int initxms(void)
{
    char XMSStatus = 0;

    if ( XMSControl == 0 )
    {
        __asm {
        ; Is an XMS driver installed?
            mov ax,4300h
            int 2Fh
            mov [XMSStatus], al
        }

        if ( XMSStatus == 0x80 )
        {
            __asm {
            ; Get the address of the driver control function
                mov ax,4310h
                int 2Fh
                mov word ptr [XMSControl]  ,bx
                mov word ptr [XMSControl+2],es
            }
        }
    }

    return ( XMSControl == 0 );
}

/* Allocate a slab of memory from XMS */
void huge * xmsmalloc(long unsigned int size)
{
    unsigned int kB;
    unsigned int XMSStatus = 0;
    unsigned int XMSHandle = 0;
    void huge * XMSPointer = NULL;
    int n;

    /* If we can not initialize XMS, the allocation fails */
    if ( initxms() )
        return NULL;

    /* It is not possible to allocate more kilobytes than a 16-bit register can hold :-) */
    if ( size / 1024 > UINT_MAX )
        return NULL;

    /* Get the next free entry in the handle <-> pointer mapping */
    for ( n = 0; n < MAX_XMS_ALLOCATIONS; n++ )
    {
        if ( allocMap[n].XMSPointer == NULL )
            break;
    }

    if ( n == MAX_XMS_ALLOCATIONS )
        return NULL;

    kB = size / 1024 + (size % 1024 > 0);

    __asm {
    ; Allocate [kB] kilobytes of XMS memory
        mov ah, 09h
        mov dx, [kB]
        call [XMSControl]
        mov [XMSStatus], ax
        mov [XMSHandle], dx
    }

    /* Check if XMS allocation failed */
    if ( XMSStatus == 0)
        return NULL;

    __asm {
    ; Convert XMS handle to normal pointer
        mov ah, 0Ch
        mov dx, [XMSHandle]
        call [XMSControl]
        mov [XMSStatus], ax

        mov word ptr [XMSPointer],  bx 
        mov word ptr [XMSPointer+2],dx
    }

    if ( XMSStatus == 0 )
    {
        /* Lock failed, deallocate the handle */
        __asm {
        ; Free XMS handle
            mov ah, 0Ah
            mov dx, [XMSHandle]
            call [XMSControl]

        ; Return value is not really interesting 
        ;   mov [XMSStatus], ax
        }
        return NULL;
    }

    /* Create an entry in the handle <-> pointer mapping */
    allocMap[n].XMSHandle = XMSHandle;
    allocMap[n].XMSPointer = XMSPointer;

    return XMSPointer;
}

/* Free a pointer allocated with xmsalloc */
void xmsfree(void huge * XMSPointer)
{
    int n;

    if ( XMSPointer == NULL )
        return;

    if ( initxms() ) 
        return;

    for ( n = 0; n < MAX_XMS_ALLOCATIONS; n++ )
    {
        if ( allocMap[n].XMSPointer == XMSPointer )
        {
            int XMSHandle = allocMap[n].XMSHandle;

            __asm {
            ; Unlock handle so we can free the memory block
                mov ah, 0Dh
                mov dx, [XMSHandle]
                call [XMSControl]

            ; Free XMS memory
                mov ah, 0Ah
                mov dx, [XMSHandle]
                call [XMSControl]

            ; Return value ignored
            }

            /* Clear handle <-> pointer map entry so it can be reused */
            allocMap[n].XMSHandle = 0;
            allocMap[n].XMSPointer = NULL;

            return;
        }
    }
}

/* Write a memory report for debugging purposes */
void xmsreport(FILE * stream)
{
    int XMSVersionNumber = 0;
    int XMSLargestBlock = 0;
    int XMSTotal = 0;

    if ( initxms() ) 
    {
        puts("Could not initialize XMS Driver!");
        return;
    }

    __asm {
    ; Get the driver version number
        mov ah,00h
        call [XMSControl] ; Get XMS Version Number
        mov [XMSVersionNumber], ax

    ; Get the amount of free XMS memory
        mov ah, 08h
        call [XMSControl]
        mov [XMSLargestBlock], ax
        mov [XMSTotal], dx
    }

    fprintf(stream, "XMS Version number: %dn", XMSVersionNumber);
    fprintf(stream, "Largest available block: %d kB (%d kB total)n", XMSLargestBlock, XMSTotal);
}

Some concrete questions:

  1. Where can I find more information about the error message (I guess OP means opcode, but what about the other fields?)
  2. Does the XMS API reference I found still apply when running on Windows XP, or is there some newer version I should reference?
  3. Could I screwed up the system state with the inline assembler? How should I resolve that?
  4. Do you have any better idea on how to solve this? :-) DOS extenders seem to require 32-bit mode, the whole point of this exercise is using 16-bit mode.

Topic: xms alloc error  (Read 6352 times)

0 Members and 1 Guest are viewing this topic.

wbrost

I am currently working on a boot disk that will load drivers and such onto a ram drive. I am using xmsdsk.exe to make the drive.

I have the following in my config.sys file:

DEVICE=C:dosHIMEM.SYS /TestMem:Off
DEVICEHIGH=c:DOSifshlp.sys
files=30
DOS=HIGH,UMB
lastdrive=z

my batch file that loads the drivers has the following:

set PATH=R:;R:NET;C:DOS
set TEMP=R:netTEMP
LOADHIGH=C:dosXMSDSK.EXE 2048 r: /T /Y
cd c:PCInetB57
c:dosxcopy32 *.*/s r:>r:temp.log
CD
cd c:PCInetNet
c:dosxcopy32 *.*/s r:net>r:temp.log
r:
LH netnet initialize
netnetbind.com
c:dosaname.exe
nettcptsr.exe
nettinyrfc.exe
netnmtsr.exe
netemsbfr.exe
CLS
netnet start
netNet USE Z: %netloc%
Z:
C:dosmouse.com
C:dosXMSDSK.EXE /U /Y
C:ghostghost.exe -auto -sure -z3
goto _END

The issue occurs when the following commad is ran.
LOADHIGH=C:dosXMSDSK.EXE 2048 r: /T /Y

 I receive the xms alloc error

any ideas?

thank you,
Wayne


Logged


devcom

i found this:

This error appears on computers which have more than 32MB RAM, as most computers in our days do. Aladdin ‘thinks’ that it has too little RAM, and refuses to run. This error seems to pop up in pure DOS mode only, not when you run the game under Windows. However, under Windows, you may experience sound problems, so you might want to run it in pure DOS. In which case, use the EATXMS program, as suggested by et2k, to occupy all the RAM except the last 32 megabytes.

search for the file eatxms.exe/com on search engine.after you get it,you have to «eat memory».for aladdin you need less then 32 mega.so if you have 64 megabyte,you should write something like eatxms 17000.now run aladdin normaily.for some sound cards,you have to wait for 1-2 min before the game starts.


Logged


wbrost

ok but I am trying to run this on multiple systems. They will very in the amount of ram they have available to them.


Logged


BC_Programmer

what is wrong with using RAMDISK.SYS to create a RAM disk?

it supports a switch for using extended memory.


Logged

I was trying to dereference Null Pointers before it was cool.


wbrost

nothing I figured it out. We were using the /T switch on xmsdsk.exe. That works fine until you have more memory then 2048. I removed the switch and it now works fine.


Logged


Понравилась статья? Поделить с друзьями:

Читайте также:

  • Xmodem sync error
  • Xmlhttprequest timeout error
  • Xmlhttprequest statustext status error 500
  • Xmlhttprequest error flutter web
  • Xmlhttprequest cors error

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии