Subversion Repositories Kolibri OS

Rev

Rev 3170 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3170 Rev 3496
Line 11... Line 11...
11
FDEBUG		equ 1
11
FDEBUG		equ 1
12
DEBUG_IRQ	equ 0
12
DEBUG_IRQ	equ 0
Line 13... Line 13...
13
 
13
 
Line 14... Line 14...
14
USE_SINGLE_MODE   equ  0   ; 1 = Single mode; 0 = Normal mode.
14
USE_SINGLE_MODE   equ  0   ; 1 = Single mode; 0 = Normal mode.
Line 15... Line 15...
15
 
15
 
16
TEST_VERSION_NUMBER  equ '018b'
16
TEST_VERSION_NUMBER  equ '018d'
17
 
17
 
18
;Asper+ [
18
;Asper+ [
Line 450... Line 450...
450
  IOCTL IOCTL
450
  IOCTL IOCTL
451
end virtual
451
end virtual
Line 452... Line 452...
452
 
452
 
Line -... Line 453...
-
 
453
EVENT_NOTIFY	equ 0x00000200
-
 
454
 
-
 
455
; Macroses by CleverMouse
-
 
456
; The following macro assume that we are on uniprocessor machine.
-
 
457
; Serious work is needed for multiprocessor machines.
-
 
458
macro spin_lock_irqsave spinlock
-
 
459
{
-
 
460
	pushf
-
 
461
	cli
-
 
462
}
-
 
463
macro spin_unlock_irqrestore spinlock
-
 
464
{
-
 
465
	popf
-
 
466
}
-
 
467
macro spin_lock_irq spinlock
-
 
468
{
-
 
469
	cli
-
 
470
}
-
 
471
macro spin_unlock_irq spinlock
-
 
472
{
-
 
473
	sti
-
 
474
}
-
 
475
 
-
 
476
SPINLOCK_BUSY = 1
-
 
477
SPINLOCK_FREE = 0
-
 
478
 
-
 
479
macro spin_lock
-
 
480
{
-
 
481
	push	eax ebx
-
 
482
	mov	eax, aspinlock
-
 
483
	mov	ebx, SPINLOCK_BUSY
-
 
484
  @@:
-
 
485
	lock	xchg [eax], ebx
-
 
486
	cmp	ebx, SPINLOCK_FREE
-
 
487
	jnz	@b
-
 
488
	pop	ebx eax
-
 
489
}
-
 
490
 
-
 
491
macro spin_unlock
-
 
492
{
-
 
493
	push	eax ebx
-
 
494
	mov	eax, aspinlock
-
 
495
	mov	eax, aspinlock
-
 
496
	mov	ebx, SPINLOCK_FREE
-
 
497
lock	xchg	[eax], ebx
-
 
498
	pop	ebx eax
453
EVENT_NOTIFY	equ 0x00000200
499
}
454
 
500
 
455
public START
501
public START
Line 456... Line 502...
456
public service_proc
502
public service_proc
Line 600... Line 646...
600
 
646
 
601
.reg:
647
.reg:
602
	   stdcall RegService, sz_sound_srv, service_proc
648
	   stdcall RegService, sz_sound_srv, service_proc
603
	   ret
649
	   ret
604
.fail:
-
 
605
     if DEBUG
650
.fail:
606
	   mov esi, msgFail
-
 
607
	   call SysMsgBoardStr
-
 
608
     end if
-
 
609
	   xor eax, eax
-
 
610
	   ret
651
	   mov esi, msgFail
611
.fail_msg:
652
.fail_msg:
612
	   call SysMsgBoardStr
653
	   call SysMsgBoardStr
613
	   xor eax, eax
654
	   xor eax, eax
614
	   ret
655
	   ret
Line 660... Line 701...
660
	   call stop
701
	   call    stop
661
	   xor	    eax, eax
702
	   xor	   eax, eax
662
	   ret
703
	   ret
663
@@:
704
@@:
664
	   cmp eax, DEV_CALLBACK
705
	   cmp	   eax, DEV_CALLBACK
665
	   jne @F
706
	   jne	   @f
666
	   mov ebx, [edi+input]
707
	   mov	   ebx, [edi+input]
667
	   stdcall  set_callback, [ebx]
708
	   stdcall set_callback, [ebx]
668
	   xor	    eax, eax
709
	   xor	   eax, eax
669
	   ret
710
	   ret
670
@@:
711
@@:
671
	   cmp eax, DEV_SET_MASTERVOL
712
	   cmp	   eax, DEV_SET_MASTERVOL
672
	   jne @F
713
	   jne	   @f
673
	   mov	    eax, [edi+input]
714
	   mov	   eax, [edi+input]
674
	   mov	    eax, [eax]
715
	   mov	   eax, [eax]
675
	   call     set_master_vol
716
	   call    set_master_vol
676
	   xor	    eax, eax
717
	   xor	   eax, eax
677
	   ret
718
	   ret
678
@@:
719
@@:
679
	   cmp eax, DEV_GET_MASTERVOL
720
	   cmp	   eax, DEV_GET_MASTERVOL
680
	   jne @F
721
	   jne	   @f
681
	   mov	    ebx, [edi+output]
722
	   mov	   ebx, [edi+output]
682
	   stdcall  get_master_vol, ebx
723
	   stdcall get_master_vol, ebx
683
	   xor	    eax, eax
724
	   xor	   eax, eax
684
	   ret
725
	   ret
685
;@@:
726
;@@:
686
;           cmp eax, DEV_GET_INFO
727
;           cmp     eax, DEV_GET_INFO
687
;           jne @F
728
;           jne     @f
688
;           mov      ebx, [edi+output]
729
;           mov     ebx, [edi+output]
689
;           stdcall  get_dev_info, ebx
730
;           stdcall get_dev_info, ebx
690
;           xor      eax, eax
731
;           xor     eax, eax
691
;           ret
732
;           ret
692
@@:
733
@@:
693
	   cmp eax, DEV_GET_POS
734
	   cmp	   eax, DEV_GET_POS
694
	   jne @F
735
	   jne	   @f
695
	   stdcall  azx_get_position
736
	   stdcall azx_get_position
696
	   shr	    eax, 2
737
	   shr	   eax, 2
697
	   mov	    ebx, [edi+output]
738
	   mov	   ebx, [edi+output]
698
	   mov	    [ebx], eax
739
	   mov	   [ebx], eax
699
	   xor	    eax, eax
740
	   xor	   eax, eax
700
	   ret
741
	   ret
701
@@:
742
@@:
702
;           cmp eax, DEV_SET_CHANNEL_VOLUME
743
;           cmp eax, DEV_SET_CHANNEL_VOLUME
703
;           jne @F
744
;           jne @f
704
;     if DEBUG
745
;     if DEBUG
705
;           mov esi, msgSetChannelVolume
746
;           mov esi, msgSetChannelVolume
706
;           call SysMsgBoardStr
747
;           call SysMsgBoardStr
707
;     end if
748
;     end if
708
;           mov      ebx, [edi+input]
749
;           mov      ebx, [edi+input]
Line 725... Line 766...
725
;           call     set_channel_volume
766
;           call    set_channel_volume
726
;           xor      eax, eax
767
;           xor     eax, eax
727
;           ret
768
;           ret
728
;@@:
769
;@@:
729
;           cmp eax, DEV_GET_CHANNEL_VOLUME
770
;           cmp     eax, DEV_GET_CHANNEL_VOLUME
730
;           jne @F
771
;           jne     @f
731
;           mov      cl,  byte [edi+input]  ; cl=channel
772
;           mov     cl,  byte [edi+input]  ; cl=channel
732
;           call     get_channel_volume
773
;           call    get_channel_volume
733
;           mov      ebx, [edi+output]
774
;           mov     ebx, [edi+output]
734
;           mov      [ebx], eax
775
;           mov     [ebx], eax
735
;           xor      eax, eax
776
;           xor     eax, eax
Line 763... Line 804...
763
restore   out_size
804
restore   out_size
Line 764... Line 805...
764
 
805
 
765
 
806
 
-
 
807
align 4
766
align 4
808
proc hda_irq   ;+
767
proc hda_irq   ;+
809
	   spin_lock
768
     if DEBUG_IRQ
810
     if DEBUG_IRQ
769
	   push eax esi
811
	   push eax esi
770
	   ;mov esi, msgIRQ
812
	   ;mov esi, msgIRQ
Line 776... Line 818...
776
     end if
818
     end if
777
	   mov	 edx, ICH6_REG_INTSTS
819
	   mov	 edx, ICH6_REG_INTSTS
778
	   call  azx_readl
820
	   call  azx_readl
779
	   test  eax, eax
821
	   test  eax, eax
780
	   jnz	 @f
822
	   jnz	 @f
-
 
823
	   spin_unlock
781
	   ret
824
	   ret
782
  @@:
825
  @@:
783
	   mov	 ebx, eax ; status
826
	   mov	 ebx, eax ; status
784
	   mov	 eax, SDO_INT
827
	   mov	 eax, SDO_INT
785
	   test  ebx, eax
828
	   test  ebx, eax
Line 841... Line 884...
841
	   mov	 edx, ICH6_REG_STATESTS
884
	   mov	 edx, ICH6_REG_STATESTS
842
	   call  azx_writeb
885
	   call  azx_writeb
843
  @@:
886
  @@:
844
;end if
887
;end if
845
	   or	 eax, 1
888
	   or	 eax, 1
-
 
889
	   spin_unlock
846
	   ret
890
	   ret
847
endp
891
endp
Line 848... Line 892...
848
 
892
 
Line 933... Line 977...
933
	   loop @B
977
	   loop @B
Line 934... Line 978...
934
 
978
 
935
	   ; wallclk has 24Mhz clock source
979
	   ; wallclk has 24Mhz clock source
Line 936... Line 980...
936
	   mov [ctrl.period_wallclk], ((0x4000 * 24000) / 48000) * 1000
980
	   mov [ctrl.period_wallclk], ((0x4000 * 24000) / 48000) * 1000
937
 
981
 
938
	   ;-call  azx_stream_reset
982
	   call  azx_stream_reset
939
	   call  azx_setup_controller
983
	   call  azx_setup_controller
Line 940... Line 984...
940
	   ret
984
	   ret
Line 1288... Line 1332...
1288
endp
1332
endp
Line 1289... Line 1333...
1289
 
1333
 
1290
 
1334
 
-
 
1335
align 4
1291
align 4
1336
play:
1292
play:
1337
	   spin_lock
1293
	   mov	 edx, ICH6_REG_WALLCLK
1338
	   mov	 edx, ICH6_REG_WALLCLK
Line 1294... Line 1339...
1294
	   call  azx_readl
1339
	   call  azx_readl
1295
	   mov	 [ctrl.start_wallclk], eax
1340
	   mov	 [ctrl.start_wallclk], eax
-
 
1341
 
1296
 
1342
	   call  azx_stream_start
Line 1297... Line 1343...
1297
	   call  azx_stream_start
1343
	   xor	 eax, eax
1298
	   xor	 eax, eax
1344
	   spin_unlock
-
 
1345
	   ret
1299
	   ret
1346
 
1300
 
1347
align 4
1301
align 4
1348
stop:
1302
stop:
1349
	     spin_lock
1303
;*           call  azx_stream_stop        ;Asper: Hangs system
1350
;*           call  azx_stream_stop        ;Asper: Hangs system
Line 1337... Line 1384...
1337
;*
1384
;*
1338
;*           pop   edx ecx ebx
1385
;*           pop   edx ecx ebx
1339
;Asper ]
1386
;Asper ]
Line 1340... Line 1387...
1340
 
