Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
195 heavyiron 1
;
2
; Kolibri Bus Disconnect
3
;   Test for bus disconnect
4
;
5
;   Compile with FASM for Menuet
6
;
7
;
8
 
9
include 'macros.inc'
10
include 'lang.inc'
11
 
12
memsize = 1000h
13
               org 0
14
PARAMS  = memsize - 1024
15
 
16
appname equ 'Kolibri Bus Disconnect'
17
version equ ' 1.1 '
18
 
19
               use32              ; включить 32-битный режим ассемблера
20
 
21
               db     'MENUET01'              ; 8 byte id
22
               dd     0x01                    ; header version
23
               dd     START                   ; start of code
24
               dd     I_END                   ; size of image
25
               dd     memsize                 ; memory for app
26
               dd     memsize - 1024          ; esp
27
               dd     PARAMS , 0x0            ; I_Param , I_Icon
28
 
29
 
30
 
31
;---------------------------------------------------------------------
32
;---  НАЧАЛО ПРОГРАММЫ  ----------------------------------------------
33
;---------------------------------------------------------------------
34
 
35
START:
36
    cmp     [PARAMS], byte 0
37
    jne     check_parameters
38
 
39
no_params:
40
    call    find_north_bridg
41
 
42
drawwindow:
43
      mov  eax,48
44
      mov  ebx,3
45
      mov  ecx,sc
46
      mov  edx,sizeof.system_colors
47
      int  0x40
48
 
49
      mov	eax, 12
50
	mov	ebx, 1 ; start redraw
51
	int	0x40
52
 
53
	mov	eax, 0 ; window
54
	mov	ebx, 100 shl 16 + 300
55
	mov	ecx, 100 shl 16 + 90
56
	mov   edx, [sc.work]
57
      or    edx, 0x13000000
58
	mov	edi, header
59
	int	0x40
60
 
61
	mov	eax, 4
62
	mov	ebx, 17 shl 16 + 30
63
      mov   ecx, [sc.work_text]
64
	mov	edx, msg_nb
65
	mov	esi, 14
66
	int	0x40
67
 
68
	mov	ebx, 105 shl 16 + 30
69
	mov	edx, [nb_name]
70
	movzx	esi, byte[edx]
71
	inc	edx
72
	int	0x40
73
 
74
	mov	ebx, 17 shl 16 + 40
75
	mov	edx, msg_stat
76
	mov	esi, 8
77
	int	0x40
78
 
79
	mov	ebx, 102 shl 16 + 50
80
	mov	edx, msg_divs
81
	mov	esi, 32
82
	int	0x40
83
	mov	ebx, 17 shl 16 + 62
84
	mov	edx, msg_hdd
85
	mov	esi, 10
86
	int	0x40
87
	mov	ebx, 17 shl 16 + 72
88
	mov	edx, msg_sgd
89
	int	0x40
90
 
91
	call	get_divs
92
	mov	eax, 47
93
	mov	ebx, 0x30000
94
	mov	ecx, [val_hdd]
95
	mov	edx, 8
96
	shl	edx, cl
97
	mov	ecx, edx
98
	mov	edx, 80 shl 16 + 62
99
	mov	esi, [sc.work_text]
100
	int	0x40
101
 
102
	mov	ecx, [val_sgd]
103
	mov	edx, 8
104
	shl	edx, cl
105
	mov	ecx, edx
106
	mov	edx, 80 shl 16 + 72
107
	int	0x40
108
 
109
 
110
	call	get_bd_stat
111
	mov	ecx, [sc.work_text]
112
	mov	esi, 9
113
	mov	ebx, 105 shl 16 + 40
114
	mov	edx, msg_nf
115
	mov	al, [bd_stat]
116
	test	al, al
117
	jz	@f
118
	mov	edx, msg_dis
119
	dec	al
120
	jz	@f
121
	mov	edx, msg_en
122
@@:	mov	eax, 4
123
	int	0x40
124
 
125
	; Создаём кнопку
