]> wirehaze git hosting - BOS.git/blob - kernel/fdc/dma.asm

wirehaze git hosting

Start of cleanup.
[BOS.git] / kernel / fdc / dma.asm
1 ;----------------------------------------------------------;
2 ; BOS kernel Christoffer Bubach, 2004-2005. ;
3 ;----------------------------------------------------------;
4 ; ;
5 ; DMA transfer code. ;
6 ; ;
7 ;----------------------------------------------------------;
8
9
10 ;------------------------------------------;
11 ; Lookup table for DMA controller ports ;
12 ;------------------------------------------;
13 dma_mask_reg dw 0x0A, 0x0A, 0x0A, 0x0A, 0xD4, 0xD4, 0xD4, 0xD4
14 dma_mode_reg dw 0x0B, 0x0B, 0x0B, 0x0B, 0xD6, 0xD6, 0xD6, 0xD6
15 dma_clear_reg dw 0x0C, 0x0C, 0x0C, 0x0C, 0xD8, 0xD8, 0xD8, 0xD8
16 dma_page_port dw 0x87, 0x83, 0x81, 0x82, 0x8F, 0x8B, 0x89, 0x8A
17 dma_addr_port dw 0x00, 0x02, 0x04, 0x06, 0xC0, 0xC4, 0xC8, 0xCC
18 dma_count_port dw 0x01, 0x03, 0x05, 0x07, 0xC2, 0xC6, 0xCA, 0xCE
19
20
21 ;-----------------------------------;
22 ; dma transfer ;
23 ; ;
24 ; in: ecx = page:offset ;
25 ; bl = channel ;
26 ; bh = 1=read, 0=write ;
27 ; esi = count ;
28 ; ;
29 ; out: nothing. ;
30 ;-----------------------------------;
31 dma_transfer:
32 push eax
33 push edx
34 push esi
35 cli
36 or bh, bh
37 jz .dont_read
38
39 mov bh, bl
40 add bh, 0x48
41 jmp .read
42 .dont_read:
43 mov bh, bl
44 add bh, 0x44
45 .read:
46 dec esi
47
48 movzx eax, bl
49 mov dx, word [(eax*2)+dma_mask_reg]
50 mov al, bl
51 or al, 0x04
52 out dx, al ; disable the channel
53
54 movzx eax, bl
55 mov dx, word [(eax*2)+dma_clear_reg]
56 mov al, 0
57 out dx, al ; initialize flip-flop
58
59 movzx eax, bl
60 mov dx, word [(eax*2)+dma_mode_reg]
61 mov al, bh
62 out dx, al ; set DMA mode
63
64 movzx eax, bl
65 mov dx, word [(eax*2)+dma_addr_port]
66 mov al, cl
67 out dx, al ; write low offset part
68 mov al, ch
69 out dx, al ; and high offset part
70
71 movzx eax, bl
72 mov dx, word [(eax*2)+dma_page_port]
73 mov eax, ecx
74 shr eax, 16
75 out dx, al ; write page.
76
77 movzx eax, bl
78 mov dx, word [(eax*2)+dma_count_port]
79 mov eax, esi
80 out dx, al ; low count
81 mov al, ah
82 out dx, al ; high count
83
84 movzx eax, bl
85 mov dx, word [(eax*2)+dma_mask_reg]
86 mov al, bl
87 out dx, al ; enable channel
88
89 sti
90 pop esi
91 pop edx
92 pop eax
93 ret