]> pd.if.org Git - mmurtl/blob - ossource/intcode.asm
autocommit for file dated 2003-12-29 17:36:54
[mmurtl] / ossource / intcode.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 .INCLUDE MOSEDF.INC\r
6 \r
7 .CODE\r
8 ;=============================================================================\r
9 ; Set8259\r
10 ; This sets IRQ00-0F vectors in the 8259s\r
11 ; to be Int20 thru 2F.\r
12 ;\r
13 ; When the PICUs are initialized, all the hardware interrupts are MASKED.\r
14 ; Each driver that uses a hardware interrupt(s) is responsible\r
15 ; for unmasking that particular IRQ.\r
16 ;\r
17 PICU1          EQU 0020h\r
18 PICU2          EQU 00A0h\r
19 \r
20 PUBLIC Set8259:\r
21                 MOV AL,00010001b\r
22                 OUT PICU1+0,AL                  ;ICW1 - MASTER\r
23                 PUSH EAX\r
24                 POP EAX\r
25                 OUT PICU2+0,AL                  ;ICW1 - SLAVE\r
26                 PUSH EAX\r
27                 POP EAX\r
28                 MOV AL,20h\r
29                 OUT PICU1+1,AL                  ;ICW2 - MASTER\r
30                 PUSH EAX\r
31                 POP EAX\r
32                 MOV AL,28h\r
33                 OUT PICU2+1,AL                  ;ICW2 - SLAVE\r
34                 PUSH EAX\r
35                 POP EAX\r
36                 MOV AL,00000100b\r
37                 OUT PICU1+1,AL                  ;ICW3 - MASTER\r
38                 PUSH EAX\r
39                 POP EAX\r
40                 MOV AL,00000010b\r
41                 OUT PICU2+1,AL                  ;ICW3 - SLAVE\r
42                 PUSH EAX\r
43                 POP EAX\r
44                 MOV AL,00000001b\r
45                 OUT PICU1+1,AL                  ;ICW4 - MASTER\r
46                 PUSH EAX\r
47                 POP EAX\r
48                 OUT PICU2+1,AL                  ;ICW4 - SLAVE\r
49                 PUSH EAX\r
50                 POP EAX\r
51                 MOV AL,11111010b                        ;Masked all but cascade/timer\r
52 ;               MOV AL,01000000b                        ;Floppy masked\r
53                 OUT PICU1+1,AL                  ;MASK - MASTER (0= Ints ON)\r
54                 PUSH EAX\r
55                 POP EAX\r
56                 MOV AL,11111111b\r
57 ;               MOV AL,00000000b\r
58                 OUT PICU2+1,AL                  ;MASK - SLAVE\r
59                 PUSH EAX\r
60                 POP EAX\r
61                 RETN\r
62 \r
63 ;=====================================================\r
64 ;The following PUBLIC FAR calls support ISR operations:\r
65 ;\r
66 ; SetIRQVector(IRQnum, pVector)\r
67 ; GetIRQVector(IRQnum, pVectorRet)\r
68 ; EndOfIRQ(IRQnum)\r
69 ; MaskIRQ(IRQnum)\r
70 ; UnMaskIQR(IRQnum)\r
71 ;\r
72 ; In each case, IRQnum is the hardware interrupt request number for the\r
73 ; IRQ served. This will be 0-7 for interrupts on 8259 #1 and 8-15 for\r
74 ; interrupts on 8259 #2.  The predetermined IRQ uses are:\r
75 ;\r
76 ;       IRQ 0   8254 Timer\r
77 ;       IRQ 1   Keyboard (8042)\r
78 ;       IRQ 2   Cascade from PICU2 (handled internally)\r
79 ;       IRQ 3   COMM 2 Serial port\r
80 ;       IRQ 4   COMM 1 Serial port\r
81 ;       IRQ 5   Line Printer 2\r
82 ;       IRQ 6   Floppy disk controller\r
83 ;       IRQ 7   Line Printer 1\r
84 ;\r
85 ;       IRQ 8   CMOS Clock\r
86 ;       IRQ 9   ?\r
87 ;       IRQ 10  ?\r
88 ;       IRQ 11  ?\r
89 ;       IRQ 12  ?\r
90 ;       IRQ 13  Math coprocessor\r
91 ;       IRQ 14  Hard disk controller\r
92 ;       IRQ 15  ?\r
93 \r
94 ;=============================================================================\r
95 ;\r
96 ; SetIntVector(IRQNum, pISR)\r
97 ; This sets a 32 bit offset for an interrupt handler\r
98 ; that services one of the hardware interrupts. (0-15)\r
99 ; The ISR MUST reside in the OS Code segment. This means that only\r
100 ; device drivers or the OS can set and service interrupts!!\r
101 ; The DPL is set to 3 (all code can be hardware interrupted).\r
102 ;\r
103 PUBLIC __SetIRQVector:\r
104                 PUSH EBP\r
105                 MOV EBP, ESP\r
106                 MOV ECX, [EBP+16]               ;Get IRQ number (0-15)\r
107                 AND ECX, 0Fh                    ;0 to 15 max!\r
108                 ADD ECX, 20h                    ;INT number is set for IRQ\r
109                 MOV EAX, 08E00h                 ;Int gate description\r
110                 MOV EBX, OSCodeSel              ;\r
111                 MOV ESI, [EBP+12]               ;\r
112                 CALL FWORD PTR _AddIDTGate ;\r
113                 MOV ESP,EBP\r
114                 POP EBP\r
115                 RETF 8                   ;\r
116 \r
117 ;=============================================================================\r
118 ;\r
119 ; GetIntVector(IRQNum, pVectorRet)\r
120 ; This returns the vector (offset) of the ISR that is currently\r
121 ; serving the IRQ.\r
122 ;\r
123 PUBLIC __GetIRQVector:\r
124                 PUSH EBP\r
125                 MOV EBP, ESP\r
126                 MOV ESP,EBP\r
127                 POP EBP\r
128                 RETF 8                   ;\r
129 \r
130 ;=============================================================================\r
131 ;\r
132 ; Sends End Of Interrupt to PICU (or Both) based on IRQ number (0-15)\r
133 ; If IRQnum is 0-7 then we send to 1, else we send to 1 then 2.\r
134 ;\r
135 PUBLIC __EndOfIRQ:\r
136                 PUSH EBP\r
137                 MOV EBP, ESP\r
138                 PUSH EAX                                ;\r
139                 MOV EAX, [EBP+0Ch]              ;Get IRQ number (0-15)\r
140                 MOV AH, AL\r
141                 MOV AL,20h              ;\r
142                 OUT PICU1,AL            ;\r
143                 CMP AH, 7                               ;PICU1 only?\r
144                 JBE     EOI00                           ;Yes\r
145                 OUT PICU2,AL            ;Send to 2 also\r
146 EOI00:\r
147                 POP EAX                 ;\r
148                 MOV ESP,EBP\r
149                 POP EBP\r
150                 RETF 4                  ;\r
151 \r
152 ;===============================================\r
153 ; MaskIRQ(IRQnum)  masks the IRQ number specified (0-15).\r
154 ; The proper PICU is selected based on the IRQ number.\r
155 ;\r
156 PUBLIC __MaskIRQ:\r
157                 PUSH EBP\r
158                 MOV EBP, ESP\r
159                 PUSHFD\r
160                 CLI\r
161                 PUSH EAX                                ;\r
162                 PUSH ECX\r
163                 MOV EAX, 1\r
164                 MOV ECX, [EBP+0Ch]              ;Get IRQ number (0-15)\r
165                 AND ECX, 0Fh                    ;(0-15)\r
166                 SHL EAX, CL                             ;Set the bit for the IRQ (0-7) or (8-15)\r
167                 AND AL,AL\r
168                 JZ MIRQ2\r
169                 MOV AH,AL\r
170                 IN AL, PICU1+1\r
171                 PUSH EAX\r
172                 POP EAX\r
173                 OR AL, AH\r
174                 OUT PICU1+1, AL\r
175                 JMP SHORT MIRQEnd\r
176 MIRQ2:\r
177                 IN AL, PICU2+1                  ;AH already has correct value\r
178                 PUSH EAX\r
179                 POP EAX\r
180                 OR AL, AH\r
181                 OUT PICU2+1, AL\r
182 MIRQEnd:\r
183                 POP ECX                 ;\r
184                 POP EAX                 ;\r
185                 POPFD                                   ;Give em their flags back\r
186                 MOV ESP,EBP\r
187                 POP EBP\r
188                 RETF 4                  ;\r
189 ;===============================================\r
190 ; UnMaskIRQ(IRQnum)  UNmasks the IRQ number specified (0-15).\r
191 ; The proper PICU is selected based on the IRQ number.\r
192 ;\r
193 PUBLIC __UnMaskIRQ:\r
194                 PUSH EBP\r
195                 MOV EBP, ESP\r
196                 PUSHFD\r
197                 CLI                                             ;Previous state is reset on POPFD\r
198                 PUSH EAX                                ;\r
199                 PUSH ECX\r
200                 MOV EAX,1\r
201                 MOV ECX,[EBP+0Ch]               ;Get IRQ number (0-15)\r
202                 AND ECX, 0Fh                    ; (0-15 only)\r
203                 SHL EAX, CL                             ;Set the bit for the IRQ (0-7)\r
204                 AND AL,AL\r
205                 JZ UMIRQ2\r
206                 MOV AH, AL\r
207                 IN AL, PICU1+1\r
208                 PUSH EAX\r
209                 POP EAX\r
210                 NOT AH\r
211                 AND AL, AH\r
212                 OUT PICU1+1, AL\r
213                 JMP SHORT UMIRQEnd\r
214 UMIRQ2:\r
215                 IN AL, PICU2+1\r
216                 PUSH EAX\r
217                 POP EAX\r
218                 NOT AH\r
219                 AND AL, AH\r
220                 OUT PICU2+1, AL\r
221 UMIRQEnd:\r
222                 POP ECX                 ;\r
223                 POP EAX                 ;\r
224                 POPFD\r
225                 MOV ESP,EBP\r
226                 POP EBP\r
227                 RETF 4                  ;\r
228 ;\r
229 ;===== Module End ================\r