126
	mov	ecx, 27 shl 16 + 20
127
	mov	eax, 8
128
	mov	ebx, 220 shl 16 + 70
129
	mov	esi, [sc.work_button]
130
	mov	edx, 2
131
	int	0x40
132
 
133
	; И ещё 14 ;)
134
	mov	edi, 7
135
	mov	ecx, 60 shl 16 + 10
136
	mov	eax, 8
137
	mov	ebx, 105 shl 16 + 25
138
	mov	edx, 3
139
 
140
@@:	int	0x40
141
	inc	edx
142
	add	ebx, 27 shl 16
143
	dec	edi
144
	jnz	@b
145
 
146
	add	ecx, 12 shl 16
147
	mov	ebx, 105 shl 16 + 25
148
	mov	edi, 7
149
@@:	int	0x40
150
	inc	edx
151
	add	ebx, 27 shl 16
152
	dec	edi
153
	jnz	@b
154
 
155
end_dr:	mov	eax, 12
156
	mov	ebx, 2 ; end redraw
157
	int	0x40
158
 
159
; Wait for event ...
160
	mov	eax, 10
161
	int	0x40
162
 
163
	cmp	al, 3
164
	jne	not_bt
165
 
166
	mov	eax, 17			; get id
167
	int	0x40
168
	cmp	ah, 1
169
	jne	no_exit
170
	mov	eax, -1		; close this program
171
	int	0x40
172
no_exit:
173
	cmp	ah, 2
174
	jne	no_ch_bt
175
	mov	dl, [bd_stat]
176
	test	dl, dl
177
	jz	drawwindow
178
	xor	eax, eax
179
	dec	dl
180
	jnz	@f
181
	inc	eax
182
@@:	call	set_bd_stat
183
	jmp	drawwindow
184
 
185
no_ch_bt:
186
	cmp	ah, 9
187
	jg	no_hdd_bt
188
	sub	ah, 3
189
	movzx	esi, ah
190
	mov	edi, [val_sgd]
191
	call	set_divs
192
	jmp	drawwindow
193
no_hdd_bt:
194
	sub	ah, 10
195
	movzx	edi, ah
196
	mov	esi, [val_hdd]
197
	call	set_divs
198
	jmp	drawwindow
199
 
200
 
201
not_bt:	cmp	al, 2
202
	jne	drawwindow
203
	mov	eax, 2			; пока клава не поддерживается - читаем и забываем
204
	int	0x40
205
	jmp	drawwindow
206
;--------------------------------------------------------------------------
207
bus_num:	db	2	; Номер шины
208
devfn:		db	255
209
bd_id:		dd	0	; Идентификатор устройства
210
bd_stat:	db	0	; 0 - не найден, 1 - выключен, 2 - включен
211
 
212
nb_name		dd	nb_nf
213
bd_msk		dd	msk_i440
214
 