1387
 
-
 
1388
	   xor	 eax, eax
1341
	   xor	 eax, eax
1389
	   spin_unlock
Line 1342... Line 1390...
1342
	   ret
1390
	   ret
1343
 
1391
 
1344
;align 4
1392
;align 4
Line 1402... Line 1450...
1402
	   pop	 edx ecx eax
1450
	   pop	 edx ecx eax
1403
	   ret
1451
	   ret
1404
endp
1452
endp
Line 1405... Line 1453...
1405
 
1453
 
-
 
1454
proc  azx_init_cmd_io
1406
proc  azx_init_cmd_io
1455
	   spin_lock_irq
1407
	   pusha
1456
	   pusha
1408
	   ; CORB set up
1457
	   ; CORB set up
1409
	   mov	 eax, [ctrl.rb]
1458
	   mov	 eax, [ctrl.rb]
1410
	   mov	 ebx, eax
1459
	   mov	 ebx, eax
Line 1469... Line 1518...
1469
	   mov	  al, ICH6_RBCTL_DMA_EN or ICH6_RBCTL_IRQ_EN
1518
	   mov	  al, ICH6_RBCTL_DMA_EN or ICH6_RBCTL_IRQ_EN
1470
	   mov	 edx, ICH6_REG_RIRBCTL
