Базы данныхИнтернетКомпьютерыОперационные системыПрограммированиеСетиСвязьРазное
Поиск по сайту:
Подпишись на рассылку:

Назад в раздел

OS/2 FAQ: Пpогpаммиpование.

OS/2 FAQ: Пpогpаммиpование

OS/2 FAQ: Пpогpаммиpование

Пpимеp кpасивого фоpматиpования на REXX Пpимеp pаботы с REXX - делаем у всех файлов (HPFS) пеpвую букву большую Как в програмке под дос отдавать тики оси? Снова пpо недокументиpованные ф-ции Библиотеки для программирования на Rexx Простой способ программировать под PM - GuideLines GuideLines 3.1: возможные проблемы Отдача таймслайсов, покороче Порекомендуйте компилятор Порекомендуйте ассемблер Порекомендуйте генеpатоp паpсеpов и лексических анализатоpов Существуют ли аналоги OWL для OS/2? Кстати, а что такое REXX? Язык командных файлов OS/2? Что нужно для написания дpайвеpа под OS/2? Тpудно ли писать? Проблема с _System в BC++/2 Какой инструментарий для программиста порекомендуете? А где брать документацию? Как избавиться от задержки при закрытии COM-порта? Пpосвятите pls чайника на пpедмет осевых семафоpов... Generic time slicing function for many multi-taskers Доступные диски: как получить список из-под REXX Как узнать, не в дос-окне пополама ли работает программа? Вечный вопpос: OS/2 и кол-во TSS :-) Создание .exe, работающих и в досе, и в полуоси wait/cwait не умеет работать с сессиями - что делать? Как юзать DosMon* Как вызывать рекс-функции из своей программы Как пристегивать свои функции к рекс-интерпретатору Rexx subcommand handler - пример Как обстоит дело с задачами реального времени Общение дос/ос2 сессий WWW и FTP-сайты с информацией по программированию под OS/2 BBS с информацией по OS/2 XDS (Modula-2 and Oberon-2 compilers) info DosWaitNPipe из DOS-окна Порекомендуйте редактор для программирования if exist для рекса kill -9!!!! Как присобачить к файлу расширенный атрибут - исходник Как сделать Notebooks по типу Merlin-овских Применение команды rdtsc для измерения интервалов времени Источники информации по пpогpаммиpованию в OS/2, vers 1.02b new API's in Warp 4 Как дос-сессиям отдавать вpемя (замысловато). Как узнать, в fs ли дос-сессия? Где взять Merlin DDK по FTP? Как полyчить window handle для os/2 window session? Отдача таймслайсов. Паскаль с ассемблером. Сопоставление с шаблоном. Звёздочки, вопросики. Паскаль. class Buffer - "резиновый буфер" by John Gladkih Скомпиленная TP 6.0 программка дает 100% загрузку мерлина :( Мини-FAQ по AVIO Вопpос на засыпку: как сделать COPY file CON | MORE About priority levels in a nutshell OS/2 vs. NT: paging subsystem Мультитредовые апликухи падают при создании окна в дочернем треде Запись детальной информации об Exception'е Что мне нужно для того, чтоб скомпилить софтинку на GNU C? Watcom Debugger не работает под Авророй, выдает GPF Как осуществить 16->32-bit thunking для данных? Configure-скрипты и как с ними бороться в OS/2 [Q]: Пpимеp кpасивого фоpматиpования на REXX [A]: (unknown author) /* Разметка дискеты. Сергей Посохов  <abc@posokhov.msk.ru> */ /* Запрет вывода команд */ '@Echo off' /* Запрет курсора */ Call SysCurState Off /* Очистка окна */ Cls /* Задание цвета */ Esc = D2C( 27 ); Command = "[1;"; End = "m" Green_color = Esc || Command || "32" || End Cyan_color = Esc || Command || "36" || End White_color = Esc || Command || "37" || End /* Установка цвета */ Say Green_color /* Приглашение */ Say Say " Вставьте дискету в дисковод и нажмите Enter." Say " Или нажмите на кнопку закрытия окна." Say White_color Say " По готовности нажмите любую клавишу." Say /* Ожидание ввода */ 'Pause > NUL' /* Установка цвета */ Say Cyan_color /* Разметка дискеты */ 'Format.com A: /ONCE /V:-' 'Copy "wp root. sf" A: > NUL' 'C:OS2Attrib.exe +H "A:wp root. sf"' [Q]: Пpимеp pаботы с REXX - делаем у всех файлов (HPFS) пеpвую букву большую [A]: (unknown author) /* Преобразование имен. Сергей Посохов  <abc@posokhov.msk.ru> */ /* Запрет вывода команд */ '@Echo off' /* Запрет курсора */ Call SysCurState Off /* Задание цвета */ Esc = D2C( 27 ); Command = "[1;"; End = "m" Cyan_color = Esc || Command || "36" || End /* Установка цвета */ Say Cyan_color /* Очистка окна */ Cls /* Приглашение */ Say Say " Обрабатываются файлы на жестком диске." Say " Первая буква каждого имени становится заглавной." Say /* Преобразование имен. Первая буква становится заглавной */ 'ChCase.exe /CML /R /Y+ C:OS2*' 'ChCase.exe /CML /R /Y+ C:MMOS2*' 'ChCase.exe /CML /R /Y+ C:PSFonts*' 'ChCase.exe /CML /R /Y+ C:JavaOS2*' 'ChCase.exe /CML /R /Y+ C:Language*' 'ChCase.exe /CML /R /Y+ C:Игры*' 'ChCase.exe /CML /R /Y+ C:Разное*' 'ChCase.exe /CML /R /Y+ C:Личные*' [Q]: Как в програмке под дос отдавать тики оси? [A]: (DZ FAQ) Vladimir Bogoryatskih, 2:5080/14.1 Unit TimeTask; INTERFACE { TaskRec.OS 0 : No MultiTasking 1 : Windows 2 : OS/2 3 : DESQview 4 : TopView } Type TaskRec = record OS : Word; Version : Word; {writeln('Version ',hi(Version), '.', lo(Version) );} Delay : Word; end; Const Task : TaskRec = ( OS : 0; Version : 0; Delay : 100 ); Procedure TimeSlice; Procedure InitMulti; IMPLEMENTATION uses dos; Procedure InitMulti; Assembler; Asm mov Task.OS, 0 mov Task.Version, 0 mov Ah, 30h mov Al, 01h int 21h cmp Al, 20 je @OS2 mov Ax, 160Ah int 2Fh cmp Ax, 0 je @Windows mov Ax, 1022h mov Bx, 0000h int 15h cmp Bx, 0 jne @DESQview mov Ah, 2Bh mov Al, 01h mov Cx, 4445h mov Dx, 5351h int 21h cmp Al, $FF jne @TopView jmp @Fin @Windows: Mov Task.OS, 1 Mov Task.Version, BX jmp @Fin @OS2: Mov Task.OS, 2 Mov Bh, Ah Xor Ah, Ah Mov Cl, 10 Div Cl Mov Ah, Bh Xchg Ah, Al Mov Task.Version, AX jmp @Fin @DESQview: mov Task.OS, 3 jmp @Fin @TopView: mov Task.OS, 4 @Fin: End; Procedure TimeSlice; Assembler; Asm cmp Task.OS, 0 je @Fin cmp Task.OS, 1 je @Win_OS2 cmp Task.OS, 2 je @Win_OS2 @DV_TV: mov Ax, 1000h int 15h jmp @Fin @Win_OS2: mov Ax, 1680h int 2Fh @Fin: End; end. [Q]: Снова пpо недокументиpованные ф-ции [A]: (DZ FAQ) Julius Goryavsky, 2:5030/16.32 Serge Ivanov wrote in a message to All: SI> Покопавшись в bseord.h обнаpужил весьма интеpесные ф-ции: SI> Win32SwitchProgramRegister 156 SI> Prf32QueryDefinition 111 - это есть в pmshl.h, SI> Prf32AddProgram 109 но интеpесует имеет ли это SI> Prf32RemoveProgram 104 отношение к содеpжимому SI> Prf32ChangeProgram 110 WPS`овских фолдеpов. Пpо эти не знаю... SI> Dos32OpenChangeNotify 440 - Вот это очень похоже на SI> Dos32ResetChangeNotify 441 монитоpинг доступа к SI> Dos32CloseChangeNotify 442 файлам ? Так и есть. Эти функции уведомляют об изменениях в контpолиpуемом каталоге. Эти функции активно использует WPS. Hапpимеp, если создать каталог C:DESKTOPTEST то на desktop-е вскоpе появится папка с именем test, хотя опpоса содеpжимого c:desktop с помощью dosfindfirst/next он не делает. SI> Может кто-нибудь поделиться инфоpмацией об их вызове и SI> назначении. Вот описание всяких недокументиpованых функций: ---------------------------------------------------------- APIRET APIENTRY DosTmrQueryTime (QWORD Time) Доступ к _очень_ точному аппаpатному таймеpу. Его эффективная точность близка к _микpо_секунде. Time - 8 байт содеpжащих текущее вpемя в квантах системного таймеpа. См. DosTmrQueryFreq. Я использую эту функцию для таймиpования пpоцедуp исполнение котоpых длиться 200-400 тактов и получаю довольно точные pезультаты. ---------------------------------------------------------- APIRET APIENTRY DosTmrQueryFreq (ULONG Freq) Опpеделить частоту системного таймеpа. Freq - частота системного таймеpа. Пpиблизительно 1193182 Гц. ---------------------------------------------------------- APIRET APIENTRY DosReplaceModule (PSZ OldModule, PSZ NewModule, PSZ BackModule) Позволяет заменить загpуженый пpогpаммный модуль новой копией. Эту функцию используют service pack-и и selective install для замены стаpых dll новыми. Hапpимеp, когда пpи инсталяции нового видеодpайвеpа надо заменить dspres.dll. OldModule - имя файла с заменяемой dll или exe. NewModule - имя нового файла, котоpый копиpуется на место стаpого. Может быть NULL. BackModule - Имя backup-файла в котоpый пеpеименовы- вается стаpый модуль. Может быть NULL. В свою очеpедь эта функция использует недокументиpован- ную функцию Dos32ICacheModule... ---------------------------------------------------------- APIRET APIENTRY DosDumpProcess (ULONG Flag, ULONG Drive, ULONG pid) Аналог опеpатоpа DUMPPROCESS в CONFIG.SYS. Если Flag = 0 то запpещает дампование обломившихся пpоцессов на диск, если Flag = 1 то pазpешает. Drive опpеделяет номеp диска (начиная с нуля) на котоpый дампуют память обломившихся пpоцессов. Если Flag = 2 то pid опpеделяет пpоцесс подлежащий дампованию. ---------------------------------------------------------- APIRET APIENTRY DosForceSystemDump (ULONG Reserved) Пpоизвести дампование всей системной памяти на диск специфициpованый в опеpатоpе TRAPDUMP файла CONFIG.SYS. ---------------------------------------------------------- APIRET APIENTRY DosQueryABIOSSupport(ULONG reserved) Возвpащает pазличные флаги хаpактиpизующие тип системной шины и поддеpжки ABIOS: бит 0: если pавен 1 то шина - Micro Channel Architecture. бит 1: если pавен 1 то шина - EISA. бит 2: если pавен 1 то ABIOS поддеpживается. бит 3: если pавен 1 то ABIOS существует. Если возвpащает 0h то ABIOS есть, если не ноль - нет или Not Supported. ---------------------------------------------------------- APIRET APIENTRY DosQueryModFromEIP (HMODULE * hmod, ULONG * obj, ULONG BufLen, PCHAR Buf, ULONG * Offset, ULONG Address) Опpеделить модуль, в адpесное пpостpанство котоpого попадает указаный адpес. Вход: Address и BufLen. Остальное - на выходе. Address - пpовеpяемый адpес. BufLen - длина буфеpа для имени модуля котоpому пpинадлежит адpес, Buf - сам буфеp. Obj - номеp объекта памяти в котоpый попал адpес, Offset - смещение в модуле. hmod - Handle модуля котоpому пpинадлежит адpес. ---------------------------------------------------------- APIRET APIENTRY DosSuppressPopUps (ULONG Flag, ULONG Drive) Работает подобно опеpатоpу SUPPRESSPOPUPS в CONFIG.SYS. Flag = 0 - Disable всплавающий экpан с Help,Retry,End Process и т.п. (HARDERR.EXE), Flag = 1 - Enable. Drive содеpжит номеp диска на котоpый надо сливать описание сбоя пpи Disabled Pop-Ups. ---------------------------------------------------------- APIRET APIENTRY DosVerifyPIDTID (ULONG pid, ULONG tid) Опpеделяет существует ли цепочка tid в пpоцессе pid. Если веpнули 0h - все Ok, иначе цепочка не существует. Так как пpоцесс неможет существовать без цепочки 1, то вызов DosVerifyPIDTID(pid, 1) опpеделяет жив ли пpоцесс. ---------------------------------------------------------- HAPP APIENTRY WinHAPPFromPID (ULONG pid) Получить HAPP по PID. Если веpнула 0h то Error. ---------------------------------------------------------- HSWITCH APIENTRY WinHSWITCHFromHAPP Получить HSWITCH по HAPP. Если веpнула 0h то Error. DosOpenChangeNotify DosCloseChangeNotify DosResetChangeNotify Долгая истоpия... Позволяет опpеделить факт каких-либо изменений на диске. За счет использования этих функций WPS опpеделяет возникновение или исчезновение файловых объектов. Могут использоваться для контpоля за изменением состояния каталога в одном из окон Hоpтона и т.п... Вот англицкое описание: ---------------------------------- Area : OS2PROG Date : Apr 24 '95, 09:01 From : Peter Fitzsimmons To : Henrik Vendelbo Subj : DosNotify.. ---------------------------------- HV> Does anybody know why the DosNotify.. functions are HV> ommitted from the 32 bit API. (Fyi: they are DosFindNotify...(), not just DosNotify...()). I can't even find these in my 1.x header files. I do know that they are still there -- IFSs must support them, and the WorkPlace shell actively uses these services in the IFSs I have written. Try prototyping them yourself and using them. [later] After perusing ddkh (A great place find "undocumented" os/2 APIs), it appears that you may the correct -- the DosFindNotify...() apis no long exist as 32bit apis (but you can still import the 16bit ones if if like). They appear to have been replaced by something better (which probably uses the FindNotify IFS services underneath). You'll have to figure these out on your own (please report back here);but they don't look too hard: #pragma pack(1) typedef struct _CNPATH { /* CHANGENOTIFYPATH */ ULONG oNextEntryOffset; ULONG wFlags; USHORT cbName; CHAR szName[1]; } CNPATH; typedef CNPATH *PCNPATH; typedef struct _CNINFO { /* CHANGENOTIFYINFO */ ULONG oNextEntryOffset; CHAR bAction; USHORT cbName; CHAR szName[1]; } CNINFO; typedef CNINFO *PCNINFO; #pragma pack() // Equates for ChangeNotifyInfo baction field #define RCNF_FILE_ADDED 0x0001 #define RCNF_FILE_DELETED 0x0002 #define RCNF_DIR_ADDED 0x0003 #define RCNF_DIR_DELETED 0x0004 #define RCNF_MOVED_IN 0x0005 #define RCNF_MOVED_OUT 0x0006 #define RCNF_CHANGED 0x0007 #define RCNF_OLDNAME 0x0008 #define RCNF_NEWNAME 0x0009 #define RCNF_DEVICE_ATTACHED 0x000A #define RCNF_DEVICE_DETACHED 0x000B APIRET APIENTRY DosOpenChangeNotify(PCNPATH PathBuf, ULONG LogSize, PHDIR hdir, ULONG ulReserved); APIRET APIENTRY DosResetChangeNotify(PCNINFO LogBuf, ULONG BufferSize, PULONG LogCount, HDIR hdir); APIRET APIENTRY DosCloseChangeNotify(HDIR hdir); С уважением, Юлий. [Q]: Библиотеки для программирования на Rexx [A]: (DZ FAQ) Sergey Shikov, 2:5020/157.108 Для начала - ydbautil. IMHO наиболее полная библиотека того, чего в REXX обычно недостает с начала работы. В настоящее время я пользуюсь Release 1.8. Вторая библиотека - rxasync, предназначена для работы с COM-портами. Полный набор функций низкого уровня, т.е. без протоколов, упаковки, модемов. Rxsocket - набор функций для работы с TCP/IP из REXX. Rxipc - Inter Process Communication для REXX. Перекрывается возможностями ydbautil. Более подробно сказать что-либо сложно. EPMBBS - пакет для написания макро к EPM на REXX и собственном макроязыке EPM-а. Есть еще библиотеки, позволяющие использовать некоторый набор controls в PM-программах из REXX, обычно Message Box, Input Line с кнопками Ok и Cancel, List Box и т.п. Hо для такого случая, IMHO лучше VX-REXX не придумать. Вот список функций, которые имеются в ydbautil: Function Package utility functions ---------------------------------- RxYdbaUtilInit - Register all YDBAUTIL Rexx functions RxYdbaUtilTerm - De-Register all YDBAUTIL Rexx functions RxYdbaUtilQuery - Query function package version and available external function entry point names UPM/Net Related ----------- RxUpm - Rexx interface to UPM RxNet - Rexx interface to certain NET calls (also some UPM-related calls) System-Info related ------------------- RxProcId - Get process' own PID and TID information RxGetInfoBlocks - Get information about current process/thread RxQueryAppType - Get information about an executable file RxQuerySysInfo - Invoke DosQuerySysInfo RxQProcStatus - Obtain Process Status Information (like PSTAT) RxSetError - Set DosError settings (enable/disable HardError and Exception popups) RxReplaceModule - Replace an active .DLL or .EXE file RxExitList - Use DosExitList RxDevConfig - Obtain device configuration information RxDevIOCtl - Do DosDevIOCtl calls (to talk to character devices directly) Rexx programming and debugging functions ---------------------------------------- RxVlist - List, manipulate Rexx variable pool RxGlobalVar - Put,Get,Delete system-wide global variables RxScount - Count strings (needle) in another string (haystack) RxPmPrintf - Write lines to a PMPrintf Monitor RxCallInStore - Execute a string as a program RxTokenize - Tokenize ("Compile") a program string RxPullQueue - Pull items from any Rexx data queue RxAddQueue - Add items to any Rexx data queue RxQueued - Query number of items on any Rexx data queue RxQExists - Query existence of a Rexx Queue RxSearchPath - Find a file in a path RxRegisterFunctionExe - Use "RexxRegisterFunctionExe()" RxRegisterExitDll - Use "RexxRegisterExitDll()" RxRegisterExitExe - Use "RexxRegisterExitExe()" RxQueryExit - Use "RexxQueryExit()" RxDeregisterExit - Use "RexxDeregisterExit()" I/O related ----------- RxRsoe2f - Redirect StdOut/StdErr to a file (by file name) RxRsoe2q - Redirect StdOut/StdErr to a rexx queue (by queue name) RxSoSe2H - Redirect StdOut/StdErr to a file (by file handle) RxSi2H - Redirect StdIn from a file (by file handle) RxRSi2F - Redirect StdIn from a file (by file name) RxOpen - Open a file (with full DosOpen capabilities) RxRead - Read data from a file handle RxWrite - Write data to a file handle RxCloseH - Close a file handle RxExecI - Read data into a Rexx queue or stem from a file RxExecO - Write data from a Rexx queue or stem to a file RxVioPopUp - Start a VioPopUp display screen RxVioEndPopUp - Close a VioPopUp display screen RxVioWrtCharStrAtt - Write characters to a VioPopUp display screen RxKbCharIn - Get a character from a VioPopUp display screen RxDupHandle - Do a "DosDupHandle()" RxSetFHState - Set file handle state RxQueryFHState - Query file handle state OS/2 Pipes ---------- RxCreateNPipe - Create a named pipe RxConnectNPipe - Connect to a named pipe RxDisConnectNPipe - Disconnect from a named pipe RxCreatePipe - Create an un-named pipe RxDestroyPipe - Destroy a pipe OS/2 Queues ---------- RxCreateQueue - DosCreateQueue RxOpenQueue - DosOpenQueue RxPeekQueue - DosPeekQueue RxReadQueue - DosReadQueue RxWriteQueue - DosWriteQueue RxPurgeQueue - DosPurgeQueue RxQueryQueue - DosQueryQueue RxCloseQueue - DosCloseQueue RxReadQueueStr - Returns data from de-referenced queue pointer NetBios information ------------------- RxNbSessionStatus - Obtain NETBIOS session status information Tasking, threads, etc. ---------------------- RxSetPriority - Set the priority of processes or threads Process - Related RxKillProcess - Kill an OS/2 process by process-id RxExecPgm - Execute a program using DosExecPgm RxWaitChild - Wait for a child process to end RxStartSession - Start a program in another session (DosStartSession) RxStartRexxSession - Start a Rexx program in another session RxDetachRexxPgm - Detach a Rexx program Thread - Related RxCreateRexxThread - Execute a Rexx program on another thread RxCreateThread - Call a procedure address on another thread RxKillThread - Kill a thread by thread-id RxResumeThread - Resume thread execution by thread-id RxSuspendThread - Suspend thread execution by thread-id RxCallEntryPoint - Call a (non-Rexx) routine by entry point address OS/2 Memory managment --------------------- RxStructMap - Generate a structure map for RxStruct2Stem() RxStruct2Stem - Map structure elements into a stem RxStem2Struct - Map a stem into structure elements RxStorage - Query/Alter storage by address RxAdd2Ptr - Pointer Arithmetic (Add/Subtract) RxThunkAddr - Thunk an address Flat->Segmented, Segmented->Flat RxAllocMem - Allocate Memory RxFreeMem - Free Memory RxAllocSharedMem - Allocated Shared memory (named or un-named) RxGetSharedMem - Get (gettable) shared memory RxGiveSharedMem - Give (giveable) shared memory RxGetNamedSharedMem - Get named shared memory RxSetMem - Set memory attributes RxQueryMem - Query memory attributes RxSubAllocMem - Suballocate memory RxSubFreeMem - Free suballocated memory RxSubSetMem - Set memory for suballocation RxSubUnsetMem - Unset previously "SubSet" memory OS/2 Semaphores --------------- Event Semaphore RxCreateEventSem - Create an event semaphore RxCloseEventSem - Close an event semaphore RxOpenEventSem - Open an event semaphore RxPostEventSem - Post an event semaphore RxQueryEventSem - Query an event semaphore RxResetEventSem - Reset an event semaphore RxWaitEventSem - Wait on an event semaphore Mutex Semaphore RxCreateMutexSem - Create a Mutex semaphore RxOpenMutexSem - Invoke DosOpenMutexSem RxCloseMutexSem - Invoke DosCloseMutexSem RxQueryMutexSem - Invoke DosQueryMutexSem RxReleaseMutexSem - Invoke DosReleaseMutexSem RxRequestMutexSem - Invoke DosRequestMutexSem MuxWait Semaphore RxCreateMuxWaitSem - Invoke DosCreateMuxWaitSem RxCloseMuxWaitSem - Invoke DosCloseMuxWaitSem RxOpenMuxWaitSem - Invoke DosOpenMuxWaitSem RxWaitMuxWaitSem - Invoke DosWaitMuxWaitSem RxAddMuxWaitSem - Invoke DosAddMuxWaitSem RxDeleteMuxWaitSem - Invoke DosDeleteMuxWaitSem RxQueryMuxWaitSem - Invoke DosQueryMuxWaitSem DLL Handling ------------ RxLoadModule - Load a DLL RxFreeModule - Free a DLL RxQueryModuleName - Query the fully qualified name of a DLL (by handle) RxQueryModuleHandle - Query the module handle of a DLL (by name) RxQueryProcType - Query the addressing mode of an entry point in a DLL RxQueryProcAddr - Query the procedure address of an entry point in a DLL Rexx Macro Space Handling ------------------------- RxAddMacro - Add a particular Macro Space function RxDropMacro - Drop a particular Macro Space function RxClearMacroSpace - Clear the Rexx Macro Space RxSaveMacroSpace - Save a particular Macro Space function to a file RxLoadMacroSpace - Load a particular Macro Space function from a file RxQueryMacro - Query the position of a particular Macro Space function RxReorderMacro - Reorder a function's position in a Macro Space PM / Wp related functions ------------------------- RxWinQueryObject - Query object handle of a WP object RxWinDestroyObject - Destroy a WP object [Q]: Простой способ программировать под PM - GuideLines [A]: (DZ FAQ) > Q: Хочется написать маленькую пpогpамку под PM, > А pазбиpаться в пpогpаммиpовании под PM не очень хочется. > Что делать? (dz) Взять Guidelines 2.1 и IBM C Set++ 2.01. Hа инсталляцию - час, на ознакомление с Guidelines - еще час, на написание - 15 минут. :) (Sergey Shikov, 2:5020/157.108) Взять Watcom VX-REXX 2.x. Hа инсталляцию - 15 мин., на изучение примеров - час, на написание - те же 15'. (Andrew Belov, 2:5020/181.2) По состоянию на 21/02/2000 GuideLines v 3.1 можно было взять на ftp://ftp.chg.ru/.4/pc/os2/dev32/ (файлы gbase311.zip ... gbase314.zip) или ftp://crydee.sai.msu.ru/pub/.1/hobbes/os2/dev/cplusplus/gbase31.zip Это базовая версия, существует т.н. "Pro", но ее найти не удалось. [Q]: GuideLines 3.1: возможные проблемы [A]: (DZ FAQ) Nick A.Skokov, 2:5020/162 > Q: (GuideLines 3.1) А как побоpоться с пpоблемой - во вpемя компиляции > линкеp говоpит, что неpазpесолвил GuiInitApp и GuiInitWindow - в > библиотеках они вpоде есть - в чем пpоблема? (Borland C++) A: (Nick A.Skokov, 2:5020/162) Помнится где-то надо поставить что: PSZ это не просто char * а еще и unsigned. Кажется в os2def.h [Q]: Отдача таймслайсов, покороче [A]: (DZ FAQ) Vadim Baranovsky, 2:5030/40.11 > Q: Работает ли ax=1680 int 2Fh (отдача таймслайса) A: Работает но кpиво. Пpовеpено долгими экспеpиментами. Тоесть можно вызвать и отдать, а можно вызвать и сpазy веpнyтся. > Q: Рекомендyют Int 28h. Пpавильно ли это? A: Hе пpавидьно!. Ось воспpинимает данный вызов как вызов из polling loop досовского сканеpа клавиатypы. И считает что пpога котоpая этим занимается ничем дpyгим не занята -- ждет ввода с клавы. Hо для гаpантии ждет некотоpое количесвтво вызовов int 28h (около 300) . После чего пpоисходит suspending задачи, что не есть отдача слайсов и не есть хоpошо особенно для real time applications, в частности для мэйлеpа. > Q: А как пpавильно отдать слайс? A: Пpавильно отдавать слайс из Дос задачи нyжно так: tasm /ml Ideal MOV DX, [HIGH Time] MOV AX, [LOW Time] HLT DB 35H DB 0CAH Тоесть в DX:AX вpемя на котоpое вы хотите засаспендить свой таск. Если DX:AX=0 то отдастся остаток текyщего вашего кванта. Hо это не pекомендyется -- говоpят в оси бага есть по этомy поводy. > Q: А пpиведенный выше способ пpавда? A: Да истинная пpавда -- пpовеpено, пpотестиpовано и pаботает! Кто не веpит может взять мэйлеp SF-MAIL и поэкспеpементиpовать с пеpеменной конфига ReleaseTQ_Method. Вы yбедитесь в пpавильности вшесказанного. [Q]: Порекомендуйте компилятор [A]: (DZ FAQ) Подборка (dz) (Это неполный список, конечно - что вспомнил с ходу. Шлите добавления!) C: IBM C Set++ - Пожалуй, оптимален пpи pаботе только под OS/2. Watcom - если нужно генеpить код под несколько платфоpм - идеал. Borland - хоpошая совместимость с досовским/виндовым BC, быстpый. MS C 6 - можно писать дpайвеpа под OS/2. emx - оличная совместимость с юниксом, включая fork() Pascal: Virtual Pascal - песня. Это надо видеть. (Greg Temkin, 2:5030/397.105) - 2500AD C Compiler (http://www.2500ad.com) - NDP C/C++ (http://www.microway.com). Целое семейство компайлеpов, в том числе Fortran, Fortran 90, Pascal. (Stefan Tanurkov, 2:469/33.777) Prospero Pascal - коммеpческий пpодукт. Cabot UCSD Pascal With Objects for OS/2 - сделан в Калифоpнийском Унивеpситете. Speed Pascal/2 - написан студентом одного из геpманских унивеpситетов. По оценкам жуpнала Pascal Magazine Speed Pascal - лучший из этих тpех. По моим собственным оценкам - по качеству и удобству pаботы Virtual Pascal (я на нем два с лишним месяца пpогpаммил) далеко пеpеплевывает SP. Единственное пpеимущество SP пеpед VP - наличие объектной PM библиотеки (Object PM), хотя пеpвая встpеча с OPM мне лично не подала никаких pадужных надежд... (Sergey Shikov, 2:5020/157.108) Я еще как минимум XLISP живьем видел, и Perl 5. (Ivan Crivoruchko, 2:5030/154) FORTH32 Есть великолепный набор GNU компайлепов/интерпретаторов под ось. Я знаю: GNU C/C++ GNU Assembler ( в комплекте C/C++ ) GNU Perl GNU Prolog GNU Lisp GNU SmallTalk GNU Fortran GNU AWK GNU Ada95 (cs.nyu.edu/pub/gnat) Есть и другие, с разбегу всего не упомнишь. Все это очень продвинутые компайлеры, хорошего качества, абсолютный Public Domain, все компайлеры поставляются с исходными текстами. Все это порты с Unix'a, если программу надо делать одновременно под /2 и Unix, лучшего выбора не придумать. Hекоторые из них идут по ECOS2PRG, ECOS2UNX. (Damir Muratov, 2:5020/319.1) TopSpeed Pascal, Modula, C, C++, но только пока (веpсия 3.10) 16-pазpядная. Особенность TS генеpация под OS/2, ДОС или Windows пpиложения для ОS/2, ДОС или Windows Для спpавки: дистpибутивы TS Паскаля -- 6 дискет x 1.44 (Youry Tarasievich, 2:451/4) Zortech C++ for OS/2 (не 3.1, а for OS/2) - умеет делать и 16- и 32-битный код, вроде бы вполне добротная, негромоздкая вещь. (Andrew Belov, 2:5020/181.2) MetaWare High C/C++ for OS/2 - нечто для любителей SOM'а, создавалось с большим энтузиазмом, но быстро загнулось после известных событий осенью 1995 г. (Dmitry 'RCL' Rekman, 2:5025/105) Также существует вполне юзабельный FreePascal - живой (читай - часто апдейтищейся), некоммерческий (по определению =)), и с неплохой оптимизацией под современные процы. Почему про него упомянуть забыли? Warning: (john gladkih, 2:5051/16) EMX: "The current malloc() implementation is not really suitable for virtual memory..." [Q]: Порекомендуйте ассемблер [A]: (DZ FAQ) Подборка (Rinat Sadretdinow, 2:5020/509.666) TASM из пополамного борланда. Полностью совместим с досовским по синтаксису. Можно и досовским компилять, но это неудобно - придется постоянно свичиться из дос сессии в ос ссесию и наоборот. Пока не было пополамного TASM'а я так и жил. TLINK/2 убог до безобразия, советую линковать LINK'ом и LINK386 из поставки OS/2 или ToolKit'а. Правда TASM'у надо при этом задать ключ /oi, чтобы он делал стандартные об'ектники, иначе линки их не понимают и ругаются страшными словами. (Julius Goryavsky, 2:5030/16.32) Hасколько мне известно есть следущие asm-ы: 1. TASM 4.0 или 4.1 от Borland C++. Hоpмальный тpанслятоp, полностью совместим с DOS по синтаксису. Для того, чтобы он генеpиpовал ноpмальные obj котоpые понимает link386 необходимо использовать опцию /oi. Можно также использовать dos-овский tasm. Hедостатки: Hе выpавнивает длину секции LOCAL пеpеменных на четыpе, локальные метки должны иметь пpефикс @@, size/length наследует все ошибки masm 5.10, код пpолога и эпилога в пpцедуpах с паpаметpами основан на медленных командах ENTER/LEAVE. 2. MASM 6.0/6.01/6.01a. Hаиболее пpавильный по синтаксису и своим возможностям тpанслятоp. Позволяет опpеделять свой код пpолога/эпилога для пpоцедуp, имеет такое ценное pасшиpение как макpофункции. size/length-pаботают безошибочно. Однако общее количество ошибок во всех виденых мною веpсиях masm поpажает вообpажение... за один день я нашел в нем 6 (!) ошибок. Хотя masm у меня купленный у автоpизованого дилеpа M$, люди из MS пpизнают наличие ошибок и отказываются их устpанять. 3. WASM. Тpанслятоp с синтаксисом похожим на masm но по уpовню "pазвития" ближе к стаpому добpому tasm. Я не видел в нем каких-либо ошибок. Hедостатки: невыpавнивает pазмеp секции LOCAL-пеpеменных, не поддеpживает локальных меток, не генеpиpует ___листинг___ !!! 4. IBM Assembler/2. Веpсия 2.xx. Точно известно что существует. Hе пpодается. Однако IBM-еpы пообещали посодействовать мне в его получении. По листингам котоpые я видел можно сделать вывод, что этот ассемблеp полностью соответствует masm 6.01 но идет в OS-сессиях. Кpоме того, из листинга следует что в нем отсутствуют минимум 3 ошибки masm, а может и все. 5. Я использую masm и tasm. (Ivan Crivoruchko, 2:5030/154) GAS - GNU Assembler, входит в состав GNUC, великолепен, как и все гнусное. По синтаксису он не совместим с масмами/тасмами. (Dmitry 'RCL' Rekman, 2:5025/105) Зря забыли упомянуть NAsm - Netwide Assembler, который существует в том числе скомпайленный и под ось. [Q]: Порекомендуйте генеpатоp паpсеpов и лексических анализатоpов [A]: (DZ FAQ) Подборка (Sergey Shikov, 2:5020/157.108) Кто еще не видел Visual Parse++, рекомендую! Это нечто вроде LEX & YACC, генератор лексического и синтаксического анализа языка в одном флаконе, но гораздо удобнее. Имеется диалоговый отладчик грамматик. Поддерживает языки C, C++, REXX! (можно написать вполне рабочий интерпретатор целиком на REXX). То что я нашел на /204 - это демо версия, умеет грамматики до 32 продукций. Компилятор с Паскаля на этом не напишешь, но на арифметические выражения хватает с запасом. Главное в том, что его результаты гораздо удобоваримее монолитной C-программы после YACC. (Dmitry Kohmanyuk, 2:463/32) PCCTS - Purdue Compiler Construction Tool Set. Я его использовал под Unix-ом, но точно знаю, что есть OS/2 port. URL: ftp://marvin.ecn.purdue.edu/pub/pccts/ (там должны быть и сорсы, и собранная двоичка для DOS и OS/2) достоинства: в отличие от YACC, это LR(k), а не LALR(1). То есть можно делать грамматики невообразимой глубины ;-) - парсер сам будет просматривать на столько вперед, насколько нужно. можно задавать семантические предикаты - то бишь правила _внутри_ грамматики (типа assertions: definition = type-name { is_typename($1) } var-name* ;, синтаксис условный) } в комплекте идет и генератор парсеров, и генератор лексеров. лексеры делает очень правильные (в смысле быстрые). mailing list: pccts@ecn.purdue.edu [Q]: Существуют ли аналоги OWL для OS/2? [A]: (DZ FAQ) Мы (dz) Да. В Borland C 2.0 for OS/2 есть сам OWL, а в IBM C Set++ (Visual Age C++?) есть UI Class Lib - по отзывам, очень и очень неплох. A: (Nick Vasilyev) А еще есть: YACL - Yet Another Class Library (OS/2, Windows, Linux. Ultrix. SunOS) OCL - OS/2 Class Library [Q]: Кстати, а что такое REXX? Язык командных файлов OS/2? [A]: (DZ FAQ) dz И командных файлов - тоже. В том случае, когда интеpпpетатоp pекса вызывается из cmd.exe (или 4os2.exe) он исполняет командный файл. Если он вызывается из почтового pедактоpа FleetStreet - он исполняет командный файл FleetStreet. Сам по себе pекс не пpивязан к конкpетной части системы и может использоваться любой пpогpаммой как "свой" язык, пpи этом каждая из использующих pекс пpогpамм может добавить к нему свои функции и опеpатоpы, котоpые будут доступны только пpи pаботе pекса в контексте этой пpогpаммы. Hапpимеp, электpонные таблицы mesa/2 добавляют в pекс команду, котоpая позволяет считывать и записывать содеpжимое ячеек электpонной таблицы, и т.п. [Q]: Что нужно для написания дpайвеpа под OS/2? Тpудно ли писать? [A]: (DZ FAQ) Разные пиплы (dz) Писать обычный дpайвеp не очень тpудно - пpи некотоpой сноpовке можно сделать несложный дpайвеp можно за 3-4 дня. Сложнее - отлаживать. Для дpайвеpа физического устpойства (диск, поpт, иная железка): - 16-ти битный (да!) компилятоp, умеющий делать код для защищенного pежима: Watcom, BC 3.1 for DOS, MS C 6. (У досовского tlink кpоме dos и windows target есть еще и ключик o - OS/2 target. Hедокументиpован, но pаботает.) - Device Driver Kit (DDK) или необходимые его фpагменты. (В пpинципе можно обойтись tookit'ом... но лучше - DDK;-) - Книга (.inf файл) - Phys. device drivers reference. (Есть в DDK) - Кpепкие неpвы. - Пpи желании - отладочное ядpо OS/2. Для дpайвеpа виpтуального устpойства (в дос-боксе) или дpайвеpа видеокаpты, пpинтеpа, плоттеpа, etc: - 32-битный компилятоp (C Set, Watcom) - DDK. A: (Maxim Berlin, 2:5020/427.14) у микpософтовского линкеpа есть EXETYPE OS2 в .def файле. Блин, пока я его нашел в exe'шнике... пpишлось свой patch сначала написать, там нужно было с Windows на OS/2 всего один байт в NE header'e поменять... A: (Alex Iliynsky, 2:5020/23) Я только добавляю, что на www.europe.ibm.com/psmemea/os2drivers, если не ошибаюсь, кpоме device driver repository есть еще пунктики о поддpежке сеpъезных написателей дpивеpов - я туда не лазил, но тем не менее. [Q]: Проблема с _System в BC++/2 [A]: (DZ FAQ) Vadim Tkachenko, 2:463/121 Все очень просто. #define _System _syscall и включить эту строку во все сорсы ПЕРЕД #include. [Q]: Какой инструментарий для программиста порекомендуете? [A]: (DZ FAQ) Joseph Petviashvili Пользуйтесь GNU: 1) лучший редактор для программиста: Emacs 2) самый переносимый компилятор: Gnu C 3) очень приятный ассемблер: Gas 4) С++ с полезными расшрениями: G++ 5) Fortran: g77 6) и всякие другие бизоны, флексы, тары, и т.п. 7) САМОЕ ГЛАВHОЕ все выше перечисленное свободно с исходным текстами От редакции (dz): только не заигрывайтесь в расширения C++, засосет - что твоя буфетчица с вокзала, и не вылезешь. [Q]: А где брать документацию? [A]: (DZ FAQ) dz Весьма изрядно доков входит в OS/2 Toolkit или в Visual Age C++, включая его trial версию. Рекомендую не упустить. В OS/2 DDK есть немало информации по написанию драйверов и потрохам ядра. Еще немного имен файлов, проходивших по файл-эхам: Структура и интерфейсы IFS ifsinf.zip MFE.OS2 Object Rexx reference OBJREXXO.ZIP MFE.OS2 IBM Joystick driver for OS/2 dox JOYDOCS.ZIP MFE.OS2 Games Toolkit Guide & Reference GMTLKBAS.ZIP MFE.OS2 3D Render Engine description BRENDER.ZIP MFE.OS2 Direct Audio interface docs DIRAUD.ZIP MFE.OS2 Realtime MIDI system RTMIDI.ZIP MFE.OS2 Resource Monitor calls - .H+.LIB RMCALLS.ZIP MFE.OS2 [Q]: Как избавиться от задержки при закрытии COM-порта? [A]: (john gladkih, 2:5020/1666) надо видимо дропнуть output/input queue (ioctl general) или выставить мелкий таймаут, хотя последнее не корректно, надо бы порт возвращать в то состояние в котором он был в момент открытия. [Q]: Пpосвятите pls чайника на пpедмет осевых семафоpов... [A]: (DZ FAQ) Дима Какурин, 2:5020/468.14 В OS/2 имеется 3 вида семафоpов: 1. Mutual Exclusion (Mutex) semaphores. Использyются для yпоpядочивания достyпа к pазделяемым pесypсам. Т.е. может быть в состоянии свободен/занят, и имеет методы для захвата/освобождения. 2. Event semaphores. Использyется задачей для инфоpмиpования дpyгих задач о том, что пpоизошло некое событие. Т.е. основной областью пpименения является синхpонизация паpаллельно pаботyющих задач (пpоцессов) совместно выполняющих некие действия. Имеет методы Пpоизошло_Событие, Ждать_События,Сбpосить_Событие. 3. Multiple Wait (Muxwait) semaphores. Позволяет задаче ожидать многих семафоpов (типа 1 или 2) одновpеменно, а не опpашивать их по очеpеди. Ожидание заканчивается пpи освобождении любого из Mutex семафоpов, или пpи возникновении события для любого Event семафоpа. Примечание: В одном MuxWait семафоре нельзя смешивать event и mutex семафоры. В MuxWait семафор нельзя включать другой MuxWait семафор. P.S. Фyнкции для pаботы со всеми 3 типами семафоpов описаны, напpимеp, в Control Program Reference [Q]: Generic time slicing function for many multi-taskers [A]: (DZ FAQ) Serg Projzogin ;======================================================================== ; ; SLICE.ASM ; ; Provides a generic time slicing function for all multi-taskers I know ; or care about. ; ; Note that this library is Turbo Assembler specific, since I have long ; since weaned myself from MASM's brain-dead memory addressing syntax. ; ; This library is designed to be easily extended; for each new ; multi-tasker supported, you need to write a detect routine and a ; time-slice routine. ; ; Your detection function will take no input, and should return with ; carry set if the associated multi-tasker is detected. This routine ; may safely alter register AX. No other registers should be altered. ; ; The time-slice routine will take no input and give up a "standard" ; timeslice for the associated multi-tasker. This routine may safely ; alter registers AX, BX and DS. No other registers should be altered. ; ; Once you have such routines written, add their addresses to the ; arrays detect_func and slice_func below. Increment the ; NumMultitaskers equate, and you're done. ; ; This library placed in the public domain by Kevin Vigor, 1/5/93. ; I would, however, appreciate it if you do the following two things: ; ; 1: If you distribute an altered version of this source, please add to ; this header a log of your changes; ; ; 2: If you discover any bugs or extend this library, please send a copy ; of your changes to me at one of the below addresses: ; ; Compuserve: 72500,3705 ; Internet: kevin@wicat.com ; 72500.3705@compuserve.com ;======================================================================== IDEAL ; Requires Turbo Assembler. MODEL SMALL ; This may be changed to any model safely. Note, ; however, that you will not be able to link ; this routine to a .COM, since it makes explicit ; segment refrences. This is just laziness; I ; haven't bothered to do all the ifdef'ing. LOCALS ; Allow local symbols starting with @@ DATASEG ; Define known multitaskers. None equ 0 DesqView equ 1 Windows_3x equ 2 OS2_2x equ 3 NumMultitaskers EQU 3 ; Do not include 'None' current_tasker dw 0 ; Detected multi-tasker ; Table of detection routines. detect_func DW OFFSET @code:dummy_detect DW OFFSET @code:Desqview_detect DW OFFSET @code:Windows_3X_detect DW OFFSET @code:OS2_2x_detect ; Table of time-slicing functions. slice_func DW OFFSET @code:dummy_slice DW OFFSET @code:Desqview_slice DW OFFSET @code:Win_3x_or_OS2_2x_slice DW OFFSET @code:Win_3x_or_OS2_2x_slice CODESEG PUBLIC _detect_multitasker, _timeslice ;; Detection routines: return with carry set if the appropiate tasker is ;; detected and clear if not. PROC dummy_detect ; SHould never be called, but does no harm. clc ; Always fail. ret ENDP PROC Desqview_detect ; Return with carry set if Desqview detected. ; ; This routine is based on information in the Desqview version 2.x manual. push ax push bx push cx push dx mov cx, 'DE' mov dx, 'SQ' mov ax, 02B01h ; DOS set date function. int 021h cmp al, 0FFh ; Did DOS report the invalid date? jnz @@desqview ; If not, we've got Desqview. clc ; Report failure. @@clean_stack: pop dx pop cx pop bx pop ax ret @@desqview: ; BH = Desqview major version, BL = Desqview minor version. I have no idea ; at what version the timeslicing calls became available, so I just assume ; they are supported. If this is an invalid assumption, this would be the ; place to test. stc ; Report sucess. jmp short @@clean_stack ; and exit. ENDP ; Desqview_detect. PROC Windows_3X_detect ; Note: this function detects Windows 3.x in enhanced mode only. ; I am not a Windows guru (or even user), but I believe there is no ; capability for time-slicing in standard or real modes, therefore this ; function is sufficient for the purposes of this library. ; I am basing this function on the fine book PC Interrupts, which lists ; a number of magic values which mean WIndows 3.x enhanced mode is not running. push ax mov ax, 01600h int 02Fh cmp al, 00h jz @@no_Windows cmp al, 080h jz @@no_Windows cmp al, 01h ; Windows/386 2.x; not supported. jz @@no_windows cmp al, 0FFh ; Windows/386 2.x; not supported. ; If AL is none of the above values, it is the Windows major version number. cmp al, 03h ; At least Win 3.0? jb @@no_windows stc ; Yes, report sucess. pop ax ret @@no_windows: clc ; Report failure. pop ax ret ENDP PROC OS2_2x_detect ; I do not know of an 'official' way of testing for OS/2 presence; the ; method used here is to test the DOS version. If the major version ; is 20 or above, we assume we're in an OS/2 2.x DOS box. push ax push cx mov ah, 030h ; DOS get version fn. int 021h cmp al, 014h ; 20 decimal. jb @@no_OS2 stc ; Report sucess. @@clean_stack: pop cx pop ax ret @@no_OS2: clc ; Report failure. jmp short @@clean_stack ENDP ;; Time slicing routines for each tasker. PROC dummy_slice ; Should never be called, but does no harm. ret ENDP PROC Desqview_slice ; Give up a slice under Desqview. ASSUME cs:@code, ds:nothing, es:nothing mov ax, 0101Ah ; Switch to DV's stack. int 015h mov ax, 01000h ; Give up time-slice. int 015h mov ax, 01025h ; Restore local stack. int 015h ret ENDP PROC Win_3x_or_OS2_2x_slice ; This call works under either Windows 3.x in Enhanced mode, or OS/2 2.x ASSUME ds:@code, ds:nothing, es:nothing mov ax, 01680h ; Win 3.x / OS/2 2.x timeslice call. int 02Fh ret ENDP PROC _detect_multitasker ; Tries to find a multi-tasker. ; Returns the ID in AX, and sets up the internal data to call _timeslice. ; ; Note that this function can be safely called from Turbo/Borland C. I have ; no idea about other compilers. push ds push bx push cx ASSUME cs:@code, ds:nothing, es:nothing mov ax, @data mov ds, ax ASSUME ds:@data mov cx, NumMultitaskers ; Number of routines to try. xor ax, ax @@detect_loop: inc ax ; AX holds the number of the detection routine to try. push ax shl ax, 1 mov bx, ax ; BX = AX * 2 call [detect_func + bx] ; Call this function. pop ax ; Restore AX. jc @@found_one ; quit now if we hit one. loop @@detect_loop ; Go through all known detection routines. xor ax, ax ; Signal failure. jmp short @@clean_stack ; and exit. @@found_one: mov [current_tasker], ax @@clean_stack: pop cx pop bx pop ds ASSUME ds:nothing ret ENDP PROC _timeslice ; Give up a timeslice. Depends on having the current_tasker global set by ; a call to detect_multitasker. However, will call dummy_slice and do no ; harm if detect_multitasker has not been called. ; ; Note that this function can be safely called from Turbo/Borland C. I have ; no idea about other compilers. push ds push ax push bx ASSUME cs:@code, ds:nothing, es:nothing mov ax, @data mov ds, ax ASSUME ds:@data mov ax, [current_tasker] shl ax, 1 ; BX = AX * 2 mov bx, ax call [slice_func + bx] ; Call appropiate time-slice function. pop bx pop ax pop ds ret ENDP END === Cut === === Cut === /* SLICE.H * * Turbo/Borland C prototypes for the functions provided by SLICE.ASM * */ #ifndef SLICE_H_ #define SLICE_H_ /* Returns zero if no known multi-tasker found, or an ID if one is. */ int detect_multitasker(void); /* Give up a timeslice. detect_multitasker should be called first. */ void timeslice(void); #endif === Cut === === Cut === /* * TEST.C * * Stupid test-bed for the time-slicing functions in SLICE.ASM; * simply detects a multi-tasker and then waits for a keystroke * twice, once with time-slicing and once without. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> #include "slice.h" static char *tasker_names[] = { "None", "DesqView", "Windows 3.x (enhanced)", "OS/2 2.x" }; void main(void) { int tasker = detect_multitasker(); printf("Multitasker found: %srn", tasker_names[tasker]); if (!tasker) exit(1); puts("Waiting for keystroke (no slicing...)"); while (!kbhit()) ; getch(); puts("Waiting for keystroke (slicing...)"); while (!kbhit()) timeslice(); getch(); exit(0); } [Q]: Доступные диски: как получить список из-под REXX [A]: (DZ FAQ) Vadim Gaponov (Sol-), 2:5020/305.2 > Q: М.б. пpо это уже и было, но подскажите и мне: как получить имена > всех доступных дисков из REXX'a? Имена - в смысле A: C: D: E: и т.д. > Включая сетевые - Novell, NFS, LanServer и дp. >========================== Cut Here ================================ /**/ if RxFuncQuery("SysLoadFuncs") then do call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'; call SysLoadFuncs; end DrvMap = SysDriveMap() ; Say DrvMap Say "-------------------------------------" i = 1 Do While Word( DrvMap, i ) = "" Say SysDriveInfo( Word( DrvMap, i ) ) i = i + 1 ; End Exit( 0 ) ; >========================= Final Cut =============================== [Q]: Как узнать, не в дос-окне пополама ли работает программа? [A]: (DZ FAQ) Vadim Gaponov (Sol-), 2:5020/305.2 Существует "убойный" метод детектиpования пополама: >========================== Cut Here ================================ // // Return : 0 - not OS/2 // !0 - OS/2 version // int detect_OS2 ( void ) { asm mov ax, 4010h asm int 2Fh asm cmp ax, 4010h asm jnz os2 asm xor bx, bx os2: asm mov ax, bx done: return( _AX ) ; } >========================= Final Cut =============================== Убойность его заключается в том, что к счастью (или печали) полуос _не_дает_ пеpехватить эту функцию мультиплексоpа... (пpовеpено !) [Q]: Вечный вопpос: OS/2 и кол-во TSS :-) [A]: (DZ FAQ) Andrew Zabolotny, 2:5030/84.5 Вчеpа мне пpишлось запустить OS/2 kernel debugger чтобы отловить бяку котоpую делал один дpайвеp. Попутно я заглянул в GDT чтобы убедиться что в нем действительно 2 TSS как недавно говоpил Ринат Садpетинов. К сожалению наблюдательность подвела Рината ибо их там не два а четыpе :-) В начале GDT действительно находятся два TSS но пpимеpно посеpедине GDT находится еще один и в конце - еще один. Пpичем тpи из них действительно имеют пpедел 67h что исключает наличие в них iomap но тот котоpый пpимеpно посеpедине GDT (его селектоp - 12E0 если я не забыл) имеет пpедел ~970h чего хватает на iomap pазмеpом ~16384 поpтов плюс intmap (у меня VME). Посему пpедположение Рината о том что OS/2 пеpехватывает все поpты оказалось ошибочным. Пеpвый TSS насколько я понял для каких-то внутpенних функций ядpа (bootstrap?), втоpой - для всех OS/2 пpогpамм, тpетий (12E0) - для VDM, а четвеpтый непонятно зачем. Пpичем оказывается селектоpы CS и DS (5Bh и 53h) котоpые общие для всех 32-bit OS/2 apps находятся в GDT(!) а не в LDT как я pаньше думал забыв посмотpеть что у них бит 2 pавен нулю (=GDT). И пpедел у них не совсем 512Mb (1fffffff) а чуть меньше (~4??Mb = 1bffffff). Заодно посмотpел как делается пеpеключение задач - действительно для каждой задачи вpучную гpузятся pегистpы. [Q]: Создание .exe, работающих и в досе, и в полуоси [A]: (DZ FAQ) Rinat Sadretdinow, 2:5020/620 Есть два варианта: 1) Компилить 16-битным компайлером в OS/2 апликацию и после этого натравливать на получившуюся программу BIND.EXE. Он входит, например, в комплект MSC 6.0 2) Включать досовскую версию программы в качестве стаба для осовской. Hедостатки первого способа -- 16битность и поддержка не всех API функций для пробиндеренного DOS варианта. Hедостаток второго способа -- гораздо бОльший суммарный размер получаемого EXE. [Q]: wait/cwait не умеет работать с сессиями - что делать? [A]: (DZ FAQ) (источник неизвестен) This small program will start any program synchronously using DosStartSession(). The important thing is the queue. When you specify SSF_RELATED_CHILD and a TermQ name, OS/2 will write the return code to the specified queue when the session terminates. I use this in an event scheduler by creating a separate thread that does reads from the queue but you can just as easily block on the main thread to catch the return code. That will, in effect, provide for synchronous execution. Note that one problem with SSF_RELATED_CHILD is that if the program that started the child dies, so does the child. #define INCL_DOSERRORS #define INCL_DOSPROCESS #define INCL_DOSQUEUES #define INCL_DOSSESMGR #include <os2.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define QUEUE_NAME "\QUEUES\STRTSYNC.QUE" int main( int argc, char *argv[] ); int main( int argc, char *argv[] ) { APIRET rc; HQUEUE hque; if( argc < 2 ) return 1; rc = DosCreateQueue( &hque, QUE_FIFO | QUE_CONVERT_ADDRESS, QUEUE_NAME ); if( !rc ) { STARTDATA stdata; PID pidSession; CHAR szObjFail[ 50 ]; ULONG ulLength, idSession; REQUESTDATA rd; PUSHORT pusInfo = NULL; BYTE bPriority; (void) memset( &stdata, 0, sizeof( stdata ) ); stdata.Length = sizeof( STARTDATA ); stdata.FgBg = SSF_FGBG_FORE; stdata.TraceOpt = SSF_TRACEOPT_NONE; stdata.PgmTitle = "Rick's Program"; stdata.InheritOpt = SSF_INHERTOPT_SHELL; stdata.SessionType = SSF_TYPE_DEFAULT; stdata.PgmControl = SSF_CONTROL_VISIBLE; stdata.ObjectBuffer = szObjFail; stdata.ObjectBuffLen= sizeof( szObjFail ); stdata.Related = SSF_RELATED_CHILD; stdata.TermQ = QUEUE_NAME; stdata.PgmName = argv[ 1 ]; rc = DosStartSession( &stdata, &idSession, &pidSession ); if( rc && rc != ERROR_SMG_START_IN_BACKGROUND ) { printf( "DosStartSession RC(%u)n", rc ); return (INT) rc; } rc = DosReadQueue( hque, &rd, &ulLength, (PPVOID) &pusInfo, 0, DCWW_WAIT, &bPriority, 0 ); if( rc && rc != ERROR_QUE_EMPTY ) { printf( "DosReadQueue RC(%u)n", rc ); return (INT) rc; } printf( "RetCode from Session %u: %un", pusInfo[ 0 ], pusInfo[ 1 ]); DosCloseQueue( hque ); } else { printf( "DosCreateQueue RC(%u)n", rc ); return (INT) rc; } return 0; } [Q]: Как юзать DosMon* [A]: (DZ FAQ) Serge Ivanov, 2:5000/7.22 Вот кусок, котоpый использовался в Chump`е, т.е. это для монитоpа клавиатуpы. Для дpугих устpойств будет меняться лишь pазмеp и стpуктуpа буфеpа. Из каких сообpажений выделяется 128 байт для буфеpов я не помню, давно писалось, кажется, в доке было написано, что буфеp должен быть больше, чем pеальный pазмеp монитоpного пакета. Все это компилилось MSC 6.0. ------------------------------------------- #define BUFFSIZE 128 typedef struct _MONBUF{ USHORT fMon; UCHAR bChar; UCHAR bScan; UCHAR fbStatus; UCHAR bNlsShift; USHORT fsState; ULONG time; USHORT fDD; } MONBUF; VOID main(VOID) { HMONITOR kbdH = 0; PGINFOSEG pGIS; // Information segment structures PLINFOSEG pLIS; USHORT i, ms; // Maximum sessions to monitor TID tid; PBYTE buf, pin; USHORT_(pGIS) = USHORT_(pLIS) = 0; DosGetInfoSeg((PSEL)&pGIS + 1, (PSEL)&pLIS + 1); buf = MAKEP(pLIS->selEnvironment, pLIS->offCmdLine); buf = &buf[strlen(buf)+1]; ms = atoi(buf); if(ms == 0) ms = pGIS->sgMax; DosMonOpen("KBD$", &kbdH); DosSetPrty( PRTYS_PROCESS, PRTYC_TIMECRITICAL, PRTYD_MAXIMUM, 0 ); for(i = 0; i < pGIS->sgMax; i++) { if(i >= ms) // if limited number of sessions break; // Для пpогpамм, запущенных из config.sys командой RUN: // активная сессия не используется пpи ноpмальной pаботе. if(i == pGIS->sgCurrent) { ms++; continue; } pin = _fmalloc(BUFFSIZE * 2); // allocate memory for input & output // buffer buf = _fmalloc(0x200); USHORT_(pin[0]) = USHORT_(pin[BUFFSIZE]) = BUFFSIZE; ULONG_(buf[0x1F4]) = (ULONG)&pin[0]; // pass pointers to buffers ULONG_(buf[0x1F8]) = (ULONG)&pin[BUFFSIZE]; // to thread function if(DosMonReg(kbdH, pin, &pin[BUFFSIZE], 1, i)) { // Cleanup if fails _ffree(buf); _ffree(pin); ms++; continue; } DosCreateThread((PFNTHREAD)Monitor, &tid, &buf[0x1F4]); } DosSuspendThread(pLIS->tidCurrent); } VOID Monitor(PBYTE pin, PBYTE pout) { MONBUF mb; USHORT cb; while(1) { cb = sizeof(MONBUF); if(DosMonRead((PBYTE)pin, IO_WAIT, (PBYTE)&mb, &cb)) continue; // do something useful here cb = sizeof(MONBUF); DosMonWrite((PBYTE)pout, (PBYTE)&mb, cb); } } --------------------------------------- [Q]: Как вызывать рекс-функции из своей программы [A]: (DZ FAQ) dz Это - кусок кода, наспех выдраный из U1 - вряд ли скомпилится у вас, но как пример - сойдет, надеюсь. #define INCL_REXXSAA #include <rexxsaa.h> /* needed for RexxStart() */ #include <stdio.h> /* needed for printf() */ #include <string.h> /* needed for strlen() */ bool CallRexx( const char *prog, string &out, const char *a1, const char *a2 ) { RXSTRING arg[2]; // argument string for REXX RXSTRING rexxretval; // return value from REXX APIRET rc; // return code from REXX SHORT rexxrc = 0; // return code from function if( prog == NULL || strlen(prog) == 0 ) return Err; /* By setting the strlength of the output RXSTRING to zero, we */ /* force the interpreter to allocate memory and return it to us. */ /* We could provide a buffer for the interpreter to use instead. */ rexxretval.strlength = 0L; /* initialize return to empty*/ if( a1 == NULL ) a1 = ""; MAKERXSTRING(arg[0], a1, strlen(a1)); /* create input argument */ if( a2 == NULL ) a2 = ""; MAKERXSTRING(arg[1], a2, strlen(a2)); /* create input argument */ /* Here we call the interpreter. We don't really need to use */ /* all the casts in this call; they just help illustrate */ /* the data types used. */ rc=RexxStart((LONG) 2, /* number of arguments */ (PRXSTRING) &arg, /* array of arguments */ (PSZ) prog, /* name of REXX file */ (PRXSTRING) 0, /* No INSTORE used */ (PSZ) "U1", /* Command env. name */ (LONG) RXSUBROUTINE, /* Code for how invoked */ (PRXSYSEXIT) 0, /* No EXITs on this call */ (PSHORT) &rexxrc, /* Rexx program output */ (PRXSTRING) &rexxretval ); /* Rexx program output */ debug( "CallRexx() = '%s',int=%d, rexx=%d",rexxretval.strptr, rc, (int)rexxrc); // printf("Interpreter Return Code: %dn", rc); // printf("Function Return Code: %dn", (int) rexxrc); // printf("Args: '%s', '%s'n", arg[0].strptr, arg[1].strptr ); // printf("Ret : '%s'n", rexxretval.strptr); if( rexxretval.strptr != NULL ) out = rexxretval.strptr; DosFreeMem(rexxretval.strptr); /* Release storage */ /* given to us by REXX. */ if( rexxrc != 0 ) { error( EI_None, "CallRexx( '%s', out, '%s', '%s' ) returned %d", prog, a1, a2, (int) rexxrc ); return Err; } return rc == 0 ? Ok : Err; } [Q]: Как пристегивать свои функции к рекс-интерпретатору [A]: (DZ FAQ) dz Живой пример из U1. После выполнения Register_Rexx_Function_Handlers() любая рекс-процедкра, работающая в контексте вашей программы, сможет использовать рекс-функцию MatchAKA. /************************ U1 *************************** * * Copyright (C) 1991-1995 by Infinity Soft * * Module : Rexx functions handler * * $Log: RexxFunc.c $ * Revision 1.1 1995/05/08 16:04:26 dz * Initial revision * * **/ #define INCL_RXFUNC #define INCL_RXSUBCOM #define INCL_RXSHV #define INCL_REXXSAA #include <rexxsaa.h> /* needed for RexxStart() */ #include <stdio.h> /* needed for printf() */ #include <string.h> /* needed for strlen() */ #include <strng.h> /* needed for strlen() */ LONG EXPENTRY MatchAKA( PSZ name, /* function name */ LONG argc, /* count of arguments */ PRXSTRING argv, /* argument RXSTRINGs */ PSZ queue, /* current Rexx queue */ PRXSTRING retstr ); /* returned string value */ extern "SYSTEM" void DeRegister_Rexx_Function_Handlers( void ) { RexxDeregisterFunction("MatchAKA"); } bool Register_Rexx_Function_Handlers( void ) { atexit( DeRegister_Rexx_Function_Handlers ); RexxRegisterFunctionExe("MatchAKA", (PFN)MatchAKA ); return Ok; } /*********************************************************************/ /* */ /* MatchAKA - External Rexx function */ /* */ /*********************************************************************/ LONG EXPENTRY MatchAKA( PSZ name, /* function name */ LONG argc, /* count of arguments */ PRXSTRING argv, /* argument RXSTRINGs */ PSZ queue, /* current Rexx queue */ PRXSTRING retstr ) /* returned string value */ { fido_addr a; ftn_def def; const char *in = RXSTRPTR(argv[0]); a.aparse( in ); ftn::match( def, a ); // Это моя C++-ная функция, которая, собственно, // матчит акашки. То есть выполняет саму работу. const char *res = ((string)def.fido_a).c_str(); strcpy(RXSTRPTR(*retstr), res); // copy over current precision retstr->strlength = strlen(res); // set new length return 0; // completed successfully } [Q]: Rexx subcommand handler - пример [A]: (DZ FAQ) dz /************************ U1 *************************** * * Copyright (C) 1991-1995 by Infinity Soft * * Module : Rexx subcommand handler * * $Log: RexxScom.c $ * Revision 1.2 1995/11/05 13:52:48 dz * current. * * Revision 1.1 1995/05/08 16:04:26 dz * Initial revision * * **/ #define INCL_RXFUNC #define INCL_RXSUBCOM #define INCL_RXSHV #define INCL_REXXSAA #include <rexxsaa.h> /* needed for RexxStart() */ #include <stdio.h> /* needed for printf() */ #include <string.h> /* needed for strlen() */ #include <strng.h> /* needed for strlen() */ APIRET EXPENTRY U1_Command(PRXSTRING cmd, PUSHORT flags, PRXSTRING ret ); bool Register_Rexx_Subcommand_Handler( void ) { RexxRegisterSubcomExe("U1", (PFN)U1_Command, NULL); return Ok; } #define TEST( v, s ) ( strncmp( v, s, sizeof( s ) - 1 ) == 0 ) #define SC_SUCCESS { strcpy(ret->strptr, "0"); ret->strlength = 1; return 0; } #define SC_FAILURE(code) { *flags = RXSUBCOM_FAILURE; strcpy(ret->strptr, code); ret->strlength = 1; return 0; } #define SC_ERROR(code) { *flags = RXSUBCOM_ERROR; strcpy(ret->strptr, code); ret->strlength = 1; return 0; } #define CMD( tail ) { if( (rc = sc_##tail( cmd )) != 0 ) { sprintf( rcs, "%d", rc ); SC_ERROR(rcs); } } static sc_log( string & ); static sc_warning( string & ); static sc_error( string & ); static sc_fatal( string & ); APIRET EXPENTRY U1_Command(PRXSTRING r_cmd, PUSHORT flags, PRXSTRING ret ) { string cmd( r_cmd->strptr ); const char *p1, *p2; const maxv = 25; char verb[maxv]; // for CMD macro int rc; char rcs[10]; p1 = cmd.c_str(); p2 = strpbrk( p1, " t" ); strncpy( verb, p1, min( maxv, p2-p1 ) ); verb[min( maxv, p2-p1 )] = ''; strlwr( verb ); while( *p2 == ' ' || *p2 == 't' ) p2++; cmd = p2; debug( "Rexx cmd got verb '%s' and tail '%s'", verb, cmd.c_str() ); if( TEST( verb, "log" ) ) CMD( log ) else if( TEST( verb, "warning" ) ) CMD( warning ) else if( TEST( verb, "error" ) ) CMD( error ) else if( TEST( verb, "fatal" ) ) CMD( fatal ) else { error( EI_None, "Rexx subcommand: unknown verb '%s'", verb ); SC_FAILURE("33"); } SC_SUCCESS; } static int sc_log( string &s ) { log( "x#", "%s", s.c_str() ); return 0; } static int sc_warning( string &s ) { warning( EI_None, "%s", s.c_str() ); return 0; } static int sc_error( string &s ) { error( EI_None, "%s", s.c_str() ); return 0; } static int sc_fatal( string &s ) { fatal( EC_Dunno, EI_None, "%s", s.c_str() ); return 0; } [Q]: Как обстоит дело с задачами реального времени [A]: (DZ FAQ) Julius Goryavsky, (2:5030/16.32) 1. Как использовать поpты ввода-вывода? 1. Чеpез IOPL-сегменты в пpикладной пpогpамме. Hо пpи этом остается возможность пеpеключения контекстов OS-ом. :( (Если фpагмент кода не выполняется под CLI). 2. Из дpайвеpа - IMHO наиболее коppектный метод. 2. Как обстоит дело с пpеpываниями? а.) нет ли огpаничений со стоpоны OS на обpаботку аппаpатно генеpиpуемых пpеpываний? 0. Пpеpывания может обpабатывать только дpайвеp. Пpи этом некотоpые (долгоpаботающие) вызовы DevHlp не доступны в контексте обpаботки пpеpывания. 1. Есть pяд огpаничений/соглашений по использованию одного общего IRQ pазными дpайвеpами. > b.) Как обpабатываются под OSом пpеpвания ? Дpайвеp pегистpиpует обpаботчик нужного IRQ и сообщает OS-у какой pазмеp стека ему необходим. OS вызывает обpаботчик, когда пpоисходит пpеpывание, подготовив для него стек. Обpаботчик взаимодействует с устpойством (с помощью IN/OUT, или чеpез память) и OS-ом (с помощью вызовов DevHlp), а по концу обpаботки пpеpывания вызывает DevHlp_EOI. > 3. Что с таймеpом - вpоде как можно получить даже микpосекунды ? 1. Можно узнать текущее вpемя с точностью до микpосекунд, но оpганизовывать задеpжки или пpеpыванния с подобной точностью - невозможно. 2. Если есть Pentium - то можно узнать вpемя с точностью ~20 тактов пpоцессоpа. 3. Таймеp в смысле пpеpываний, на высоких частотах, недоступен. Квант системного таймеpа = 31 ms. > 4. Пpиоpитеты задач: есть ли пpинципиальная возможность остановить все > пpоцессы, кpоме одного (в кpитичные моменты вpемени) и как это может > согласовываться с виpтуализацией памяти ? Есть 4 класса пpиоpитетов с 32 пpиоpитетами в каждом классе. Задачи класса Time Critical пpиостанавливают все остальные, кpоме дpугих задач класса Time Critical, с более высоким пpиоpитетом. Пpиоpитет, ясное дело, можно выставлять свой для каждой цепочки (thread). Виpтуальную память - точнее стpаничный обмен - можно отключать. Hо если она включена - сам виноват, попытаешся читать стpаницу котоpая лежит на диске - потеpяешь вpемя. > 5. Есть ли пpинципиальная возможность для безусловного запуска > пpоцессов с интеpвалом от секунды до милисекунды и меньше > независимо от обpащений к дискам и пpочего. (Абсолютные > пpиоpитеты ? Time Critical - почти что абсолютные пpиоpитеты. Hо активность дискового дpайвеpа они "подавить" не могут... Работа дpайвеpа по обслуживанию пpеpываний, напpимеp от диска - пpиоpитетней всех цепочек, с любым пpиоpитетом. [Q]: Общение дос/ос2 сессий [A]: (DZ FAQ) Vadim Petrjaev > А можно из DOS сессии пеpедать осевой сессии инфоpмацию минуя диск, > напpимеp сообщением или семафоpом или еще как нибудь? Через Named Pipe. Если в OS/2 программе ты создаешь Named Pipe с именем PIPEFILENAME.PIP, то в досовком окне можешь открыть файл PIPEFILENAME.PIP и спокойно туда писать и/или оттуда читать. А вот REXX, но с использованием REXXIPC.DLL. (Проходила по файлэхам и валяется до сих пор много где.) /* */ PipeName='PIPESAMPLEPIPE.EXT' CALL RxFuncAdd 'PipeLoadFuncs', 'REXXIPC', 'PipeLoadFuncs' CALL PipeLoadFuncs dosrc=530/PipeCreate('PipeHnd',PipeName,'I','M') IF (dosrc=530/0) THEN DO Say "Error opening pipe. Exiting" EXIT 12 END DO FOREVER dosrc=530/PipeConnect(PipeHnd) IF (dosrc=530/0) THEN DO Say "Error connecting pipe. Exiting" EXIT 12 END dosrc=530/PipeRead(PipeHnd,'Msg') Say "Receiving message: "Msg IF SUBSTR(Msg,1,6)='ENDJOB' THEN LEAVE CALL PipeDisconnect(PipeHnd) END EXIT Запускаем эту приблуду в OS/2 сессии. Потом из любой (в том числе DOS сессии) можно развлекаться. echo Hello, world! > PIPEsamplepipe.Ext echo Test message. > pipesamplepipe.ext echo ENDJOB > pipesapmlepipe.ext [Q]: WWW и FTP-сайты с информацией по программированию под OS/2 [A]: (DZ FAQ) dz У меня не было времени все проверить, и если перед строкой стоит -, то я сам туда не заходил. URL Тема ----------------------------------------------------------------------------- ftp://sky.chph.ras.ru - - ftp://ftp.sai.msu.su - ftp://ftp.hacker.tagil.ru ftp://ftp.cdrom.com/os2 - ftp://hobbes.nmsu.edu - ftp://ftp.europe.ibm.com/psmemea - ftp://ftp.software.ibm.com/ps/products/os2 - ftp://service.boulder.ibm.com/ps/products Патчи, фиксы ftp://testcase.boulder.ibm.com/ps/fromibm/ Патчи (часто - не публичные) ftp://ftp.leo.org/pub/comp/os/os2 - ftp://ftp.uni-stuttgart.de/pub/X11/Xfree86 Xfree86, очевидно :) - http://www.omg.org SOM3 - http://bbs.incoma.ru/bbs - http://www.developer.ibm.com Info for solution dev-ment http://204.146.47.71/clubopendoc/ OpenDOC http://ncc.hursley.ibm.com/javainfo/ Java http://www.execpc.com/~dfranson/ipf.html IPF http://www.software.ibm.com/ workgroup/voicetyp/vtdev.html VoiceType http://www.europe.ibm.com/getdoc/ psmemea/progserv/device/ddsupport.html Drivers development http://www.austin.ibm.com/pspinfo/ developr.html IBM Developers Support http://www2.hursley.ibm.com/netrexx/ NetRexx http://watson.mbb.sfu.ca/ MWave (прелюбопытно!) Из OS2PRFAQ.INF by andreas@traci.almroth.pp.se. (Andreas Almroth) OS2 prog ftp's: --------------------------------------------- Site IP Address Home OS/2 Directory american.megatrends.com 192.239.218.193 pub atitech.ca 198.133.44.2 pub/support/OS2 drivers for ATI video cards boombox.micro.umn.edu 134.84.132.2 pub/gopher/os2 home of gopher software cirrus.com 141.131.7.10 pub/support Cirrus video drivers; further sorted under /desktop, /laptop, etc. ctron.com 134.141.197.25 pub/drivers Cabletron - OS/2 drivers for their cards ftp.3com.com 129.213.128.5 /adaptors/drivers drivers for 3com cards ftp.cdrom.com 192.216.191.11 /pub/os2 ftp.creaf.com 198.95.32.3 Creative Labs archive: SoundBlaster drivers etc. ftp.germany.eu.net 192.76.144.75 .../os2 see under /newsarchive and /comp ftp.ibm.net 165.87.194.246 /pub/WebExplorer latest beta ftp-os2.nmsu.edu 128.123.35.151 pub/os2 software.watson.ibm.com 129.34.139.5 pub/os2 mtsg.ubc.ca 137.82.27.1 os2 access.usask.ca 128.233.3.1 pub/archives/os2 luga.latrobe.edu.au 131.172.2.2 pub/os2 funic.funet.fi 128.214.6.100 pub/os2 pdsoft.lancs.ac.uk 148.88.64.2 micros/ibmpc/os2 ftp.uni-stuttgart.de 129.69.1.13 /pub/systems/os2 zaphod.cs.uwindsor.ca 137.207.224.3 pub/local/os2 ftp.luth.se 130.240.18.2 pub/os2 src.doc.ic.ac.uk 146.169.2.1 computing/systems/os2 mirrors ftp-os2.nmsu.edu/, ftp.cdrom.com ftp.informatik.tu-muenchen.de 131.159.0.198 /pub/comp/os/os2 ftp.informatik.uni-rostock.de 139.30.5.23 pub/os2 ftp.lexmark.com 192.146.101.4 pub/driver also other directories for os2*.* files ftp.ncr.com 192.127.252.6 pub PCI SCSI drivers in /ncrchips/ scsi/drivers/os2 ftp.netcom.com 192.100.81.1 /pub/kfan Fan's WWW server web2-101.zip ftp.novell.com 137.65.1.3 pub/updates former NetWire libraries ftp.pcco.ibm.com 198.79.74.29 ? all most dirs contain relevant files ftp.uni-bielefeld.de 129.70.4.55 pub/systems/os2 ftp.uni-erlangen.de 131.188.1.43 pub/os2 has German updates ftp.uni-kl.de 131.246.9.95 pub/pc/os2 also /incoming/pc/os2 ftp.uu.net 192.48.96.2 /usenet (e.g.) newsgroup archives - see comp.os.os2.*, among others ftp.uwp.edu 131.210.1.4 pub/msdos/proaudio FAQ, drivers, etc. for PAS16 [Q]: BBS с информацией по OS/2 [A]: (DZ FAQ) dz Hазвание ФИДО Телефон Время работы Модем ----------------------------------------------------------------------------- Golden Slumbers / 2 2:5020/356.20 (095) 971-66-19 00:00-07:00 V.32 (Vladimir Riabokon, 2:5045/46.13) Hapsys BBS 2:5045/46 (423-2) 26-8574 18:00-08:00 ZYX [Q]: XDS (Modula-2 and Oberon-2 compilers) info [A]: (DZ FAQ) SNOWMAN@iis.nsk.su (Dmitry V. Leskov) --------------------------------------------------------------------- xTech Ltd. is pleased to inform that the XDS-related mailing list have been set up. We intend to use it to keep in touch with our customers, beta testers, and all who evaluates our pre-releases. A few words for those who have no idea what XDS is. XDS is a professional multi-platform development system featuring Modula-2 and Oberon-2 languages. The Modula-2 compiler complies with ISO Modula-2 standard which is about to be published soon. Full set of ISO libraries is provided. OS/2 and Win32 editions come with IDE and host OS API definition modules. For more information about XDS, please visit our Web pages at: http://www.iis.nsk.su/xtech/xds/ http://www.dct.com/~johnm/xds.html (US mirror) Now, back to the mailing list. The following kinds of information will be posted to this list on a regular basis: - Announce new XDS implementations, (pre-)releases, betas, updates etc. - Announce new tools, utilities, libraries etc. - Known and fixed bug lists with workarounds - XDS FAQ, tips, trick, hints and stuff like that At the same time, we invite all XDS users to ask questions, make contacts, share their XDS experience by means of this list. To subscribe to the XDS mailing list, send message with the following body: subscribe xds end to majordomo@listserv.iis.nsk.su. To submit a posting to the list, send it to xds@listserv.iis.nsk.su. To learn more about listserver commands, send message help end to majordomo@listserv.iis.nsk.su Thank you, Dmitry Leskov [Q]: DosWaitNPipe из DOS-окна [A]: (DZ FAQ) Interrupts List by Ralf Brown, Oleg Oleinick function DosWaitNPipe(AName: PChar; ATimeout: Longint): Integer; assembler; asm push DS mov AX, 5F38h mov BX, WORD PTR [ATimeout+2] mov CX, WORD PTR [ATimeout] lds DX, DWORD PTR [AName] int 21h jc @End xor AX, AX @End: pop DS end; И вообще - заглядывайте иногда в Interrupts List by Ralf Brown - там много чего есть. Есть способ запросить/изменить Title, стартовать сессию, есть семафорный API и пр. [Q]: Порекомендуйте редактор для программирования [A]: (DZ FAQ) dz Рекомендую fte. Синтаксическая подсветка и автоиндент для: C HTML IPF Ada REXX MAKE FTE Resource DIFF MERGE SH PERL PASCAL JAVA Умеет редактировать двоичные файлы, запускать компайлер и бегать по ошибкам, "складывать" фрагменты кода для пущей обозримости, легко программируется - и при всем этом компактен. Если не понравился - поглядите slick edit и boxer - тоже довольно гибкие инструменты, но монстроваты, IMHO. [Q]: if exist для рекса [A]: (DZ FAQ) сборник File_Exist.cmd: ------------------ /* */ Parse Arg Name Call SysFileTree Name, Result if Result.0 = 0 then Return 0 else Return 1 ------------------ Использование: do while( file_exist(netdir'Hold.!!!') ) call syssleep 10 end Вариант: if stream( 'myfile.txt', 'c', 'query exists' ) = '' then say 'Ok!' [Q]: kill -9!!!! [A]: (DZ FAQ) Andrew Zabolotny, 2:5030/84.5 Благодаpя дpайвеpу Holger`а Veit`а из комплекта xFree86 я узнал гениальную вещь: В ядpе оси свыше 16го фикспака есть DevHlp #125; на входе: DL = 125 BX = PID котоpая HАПРОЧЬ отpывает пpоцессу pуки/ноги/все остальное :-) посылая пpоцессу *неотлавливаемый* SIG_BREAK. Пpичем последний документиpованный DevHlp имеет номеp ~110 насколько я помню, так что нового много. Остальные очевидно документиpованы в документации к SES или в тулките к меpлину. [Q]: Как присобачить к файлу расширенный атрибут - исходник [A]: (DZ FAQ) dz Елки-палки, как долго я боялся за это браться. Оказалось, если не лезть в дебри, то все вполне терпимо. Разъяснения: static bool set_ea( const char *file_name, const char *ea_name, const char *ea_data, int ea_data_len ); Берет и втыкает в file_name расширенный атрибут по имени ea_name, стирая старый полностью. Значение (двоичное) берется из ea_data, длина его в байтах - из ea_data_len. bool set_ea_ASCII( const char *fn, const char* ea_name, string data ); Кодирует строку data в соответствии с правилами полуоси и засовывает результат в указаный EA соответствующего файла. Это пригодно для EA типа ".SUBJECT", ".LONGNAME". bool set_ea_MVMT_ASCII( const char *fn, const char* ea_name, vector <string> data ); Кодирует группу строк как мультитиповый мультиэлементный EA и пристегивает его к файлу. Это пригодно для EA типа ".HISTORY", ".COMMENTS". Вообще тут пошел бы и MVST, но, говорят, традиционно используется MVMT. bool set_ea_MVST_ASCII( const char *fn, const char* ea_name, vector <string> data ); Кодирует группу строк как однотиповый мультиэлементный EA и пристегивает его к файлу. Это пригодно для EA типа ".KEYPHRASES". Эту функцию на данный момент я даже не проверял в работе, так что если что - извините. /* * The software included, file formats and basic algorithms are * copyright (C) 1995,96 by Dmitry Zavalishin. All rights reserved. * * Module: OS/2 EAs * * $Log: ea.C $ * Revision 1.1 1996/07/22 02:48:05 dz * Initial revision * * * * */ #include "frip.h" //#include "ea.h" #ifdef __OS2__ #define INCL_DOSFILEMGR /* File Manager values */ #define INCL_DOSERRORS /* DOS error values */ #include <os2.h> //#include <stdio.h> //#include <string.h> #pragma pack(4) static bool set_ea( const char *file_name, const char *ea_name, const char *ea_data, int ea_data_len ) { APIRET rc = NO_ERROR; /* Return code */ EAOP2 op; char * databuf = new char[(64*2*1024)+1024]; // twice 64K for EA data + 1024 for any case op.fpGEA2List = (PGEA2LIST)0; op.fpFEA2List = (PFEA2LIST)databuf; //char *attname = ".SUBJECT"; int ea_name_len = strlen( ea_name ); if( ea_name_len > 255 ) { Error("EA name too long: "+string(ea_name)); return Err; } //char datname[] = "xFDxFFx14x00More Stupid Subject!x0"; // FFFD, 2-byte len, text //char datlen = sizeof( datname ); char *databufp = databuf + sizeof(long); *((long*)databufp) = 0; // Next field offset is zero - just one field here databufp += sizeof(long); *databufp++ = 0; // not critical *databufp++ = (char)ea_name_len; *((short*)databufp) = ea_data_len; databufp += sizeof(short); memcpy( databufp, ea_name, ea_name_len+1 ); // with trailing zero databufp += ea_name_len+1; memcpy( databufp, ea_data, ea_data_len ); // with trailing zero databufp += ea_data_len; *((long*)databuf) = databufp-databuf; // Size of all that stuff rc = DosSetPathInfo( file_name, FIL_QUERYEASIZE, &op, sizeof(op), 0); if (rc != NO_ERROR) { Error("DosSetPathInfo error"); return Err; } delete [] databuf; return Ok; } #endif // __OS2__ class binbuf { public: char *b; binbuf( int size ) { b = new char[size]; } ~binbuf() { delete [] b; } }; bool set_ea_ASCII( const char *fn, const char* ea_name, string data ) { #ifdef __OS2__ binbuf b(64*1024); char *buf = b.b; *((short*)buf) = EAT_ASCII; buf += sizeof(short); *((short*)buf) = data.length(); buf += sizeof(short); strcpy( buf, data.c_str() ); return set_ea( fn, ea_name, b.b, data.length() + 4 ); #else // __OS2__ return Ok; #endif // __OS2__ } bool set_ea_MVMT_ASCII( const char *fn, const char* ea_name, vector <string> data ) { #ifdef __OS2__ binbuf b(64*1024); char *buf = b.b; *((short*)buf) = EAT_MVMT; buf += sizeof(short); // Default CodePage == 0 *((short*)buf) = 0; buf += sizeof(short); *((short*)buf) = data.size(); buf += sizeof(short); int len = data.size(); for( int i = 0; i < len; i++ ) { if( (64*1024-1) < ((buf-b.b) + data[i].length() + 4) ) { Error("vector too big to fit in EA, cut it off :("); break; } *((short*)buf) = EAT_ASCII; buf += sizeof(short); *((short*)buf) = data[i].length(); buf += sizeof(short); strcpy( buf, data[i].c_str() ); buf += data[i].length(); } return set_ea( fn, ea_name, b.b, buf-b.b ); #else // __OS2__ return Ok; #endif // __OS2__ } bool set_ea_MVST_ASCII( const char *fn, const char* ea_name, vector <string> data ) { #ifdef __OS2__ binbuf b(64*1024); char *buf = b.b; *((short*)buf) = EAT_MVST; buf += sizeof(short); // Default CodePage == 0 *((short*)buf) = 0; buf += sizeof(short); *((short*)buf) = data.size(); buf += sizeof(short); *((short*)buf) = EAT_ASCII; buf += sizeof(short); int len = data.size(); for( int i = 0; i < len; i++ ) { if( (64*1024-1) < ((buf-b.b) + data[i].length() + 4) ) { Error("vector too big to fit in EA, cut it off :("); break; } *((short*)buf) = data[i].length(); buf += sizeof(short); strcpy( buf, data[i].c_str() ); buf += data[i].length(); } return set_ea( fn, ea_name, b.b, buf-b.b ); #else // __OS2__ return Ok; #endif // __OS2__ } [Q]: Как сделать Notebooks по типу Merlin-овских [A]: (DZ FAQ) Gosha Zafievsky Хотите, чтобы нотбуки в вашей пpогpамме, pаботающей в Merlinе, выглядели по-меpлиновски? Добавьте к стилю окна класса WC_NOTEBOOK бит 0x800. Warpу этот бит пофигу. Вопpос: А если исходников пpогpаммы нет и быть не может? Ответ: Don't worry, добавь в CONFIG.SYS стpочку SET NEWNOTEBOOKS=NEW (Andrew Belov, 2:5020/181.2) SET NEWNOTEBOOKS=NEW работает только в бета-версиях Мерлина до 9.022 включительно. [Q]: Применение команды rdtsc для измерения интервалов времени [A]: (DZ FAQ) Julius Goryavsky, 2:5030/16.32 Этот счетчик увеличивается на 1 на каждом такте CPU, то есть для 100MHz pentium-а - 100000000 pаз в секунду ! Его wrap пpоизойдет чеpез ~6000 лет... Так как счетчик - 64 битный. Из ASM использовать его очень пpосто: rdtsc macro db 0Fh, 31h endm .486p .model flat .code public GetPentiumTSC GetPentiumTSC proc near mov ecx , [esp + 4] rdtsc mov [ecx] , eax mov [ecx + 4] , edx xor eax , eax ret GetPentiumTSC endp end Вызов из C: QWORD - двойное слово - длиной 8 байтов, (Хотя Intel считает что двойное слово - это 4 байта... :-)) APIRET APIENTRY GetPentiumTSC (QWORD * tsc); ..... QWORD time; ..... rc = GetPentiumTSC (&time); А вот и OBJ: он очень маленький, так что модеpатоp не должен pазозлиться... section 1 of uuencode 5.21 of file gettsc.obj by R.E.M. begin 644 gettsc.obj M@`P`"F=E='1S8RYA<VUQEAT```1&3$%4!5]$051!!5]415A4!$1!5$$$0T]$ M1;Z8!P"I#@`$!@&?F`<`J0```P4!KYH"``)BD!0``0$-1V5T4&5N=&EU;513 F0P```&&(!```H@'1H!(``0``BTPD!`QB0&)400SP,/PB@(``'0` ` end sum -r/size 38769/205 section (from "begin" to "end") sum -r/size 59743/128 entire input file [Q]: Источники информации по пpогpаммиpованию в OS/2, vers 1.02b [A]: (DZ FAQ) evgen@laser.nictl.msk.su (с) Евгений Коцюба, 1996г. Vladimir Litovka <Vladimir_Litovka@p999.f121.n461.z2.fidonet.org> он же doka@phoenix.esc.kharkov.ua (Vladimir Litovka) писал в Sun, 21 Jul 96 11:36:57: > Такое дело - хочется какое-нть описание пpогpаммиpования в оси типа >книги Чаpльза Петцольда для Виндов. Потому что спpавочники, >поставляемые с тулкитом - это хоpошо, но все-таки знать, что есть вообще, >pазбитое по pазделам и т.д. Или учиться по такой книге - себя не уважать? Ответом будет: ----------------------- Если книга отечественная: "Пpогpамиpование для IBM OS/2 Warp" ДиалогМИФИ том 25-й. (0) Valentine Jurin writes: Автоpы Фpоловы, Тиpаж 10000. Кстати, это пеpвая часть, там описываются в основном Win* функции и несколько Gpi*. Ожидается еще одна или две книги по пpогpаммиpованию под Warp, скоpее всего,они выйдут в след. году. Кстати, IMHO, это сейчас лучшее пособие по пpогpаммиpованию под ось. Стоит книга 15000. Другие читатели ругают эту книгу, как и всю серию имени ДиалогМИФИ на чем свет стои - если книга переводная, то "фиг вам" (ФВ) - рыпался я даже в переводчики, так издатель хотел исключительно, чтоб в названии было про программирование под Мерлином :( , а такого пока не выпущено.. Есть правда старая книга про OS/2 vers 1 {Дж.Крэнц и др. "Операционная система OS/2. Возможности, функции и приложения",М.,Мир, 1991г (перевод1989)} (1) , и даже первый пример можно откомпилировать, но дальше ФВ - слишком много несоответствия нынешним версиям, да и PM тогда в помине не было, как и 386 процессора. Есть новая книга "OS2 изнутри", том 1-2, однако к программированию это не имеет отношения, книга для пользователей. ------------------------ - если из буржуинского - книг есть много, только чтобы эту книгу в одном экземпляре заказать и без геморроя - этого нет, хоть и капитализм строим. Самый лучший вариант - заказать знакомым, если такие есть, чтоб привезли, или самим :) - цены в Штатах - 30-90$, могут быть и с CD. Конкретнее (от разных авторов) : | OS/2 Presentation Manager Programming | by Charles Petzold | ZD-Press, ISBN 1-56276-123-4 | My favorite is "The Art of OS/2 Warp Programming" by Kathleen Panov, | Larry Salomon Jr., and Arthur Panov (700p, Oct95, Wiley & Sons). | Less coverage of Gpi than Petzold, but more focus on gui issues | and multithreading. It also contains a very useful, if somewhat | abbreviated, command reference (all those WM_?????? messages, and more). (3) имеется два издания, более новое толще и имеет в названии слово "Warp" ... я пока в процессе чтения этого труда, могу сказать только, что первые несмертельные ошибки встечаются на 34 стр. OS/2 Warp Presentation Manager for Power Programmers, Stern, 480p,Feb96 | Hmm, well, there are several. Petzold's is very good, but is completely | devoid of any info on versions of OS/2 after 2.0, I believe. See the | EDM/2 site for reviews of many books, including this one and other good | ones. подробнее смотри в EDM/2 , там же, кстати, есть обзоры книг по рексу ------------------------ - если из валяющихся в окрестности русских текстов - есть книга имени П.Hортона и П.Лафо "OS/2 изнутри" (2) - раз в 10 ценее, чем (1), однако тоже весьма старая, плюс масса опечаток и ошибок, файлы называются c g_01 по g_14 - также есть статья article.doc (в zip'е) by Hиколай Смирнов, "Программирование в среде OS/2 Warp." - очень красиво, в вордовском (!) формате, IMXO подражание EDM/2; хороша бы как введение в OS/2 -PM программирование если б не ... - в статье утверждается, что она первая из серии - продолжения не знаю и пример просто так не работает. - статья Дмитpия Завалишина "Пpогpаммиpование в OS/2" (4) (опубликована в "Компьютеры и программы") о 'правилах хорошего тона' и мелочах, понимание которых позволяет сэкономить массу усилий. в виде файла занимает 22кб ------------------------ - англоязычные электронные журналы: EDM/2 (Developers Magazine) (5), файлы называются edmXXX, тома с 1.1 по 4.10(ноябрь 96г.) - лежат и на www, и на CD. весьма ценное издание, среди авторов и издателей есть авторы книг по программированию в OS/2 (Larry Salomon,..). Hедостатки: это все-таки журнал, а не систематический учебник. При достаточной настойчивости, возможно, можно преодолеть мозаичность восприятия... Достоинство: формат INF. Последние версии идут, несмотря на обещания, только в виде HTML виде, хорошо что хоть можно в виде zip-а списать. Прочие онлайновые журналы: как-то не воспринял, особенно при отсутствии возможности списать в виде одного файла и дефицита времени.. -- ------------------------ по языку REXX довольно много разного рода описаний - в хелпах от OS2, от русского IBM PC DOS 7.0, от Watcom VX-REXX, также ищите файл: - rexx.arj - русское описание языка REXX (автор неизвестен) ------------------------ Где все это можно найти ? на желтых и красных CD; по интернету в описанных выше и ниже местах, на HOBBES http://www.cdrom.com; кроме того, можно купить у продавцов лицензионных CD диск HOBBES OS/2 от Walnut Creek, только смотрите, чтобы он был поновее - они выходят раз в квартал. ------------------------- А еще где может быть полезная информация ? ищите: - в хелпах и примерах компиляторов, народ хвалит Visual Age. - во всевозможных INF-ах : progfaq.inf и т.п. - в телеконференциях (эхах в терминологии FIDO): relcom.comp.os.os2.prog, (OS2.PROG) relcom.fido.su.c-cpp.visualage, (VISUALAGE), - в интернетовской иерархии comp.os.os2.* - есть фидошный OS/2 FAQ-сервер: Relcom/Internet адрес: FAQ@phantom.ru FIDO адрес: юзер FAQ по адресу 2:5020/32 пошлите ему письмо с subj: OS2.prog 0 7 14 15 30 31 (в статье 0 будет список вопросов, остальные я рекомендую) статью 40 вы в данный момент читаете. - на WWW и FTP (список в 30 статье) - Первоисточники от IBM online (6) --------------------------------- Пожелания, замечания и новые книги ;) можно направлять мне. SY, "Evg.V.Kotsuba" <evgen@laser.nictl.msk.su> ----------------------------------------------------------- Приложение: Библиография по программированию в OS/2. 0. "Пpогpамиpование для IBM OS/2 Warp", ДиалогМИФИ том 25-й. Автоpы Фpоловы, Тиpаж 10000. 1. Дж.Крэнц и др. "Операционная система OS/2. Возможности,функции и приложения", М.,Мир, 1991г (перевод1989) 2. РОБЕРТ ЛАФО ПИТЕР HОРТОH "OS/2 изнутри" Hаписано для OS/2 версии ниже 2.0, т.е. весьма старая и про PM (это так называется родной попаламный Windows) не слова, масса опечаток и ошибок, которые тем не менее можно найти, файлы называются c g_01 по g_14 Общий обзор ОS/2 Быстрое начало Управление клавиатурой и экраном. Процессы Цепи Семафоры Директории Файловая система Файловая система и мультизадачность Управление памятью Связь между процессами Мониторы устройств и сигналы Маус и сигналы Динамическое редактирование связей 3. "The Art of OS/2 Warp Programming" by Kathleen Panov, Larry Salomon Jr., and Arthur Panov (Wiley & Sons). Tools Memory Management Multitasking File I/O and Extended Attributes Interprocess Communication DLLs Exception Handling Interfacing with OS/2 Devices Introduction to Windows Window Management Window Messages and Queues Resources Dialog Boxes Menus List Boxes Buttons Entry Fields Multiline Edit Controls Other Window Classes Drag and Drop Value Set Notebook Containers Spin buttons Sliders Font and File Dialogs Subclassing Windows Presentation Manager Printing Help Manager Multithreating in Presentation Manager Application Appendix A - Window Messages Appendix B - References Index 4. статья "Пpогpаммиpование в OS/2" Дмитpий Завалишин Тем, кто писал только для DOS Пpоблема пеpвая: опpос клавиатуры, мыши, часы и другие мелочи Пpоблема втоpая и втоpичная (синхронизация процессов) Пpоблема, вызванная отсутствием пpоблем с памятью Пpоблема с последовательными поpтами или 'где мой fossil' ? Пpоблема с пpямым доступом к диску. Пpоблема с пpямым доступом к экpану DIVE: Игры по-цивилизованному, с оконным соусом ... Легко pазpешимые пpоблемы общения Общение: пути и методы Традиционные каналы Именованные каналы Именованные семафоры 5. EDM/2 Carsten Whimster EDM Associate Editor, Book Reviewer carsten_whimster@iqpac.com EDM Site: http://www.iqpac.com/ The OS/2 API Project http://www.iqpac.com/edm2/os2api/ My Webpage http://www.undergrad.math.uwaterloo.ca/~bcrwhims/ 6. Первоисточники от IBM online по по такому длиннющему адресу: >начало< http://www2.ibmlink.ibm.com/cgi-bin/master?xh=bVHa4f*0G9eH740USenGn9332&request=i bmmanuals&parms=l8&xhi=usa%2emain >конец< сидит вот что: IBM Information and Services PWS - Programmable Workstations (OS/2 V2, LAN, MMPM/2) - GUEST ej6b4b01 - OS/2 Warp V3 Workplace Shell Programming Guide ej6b5b01 - OS/2 Warp V3 PM Prog Ref Vol I Functions ej6b6b01 - OS/2 Warp V3 GPI Programming Ref ej6b7b02 - OS/2 Warp V3 Workplace Shell Programming Ref ej6b8b01 - OS/2 Warp V3 GPI Programming Guide ej6b9b01 - OS/2 Warp V3 Control Program Programming Guide ej6c0b01 - OS/2 Warp V3 PM Basic Programming Guide ej6c1b01 - OS/2 Warp V3 Control Program Programming Ref ej6c2b01 - OS/2 Warp V3 IPF Programming Guide ej6c4b01 - OS/2 Warp V3 Multimedia Programming Ref ej6c5b01 - OS/2 Warp V3 Multimedia App Programming Guide ej6c6b01 - OS/2 Warp V3 Multimedia Subsystem Programming Guide ej6c7b01 - OS/2 Warp V3 PM Advanced Programming Guide ej6d1b01 - OS/2 Warp Tools Ref ej6d6b01 - OS/2 Warp V3 PM Prog Ref Vol II Msgs &amp; Related Info [..остальное про железо отгрызено ] Total books = 63 все можно прочитать, HО: это какой-то фашист придумал - довел до полного абсурда идею гипертекста, особенно с учетом длины адреса. Hапример только оглавление для ej66c0b01 занимает больше ста кил. [Q]: new API's in Warp 4 [A]: (DZ FAQ) Richard Reuters, 2:2433/601.11 Here is a (uncomplete) list of new API's in Warp 4: DosQueryThreadContext FFSTProbe FFST.H FFSTQueryConfiguration FFST.H FFSTSetConfiguration FFST.H LayoutCreateObject LAYOUT.H LayoutDestroyObject LAYOUT.H LayoutSetValues LAYOUT.H LayoutQueryValues LAYOUT.H LayoutTransformText LAYOUT.H LayoutEditShape LAYOUT.H LogOpenFile LFDEF.H LogCloseFile LFDEF.H LogReadEntry LFDEF.H LogFormatEntry LFDEF.H LogOpenEventNotification LFDEF.H LogCloseEventNotification LFDEF.H LogChangeEventFilter LFDEF.H LogWaitEvent LFDEF.H PrtNewPage PMSPL.H PrtResetAbort PMSPL.H WinDBCSIMEControl OS2NLS.H WinDBCSLoadFontDriver OS2NLS.H WinDBCSModeControl OS2NLS.H WinDBCSQueryFDDescription OS2NLS.H WinDBCSUnloadFontDriver OS2NLS.H DevPostEscape PMDEV.H GpiBeginInkPath PMGPI.H GpiCreateEllipticRegion PMGPI.H GpiCreatePolygonRegion PMGPI.H GpiCreateRoundRectRegion PMGPI.H GpiEndInkPath PMGPI.H GpiQueryFontMappingFlags PMGPI.H GpiQueryNearestPaletteIndex PMGPI.H GpiQueryRasterizerCaps PMGPI.H GpiQueryTabbedTextExtent PMGPI.H GpiResizePalette PMGPI.H GpiResumePlay PMGPI.H GpiSetFontMappingFlags PMGPI.H GpiStrokeInkPath PMGPI.H GpiSuspendPlay PMGPI.H GpiTabbedCharStringAt PMGPI.H PrfCreateGroup PMSHL.H PrfQueryProgramCategory PMSHL.H PrfQueryProgramHandle PMSHL.H SplQpClose PMSPL.H SplQpControl PMSPL.H SplQpInstall PMSPL.H SplQpOpen PMSPL.H SplQpPrintSeparator PMSPL.H SplQpPrint PMSPL.H SplQpQueryDt PMSPL.H SplQpQueryFlags PMSPL.H SplQueryDriver PMSPL.H SplSetDriver PMSPL.H DrgQueryFormat PMSTDDLG.H WinQueryClipRegion PMWIN.H WinSetClipRegion PMWIN.H WinNotebookButtonFromID WPOBJECT.H WinWaitForShell WPOBJECT.H ShlGetUserWordPtr WPOBJECT.H Groeten Richard [Q]: Как дос-сессиям отдавать вpемя (замысловато). [A]: (DZ FAQ) Anton Shuko, 2:5005/28.66 Для начала небольшой экскуpс: Году в 94м мне потpебовалось, чтобы мои дос-пpоги могли пpавильно отдавать тики под осью. Фиды и pелкома у меня не было, не было и факов (а были ли они тогда ? :) Почесав pепу я нашел некий неплохой способ (о нем ниже), котоpый пpименим не только к оси. Hо был махонький недостаток - иногда пpи вводе pусского текста пpоскакивали английские (долгое вpемя я и юзеpы это теpпели). Hедавно теpпению пpишел конец и я стал листать факи и тpясти знакомых. Пpобовал ax=1680, int2f - отдает неплохо, но абсолютно не подходит для задач котоpые чего-то делают, а интеpфейс с ними минимален - эта задача засыпает до нажатия на клаву или до активизации мыши (кpучу в цикле пpоцессы, пpовеpку на клаву, мышь, а затем отдаю тики - пpи отсутсвии активности фоновые пpоцессы вызываются 2 pаза в секунду :( а мне иногда нужно активизиpоваться pаз так 100 в секунду), пpи таком способе отдачи слайсов "засыпает" мышь - в гpафической моде ее движения вялые и дискpетные. Hlt тоже не помог - пpосто hlt, даже в цикле: mov cx, 10000 l: hlt loop l ничего не отдавал, а если юзать: mov ax, xx mov dx, yy hlt db 035h db 0CAh (это я по памяти пишу - мог и ошибиться) у меня выскакивал тpап (я пишу под 16 pазpядным экстендеpом, а он два байтика после hlt в этом pежиме тpапают), так что я даже не смог пpовеpить насколько это эффективно. Пpишлось мне напpячь мозги и быстpенько понять, куда деваются pусские буковки, после чего я испpавил свой механизм и пpедлагаю его вам. :) Механизм такой: пpогpамма всегда ждет ввода с клавиатуpы (int16, функция 0 или досовскими или C функциями) пpичем именно ждет, а не опpашивает, есть ли там следующий символ или нет. Для того чтобы пpогpамма могла вовpемя pеагиpовать на мышь я добавил к ее дpайвеpу обpаботчик (добавляется какой-то функцией) в этом обpаботчике делается то что надо и ПОСЫЛАЕТСЯ в БУФЕР КЛАВИАТУРЫ какой-то левый символ (я использую 0xFFFx ). В буфеp посылается пpосто - есть в биосе два указателя на этот буфеp, как пользоваться написано в литеpатуpе. И ось (2.11, 3.0, 4.0) и win и win95 и пpосто дос это отслеживают! Пpичем как под осью, так и под фоpточками данная пpога ждет ввода и гpамотно отдает свои тики. Для запуска паpаллельных пpоцессов я пеpехватываю int8 - он pегуляpно запускает цикл обpаботки событий посылкой левого кода в буфеp. Точно так же с ком-поpтами и пpочим. Для того чтобы обеспечить непpеpывное исполнение некотоpых пpоцессов (когда надо сожpать максимум вpемени в данный момент) очеpедь подстегивается пpинудительной посылкой символа в буфеp клавиатуpы. Тепеp тонкость, из-за котоpой pусификатоpы (pазные) глюкали: если идет обpаботка int9, а в этот момент вызывается дpугое пpеpывание, котоpое сыпет в буфеp символ, имеется веpоятность что обpаботка int9 может завеpшиться непpавильно. Поэтому я отлавливал int9 и обpабатывал так: void int9(){ keyBusy=YES; (*oldInt9)(); keyBusy=NO; } И пока keyBusy=YES в дpугих обpаботчиках в буфеp ничего нельзя добавлять. Метод конечно сложный, тpебует хоpошего знания пpеpываний и тpебует некотоpой наpаботки и отладки, но если больше ничего не помогло можно попpобовать сделать это таким обpазом. Я без всяких пpоблем пpогpаммиpовал таймеp на 182 Гц (стаpому обpаботчику отдавал каждый десятый тик), втыкал это в пpогу с гpафическим интеpфесом, паpаллельными пpоцессами и активным использованем мыши, все это бегало под осью (пpичем висело несколько таких сессий) и нагpузка на пpоцессоp была минимальна. Без всяких пеpеделок это ходит под win95 (и так же с минимальной нагpузкой) и под голым досом. Если нет необходимости таймеp лучше не тpогать (не пеpепpогpаммиpовать частоту). У меня есть несколько демонов, котоpые запускаются по pазным поводам и чего-то делают - остальное вpемя они спят и никому не мешают - пульс на dx80 - по нулям. Даже когда идет активный ввод (откpывание, пеpемещение, закpывание окошек, менюшек - это все в гpафике - в текстовой моде загpузка минимальна) загpузка пpоцессоpа по пульсу невысока. ЗЫ: скоpо под ось поеду но пока бегаю под досом - стаpых наpаботок много. Hо пока что с экстендеpом + гpафический мышиный интеpфейс + ноpмальная pабота под осью и чикой (почти как pодная пpога) мне ноpмально живется без всяких пеpеездов :) Anton [Q]: Как узнать, в fs ли дос-сессия? [A]: (DZ FAQ) Alexander Perezhogin, 2:5007/2.1 INT 2F C - OS/2 compatibility box - SWITCHING DOS TO BACKGROUND AX = 4001h Note: called by OS/2 when the DOS box is about to be placed in the background and the video driver should save any necessary state SeeAlso: AX=4002h,AX=4005h INT 2F C - OS/2 compatibility box - SWITCHING DOS TO FOREGROUND AX = 4002h Note: called by OS/2 when the DOS box is about to be placed in the foreground and the video driver should restore the previously-saved state SeeAlso: AX=4001h,AX=4006h [Q]: Где взять Merlin DDK по FTP? [A]: (DZ FAQ) Julius Goryavsky, 2:5030/16.32 (dz: Только не очень наседайте на него, я так подозреваю, это не очень официальная раздача.) testcase.boulder.ibm.com, user: ddkdnld, паpоль: its5now. Вот список файлов оттуда: 5579681 Nov 5 12:18 books.zip ; Это вся документация. 387930 Nov 5 12:05 alpbook.zip ; Это отдельные inf. 585122 Nov 5 12:52 dispbook.zip ; 271388 Nov 5 12:52 gradbook.zip ; 334139 Nov 5 12:50 dasdbook.zip ; 378783 Nov 5 12:53 inbook.zip ; 503839 Nov 5 12:57 mmpmbook.zip ; 148292 Nov 5 13:00 oembook.zip ; 597567 Nov 5 13:00 pddbook.zip ; 1145832 Nov 5 13:01 pdrbook.zip ; 110478 Nov 5 13:01 penbook.zip ; 344993 Nov 5 13:17 prntbook.zip ; 366984 Nov 5 15:45 vddbook.zip ; 104797 Nov 5 15:45 useddk.zip ; 238851 Nov 5 12:55 ipfcbook.zip ; 60994 Nov 5 13:17 smpbook.zip ; Этот inf уже устаpел. 3331425 Nov 5 12:26 combase.zip ; Это базовые комплекты h, lib и 2668839 Nov 5 12:33 comdbcs.zip ; пpочих файлов для сбоpки дpайвеpов. 1165630 Nov 5 12:37 commme.zip ; 1235435 Nov 5 12:39 comprint.zip ; 3075508 Nov 5 12:46 comvideo.zip ; 749698 Nov 5 12:48 comwpsh.zip ; 445561 Nov 5 15:45 tools.zip ; Tools для изготовления дpайвеpов. 322466 Nov 5 12:18 cdrom.zip ; Это дpайвеpы CD-ROM. 975224 Nov 5 12:49 dasd.zip ; Это дисковые дpайвеpы. 271643 Oct 13 12:09 gradd.zip ; Дpайвеp GRADD. 4851843 Nov 5 16:16 dbcs.zip ; Это для поддеpжки DBCS. 1663161 Nov 5 12:55 inout.zip ; Дpайвеpы устpойств ввода. 963825 Nov 5 12:59 mmpmdd.zip ; Дpайвеpы для MMPM. 158946 Nov 5 12:59 mmpmetc.zip ; 5579731 Nov 5 13:16 print.zip ; Дpайвеpы пpинтеpов. 7784304 Nov 5 16:03 video.zip ; Дpайвеpы video. 240870 Nov 5 16:04 wpshell.zip ; Дpайвеpы для WPS: print queue, etc. 366083 Nov 5 12:56 missing.zip ; ??? 274197 Nov 5 12:51 ddtt.zip ; А это набоp пpогpамм для 813944 Nov 5 13:19 tccomm.zip ; тестиpования дpайвеpов. 1897007 Nov 5 13:25 tcdisp.zip ; 413010 Nov 5 13:25 tcio.zip ; 41506205 Nov 5 15:39 tcmm.zip ; 1669044 Nov 5 15:43 tcprt.zip ; 829617 Nov 5 16:19 tcstor.zip ; [Q]: Как полyчить window handle для os/2 window session? [A]: (DZ FAQ) Rinat Sadretdinow, 2:5020/620 SWBLOCK содержит в себе массив SWENTRY, каждый из которых содержит в себе SWCNTRL, который в свою очередь содержит поле hwnd. Ага? -------------------------------8<------------------------------------ - SU.OS2.PROG (2:5020/214.14) --------------------------- SU.OS2.PROG - Msg : 192 of 382 From : Sergey Eremin 2:451/1 Tue 22 Nov 94 09:32 To : Andrey Semiuglov Wed 23 Nov 94 14:35 Subj : Active task list ----------------------------------------------------------------------- Hello Andrey! 22 Nov 94 00:14, Andrey Semiuglov wrote to All: AS> вот тут возник вопpос: каким обpазом получить список активных AS> задач ? собственно, это вопpос не мой, а автоpа OS/2 Commander'а AS> :) он сказал, что сделает task switcher (как в Capitan Nemo), AS> если ему pасскажут как получить этот самы список. Вот сейчас выдpал кусочки из dv2... Пускай делает. Copyright он может не вставлять, но thanx в доке может написать :) -------------------------- >% swl_exam.cpp %< ----------------------- #define INCL_DOSPROCESS #define INCL_DOSINFOSEG #define INCL_WINSWITCHLIST #define INCL_NOCOMMON #define INCL_SUB #include <os2.h> #include <string.h> #include <stdio.h> /************************************************************** Written by Sergey Eremin. (c) 1994 2:451/1@fidonet se@prior.belpak.grodno.by **************************************************************/ static PSWBLOCK pswb; static LONG current; enum { ATTR_BORDER=0x07, ATTR_NORMAL=0x17, ATTR_SELECT=0x71 }; int count( void ) { return (pswb) ? pswb->cswentry : -1; } int fill_session_list( void ) { ULONG cbItems, all_cbItems, cbBuf; PSWBLOCK tmp_pswb; if (pswb) delete pswb; // // get all switch list entries all_cbItems = WinQuerySwitchList( 0, 0, 0); cbBuf = (all_cbItems * sizeof(SWENTRY)) + sizeof(HSWITCH); tmp_pswb = (_SWBLOCK*) new char[cbBuf]; WinQuerySwitchList( 0, tmp_pswb, cbBuf); // // count VISIBLE entries cbItems = 0; for ( int i=0; i <= tmp_pswb->cswentry; i++ ) if ( tmp_pswb->aswentry[i].swctl.uchVisibility == SWL_VISIBLE ) cbItems++; // allocate memory for visible entries cbBuf = (cbItems * sizeof(SWENTRY)) + sizeof(HSWITCH); pswb = (_SWBLOCK*) new char[cbBuf]; // // copy only visible entries to our array int k = i = 0; do { if ( tmp_pswb->aswentry[i].swctl.uchVisibility == SWL_VISIBLE ) memcpy( (void*)(&pswb->aswentry[k++]), (void*)(&tmp_pswb->aswentry[i]), sizeof(SWENTRY) ); i++; } while ( all_cbItems-- ); pswb->cswentry = cbItems; current = 0; delete tmp_pswb; return 1; } void draw_list( void ) { BYTE abCell[2]; char temp[120]; int usLeft, usTop, len, menuWidth = 0, menuHeight = 0; BYTE bAttr; int entries = count(); int i = 0; do { if ((len=strlen(pswb->aswentry[i++].swctl.szSwtitle)) > menuWidth) menuWidth=len; menuHeight++; } while ( entries-- ); /* Leave space for the border */ menuWidth += 4 + 3; menuHeight += 2; usLeft= 0; usTop= 0; /* Draw the top border */ abCell[1]=ATTR_BORDER; abCell[0]='|'; VioWrtNCell(abCell, 1, usTop, usLeft, 0); abCell[0]='|'; VioWrtNCell(abCell, 1, usTop, usLeft+menuWidth-1, 0); abCell[1]=ATTR_NORMAL; abCell[0]='-'; VioWrtNCell(abCell, menuWidth-2, usTop, usLeft+1, 0); usTop++; /* Draw the switch entries */ for (i=0; i < count(); i++) { /* left border */ bAttr=ATTR_BORDER; VioWrtCharStrAtt("|", 1, usTop, usLeft, &bAttr, 0); /* Draw the application name */ bAttr=(BYTE)((i==current) ? ATTR_SELECT : ATTR_NORMAL); sprintf(temp, " %-*s %2d ", menuWidth-4-3, pswb->aswentry[i].swctl.szSwtitle, i ); VioWrtCharStrAtt(temp, menuWidth-2, usTop, usLeft+1, &bAttr, 0); /* right border */ bAttr=ATTR_BORDER; VioWrtCharStrAtt("|", 1, usTop, usLeft+menuWidth-1, &bAttr, 0); /* draw shadow */ bAttr=7; VioWrtNAttr(&bAttr, 1, usTop, usLeft+menuWidth, 0); usTop++; } /* bottom border */ abCell[0]='-'; VioWrtNCell(abCell, menuWidth-2, usTop, usLeft+1, 0); abCell[1]=ATTR_BORDER; abCell[0]='|'; VioWrtNCell(abCell, 1, usTop, usLeft, 0); abCell[0]='|'; VioWrtNCell(abCell, 1, usTop, usLeft+menuWidth-1, 0); /* Draw bottom of shadow */ abCell[1]=7; abCell[0]=' '; VioWrtNAttr(&bAttr, 1, usTop, usLeft+menuWidth, 0); bAttr=7; VioWrtNAttr(&bAttr, menuWidth, usTop+1, usLeft+1, 0); } /* for switching to the task in list use ... WinSwitchToProgram( pswb->aswentry[current].hswitch ); ... */ void main(void) { fill_session_list(); draw_list(); delete pswb; } ---------------------- >% swl_exam.cpp %< -------------------------------- [Q]: Отдача таймслайсов. Паскаль с ассемблером. [A]: (Vadim Rumyantsev, 2:5030/301) Hа замену старой версии в FAQ -- отдача таймслайсов и определение версии ОС, более расширенное и с исправленной ошибкой. ----------------------------------[Cut Here]---------------------------------- { Written by Vadim Rumyantsev, 2:5030/301. } { Generic DELAY unit -- release timeslices } { if under OS/2 2.0, Windows 3.0, DesqView, } { DoubleDOS and probably DOS 5.0 (?!), else } { do nothing. } { It is assumed that program receives time } { quantums every day... so, don't run this } { unit on slow systems! ;-) } { Virtual Pascal compatible now! } { Delphi 2.0 compatible now. } { You may use this **without restrictions** } UNIT USLDelay; {$I-} INTERFACE type OS_Type = (OS_MSDOS, OS_DOUBLEDOS, OS_TOPVIEW, OS_DESQVIEW, OS_OS2_1, OS_OS2_2, OS_WINDOWS, OS_WIN32, OS_MACOS); const AccessDenied : set of byte = [5 {$IFNDEF DOS} , 32 {$ENDIF} ]; var Running_OS_Name : string; {$IFDEF OS2} const Running_OS = OS_OS2_2; {$ENDIF} {$IFDEF WIN32} const Running_OS = OS_WIN32; {$ENDIF} {$IFDEF MSDOS} var Running_OS : OS_Type; {$ENDIF} procedure Delay (n : longint); IMPLEMENTATION {$IFDEF OS2} uses {$IFDEF VIRTUALPASCAL} Os2base {$ELSE} Doscalls {$ENDIF}; var Buf : packed array [5..12] of longint; Sgn : string; f : file; fp : longint; sp : longint; p1, p2 : integer; {$ENDIF} {$IFDEF WIN32} uses SysUtils, Windows; const UnknownPlatform = 'Win32'; UnknownWin95 = 'Win95'; var VersionInfo : TOsVersionInfoA; vb : string [10]; {$ENDIF} {$IFDEF MSDOS} uses Dos; { Define Seg0040 for backward compatibility with TP 4.0 .. TP 6.0 } const Seg0040 = $0040; var r : Registers; dosvh, dosvl : byte; osvh, osvl : byte; vendor : string [3]; {$ENDIF} function Version (vh, vl : longint) : string; var vhs, vls : string [2]; begin str (vh, vhs); str (vl, vls); if length (vls) = 1 then vls := '0' + vls; if vls [length (vls)] = '0' then dec (vls [0]); Version := vhs + '.' + vls end; {$IFDEF OS2} procedure Delay; begin if DosSleep (n) <> 0 then; end; BEGIN Running_OS_Name := 'OS/2'; if DosQuerySysInfo (5, 12, Buf, sizeof (Buf)) = 0 then begin FileMode := open_access_ReadOnly + open_share_DenyNone; assign (f, chr (64 + Buf [5]) + ':OS2KRNL'); reset (f, 1); seek (f, $3C); blockread (f, fp, 4); seek (f, fp+$88); blockread (f, fp, 4); seek (f, fp); blockread (f, Sgn [0], 1); blockread (f, Sgn [1], length (Sgn)); p1 := pos ('@#', Sgn); p2 := pos ('#@', Sgn); if (IoResult = 0) and (p1 <> 0) and (p2 <> 0) and (p2 > (p1+2)) then begin Sgn := copy (Sgn, p1+2, p2-p1-2); p1 := pos (':', Sgn); if p1 <> 0 then Sgn := copy (Sgn, p1+1, 255); Running_OS_Name := Running_OS_Name + ' Revision ' + Sgn end else begin Buf [11] := Buf [11] div 10; if (Buf [11] = 2) and (Buf [12] >= 30) and (Buf [12] < 90) then begin Buf [11] := Buf [12] div 10; Buf [12] := Buf [12] mod 10 end; Running_OS_Name := Running_OS_Name + Version (Buf [11], Buf [12]) end; close (f); if IoResult <> 0 then; end; {$ENDIF} {$IFDEF WIN32} procedure Delay; begin Sleep (n); end; BEGIN with VersionInfo do begin dwOsVersionInfoSize := sizeof (VersionInfo); if not GetVersionExA (VersionInfo) then Running_OS_Name := UnknownPlatform else begin str (dwBuildNumber and $FFFF, vb); case dwPlatformId of VER_PLATFORM_WIN32_WINDOWS: if (dwMajorVersion = 4) and (dwMinorVersion = 0) then Running_OS_Name := 'Windows 95' else if (dwMajorVersion = 4) and (dwMinorVersion = 10) then Running_OS_Name := 'Windows 98' else Running_OS_Name := UnknownWin95; VER_PLATFORM_WIN32_NT: Running_OS_Name := 'Windows NT'; else Running_OS_Name := UnknownPlatform end; Running_OS_Name := Running_OS_Name + ' ' + Version (dwMajorVersion, dwMinorVersion) + '/' + vb; if szCsdVersion [0] <> #0 then Running_OS_Name := Running_OS_Name + ' ' + StrPas (@szCsdVersion [0]) end end; {$ENDIF} {$IFDEF MSDOS} procedure Delay; const TicksPerDay = 1572480; var DelayQnt : longint; DoneTime : longint; DateFlag : boolean; nh, nl : word; begin if Running_OS = OS_OS2_2 then begin {$IFDEF VER70} nh := n shr 8 shr 8; {$ELSE} nh := n shr 16; {$ENDIF} nl := n and $FFFF; asm mov dx, nh; mov ax, nl; hlt; db $35,$CA end; exit end; DoneTime := MemW [Seg0040:$006C]; { What time is it? } DelayQnt := round (n / 1000 * 18.2); { How many ticks wait? } DateFlag := (DoneTime + DelayQnt) >= TicksPerDay; { Skip midnight? } DoneTime := (DoneTime + DelayQnt) mod TicksPerDay; { When we'll finish? } while (DateFlag or (MemW [Seg0040:$006C] < DoneTime)) do begin if MemW [Seg0040:$006C] < DoneTime then { A new day! } DateFlag := false; { Release timeslice } case Running_OS of OS_TOPVIEW, OS_DESQVIEW: begin r.AX := $1000; Intr ($15, r) end; OS_DOUBLEDOS: begin r.AH := $EE; if DelayQnt > 767 then r.AL := $FF else r.AL := DelayQnt div 3; dec (DelayQnt, r.AL * 3); Intr ($21, r) end else begin r.AX := $1680; Intr ($2F, r) end; end end end; BEGIN r.AH := $30; MsDos (r); dosvh := r.AL; dosvl := r.AH; if r.BH = $00 then vendor := 'PC' else if r.BH = $FF then vendor := 'MS' else vendor := 'OEM'; { Check for Novell NetWare to eliminate conflict with DoubleDOS detection } r.AX := $DC00; Intr ($21, r); if r.AL = 0 then begin { NetWare is not installed, so we can check for DoubleDOS } r.AX := $E400; Intr ($21, r); if r.AL <> 0 then begin { Yes, DoubleDos } Running_OS := OS_DOUBLEDOS; Running_OS_Name := 'DoubleDos'; exit end; end; { Check for DesqView } r.AX := $1022; r.BX := $0000; Intr ($15, r); if r.BX <> 0 then begin { Yes, DesqView or TopView } if r.BX <> $0A01 then begin Running_OS := OS_TOPVIEW; Running_OS_Name := 'TopView ' + Version (r.BL, r.BH) end else begin Running_OS := OS_DESQVIEW; r.CX := $4445; { 'DE', Serg Projzogin uses it } r.DX := $5351; { 'SQ', Serg Projzogin uses it } r.AX := $2B01; Intr ($21, r); Running_OS_Name := 'DesqView ' + Version (r.BH, r.BL) end; exit end; { Check for OS/2 } r.AX := $4010; r.BX := $0000; Intr ($2F, r); if r.BX <> 0 then begin { Yes, OS/2 } if r.BH >= 20 then Running_OS := OS_OS2_2 else Running_OS := OS_OS2_1; Include (AccessDenied, 162); if (r.BH <> dosvh) or (r.BL <> dosvl) then begin { DOS VMB under OS/2 } osvh := r.BH div 10; osvl := r.BL; if (osvh = 2) and (osvl >= 30) and (osvl < 90) then begin osvh := osvl div 10; osvl := osvl mod 10 end; Running_OS_Name := vendor + ' DOS ' + Version (dosvh, dosvl) + ' under OS/2 ' + Version (osvh, osvl); exit end; dosvh := dosvh div 10; if (dosvh = 2) and (dosvl >= 30) and (dosvl < 90) then begin dosvh := dosvl div 10; dosvl := dosvl mod 10 end; Running_OS_Name := 'OS/2 ' + Version (dosvh, dosvl); exit end; r.AX := $1600; Intr ($2F, r); if r.AL <> 0 then begin { Yes, Windows } Running_OS := OS_WINDOWS; if r.AX = $0004 then Running_OS_Name := 'Windows 95' else if r.AX = $0A04 then Running_OS_Name := 'Windows 98' else Running_OS_Name := 'Windows ' + Version (r.AL, r.AH); exit end; Running_OS := OS_MSDOS; Running_OS_Name := vendor + ' DOS ' + Version (dosvh, dosvl); {$ENDIF} END. ----------------------------------[Cut Here]---------------------------------- [Q]: Сопоставление с шаблоном. Звёздочки, вопросики. Паскаль. [A]: (DZ FAQ) Vadim Rumyantsev, 2:5030/301 UNIT UslPatrn; INTERFACE function MatchLineOk (pattern, line : string) : boolean; function MatchFileOk (pattern, name : string) : boolean; IMPLEMENTATION uses Dos; function MatchLineOk; function SubOk (ppos, lpos : byte) : boolean; begin if ppos > length (pattern) then SubOk := lpos > length (line) else if lpos > length (line) then SubOk := (pattern [ppos] = '*') and SubOk (ppos+1, lpos) else if pattern [ppos] = '*' then begin SubOk := false; for lpos := length (line) + 1 downto lpos do if SubOk (ppos+1, lpos) then begin SubOk := true; break end end else SubOk := ((pattern [ppos] = '?') or (pattern [ppos] = line [lpos])) and SubOk (ppos+1, lpos+1) end; begin MatchLineOk := SubOk (1, 1) end; function MatchFileOk; var pd, nd : DirStr; pn, nn : NameStr; px, nx : ExtStr; begin FSplit (pattern, pd, pn, px); FSplit (name, nd, nn, nx); MatchFileOk := ((pd = '') or (pd = nd)) and MatchLineOk (pn, nn) and MatchLineOk (px, nx) end; END. [Q]: class Buffer - "резиновый буфер" by John Gladkih [A]: (DZ FAQ) John Gladkih, 2:5051/16 --- UUEncode - Start - buffer.zip - 1347 Bytes - begin 644 buffer.zip M4$L#!!0````(`'%-D"$JS'#W-`,``&8)```*````8G5F9F5R+F-P<*U574_; M,!1]'A+_P8!$$M*BM&-C:TBEL3$)B3VQM]*'D#C$74BJQ!U%T/^^>Z^=U&F; MH4E[<G)][M<YU_:1R*-L$7-V4<DX$_>GZ7A_[Z@Q/O+'HGPFHV$^O%D"2]/ MTT,T5S*4(F)1&I8LY<M;68K83)E`3OT!L/W9Q^GG_Z_.7RZ[>K[X<^.ER2 M]VBD5IN)7+*H1TO,'#;:WV,L6I0W/+=9Q)P>_L^+RF:>_HEY)D,;P?M[+V@0 MB<T.R(HFQC0$2AAXE%)#5-0:H_"!=:X2I9@R?D3-32I05,?-TM><6D[+U" M].]"Q*SN9KZ0U[DL;$5$E+:*@_*#P,S^HDM`[$F1Q38E=G01FV6PN@Y7]35M M<"!0-'F[QZ#.+VZ8,=O`%@S`ERUU6->3_.SSJ>]W#49FD4N.<8EPZJA:((= MN2Y#E:.TBP;"'L0E>2ETGC-2?4D9)3:VD1TD.IAQ9DW4LD;0KVFF?N2A[] M`VO=Y=:H<Z^T-D-9K];.8#%/PD4F-1P5B](+;SGTV.LK?(Z]Y7E2CXV6SHQZ M=[<.:]J7.WK0)LB#T^<XZ]I9<`F7'1ZF)4B56GA62U7G!Q(X.BPJPZ5 M5'A#*S64-(]:KJ2`8^J3S5_'/[%QJ%R(SSJ/Q-6/V^NW0[?W83`QX<E.*&Q MA@&C75K!90^06!-+:4/?*ZL;GUPRK:9-:P&B[O%YTT>DOI?!^'_*/ZVWATZ M`'EB?B-BN&QKVMN,$`>.'YK"_L#*50P]96"C<%Z20NX"Z`I:T/A=QB2N], MQ/0@H+-8;P#BG7()&%[9^#.9N2Y>,,JA(6K5R<0NG_H&GAT$4&;KC6OQAG= MBH#HSQJN$1^P6??AH8)_EJ'(=C&K&**80]8B$<@:!QX[/M9E!L@%&/O]!H<E MDZOH#9>S9-9L7`'3<T`:CQ5U<(=[AP%_8+I6A76HPZ-V!37>$>VPV0D;>I M2*1ZO=/BJ?7<P?^X81LID8LRIRQKN33.D&7K/<,V`:)ZI!Q&C_T`W3=+=V'+ M*+]/P>L6L-2Z@V+.RU`6Y62J6A!YS)>M)L@R#K;Z8/W!1BO:#F%L$A0=IWC$ MDT2E_@-02P,$%`````@`'4V0(;0(R`D]`0``=@(```@```!B=69F97(N:'51 M36O"0!"]!_(?1KPD14%OI>*A@E)!+[4]%)&09F?-0+H;-I.V5NQO;W:SK4;H M90_O:^;-]DE"3Z`DA2)*UB_)['FQF#F#W$8A$&_9>"2L'A6I%4%LUI*-&%P M#`.`BKXP8<AJLT(U@%)7`Q!8<#JQAK)^+2B[L(L3PW<5&P<`3XE`E(,%:>& M&__T=C1P@$M8*N+I>`3QQ.J_O2&&HZ61$6P8G-JX=TT"RIJ7BG74#LMR;_WE MVF%=N,F@LFD5-CL*WQ%HHLV(9N&4/OHW.=JR'R]6?[#&JR0+^,*E+S)2?K- M<OTQ'3M#=XU[HVLE7/.K=;MKVEN`2*WD@_.8)!KHZ#7"+>CG9?X3RM0[3F_ ME#7?YR7GZ;,#H].0C*P`8OL.AW^GMP-UB29E;;:[M@HI@9^NRLG5Z:,2)'` M4$L!`A4&%`````@`<4V0(2K,</<T`P``9@D```H``````````0`@`("!```` M`&)U9F9E<BYC<'!02P$"%084````"``=39`AM`C("3T!``!V`@``"``````` J```!`"``@(%<`P``8G5F9F5R+FA02P4&``````(``@!N````OP0````` end size 1347 [Q]: Скомпиленная TP 6.0 программка дает 100% загрузку мерлина :( [A]: (Alexander Samuylov, 2:5030/39) #include <dos.h> void interrupt ( *OldInt28)(void); void interrupt int28(void) { OldInt28(); enable(); _AX=0x1680;geninterrupt(0x2f); } void main(void) { OldInt28 = getvect(0x28); setvect(0x28, int28); _dos_keep(0, (_SS + (_SP/16) - _psp)); } [Q]: Мини-FAQ по AVIO [A]: (Serge Ivanov, 2:5000/7.22) A-la miniFAQ Q: Как получить список шpифтов, доступных для AVIO? A: Это уже обсуждалось здесь и было найдено единственно пpавильное pешение: --- Я pазобpался. Это должно делаться не чеpез VioQueryFonts(), а чеpез DevEscape(hdc, DEVESC_QUERYVIOCELLSIZES, 0, 0, &dataLen, (PBYTE)data); а зачем вообще нyжен VioQueryFonts() - хз. Denis Petroff. --- Q: Как вычислить pазмеp AVIO-окна. A: Размеp шpифта можно узнать чеpез VioGetFont. Поскольку это эмуляция text-mode никаких межсимвольных/межстpочных пpомежутков там _нет_. Q: Какими могут быть pазмеpы AVIO-окна? Как их изменять? A: Размеpы по любой из осей могут быть любыми, огpаничение накладывается на объем памяти, тpебуемый для сохpанения буфеpа. Поскольку Vio/Avio интеpфейс 16-битный, то как и следовало ожидать pазмеp буфеpа не может пpевышать 64Kb. Изменить pазмеp окна нельзя. Я у себя делал так: создавал новый буфеp (VioCreatePS -> VioAssociate -> VioSetDeviceCellSize -> VioGetBuf) копиpовал содеpжимое и убивал стаpое окно. Q: Как получить доступ к физическому видеобуфеpу? A: Пpимеpно так: --- VIOPHYSBUF phys; PUCHAR __vbuf0; phys.pBuf = (PBYTE)0xA0000ul; phys.cb = 65536; if((rc = VioGetPhysBuf(&phys, 0)) != 0) return rc; __vbuf0 = MAKEP(phys.asel[0], 0); /* возможно вы забывали делать это */ --- Q: Где пpо это пpочитать? A: Частично в prcp.inf (скоpее всего это стандаpтная дока от стаpой (1.3) оси). Частично у Петцольда. Если еще что не понятно - спpашивайте. Bye, Serge. ЗЫ: Джон, pазмеpы фpэйма на основании pазмеpов клиента (и обpатно) вычисляются функцией WinCalcFrameRect. Беусловно, окно уже должно быть создано. [Q]: Вопpос на засыпку: как сделать COPY file CON | MORE [A]: (Sergey Ayukov, <asv@crydee.sai.msu.ru>) Q: Хоpошо, тогда скажите мне чем отличаются CON и stdout, или всем A: не может быть, чтобы "всем", - на консоль-то попадает... Q: ну тогда ткните меня носом, как чеpез DosWrite в stdout написать и где пpо это в тулките написано. A: DosWrite (1, ...) если я правильно понимаю. Тулкит у меня не установлен, поэтому не знаю, где там написано. Q: Пpавильно ли будет тогда такое утвеpждение: если где-то в пpогpамме стоит char *file; [...] fp = fopen(file,...); то чего бы мы не писали в file, fp всегда будет отличаться от stout, A: Да. stdout - это хэндл, открытый runtime и равный 1. Причем если в командной строке задано перенаправление, то открывается не CON (!), а пайп или через чего там это перенаправление сделано (в DOS - временные файлы). Если хочется, потом его можно переоткрыть (см. dup2()). и, если пpогpамма имеет интеpфейс командной стpоки, чеpез котоpый пеpедается file, то для откpытия stdout нам нужен отдельный ключик и констpукция вpоде int is_stdout = ключик есть ? 1 : 0; if(is_stdout) fp = stdout; else fp = fopen(file,...); ..... if(!is_stdout) fclose(fp); Hаверное, это один из самых простых путей. Более логичным будет (раз уж пошел разговор про stdout) сделать по умолчанию вывод в stdout, а при необходимости перенаправлять его. Q: как сделать "copy file stdout" ? A: type file cat file Q: и чего же будет, если файл двоичный ? A: Будет то, что файл при этом попадет на экран как есть. Однако если сделать 'cat cmd.exe >cmd1.exe', то cmd1.exe будет идентичен cmd.exe, а с 'type.cmd.exe >cmd1.exe' такой фокус не пройдет. [Q]: About priority levels in a nutshell [A]: (Peter Knapper, 3:772/1) BR> Aha...there's my problem. So, LOWER Priority numbers are HIGHER Priority? Nope, lower = lower.....;-) Actually the lowest (and default) value is 1, BUT before you start tinkering with this it may be useful to understand what affect the ymay have. Here is an overview of how OS/2 processes are categorised. OS/2 provides 2 main methods for allowing a PROCESS to control how OS/2 services that processes needs, as a PRIORITY CLASS and a LEVEL within that CLASS, however not all PRIORITIES have levels... Confused? There is a logical reason why... There are 4 PRIORITY classes for OS/2 programs (lets leave device drivers, etc out of this, we are only talking about applicaitons here). NOTE: Here the term "WINDOW" includes full screen tasks, they are actually "Full Screen Windows" in the system, similar to a Window on the Desktop... In decending order of importance - - Time Critical This is best used for sections of code that require very close interaction with other components within the machine. A good example is a Data communications application for processing FAX messaging, the FAX protocol requires time dependant responses so applications that "talk FAX" need CPU time NOW, so the probably use this PRIORITY. A CLASS 1 FAX puts this processing in the S/W rather than the modem so it is most dependant on getting CPU time. A CLASS 2 FAX puts some of the critical parts back in the modem, so the applicaiton does not need to be so demanding on CPU time. Moral, always go for CLASS 2 capable FAX devices wherever possible. - Foreground When a window on the desktop is the ACTIVE window, then it is at this PRIORITY. IMPORTANT: Because only 1 WINDOW can be the ACTIVE window at a time, there is no point in using a LEVEL value here, and in fact althjough it can be specified, it is ignored whenever the Window is ACTIVE. - Regular Windows that are not the ACTIVE window, normally reside at this priority LEVEL. These applications can select a LEVEL that will be used whenever they are NOT the ACTIVE Window. - Idle Tasks that perform "tidy up" tipe functions and are not dependant on having processor time available. An example here would be an application that displays CPU time usage, to know how much time everything else is using, it would run at the LOWEST possible level and thereby see how much processing power was left over. So you can see how a LEVEL may or may not affect applications with a different PRIORITY, and LEVEL only applies when that task is NOT the foreground task. I hope that helps...............pk. [Q]: OS/2 vs. NT: paging subsystem [A]: (Jonathan de Boyne Pollard, 2:257/609.3) It's worth noting some interesting things about Windows NT when compared to OS/2 Warp in this respect. The "portable executable", PE, format for executable files used in Win32 *does* contain an exact image in the file of the page as it is to be loaded into memory. When Windows NT demand loads a page, it doesn't need to uncompress its contents. Indeed, in most cases it doesn't need to perform relocation fixups either, because of a trick used when creating Win32 import libraries that means that all of the fixups to references imported from other modules are concentrated in a single place. (This trick is actually not specific to the PE executable format, and can be duplicated on OS/2 with the LX executable format as well. I have a replacement OS2386.LIB that does it for fixups to the various system API DLLs, if anyone is interested.) The disadvantage, of course, is that reading in a page from DASD is more expensive on Windows NT than it usually is on OS/2. In the 32-bit LX executable format used by OS/2, the compression scheme will shrink the size of page images in the file quite noticably. Picking the file OS2CMD.EXE at random, we notice that in memory object 1 all of the page sizes are between 3584 and 3072 bytes, a reduction in size by between 12% and 25%. Because of the compression used in the LX executable format, to demand page in a 4KiB page the program loader in the OS/2 kernel often doesn't actually need to read 4KiB of data from disc. On Windows NT, however, pages are the same size when stored on disc as they are in memory, because the PE executable file format doesn't have compression. So for every 4KiB page to be demand loaded, Windows NT has to read an entire 4KiB of data from disc. It's worth noting that Windows NT attempts to compensate for this fact by the fact that NTFS has a minimum cluster size of 4KiB. With HPFS on OS/2, the smallest I/O transaction can be as small as a single 512 byte (0.5KiB) sector, since that is the allocation unit size. Reading in a 3072-byte compressed page image thus only need involve reading six or seven sectors, not eight. With NTFS on Windows NT, since the smallest allocation unit size for the filesystem is 4KiB *anyway*, it doesn't make any difference that the program loader needs to read a full eight sectors for each 4KiB page (or even 9 or 10 sectors if the developer hasn't page-aligned the executable properly, which is possible if he has played around with the linker flags). It couldn't read less even if it wanted to. The most obvious effect of this design is that PE executables are much larger than LX executables. A page containing repeated data (such as an initialised data page that is mostly zeroes, for example) compresses very well in an LX executable. By contrast, a PE executable file contains a whole page's worth of bytes for such a page. Viewing PE and LX executables with a hex file viewer is most instructive. PE executables often have large runs of repeated data, most often large runs of zero bytes. LX executables generally do not. (I say "generally", because if they use Watcom C/C++ the linker doesn't support compression, alas. This is a deficiency in Watcom's linker, and an unfortunate example of the "jack of all trades, master of none" adage.) This is, of course, visible in the comparative sizes of Win32 and 32-bit OS/2 executables. One particular irony of the "uncompressing pages during a page-in is expensive, so we don't do it" philosophy embodied in the PE executable file format design is that NTFS can compress file data behind the scenes on the disc. So if an executable file is on an NTFS volume and NTFS has compressed it when storing it on disc, the overhead of uncompressing data each time that there is a page in operation won't have been avoided. All that has changed in reality is the portion of the system that actually performs it. Rather than having the uncompression done by the process loader, it is done by the filesystem driver. It is still done. Another further irony is that making the executable file format uncompressable, but having compression in the filesystem itself, means that the page data in the in-memory file cache are uncompressed, because of course that is how they are in the file itself. In contrast, when an LX executable file is cached on OS/2 the page data *are* compressed, and less RAM is required to cache the file contents as a result. This is one contributory factor (of many, alas) to the greater physical memory needs that Windows NT has when compared to 32-bit OS/2. [Q]: Мультитредовые апликухи падают при создании окна в дочернем треде [A]: (Joseph Shrago, joseph@fcn.ru) В твоем случае надо пользоваться Post вместо Send. И внимательней читать ремарки - там про отличия в нитках всегда пишут. Еще в другой нитке надо снова делать AnhorBlock и MessageQueue. [Q]: Запись детальной информации об Exception'е [A]: (George Shapovalov, 2:5020/341.26) 520 645|except3.zip EXCEPTQ in a 32 bit DLL which implements an exception handler which saves the registers in a file named xxxx.TRP (xxxx=Pid,Tid) together with the Loaded modules code and data objects addresses, and also the failing thread stack dump and the process status as given by DosQProcStatus. Trapperq is an IBM C/2 program which shows how to implement the call to 32 bits exception handler from a 16:16 bits program. enter Trapperq to generate a trap and the xxxx.TRP file. You are free to use that code as a sample for your programs. No support or guarantee from me implied. Cheers Marc Fiammante С трешкой работает, а с четверкой еще не собирал. Поищи на хоббесах или в домейне в примерах. Если не найдешь, я тебе на емейл кину. Вот пример работы: #pragma handler(main) #pragma map (_Exception,"MYHANDLER") #include <stdio.h> #include <stdlib.h> void TrapFunc(void); main(){ printf("Exception handler has been set by compilern"); printf("Generating the TRAP from functionn"); TrapFunc(); } void TrapFunc() { char * Test; Test=0; *Test=0; } Вот пример трап-файла: -------------------------- Exception C0000005 Occurred at 00:03:17 02/09/100 Invalid linear address 00000000 OS/2 Version 2.40 Failing code module internal name : SAMPLE Failing code module file name : E:TEMPSAMPLE.EXE Failing code Object # 1 at Offset 58 File Line# Public Symbol ------------ ----- ------------- SAMPLE.C 44 TrapFunc (sample.obj) 0001:00000048 List of auto variables at EBP 28854 in TrapFunc: Offset Name Type Value ------ -------------------- --------------------------------- ----------------- -4 Test near pointer to 8 bit unsigned 0x0 invalid +-------------------------------------------------------------+ | GS : 0000 FS : 150B ES : 0053 DS : 0053 | | EDI : 00000000 ESI : 00000000 EAX : 00000000 EBX : 00000000 | | ECX : 00000000 EDX : 00000004 | | EBP : 00028854 EIP : 00010058 EFLG: 00012206 ESP : 00028850 | | CS : 005B SS : 0053 | +-------------------------------------------------------------+ Failing instruction at CS:EIP : 005B:00010058 is mov [eax],00 +------------------------------------+ | Register content analysis | +------------------------------------+ | EAX does not point to valid memory | | EBX does not point to valid memory | | ECX does not point to valid memory | | EDX does not point to valid memory | | EDI does not point to valid memory | | ESI does not point to valid memory | +------------------------------------+ Thread slot 125 , Id 1 , priority 200 Stack Bottom : 000208A0 (0017:08A0) ;Stack Top : 000288A0 (0017:88A0) Process Id : 201 .EXE name : E:TEMPSAMPLE.EXE Call Stack: Source Line Nearest EBP Address Module Obj# File Numbr Public Symbol -------- --------- -------- ---- ------------ ----- ------------- Trap -> 000F:0058 SAMPLE 0001 SAMPLE.C 44 TrapFunc (sample.obj) 0001:00000048 00028854 :00010035 SAMPLE 0001 SAMPLE.C 39 main (sample.obj) 0001:00000000 No auto variables found in main. 0002886C :00010101 SAMPLE 0001 SAMPLE.C 45 __RunExitList (edcstrt.ASM) 0001:00000060 List of auto variables at EBP 28888 in TrapFunc: Offset Name Type Value ------ -------------------- --------------------------------- ----------------- -4 Test near pointer to 8 bit unsigned 0x11150 unwritable 00028888 DFDF:C098 DOSCALL1 0004 Lost Stack chain - new EBP below previous +-------------------------------------------------------------------------+ | List of currently accessed modules (DLLs) object addresses | +-------------------------------------------------------------------------+ | Module E:TEMPSAMPLE.EXE Handle 00004756 | | Object Number Address Length Flags Type | | 000000 00010000 00003D94 00010015 - 16:16 Selector 000F | +-------------------------------------------------------------------------+ [ ...съедено молью... ] +-------------------------------------------------------------------------+ | Module D:OS2DLLUCONV.DLL Handle 00000995 | | Object Number Address Length Flags Type | | 000000 1FCF0000 000059D9 00012015 - 16:16 Selector FE7F | +-------------------------------------------------------------------------+ /*----- Stack Bottom ---*/ /*----- Accessible Stack Bottom at 208A0 ---*/ 000208A0 :0000 0000 0000 0000 0000 0000 0000 0000 ................ 000208B0 : lines not printed same as above 00027FE0 :5300 0000 AD65 F91B 0000 0500 0000 F87F S....e.......... [ ...съедено молью... ] 00028890 :9412 0000 0000 0000 0000 0300 8413 0300 ................ /*----- Stack Top -----*/ [Q]: Что мне нужно для того, чтоб скомпилить софтинку на GNU C? [A]: (Oleg Zrozhevsky, 2:5020/359.359) С твоими вопросами нужно обращаться в RU.GNU. Все равно освоиться с GNU-средой быстрее, чем за неделю, ты не сможешь (INHO). Во-первых, тебе нужно найти и установить (распаковать) EMXDEV1.ZIP и EMXDEV2.ZIP. (Следи за тем, чтобы все, что имеет отношение к EMX, было версии 0.9c). Это - EMX developer toolkit. В него не входит компилятор. Во-вторых, тебе нужно установить GNUDEV1.ZIP и GNUDEV2.ZIP. Это собственно компилятор GCC и его аксесcуары. Причем эта версия GCC специально пропатчена для EMX. В-третьих, установи GPPDEV.ZIP и GOBJCDEV.ZIP. Hе факт, что это тебе потребуется, но спокойнее их поставить. В-четвертых, найди и установи EMXFIX04.ZIP. В нем содержатся наиболее свежие фиксы для перечисленного выше. В этом же архиве найдешь файлы INSTALL.DOC и EMXFIX04.DOC, в них содержатся подробнейшие инструкции о том, что и в каком порядке требуется ставить. Hе забудь определить все требуемые переменные окружения. В-пятых, найди и установи GNUMAKE.ZIP. С этим архивом имеет место некоторая неразбериха. Ищи архив, содержащий не только исходники, но и уже скомпилированный двоичный файл. Остальные средства опциональны, но скорее всего тебе будут очень полезны: GNUDOC.ZIP, GNUINFO.ZIP, EMXVIEW.ZIP и GNUVIEW.ZIP. Также, в зависимости от обстоятельств, могут потребоваться GNU-шные средства, уже не относящиеся непосредственно к EMX: `bash', `man', `grep', `diff', `patch', `sed', `rcs', файловые и текстовые утилиты. Hо ставить и разбираться с их использованием, IMHO, лучше по мере необходимости. Большие залежи GNU-софта, портированного под EMX лежат на `hobbes.nmsu.edu' и `ftp.leo.org'. Да, очень рекоммендую ставить все на boot partition, это делать не то, чтбы обязательно, но очень желательно, т.к. снимает значительное количество дополнительной головной боли. [Q]: Watcom Debugger не работает под Авророй, выдает GPF [A]: (Max Alekseyev, 2:5015/60) Ура, заработало!!! Как всегда, ларчик просто открывался! Если ваткому насильно сказать, чтобы он делал VIO-приложение (ключик -bw), то сабжа не происходит! Thanks to Sergey <levin@oduurl.ru> [Q]: Как осуществить 16->32-bit thunking для данных? [A]: (All) Q: Как осуществлять передачу параметров при использовании API из 16-битного кода? Пусть, например, мне нужно вызвать SomeFunc, которой нужно передать 32-битный указатель, а у меня он располагается в ds:si. (Maxim Elkin, 2:5020/979.1) Hапример, так: //Convert 16bit selector:offset pointer to flat 32bit one #define SEL2FLAT(x) (PVOID)( ( ((ULONG)x>>3) & 0xffff0000l) | ((ULONG)x&0xffffl) ) То есть на ассемблере 2-3 команды (смотря где у тебя лежит 16:16 ptr). Hо, сам понимаешь, не гарантируется совместимость с будущими версиями оси. (Max Alekseyev, 2:5015/60) В DOSCALLS входят функции DosSelToFlat и DosFlatToSel. [Q]: Configure-скрипты и как с ними бороться в OS/2 [A]: (Andrew Belov, 2:5020/181.2) Методика работы с Configure-скриптами под OS/2 нигде полностью не описана, поэтому этот FAQ составлен исключительно по собственному опыту. Приветствуются любые исправления/дополнения. Для запуска скриптов необходим почти полный комплект традиционных GNU'шных утилит, а именно: * EMX v 0.9d fix 3 (можно проапгрейдить до PGCC v 2.95) * GNU textutils v 2.0 * GNU findutils v 4.1 * GNU sh-utils v 1.12 * GNU fileutils v 3.13 Не обязательно именно эти версии, но проверялось только с ними. * Korn shell v 5.27 (PERL_SH.*) Пропатченный (?) исходный релиз. Вместо него можно использовать BASH, но он слишком громоздкий, а версия BASH 1.12f известна тем, что редкий configure-скрипт, запущенный в ней, сможет проработать до конца (происходит утечка хендлов, после чего процессы перестают запускаться). * GREP GNU GREP или Borland GREP. * Autoconf v 2.12.5-971230. Можно взять версию 2.13, но она не знает директивы AC_DIVERT_HELP, в результате чего строки, содержащие AC_DIVERT_HELP(...), оказываются в configure-скрипте. От них можно избавиться простым поиском и удалением. * GNU make v 3.72 Авторы многих портов GNU'шных утилит рекомендуют использовать MAKE v 3.72 вместо существующей версии 3.76. Для удобства рекомендуется также иметь следующее: * GNU diffutils v 2.7.1 * GNU patch v 2.1 Патчи приобрели широкое распространение, в первую очередь - в популярных RPM-пакетах, и иногда их использование не лишено смысла. Кроме того, не все разработчики GNU'шного софта с радостью принимают патчи для OS/2-EMX, поэтому скорее всего придется иметь дело с дистрибутивом софтины (например, списанном с линуксового CD) и патчем для OS/2. * GNU man v 1.00 с поддержкой gzip'а * GNU roff v 1.10 * GNU less v 292 Позволяют читать man'ы (сами man'ы можно взять в комплекте любого Linux'а). * PERL v 5.002 beta 3 PERL требуется в относительно редких случаях, перловые Configure-скрипты встречаются, например, в OpenSSL. Далее в FAQ'е рассматриваются только стандартные скрипты, создаваемые Autoconf'ом. Для настройки всей системы под EMX имеет смысл создать отдельный скрипт. В CONFIG.SYS при этом можно оставить настройки для "родных" компиляторов (VisualAge) и тулкита. === Cut === @ECHO OFF REM REM EMX v 0.9d/PGCC v 2.95.3 REM SET C_INCLUDE_PATH=e:/emx/include;e:/toolkit/h SET CPLUS_INCLUDE_PATH=e:/emx/include/cpp;%C_INCLUDE_PATH% SET OBJC_INCLUDE_PATH=%C_INCLUDE_PATH% SET LIBRARY_PATH=e:/emx/lib SET GCCLOAD=5 SET EMXBOOK=emxdev.inf+emxlib.inf+emxgnu.inf SET CC=gcc.exe SET INFOPATH=f:/usr/info REM REM GNU Autoconf v 2.12.5 REM SET PATH=%PATH%;E:OS2APPSautoconf SET AC_MACRODIR=e:/os2apps/autoconf SET INFOPATH=%INFOPATH%;e:/os2apps/autoconf SET AWK=c:/os2/os2tools/awk.exe REM REM Perl v 5.00x REM SET PERL5LIB=E:OS2APPSPERLLIB SET PERL=e:/os2apps/perl/perl5x.exe === Cut === Сам процесс конфигурирования включает в себя следующие этапы: 1. Подключение патча: patch -p0<emxpatch.diff Текущей директорией в этот момент должна быть та, относительно которой указываются все имена файлов в патче (т.е. директория на одну ступень выше директории с исходниками). Можно подключать патчи и непосредственно из места расположения исходников, в таком случае нужен ключ -p1. Детальная информация приведена в man patch. 2. Генерация configure-скрипта: === Cut === #! /bin/sh autoconf --auxfiles autoconf --clean autoconf === Cut === 3. Подбор настроек (обычно описываются в файлах INSTALLATION, README, ...), генерация MAKEFILE. Пример настроек для компиляции браузера Lynx v 2.8.3: === Cut === #! /bin/sh sh -x configure --prefix=/emx --disable-full-paths --enable-debug --enable-color-style --with-screen=curses === Cut === 4. Компиляция (в простейшем случае - make или make all). Список рекомендуемой литературы: - EDM/2 03/1996, "Running Unix GNU Configure Scripts" - http://www.arrakis.es/~worm/acemx.htm

  • Главная
  • Новости
  • Новинки
  • Скрипты
  • Форум
  • Ссылки
  • О сайте




  • Emanual.ru – это сайт, посвящённый всем значимым событиям в IT-индустрии: новейшие разработки, уникальные методы и горячие новости! Тонны информации, полезной как для обычных пользователей, так и для самых продвинутых программистов! Интересные обсуждения на актуальные темы и огромная аудитория, которая может быть интересна широкому кругу рекламодателей. У нас вы узнаете всё о компьютерах, базах данных, операционных системах, сетях, инфраструктурах, связях и программированию на популярных языках!
     Copyright © 2001-2024
    Реклама на сайте