215
nb_nf		db	9, 'Not found'
216
msk_i440	db	0
217
nb_i440		db	4, 'i440'
218
msk_nforce	db	0x6D, 0x80, 0xE7, 0x06, 0	; номер регистра, маска, номер регистра, маска, ... , 0
219
nb_nforce	db	6, 'nForce'
220
msk_nforce2	db	0x6F, 0x10, 0
221
nb_nforce2	db	8, 'nForce 2'
222
msk_sis730	db	0x6B, 0x01, 0
223
nb_sis730	db	7, 'SiS 730'
224
nb_sis733	db	7, 'SiS 733'
225
msk_sis735	db	0x6A, 0x03, 0
226
nb_sis735	db	7, 'SiS 735'
227
nb_sis740	db	7, 'SiS 740'
228
nb_sis741	db	7, 'SiS 741'
229
nb_sis745	db	7, 'SiS 745'
230
msk_sis746	db	0x6C, 0x01, 0
231
nb_sis746	db	7, 'SiS 746'
232
nb_sis748	db	7, 'SiS 748'
233
msk_amd751	db	0x62, 0x06, 0
234
nb_amd751	db	7, 'AMD 751'
235
nb_amd751s	db	8, 'AMD 751S'
236
nb_amd761	db	7, 'AMD 761'
237
msk_amd762	db	0x62, 0x02, 0x6A, 0x02, 0
238
nb_amd762	db	7, 'AMD 762'
239
msk_viakt133	db	0x52, 0x80, 0x70, 0x08, 0
240
nb_viakt133	db	30, 'VIA KT133(A)/KM133/KL133/KN133'
241
nb_viakx133	db	9, 'VIA KX133'
242
nb_viakle133	db	10, 'VIA KLE133'
243
msk_viakt266	db	0x92, 0x80, 0x95, 0x02, 0x70, 0x08, 0
244
nb_viakt266	db	18, 'VIA KT266(A)/KT333'
245
nb_viakm266	db	21, 'VIA KM266/KL266/KM333'
246
nb_vikn266	db	9, 'VIA KN266'
247
msk_viakt400	db	0xD2, 0x80, 0xD5, 0x02, 0x70, 0x08, 0
248
nb_viakt400	db	18, 'VIA KT400(A)/KT600'
249
nb_viakm400	db	9, 'VIA KM400'
250
msk_viakt880	db	0x82, 0x80, 0x85, 0x02, 0
251
nb_viakt880	db	9, 'VIA KT880'
252
 
253
 
254
bd_table:	dd	0x70061022		; AMD 751  ----
255
		dd	nb_amd751
256
		dd	msk_amd751
257
 
258
		dd	0x70041022		; AMD 751S
259
		dd	nb_amd751s
260
		dd	msk_amd751
261
 
262
		dd	0x700E1022		; AMD 761
263
		dd	nb_amd761
264
		dd	msk_amd751
265
 
266
		dd	0x700C1022		; AMD 762
267
		dd	nb_amd762
268
		dd	msk_amd762
269
 
270
		dd	0x71908086		; i440 ---
271
		dd	nb_i440
272
		dd	msk_i440
273
 
274
		dd	0x01A410DE		; nForce  ----
275
		dd	nb_nforce
276
		dd	msk_nforce
277
 
278
		dd	0x01E010DE		; nForce 2
279
		dd	nb_nforce2
280
		dd	msk_nforce2
281
 
282
		dd	0x07301039		; SiS 730  ----
283
		dd	nb_sis730
284
		dd	msk_sis730
285
 
286
		dd	0x07331039		; SiS 733
287
		dd	nb_sis730
288
		dd	msk_sis730
289
 
290
		dd	0x07351039		; SiS 735
291
		dd	nb_sis735
292
		dd	msk_sis735
293
 
294
		dd	0x07401039		; SiS 740
295
		dd	nb_sis735
296
		dd	msk_sis735
297
 
298
		dd	0x07411039		; SiS 741
299
		dd	nb_sis735
300
		dd	msk_sis735
301
 
302
		dd	0x07451039		; SiS 745
303
		dd	nb_sis735
304
		dd	msk_sis735
305
 
306
		dd	0x07461039		; SiS 746
307
		dd	nb_sis746
308
		dd	msk_sis746
309
 
310
		dd	0x07481039		; SiS 748
311
		dd	nb_sis746
312
		dd	msk_sis746
313
 
314
		dd	0x03051106		; VIA KT133(A)/KM133/KL133/KN133 ----
315
		dd	nb_viakt133
316
		dd	msk_viakt133
317
 
318
		dd	0x03911106		; VIA KX133
319
		dd	nb_viakt133
320
		dd	msk_viakt133
321
 
322
		dd	0x06911106		; VIA KLE133
323
		dd	nb_viakt133
324
		dd	msk_viakt133
325
 
326
		dd	0x30991106		; VIA KT266(A)/KT333
327
		dd	nb_viakt266
328
		dd	msk_viakt266
329
 
330
		dd	0x31161106		; VIA KM266/KL266/KM333
331
		dd	nb_viakt266
332
		dd	msk_viakt266