1519
	   mov	 edx, ICH6_REG_RIRBCTL
1471
	   call  azx_writeb
1520
	   call  azx_writeb
Line 1472... Line 1521...
1472
 
1521
 
-
 
1522
	   popa
1473
	   popa
1523
	   spin_unlock_irq
1474
	   ret
1524
	   ret
Line 1475... Line 1525...
1475
endp
1525
endp
-
 
1526
 
1476
 
1527
proc  azx_free_cmd_io
1477
proc  azx_free_cmd_io
1528
	   spin_lock_irq
1478
	   push  eax edx
1529
	   push  eax edx
1479
	   ; disable ringbuffer DMAs
1530
	   ; disable ringbuffer DMAs
1480
	   xor	  al, al
1531
	   xor	  al, al
1481
	   mov	 edx, ICH6_REG_RIRBCTL
1532
	   mov	 edx, ICH6_REG_RIRBCTL
1482
	   call  azx_writeb
1533
	   call  azx_writeb
1483
	   mov	 edx, ICH6_REG_CORBCTL
1534
	   mov	 edx, ICH6_REG_CORBCTL
-
 
1535
	   call  azx_writeb
1484
	   call  azx_writeb
1536
	   pop	 edx eax
1485
	   pop	 edx eax
1537
	   spin_unlock_irq
