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 |