333
 
334
		dd	0x31561106		; VIA KN266
335
		dd	nb_viakt266
336
		dd	msk_viakt266
337
 
338
		dd	0x31891106		; VIA KT400(A)/KT600
339
		dd	nb_viakt400
340
		dd	msk_viakt400
341
 
342
		dd	0x32051106		; VIA KM400
343
		dd	nb_viakm400
344
		dd	msk_viakt400
345
 
346
		dd	0x22691106		; VIA KT880
347
		dd	nb_viakt880
348
		dd	msk_viakt880
349
bd_table_end:
350
 
351
 
352
 
353
find_north_bridg:
354
	mov	bl, 6
355
	xor	cl, cl
356
nbus:	mov	bh, [bus_num]
357
ndevfn:	mov	ch, [devfn]
358
	mov	eax, 62
359
	int	0x40
360
	cmp	eax, 0xffffffff
361
	je	bd_next
362
	;---------
363
	mov	esi, bd_table_end - bd_table - 12
364
@@:	cmp	eax, [bd_table + esi]
365
	je	bd_found
366
	test	esi, esi
367
	jz	bd_next
368
	sub	esi, 12
369
	jmp	@b
370
	;---------
371
bd_next:dec	byte[devfn]
372
	jns	ndevfn
373
	mov	byte[devfn], 0
374
	dec	byte[bus_num]
375
	jns	nbus
376
	ret
377
bd_found:
378
	add	esi, bd_table + 4
379
	mov	edi, nb_name
380
	mov	ecx, 2
381
	rep	movsd
382
 
383
	mov	[bd_id], eax
384
	ret
385
 
386
;----------------------
387
;bd_stat:	db	0	; 0 - не найден, 1 - выключен, 2 - включен
388
get_bd_stat:
389
	mov	byte[bd_stat], 1
390
	cld
391
	mov	esi, [bd_msk]
392
	lodsw
393
	test	al, al
394
	jnz	@f
395
	mov	byte[bd_stat], 0
396
	ret
397
@@:	push	eax
398
	mov	bh, [bus_num]
399
	mov	bl, 4
400
	mov	ch, [devfn]
401
	mov	cl, al
402
	mov	eax, 62
403
	int	0x40
404
	pop	edx
405
	and	al, dh
406
	jnz	@f
407
	lodsw
408
	test	al, al
409
	jnz	@b
410
	ret
411
@@:	mov	byte[bd_stat], 2
412
	ret
413
;----------------------
414
set_bd_stat:
415
	cmp	dword[bd_id], 0x01E010DE	; специально для nForce2 400
416
	je	set_stat_nforce2
417
 
418
	mov	edi, eax
419
	cld
420
	mov	esi, [bd_msk]
421
bd_ss_nxt:
422
	lodsw
423
	test	al, al
424
	jz	bd_ss_end
425
	mov	dl, ah		; маска
426
	mov	bh, [bus_num]
427
	mov	bl, 4
428
	mov	ch, [devfn]
429
	mov	cl, al
430
	mov	eax, 62
431
	int	0x40
432
	mov	bl, 8
433
	test	edi, edi
434
	jz	@f
435
	or	al, dl
436
	mov	dl, al
437
	mov	eax, 62
438
	int	0x40
439
	jmp	bd_ss_nxt
440
@@:	not	dl
441
	and	al, dl
442
	mov	dl, al
443
	mov	eax, 62
444
	int	0x40
445
	jmp	bd_ss_nxt
446
bd_ss_end:
447
	ret
448
;------- nForce 2 -----------
449
set_stat_nforce2:
450
; IN : eax = 0 - disable, !0 - enable
451
	push	eax
452
	mov	bh, [bus_num]
453
	mov	bl, 4
454
	mov	ch, [devfn]
455
	mov	cl, 0x6f
456
	mov	eax, 62
457
	int	0x40
458
	and	al, 0x1F
459
	mov	dl, al
460
	mov	bl, 8
461
	mov	eax, 62
