Speccy - наш выбор!  
ZXPRESS
ZXTUNES
Virtual TR-DOS
World of Spectrum
ZX Spectrum Old Demos •

Go Back   Speccy - наш выбор! > Отечественные компьютеры > ДВК, УКНЦ

Reply
 
Thread Tools Display Modes
Old 26th February 2012, 15:15   #1
Guru
 
Join Date: 11th September 2009
Location: Москва
Posts: 2,976
Thanks: 60
Thanked 1,785 Times in 1,099 Posts
Patron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant future
Default

Quote:
Originally Posted by form View Post
Опиши pls механизм как управляешься с NumLock чтобы он не переключался при нажатии на него.
Общая идея проста - если статический глобальный хук клавиатуры, установленный либо в exe, либо в dll вот так:

Code:
ghKeyboardHook = SetWindowsHookEx( WH_KEYBOARD_LL, KeyboardHook, ghInstance, 0);
возвращает (int)1, то Windows никак не реагирует на нажатую клавишу.

Чтобы программа, установившая глобальный хук, могла тем не менее на нажатую клавишу отреагировать - статическая функция глобального хука должна симитировать отправку соответствующих сообщений в окно программы.

У меня всё гораздо сложнее - один хук обслуживает все запущенные экземпляры программы, которые обмениваются ссылками на текущее окно-получатель через разделяемую память процессов 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:
Originally Posted by hobot View Post
Можно подробнее этот момент? И новая версия в плане "дружбы" с версиями монитора SJ - изменилось что нибудь ???
В дайвере не изменилось вообще ничего, кроме кода, выводящего строчку "HD (177720) disk driver v1.0c 2012" при загрузке.

Вот исходник новой версии драйвера:

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.
Patron is online now   Reply With Quote
The Following 3 Users Say Thank You to Patron For This Useful Post:
anasana (26th February 2012), form (26th February 2012), hobot (26th February 2012)
Old 26th February 2012, 15:18   #2
Guru
 
form's Avatar
 
Join Date: 27th May 2009
Location: СССР, Новосибирск
Posts: 2,821
Thanks: 71
Thanked 1,035 Times in 850 Posts
form has much to be proud ofform has much to be proud ofform has much to be proud ofform has much to be proud ofform has much to be proud ofform has much to be proud ofform has much to be proud ofform has much to be proud of
Default

Quote:
Originally Posted by Patron View Post
TIM$IT = 0
MMG$T = 0
ERL$G = 0
За такое надо руки отрывать
__________________
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
form is offline   Reply With Quote
Old 26th February 2012, 15:23   #3
Guru
 
Join Date: 11th September 2009
Location: Москва
Posts: 2,976
Thanks: 60
Thanked 1,785 Times in 1,099 Posts
Patron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant future
Default

Quote:
Originally Posted by form View Post
За такое надо руки отрывать
Так написано же:
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.
;
:)
Patron is online now   Reply With Quote
Old 26th February 2012, 15:32   #4
Guru
 
form's Avatar
 
Join Date: 27th May 2009
Location: СССР, Новосибирск
Posts: 2,821
Thanks: 71
Thanked 1,035 Times in 850 Posts
form has much to be proud ofform has much to be proud ofform has much to be proud ofform has much to be proud ofform has much to be proud ofform has much to be proud ofform has much to be proud ofform has much to be proud of
Default

Quote:
Originally Posted by Patron View Post
Так написано же:
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.
;
А структуры данных и точки вызова он тоже меняет на лету?
А также правильный мапинг в 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.
form is offline   Reply With Quote
The Following User Says Thank You to form For This Useful Post:
hobot (26th February 2012)
Old 26th February 2012, 15:51   #5
Guru
 
Join Date: 11th September 2009
Location: Москва
Posts: 2,976
Thanks: 60
Thanked 1,785 Times in 1,099 Posts
Patron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant future
Default

