]> pd.if.org Git - mmurtl/blob - ossource/dmacode.asm
autocommit for file dated 1995-02-09 16:00:32
[mmurtl] / ossource / dmacode.asm
1 ;   MMURTL Operating System Source Code\r
2 ;   Copyright 1991,1992,1993,1994 Richard A. Burgess\r
3 ;   ALL RIGHTS RESERVED    Version 1.0\r
4 .DATA\r
5 \r
6 .INCLUDE MOSEDF.INC\r
7 \r
8 .CODE\r
9 ;========== DMA Equates for DMA amd PAGE registers =========\r
10 ;NOTES:  With 8 bit DMA, the lower WORD (bits 15-0) are placed into\r
11 ; the address registers of the DMA, and the Page register is the next\r
12 ; most significant byte (bits 23-16). With WORD DMA moves (channels 5-7),\r
13 ; address bits 16-1 are placed in the address registers, while 23-17 are\r
14 ; put in the page register.  Bit 16 is ignored by the page register.\r
15 ;\r
16 ;\r
17 ; DMA 1 Port addresses and page registers\r
18 \r
19 DMA10Add        EQU  00h        ;Ch 0 Address\r
20 DMA10Cnt        EQU  01h        ;Ch 0 Word Count\r
21 DMA11Add        EQU  02h        ;Ch 1 Address\r
22 DMA11Cnt        EQU  03h        ;Ch 1 Word Count\r
23 DMA12Add        EQU  04h        ;Ch 2 Address\r
24 DMA12Cnt        EQU  05h        ;Ch 2 Word Count\r
25 DMA13Add        EQU  06h        ;Ch 3 Address\r
26 DMA13Cnt        EQU  07h        ;Ch 3 Word Count\r
27 DMA1StatCmd     EQU  08h        ;Read Status/Write Command\r
28 DMA1RqReg       EQU  09h        ;Read/Write DMA Rq Register\r
29 DMA1RCmdWbm     EQU  0Ah        ;Read Command/Write Single bit mask\r
30 DMA1Mode        EQU  0Bh        ;Read/Write Mode register\r
31 DMA1FF          EQU  0Ch        ;Writing this address clears byte ptr flip flop\r
32 DMA1Clear       EQU  0Dh        ;Write causes MASTER Clear (Read from Temp Reg)\r
33 DMA1ClrMode     EQU  0Eh        ;Rd clears mode reg count/Wr Clr ALL mask bits\r
34 DMA1MskBts      EQU  0Fh        ;Read/Write DMA Rq Mask Register\r
35 \r
36 ; DMA 2 Port addresses\r
37 \r
38 DMA20Add        EQU  0C0h       ;Ch 0 Address\r
39 DMA20Cnt        EQU  0C2h       ;Ch 0 Word Count\r
40 DMA21Add        EQU  0C4h   ;Ch 1 Address\r
41 DMA21Cnt        EQU  0C6h   ;Ch 1 Word Count\r
42 DMA22Add        EQU  0C8h   ;Ch 2 Address\r
43 DMA22Cnt        EQU  0CAh   ;Ch 2 Word Count\r
44 DMA23Add        EQU  0CCh   ;Ch 3 Address\r
45 DMA23Cnt        EQU  0CEh   ;Ch 3 Word Count\r
46 DMA2StatCmd     EQU  0D0h   ;Read Status/Write Command\r
47 DMA2RqReg       EQU  0D2h   ;Read/Write DMA Rq Register\r
48 DMA2RCmdWbm     EQU  0D4h   ;Read Command/Write Single bit mask\r
49 DMA2Mode        EQU  0D6h   ;Read/Write Mode register\r
50 DMA2FF          EQU  0D8h   ;Writing this address clears byte ptr flip flop\r
51 DMA2Clear       EQU  0DAh   ;Write causes MASTER Clear (Read from Temp Reg)\r
52 DMA2ClrMode     EQU  0DCh   ;Rd clears mode reg count/Wr Clr ALL mask bits\r
53 DMA2MskBts      EQU  0DEh   ;Read/Write DMA Rq Mask Register\r
54 \r
55 ;DMA Page register by DRQ/DACK number\r
56 \r
57 DMAPage0        EQU 87h         ;DMA DACK0 Page register\r
58 DMAPage1        EQU 83h         ;    DACK1 (etc. etc. etc.)\r
59 DMAPage2        EQU 81h\r
60 DMAPage3        EQU 82h\r
61 DMAPage5        EQU 8Bh\r
62 DMAPage6        EQU 89h\r
63 DMAPage7        EQU 8Ah\r
64 ;\r
65 ; The following code sets up the initial DMA channel values for\r
66 ; both chips to most probable use. Includes cascade mode for CH4\r
67 ; which is DMA channel 0 on chip 2\r
68 ;\r
69 PUBLIC InitDMA:\r
70         MOV AL, 04                              ;Master disable\r
71         OUT     DMA1StatCmd, AL\r
72         OUT     DMA2StatCmd, AL\r
73 \r
74         XOR AL, AL                              ;MASTER CLEAR (same as hardware reset)\r
75         OUT DMA1Clear, AL\r
76         OUT DMA2Clear, AL\r
77 \r
78         XOR AL, AL                              ;All commands set to default (0)\r
79         OUT     DMA1StatCmd, AL\r
80         OUT     DMA2StatCmd, AL\r
81 \r
82         MOV AL, 40h                             ;CH 0 DMA 1\r
83         OUT     DMA1Mode, AL            ;\r
84         MOV AL, 0C0h                    ;CH 0 DMA 2  (Cascade Mode)\r
85         OUT     DMA2Mode, AL            ;\r
86 \r
87         MOV AL, 41h                             ;CH 1 DMA 1 & 2\r
88         OUT     DMA1Mode, AL            ;\r
89         OUT     DMA2Mode, AL            ;\r
90 \r
91         MOV AL, 42h                             ;CH 2 DMA 1 & 2\r
92         OUT     DMA1Mode, AL            ;\r
93         OUT     DMA2Mode, AL            ;\r
94 \r
95         MOV AL, 43h                             ;CH 3 DMA 1 & 2\r
96         OUT     DMA1Mode, AL            ;\r
97         OUT     DMA2Mode, AL            ;\r
98 \r
99         XOR AL,AL\r
100         OUT DMA1ClrMode, AL     ;Enable ALL DMA 1 Channels\r
101         OUT DMA2ClrMode, AL     ;Enable ALL DMA 2 Channels\r
102         RETN\r
103 \r
104 ;\r
105 ;-----------------------------------------------------------\r
106 ; The following code sets up a single DMA channel for the caller.\r
107 ; DMA is crippled because it can't move across 64K physical\r
108 ; boundries. It's the caller's responsibility to know if he is\r
109 ; crossing a boundry! If he does, this will wrap around over the segment!!!\r
110 ; This code is completely reentrant.\r
111 ; There is only one call for DMA set up.\r
112 \r
113 ; The caller sets the type of DMA operation (In, Out, Verify).\r
114 ; For channels 5,6 & 7, the address & count must be divided by\r
115 ; two for the DMA hardware. This routine does this for you!\r
116 ; Algorythm - Put mode byte bits (except channel bits) in BL, then jump to\r
117 ; correct routine for that channel. The call will allow set up of\r
118 ; all the differnet types of DMA modes for read and write with this\r
119 ; single call.  The call:\r
120 ;\r
121 ;       DmaSetUp(dPhyMem, sdMem, dChannel, dType, dMode)\r
122 ;          EBP+  28       24     20        16     12\r
123 ;\r
124 ;       dPhyMem is physical memory address\r
125 ;       sdMem is nBytes to move (STILL bytes for word xfers, we do math)\r
126 ;       dChannel (0,1,2,3,5,6,7)\r
127 ;       dType - 0 = Verify, 1 = In (Write Mem), 2 = Out (Read memory)\r
128 ;       dMode - 0 Demand Mode, 1 Single Cycle,     (Disk I/O uses 1)\r
129 ;                       2 Block, 3 Cascade\r
130 ;\r
131 ;\r
132 PUBLIC __DMASetUp:\r
133                 PUSH EBP                ;\r
134                 MOV EBP,ESP             ;\r
135                 MOV EAX, [EBP+12]               ; dMode\r
136                 CMP EAX, 04                             ; Mode must be < 4\r
137                 JB DMAModeOK\r
138                 MOV EAX, ErcDMAMode\r
139                 JMP DMAEnd\r
140 DMAModeOK:\r
141                 SHL EAX, 6                              ; Move Mode bits to 6 and 7\r
142                 MOV BL, AL                              ; Put it in BL\r
143                 MOV EAX, [EBP+16]               ; get dType\r
144                 AND BL, 0C0h                    ; Set to Verify by default (low bits 0)\r
145                 CMP EAX, 0                              ; Check fType (Verify?)\r
146                 JE DMASelect                    ; Yes\r
147                 CMP EAX, 1                              ; In? (Write)\r
148                 JE DMAWrite                             ; Yes (if no then fall thru to Read)\r
149 DMARead:\r
150                 OR BL,  00001000b               ; OR read command to BL (OUT)\r
151                 JMP DMASelect\r
152 DMAWrite:\r
153                 OR BL, 00000100b                ; OR write command to BL (IN)\r
154 \r
155 DMASelect:\r
156                 MOV EAX, [EBP+20]               ;Jump table for channel selection\r
157                 CMP EAX, 0                              ;\r
158                 JE DMA0\r
159                 CMP EAX, 1\r
160                 JE DMA1\r
161                 CMP EAX, 2\r
162                 JE DMA2\r
163                 CMP EAX, 3\r
164                 JE DMA3\r
165                 CMP EAX, 5\r
166                 JE DMA5\r
167                 CMP EAX, 6\r
168                 JE DMA6\r
169                 CMP EAX, 7\r
170                 JE DMA7\r
171                 MOV EAX, ErcDMAChannel\r
172                 JMP DMAEnd\r
173 \r
174 DMA0:\r
175                 CLI\r
176                 MOV AL, 00000100b               ; channel 0 Set Mask for DRQ\r
177                 OUT DMA1RCmdWbm, AL             ;\r
178                 MOV AL, 00000000b               ; CH0 (CH is last 2 bits)\r
179                 OR  AL, BL                              ; OR with MODE\r
180                 OUT DMA1Mode, AL\r
181                 OUT DMA1FF, AL                  ; Clear FlipFLop (Val in AL irrelevent)\r
182                 MOV EAX, [EBP+28]               ; dPhyMem\r
183                 OUT DMA10Add, AL                ; Lo byte address\r
184                 SHR EAX, 8\r
185                 OUT DMA10Add, AL                ; Hi Byte\r
186                 SHR EAX, 8\r
187                 OUT DMAPage0, AL                ; Highest byte (to page register)\r
188                 MOV EAX, [EBP+24]\r
189                 DEC EAX\r
190                 OUT DMA10Cnt, AL\r
191                 SHR EAX, 8\r
192                 OUT DMA10Cnt, AL\r
193                 MOV AL, 00000000b               ; channel 0 Clear Mask for DRQ\r
194                 OUT DMA1RcmdWbm, AL\r
195                 STI\r
196                 XOR EAX, EAX\r
197                 JMP DMAEnd\r
198 \r
199 DMA1:\r
200                 CLI\r
201                 MOV AL, 00000101b               ; channel 1 Set Mask for DRQ\r
202                 OUT DMA1RCmdWbm, AL\r
203                 MOV AL, 00000001b               ; CH1\r
204                 OR  AL, BL                              ; OR with MODE/TYPE\r
205                 OUT DMA1Mode, AL\r
206                 OUT DMA1FF, AL                  ; Clear FlipFLop (Val in AL irrelevent)\r
207                 MOV EAX, [EBP+28]               ; dPhyMem\r
208                 OUT DMA11Add, AL                ; Lo byte address\r
209                 SHR EAX, 8\r
210                 OUT DMA11Add, AL                ; Hi Byte\r
211                 SHR EAX, 8\r
212                 OUT DMAPage1, AL                ; Highest byte (to page register)\r
213                 MOV EAX, [EBP+24]               ; sdMem\r
214                 DEC EAX\r
215                 OUT DMA11Cnt, AL\r
216                 SHR EAX, 8\r
217                 OUT DMA11Cnt, AL\r
218                 MOV AL, 00000001b               ; channel 1 Clear Mask for DRQ\r
219                 OUT DMA1RcmdWbm, AL\r
220                 STI\r
221                 XOR EAX, EAX\r
222                 JMP DMAEnd\r
223 \r
224 DMA2:\r
225                 CLI\r
226                 MOV AL, 00000110b               ; channel 2 Set Mask for DRQ\r
227                 OUT DMA1RCmdWbm, AL\r
228                 MOV AL, 00000010b               ; CH2\r
229                 OR  AL, BL                              ; OR with MODE\r
230                 OUT DMA1Mode, AL\r
231                 OUT DMA1FF, AL                  ; Clear FlipFLop (Val in AL irrelevent)\r
232                 MOV EAX, [EBP+28]               ; dPhyMem\r
233                 OUT DMA12Add, AL                ; Lo byte address\r
234                 SHR EAX, 8\r
235                 OUT DMA12Add, AL                ; Hi Byte\r
236                 SHR EAX, 8\r
237                 OUT DMAPage2, AL                ; Highest byte (to page register)\r
238                 MOV EAX, [EBP+24]               ; sdMem\r
239                 DEC EAX\r
240                 OUT DMA12Cnt, AL\r
241                 SHR EAX, 8\r
242                 OUT DMA12Cnt, AL\r
243                 MOV AL, 00000010b               ; channel 2 Clear Mask for DRQ\r
244                 OUT DMA1RcmdWbm, AL\r
245                 STI\r
246                 XOR EAX, EAX\r
247                 JMP DMAEnd\r
248 \r
249 DMA3:\r
250                 CLI\r
251                 MOV AL, 00000111b               ; channel 3 Set Mask for DRQ\r
252                 OUT DMA1RCmdWbm, AL\r
253                 MOV AL, 00000011b               ; CH3\r
254                 OR  AL, BL                              ; OR with MODE\r
255                 OUT DMA1Mode, AL\r
256                 OUT DMA1FF, AL                  ; Clear FlipFLop (Val in AL irrelevent)\r
257                 MOV EAX, [EBP+28]               ; dPhyMem\r
258                 OUT DMA13Add, AL                ; Lo byte address\r
259                 SHR EAX, 8\r
260                 OUT DMA13Add, AL                ; Hi Byte\r
261                 SHR EAX, 8\r
262                 OUT DMAPage3, AL                ; Highest byte (to page register)\r
263                 MOV EAX, [EBP+24]               ; sdMem\r
264                 DEC EAX\r
265                 OUT DMA13Cnt, AL\r
266                 SHR EAX, 8\r
267                 OUT DMA13Cnt, AL\r
268                 MOV AL, 00000011b               ; channel 3 Clear Mask for DRQ\r
269                 OUT DMA1RcmdWbm, AL\r
270                 STI\r
271                 XOR EAX, EAX\r
272                 JMP DMAEnd\r
273 \r
274 ;NOTE: DMA channels 5-7 are on DMA2 and numbered 1-3 for chip select purposes\r
275 \r
276 DMA5:\r
277                 CLI\r
278                 MOV AL, 00000101b               ; channel 1 DMA2 Set Mask for DRQ\r
279                 OUT DMA2RCmdWbm, AL\r
280                 MOV AL, 00000001b               ; CH1 on DMA 2\r
281                 OR  AL, BL                              ; OR with MODE\r
282                 OUT DMA2Mode, AL\r
283                 OUT DMA2FF, AL                  ; Clear FlipFLop (Val in AL irrelevent)\r
284                 MOV EAX, [EBP+28]               ; dPhyMem\r
285                 MOV EBX, EAX                    ; Save EBX for page\r
286                 AND EAX, 0FFFFh                 ; Rid of all but lower 16\r
287                 SHR EAX, 1                              ; DIV by 2 for WORD Xfer (bits 16-1)\r
288                 OUT DMA21Add, AL                ; Lo byte address\r
289                 SHR EAX, 8\r
290                 OUT DMA21Add, AL                ; Hi Byte\r
291                 MOV EAX, EBX\r
292                 SHR EAX, 15                             ; We only need 23-17 for the page\r
293                 OUT DMAPage5, AL                ; Highest byte (to page register)\r
294                 MOV EAX, [EBP+24]               ; sdMem\r
295                 SHR EAX, 1                              ; DIV by 2 for WORD Xfer\r
296                 DEC EAX                                 ; One less word\r
297                 OUT DMA21Cnt, AL\r
298                 SHR EAX, 8\r
299                 OUT DMA21Cnt, AL\r
300                 MOV AL, 00000001b               ; channel 1 Clear Mask for DRQ\r
301                 OUT DMA2RcmdWbm, AL\r
302                 STI\r
303                 XOR EAX, EAX\r
304                 JMP DMAEnd\r
305 ;\r
306 DMA6:\r
307                 CLI\r
308                 MOV AL, 00000110b               ; channel 2 Set Mask for DRQ\r
309                 OUT DMA2RCmdWbm, AL\r
310                 MOV AL, 00000010b               ; CH2 on DMA 2\r
311                 OR  AL, BL                              ; OR with MODE\r
312                 OUT DMA2Mode, AL\r
313                 OUT DMA2FF, AL                  ; Clear FlipFLop (Val in AL irrelevent)\r
314                 MOV EAX, [EBP+28]               ; dPhyMem\r
315                 MOV EBX, EAX\r
316                 AND EAX, 0FFFFh                 ; Rid of all but lower 16\r
317                 SHR EAX, 1                              ; DIV by 2 for WORD Xfer\r
318                 OUT DMA22Add, AL                ; Lo byte address\r
319                 SHR EAX, 8\r
320                 OUT DMA22Add, AL                ; Hi Byte\r
321                 MOV EAX, EBX\r
322                 SHR EAX, 15\r
323                 OUT DMAPage6, AL                ; Highest byte (to page register)\r
324                 MOV EAX, [EBP+24]               ; sdMem\r
325                 SHR EAX, 1                              ; DIV by 2 for WORD Xfer\r
326                 DEC EAX\r
327                 OUT DMA22Cnt, AL\r
328                 SHR EAX, 8\r
329                 OUT DMA22Cnt, AL\r
330                 MOV AL, 00000010b               ; channel 2 Clear Mask for DRQ\r
331                 OUT DMA2RcmdWbm, AL\r
332                 STI\r
333                 XOR EAX, EAX\r
334                 JMP DMAEnd\r
335 ;\r
336 DMA7:\r
337         CLI\r
338                 MOV AL, 00000111b               ; channel 3 Set Mask for DRQ\r
339                 OUT DMA2RCmdWbm, AL\r
340                 MOV AL, 00000011b               ; CH3 on DMA 2\r
341                 OR  AL, BL                              ; OR with MODE\r
342                 OUT DMA2Mode, AL\r
343         OUT DMA2FF, AL                  ; Clear FlipFLop (Val in AL irrelevent)\r
344                 MOV EAX, [EBP+28]               ; dPhyMem\r
345                 MOV EBX, EAX\r
346                 AND EAX, 0FFFFh                 ; Rid of all but lower 16\r
347                 SHR EAX, 1                              ; DIV by 2 for WORD Xfer\r
348                 OUT DMA23Add, AL                ; Lo byte address\r
349                 SHR EAX, 8\r
350                 OUT DMA23Add, AL                ; Hi Byte\r
351                 MOV EAX, EBX\r
352                 SHR EAX, 15\r
353                 OUT DMAPage6, AL                ; Highest byte (to page register)\r
354                 MOV EAX, [EBP+24]               ; sdMem\r
355                 SHR EAX, 1                              ; DIV by 2 for WORD Xfer\r
356                 DEC EAX\r
357                 OUT DMA23Cnt, AL\r
358                 SHR EAX, 8\r
359                 OUT DMA23Cnt, AL\r
360                 MOV AL, 00000011b               ; channel 3 Clear Mask for DRQ\r
361                 OUT DMA2RcmdWbm, AL\r
362                 STI\r
363                 XOR EAX, EAX\r
364 DMAEnd:\r
365                 MOV ESP,EBP             ;\r
366                 POP EBP                 ;\r
367                 RETF 20                 ; 20 bytes of crap to dump\r
368 \r
369 ;------------------------------------------------------------\r
370 ; GetDMACount returns the number of bytes or words left in the\r
371 ; DMA count register for the channel specified.  For channels\r
372 ; 5-7 this will be the number of WORDS. For 0-3 this will be BYTES!\r
373 ; Programmers should note (I should tell them) this value will read\r
374 ; one less byte/word than is really in the channel. This is because\r
375 ; 0 = 1 for set purposes. to move 64K, you actually set the\r
376 ; channel 65,535.\r
377 ;\r
378 ;       GetDMACount(dChannel, pwCountRet)\r
379 ;          EBP+     16        12\r
380 ;\r
381 ;       dChannel (0,1,2,3,5,6,7)\r
382 ;       pwCountRet is a pointer to a Word (2 byte unsigned value) where\r
383 ;       the count will be returned. The count is number of WORDS-1\r
384 ;       for channels 5-7 and BYTES-1 for channels 0-3.\r
385 \r
386 PUBLIC __GetDMACount:\r
387                 PUSH EBP                        ;\r
388                 MOV EBP,ESP             ;\r
389                 MOV EAX, [EBP+16]               ;Channel\r
390                 MOV ESI, [EBP+12]               ;Return address for count\r
391 DMACSelect:\r
392                 CMP EAX, 0                              ;\r
393                 JNE SHORT DMAC1\r
394                 MOV DX, DMA10Cnt                ;\r
395                 JMP SHORT DMACDoIt\r
396 DMAC1:\r
397                 CMP EAX, 1\r
398                 JNE SHORT DMAC2\r
399                 MOV DX, DMA11Cnt                ;\r
400                 JMP SHORT DMACDoIt\r
401 DMAC2:\r
402                 CMP EAX, 2\r
403                 JNE SHORT DMAC3\r
404                 MOV DX, DMA12Cnt                ;\r
405                 JMP SHORT DMACDoIt\r
406 DMAC3:\r
407                 CMP EAX, 3\r
408                 JNE SHORT DMAC5\r
409                 MOV DX, DMA13Cnt                ;\r
410                 JMP SHORT DMACDoIt\r
411 DMAC5:\r
412                 CMP EAX, 5\r
413                 JNE SHORT DMAC6\r
414                 MOV DX, DMA21Cnt                ;\r
415                 JMP SHORT DMACDoIt\r
416 DMAC6:\r
417                 CMP EAX, 6\r
418                 JNE SHORT DMAC7\r
419                 MOV DX, DMA22Cnt                ;\r
420                 JMP SHORT DMACDoIt\r
421 DMAC7:\r
422                 MOV DX, DMA23Cnt                ;\r
423                 CMP EAX, 7\r
424                 JE SHORT DMACDoIt\r
425                 MOV EAX, ErcDMAChannel  ;No such channel!\r
426                 MOV ESP,EBP             ;\r
427                 POP EBP                 ;\r
428                 RETF 8                  ; 20 bytes of junk to dump\r
429 \r
430 DMACDoIt:\r
431                 CLI\r
432                 IN  AL,DX               ;\r
433                 MOV CL,AL               ;\r
434                 IN  AL,DX               ;\r
435                 MOV CH,AL               ;CX has words/bytes left in DMA\r
436                 STI                                             ;\r
437                 MOV WORD PTR [ESI], CX                  ;\r
438                 XOR EAX, EAX                    ; No Error\r
439                 MOV ESP,EBP             ;\r
440                 POP EBP                 ;\r
441                 RETF 8                  ; 8 bytes to dump from the stack\r
442 \r
443 ;=========== module end ==============\r