Subversion Repositories Kolibri OS

Rev

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