Line 1486... Line 1538...
1486
	   ret
1538
	   ret
1487
endp
1539
endp
-
 
1540
 
1488
 
1541
 
1489
 
1542
; send a command
1490
; send a command
1543
proc  azx_corb_send_cmd  stdcall, val:dword
1491
proc  azx_corb_send_cmd  stdcall, val:dword
1544
	   spin_lock_irq
1492
	   push  edx edi
1545
	   push  edx edi
Line 1507... Line 1560...
1507
	   mov	 edx, ICH6_REG_CORBWP
1560
	   mov	 edx, ICH6_REG_CORBWP
1508
	   call  azx_writel
1561
	   call  azx_writel
Line 1509... Line 1562...
1509
 
1562
 
1510
	   pop	 edi edx
1563
	   pop	 edi edx
-
 
1564
	   xor	 eax, eax ;Asper+
1511
	   xor	 eax, eax ;Asper+
1565
	   spin_unlock_irq
1512
	   ret
1566
	   ret
Line 1513... Line 1567...
1513
endp
1567
endp
Line 1587... Line 1641...
1587
      jnz     .poll
1641
      jnz     .poll
1588
      mov     ah, [do_poll]
1642
      mov     ah, [do_poll]
1589
      test    ah, ah
1643
      test    ah, ah
1590
      jz      @f
1644
      jz      @f
1591
  .poll:
1645
  .poll:
-
 
1646
      spin_lock_irq
1592
      call    azx_update_rirb
1647
      call    azx_update_rirb
-
 
1648
      spin_unlock_irq
1593
  @@:
1649
  @@:
1594
      mov     eax, [ctrl.rirb_cmd]
1650
      mov     eax, [ctrl.rirb_cmd]
1595
      test    eax, eax
1651
      test    eax, eax
1596
      jnz     .l1
1652
      jnz     .l1
1597
      mov     [ctrl.rirb_error], 0
1653
      mov     [ctrl.rirb_error], 0
Line 2482... Line 2538...
2482
	   pop	 edx ecx eax
2538
	pop	edx ecx eax
2483
	   ret
2539
	ret
Line 2484... Line 2540...
2484
 
2540
 
2485
align 4
2541
align 4
2486
proc StallExec
-
 
2487
	   push ecx
-
 
2488
	   push edx
-
 
2489
	   push ebx
2542
proc StallExec
Line 2490... Line 2543...
2490
	   push eax
2543
	push	ecx edx ebx eax
2491
 
2544
 
2492
	   mov ecx, CPU_FREQ
2545
	mov	ecx, CPU_FREQ
2493
	   mul ecx
2546
	mul	ecx
Line 2500... Line 2553...
2500
	   rdtsc
2553
	rdtsc
2501
	   sub eax, ebx
2554
	sub	eax, ebx
2502
	   sbb edx, ecx
2555
	sbb	edx, ecx
2503
	   js @B
2556
	js	@B
Line 2504... Line -...
2504
 
-
 
2505
	   pop eax
-
 
2506
	   pop ebx
-
 
2507
	   pop edx
2557
 
2508
	   pop ecx
2558
	pop	eax ebx edx ecx
2509
	   ret
2559
	ret
Line 2510... Line 2560...
2510
endp
2560
endp
2511
 
2561
 
Line 2582... Line 2632...
2582
      mov ebx, eax
2632
	mov	ebx, eax
2583
      and ebx, 0x0F
2633
	and	ebx, 0x0F
2584
      mov bl, [ebx+hexletters]
2634
	mov	bl, [ebx+hexletters]
2585
      mov [8+esi+ecx], bl
2635
	mov	[8+esi+ecx], bl
2586
      inc ecx
2636
	inc	ecx
2587
      jnz @B
2637
	jnz	@b
2588
      pop eax
2638
	pop	eax
Line 2589... Line 2639...
2589
 
2639
 
2590
      mov  dword [esi+8], 0
2640
	mov	dword [esi+8], 0
2591
      test [flags], 0x2 ; new line ?
2641
	test	[flags], 0x2 ; new line ?
Line 2911... Line 2961...
2911
;] Asper
2961
;] Asper
Line 2912... Line 2962...
2912
 
2962
 
Line -... Line 2963...
-
 
2963
 
Line 2913... Line 2964...
2913
 
2964
section '.data' data readable writable align 16
2914
section '.data' data readable writable align 16
2965
 
Line 2915... Line 2966...
2915
 
2966
aspinlock	 dd SPINLOCK_FREE