source: GPL/drv32/startup.asm@ 1

Last change on this file since 1 was 1, checked in by vladest, 20 years ago

initial import

File size: 43.3 KB
Line 
1; $Id: startup.asm,v 1.1.1.1 2003/07/02 13:56:56 eleph Exp $
2;*
3;* 16bit entrypoints to the PDD with thunks to the 32bit functions
4;*
5;* (C) 2000-2002 InnoTek Systemberatung GmbH
6;* (C) 1998-2001 Sander van Leeuwen (sandervl@xs4all.nl)
7;*
8;* Partly based on MWDD32 (32 bits OS/2 device driver and IFS support driver)
9;* Copyright (C) 1995, 1996 Matthieu WILLM
10;*
11;* This program is free software; you can redistribute it and/or
12;* modify it under the terms of the GNU General Public License as
13;* published by the Free Software Foundation; either version 2 of
14;* the License, or (at your option) any later version.
15;*
16;* This program is distributed in the hope that it will be useful,
17;* but WITHOUT ANY WARRANTY; without even the implied warranty of
18;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19;* GNU General Public License for more details.
20;*
21;* You should have received a copy of the GNU General Public
22;* License along with this program; if not, write to the Free
23;* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
24;* USA.
25;*
26
27 .386p
28
29
30 INCL_DOS equ 1
31 INCL_DOSERRORS equ 1
32 include os2.inc
33
34 include segments.inc
35 include startup.inc
36
37DATA16 segment
38 extrn DOS32FLATDS : abs ; ring 0 FLAT kernel data selector
39 public __OffFinalDS16
40 public help_header
41 public uniaud_header
42 public _MSG_TABLE16
43 public DevHelpInit
44 public fOpen
45 public InitPktSeg
46 public InitPktOff
47 public _MESSAGE_STR
48 public pddname16
49 public FileName
50 public _RM_Help0
51 public _RM_Help1
52 public _RM_Help3
53 public _RMFlags
54
55;*********************************************************************************************
56;************************* Device Driver Header **********************************************
57;*********************************************************************************************
58help_header dw OFFSET DATA16:uniaud_header ; Pointer to next driver
59 dw SEG DATA16:uniaud_header
60 dw 1000100110000000b ; Device attributes
61; ||||| +-+ ||||
62; ||||| | | |||+------------------ STDIN
63; ||||| | | ||+------------------- STDOUT
64; ||||| | | |+-------------------- NULL
65; ||||| | | +--------------------- CLOCK
66; ||||| | |
67; ||||| | +------------------------+ (001) OS/2
68; ||||| | | (010) DosDevIOCtl2 + SHUTDOWN
69; ||||| +--------------------------+ (011) Capability bit strip
70; |||||
71; ||||+----------------------------- OPEN/CLOSE (char) or Removable (blk)
72; |||+------------------------------ Sharing support
73; ||+------------------------------- IBM
74; |+-------------------------------- IDC entry point
75; +--------------------------------- char/block device driver
76
77 dw offset CODE16:help_stub_strategy ; Strategy routine entry point
78 dw 0 ; IDC routine entry point
79 db 'ALSAHLP$' ; Device name
80 db 8 dup (0) ; Reserved
81 dw 0000000000010011b ; Level 3 device driver capabilities
82; |||||
83; ||||+------------------ DosDevIOCtl2 + Shutdown
84; |||+------------------- More than 16 MB support
85; ||+-------------------- Parallel port driver
86; |+--------------------- Adapter device driver
87; +---------------------- InitComplete
88 dw 0000000000000000b
89
90uniaud_header dd -1
91 dw 1101100110000000b ; Device attributes
92; ||||| +-+ ||||
93; ||||| | | |||+------------------ STDIN
94; ||||| | | ||+------------------- STDOUT
95; ||||| | | |+-------------------- NULL
96; ||||| | | +--------------------- CLOCK
97; ||||| | |
98; ||||| | +------------------------+ (001) OS/2
99; ||||| | | (010) DosDevIOCtl2 + SHUTDOWN
100; ||||| +--------------------------+ (011) Capability bit strip
101; |||||
102; ||||+----------------------------- OPEN/CLOSE (char) or Removable (blk)
103; |||+------------------------------ Sharing support
104; ||+------------------------------- IBM
105; |+-------------------------------- IDC entry point
106; +--------------------------------- char/block device driver
107
108 dw offset CODE16:uniaud_stub_strategy ; Strategy routine entry point
109 dw offset CODE16:uniaud_stub_idc ; IDC routine entry point
110 db 'ALSA32$ ' ; Device name
111 db 8 dup (0) ; Reserved
112 dw 0000000000010011b ; Level 3 device driver capabilities
113; |||||
114; ||||+------------------ DosDevIOCtl2 + Shutdown
115; |||+------------------- More than 16 MB support
116; ||+-------------------- Parallel port driver
117; |+--------------------- Adapter device driver
118; +---------------------- InitComplete
119 dw 0000000000000000b
120
121DevHelpInit dd 0
122fOpen dd 0
123InitPktSeg dw 0
124InitPktOff dw 0
125;needed for rmcalls.lib
126_RM_Help0 dd 0
127_RM_Help1 dd 0
128_RM_Help3 dd 0
129_RMFlags dd 0
130_MESSAGE_STR db 1024 dup (0)
131_MSG_TABLE16 dw 0 ;message length
132 dw OFFSET _MESSAGE_STR ;message far pointer
133 dw SEG _MESSAGE_STR
134
135pddname16 db 'ALSA32$'
136FileName db "ALSAHLP$", 0
137ResMgr DB 52H,45H,53H,4dH,47H,52H,24H,20H
138 DB 00H
139_RMIDCTable DB 00H,00H,00H,00H,00H,00H,00H,00H
140 DB 00H,00H,00H,00H
141
142;last byte in 16 bits data segment
143__OffFinalDS16 label byte
144
145DATA16 ends
146
147CODE16 segment
148 assume cs:CODE16, ds:DATA16
149
150 public __OffFinalCS16
151
152 public help_stub_strategy
153 public uniaud_stub_strategy
154 public uniaud_stub_idc
155 public uniaud_stub_timer
156 public thunk3216_devhelp
157 public thunk3216_devhelp_modified_ds
158 extrn DOSOPEN : far
159 extrn DOSWRITE : far
160 extrn DOSCLOSE : far
161
162 ALIGN 2
163help_stub_strategy proc far
164 movzx eax, byte ptr es:[bx].reqCommand
165 cmp eax, 04h ; DosRead
166 je uniaud_stub_strategy
167
168 enter 0, 0
169 and sp, 0fffch ; align stack
170
171 pushad
172 push ds
173 push es
174 push fs
175 push gs
176
177 mov dx, DATA16
178 mov ds, dx
179
180 cmp eax, 0 ; Init
181 je short @@help_init
182 cmp eax, 0Eh ; DosClose
183 je short @@help_close
184 cmp eax, 0Dh ; DosOpen
185 jne short @@help_error
186;DosOpen:
187 cmp word ptr fOpen, 0
188 je short @@help_ret_ok ; not ours
189 push ebx ; save ebx
190 push es
191 mov word ptr fOpen, 0
192 mov ax, word ptr InitPktSeg
193 mov fs, ax ; fs:ebx = req. packet
194 xor ebx, ebx
195 mov bx, word ptr InitPktOff
196 call far ptr FLAT:STRATEGY_
197 pop es
198 pop ebx ; restore ebx ptr
199@@help_ret:
200 mov word ptr es:[bx].reqStatus, ax
201@@help_ret_error:
202 pop gs
203 pop fs
204 pop es
205 pop ds
206 popad
207
208 leave
209 ret
210
211@@help_init:
212 mov eax, dword ptr es:[bx].i_devHelp
213 mov dword ptr DevHelpInit, eax
214 mov word ptr es:[bx].o_codeend, offset __OffFinalCS16
215 mov word ptr es:[bx].o_dataend, offset __OffFinalDS16
216
217@@help_ret_ok:
218 mov ax, STDON
219 jmp short @@help_ret
220
221@@help_close:
222 call far ptr FLAT:HelpClose
223 jmp short @@help_ret_ok
224
225@@help_error:
226 mov ax, STDON + STERR + ERROR_I24_BAD_COMMAND
227 mov word ptr es:[bx].reqStatus, ax
228 jmp short @@help_ret_error
229
230help_stub_strategy endp
231
232 ALIGN 2
233uniaud_stub_strategy proc far
234 enter 0, 0
235 and sp, 0fffch ; align stack
236
237 pushad
238 push ds
239 push es
240 push fs
241 push gs
242
243 mov ax, DATA16
244 mov ds, ax
245
246 movzx eax, byte ptr es:[bx].reqCommand
247 cmp eax, 0
248 jz short @@init
249
250 push ebx
251 push es
252 mov ax, bx
253 xor ebx, ebx
254 mov bx, ax
255 mov ax, es
256 mov fs, ax ; fs:ebx = req. packet
257
258 call far ptr FLAT:STRATEGY_ ; 32 bits strategy entry point
259
260 pop es
261 pop ebx ; oude bx ptr
262 mov word ptr es:[bx].reqStatus, ax ; status code
263
264@@uniaud_ret:
265
266 pop gs
267 pop fs
268 pop es
269 pop ds
270 popad
271 leave
272 ret
273
274@@init:
275 ;
276 ; DEVICE= initialization
277 ;
278 mov word ptr InitPktSeg, es
279 mov word ptr InitPktOff, bx
280 inc word ptr fOpen
281 call device_init
282
283 mov word ptr es:[bx].reqStatus, ax ; status code (ret by device_init)
284 mov word ptr es:[bx].o_codeend, offset __OffFinalCS16
285 mov word ptr es:[bx].o_dataend, offset __OffFinalDS16
286 jmp short @@uniaud_ret
287
288init_err:
289 mov dword ptr es:[bx].i_devHelp, 0
290 jmp short @@uniaud_ret
291
292uniaud_stub_strategy endp
293
294;in: cx = cmd
295; bx = lower 16 bits of ULONG parameter
296; dx = upper 16 bits of ULONG parameter
297;return value in dx:ax
298 ALIGN 2
299uniaud_stub_idc proc far
300 enter 0, 0
301 and sp, 0fffch ; align stack
302
303 shl edx, 16
304 mov dx, bx
305 call far ptr FLAT:IDC_ ; 32 bits strategy entry point
306
307 mov dx, ax
308 shr eax, 16
309 xchg ax, dx
310
311 leave
312 retf
313uniaud_stub_idc endp
314
315 ALIGN 2
316uniaud_stub_timer proc far
317 enter 0, 0
318 and sp, 0fffch ; align stack
319
320 call far ptr FLAT:TIMER_ ; 32 bits timer entry point
321
322 leave
323 retf
324uniaud_stub_timer endp
325
326
327;;*****************************************************************************
328; device_init
329;
330; Use DosOpen to tell the 1st driver to handle init for us. We must do it this
331; way since right now our CPL is 3 and the flat code selector has DPL 0, so
332; we can't load it. In the open strategy request, CPL is 0
333;;*****************************************************************************
334 ALIGN 2
335device_init proc near
336 enter 24, 0
337 push ds
338 push es
339 push bx
340 push si
341 push di
342
343 ; bp -> old bp
344 ; bp - 2 -> FileHandle
345 ; bp - 4 -> ActionTaken
346 ; bp - 8 -> IOCTL parm (4 bytes) : union mwdd32_ioctl_init_device_parm
347 ; bp - 24 -> IOCTL data (16 bytes) : union mwdd32_ioctl_init_device_data
348
349 ;
350 ; Opens wathlp$
351 ;
352 push seg DATA16 ; seg FileName
353 push offset FileName ; ofs FileName
354 push ss ; seg &FileHandle
355 lea ax, [bp - 2]
356 push ax ; ofs &FileHandle
357 push ss ; seg &ActionTaken
358 lea ax, [bp - 4]
359 push ax ; ofs &ActionTaken
360 push dword ptr 0 ; file size
361 push 0 ; file attributes
362 push OPEN_ACTION_FAIL_IF_NEW + OPEN_ACTION_OPEN_IF_EXISTS
363 push OPEN_SHARE_DENYNONE + OPEN_ACCESS_READONLY
364 push dword ptr 0 ; reserved
365 call DOSOPEN
366 cmp ax, NO_ERROR
367 jnz short @@error
368
369
370 ;
371 ; Closes wathlp$
372 ;
373 push word ptr [bp - 2] ; FileHandle
374 call DOSCLOSE
375 cmp ax, NO_ERROR
376 jnz short @@error
377
378@@out:
379 push eax ;gemold door doswrite
380
381 push 0001H
382 push ds
383 push offset _MESSAGE_STR
384 push word ptr _MSG_TABLE16
385 push ss
386 lea dx, [bp - 2]
387 push dx
388 call DOSWRITE
389
390 pop eax
391
392 pop di
393 pop si
394 pop bx
395 pop es
396 pop ds
397 leave
398 ret
399@@error:
400 mov ax, STDON + STERR + ERROR_I24_GEN_FAILURE
401 jmp short @@out
402
403device_init endp
404
405 ALIGN 2
406;use devhlp pointer stored in 16 bits code segment
407thunk3216_devhelp:
408 push ds
409 push DATA16
410 pop ds
411 call dword ptr DevHelpInit
412 pop ds
413
414 jmp far ptr FLAT:thunk1632_devhelp
415
416 ALIGN 2
417thunk3216_devhelp_modified_ds:
418 push gs
419 push DATA16
420 pop gs
421 call dword ptr gs:DevHelpInit
422 pop gs
423 jmp far ptr FLAT:thunk1632_devhelp_modified_ds
424
425
426 ALIGN 2
427 PUBLIC _RMAllocResourceOrg
428_RMAllocResourceOrg proc far
429 enter16
430 test byte ptr _RMFlags, 01H
431 je short AllocL1
432 lea eax, [bp+6]
433 push ss
434 push ax
435 push 0008H
436 push cs
437 call near ptr _CallRM
438 mov sp,bp
439 ret16
440AllocL1: test byte ptr _RMFlags,02H
441 je short AllocL2
442 push es
443 push bx
444 les bx,dword ptr [bp+10]
445 mov word ptr es:[bx],0ffffH
446 mov word ptr es:+2H[bx],0ffffH
447 sub ax,ax
448 pop bx
449 pop es
450 ret16
451AllocL2: mov ax,0001H
452 ret16
453_RMAllocResourceOrg endp
454
455 ALIGN 2
456 PUBLIC _RMAllocResource16
457_RMAllocResource16 proc far
458 enter32
459 xor eax, eax
460 push dword ptr [bp+18]
461 push dword ptr [bp+14]
462 push dword ptr [bp+10]
463 call _RMAllocResourceOrg
464 add sp, 12
465 ret32
466_RMAllocResource16 endp
467
468 ALIGN 2
469 PUBLIC _RMCreateAdapterOrg
470_RMCreateAdapterOrg proc far
471 enter16
472 test byte ptr _RMFlags,01H
473 je short CreateAdL1
474 lea eax, [bp+6]
475 push ss
476 push ax
477 push 0004H
478 push cs
479 call near ptr _CallRM
480 mov sp,bp
481 ret16
482CreateAdL1: test byte ptr _RMFlags,02H
483 je short CreateAdL2
484 push es
485 push bx
486 les bx,dword ptr [bp+10]
487 mov word ptr es:[bx],0ffffH
488 mov word ptr es:+2H[bx],0ffffH
489 sub ax,ax
490 pop bx
491 pop es
492 ret16
493CreateAdL2: mov ax,0001H
494 ret16
495_RMCreateAdapterOrg endp
496
497 ALIGN 2
498 PUBLIC _RMCreateAdapter16
499_RMCreateAdapter16 proc far
500 enter32
501 xor eax, eax
502 push dword ptr [bp+26]
503 push dword ptr [bp+22]
504 push dword ptr [bp+18]
505 push dword ptr [bp+14]
506 push dword ptr [bp+10]
507 call _RMCreateAdapterOrg
508 add sp, 20
509 ret32
510_RMCreateAdapter16 endp
511
512 ALIGN 2
513 PUBLIC _RMCreateDeviceOrg
514_RMCreateDeviceOrg proc far
515 enter16
516 test byte ptr _RMFlags,01H
517 je short CreateDevL1
518 lea ax, [bp+6]
519 push ss
520 push ax
521 push 0006H
522 push cs
523 call near ptr _CallRM
524 mov sp,bp
525 ret16
526CreateDevL1: test byte ptr _RMFlags,02H
527 je short CreateDevL2
528 push es
529 push bx
530 les bx,dword ptr [bp+10]
531 mov word ptr es:[bx],0ffffH
532 mov word ptr es:+2H[bx],0ffffH
533 sub ax,ax
534 pop bx
535 pop es
536 ret16
537CreateDevL2: mov ax,0001H
538 ret16
539_RMCreateDeviceOrg endp
540
541 ALIGN 2
542 PUBLIC _RMCreateDevice16
543_RMCreateDevice16 proc far
544 enter32
545 xor eax, eax
546 push dword ptr [bp+26]
547 push dword ptr [bp+22]
548 push dword ptr [bp+18]
549 push dword ptr [bp+14]
550 push dword ptr [bp+10]
551 call _RMCreateDeviceOrg
552 add sp, 20
553 ret32
554_RMCreateDevice16 endp
555
556 ALIGN 2
557 PUBLIC _RMDestroyDeviceOrg
558_RMDestroyDeviceOrg proc far
559 enter16
560 test byte ptr _RMFlags,01H
561 je short DestroyL1
562 lea ax, [bp+6]
563 push ss
564 push ax
565 push 0007H
566 push cs
567 call near ptr _CallRM
568 mov sp,bp
569 ret16
570DestroyL1: test byte ptr _RMFlags,02H
571 je short DestroyL2
572 sub ax,ax
573 ret16
574DestroyL2: mov ax,0001H
575 ret16
576_RMDestroyDeviceOrg endp
577
578 ALIGN 2
579 PUBLIC _RMDestroyDevice16
580_RMDestroyDevice16 proc far
581 enter32
582 xor eax, eax
583 push dword ptr [bp+10]
584 call _RMDestroyDeviceOrg
585 add sp, 4
586 ret32
587_RMDestroyDevice16 endp
588
589 ALIGN 2
590 PUBLIC _RMDeallocResourceOrg
591_RMDeallocResourceOrg proc far
592 enter16
593 test byte ptr _RMFlags,01H
594 je short DeAllocL1
595 lea ax, [bp+6]
596 push ss
597 push ax
598 push 0009H
599 push cs
600 call near ptr _CallRM
601 mov sp,bp
602 ret16
603DeAllocL1: test byte ptr _RMFlags,02H
604 je short DeAllocL2
605 sub ax,ax
606 ret16
607DeAllocL2: mov ax,0001H
608 ret16
609_RMDeallocResourceOrg endp
610
611 ALIGN 2
612 PUBLIC _RMDeallocResource16
613_RMDeallocResource16 proc far
614 enter32
615 xor eax, eax
616 push dword ptr [bp+14]
617 push dword ptr [bp+10]
618 call _RMDeallocResourceOrg
619 add sp, 8
620 ret32
621_RMDeallocResource16 endp
622
623 ALIGN 2
624 PUBLIC MY_DEVHELP_ATTACHDD
625MY_DEVHELP_ATTACHDD proc near
626 push bp
627 mov bp,sp
628 push di
629 push es
630 mov ax, ds
631 mov es, ax
632 mov bx,word ptr +8H[bp]
633 mov di,word ptr +6H[bp]
634 mov dl,2aH
635 call dword ptr DevHelpInit
636 jb short L2
637 sub ax,ax
638 pop es
639 pop di
640 leave
641 ret 0004H
642L2: pop es
643 pop di
644 leave
645 ret 0004H
646MY_DEVHELP_ATTACHDD endp
647
648 ALIGN 2
649 PUBLIC _RMCreateDriverOrg
650_RMCreateDriverOrg proc far
651 enter16
652 test byte ptr _RMFlags,01H
653 je short CreateDrL4
654CreateDrL3: lea ax, [bp+6]
655 push ss
656 push ax
657 push 0002H
658 push cs
659 call near ptr _CallRM
660 add sp,0006H
661 ret16
662CreateDrL4: test byte ptr _RMFlags,02H
663 je short CreateDrL6
664CreateDrL5: push es
665 push bx
666 les bx,dword ptr [bp+10]
667 mov word ptr es:[bx],0ffffH
668 mov word ptr es:+2H[bx],0ffffH
669 sub ax,ax
670 pop bx
671 pop es
672 ret16
673CreateDrL6: mov ax, word ptr DevHelpInit + 2H
674 or ax, word ptr DevHelpInit
675 jne short CreateDrL7
676 mov ax,0008H
677 ret16
678CreateDrL7: push offset ResMgr
679 push offset _RMIDCTable
680 push cs
681 call near ptr MY_DEVHELP_ATTACHDD
682 or ax,ax
683 je short CreateDrL8
684 or byte ptr _RMFlags, 02H
685 jmp short CreateDrL5
686CreateDrL8: mov ax,word ptr _RMIDCTable+4H
687 mov word ptr _RM_Help3+2H,ax
688 mov word ptr _RM_Help3,0000H
689 mov ax,word ptr _RMIDCTable+2H
690 mov word ptr _RM_Help0+2H,ax
691 mov ax,word ptr _RMIDCTable+6H
692 mov word ptr _RM_Help0,ax
693 or byte ptr _RMFlags,05H
694 jmp short CreateDrL3
695_RMCreateDriverOrg endp
696
697 ALIGN 2
698 PUBLIC _RMCreateDriver16
699_RMCreateDriver16 proc far
700 enter32
701 xor eax, eax
702 push dword ptr [bp+14]
703 push dword ptr [bp+10]
704 call _RMCreateDriverOrg
705 add sp, 8
706 ret32
707_RMCreateDriver16 endp
708
709 ALIGN 2
710 PUBLIC _CallRM
711_CallRM proc near
712 enter 0002H,00H
713 call near ptr _GetCS
714 test al,03H
715 je short L1
716 push word ptr +0aH[bp]
717 push word ptr +8H[bp]
718 push word ptr +6H[bp]
719 call dword ptr _RM_Help3
720 add sp,0006H
721 leave
722 ret
723L1: push word ptr +6H[bp]
724 call dword ptr _RM_Help0
725 leave
726 ret
727_CallRM endp
728
729 ALIGN 2
730_GetCS proc near
731 enter 0002H,00H
732 push cs
733 pop word ptr -2H[bp]
734 mov ax,word ptr -2H[bp]
735 leave
736 ret
737_GetCS endp
738
739 ALIGN 2
740 PUBLIC _RMDestroyDriverOrg
741_RMDestroyDriverOrg proc far
742 enter16
743 test byte ptr _RMFlags,01H
744 je short DestroyDrvL1
745 lea ax, [bp+6]
746 push ss
747 push ax
748 push 0003H
749 push cs
750 call near ptr _CallRM
751 mov sp,bp
752 ret16
753DestroyDrvL1: test byte ptr _RMFlags,02H
754 je short DestroyDrvL2
755 sub ax,ax
756 ret16
757DestroyDrvL2: mov ax,0001H
758 ret16
759_RMDestroyDriverOrg endp
760
761 ALIGN 2
762 PUBLIC _RMDestroyDriver16
763_RMDestroyDriver16 proc far
764 enter32
765 xor eax, eax
766 push dword ptr [bp+10]
767 call _RMDestroyDriverOrg
768 add sp, 4
769 ret32
770_RMDestroyDriver16 endp
771
772
773 ALIGN 2
774_RMGetNodeInfoOrg proc far
775 enter16
776 test byte ptr _RMFlags,01H
777 je short GetNodeInfo_L3
778 test byte ptr _RMFlags,04H
779 je short GetNodeInfo_L1
780 lea ax,+6H[bp]
781 push ss
782 push ax
783 push 001cH
784 push cs
785 call near ptr _CallRM
786 mov sp,bp
787 ret16
788GetNodeInfo_L1: mov ax,0014H
789 ret16
790 nop
791GetNodeInfo_L2: test byte ptr _RMFlags,02H
792 je short GetNodeInfo_L3
793 mov ax,0015H
794 ret16
795GetNodeInfo_L3: mov ax,0001H
796 ret16
797_RMGetNodeInfoOrg endp
798
799 ALIGN 2
800 PUBLIC _RMGetNodeInfo16
801_RMGetNodeInfo16 proc far
802 enter32
803 xor eax, eax
804 push word ptr [bp+18] ;pushed as dword by watcom
805 push dword ptr [bp+14]
806 push dword ptr [bp+10]
807 call _RMGetNodeInfoOrg
808 add sp, 10
809 ret32
810_RMGetNodeInfo16 endp
811
812 ALIGN 2
813_RMDevIDToHandleListOrg proc far
814 enter16
815 test byte ptr _RMFlags,01H
816 je short RMDevIDToHandleList_L2
817 test byte ptr _RMFlags,04H
818 je short RMDevIDToHandleList_L1
819 lea ax,+6H[bp]
820 push ss
821 push ax
822 push 0020H
823 push cs
824 call near ptr _CallRM
825 mov sp,bp
826 ret16
827RMDevIDToHandleList_L1:
828 mov ax,0014H
829 ret16
830 nop
831RMDevIDToHandleList_L2:
832 test byte ptr _RMFlags,02H
833 je short RMDevIDToHandleList_L3
834 sub ax,ax
835 ret16
836 nop
837RMDevIDToHandleList_L3:
838 mov ax,0001H
839 ret16
840 nop
841_RMDevIDToHandleListOrg endp
842
843 ALIGN 2
844 PUBLIC _RMDevIDToHandleList16
845_RMDevIDToHandleList16 proc far
846 enter32
847 xor eax, eax
848 push dword ptr [bp+42]
849 push dword ptr [bp+38]
850 push dword ptr [bp+34]
851 push dword ptr [bp+30]
852 push dword ptr [bp+26]
853 push dword ptr [bp+22]
854 push dword ptr [bp+18]
855 push dword ptr [bp+14]
856 push dword ptr [bp+10]
857 call _RMDevIDToHandleListOrg
858 add sp, 36
859 ret32
860_RMDevIDToHandleList16 endp
861
862 ALIGN 2
863_RMHandleToResourceHandleListOrg proc far
864 enter16
865 test byte ptr _RMFlags,01H
866 je short RMHandleToResourceHandleList_L2
867 test byte ptr _RMFlags,04H
868 je short RMHandleToResourceHandleList_L1
869 lea ax,+6H[bp]
870 push ss
871 push ax
872 push 0021H
873 push cs
874 call near ptr _CallRM
875 ret16
876 nop
877RMHandleToResourceHandleList_L1:
878 mov ax,0014H
879 ret16
880 nop
881RMHandleToResourceHandleList_L2:
882 test byte ptr _RMFlags,02H
883 je short RMHandleToResourceHandleList_L3
884 sub ax,ax
885 ret16
886 nop
887RMHandleToResourceHandleList_L3:
888 mov ax,0001H
889 ret16
890 nop
891_RMHandleToResourceHandleListOrg endp
892
893 ALIGN 2
894 PUBLIC _RMHandleToResourceHandleList16
895_RMHandleToResourceHandleList16 proc far
896 enter32
897 xor eax, eax
898 push dword ptr [bp+14]
899 push dword ptr [bp+10]
900 call _RMHandleToResourceHandleListOrg
901 add sp, 8
902 ret32
903_RMHandleToResourceHandleList16 endp
904
905 ALIGN 2
906ISR03_16 proc far
907 push ebx
908 mov ebx, 3
909 call far ptr FLAT:Interrupt32
910 pop ebx
911 retf
912ISR03_16 endp
913
914 ALIGN 2
915ISR04_16 proc far
916 push ebx
917 mov ebx, 4
918 call far ptr FLAT:Interrupt32
919 pop ebx
920 retf
921ISR04_16 endp
922
923 ALIGN 2
924ISR05_16 proc far
925 push ebx
926 mov ebx, 5
927 call far ptr FLAT:Interrupt32
928 pop ebx
929 retf
930ISR05_16 endp
931
932 ALIGN 2
933ISR07_16 proc far
934 push ebx
935 mov ebx, 7
936 call far ptr FLAT:Interrupt32
937 pop ebx
938 retf
939ISR07_16 endp
940
941 ALIGN 2
942ISR09_16 proc far
943 push ebx
944 mov ebx, 9
945 call far ptr FLAT:Interrupt32
946 pop ebx
947 retf
948ISR09_16 endp
949
950 ALIGN 2
951ISR10_16 proc far
952 push ebx
953 mov ebx, 10
954 call far ptr FLAT:Interrupt32
955 pop ebx
956 retf
957ISR10_16 endp
958
959 ALIGN 2
960ISR11_16 proc far
961 push ebx
962 mov ebx, 11
963 call far ptr FLAT:Interrupt32
964 pop ebx
965 retf
966ISR11_16 endp
967
968 ALIGN 2
969ISR12_16 proc far
970 push ebx
971 mov ebx, 12
972 call far ptr FLAT:Interrupt32
973 pop ebx
974 retf
975ISR12_16 endp
976
977 ALIGN 2
978ISR13_16 proc far
979 push ebx
980 mov ebx, 13
981 call far ptr FLAT:Interrupt32
982 pop ebx
983 retf
984ISR13_16 endp
985
986 ALIGN 2
987ISR14_16 proc far
988 push ebx
989 mov ebx, 14
990 call far ptr FLAT:Interrupt32
991 pop ebx
992 retf
993ISR14_16 endp
994
995 ALIGN 2
996ISR15_16 proc far
997 push ebx
998 mov ebx, 15
999 call far ptr FLAT:Interrupt32
1000 pop ebx
1001 retf
1002ISR15_16 endp
1003
1004;end of 16 bits code segment
1005__OffFinalCS16 label byte
1006
1007CODE16 ends
1008
1009CODE32 segment
1010ASSUME CS:FLAT, DS:FLAT, ES:FLAT
1011
1012 public __GETDS
1013 public thunk1632_devhelp
1014 public thunk1632_devhelp_modified_ds
1015 public DevHlp
1016 public DevHlp_ModifiedDS
1017 public STRATEGY_
1018 public IDC_
1019 public TIMER_
1020 extrn ALSA_STRATEGY : near
1021 extrn ALSA_IDC : near
1022 extrn ALSA_TIMER_ : near
1023 extrn ALSA_Interrupt : near
1024 extrn GetTKSSBase : near
1025 extrn _rdOffset: dword
1026
1027IFDEF KEE
1028 extrn KernThunkStackTo16 : near
1029 extrn KernThunkStackTo32 : near
1030ELSE
1031 extrn StackAlloc : near
1032 extrn StackFree : near
1033ENDIF
1034
1035;Called by Watcom to set the DS
1036 ALIGN 4
1037__GETDS proc near
1038 push eax
1039 mov eax, DOS32FLATDS
1040 mov ds, eax
1041 pop eax
1042 ret
1043__GETDS endp
1044
1045 ALIGN 4
1046DevHelpDebug proc near
1047 int 3
1048 int 3
1049 ret
1050DevHelpDebug endp
1051
1052 ALIGN 4
1053
1054 ALIGN 4
1055DevHlp proc near
1056IFDEF FLATSTACK
1057 DevThunkStackTo16_Int
1058ENDIF
1059
1060 jmp far ptr CODE16:thunk3216_devhelp
1061 ALIGN 4
1062thunk1632_devhelp:
1063IFDEF FLATSTACK
1064 DevThunkStackTo32_Int
1065ENDIF
1066 ret
1067DevHlp endp
1068
1069 ALIGN 4
1070DevHlp_ModifiedDS proc near
1071IFDEF FLATSTACK
1072 DevThunkStackTo16_Int
1073ENDIF
1074 jmp far ptr CODE16:thunk3216_devhelp_modified_ds
1075 ALIGN 4
1076thunk1632_devhelp_modified_ds:
1077IFDEF FLATSTACK
1078 DevThunkStackTo32_Int
1079ENDIF
1080 ret
1081DevHlp_ModifiedDS endp
1082
1083
1084IFNDEF KEE
1085;;******************************************************************************
1086;FixSelDPL:
1087;
1088; Set DPL of DOS32FLATDS selector to 0 or else we'll get a trap D when loading
1089; it into the SS register (DPL must equal CPL when loading a selector into SS)
1090;;******************************************************************************
1091 PUBLIC FixSelDPL
1092 ALIGN 4
1093FixSelDPL proc near
1094 cmp fWrongDPL, 1
1095 jne short @@fixdpl_end
1096 cmp SelRef, 0
1097 jne short @@fixdpl_endfix
1098 push eax
1099 push ebx
1100 push edx
1101 sgdt fword ptr [gdtsave] ; access the GDT ptr
1102 mov ebx, dword ptr [gdtsave+2] ; get lin addr of GDT
1103 mov eax, ds ; build offset into table
1104 and eax, 0fffffff8h ; mask away DPL
1105 add ebx, eax ; build address
1106
1107 mov eax, dword ptr [ebx+4]
1108 mov edx, eax
1109 shr edx, 13
1110 and edx, 3
1111
1112 ;has the OS/2 kernel finally changed the DPL to 0?
1113 cmp edx, 0
1114 jne @@changedpl
1115 mov fWrongDPL, 0 ;don't bother anymore
1116 mov SelRef, 0
1117 jmp short @@endchange
1118
1119@@changedpl:
1120 mov oldDPL, eax
1121 and eax, NOT 6000h ;clear bits 5 & 6 in the high word (DPL)
1122 mov dword ptr [ebx+4], eax
1123@@endchange:
1124 pop edx
1125 pop ebx
1126 pop eax
1127@@fixdpl_endfix:
1128 inc SelRef
1129@@fixdpl_end:
1130 ret
1131FixSelDPL endp
1132;;******************************************************************************
1133; RestoreSelDPL:
1134;
1135; Restore DPL of DOS32FLATDS selector or else OS/2 kernel code running in ring 3
1136; will trap (during booting only; this sel has a DPL of 0 when PM starts up)
1137;;******************************************************************************
1138 PUBLIC RestoreSelDPL
1139 ALIGN 4
1140RestoreSelDPL proc near
1141 cmp fWrongDPL, 1
1142 jne short @@restdpl_end
1143
1144 cmp SelRef, 1
1145 jne short @@restdpl_endrest
1146 push eax
1147 push ebx
1148 sgdt fword ptr [gdtsave] ; access the GDT ptr
1149 mov ebx, dword ptr [gdtsave+2] ; get lin addr of GDT
1150 mov eax, ds ; build offset into table
1151 and eax, 0fffffff8h ; mask away DPL
1152 add ebx, eax ; build address
1153
1154 mov eax, oldDPL
1155 mov dword ptr [ebx+4], eax
1156 pop ebx
1157 pop eax
1158@@restdpl_endrest:
1159 dec SelRef
1160@@restdpl_end:
1161 ret
1162RestoreSelDPL endp
1163ENDIF
1164
1165;*******************************************************************************
1166;Copy parameters to 16 bits stack and call 16:32 IDC handler
1167;
1168; Paramters: IDC16_HANDLER pHandler
1169; ULONG cmd
1170; ULONG param1
1171; ULONG param2
1172;*******************************************************************************
1173 PUBLIC _CallPDD16
1174 ALIGN 4
1175_CallPDD16 proc near
1176 push ebp
1177 mov ebp, esp
1178 push ebx
1179
1180 lea ebx, [ebp+8]
1181 DevThunkStackTo16_Int
1182
1183 push dword ptr [ebx+16] ;param2
1184 push dword ptr [ebx+12] ;param1
1185 push dword ptr [ebx+8] ;cmd
1186 call fword ptr [ebx]
1187 add sp, 12
1188
1189 DevThunkStackTo32_Int
1190
1191 pop ebx
1192 pop ebp
1193 ret
1194_CallPDD16 endp
1195
1196;*******************************************************************************
1197;Strategy entrypoint
1198; Parameter:
1199; fs:ebx -> request packet pointer
1200;*******************************************************************************
1201 ALIGN 4
1202STRATEGY_ proc far
1203 push ds
1204 push es
1205 push fs
1206 push gs
1207
1208 mov eax, DOS32FLATDS
1209 mov ds, eax
1210 mov es, eax
1211
1212IFDEF FLATSTACK
1213
1214IFNDEF KEE
1215 ;done in init.cpp for the KEE version
1216 cmp dword ptr [intSwitchStack], 0
1217 jne stratcontinue
1218
1219 ;get TKSSBase & intSwitchStack pointers
1220 call GetTKSSBase
1221stratcontinue:
1222ENDIF
1223
1224 DevThunkStackTo32
1225 cmp eax, 0
1226 jne @@stackswitchfail_strat
1227
1228 call ALSA_STRATEGY
1229
1230 DevThunkStackTo16
1231
1232@@stackswitchfail_strat:
1233ELSE
1234 int 3
1235 call ALSA_STRATEGY
1236ENDIF
1237
1238 pop gs
1239 pop fs
1240 pop es
1241 pop ds
1242 retf
1243STRATEGY_ endp
1244
1245;*******************************************************************************
1246;IDC entrypoint
1247;
1248;in: ecx = cmd
1249; edx = ULONG parameter
1250;return value in eax
1251;*******************************************************************************
1252 ALIGN 4
1253IDC_ proc far
1254 push ds
1255 push es
1256 push fs
1257 push gs
1258
1259 mov eax, DOS32FLATDS
1260 mov ds, eax
1261 mov es, eax
1262
1263IFDEF FLATSTACK
1264 DevThunkStackTo32
1265 cmp eax, 0
1266 jne @@stackswitchfail_idc
1267
1268 call ALSA_IDC
1269
1270 DevThunkStackTo16
1271
1272@@stackswitchfail_idc:
1273
1274ELSE
1275 int 3
1276 call ALSA_IDC
1277ENDIF
1278
1279 pop gs
1280 pop fs
1281 pop es
1282 pop ds
1283 retf
1284IDC_ endp
1285;*******************************************************************************
1286;Timer entrypoint
1287;
1288;*******************************************************************************
1289 ALIGN 4
1290TIMER_ proc far
1291 push ds
1292 push es
1293 push fs
1294 push gs
1295
1296 mov eax, DOS32FLATDS
1297 mov ds, eax
1298 mov es, eax
1299
1300IFDEF FLATSTACK
1301 DevThunkStackTo32
1302 cmp eax, 0
1303 jne @@stackswitchfail_timer
1304
1305 call ALSA_TIMER_
1306
1307 DevThunkStackTo16
1308
1309@@stackswitchfail_timer:
1310
1311ELSE
1312 int 3
1313 call ALSA_TIMER_
1314ENDIF
1315
1316 pop gs
1317 pop fs
1318 pop es
1319 pop ds
1320 retf
1321TIMER_ endp
1322
1323
1324;*******************************************************************************
1325;32 bits interrupt wrapper which calls the generic interrupt handler in irq.cpp
1326;On entry:
1327; EBX = irq nr
1328;*******************************************************************************
1329 ALIGN 4
1330Interrupt32 proc far
1331 enter 0, 0
1332 and sp, 0fffch ; align stack
1333
1334 pushad
1335 push ds
1336 push es
1337 push fs
1338 push gs
1339
1340 mov eax, DOS32FLATDS
1341 mov ds, eax
1342 mov es, eax
1343
1344 pushfd
1345 cli
1346
1347IFDEF FLATSTACK
1348 DevThunkStackTo32
1349 cmp eax, 0
1350 jne @@stackswitchfail_irq
1351
1352 ;returns irq status in eax (1=handled; 0=unhandled)
1353 call ALSA_Interrupt
1354
1355 DevThunkStackTo16
1356
1357@@stackswitchfail_irq:
1358ELSE
1359 int 3
1360 call ALSA_Interrupt
1361ENDIF
1362
1363 ;restore flags
1364 popfd
1365
1366 cmp eax, 1
1367 je irqhandled
1368 stc ;tell OS/2 kernel we didn't handle this interrupt
1369 jmp short endofirq
1370
1371irqhandled:
1372 clc ;tell OS/2 kernel this interrupt was ours
1373
1374endofirq:
1375
1376 pop gs
1377 pop fs
1378 pop es
1379 pop ds
1380 popad
1381
1382 leave
1383 retf
1384Interrupt32 endp
1385
1386 ALIGN 4
1387HelpClose proc far
1388 push ds
1389 mov eax, DOS32FLATDS
1390 mov ds, eax
1391 mov _rdOffset, 0
1392 pop ds
1393 retf
1394HelpClose endp
1395
1396
1397;*******************************************************************************
1398;resource manager wrappers (switch stack and call 16 bits function)
1399;*******************************************************************************
1400 public _RMAllocResource
1401 public _RMDeallocResource
1402 public _RMCreateDevice
1403 public _RMCreateAdapter
1404 public _RMCreateDriver
1405 public _RMDestroyDriver
1406 public _RMGetNodeInfo
1407 public _RMDevIDToHandleList
1408 public _RMHandleToResourceHandleList
1409
1410 ALIGN 4
1411
1412 ALIGN 4
1413_RMAllocResource proc near
1414 enterKEERM
1415 xor eax, eax
1416 push dword ptr [edi+16]
1417 push dword ptr [edi+12]
1418 push dword ptr [edi+8]
1419 call fword ptr RMAllocResource1632
1420 add sp, 12
1421 retKEERM
1422_RMAllocResource endp
1423
1424 ALIGN 4
1425_RMDeallocResource proc near
1426 enterKEERM
1427 xor eax, eax
1428 push dword ptr [edi+12]
1429 push dword ptr [edi+8]
1430 call fword ptr RMDeallocResource1632
1431 add sp, 8
1432 retKEERM
1433_RMDeallocResource endp
1434
1435 ALIGN 4
1436_RMCreateDevice proc near
1437 enterKEERM
1438 xor eax, eax
1439 push dword ptr [edi+24]
1440 push dword ptr [edi+20]
1441 push dword ptr [edi+16]
1442 push dword ptr [edi+12]
1443 push dword ptr [edi+8]
1444 call fword ptr RMCreateDevice1632
1445 add sp, 20
1446 retKEERM
1447_RMCreateDevice endp
1448
1449 ALIGN 4
1450_RMCreateAdapter proc near
1451 enterKEERM
1452 xor eax, eax
1453 push dword ptr [edi+24]
1454 push dword ptr [edi+20]
1455 push dword ptr [edi+16]
1456 push dword ptr [edi+12]
1457 push dword ptr [edi+8]
1458 call fword ptr RMCreateAdapter1632
1459 add sp, 20
1460 retKEERM
1461_RMCreateAdapter endp
1462
1463 ALIGN 4
1464_RMCreateDriver proc near
1465 enterKEERM
1466 xor eax, eax
1467 push dword ptr [edi+12]
1468 push dword ptr [edi+8]
1469 call fword ptr RMCreateDriver1632
1470 add sp, 8
1471 retKEERM
1472_RMCreateDriver endp
1473
1474 ALIGN 4
1475_RMDestroyDriver proc near
1476 enterKEERM
1477 xor eax, eax
1478 push dword ptr [edi+8]
1479 call fword ptr RMDestroyDriver1632
1480 add sp, 4
1481 ret32
1482_RMDestroyDriver endp
1483
1484 ALIGN 4
1485_RMGetNodeInfo proc near
1486 enterKEERM
1487 xor eax, eax
1488 push dword ptr [edi+16]
1489 push dword ptr [edi+12]
1490 push dword ptr [edi+8]
1491 call fword ptr RMGetNodeInfo1632
1492 add sp, 12
1493 retKEERM
1494_RMGetNodeInfo endp
1495
1496 ALIGN 4
1497_RMDevIDToHandleList proc near
1498 enterKEERM
1499 xor eax, eax
1500 push dword ptr [edi+40]
1501 push dword ptr [edi+36]
1502 push dword ptr [edi+32]
1503 push dword ptr [edi+28]
1504 push dword ptr [edi+24]
1505 push dword ptr [edi+20]
1506 push dword ptr [edi+16]
1507 push dword ptr [edi+12]
1508 push dword ptr [edi+8]
1509 call fword ptr RMDevIDToHandleList1632
1510 add sp, 36
1511 retKEERM
1512_RMDevIDToHandleList endp
1513
1514 ALIGN 4
1515_RMHandleToResourceHandleList proc near
1516 enterKEERM
1517 xor eax, eax
1518 push dword ptr [edi+12]
1519 push dword ptr [edi+8]
1520 call fword ptr RMHandleToResourceHandleList1632
1521 add sp, 8
1522 retKEERM
1523_RMHandleToResourceHandleList endp
1524
1525
1526CODE32 ends
1527
1528DATA32 segment
1529 public __OffsetFinalCS16
1530 public __OffsetFinalDS16
1531 public PDDName
1532 public _MSG_TABLE32
1533 public RMAllocResource1632
1534 public RMDeallocResource1632
1535 public RMCreateDevice1632
1536 public RMCreateAdapter1632
1537 public RMCreateDriver1632
1538 public RMDestroyDriver1632
1539 public RMGetNodeInfo1632
1540 public RMDevIDToHandleList1632
1541 public RMHandleToResourceHandleList1632
1542 public _TimerHandler16
1543 public _ISR03
1544 public _ISR04
1545 public _ISR05
1546 public _ISR07
1547 public _ISR09
1548 public _ISR10
1549 public _ISR11
1550 public _ISR12
1551 public _ISR13
1552 public _ISR14
1553 public _ISR15
1554
1555IFDEF FLATSTACK
1556 extrn intSwitchStack : dword
1557ENDIF
1558
1559IFDEF KEE
1560 public stackbase
1561 public stacksel
1562
1563 stackbase dd 0
1564 stacksel dd 0
1565ELSE
1566
1567 public gdtsave
1568 public fWrongDPL
1569 public oldDPL
1570 public SelRef
1571
1572 tempeax dd 0
1573 tempedx dd 0
1574 tempesi dd 0
1575 cpuflags dd 0
1576
1577 gdtsave dq 0
1578 fWrongDPL dd 1 ;DOS32FLATDS has the wrong DPL for SS
1579 SelRef dd 0
1580 oldDPL dd 0
1581
1582 fInitStack dd 0
1583ENDIF
1584
1585 __OffsetFinalCS16 dw OFFSET CODE16:__OffFinalCS16
1586 __OffsetFinalDS16 dw OFFSET DATA16:__OffFinalDS16
1587
1588 _MSG_TABLE32 dw OFFSET DATA16:_MSG_TABLE16
1589 dw SEG DATA16:_MSG_TABLE16
1590
1591;16:16 address of driver name
1592 PDDName dw OFFSET DATA16:pddname16
1593 dw SEG DATA16:pddname16
1594
1595;16:32 addresses of resource manager functions in 16 bits code segment
1596 RMAllocResource1632 dd OFFSET CODE16:_RMAllocResource16
1597 dw SEG CODE16:_RMAllocResource16
1598 dw 0
1599 RMDeallocResource1632 dd OFFSET CODE16:_RMDeallocResource16
1600 dw SEG CODE16:_RMDeallocResource16
1601 dw 0
1602 RMCreateDevice1632 dd OFFSET CODE16:_RMCreateDevice16
1603 dw SEG CODE16:_RMCreateDevice16
1604 dw 0
1605 RMCreateAdapter1632 dd OFFSET CODE16:_RMCreateAdapter16
1606 dw SEG CODE16:_RMCreateAdapter16
1607 dw 0
1608 RMCreateDriver1632 dd OFFSET CODE16:_RMCreateDriver16
1609 dw SEG CODE16:_RMCreateDriver16
1610 dw 0
1611 RMDestroyDriver1632 dd OFFSET CODE16:_RMDestroyDriver16
1612 dw SEG CODE16:_RMDestroyDriver16
1613 dw 0
1614 RMGetNodeInfo1632 dd OFFSET CODE16:_RMGetNodeInfo16
1615 dw SEG CODE16:_RMGetNodeInfo16
1616 dw 0
1617 RMDevIDToHandleList1632 dd OFFSET CODE16:_RMDevIDToHandleList16
1618 dw SEG CODE16:_RMDevIDToHandleList16
1619 dw 0
1620
1621 RMHandleToResourceHandleList1632 dd OFFSET CODE16:_RMHandleToResourceHandleList16
1622 dw SEG CODE16:_RMHandleToResourceHandleList16
1623 dw 0
1624
1625;16:16 address of uniaud_stub_timer
1626 _TimerHandler16 dd OFFSET CODE16:uniaud_stub_timer
1627 dw OFFSET CODE16:uniaud_stub_timer
1628
1629;16:16 addresses of interrupt dispatchers
1630 _ISR03 dw OFFSET CODE16:ISR03_16
1631 dw SEG CODE16:ISR03_16
1632 _ISR04 dw OFFSET CODE16:ISR04_16
1633 dw SEG CODE16:ISR04_16
1634 _ISR05 dw OFFSET CODE16:ISR05_16
1635 dw SEG CODE16:ISR05_16
1636 _ISR07 dw OFFSET CODE16:ISR07_16
1637 dw SEG CODE16:ISR07_16
1638 _ISR09 dw OFFSET CODE16:ISR09_16
1639 dw SEG CODE16:ISR09_16
1640 _ISR10 dw OFFSET CODE16:ISR10_16
1641 dw SEG CODE16:ISR10_16
1642 _ISR11 dw OFFSET CODE16:ISR11_16
1643 dw SEG CODE16:ISR11_16
1644 _ISR12 dw OFFSET CODE16:ISR12_16
1645 dw SEG CODE16:ISR12_16
1646 _ISR13 dw OFFSET CODE16:ISR13_16
1647 dw SEG CODE16:ISR13_16
1648 _ISR14 dw OFFSET CODE16:ISR14_16
1649 dw SEG CODE16:ISR14_16
1650 _ISR15 dw OFFSET CODE16:ISR15_16
1651 dw SEG CODE16:ISR15_16
1652DATA32 ends
1653
1654end
1655
Note: See TracBrowser for help on using the repository browser.