home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / lxapi32.zip / Dev32 / lxstartup.asm < prev    next >
Assembly Source File  |  2002-04-27  |  17KB  |  721 lines

  1. ; $Id: lxstartup.asm,v 1.2 2002/04/26 23:08:57 smilcke Exp $
  2.  
  3. ;
  4. ; lxstatup.asm
  5. ; Autor:               Stefan Milcke
  6. ; Erstellt am:         08.12.2001
  7. ; Letzte Aenderung am: 28.04.2002
  8. ;
  9.        .386p
  10.  
  11.  
  12.        INCL_DOS        equ 1
  13.        INCL_DOSERRORS  equ 1
  14.        include os2.inc
  15.        include seg32.inc
  16.     include r0thunk.inc
  17.        include rp.inc
  18.        include rm.inc
  19.        include devhlp.inc
  20.  
  21. ;        EXTERNDEF DOS32FLATDS:ABS
  22.  
  23. MAX_GDTSELECTORS       EQU     10
  24. MAX_MESSAGESIZE        EQU     2048
  25.  
  26. ; Status word masks
  27. STERR    EQU    8000H        ; Bit 15 - Error
  28. STINTER EQU    0400H        ; Bit 10 - Interim character
  29. STBUI    EQU    0200H        ; Bit  9 - Busy
  30. STDON    EQU    0100H        ; Bit  8 - Done
  31. STECODE EQU    00FFH        ; Error code
  32.  
  33. DATA16 segment
  34.                extrn  DOS32FLATDS : abs                ; ring 0 FLAT kernel data selector
  35.                extrn __OffFinalDS16 : byte
  36.                extrn  LInfoSeg : dword
  37.         public _MSG_TABLE16
  38.         public DevHelpInit
  39.                public DeviceHelp
  40.         public fOpen    
  41.         public InitPktSeg
  42.         public InitPktOff
  43.         public _MESSAGE_STR
  44.         public FileName
  45.                public GDTSelectors
  46.                public ddTable
  47.                public irq_level_ptr
  48.  
  49. DeviceHelp     label byte
  50. DevHelpInit    dd 0
  51. GDTSelectors   dw[MAX_GDTSELECTORS] dup (0)
  52. ddTable        dw[6] dup (0)
  53. irq_level_ptr  dd 0
  54. fOpen        dd 0
  55. InitPktSeg    dw 0
  56. InitPktOff    dw 0
  57.  
  58. _MESSAGE_STR   db MAX_MESSAGESIZE dup (0)
  59. _MSG_TABLE16   dw 0    ;message length
  60.                dw OFFSET _MESSAGE_STR
  61.         dw SEG    _MESSAGE_STR
  62. FileName     db "LXAPIH$", 0
  63. hFile          dw 0
  64. PCIIDName      db "PCI.IDS",0
  65. PCIIDFILE      db 256 dup (0)
  66. hPCIID         dw 0
  67. ulFileAction   dw 0
  68.                dw 0
  69.  
  70. DATA16 ends
  71.  
  72. CODE16 segment
  73.        assume cs:CODE16, ds:DATA16
  74.        public help_stub_strategy
  75.        public device_stub_strategy
  76.     public device_stub_idc
  77.     public thunk3216_devhelp
  78.     public thunk3216_devhelp_modified_ds
  79.        extrn DOSOPEN       : far
  80.        extrn DOSWRITE      : far
  81.        extrn DOSCLOSE      : far
  82.        extrn __OffFinalCS16 : byte
  83.  
  84. ;DEZE MOET ALS EERSTE blijven staan!!!!
  85. help_stub_strategy proc far
  86.     pushad
  87.     push    ds
  88.     push    es
  89.     push    fs
  90.     push    gs
  91.  
  92.     mov    ax, DATA16
  93.     mov    ds, ax
  94.  
  95.        movzx     eax, byte ptr es:[bx].reqCommand
  96.     cmp    eax, 0                ; Init
  97.     je    short @@help_init
  98.        cmp     eax, 0Dh            ; DosOpen
  99.        jne     short @@help_error
  100. ;DosOpen
  101.        cmp     word ptr ds:(offset fOpen),0
  102.     je    short @@help_ret_ok        ; not ours
  103.     push    ebx                ; later weer nodig
  104.     push    es
  105.  
  106.        mov     word ptr ds:(offset fOpen),0
  107.        mov     ax, word ptr InitPktSeg
  108.     mov    fs, ax                ; fs:ebx = req. packet
  109.     xor    ebx, ebx
  110.        mov     bx, word ptr ds:(offset InitPktOff)
  111.     call    far ptr FLAT:STRATEGY_
  112.  
  113.     pop    es
  114.     pop    ebx                ; oude bx ptr
  115. @@help_ret:
  116.        mov     word ptr es:[bx].reqStatus, ax
  117. @@help_ret_error:
  118.     pop    gs
  119.     pop    fs
  120.     pop    es
  121.     pop    ds
  122.     popad
  123.     ret
  124.         
  125. @@help_init:
  126.     mov    eax, dword ptr es:[bx].i_devHelp
  127.        mov     dword ptr ds:(offset DevHelpInit ), eax
  128.        mov     word ptr es:[bx].o_codeend,(offset __OffFinalCS16)
  129.        mov     word ptr es:[bx].o_dataend,(offset __OffFinalDS16)
  130.        call    init_data
  131.        jc      short @@help_error
  132. @@help_ret_ok:
  133.     mov    ax, STDON
  134.     jmp    short @@help_ret
  135.  
  136. @@help_error:
  137.     mov    ax, STDON + STERR + ERROR_I24_BAD_COMMAND
  138.        mov     word ptr es:[bx].reqStatus, ax
  139.     jmp    short @@help_ret_error
  140. help_stub_strategy endp
  141.  
  142. init_data proc near
  143.        ; TODO: Check for errors after DevHelp
  144.        ; Do some additional inits
  145.        pushad
  146.        push    ds
  147.        push    es
  148.        push    fs
  149.        push    gs
  150.  
  151.        push    ds
  152.        pop     es
  153.  
  154.        ; Get irq_level_ptr from DOS var
  155.        mov     eax,13
  156.        mov     dl,DevHlp_GetDOSVar
  157.        call    dword ptr ds:(offset DevHelpInit)
  158.        movzx   esi,bx
  159.        mov     dl,DevHlp_VirtToLin
  160.        call    dword ptr ds:(offset DevHelpInit)
  161.        add     eax,4
  162.        mov     dword ptr ds:(offset irq_level_ptr),eax
  163.  
  164.        ; Get LDT InfoSeg
  165.        mov     al,2
  166.        mov     dl,DevHlp_GetDOSVar
  167.        call    dword ptr ds:(offset DevHelpInit)
  168.        jc      @F
  169.        push    es
  170.        mov     es,ax
  171.        mov     ax,es:[bx]
  172.        mov     word ptr LInfoSeg,ax
  173.        mov     ax,es:[bx+2]
  174.        mov     word ptr LInfoSeg+2,ax
  175.        pop     es
  176. @@:
  177.        ; Allocate GDT Selectors
  178.        mov     cx,MAX_GDTSELECTORS
  179.        mov     ax,ds
  180.        mov     bx,(offset GDTSelectors)
  181.        mov     dx,bx
  182.        mov     di,dx
  183.        mov     es,ax
  184.        mov     dl,DevHlp_AllocGDTSelector
  185.        call    dword ptr ds:(offset DevHelpInit)
  186.  
  187.        pop     gs
  188.        pop     fs
  189.        pop     es
  190.        pop     ds
  191.        popad
  192.        ret
  193. init_data endp
  194.  
  195. device_stub_strategy proc far
  196.     pushad
  197.     push    ds
  198.     push    es
  199.     push    fs
  200.     push    gs
  201.  
  202.     mov    ax, DATA16
  203.     mov    ds, ax
  204.  
  205.        movzx     eax, byte ptr es:[bx].reqCommand
  206.        cmp     eax, 0
  207.        jz     short @@init
  208.  
  209.     push    ebx
  210.     push    es
  211.     mov    ax, bx
  212.     xor    ebx, ebx            
  213.     mov    bx, ax
  214.     mov    ax, es
  215.     mov    fs, ax                ; fs:ebx = req. packet
  216.        call     far ptr FLAT:STRATEGY_          ; 32 bits strategy entry point
  217.  
  218.     pop    es
  219.     pop    ebx                ; oude bx ptr
  220.        mov     word ptr es:[bx].reqStatus, ax  ; status code
  221.  
  222. @@device_ret:
  223.  
  224.     pop    gs
  225.     pop    fs
  226.     pop    es
  227.     pop    ds
  228.     popad
  229.        ret
  230.  
  231. @@init:
  232.         ;
  233.         ; DEVICE= initialization
  234.         ;
  235.        mov     word ptr ds:(InitPktSeg), es
  236.        mov     word ptr ds:(InitPktOff), bx
  237.        inc     word ptr ds:(fOpen)
  238.  
  239.     call     device_init
  240.  
  241.        mov     word ptr es:[bx].reqStatus, ax  ; status code (ret by device_init)
  242.        mov     word ptr es:[bx].o_codeend,(offset __OffFinalCS16)
  243.        mov     word ptr es:[bx].o_dataend,(offset __OffFinalDS16)
  244.     jmp     short @@device_ret
  245.  
  246. init_err:
  247.     mov     dword ptr es:[bx].i_devHelp, 0
  248.     jmp     short @@device_ret
  249.  
  250. device_stub_strategy endp
  251.  
  252. get16_path_from_arg proc near
  253.        ; es:si -> source
  254.        ; ds:di -> destination
  255.        ; on return ds:di points to after the last backslash
  256.        push    di
  257. @@:    mov     al,byte ptr es:[si]
  258.        mov     byte ptr ds:[di],al
  259.        inc     si
  260.        inc     di
  261.        cmp     al,0
  262.        je      short @F
  263.        cmp     al,' '
  264.        jne     short @B
  265. @@:    pop     ax
  266. @@:    cmp     di,ax
  267.        je      short @F
  268.        cmp     byte ptr ds:[di],'\'
  269.        je      short @F
  270.        dec     di
  271.        cmp     di,ax
  272.        jne     @B
  273. @@:    cmp     di,ax
  274.        je      short @F
  275.        inc     di
  276. @@:    ret
  277. get16_path_from_arg endp
  278.  
  279. device_init proc near
  280.     enter     24, 0
  281.     push     ds
  282.     push     es
  283.     push     bx
  284.     push     si
  285.     push     di
  286.  
  287.        ; bp      ->  old bp
  288.        ; bp - 2  -> FileHandle
  289.        ; bp - 4  -> ActionTaken
  290.        ; bp - 8  -> IOCTL parm (4 bytes)  : union mwdd32_ioctl_init_device_parm
  291.        ; bp - 24 -> IOCTL data (16 bytes) : union mwdd32_ioctl_init_device_data
  292.  
  293.        ; Get path from args
  294.        push    es
  295.        mov     si, word ptr es:[bx].i_initArgs
  296.        mov     es, word ptr es:[bx+2].i_initArgs
  297.        mov     di,offset PCIIDFILE
  298.        call    get16_path_from_arg
  299.        mov     si,offset PCIIDName
  300. @@:    mov     al,byte ptr ds:[si]
  301.        mov     byte ptr ds:[di],al
  302.        inc     si
  303.        inc     di
  304.        cmp     al,0
  305.        jne     short @B
  306.        pop     es
  307.  
  308.        ; Open PCI.IDS
  309.        push    seg DATA16
  310.        push    (offset PCIIDFILE)
  311.        push    seg DATA16
  312.        push    (offset hPCIID)
  313.        push    seg DATA16
  314.        push    (offset ulFileAction)
  315.        push    dword ptr 0              ; File size (ULONG)
  316.        push    0                        ; FileAttribute (USHORT)
  317.        push    OPEN_ACTION_FAIL_IF_NEW + OPEN_ACTION_OPEN_IF_EXISTS
  318.        push     OPEN_SHARE_DENYNONE + OPEN_ACCESS_READONLY
  319.        push    dword ptr 0              ; Reserved (ULONG)
  320.        call     DOSOPEN
  321.        cmp     ax,0
  322.        je      short @F
  323.        mov     word ptr hPCIID,0
  324. @@:
  325.        ;
  326.        ; Open wathlp$
  327.        ;
  328.        push     seg DATA16                 ; seg  FileName
  329.        push    (offset FileName)
  330.        push    seg DATA16
  331.        push    (offset hFile)
  332.        push    seg DATA16
  333.        push    (offset ulFileAction)
  334.        push     dword ptr 0                ; file size
  335.        push     0                          ; file attributes
  336.        push     OPEN_ACTION_FAIL_IF_NEW + OPEN_ACTION_OPEN_IF_EXISTS
  337.        push     OPEN_SHARE_DENYNONE + OPEN_ACCESS_READONLY
  338.        push     dword ptr 0                ; reserved
  339.        call     DOSOPEN
  340.        cmp     ax, NO_ERROR
  341.        jnz     short @@error
  342.  
  343.        ;
  344.        ; Close wathlp$
  345.        ;
  346.        mov     ax,word ptr ds:[hFile]
  347.        push    ax
  348. ;       push     word ptr ds:[hFile]
  349.        call     DOSCLOSE
  350.  
  351.        ;
  352.        ; Close PCI.IDS
  353.        ;
  354.        push    ax
  355.        mov     ax,word ptr ds:[hPCIID]
  356.        cmp     ax,0
  357.        je      short @F
  358.        push    ax
  359.        call    DOSCLOSE
  360.  
  361. @@:    pop     ax
  362.  
  363. ;       cmp     ax, NO_ERROR
  364. ;       jnz     short @@error
  365.        cmp     word ptr ds:[hFile],0
  366.        je      short @@error
  367.  
  368. @@out:
  369.        push    eax
  370.  
  371.        push    0001H
  372.        push    DATA16
  373.        push    (offset _MESSAGE_STR)
  374.        push    word ptr ds:(offset _MSG_TABLE16)
  375.        push    ss
  376.        lea     dx,[bp - 2]
  377.        push    dx
  378.        call    far ptr DOSWRITE
  379.  
  380.        pop     eax
  381.  
  382.     pop     di
  383.     pop     si
  384.     pop     bx
  385.     pop     es
  386.     pop     ds
  387.     leave
  388.     ret
  389. @@error:
  390.     mov     ax, STDON + STERR + ERROR_I24_GEN_FAILURE
  391.     jmp     short @@out
  392.  
  393. device_init endp
  394.  
  395. ;in: cx = cmd
  396. ;    bx = lower 16 bits of ULONG parameter
  397. ;    dx = upper 16 bits of ULONG parameter
  398. ;return value in dx:ax
  399. device_stub_idc proc far
  400.        enter   0,0
  401.        and     sp, 0fffch
  402.        shl     edx,16
  403.        mov     dx,bx
  404.        push    ds
  405.        push    DATA16
  406.        pop     ds
  407.        call    far ptr FLAT:IDC_
  408.        pop     ds
  409.        mov     dx,ax
  410.        shr     eax,16
  411.        xchg    ax,dx
  412.        leave
  413.        retf
  414. device_stub_idc endp
  415.  
  416. timer_handler  proc far
  417.        pushad
  418.        push    ds
  419.        push    es
  420.        push    fs
  421.        push    gs
  422.        mov     ax,DATA16
  423.        mov     ds,ax
  424.        call    far ptr FLAT:TIMER_
  425.        pop     gs
  426.        pop     fs
  427.        pop     es
  428.        pop     ds
  429.        popad
  430.        retf
  431. timer_handler  endp
  432.  
  433. irq_handler16  proc far
  434.        push    DATA16
  435.        pop     ds
  436.        call    far ptr FLAT:IRQ_
  437.        neg     eax
  438.        retf
  439. irq_handler16  endp
  440.  
  441.     ALIGN   2
  442. ;use devhlp pointer stored in 16 bits code segment
  443. thunk3216_devhelp:
  444.     push    ds
  445.     push    DATA16
  446.     pop    ds
  447.        call    dword ptr ds:(offset DevHelpInit)
  448.     pop    ds
  449.  
  450.        jmp     far ptr FLAT:thunk1632_devhelp
  451.  
  452.     ALIGN     2
  453. thunk3216_devhelp_modified_ds:
  454.     push    gs
  455.     push    DATA16
  456.     pop    gs
  457.        call    dword ptr gs:(offset DevHelpInit)
  458.     pop    gs
  459.        jmp     far ptr FLAT:thunk1632_devhelp_modified_ds
  460.  
  461. ;***************************
  462. ;Resource Manager calls
  463. ;***************************
  464. CODE16 ends
  465.  
  466. CODE32 segment
  467. ASSUME CS:FLAT, DS:FLAT, ES:FLAT
  468.        public __OffBeginCS32
  469.        public __GETDS
  470.        public thunk1632_devhelp
  471.     public thunk1632_devhelp_modified_ds
  472.        public DevHlp
  473.        public DevHlp_ModifiedDS
  474.        public STRATEGY_
  475.        public IDC_
  476.        public TIMER_
  477.        public IRQ_
  478.        extrn   STRATEGY_ENTRY : far
  479.        extrn   IDC_ENTRY : far
  480.        extrn   TIMER_ENTRY : far
  481.        extrn   irq_handler : far
  482. IFDEF KEE
  483.     extrn  KernThunkStackTo16 : near
  484.     extrn  KernThunkStackTo32 : near
  485. ENDIF
  486.  
  487. __OffBeginCS32:
  488.  
  489. ;Called by Watcom to set the DS
  490. __GETDS proc near
  491.     push    eax
  492.        mov     eax, DOS32FLATDS
  493.     mov    ds, eax
  494.     pop    eax
  495.     ret
  496. __GETDS endp
  497.  
  498. __wcpp_2_pure_error__:
  499. __wcpp_2_undef_vfun__:
  500. __wcpp_2_undefed_cdtor__:
  501. __wcpp_2_dtor_array_store__:
  502. DevHelpDebug  proc near
  503.        int 3
  504.        int 3
  505.        ret
  506. DevHelpDebug  endp
  507.  
  508.     ALIGN     4
  509.  
  510. DevHlp proc near
  511. IFDEF  KEE
  512.        push    eax
  513.        call    KernThunkStackTo16
  514.        pop     eax
  515. ENDIF
  516.     jmp    far ptr CODE16:thunk3216_devhelp
  517.     ALIGN 4
  518. thunk1632_devhelp:
  519. IFDEF  KEE
  520.        push    eax
  521.        push    edx
  522.        call    KernThunkStackTo32
  523.        pop     edx     ; trashed by KernThunkStackTo32
  524.        pop     eax     ; trashed by KernThunkStackTo32
  525. ENDIF
  526.     ret
  527. DevHlp endp
  528.  
  529.     ALIGN     4
  530. DevHlp_ModifiedDS proc near
  531. IFDEF  KEE
  532.        push    eax
  533.        call    KernThunkStackTo16
  534.        pop     eax
  535. ENDIF
  536.     jmp    far ptr CODE16:thunk3216_devhelp_modified_ds
  537.     ALIGN 4
  538. thunk1632_devhelp_modified_ds:
  539. IFDEF  KEE
  540.        push    eax
  541.        push    edx
  542.        call    KernThunkStackTo32
  543.        pop     edx     ; trashed by KernThunkStackTo32
  544.        pop     eax     ; trashed by KernThunkStackTo32
  545. ENDIF
  546.     ret
  547. DevHlp_ModifiedDS endp
  548.  
  549. STRATEGY_ proc far
  550.        push    ds
  551.        push    es
  552.        push    fs
  553.        push    gs
  554.        mov     eax,DOS32FLATDS
  555.        mov     ds,eax
  556.        mov     es,eax
  557. IFDEF  KEE
  558.        push    stacksel
  559.        push    stackbase
  560.        push    edx
  561.        mov     edx,ss
  562.        mov     stacksel,edx
  563.        call    KernThunkStackTo32
  564.        mov     stackbase,edx
  565.        pop     edx
  566.        call    STRATEGY_ENTRY
  567.        push    eax
  568.        call    KernThunkStackTo16
  569.        pop     eax
  570.        pop     stackbase
  571.        pop     stacksel
  572. ELSE
  573.        call    STRATEGY_ENTRY
  574. ENDIF
  575.        pop     gs
  576.        pop     fs
  577.        pop     es
  578.        pop     ds
  579.        retf
  580. STRATEGY_ endp
  581.  
  582. ;in: ecx = cmd
  583. ;    edx = ULONG parameter
  584. ;return value in eax
  585. IDC_ proc far
  586.        push    ds
  587.        push    es
  588.        push    fs
  589.        push    gs
  590.        push    ebx
  591.        mov     eax,DOS32FLATDS
  592.        mov     ds,eax
  593.        mov     es,eax
  594. IFDEF  KEE
  595.        push    stacksel
  596.        push    stackbase
  597.        push    edx
  598.        mov     edx,ss
  599.        mov     stacksel,edx
  600.        call    KernThunkStackTo32
  601.        mov     stackbase,edx
  602.        pop     edx
  603.        call    IDC_ENTRY
  604.        push    eax
  605.        call    KernThunkStackTo16
  606.        pop     eax
  607.        pop     stackbase
  608.        pop     stacksel
  609. ELSE
  610.        call    IDC_ENTRY
  611. ENDIF
  612.        pop     ebx
  613.        pop     gs
  614.        pop     fs
  615.        pop     es
  616.        pop     ds
  617.        retf
  618. IDC_ endp
  619.  
  620. TIMER_ proc far
  621.        mov     eax,DOS32FLATDS
  622.        mov     ds,eax
  623.        mov     es,eax
  624. IFDEF KEE
  625.        push    stacksel
  626.        push    stackbase
  627.        push    edx
  628.        mov     edx,ss
  629.        mov     stacksel,edx
  630.        call    KernThunkStackTo32
  631.        mov     stackbase,edx
  632.        pop     edx
  633.        call    TIMER_ENTRY
  634.        push    eax
  635.        call    KernThunkStackTo16
  636.        pop     eax
  637.        pop     stackbase
  638.        pop     stacksel
  639. ELSE
  640.        call    TIMER_ENTRY
  641. ENDIF
  642.        retf
  643. TIMER_ endp
  644.  
  645. IRQ_   proc    far
  646.        ; TODO: Check, if irq_level_ptr is valid
  647.        mov     edx,DOS32FLATDS
  648.        mov     ds,edx
  649.        mov     es,edx
  650. IFDEF  KEE
  651.        push    stacksel
  652.        push    stackbase
  653.        push    edx
  654.        mov     edx,ss
  655.        mov     stacksel,edx
  656.        call    KernThunkStackTo32
  657.        mov     stackbase,edx
  658.        pop     edx
  659.  
  660. ; New irq level variable !!!
  661.        mov     eax,dword ptr irq_level_ptr
  662.        mov     eax,[eax]
  663.        call    irq_handler
  664.        push    eax
  665.        call    KernThunkStackTo16
  666.        pop     eax
  667.        pop     stackbase
  668.        pop     stacksel
  669. ELSE
  670. ; New irq level variable !!!
  671.        mov     eax,word ptr irq_level_ptr
  672.        mov     eax,[eax]
  673.        call    irq_handler
  674. ENDIF
  675.        retf
  676. IRQ_   endp
  677.  
  678. CODE32 ends
  679.  
  680. DATA32 segment
  681.        public  __OffsetFinalCS16
  682.        public  __OffsetFinalDS16
  683.        public  __wcpp_2_pure_error__
  684.        public  __wcpp_2_undef_vfun__
  685.        public  __wcpp_2_undefed_cdtor__
  686.        public  __wcpp_2_dtor_array_store__
  687.        public  _MSG_TABLE32
  688.        public  __OffBeginDS32
  689.        public stackbase
  690.        public stacksel
  691.        public _GDTSelectors32
  692.        public  _IRQLEVELPTR
  693.        public  _IRQ_HDLRPTR
  694.        public  _TIMER_HDLRPTR
  695.        public  _PHPCIID
  696.  
  697. __OffBeginDS32         dd 0
  698. stacksel               dd 0
  699. stackbase              dd 0
  700.  
  701. __OffsetFinalCS16  dw (OFFSET CODE16:__OffFinalCS16)
  702. __OffsetFinalDS16  dw (OFFSET DATA16:__OffFinalDS16)
  703.  
  704. _MSG_TABLE32       dw (OFFSET  DATA16:_MSG_TABLE16)
  705.                    dw SEG     DATA16:_MSG_TABLE16
  706. _GDTSelectors32    dw (OFFSET DATA16:GDTSelectors)
  707.                    dw SEG DATA16:GDTSelectors
  708. _IRQ_HDLRPTR   dw (offset CODE16:irq_handler16)
  709.                dw SEG CODE16
  710. _TIMER_HDLRPTR dw (offset CODE16:timer_handler)
  711.                dw SEG CODE16
  712. _IRQLEVELPTR   dw (offset DATA16:irq_level_ptr)
  713.                dw SEG DATA16:irq_level_ptr
  714. _PHPCIID       dw (OFFSET DATA16:hPCIID)
  715.                dw SEG DATA16:hPCIID
  716.  
  717. DATA32 ends
  718.  
  719. end
  720.  
  721.