Назад в раздел
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 & 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
|
|
|
|