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
14 EXTRN IntDivBy0 NEAR
\r
17 EXTRN IntOverFlow NEAR
\r
18 EXTRN INTOpCode NEAR
\r
19 EXTRN IntDblExc NEAR
\r
20 EXTRN INTInvTss NEAR
\r
22 EXTRN INTStkOvr NEAR
\r
27 EXTRN IntKeyBrd NEAR
\r
29 ;=============================================================================
\r
30 ;The following code initializes structures just after bootup
\r
31 ;=============================================================================
\r
35 ; REGISTERS : EAX,EBX,ECX,FLAGS
\r
36 ; MODIFIES : pFreeLB,rgLBs
\r
38 ; This routine will initialize a free pool of link blocks.
\r
39 ; The data used in this algorithm are an array of ECX link blocks (rgLBs),
\r
40 ; each EDX bytes long and pointer to a list of free link blocks (pFreeLB).
\r
42 ; The pFreeLB pointer is set to address the first element in rgLBs. Each
\r
43 ; element of rgLBs is set to point to the next element of rgLBs. The
\r
44 ; last element of rgLBs is set to point to nothing (NIL).
\r
47 LEA EAX,rgLBs ; pFreeLB <= ^rgLBs;
\r
50 MOV EBX,EAX ; for I = 0 TO ECX
\r
51 ADD EAX,EDX ; rgLBs[I].Next <=
\r
52 MOV [EBX+NextLB],EAX ; ^rgLBs[I+1];
\r
54 MOV DWORD PTR [EBX+NextLB], 0 ; rgFree[1023].Next <= NIL;
\r
56 ;=============================================================================
\r
58 ; Builds a descriptor for a task and places it in the GDT. If you
\r
59 ; check the intel documentation the bits of data that hold this
\r
60 ; information are scattered through the descriptor entry, so
\r
61 ; we have to do some shifting, moving, anding and oring to get
\r
62 ; the descriptor the way the processor expects it. See the Intel
\r
63 ; docs for a complete description of the placement of the bits.
\r
65 ; Note: The granularity bit represents the TSS itself, not the code
\r
66 ; that will run under it!
\r
71 ; EBX - Decriptor type (default for OS TSS is 0089h)
\r
72 ; (0089h - G(0),AV(0),LIM(0000),P(1),DPL(00),(010),B(0),(1))
\r
73 ; EDX - Address of TSS
\r
74 ; EDI - Address of Desc in GDT
\r
76 ; GDT is updated with descriptor
\r
78 ; EFlags (all other registers are saved)
\r
81 ;The following code section builds a descriptor entry for
\r
82 ;the TSS and places it into the GDT
\r
87 DEC EAX ; (Limit is size of TSS-1)
\r
88 SHL EBX,16 ; Chinese puzzle rotate
\r
89 ROL EDX,16 ; Exchange hi & lo words of Base Addr
\r
90 MOV BL,DH ; Base 31 .. 24
\r
91 MOV BH,DL ; Base 23 .. 16
\r
92 ROR EBX,8 ; Rotate to Final Alignment
\r
93 MOV DX,AX ; Limit 15 .. 0 with Base 15 .. 0
\r
94 AND EAX,000F0000h ; Mask Limit 19 .. 16
\r
95 OR EBX,EAX ; OR into high order word
\r
96 MOV [EDI],EDX ; Store lo double word
\r
97 MOV [EDI+4],EBX ; Store hi double word
\r
104 ;=============================================================================
\r
108 ; USED : ALL General registers, FLAGS
\r
109 ; MODIFIES : pFreeTSS (and the dynamic array of TSSs)
\r
111 ; This routine initializes the free pool of Task State Segments.
\r
113 ; EAX points to the TSSs to initialize (allocated memory).
\r
114 ; ECX has the count of TSSs to initialize.
\r
115 ; The size of the TSS is taken from the constant sTSS.
\r
117 ; The pFreeTSS pointer is set to address the first TSS. The NextTSS
\r
118 ; field in each TSS is set to point to the next free TSS. The
\r
119 ; last TSS is set to point to nothing (NIL). The IOBitBase field is
\r
120 ; also set to FFFFh for NULL I/O permissions in each TSS.
\r
121 ; NOTE: The allocated memory area for the TSS MUST BE ZEROED before
\r
122 ; calling this routine. By deafult, we add the TSS descriptors at OS
\r
123 ; protection level. If we spawn or add a User level TSS we must
\r
124 ; OR the DPL bits with 3!
\r
126 PUBLIC InitFreeTSS:
\r
127 MOV pFreeTSS,EAX ; First one free to use
\r
128 MOV EDI, OFFSET rgTSSDesc ; ptr to TSS descriptors
\r
129 ADD EDI, 16 ; First two TSSs are Static (Mon & Dbgr)
\r
130 MOV EDX, sTSS ; Size of TSS (in bytes) into EDX
\r
131 MOV EBX, 3 ; Number of first dynamic TSS
\r
133 MOV ESI,EAX ; for I = 0 TO ECX
\r
134 ADD EAX,EDX ; EAX <= rgTSSs[I].Next
\r
135 MOV [ESI+NextTSS],EAX ; ^rgTSSs[I+1];
\r
136 MOV WORD PTR [ESI+TSS_IOBitBase], 0FFFFh ; IOBitBase
\r
137 MOV [ESI+TSSNum], BX ; TSS Number
\r
138 MOV WORD PTR [ESI+TSS_DS], DataSel ;Set up for Data Selectors
\r
139 MOV WORD PTR [ESI+TSS_ES], DataSel
\r
140 MOV WORD PTR [ESI+TSS_FS], DataSel
\r
141 MOV WORD PTR [ESI+TSS_GS], DataSel
\r
142 MOV WORD PTR [ESI+TSS_SS], DataSel
\r
143 MOV WORD PTR [ESI+TSS_SS0], DataSel
\r
144 PUSH EAX ;Save pTSS
\r
145 MOV EAX,EDI ; Get offset of Curr TssDesc in EAX
\r
146 SUB EAX, OFFSET GDT ; Sub offset of GDT Base to get Sel of TSS
\r
147 MOV WORD PTR [ESI+Tid],AX ; Store TSS Selector in TSS (later use)
\r
151 MOV EAX,EDX ; Size of TSS (TSS + SOFTSTATE)
\r
152 MOV EDX,ESI ; Address of TSS
\r
153 MOV EBX,0089h ; G(0),AV(0),LIM(0),P(1),DPL(0),B(0)
\r
157 ADD EDI,8 ; Point to Next GDT Slot (for next one)
\r
161 INC EBX ; TSS Number
\r
163 MOV DWORD PTR [ESI+NextTSS], 0 ; rgFree[LastOne].Next <= NIL;
\r
166 ;=============================================================================
\r
167 ; DUMMY CALL for uninitialized GDT call gate slots
\r
168 ;=============================================================================
\r
171 MOV EAX, ercBadCallGate
\r
175 ;=============================================================================
\r
176 ; InitCallGates inits the array of call gates with an entry to a generic
\r
177 ; handler that returns ErcNotInstalled when called. This prevents new code
\r
178 ; running on old MMURTLs or systems where special call gates don't exist
\r
179 ; without crashing too horribly.
\r
183 ; Used : ALL registers and flags
\r
185 PUBLIC InitCallGates:
\r
187 ;First we set up all call gates to point to a
\r
190 MOV ECX, nCallGates ;Number of callgates to init
\r
192 PUSH ECX ;Save nCallGates
\r
193 DEC ECX ;make it an index, not the count
\r
195 ADD ECX, 40h ;Now ecx is selector number
\r
196 MOV EAX, 0EC00h ;DPL 3, 0 Params
\r
198 MOV ESI, OFFSET DummyCall
\r
200 ;Same code as in PUBLIC AddCallGate
\r
202 SUB EBX, 40 ;sub call gate base selector
\r
203 SHR EBX, 3 ;make index vice selector
\r
204 MOVZX EBX, CX ;Extend selector into EBX
\r
205 ADD EBX, GDTBase ;NOW a true offset in GDT
\r
206 MOV WORD PTR [EBX+02], 8 ;Put Code Seg selector into Call gate
\r
207 MOV [EBX], SI ;0:15 of call offset
\r
208 SHR ESI, 16 ;move upper 16 of offset into SI
\r
209 MOV [EBX+06], SI ;16:31 of call offset
\r
210 MOV [EBX+04], AX ;call DPL & ndParams
\r
212 POP ECX ;ignore error...
\r
213 LOOP InitCG01 ;This decrements ECX till 0
\r
215 ;Another chicken and egg here.. In order to be able
\r
216 ;to call the FAR PUBLIC "AddCallGate" though a callgate,
\r
217 ;we have to add it as a callgate... ok....
\r
219 MOV EAX, 08C00h ;AddCallGate -- 0 DWord Params DPL 0
\r
222 MOV ESI, OFFSET __AddCallGate
\r
223 ;Same code as in PUBLIC AddCallGate
\r
225 SUB EBX, 40 ;sub call gate base selector
\r
226 SHR EBX, 3 ;make index vice selector
\r
227 MOVZX EBX, CX ;Extend selector into EBX
\r
228 ADD EBX, GDTBase ;NOW a true offset in GDT
\r
229 MOV WORD PTR [EBX+02], 8 ;Put Code Seg selector into Call gate
\r
230 MOV [EBX], SI ;0:15 of call offset
\r
231 SHR ESI, 16 ;move upper 16 of offset into SI
\r
232 MOV [EBX+06], SI ;16:31 of call offset
\r
233 MOV [EBX+04], AX ;call DPL & ndParams
\r
236 ;=============================================================================
\r
238 ; First, inits the IDT with 256 entries to a generic
\r
239 ; handler that does nothing (except IRETD) when called.
\r
240 ; Second, adds each of the basic IDT entries for included
\r
241 ; software and hardware interrupt handlers.
\r
242 ; ISRs loaded with device drivers must use SetIRQVector.
\r
246 ; Used : ALL registers and flags
\r
249 MOV ECX, 255 ;Last IDT Entry
\r
252 MOV EAX, 08F00h ;DPL 3, TRAP GATE
\r
254 MOV ESI, OFFSET IntQ
\r
255 CALL FWORD PTR _AddIDTGate
\r
259 ;Now we add each of the known interrupts
\r
261 MOV ECX, 0 ;Divide By Zero
\r
262 MOV EAX, 08F00h ;DPL 3, TRAP GATE
\r
263 MOV EBX, OSCodeSel ;
\r
264 MOV ESI, OFFSET IntDivBy0
\r
265 CALL FWORD PTR _AddIDTGate
\r
267 MOV ECX, 1 ;Single Step
\r
268 MOV EAX, 08F00h ;DPL 3, Trap gate
\r
269 MOV EBX, OSCodeSel ;
\r
270 MOV ESI, Offset IntDbgSS
\r
271 CALL FWORD PTR _AddIDTGate
\r
273 ;Trying 8E00 (Int gate vice trap gate which leaves Ints disabled)
\r
275 MOV ECX, 3 ;Breakpoint
\r
276 MOV EAX, 08F00h ;DPL 3, Trap Gate (for Debugger) WAS 8F00
\r
277 MOV EBX, OSCodeSel ;This will be filled in with TSS of Dbgr later
\r
278 MOV ESI, OFFSET IntDebug
\r
279 CALL FWORD PTR _AddIDTGate
\r
281 MOV ECX, 4 ;Overflow
\r
282 MOV EAX, 08F00h ;DPL 3, TRAP GATE
\r
283 MOV EBX, OSCodeSel ;
\r
284 MOV ESI, OFFSET IntOverFlow
\r
285 CALL FWORD PTR _AddIDTGate
\r
287 MOV ECX, 6 ;Invalid OPcode
\r
288 MOV EAX, 08F00h ;DPL 3, TRAP GATE
\r
289 MOV EBX, OSCodeSel ;
\r
290 MOV ESI, OFFSET IntOpCode
\r
291 CALL FWORD PTR _AddIDTGate
\r
293 MOV ECX, 8 ;Double Exception
\r
294 MOV EAX, 08F00h ;DPL 3, TRAP GATE
\r
295 MOV EBX, OSCodeSel ;
\r
296 MOV ESI, OFFSET IntDblExc
\r
297 CALL FWORD PTR _AddIDTGate
\r
299 MOV ECX, 0Ah ;Invalid TSS
\r
300 MOV EAX, 08F00h ;DPL 3, TRAP GATE
\r
301 MOV EBX, OSCodeSel ;
\r
302 MOV ESI, OFFSET IntInvTSS
\r
303 CALL FWORD PTR _AddIDTGate
\r
305 MOV ECX, 0Bh ;Seg Not Present
\r
306 MOV EAX, 08F00h ;DPL 3, TRAP GATE
\r
307 MOV EBX, OSCodeSel ;
\r
308 MOV ESI, OFFSET IntNoSeg
\r
309 CALL FWORD PTR _AddIDTGate
\r
311 MOV ECX, 0Ch ;Int Stack Overflow
\r
312 MOV EAX, 08F00h ;DPL 3, TRAP GATE
\r
313 MOV EBX, OSCodeSel ;
\r
314 MOV ESI, OFFSET IntStkOvr
\r
315 CALL FWORD PTR _AddIDTGate
\r
317 MOV ECX, 0Dh ;GP fault
\r
318 MOV EAX, 08F00h ;DPL 3, TRAP GATE
\r
319 MOV EBX, OSCodeSel ;
\r
320 MOV ESI, OFFSET IntGP
\r
321 CALL FWORD PTR _AddIDTGate
\r
323 MOV ECX, 0Eh ;Int Page Fault
\r
324 MOV EAX, 08F00h ;DPL 3, TRAP GATE
\r
325 MOV EBX, OSCodeSel ;
\r
326 MOV ESI, OFFSET IntPgFlt
\r
327 CALL FWORD PTR _AddIDTGate
\r
329 MOV ECX, 20h ;Int TIMER IRQ0
\r
330 MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
\r
331 MOV EBX, OSCodeSel ;
\r
332 MOV ESI, OFFSET IntTimer
\r
333 CALL FWORD PTR _AddIDTGate
\r
335 MOV ECX, 21h ;Int KEYBOARD IRQ1
\r
336 MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
\r
337 MOV EBX, OSCodeSel ;
\r
338 MOV ESI, OFFSET IntKeyBrd
\r
339 CALL FWORD PTR _AddIDTGate
\r
341 MOV ECX, 22h ;Int PICU 2 (from PICU) IRQ2
\r
342 MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
\r
343 MOV EBX, OSCodeSel ;
\r
344 MOV ESI, OFFSET IntPICU2
\r
345 CALL FWORD PTR _AddIDTGate
\r
347 MOV ECX, 23h ;Int COM2 IRQ3
\r
348 MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
\r
349 MOV EBX, OSCodeSel ;
\r
350 MOV ESI, OFFSET IntQ
\r
351 CALL FWORD PTR _AddIDTGate
\r
353 MOV ECX, 24h ;Int COM1 IRQ4
\r
354 MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
\r
355 MOV EBX, OSCodeSel ;
\r
356 MOV ESI, OFFSET IntQ
\r
357 CALL FWORD PTR _AddIDTGate
\r
359 MOV ECX, 25h ;Int LPT2 IRQ5
\r
360 MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
\r
361 MOV EBX, OSCodeSel ;
\r
362 MOV ESI, OFFSET IntQ
\r
363 CALL FWORD PTR _AddIDTGate
\r
365 MOV ECX, 26h ;Int Floppy IRQ6
\r
366 MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
\r
367 MOV EBX, OSCodeSel ;
\r
368 MOV ESI, OFFSET IntQ ;FDD will set this himself
\r
369 CALL FWORD PTR _AddIDTGate
\r
371 MOV ECX, 27h ;Int .......... IRQ7
\r
372 MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
\r
373 MOV EBX, OSCodeSel ;
\r
374 MOV ESI, OFFSET IntQ
\r
375 CALL FWORD PTR _AddIDTGate
\r
377 MOV ECX, 28h ;Int .......... IRQ8
\r
378 MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
\r
379 MOV EBX, OSCodeSel ;
\r
380 MOV ESI, OFFSET IntQ
\r
381 CALL FWORD PTR _AddIDTGate
\r
383 MOV ECX, 29h ;Int .......... IRQ9
\r
384 MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
\r
385 MOV EBX, OSCodeSel ;
\r
386 MOV ESI, OFFSET IntQ
\r
387 CALL FWORD PTR _AddIDTGate
\r
389 MOV ECX, 2Ah ;Int .......... IRQ10
\r
390 MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
\r
391 MOV EBX, OSCodeSel ;
\r
392 MOV ESI, OFFSET IntQ
\r
393 CALL FWORD PTR _AddIDTGate
\r
395 MOV ECX, 2Bh ;Int .......... IRQ11
\r
396 MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
\r
397 MOV EBX, OSCodeSel ;
\r
398 MOV ESI, OFFSET IntQ
\r
399 CALL FWORD PTR _AddIDTGate
\r
401 MOV ECX, 2Ch ;Int .......... IRQ12
\r
402 MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
\r
403 MOV EBX, OSCodeSel ;
\r
404 MOV ESI, OFFSET IntQ
\r
405 CALL FWORD PTR _AddIDTGate
\r
407 MOV ECX, 2Dh ;Int .......... IRQ13
\r
408 MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
\r
409 MOV EBX, OSCodeSel ;
\r
410 MOV ESI, OFFSET IntQ
\r
411 CALL FWORD PTR _AddIDTGate
\r
413 MOV ECX, 2Eh ;Int .......... IRQ14
\r
414 MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
\r
415 MOV EBX, OSCodeSel ;
\r
416 MOV ESI, OFFSET IntQ
\r
417 CALL FWORD PTR _AddIDTGate
\r
419 MOV ECX, 2Fh ;Int .......... IRQ15
\r
420 MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
\r
421 MOV EBX, OSCodeSel ;
\r
422 MOV ESI, OFFSET IntQ
\r
423 CALL FWORD PTR _AddIDTGate
\r
427 ;=============================================================================
\r
428 ; InitOSPublics adds all OS primitives to the array of call gates. This can't
\r
429 ; before initcallgates, but MUST be called before the first far call to any
\r
430 ; OS primitive thorugh a call gate!!!
\r
431 ; IF YOU ADD AN OS PUBLIC MAKE SURE IT GETS PUT HERE!!!!!
\r
435 ; Used : ALL registers and flags
\r
437 PUBLIC InitOSPublics:
\r
439 MOV EAX, 0EC02h ;WaitMsg -- 2 DWord Params, DPL 3
\r
442 MOV ESI, OFFSET __WaitMsg
\r
443 CALL FWORD PTR _AddCallGate
\r
445 MOV EAX, 0EC03h ;SendMsg -- 3 DWord Params, DPL 3
\r
448 MOV ESI, OFFSET __SendMsg
\r
449 CALL FWORD PTR _AddCallGate
\r
451 MOV EAX, 08C03h ;ISendMsg -- 3 DWord params, DPL 0
\r
454 MOV ESI, OFFSET __ISendMsg
\r
455 CALL FWORD PTR _AddCallGate
\r
457 MOV EAX, 0EC01h ;Set Priority - 1Dword param, DPL 3
\r
460 MOV ESI, OFFSET __SetPriority
\r
461 CALL FWORD PTR _AddCallGate
\r
463 MOV EAX, 0EC0Ch ;Request -- 12 nDWord params
\r
466 MOV ESI, OFFSET __Request
\r
467 CALL FWORD PTR _AddCallGate
\r
469 MOV EAX, 0EC02h ;Respond -- 2 nDWord params
\r
472 MOV ESI, OFFSET __Respond
\r
473 CALL FWORD PTR _AddCallGate
\r
475 MOV EAX, 0EC02h ;Check -- 2 DWord Params, DPL 3
\r
478 MOV ESI, OFFSET __CheckMsg
\r
479 CALL FWORD PTR _AddCallGate
\r
481 MOV EAX, 0EC07h ;NewTask -- 7 DWord param, DPL 3
\r
484 MOV ESI, OFFSET __NewTask
\r
485 CALL FWORD PTR _AddCallGate
\r
487 MOV EAX, 0EC01h ;AllocExch -- 1 DWord param, DPL 3
\r
490 MOV ESI, OFFSET __AllocExch
\r
491 CALL FWORD PTR _AddCallGate
\r
493 MOV EAX, 0EC01h ;DeAllocExch -- 1 DWord param, DPL 3
\r
496 MOV ESI, OFFSET __DeAllocExch
\r
497 CALL FWORD PTR _AddCallGate
\r
499 MOV EAX, 0EC01h ;Sleep -- 1 DWord param, DPL 3
\r
502 MOV ESI, OFFSET __Sleep
\r
503 CALL FWORD PTR _AddCallGate
\r
505 MOV EAX, 0EC02h ;Alarm -- 2 DWord params, DPL 3
\r
508 MOV ESI, OFFSET __Alarm
\r
509 CALL FWORD PTR _AddCallGate
\r
511 MOV EAX, 0EC02h ;AllocOSPage -- 2 DWord params, DPL 3
\r
514 MOV ESI, OFFSET __AllocOSPage
\r
515 CALL FWORD PTR _AddCallGate
\r
517 MOV EAX, 0EC02h ;AllocPage -- 2 DWord params, DPL 3
\r
520 MOV ESI, OFFSET __AllocPage
\r
521 CALL FWORD PTR _AddCallGate
\r
523 MOV EAX, 0EC02h ;RegisterSvc -- 2 DWord params, DPL 3
\r
526 MOV ESI, OFFSET __RegisterSvc
\r
527 CALL FWORD PTR _AddCallGate
\r
529 MOV EAX, 08C05h ;DMASetUp -- 5 DWord Params DPL 0
\r
532 MOV ESI, OFFSET __DMASetUp
\r
533 CALL FWORD PTR _AddCallGate
\r
535 MOV EAX, 0EC02h ;ReadKBD -- 2 DWord Param DPL 3
\r
538 MOV ESI, OFFSET __ReadKBD
\r
539 CALL FWORD PTR _AddCallGate
\r
541 MOV EAX, 08C00h ;AddCallGate -- 0 DWord Params DPL 0
\r
544 MOV ESI, OFFSET __AddCallGate
\r
545 CALL FWORD PTR _AddCallGate
\r
547 MOV EAX, 08C00h ;AddIDTGate -- 0 DWord Params DPL 0
\r
550 MOV ESI, OFFSET __AddIDTGate
\r
551 CALL FWORD PTR _AddCallGate
\r
553 MOV EAX, 08C01h ;EndOfIRQ -- 1 DWord Params DPL 0
\r
556 MOV ESI, OFFSET __EndOfIRQ
\r
557 CALL FWORD PTR _AddCallGate
\r
559 MOV EAX, 08C01h ;MaskIRQ -- 1 DWord Params DPL 0
\r
562 MOV ESI, OFFSET __MaskIRQ
\r
563 CALL FWORD PTR _AddCallGate
\r
565 MOV EAX, 08C01h ;UnMaskIRQ -- 1 DWord Params DPL 0
\r
568 MOV ESI, OFFSET __UnMaskIRQ
\r
569 CALL FWORD PTR _AddCallGate
\r
571 MOV EAX, 08C02h ;SetIRQVector -- 2 DWord Params DPL 0
\r
574 MOV ESI, OFFSET __SetIRQVector
\r
575 CALL FWORD PTR _AddCallGate
\r
577 MOV EAX, 08C02h ;GetIRQVector -- 2 DWord Params DPL 0
\r
580 MOV ESI, OFFSET __GetIRQVector
\r
581 CALL FWORD PTR _AddCallGate
\r
583 MOV EAX, 08C04h ;InitDevDr -- 4 DWord Params DPL 0
\r
586 MOV ESI, OFFSET __InitDevDr
\r
587 CALL FWORD PTR _AddCallGate
\r
589 MOV EAX, 0EC03h ;DeviceInit -- 3 DWord Params DPL 3
\r
592 MOV ESI, OFFSET __DeviceInit
\r
593 CALL FWORD PTR _AddCallGate
\r
595 MOV EAX, 0EC05h ;DeviceOp -- 5 DWord Params DPL 3
\r
598 MOV ESI, OFFSET __DeviceOp
\r
599 CALL FWORD PTR _AddCallGate
\r
601 MOV EAX, 0EC04h ;DeviceStat -- 4 DWord Params DPL 3
\r
604 MOV ESI, OFFSET __DeviceStat
\r
605 CALL FWORD PTR _AddCallGate
\r
607 MOV EAX, 0EC00h ;Beep -- 0 DWord Params DPL 3
\r
610 MOV ESI, OFFSET __Beep
\r
611 CALL FWORD PTR _AddCallGate
\r
613 MOV EAX, 0EC02h ;Tone -- 2 DWord Params DPL 3
\r
616 MOV ESI, OFFSET __Tone
\r
617 CALL FWORD PTR _AddCallGate
\r
619 MOV EAX, 0EC01h ;KillAlarm -- 1 DWord Params DPL 3
\r
622 MOV ESI, OFFSET __KillAlarm
\r
623 CALL FWORD PTR _AddCallGate
\r
625 MOV EAX, 0EC01h ;MicroDelay -- 1 DWord Params DPL 3
\r
628 MOV ESI, OFFSET __MicroDelay
\r
629 CALL FWORD PTR _AddCallGate
\r
631 MOV EAX, 0EC05h ;SpawnTask -- 5 DWord param, DPL 3
\r
634 MOV ESI, OFFSET __SpawnTask
\r
635 CALL FWORD PTR _AddCallGate
\r
637 MOV EAX, 0EC01h ;GetCMOSTime -- 1 DWord param, DPL 3
\r
640 MOV ESI, OFFSET __GetCMOSTime
\r
641 CALL FWORD PTR _AddCallGate
\r
643 MOV EAX, 0EC01h ;GetTimerTick -- 1 DWord param, DPL 3
\r
646 MOV ESI, OFFSET __GetTimerTick
\r
647 CALL FWORD PTR _AddCallGate
\r
649 MOV EAX, 08C02h ;OutByte -- 2 DWord param, DPL 0
\r
652 MOV ESI, OFFSET __OutByte
\r
653 CALL FWORD PTR _AddCallGate
\r
655 MOV EAX, 08C02h ;OutWord -- 2 DWord param, DPL 0
\r
658 MOV ESI, OFFSET __OutWord
\r
659 CALL FWORD PTR _AddCallGate
\r
661 MOV EAX, 08C02h ;OutDWord -- 2 DWord param, DPL 0
\r
664 MOV ESI, OFFSET __OutDWord
\r
665 CALL FWORD PTR _AddCallGate
\r
667 MOV EAX, 08C01h ;InByte -- 1 DWord param, DPL 0
\r
670 MOV ESI, OFFSET __InByte
\r
671 CALL FWORD PTR _AddCallGate
\r
673 MOV EAX, 08C01h ;InWord -- 1 DWord param, DPL 0
\r
676 MOV ESI, OFFSET __InWord
\r
677 CALL FWORD PTR _AddCallGate
\r
679 MOV EAX, 08C01h ;InDWord -- 1 DWord param, DPL 0
\r
682 MOV ESI, OFFSET __InDWord
\r
683 CALL FWORD PTR _AddCallGate
\r
685 MOV EAX, 0EC01h ;ReadCMOS -- 1 DWord param, DPL 3
\r
688 MOV ESI, OFFSET __ReadCMOS
\r
689 CALL FWORD PTR _AddCallGate
\r
691 MOV EAX, 0EC03h ;CopyData -- 3 DWord param, DPL 3
\r
694 MOV ESI, OFFSET __CopyData
\r
695 CALL FWORD PTR _AddCallGate
\r
697 MOV EAX, 0EC03h ;CopyDataR -- 3 DWord param, DPL 3
\r
700 MOV ESI, OFFSET __CopyDataR
\r
701 CALL FWORD PTR _AddCallGate
\r
703 MOV EAX, 0EC03h ;FillData -- 3 DWord param, DPL 3
\r
706 MOV ESI, OFFSET __FillData
\r
707 CALL FWORD PTR _AddCallGate
\r
709 MOV EAX, 0EC03h ;CompareNCS -- 3 DWord param, DPL 3
\r
712 MOV ESI, OFFSET __CompareNCS
\r
713 CALL FWORD PTR _AddCallGate
\r
715 MOV EAX, 0EC03h ;Compare -- 3 DWord param, DPL 3
\r
718 MOV ESI, OFFSET __Compare
\r
719 CALL FWORD PTR _AddCallGate
\r
721 MOV EAX, 08C03h ;InWords -- 3 DWord param, DPL 0
\r
724 MOV ESI, OFFSET __InWords
\r
725 CALL FWORD PTR _AddCallGate
\r
727 MOV EAX, 08C03h ;OutWords -- 3 DWord param, DPL 0
\r
730 MOV ESI, OFFSET __OutWords
\r
731 CALL FWORD PTR _AddCallGate
\r
733 MOV EAX, 0EC02h ;MoveRequest -- 2 nDWord params DPL 3
\r
736 MOV ESI, OFFSET __MoveRequest
\r
737 CALL FWORD PTR _AddCallGate
\r
739 MOV EAX, 0EC02h ;DeAllocPage -- 2 nDWord params DPL 3
\r
742 MOV ESI, OFFSET __DeAllocPage
\r
743 CALL FWORD PTR _AddCallGate
\r
745 MOV EAX, 0EC03h ;LoadNewJob -- 3 nDWord params DPL 3
\r
748 MOV ESI, OFFSET __LoadNewJob
\r
749 CALL FWORD PTR _AddCallGate
\r
751 MOV EAX, 0EC01h ;SetVidOwner -- 1 nDWord params DPL 3
\r
754 MOV ESI, OFFSET __SetVidOwner
\r
755 CALL FWORD PTR _AddCallGate
\r
757 MOV EAX, 0EC01h ;GetVidOwner -- 1 nDWord params DPL 3
\r
760 MOV ESI, OFFSET __GetVidOwner
\r
761 CALL FWORD PTR _AddCallGate
\r
763 MOV EAX, 0EC00h ;ClrScr -- 0 nDWord params DPL 3
\r
766 MOV ESI, OFFSET __ClrScr
\r
767 CALL FWORD PTR _AddCallGate
\r
769 MOV EAX, 0EC03h ;TTYOut -- 3 nDWord params DPL 3
\r
772 MOV ESI, OFFSET __TTYOut
\r
773 CALL FWORD PTR _AddCallGate
\r
775 MOV EAX, 0EC05h ;PutVidChars -- 5 nDWord params DPL 3
\r
778 MOV ESI, OFFSET __PutVidChars
\r
779 CALL FWORD PTR _AddCallGate
\r
781 MOV EAX, 0EC02h ;SetXY -- 2 nDWord params DPL 3
\r
784 MOV ESI, OFFSET __SetXY
\r
785 CALL FWORD PTR _AddCallGate
\r
787 MOV EAX, 0EC02h ;GetXY -- 2 nDWord params DPL 3
\r
790 MOV ESI, OFFSET __GetXY
\r
791 CALL FWORD PTR _AddCallGate
\r
793 MOV EAX, 0EC06h ;EditLine -- 6 nDWord params DPL 3
\r
796 MOV ESI, OFFSET __EditLine
\r
797 CALL FWORD PTR _AddCallGate
\r
799 MOV EAX, 0EC01h ;GetTSSExch -- 1 nDWord params DPL 3
\r
802 MOV ESI, OFFSET __GetTSSExch
\r
803 CALL FWORD PTR _AddCallGate
\r
805 MOV EAX, 0EC05h ;OpenFile -- 5 nDWord params DPL 3
\r
808 MOV ESI, OFFSET __OpenFile
\r
809 CALL FWORD PTR _AddCallGate
\r
811 MOV EAX, 0EC01h ;CloseFile -- 1 nDWord params DPL 3
\r
814 MOV ESI, OFFSET __CloseFile
\r
815 CALL FWORD PTR _AddCallGate
\r
817 MOV EAX, 0EC05h ;ReadBlock -- 5 nDWord params DPL 3
\r
820 MOV ESI, OFFSET __ReadBlock
\r
821 CALL FWORD PTR _AddCallGate
\r
823 MOV EAX, 0EC05h ;WriteBlock -- 5 nDWord params DPL 3
\r
826 MOV ESI, OFFSET __WriteBlock
\r
827 CALL FWORD PTR _AddCallGate
\r
829 MOV EAX, 0EC04h ;ReadBytes -- 4 nDWord params DPL 3
\r
832 MOV ESI, OFFSET __ReadBytes
\r
833 CALL FWORD PTR _AddCallGate
\r
835 MOV EAX, 0EC04h ;WriteBytes -- 4 nDWord params DPL 3
\r
838 MOV ESI, OFFSET __WriteBytes
\r
839 CALL FWORD PTR _AddCallGate
\r
841 MOV EAX, 0EC02h ;GetFileLFA -- 2 nDWord params DPL 3
\r
844 MOV ESI, OFFSET __GetFileLFA
\r
845 CALL FWORD PTR _AddCallGate
\r
847 MOV EAX, 0EC02h ;SetFileLFA -- 2 nDWord params DPL 3
\r
850 MOV ESI, OFFSET __SetFileLFA
\r
851 CALL FWORD PTR _AddCallGate
\r
853 MOV EAX, 0EC02h ;GetFileSize -- 2 nDWord params DPL 3
\r
856 MOV ESI, OFFSET __GetFileSize
\r
857 CALL FWORD PTR _AddCallGate
\r
859 MOV EAX, 0EC03h ;CreateFile -- 3 nDWord params DPL 3
\r
862 MOV ESI, OFFSET __CreateFile
\r
863 CALL FWORD PTR _AddCallGate
\r
865 MOV EAX, 0EC04h ;RenameFile -- 4 nDWord params DPL 3
\r
868 MOV ESI, OFFSET __RenameFile
\r
869 CALL FWORD PTR _AddCallGate
\r
871 MOV EAX, 0EC01h ;DeleteFile -- 1 nDWord params DPL 3
\r
874 MOV ESI, OFFSET __DeleteFile
\r
875 CALL FWORD PTR _AddCallGate
\r
877 MOV EAX, 0EC02h ;GetpJCB -- 2 nDWord params DPL 3
\r
880 MOV ESI, OFFSET __GetpJCB
\r
881 CALL FWORD PTR _AddCallGate
\r
883 MOV EAX, 0EC01h ;QueryPages -- 1 nDWord params DPL 3
\r
886 MOV ESI, OFFSET __QueryPages
\r
887 CALL FWORD PTR _AddCallGate
\r
889 MOV EAX, 0EC02h ;GetPhyAdd -- 2 nDWord params DPL 3
\r
892 MOV ESI, OFFSET __GetPhyAdd
\r
893 CALL FWORD PTR _AddCallGate
\r
895 MOV EAX, 0EC05h ;ScrollVid -- 5 nDWord params DPL 3
\r
898 MOV ESI, OFFSET __ScrollVid
\r
899 CALL FWORD PTR _AddCallGate
\r
901 MOV EAX, 0EC05h ;GetDirSector -- 5 nDWord params DPL 3
\r
904 MOV ESI, OFFSET __GetDirSector
\r
905 CALL FWORD PTR _AddCallGate
\r
907 MOV EAX, 0EC01h ;GetJobNum -- 1 nDWord params DPL 3
\r
910 MOV ESI, OFFSET __GetJobNum
\r
911 CALL FWORD PTR _AddCallGate
\r
913 MOV EAX, 0EC01h ;ExitJob -- 1 nDWord params DPL 3
\r
916 MOV ESI, OFFSET __ExitJob
\r
917 CALL FWORD PTR _AddCallGate
\r
919 MOV EAX, 0EC02h ;SetUserName -- 2 nDWord params DPL 3
\r
922 MOV ESI, OFFSET __SetUserName
\r
923 CALL FWORD PTR _AddCallGate
\r
925 MOV EAX, 0EC02h ;GetUserName -- 2 nDWord params DPL 3
\r
928 MOV ESI, OFFSET __GetUserName
\r
929 CALL FWORD PTR _AddCallGate
\r
931 MOV EAX, 0EC02h ;SetCmdLine -- 2 nDWord params DPL 3
\r
934 MOV ESI, OFFSET __SetCmdLine
\r
935 CALL FWORD PTR _AddCallGate
\r
937 MOV EAX, 0EC02h ;GetCmdLine -- 2 nDWord params DPL 3
\r
940 MOV ESI, OFFSET __GetCmdLine
\r
941 CALL FWORD PTR _AddCallGate
\r
943 MOV EAX, 0EC02h ;SetPath -- 2 nDWord params DPL 3
\r
946 MOV ESI, OFFSET __SetPath
\r
947 CALL FWORD PTR _AddCallGate
\r
949 MOV EAX, 0EC03h ;GetPath -- 3 nDWord params DPL 3
\r
952 MOV ESI, OFFSET __GetPath
\r
953 CALL FWORD PTR _AddCallGate
\r
955 MOV EAX, 0EC02h ;SetExitJob -- 2 nDWord params DPL 3
\r
958 MOV ESI, OFFSET __SetExitJob
\r
959 CALL FWORD PTR _AddCallGate
\r
961 MOV EAX, 0EC02h ;GetExitJob -- 2 nDWord params DPL 3
\r
964 MOV ESI, OFFSET __GetExitJob
\r
965 CALL FWORD PTR _AddCallGate
\r
967 MOV EAX, 0EC02h ;SetSysIn -- 2 nDWord params DPL 3
\r
970 MOV ESI, OFFSET __SetSysIn
\r
971 CALL FWORD PTR _AddCallGate
\r
973 MOV EAX, 0EC02h ;SetSysOut -- 2 nDWord params DPL 3
\r
976 MOV ESI, OFFSET __SetSysOut
\r
977 CALL FWORD PTR _AddCallGate
\r
979 MOV EAX, 0EC02h ;GetSysIn -- 2 nDWord params DPL 3
\r
982 MOV ESI, OFFSET __GetSysIn
\r
983 CALL FWORD PTR _AddCallGate
\r
985 MOV EAX, 0EC02h ;GetSysOut -- 2 nDWord params DPL 3
\r
988 MOV ESI, OFFSET __GetSysOut
\r
989 CALL FWORD PTR _AddCallGate
\r
991 MOV EAX, 0EC04h ;PutVidAttrs -- 4 nDWord params DPL 3
\r
994 MOV ESI, OFFSET __PutVidAttrs
\r
995 CALL FWORD PTR _AddCallGate
\r
997 MOV EAX, 0EC04h ;GetVidChar -- 4 nDWord params DPL 3
\r
1000 MOV ESI, OFFSET __GetVidChar
\r
1001 CALL FWORD PTR _AddCallGate
\r
1003 MOV EAX, 0EC01h ;SetNormVid -- 1 nDWord params DPL 3
\r
1006 MOV ESI, OFFSET __SetNormVid
\r
1007 CALL FWORD PTR _AddCallGate
\r
1009 MOV EAX, 0EC01h ;GetNormVid -- 1 nDWord params DPL 3
\r
1012 MOV ESI, OFFSET __GetNormVid
\r
1013 CALL FWORD PTR _AddCallGate
\r
1015 MOV EAX, 0EC03h ;Chain -- 3 nDWord params DPL 3
\r
1018 MOV ESI, OFFSET __Chain
\r
1019 CALL FWORD PTR _AddCallGate
\r
1021 MOV EAX, 0EC02h ;SetFileSize -- 2 nDWord params DPL 3
\r
1024 MOV ESI, OFFSET __SetFileSize
\r
1025 CALL FWORD PTR _AddCallGate
\r
1027 MOV EAX, 0EC01h ;GetCMOSDate -- 1 nDWord params DPL 3
\r
1030 MOV ESI, OFFSET __GetCMOSDate
\r
1031 CALL FWORD PTR _AddCallGate
\r
1033 MOV EAX, 0EC02h ;CreateDir -- 2 nDWord params DPL 3
\r
1036 MOV ESI, OFFSET __CreateDir
\r
1037 CALL FWORD PTR _AddCallGate
\r
1039 MOV EAX, 0EC03h ;DeleteDir -- 3 nDWord params DPL 3
\r
1042 MOV ESI, OFFSET __DeleteDir
\r
1043 CALL FWORD PTR _AddCallGate
\r
1045 MOV EAX, 0EC03h ;DeAliasMem -- 3 DWord params DPL 3
\r
1048 MOV ESI, OFFSET __DeAliasMem
\r
1049 CALL FWORD PTR _AddCallGate
\r
1051 MOV EAX, 0EC04h ;AliasMem -- 4 DWord params DPL 3
\r
1054 MOV ESI, OFFSET __AliasMem
\r
1055 CALL FWORD PTR _AddCallGate
\r
1057 MOV EAX, 08C02h ;GetDMACount -- 2 DWord params DPL 0
\r
1060 MOV ESI, OFFSET __GetDMACount
\r
1061 CALL FWORD PTR _AddCallGate
\r
1063 MOV EAX, 08C03h ;AllocDMAPage -- 3 DWord params DPL 0
\r
1066 MOV ESI, OFFSET __AllocDMAPage
\r
1067 CALL FWORD PTR _AddCallGate
\r
1069 MOV EAX, 0EC02h ;SetJobName -- 2 DWord params DPL 3
\r
1072 MOV ESI, OFFSET __SetJobName
\r
1073 CALL FWORD PTR _AddCallGate
\r
1075 MOV EAX, 0EC01h ;KillJob -- 1 DWord params DPL 3
\r
1078 MOV ESI, OFFSET __KillJob
\r
1079 CALL FWORD PTR _AddCallGate
\r
1081 MOV EAX, 0EC01h ;GetSystemDisk -- 1 DWord params DPL 3
\r
1084 MOV ESI, OFFSET __GetSystemDisk
\r
1085 CALL FWORD PTR _AddCallGate
\r
1087 MOV EAX, 0EC01h ;UnRegisterSvc -- 1 DWord params DPL 3
\r
1090 MOV ESI, OFFSET __UnRegisterSvc
\r
1091 CALL FWORD PTR _AddCallGate
\r
1095 ;================== END of Module =================
\r