![]() |
|
|
|
|
|
#1 | ||
|
Guru
Join Date: 11th September 2009
Location: Москва
Posts: 2,976
Thanks: 60
Thanked 1,785 Times in 1,099 Posts
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Quote:
Code:
ghKeyboardHook = SetWindowsHookEx( WH_KEYBOARD_LL, KeyboardHook, ghInstance, 0); Чтобы программа, установившая глобальный хук, могла тем не менее на нажатую клавишу отреагировать - статическая функция глобального хука должна симитировать отправку соответствующих сообщений в окно программы. У меня всё гораздо сложнее - один хук обслуживает все запущенные экземпляры программы, которые обмениваются ссылками на текущее окно-получатель через разделяемую память процессов Windows. В итоге мой вариант глобального хука выглядит так: Code:
LRESULT CALLBACK ConfigClass::KeyboardHook( int nCode, WPARAM wp, LPARAM lp )
{
KBDLLHOOKSTRUCT *pkh = (KBDLLHOOKSTRUCT *) lp;
dword wParam = pkh->vkCode;
dword lParam = 1;
dword lParamHi = pkh->scanCode;
signed char cFlags = pkh->flags;
if( cFlags & 1 )
{
lParamHi |= BIT_8;
}
if( cFlags < 0 )
{
lParamHi |= BIT_14;
lParamHi |= BIT_15;
}
if( nCode==HC_ACTION )
{
if( wParam == VK_NUMLOCK )
{
if( pSharedData2->gbNumLockDisabled )
{
if( cFlags < 0 )
{
pSharedData2->bVK_NUMLOCK_pressed = false;
lParamHi <<= 16;
lParam |= lParamHi;
if( pSharedData2->ghWndFocus ) { PostMessage( pSharedData2->ghWndFocus, WM_KEYUP, wParam, lParam ); }
}
else
{
if( pSharedData2->bVK_NUMLOCK_pressed ) { lParamHi |= BIT_14; }
pSharedData2->bVK_NUMLOCK_pressed = true;
lParamHi <<= 16;
lParam |= lParamHi;
if( pSharedData2->ghWndFocus ) { PostMessage( pSharedData2->ghWndFocus, WM_KEYDOWN, wParam, lParam ); }
}
if( pSharedData2->ghWndFocus ) { return 1; }
}
else
{
if( cFlags < 0 ){ pSharedData2->bVK_NUMLOCK_pressed = false; }
else
{
if( !pSharedData2->bVK_NUMLOCK_pressed )
{
pSharedData2->bVK_NUMLOCK_pressed = true;
pSharedData2->bNumLockState = !pSharedData2->bNumLockState;
pSharedData2->bNewNumLock = pSharedData2->bNumLockState;
}
}
}
}
else
if( wParam == VK_CAPITAL )
---------- Post added at 13:15 ---------- Previous post was at 13:07 ---------- Quote:
Вот исходник новой версии драйвера: Code:
.Title HD ; ; HD.MAC - HD device driver. ; ; Revision history: ; 19-Mar-2003 : Created ; 02-Feb-2011 : HDCSR changed from 177660 to 177720 .Macro ...... .EndM .Enabl LC ; Default SYSGEN options. TIM$IT = 0 MMG$T = 0 ERL$G = 0 HDCSR = 177720 ; Command and state reg addr for HD device. HDSIZ = 1600. ; Default HD device size in 512 byte blocks. ; ; HD command codes (for HD command reg: 177720 ) ; SetUni = 1 ; Set HD unit number SetBlk = 2 ; Set HD block number SetBuf = 3 ; Set memory buffer address SetWCn = 4 ; Set operation word count CmdRea = 5 ; Execute READ on HD CmdWri = 6 ; Execute WRITE on HD GetSiz = 7 ; Get HD size in blocks. ; ; Fixed locations. ; .ASECT . = 60 HD.GEN: ;;;;;;; .MCall .DrDef .DrDef HD, 362, FILST$!SPFUN$!VARSZ$, HDSIZ, HDCSR, 0 .DrPtr .DrSpF <373> .SbTtl Installation check ; ; Initial check (prints HD message). ; .ASect . = 116 HDMES: .ASCIZ <CR><LF>/HD (177720) disk driver v1.0c 2012/<CR><LF> . = 200 Nop Tst @#64 BNE 1$ Mov PC, R0 Add #HDMES-., R0 Br 2$ 3$: MovB (R0)+, @#TPB TstB @#TPS BPl .-4. 2$: TstB (R0) BNe 3$ 1$: ClC Return ............. ; ; SET HD subroutines. ; .DrSet ERLG, 1, O.GEN, NUM .DrSet MMGT, 2, O.GEN, NUM .DrSet TIMIT, 4, O.GEN, NUM .Dsabl LSB .Enabl LSB ; ; Use 'SET HD ERLG=1' or 'SET HD ERLG=0' to change ERL$G bit on the fly. ; Use 'SET HD MMGT=1' or 'SET HD MMGT=0' to change MMG$T bit on the fly. ; Use 'SET HD TIMIT=1' or 'SET HD TIMIT=0' to change TIM$IT bit on the fly. ; O.GEN: Tst R0 ; Arg = 0 ? BEq 30$ BiS R3, HD.GEN ; Set SYSGEN bit. Br 31$ 30$: BiC R3, HD.GEN ; Clear SYSGEN bit. 31$: ClC Return .IIF GT .-1000 .ERROR ; ; I/O request entry point. ; .DrBeg HD Mov HDCQE, R4 ; R4 -> Queue element Mov (R4)+, R2 ; R2 = Block number MovB (R4)+, R1 ; R1 = SpFun code BNe SPFUN ; Is it SpFun call? MovB (R4)+, R1 ; R1 = Unit number BiC #^c7, R1 ; Force it to be 1..7 Mov R1, @#HD$CSR+2 ; Mov #SetUni,@#HD$CSR ; Select unit for operations. Tst @#HD$CSR ; Valid unit number? BMi HDERR ; No - Error! Mov R2, @#HD$CSR+2 ; Mov #SetBlk,@#HD$CSR ; Set block number. Tst @#HD$CSR ; Valid? BPl 3$ ; Yes - OK Mov HDCQE, R4 ; BiS #EOF$, @-(R4) ; Else - return EOF Br DONE ; 3$: Mov (R4)+, @#HD$CSR+2 ; Mov #SetBuf, @#HD$CSR ; Set buf addr Mov (R4), R1 ; R1 = word count BEq DONE ; R1 = 0 - Nothing to do BPl HDREAD ; > 0 - Read ; < 0 - Write Neg R1 ; Get true word count Mov R1, @#HD$CSR+2 ; ... Mov #SetWCn,@#HD$CSR ; and set it. Tst @#HD$CSR ; Valid? BPl 4$ ; Yes - OK Mov HDCQE, R4 ; BiS #EOF$, @-(R4) ; Else - set EOF bit 4$: Mov #CmdWri,@#HD$CSR ; Make Write to HD Br CHECK ; OK? HDREAD: Mov R1, @#HD$CSR+2 ; Mov #SetWCn,@#HD$CSR ; Set word count Tst @#HD$CSR ; Valid? BPl 5$ ; Yes - OK Mov HDCQE, R4 ; BiS #EOF$, @-(R4) ; Else - set EOF bit 5$: Mov #CmdRea,@#HD$CSR ; Make Read from HD CHECK: Tst @#HD$CSR ; Error? BPl DONE ; No - OK ; Else - abort HDINT: HDERR: Mov HDCQE, R4 ; BiS #HDERR$, @-(R4) ; Set ERROR bit in CSW. DONE: .DRFIN HD ; ; .SpFun 373 - Get HD unit size. ; SPFUN: CmpB R1, #373 ; GET SIZE? BNe HDERR MovB (R4)+, R1 ; Q$UNIT BiC #^c7, R1 ; Mov R1, @#HD$CSR+2 Mov #SetUni, @#HD$CSR ; Select unit for operations. Mov #GetSiz, @#HD$CSR ; Get unit size Mov @#HD$CSR+2, R1 BEq HDERR Mov R1, @(R4)+ ; Report unit size Br DONE .IIF GT .-HDSTRT-1000 .ERROR .Dsabl LSB .Enabl LSB ; ; Primary bootstrap. ; .DrBot HD, START, READ . = HDBOOT + 40 START: Jmp BOOT ; ; Boottime media read. R0 = Block; R1 = Word Count; R2 = Buf Addr ; . = HDBOOT + 210 READ: Mov #HD$CSR+2, R4 ; R4 -> HD data reg Mov R4, R5 ; R5 -> HD data reg Mov @#B$DEVU, (R4) ; Unit Num Mov #SetUni, -(R4) ; R4 -> HD command reg Mov R0, (R5) ; R0 - Block number Mov #SetBlk, (R4) ; Set it Mov R1, (R5) ; R1 - Word count Mov #SetWCn, (R4) ; Set it Mov R2, (R5) ; R2 - Buf addr Mov #SetBuf, (R4) ; Set it Mov #CmdRea, (R4) ; READ from HD device RtS PC ; ; ; Primary boot ; . = HDBOOT + 500 HDMESC: .ASCIZ <CR><LF>"HD Boot-I-Cold boot.."<CR><LF> .Even BOOT: ; Cold boot Mov #10000, SP ; Boottime SP value Mov R0, -(SP) ; Get cold boot unit num ...... Mov PC, R0 Add #HDMESC-., R0 Br 2$ 3$: MovB (R0)+, @#TPB 1$: TstB @#TPS BPl 1$ 2$: TstB (R0) BNe 3$ ...... Mov #2, R0 ; Block number of BSTRAP Mov #2000, R1 ; Word count of BSTRAP Mov #1000, R2 ; Loading addr for BSTRAP Mov (SP), @#B$DEVU ; Unit number Call READ ; READ Secondary Bootstrap ; Set data in Secondary Bootstrap Mov #^RHD , @#B$DEVN ; Device name in RADIX50 Mov (SP)+, @#B$DEVU ; Boot device unit number Mov #READ-HDBOOT,@#B$READ ; Hook for BSTRAP Jmp @#B$BOOT ; Jmp to Secondary Bootstrap .DrEnd HD .End Last edited by Patron; 3rd December 2012 at 13:05. |
||
|
|
|
|
|
#2 |
|
Guru
Join Date: 27th May 2009
Location: СССР, Новосибирск
Posts: 2,821
Thanks: 71
Thanked 1,035 Times in 850 Posts
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
__________________
PDP-11/73, PDP-11/83, PDP-11/84, AlphaServer DS10, Электроника МС0511 (УК-НЦ), DECserver 90M Q-Bus: H9278-A, KDJ11-AA, DLV11-J, DZQ11, DHV11, DELQA-M, LPV11, LPV11-SA, RQDX3, RQDX-E, CQD-420/TM Unibus: H9277-A, KTJ11-B, DL11-W, DUP11, CDU-720/M, D142, MX22 PMI: KDJ11-BF, MSV11-JD, MSV11-JE VT220, CM7209 |
|
|
|
|
|
#3 |
|
Guru
Join Date: 11th September 2009
Location: Москва
Posts: 2,976
Thanks: 60
Thanked 1,785 Times in 1,099 Posts
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Так написано же:
Code:
; ; Use 'SET HD ERLG=1' or 'SET HD ERLG=0' to change ERL$G bit on the fly. ; Use 'SET HD MMGT=1' or 'SET HD MMGT=0' to change MMG$T bit on the fly. ; Use 'SET HD TIMIT=1' or 'SET HD TIMIT=0' to change TIM$IT bit on the fly. ; |
|
|
|
|
|
#4 | |
|
Guru
Join Date: 27th May 2009
Location: СССР, Новосибирск
Posts: 2,821
Thanks: 71
Thanked 1,035 Times in 850 Posts
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Quote:
![]() А также правильный мапинг в MMU системах. Ну про ERL$G вообще молчу - кому драйвер будет слать пакет? Но это собственно второстепенно. Зачем вообще писать то, что по умолчанию и так делается (кстати как это автор недоглядел, что есть еще четвертый значимый параметр SYSGEN - RTE$M), тем самым мешая стандартому процессу генерации (через который можно сказать: хочу драйвер HD).
__________________
PDP-11/73, PDP-11/83, PDP-11/84, AlphaServer DS10, Электроника МС0511 (УК-НЦ), DECserver 90M Q-Bus: H9278-A, KDJ11-AA, DLV11-J, DZQ11, DHV11, DELQA-M, LPV11, LPV11-SA, RQDX3, RQDX-E, CQD-420/TM Unibus: H9277-A, KTJ11-B, DL11-W, DUP11, CDU-720/M, D142, MX22 PMI: KDJ11-BF, MSV11-JD, MSV11-JE VT220, CM7209 Last edited by form; 26th February 2012 at 15:37. |
|
|
|
|
| The Following User Says Thank You to form For This Useful Post: | hobot (26th February 2012) |
|
|
#5 | ||
|
Guru
Join Date: 11th September 2009
Location: Москва
Posts: 2,976
Thanks: 60
Thanked 1,785 Times in 1,099 Posts
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Quote:
Quote:
В любом случае - никто не мешает привести исходник в идеальный вид, сделав всё как положено. |
||
|
|
|
| The Following User Says Thank You to Patron For This Useful Post: | hobot (26th February 2012) |
|
|
#6 | |
|
Guru
Join Date: 27th May 2009
Location: СССР, Новосибирск
Posts: 2,821
Thanks: 71
Thanked 1,035 Times in 850 Posts
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Quote:
Что касается приведения к нормальному виду, то это всегда полезно. А относительно всяких SETов для подгонки под систему - тут во-первых если подгонять, то подгонять все параметры сразу, при этом учитывая, что если эти параметры как-то используются, то нужна разборка с точками входа (коих далеко не два варианта на каждый бит получается). Если такая разборка включается в драйвер который выполняет реальный ввод-вывод, размер кода разборок может просто сравняться (если не превысить) код самого драйвера. Поэтому никто обычно не делает этого для драйверов ввода-вывода, а если делает, то драйвер обычно сам не поддерживает этих фич и соответственно нет смысла включать их по отдельности. Ну и перестройка простого драйвера в MMUшный и наоборот выглядит сомнительно с точки зрения целесообразности
__________________
PDP-11/73, PDP-11/83, PDP-11/84, AlphaServer DS10, Электроника МС0511 (УК-НЦ), DECserver 90M Q-Bus: H9278-A, KDJ11-AA, DLV11-J, DZQ11, DHV11, DELQA-M, LPV11, LPV11-SA, RQDX3, RQDX-E, CQD-420/TM Unibus: H9277-A, KTJ11-B, DL11-W, DUP11, CDU-720/M, D142, MX22 PMI: KDJ11-BF, MSV11-JD, MSV11-JE VT220, CM7209 |
|
|
|
|
|
|
#7 |
|
Guru
Join Date: 11th September 2009
Location: Москва
Posts: 2,976
Thanks: 60
Thanked 1,785 Times in 1,099 Posts
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Драйвер HD (как мы знаем) вообще ничего не поддерживает (даже ввод-вывод по прерываниям). Установка же параметров по-отдельности сделана для того, чтобы пользователю не надо было думать. Ведь выполнить команду SET HD SYSGEN (без параметра, содержащего желаемое слово генерации) можно было бы только загрузившись в целевой системе, а "эмулятор ДВК" пока что поддерживает лишь загрузку с HD. Получается порочный круг: чтобы настроить параметры генерации - нужно загрузиться с HD, а чтобы загрузиться с HD - нужно настроить параметры генерации.
|
|
|
|
| The Following User Says Thank You to Patron For This Useful Post: | hobot (26th February 2012) |
![]() |
| Currently Active Users Viewing This Thread: 1 (0 members and 1 guests) | |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Расскажем о себе | kiry | Люди | 311 | 23rd July 2014 20:44 |
| ASAM Compiler By Rob F. / Entire Group ... | Robus | Программирование | 125 | 30th September 2013 14:39 |
| [FWD] Знать, что делать, а не как делать Автор: Сергей Леонов | Wladimir Bulchukey (500:95/462) | Зарубежные компьютеры | 1 | 29th June 2006 18:29 |
| Re: 16-цветный режим для ZX | Ivan Kuvshinov (2:5020/830.10110) | Unsorted | 80 | 1st November 2005 04:15 |
| Куплю в Смоленске ВСЁ что связано со старыми компьютерами | Andrnow | Барахолка (архив) | 0 | 26th June 2005 00:14 |