Quote:
Originally Posted by form View Post
А структуры данных и точки вызова он тоже меняет на лету? А также правильный мапинг в MMU системах. Ну про ERL$G вообще молчу - кому драйвер будет слать пакет?
Понятно, что использовать драйвер HD можно только на компьютере, поддерживающем устройство HD, т.е. на моём "эмуляторе ДВК". Если нужно создать системный диск с монитором, имеющим другие параметры генерации, нежели установленные у имеющегося драйвера HD.SYS, то если процедуры осуществляются в системе, загруженной с HD - нужно сначала скопировать драйвер системного устройства под другим именем (я использую имя HH), потом выполнить команды SET HH ..., настроив параметры генерации, затем скопировать НН.SYS на целевой диск, выполнить команду COPY/BOOT:HH HDx:RT11SJ HDx: и под конец - переименовать скопированный драйвер в HD.SYS.

Quote:
Originally Posted by form View Post
Но это собственно второстепенно. Зачем вообще писать то, что по умолчанию и так делается (кстати как это автор недоглядел, что есть еще четвертый значимый параметр SYSGEN - RTE$M), тем самым мешая стандартому SYSGEN (через который можно сказать: хочу драйвер HD).
Мои познания в области "драйверостроения" для RT-11 околонулевые - это обычная копипаста какого-то старого драйвера для RT-11 в котором я изменил только "содержательную часть". Скорее всего в те давние времена никто ещё не слышал про параметр RTE$M.

В любом случае - никто не мешает привести исходник в идеальный вид, сделав всё как положено.
Patron is online now   Reply With Quote
The Following User Says Thank You to Patron For This Useful Post:
hobot (26th February 2012)
Old 26th February 2012, 16:05   #6
Guru
 
form's Avatar
 
Join Date: 27th May 2009
Location: СССР, Новосибирск
Posts: 2,821
Thanks: 71
Thanked 1,035 Times in 850 Posts
form has much to be proud ofform has much to be proud ofform has much to be proud ofform has much to be proud ofform has much to be proud ofform has much to be proud ofform has much to be proud ofform has much to be proud of
Default

Quote:
Originally Posted by Patron View Post
Мои познания в области "драйверостроения" для RT-11 околонулевые - это обычная копипаста какого-то старого драйвера для RT-11 в которм я изменил только "содержательную часть". Скорее всего в те давние времена никто ещё не слышал про параметр RTE$M.

В любом случае - никто не мешает привести исходник в идеальный вид, сделав всё как положено.
Параметр RTE$M появился в RT-11 V5.0. Точнее появился он раньше, но раньше это не было отражено в исходниках системы и SYSMAC (была по сути просто отдельная совместимая система).

Что касается приведения к нормальному виду, то это всегда полезно.

А относительно всяких 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
form is offline   Reply With Quote
Old 26th February 2012, 16:20   #7
Guru
 
Join Date: 11th September 2009
Location: Москва
Posts: 2,976
Thanks: 60
Thanked 1,785 Times in 1,099 Posts
Patron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant futurePatron has a brilliant future
Default

Quote:
Originally Posted by form View Post
драйвер обычно сам не поддерживает этих фич и соответственно нет смысла включать их по отдельности.
Драйвер HD (как мы знаем) вообще ничего не поддерживает (даже ввод-вывод по прерываниям). Установка же параметров по-отдельности сделана для того, чтобы пользователю не надо было думать. Ведь выполнить команду SET HD SYSGEN (без параметра, содержащего желаемое слово генерации) можно было бы только загрузившись в целевой системе, а "эмулятор ДВК" пока что поддерживает лишь загрузку с HD. Получается порочный круг: чтобы настроить параметры генерации - нужно загрузиться с HD, а чтобы загрузиться с HD - нужно настроить параметры генерации.
Patron is online now   Reply With Quote
The Following User Says Thank You to Patron For This Useful Post:
hobot (26th February 2012)
Reply


Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
 

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

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


All times are GMT +4. The time now is 02:41.


Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Map Яндекс.Метрика