home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 11 Util / 11-Util.zip / CMDLIN.ZIP / ASM / DEVHLP.ASM < prev   
Assembly Source File  |  1992-12-09  |  21KB  |  959 lines

  1.         PAGE    85,132
  2.             TITLE   DEVHELP -- DevHelp interface for 'C' device drivers
  3.             .386P
  4. ;
  5. ;    devhlp.asm    Date=921209
  6. ;
  7. ;    DevHelp interface for 'C' device drivers
  8. ;
  9. ;
  10.  
  11. ;========================================================================
  12.  
  13. BPTR        EQU     BYTE PTR                                         
  14. WPTR        EQU     WORD PTR
  15. DPTR        EQU     DWORD PTR
  16.  
  17. ;=========================================================================
  18.  
  19.         INCLUDE    devhlp.inc
  20.  
  21. ;=========================================================================
  22.  
  23. YIELD        EQU    002h            ; yields the CPU to any eligible threads
  24. BLOCK        EQU    004h            ; blocks requesting thread
  25. RUN        EQU    005h            ; unblocks blocked thread
  26. SEM_REQUEST    EQU    006h            ; request a semaphore
  27. SEM_CLEAR    EQU    007h            ; clears (releases) a RAM or system semaphore
  28. SEM_HANDLE    EQU    008h            ; creates or releases a semaphore handle
  29. PUSH_REQ_PAK    EQU    009h            ; push a request packet on the queue
  30. PULL_REQ_PAK    EQU    00ah            ; pull a request packet off the queue
  31. PHYS_TO_VIRT    EQU    015h            ; converts a physical address to virtual address
  32. VIRT_TO_PHYS    EQU    016h            ; converts virtual address to a physical address
  33. PHYS_TO_UVIRT    EQU    017h            ; converts a physical address to a virtual address
  34. ALLOC_PHYS    EQU    018h            ; allocates a fixed block of memory
  35. FREE_PHYS    EQU    019h            ; releases memory allocated by _AllocPhys
  36. SET_IRQ        EQU    01Bh            ; captures hardware interrupt vector
  37. UNSET_IRQ    EQU    01Ch            ; releases ownership of a hardware interrupt
  38. VERIFY_ACCESS    EQU    027h            ; verifies access to a range of memory addresses
  39. ATTACH_DD    EQU    02Ah            ; attach to a device
  40. ALLOC_GDT_SEL    EQU    02Dh            ; allocate a GDT selector
  41. PHYS_TO_GDT_SEL    EQU    02Eh            ; maps a 32 bit physical address to a GDT selector
  42. REAL_TO_PROT    EQU    02Fh            ; switch form real mode to protected mode
  43. PROT_TO_REAL    EQU    030h            ; switch from protected mode to real mode
  44. EOI        EQU    031h            ; issues end of interrupt
  45. UNPHYS_TO_VIRT    EQU    032h            ; releases virtual addresses
  46. STACK_USAGE    EQU    03ah            ; indicate stack usage
  47. DISPLAY_MESSAGE    EQU    03dh            ; display a message
  48.  
  49. ;========================================================================
  50.  
  51. BL_NORMAL    EQU    0000h            ; normal wakeup from Block
  52. BL_TIMEOUT    EQU    0100h            ; timeout wakeup
  53. BL_ABNORMAL    EQU    0200h            ; abnormal wakeup
  54. BL_INTERRUPT    EQU    0400h            ; sleep was interrupted
  55.  
  56. ;========================================================================
  57.  
  58.         PUBLIC  _DevHelpInit
  59.         PUBLIC  _AllocGDTSel
  60.         PUBLIC  _AllocPhys
  61.         PUBLIC  _AttachDD
  62.         PUBLIC  _Block
  63.         PUBLIC  _DisplayMessage
  64.         PUBLIC  _EOI
  65.         PUBLIC  _FreePhys
  66.         PUBLIC  _PhysToGDTSel
  67.         PUBLIC  _PhysToUVirt
  68.         PUBLIC  _PhysToVirt
  69.         PUBLIC  _ProtToReal
  70.         PUBLIC  _PullReqPacket
  71.         PUBLIC  _PushReqPacket
  72.         PUBLIC  _RealToProt
  73.         PUBLIC  _StackUsage
  74.         PUBLIC  _Run
  75.         PUBLIC  _SetIRQ
  76.         PUBLIC  _UnSetIRQ
  77.         PUBLIC  _VirtToPhys
  78.  
  79.         PUBLIC  _BreakPoint
  80.         PUBLIC  _SelectorLimit
  81.  
  82.         PUBLIC  DevHelp
  83.  
  84. ;************************************************************************
  85.  
  86. _DATA        SEGMENT WORD USE16 PUBLIC 'DATA'
  87.  
  88. Init        dw    0            ; are we initialized
  89. DevHelp        dd    ?            ; DevHelp entry point
  90.  
  91. _DATA        ENDS
  92.  
  93. ;************************************************************************
  94.  
  95. CONST        SEGMENT WORD USE16 PUBLIC 'CONST'
  96. CONST        ENDS
  97.  
  98. ;************************************************************************
  99.  
  100. _BSS        SEGMENT WORD USE16 PUBLIC 'BSS'
  101. _BSS        ENDS
  102.  
  103. DGROUP        GROUP    CONST, _BSS, _DATA
  104.  
  105. ;************************************************************************
  106.  
  107. _TEXT        SEGMENT WORD USE16 PUBLIC 'CODE'
  108.         ASSUME  cs:_TEXT, ds:DGROUP, es:NOTHING, ss:NOTHING
  109.  
  110. ;========================================================================
  111.  
  112. init_frame    STRUC
  113.         dw    ?            ; bp
  114.         dw    ?            ; return address
  115. devHelpEntry    dd    ?            ; DevHelp entry point
  116. init_frame    ENDS
  117.  
  118. ;------------------------------------------------------------------------
  119.  
  120. _DevHelpInit    PROC    NEAR
  121.  
  122.         push    bp            ; save bp
  123.         mov    bp,sp            ; get base of stack
  124.  
  125.         push    ds            ; save registers
  126.         push    si
  127.  
  128.         mov    ax,DGROUP        ; data segment
  129.         mov    ds,ax
  130.  
  131.         mov    ax,WPTR devHelpEntry[bp]; get entry point
  132.         mov    WPTR DevHelp,ax
  133.         mov    ax,WPTR devHelpEntry+2[bp]
  134.         mov    WPTR DevHelp+2,ax
  135.  
  136.         mov    Init,1            ; init flag
  137.  
  138.         pop    si            ; restore registers
  139.         pop    ds
  140.         pop    bp
  141.         ret
  142.  
  143. _DevHelpInit    ENDP
  144.  
  145. ;========================================================================                    
  146.  
  147. allocGDT_frame    STRUC
  148.         dw    ?            ; bp
  149.         dw    ?            ; return address
  150. arraySel    dd    ?            ; selector array
  151. numSel        dw    ?            ; number of selectors
  152. allocGDT_frame    ENDS
  153.  
  154. ;------------------------------------------------------------------------
  155.  
  156. _AllocGDTSel    PROC    NEAR
  157.  
  158.         push    bp            ; save bp
  159.         mov    bp,sp            ; get base of stack
  160.  
  161.         push    ds            ; save registers
  162.         push    di
  163.  
  164.         mov    ax,DGROUP        ; data segment
  165.         mov    ds,ax
  166.  
  167.         les    di,arraySel[bp]        ; selector array
  168.  
  169.         mov    cx,numSel[bp]        ; number of selectors to allocate
  170.  
  171.         mov    dl,ALLOC_GDT_SEL    ; allocate a GDT selector
  172.  
  173.         call    DevHelp            ; call kernel
  174.         jc    as_exit            ; was the call successful?
  175.  
  176.         xor    ax,ax            ; successful
  177.  
  178. as_exit:
  179.         pop    di            ; restore registers
  180.         pop    ds
  181.         pop    bp
  182.         ret
  183.  
  184. _AllocGDTSel    ENDP
  185.  
  186. ;========================================================================                    
  187.  
  188. allocPhys_frame    STRUC
  189.         dw    ?            ; bp
  190.         dw    ?            ; return address
  191. memSize        dd    ?            ; memory size
  192. memType        dw    ?            ; number of selectors
  193. memAddr        dd    ?            ; memory address
  194. allocPhys_frame    ENDS
  195.  
  196. ;------------------------------------------------------------------------
  197.  
  198. _AllocPhys    PROC    NEAR
  199.  
  200.         push    bp            ; save bp
  201.         mov    bp,sp            ; get base of stack
  202.  
  203.         push    ds            ; save registers
  204.         push    di
  205.  
  206.         mov    ax,DGROUP        ; data segment
  207.         mov    ds,ax
  208.  
  209.         mov    bx,WPTR memSize[bp]    ; memory size
  210.         mov    ax,WPTR memSize+2[bp]
  211.  
  212.         mov    dx,memType[bp]        ; high or low
  213.         shl    dx,8
  214.  
  215.         mov    dl,ALLOC_PHYS        ; allocate physical memory
  216.  
  217.         call    DevHelp            ; call kernel
  218.         jc    ap_exit
  219.  
  220.         les    di,memAddr[bp]        ; pointer to phys address
  221.         mov    WPTR es:[di],bx        ; LSW
  222.         mov    WPTR es:[di+2],ax    ; MSW
  223.         xor    ax,ax
  224.  
  225. ap_exit:
  226.         pop    di            ; restore registers
  227.         pop    ds
  228.         pop    bp
  229.         ret
  230.  
  231. _AllocPhys    ENDP
  232.  
  233. ;========================================================================                    
  234.  
  235. attachDD_frame    STRUC
  236.         dw    ?            ; bp
  237.         dw    ?            ; return address
  238. attachData    dd    ?            ; address of attach struct
  239. attachName    dd    ?            ; address of attach device name
  240. attachDD_frame    ENDS
  241.  
  242. ;------------------------------------------------------------------------
  243.  
  244. _AttachDD    PROC    NEAR
  245.  
  246.         push    bp            ; save bp
  247.         mov    bp,sp            ; get base of stack
  248.  
  249.         push    ds            ; save registers
  250.         push    di
  251.  
  252.         mov    ax,DGROUP        ; data segment
  253.         mov    ds,ax
  254.  
  255.         lds    bx,attachName[bp]    ; device to attach to
  256.         lds    di,attachData[bp]    ; attach data structure
  257.  
  258.         mov    dl,ATTACH_DD        ; attach to a device
  259.  
  260.         call    DevHelp            ; call kernel
  261.         jc    ad_exit            ; was the call successful?
  262.  
  263.         xor    ax,ax            ; successful
  264.  
  265. ad_exit:
  266.         pop    di            ; restore registers
  267.         pop    ds
  268.         pop    bp
  269.         ret
  270.  
  271. _AttachDD    ENDP
  272.  
  273. ;========================================================================                    
  274.  
  275. attachDD_frame    STRUC
  276.         dw    ?            ; bp
  277.         dw    ?            ; return address
  278. blockEvent    dd    ?            ; event id
  279. blockInterval    dd    ?            ; interval timeout
  280. blockFlag    dw    ?            ; interruptible flag
  281. attachDD_frame    ENDS
  282.  
  283. ;------------------------------------------------------------------------
  284.  
  285. _Block        PROC    NEAR
  286.  
  287.         push    bp            ; save bp
  288.         mov    bp,sp            ; get base of stack
  289.  
  290.         push    ds            ; save registers
  291.         push    di
  292.  
  293.         mov    ax,DGROUP        ; data segment
  294.         mov    ds,ax
  295.  
  296.         mov    bx,WPTR blockEvent[bp]    ; event id
  297.         mov    ax,WPTR blockEvent+2[bp]
  298.                         ; timeout
  299.         mov    di,WPTR blockInterval[bp]
  300.         mov    cx,WPTR blockInterval+2[bp]
  301.  
  302.         mov    dx,blockFlag[bp]    ; interruptible?
  303.         shl    dx,8
  304.  
  305.         mov    dl,BLOCK        ; block current thread
  306.  
  307.         call    DevHelp            ; call kernel
  308.         mov    ax,0
  309.         jnc    bl_exit
  310.  
  311.         or    ax,BL_ABNORMAL        ; abnormal wakeup
  312.  
  313. bl_timeout:
  314.         jnz    bl_interrupt
  315.  
  316.         or    ax,BL_TIMEOUT        ; block timed out
  317.         jmp    bl_exit
  318.  
  319. bl_interrupt:
  320.         or    ax,BL_INTERRUPT        ; block was interrupted
  321.  
  322. bl_exit:
  323.         pop    di            ; restore registers
  324.         pop    ds
  325.         pop    bp
  326.         ret
  327.  
  328. _Block        ENDP
  329.  
  330. ;========================================================================                    
  331.  
  332. msg_frame    STRUC
  333.         dw    ?            ; bp
  334.         dw    ?            ; return address
  335. messageData    dd    ?            ; message data
  336. msg_frame    ENDS
  337.  
  338. ;------------------------------------------------------------------------
  339.  
  340. _DisplayMessage    PROC    NEAR
  341.  
  342.         push    bp            ; save bp
  343.         mov    bp,sp            ; get base of stack
  344.  
  345.         push    ds            ; save registers
  346.         push    di
  347.  
  348.         mov    ax,DGROUP        ; data segment
  349.         mov    ds,ax
  350.  
  351.         les    di,messageData[bp]    ; message data
  352.  
  353.         xor    bx,bx
  354.  
  355.         mov    dl,DISPLAY_MESSAGE    ; display a message
  356.  
  357.         call    DevHelp            ; call kernel
  358.  
  359.         pop    di            ; restore registers
  360.         pop    ds
  361.         pop    bp
  362.         ret
  363.  
  364. _DisplayMessage    ENDP
  365.  
  366. ;========================================================================                    
  367.  
  368. eoi_frame    STRUC
  369.         dw    ?            ; bp
  370.         dw    ?            ; return address
  371. eoiLevel    dw    ?            ; IRQ level
  372. eoi_frame    ENDS
  373.  
  374. ;------------------------------------------------------------------------
  375.  
  376. _EOI        PROC    NEAR
  377.  
  378.         push    bp            ; save bp
  379.         mov    bp,sp            ; get base of stack
  380.  
  381.         push    ds            ; save registers
  382.  
  383.         mov    ax,DGROUP        ; data segment
  384.         mov    ds,ax
  385.  
  386.         mov    ax,eoiLevel[bp]        ; IRQ level
  387.  
  388.         mov    dl,EOI            ; signal end of interrupt
  389.  
  390.         call    DevHelp            ; call kernel
  391.  
  392.         pop    ds            ; restore registers
  393.         pop    bp
  394.         ret
  395.  
  396. _EOI        ENDP
  397.  
  398. ;========================================================================                    
  399.  
  400. freePhys_frame    STRUC
  401.         dw    ?            ; bp
  402.         dw    ?            ; return address
  403. freeAddr    dd    ?            ; address of memory to free
  404. freePhys_frame    ENDS
  405.  
  406. ;------------------------------------------------------------------------
  407.  
  408. _FreePhys    PROC    NEAR
  409.  
  410.         push    bp            ; save bp
  411.         mov    bp,sp            ; get base of stack
  412.  
  413.         push    ds            ; save registers
  414.  
  415.         mov    ax,DGROUP        ; data segment
  416.         mov    ds,ax
  417.  
  418.         mov    bx,WPTR freeAddr[bp]    ; address of memory to free
  419.         mov    ax,WPTR freeAddr+2[bp]
  420.  
  421.         mov    dl,FREE_PHYS        ; free memory
  422.  
  423.         call    DevHelp            ; call kernel
  424.         jc    fp_exit            ; was the call successful?
  425.  
  426.         xor    ax,ax            ; successful
  427.  
  428. fp_exit:
  429.         pop    ds            ; restore registers
  430.         pop    bp
  431.         ret
  432.  
  433. _FreePhys    ENDP
  434.  
  435. ;========================================================================                    
  436.  
  437. mapGDT_frame    STRUC
  438.         dw    ?            ; bp
  439.         dw    ?            ; return address
  440. mapAddr        dd    ?            ; memory to map
  441. mapLength    dw    ?            ; length of the segment
  442. mapSel        dw    ?            ; selector to map
  443. mapGDT_frame    ENDS
  444.  
  445. ;------------------------------------------------------------------------
  446.  
  447. _PhysToGDTSel    PROC    NEAR
  448.  
  449.         push    bp            ; save bp
  450.         mov    bp,sp            ; get base of stack
  451.  
  452.         push    ds            ; save registers
  453.         push    si
  454.  
  455.         mov    ax,DGROUP        ; data segment
  456.         mov    ds,ax
  457.  
  458.         mov    bx,WPTR mapAddr[bp]    ; address of memory to map
  459.         mov    ax,WPTR mapAddr+2[bp]
  460.  
  461.         mov    cx,mapLength[bp]
  462.         mov    si,mapSel[bp]
  463.  
  464.         mov    dl,PHYS_TO_GDT_SEL    ; map memory to GDT selector
  465.  
  466.         call    DevHelp            ; call kernel
  467.         jc    ps_exit            ; was the call successful?
  468.  
  469.         xor    ax,ax            ; successful
  470.  
  471. ps_exit:
  472.         pop    si            ; restore registers
  473.         pop    ds
  474.         pop    bp
  475.         ret
  476.  
  477. _PhysToGDTSel    ENDP
  478.  
  479. ;========================================================================                    
  480.  
  481. uVirt_frame    STRUC
  482.         dw    ?            ; bp
  483.         dw    ?            ; return address
  484. uVirtAddr    dd    ?            ; memory to map
  485. uVirtLength    dw    ?            ; length of the segment
  486. uVirtType    dw    ?            ; type
  487. uVirtTag    dw    ?            ; tag
  488. uVirtPtr    dd    ?            ; pointer to memory
  489. uVirt_frame    ENDS
  490.  
  491. ;------------------------------------------------------------------------
  492.  
  493. _PhysToUVirt    PROC    NEAR
  494.  
  495.         push    bp            ; save bp
  496.         mov    bp,sp            ; get base of stack
  497.  
  498.         push    ds            ; save registers
  499.         push    si
  500.  
  501.         mov    ax,DGROUP        ; data segment
  502.         mov    ds,ax
  503.  
  504.         mov    bx,WPTR uVirtAddr[bp]    ; address of memory to map
  505.         mov    ax,WPTR uVirtAddr+2[bp]
  506.  
  507.         mov    cx,uVirtLength[bp]    ; length
  508.         mov    si,uVirtTag[bp]        ; tag
  509.         mov    dh,BPTR uVirtType[bp]    ; type
  510.  
  511.         mov    dl,PHYS_TO_UVIRT    ; map memory to LDT selector
  512.  
  513.         call    DevHelp            ; call kernel
  514.         jc    uv_err
  515.  
  516.         lds    si,uVirtPtr[bp]        ; pointer to a long
  517.         mov    WPTR ds:[si],bx        ; offset
  518.         mov    bx,es
  519.         mov    WPTR ds:[si+2],bx    ; selector
  520.  
  521.         xor    ax,ax            ; no error
  522.         jmp    uv_exit
  523.  
  524. uv_err:
  525.         mov    ax,1            ; invalid memory
  526.  
  527. uv_exit:
  528.         pop    si            ; restore registers
  529.         pop    ds
  530.         pop    bp
  531.         ret
  532.  
  533. _PhysToUVirt    ENDP
  534.  
  535. ;========================================================================
  536.  
  537. virt_frame    STRUC
  538.         dw    ?            ; bp
  539.         dw    ?            ; return address
  540. virtAddr    dd    ?            ; memory to map
  541. virtLength    dw    ?            ; length of the segment
  542. virtPtr        dd    ?            ; pointer to memory
  543. virt_frame    ENDS
  544.  
  545. ;------------------------------------------------------------------------
  546.  
  547. _PhysToVirt    PROC    NEAR
  548.  
  549.         push    bp            ; save bp
  550.         mov    bp,sp            ; get base of stack
  551.  
  552.         push    ds            ; save registers
  553.         push    si
  554.         push    di
  555.  
  556.         mov    ax,DGROUP        ; data segment
  557.         mov    ds,ax
  558.  
  559.         mov    bx,WPTR virtAddr[bp]    ; address of memory to map
  560.         mov    ax,WPTR virtAddr+2[bp]
  561.  
  562.         mov    cx,virtLength[bp]    ; length
  563.         mov    dh,PVT_ESDI
  564.  
  565.         mov    dl,PHYS_TO_VIRT        ; map memory to temporary GDT selector
  566.  
  567.         call    DevHelp            ; call kernel
  568.         jc    v_err
  569.  
  570.         lds    si,virtPtr[bp]        ; pointer to a pointer
  571.         mov    WPTR ds:[si],di        ; offset
  572.         mov    ax,es
  573.         mov    WPTR ds:[si+2],ax    ; selector
  574.  
  575.         xor    ax,ax            ; no error
  576.         jmp    v_exit
  577.  
  578. v_err:
  579.         mov    ax,1            ; invalid memory
  580.  
  581. v_exit:
  582.         pop    di            ; restore registers
  583.         pop    si
  584.         pop    ds
  585.         pop    bp
  586.         ret
  587.  
  588. _PhysToVirt    ENDP
  589.  
  590. ;========================================================================
  591.  
  592. reqPak_frame    STRUC
  593.         dw    ?            ; bp
  594.         dw    ?            ; return address
  595. prQueue        dw    ?            ; head of request packet queue
  596. prReqPak    dd    ?            ; pointer to request packet
  597. reqPak_frame    ENDS
  598.  
  599. ;------------------------------------------------------------------------
  600.  
  601. _PullReqPacket    PROC    NEAR
  602.  
  603.         push    bp            ; save bp
  604.         mov    bp,sp            ; get base of stack
  605.  
  606.         push    ds            ; save registers
  607.         push    si
  608.  
  609.         mov    ax,DGROUP        ; data segment
  610.         mov    ds,ax
  611.  
  612.         mov    si,prQueue[bp]        ; head of request packet queue
  613.         cmp    DPTR ds:[si],0        ; check if zero
  614.         jz    pull_none
  615.  
  616.         mov    dl,PULL_REQ_PAK        ; get request packet
  617.  
  618.         cli                ; must be protected
  619.         call    DevHelp            ; call kernel
  620.         sti                ; ok for ints now
  621.         jc    pull_none
  622.  
  623.         lds    si,prReqPak[bp]        ; pointer to request packet pointer
  624.         mov    WPTR [si],bx        ; return request packet
  625.         mov    ax,es
  626.         mov    WPTR [si+2],ax
  627.  
  628.         xor    ax,ax            ; found packet
  629.  
  630.         pop    si            ; restore registers
  631.         pop    ds
  632.         pop    bp
  633.         ret
  634.  
  635. pull_none:
  636.         lds    si,prReqPak[bp]        ; pointer to request packet pointer
  637.         mov    WPTR [si],0        ; return NULL
  638.         mov    WPTR [si+2],0
  639.  
  640.         mov    ax,1            ; no packet returned
  641.  
  642.         pop    si            ; restore registers
  643.         pop    ds
  644.         pop    bp
  645.         ret
  646.         
  647. _PullReqPacket    ENDP
  648.  
  649. ;========================================================================
  650.  
  651. _PushReqPacket    PROC    NEAR
  652.  
  653.         push    bp            ; save bp
  654.         mov    bp,sp            ; get base of stack
  655.  
  656.         push    ds            ; save registers
  657.         push    si
  658.  
  659.         mov    ax,DGROUP        ; data segment
  660.         mov    ds,ax
  661.  
  662.         mov    si,prQueue[bp]        ; head of request packet queue
  663.         les    bx,prReqPak[bp]        ; request packet to push
  664.         mov    dl,PUSH_REQ_PAK        ; put request packet on queue
  665.         cli                ; must be protected
  666.         call    DevHelp            ; call kernel
  667.         sti                ; ok for ints now
  668.  
  669.         xor    ax,ax            ; can't fail
  670.  
  671.         pop    si            ; restore registers
  672.         pop    ds
  673.         pop    bp
  674.         ret
  675.  
  676. _PushReqPacket    ENDP
  677.  
  678. ;========================================================================
  679.  
  680. _ProtToReal    PROC    NEAR
  681.  
  682.         push    ds            ; save registers
  683.  
  684.         mov    ax,DGROUP        ; data segment
  685.         mov    ds,ax
  686.  
  687.         mov    dl,PROT_TO_REAL        ; switch to protected mode
  688.  
  689.         call    DevHelp            ; call kernel
  690.         jc    pr_exit            ; was the call successful?
  691.  
  692.         xor    ax,ax            ; successful
  693.  
  694. pr_exit:
  695.         pop    ds            ; restore registers
  696.         ret
  697.  
  698. _ProtToReal    ENDP
  699.  
  700. ;========================================================================                    
  701.  
  702. _RealToProt    PROC    NEAR
  703.  
  704.         push    ds            ; save registers
  705.  
  706.         mov    ax,DGROUP        ; data segment
  707.         mov    ds,ax
  708.  
  709.         mov    dl,PROT_TO_REAL        ; switch to real mode
  710.  
  711.         call    DevHelp            ; call kernel
  712.         jc    rp_exit            ; was the call successful?
  713.  
  714.         xor    ax,ax            ; successful
  715.  
  716. rp_exit:
  717.         pop    ds            ; restore registers
  718.         ret
  719.  
  720. _RealToProt    ENDP
  721.  
  722. ;========================================================================                    
  723.  
  724. stack_frame    STRUC
  725.         dw    ?            ; bp
  726.         dw    ?            ; return address
  727. stackData    dd    ?            ; stack data
  728. stack_frame    ENDS
  729.  
  730. ;------------------------------------------------------------------------
  731.  
  732. _StackUsage    PROC    NEAR
  733.  
  734.         push    bp            ; save bp
  735.         mov    bp,sp            ; get base of stack
  736.  
  737.         push    ds            ; save registers
  738.  
  739.         mov    ax,DGROUP        ; data segment
  740.         mov    ds,ax
  741.  
  742.         lds    bx,stackData[bp]    ; stack data
  743.  
  744.         mov    dl,STACK_USAGE        ; register stack usage
  745.  
  746.         call    DevHelp            ; call kernel
  747.         jc    su_exit            ; was the call successful?
  748.  
  749.         xor    ax,ax            ; successful
  750.  
  751. su_exit:
  752.         pop    ds            ; restore registers
  753.         pop    bp
  754.         ret
  755.  
  756. _StackUsage    ENDP
  757.  
  758. ;========================================================================                    
  759.  
  760. run_frame    STRUC
  761.         dw    ?            ; bp
  762.         dw    ?            ; return address
  763. runEvent    dd    ?            ; event id
  764. run_frame    ENDS
  765.  
  766. ;------------------------------------------------------------------------
  767.  
  768. _Run        PROC    NEAR
  769.  
  770.         push    bp            ; save bp
  771.         mov    bp,sp            ; get base of stack
  772.  
  773.         push    ds            ; save registers
  774.  
  775.         mov    ax,DGROUP        ; data segment
  776.         mov    ds,ax
  777.  
  778.         mov    bx,WPTR runEvent[bp]    ; event id
  779.         mov    ax,WPTR runEvent+2[bp]
  780.  
  781.         mov    dl,RUN            ; run thread
  782.  
  783.         call    DevHelp            ; call kernel
  784.  
  785.         pop    ds            ; restore registers
  786.         pop    bp
  787.         ret
  788.  
  789. _Run        ENDP
  790.  
  791. ;========================================================================                    
  792.  
  793. setIRQ_frame    STRUC
  794.         dw    ?            ; bp
  795.         dw    ?            ; return address
  796. sIRQProc    dd    ?            ; intr routine
  797. sIRQLevel    dw    ?            ; IRQ level
  798. sIRQFlag    dw    ?            ; shareable flag
  799. setIRQ_frame    ENDS
  800.  
  801. ;------------------------------------------------------------------------
  802.  
  803. _SetIRQ        PROC    NEAR
  804.  
  805.         push    bp            ; save bp
  806.         mov    bp,sp            ; get base of stack
  807.  
  808.         push    ds            ; save registers
  809.  
  810.         mov    ax,DGROUP        ; data segment
  811.         mov    ds,ax
  812.  
  813.         mov    ax,WPTR sIRQProc[bp]    ; offset of intr procedure
  814.         mov    bx,sIRQLevel[bp]    ; IRQ level
  815.  
  816.         mov    dx,sIRQFlag[bp]        ; shareable flag
  817.         shl    dx,8            ; adjust value
  818.  
  819.         mov    dl,SET_IRQ        ; register intr routine
  820.  
  821.         call    DevHelp            ; call kernel
  822.         xor    ax,ax
  823.         jnc    si_exit
  824.  
  825.         mov    ax,1            ; interrupt routine not registered
  826.  
  827. si_exit:
  828.         pop    ds            ; restore registers
  829.         pop    bp
  830.         ret
  831.  
  832. _SetIRQ        ENDP
  833.  
  834. ;========================================================================                    
  835.  
  836. unIRQ_frame    STRUC
  837.         dw    ?            ; bp
  838.         dw    ?            ; return address
  839. uIRQLevel    dw    ?            ; IRQ level
  840. unIRQ_frame    ENDS
  841.  
  842. ;------------------------------------------------------------------------
  843.  
  844. _UnSetIRQ    PROC    NEAR
  845.  
  846.         push    bp            ; save bp
  847.         mov    bp,sp            ; get base of stack
  848.  
  849.         push    ds            ; save registers
  850.  
  851.         mov    ax,DGROUP        ; data segment
  852.         mov    ds,ax
  853.  
  854.         mov    bx,uIRQLevel[bp]    ; IRQ level
  855.  
  856.         mov    dl,UNSET_IRQ        ; register intr routine
  857.  
  858.         call    DevHelp            ; call kernel
  859.         xor    ax,ax
  860.         jnc    ui_exit
  861.  
  862.         mov    ax,1            ; interrupt routine not registered
  863.  
  864. ui_exit:
  865.         pop    ds            ; restore registers
  866.         pop    bp
  867.         ret
  868.  
  869. _UnSetIRQ    ENDP
  870.  
  871. ;========================================================================                    
  872.  
  873. phys_frame    STRUC
  874.         dw    ?            ; bp
  875.         dw    ?            ; return address
  876. physPtr        dd    ?            ; virtual address
  877. physAddr    dd    ?            ; pointer to memory
  878. phys_frame    ENDS
  879.  
  880. ;------------------------------------------------------------------------
  881.  
  882. _VirtToPhys    PROC    NEAR
  883.  
  884.         push    bp            ; save bp
  885.         mov    bp,sp            ; get base of stack
  886.  
  887.         push    ds            ; save registers
  888.         push    si
  889.  
  890.         mov    ax,DGROUP        ; data segment
  891.         mov    es,ax
  892.  
  893.         lds    si,physPtr[bp]        ; virtual address to convert
  894.  
  895.         mov    dl,VIRT_TO_PHYS        ; convert to physical
  896.  
  897.         call    es:DevHelp        ; call kernel
  898.         jc    vp_exit
  899.  
  900.         lds    si,physAddr[bp]        ; pointer to a long
  901.         mov    WPTR ds:[si],bx        ; LSW
  902.         mov    WPTR ds:[si],ax        ; MSW
  903.  
  904.         xor    ax,ax
  905.  
  906. vp_exit:
  907.         pop    si            ; restore registers
  908.         pop    ds
  909.         pop    bp
  910.         ret
  911.  
  912. _VirtToPhys    ENDP
  913.  
  914. ;========================================================================
  915.  
  916. _BreakPoint    PROC    NEAR
  917.  
  918.         int    3            ; breakpoint
  919.         ret
  920.  
  921. _BreakPoint    ENDP
  922.  
  923. ;========================================================================
  924.  
  925. selLim_frame    STRUC
  926.         dw    ?            ; bp
  927.         dw    ?            ; return address
  928. slSelector    dw    ?            ; selector
  929. selLim_frame    ENDS
  930.  
  931. ;------------------------------------------------------------------------
  932.  
  933. _SelectorLimit    PROC    NEAR
  934.  
  935.         push    bp               ; save bp
  936.         mov    bp,sp            ; get base of stack
  937.  
  938.         mov    ax,slSelector[bp]    ; get selector
  939.         lsl    ax,ax            ; get selector limit
  940.  
  941.         pop    bp
  942.         ret
  943.  
  944. _SelectorLimit    ENDP
  945.  
  946. ;========================================================================
  947.  
  948. ;USHORT  CopyPhysToVirt( VOID FAR *ptr, ULONG physAddr, USHORT length );
  949. ;USHORT  CopyVirtToPhys( ULONG physAddr, VOID FAR *ptr, USHORT length );
  950. ;USHORT  CopyPhysToPhys( ULONG destAddr, ULONG srcAddr, USHORT length );
  951.  
  952. ;========================================================================
  953.  
  954. _TEXT        ENDS
  955.  
  956. ;************************************************************************
  957.  
  958.         END
  959.