462
	int	0x40
463
	pop	eax
464
	test	eax, eax
465
	jz	@f
466
	or	dl, 0x10
467
	mov	eax, 62
468
	int	0x40
469
	ret
470
@@:	and	dl, 0xef
471
	mov	eax, 62
472
	int	0x40
473
	ret
474
;--------------------------------------------------------------------------
475
;                        x8    x16   x32    x64  x128  x256  x512
476
div_hdd:	db	0x23, 0x27, 0x2B, 0x2F, 0x63, 0x67, 0x6B ; Halt Disconnect Divisor
477
div_sgd:	db	0x12, 0x52, 0x92, 0xD2, 0x12, 0x52, 0x92 ; Stop Grand Divisor
478
; low word of 0xC001001B MSR
479
; HDD\SGD     8     16     32     64       128    256    512
480
; 8        0x1223 0x5223 0x9223 0xD223 | 0x1223 0x5223 0x9223
481
; 16       0x1227                      |
482
; 32       0x122B                      |
483
; 64       0x122F                      |      0x522F
484
; 128      0x1263                      |
485
; 256      0x1267   & bin 18 is clear  |  & bin 18 is set
486
; 512      0x126B                      |
487
           ; ^^^^
488
           ; ||||_HDD
489
           ; ||_SGD
490
set_divs:
491
; IN : ESI - hdd (0 = x8, 1 = x16 ..)
492
;      EDI - sgd (0 = x8, 1 = x16 ..)
493
	mov	eax, 68
494
	mov	ebx, 3
495
	mov	edx, 0xC001001b
496
	int	0x40
497
	mov	al, [div_hdd + esi]
498
	mov	ah, [div_sgd + edi]
499
	and	eax, 0xFFFBFFFF
500
	cmp	edi, 3
501
	jle	@f
502
	or	eax, 0x40000
503
@@:	mov	edi, eax
504
	mov	esi, ebx
505
	mov	eax, 68
506
	mov	ebx, 4
507
	int	0x40
508
	ret
509
 
510
get_divs:
511
; OUT : val_hdd - hdd (0 = x8, 1 = x16 ..)
512
;       val_sgd - sgd ...
513
	mov	eax, 68
514
	mov	ebx, 3
515
	mov	edx, 0xC001001b
516
	int	0x40
517
	mov	ecx, 7
518
@@:	cmp	[div_hdd + ecx - 1], al
519
	je	@f
520
	loop	@b
521
@@:	dec	ecx
522
	mov	[val_hdd], ecx
523
	mov	ecx, 4
524
@@:	cmp	[div_sgd + ecx - 1], ah
525
	je	@f
526
	loop	@b
527
@@:	dec	ecx
528
	test	eax, 0x40000
529
	jz	@f
530
	add	ecx, 4
531
@@:	mov	[val_sgd], ecx
532
	ret
533
 
534
;******************************************************************************
535
 
536
check_parameters:
537
    cmp     [PARAMS], dword "BOOT" ; received BOOT parameter -> goto handler
538
    je      boot_bd_enable
539
    jmp     no_params
540
 
541
;******************************************************************************
542
 
543
boot_bd_enable:
544
 
545
   call    find_north_bridg
546
   call    set_bd_stat
547
   mcall   -1
548
 
549
;******************************************************************************
550
 
551
 
552
;--------------------------------------------------------------------------
553
 
554
header	db appname,version,0
555
 
556
msg_divs	db ' x8  x16  x32 x64 x128 x256 x512'
557
msg_hdd	db 'Hatl Disc.'
558
msg_sgd	db 'Stop Grand'
559
msg_nb	db 'North bridge :';14
560
msg_stat	db 'Status :'      ;8
561
msg_en	db 'Enabled  '     ;9
562
msg_dis	db 'Disabled '     ;9
563
msg_nf	db 'Not found'     ;9
564
 
565
I_END:
566
sc     system_colors
567
val_hdd:	dd	?
568
val_sgd:	dd	?
569