home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ddkx86v5.zip / DDKX86 / SRC / DEV / SCREENDD / SCREEN01.ASM < prev    next >
Assembly Source File  |  1995-04-14  |  15KB  |  413 lines

  1. ;*DDK*************************************************************************/
  2. ;
  3. ; COPYRIGHT (C) Microsoft Corporation, 1989
  4. ; COPYRIGHT    Copyright (C) 1995 IBM Corporation
  5. ;
  6. ;    The following IBM OS/2 WARP source code is provided to you solely for
  7. ;    the purpose of assisting you in your development of OS/2 WARP device
  8. ;    drivers. You may use this code in accordance with the IBM License
  9. ;    Agreement provided in the IBM Device Driver Source Kit for OS/2. This
  10. ;    Copyright statement may not be removed.;
  11. ;*****************************************************************************/
  12. ;       SCCSID = @(#)screen01.asm    6.1 90/11/17
  13. ;SCCSID = @(#)screen01.asm    1.9 90/02/05
  14. ;    SCCSID = @(#)screen01.asm    1.9 90/02/05
  15. ; ****************************************************************************
  16. ; *                                         *
  17. ; *                                         *
  18. ; *                                         *
  19. ; ****************************************************************************
  20.     PAGE    58,132
  21.     TITLE    Screen Device Driver - (Screen01.Asm)
  22.     .286p                                ;@T30
  23.  
  24. ;/***********************************************************************/
  25. ;/*                                    */
  26. ;/* SOURCE FILE NAME: Screen01.Asm    STATUS: Version 1.1        */
  27. ;/*                                    */
  28. ;/* DESCRIPTIVE NAME:  Base Video Subsystem Screen Device Driver    */
  29. ;/*                                    */
  30. ;/* FUNCTION:    Processes the Init, DeInstall, and Screen IOCtl     */
  31. ;/*        functions listed below.  All other device commands    */
  32. ;/*        return an error.                    */
  33. ;/*                                    */
  34. ;/* NOTES:  Executes on Level 0                     */
  35. ;/*                                    */
  36. ;/* ENTRY POINT:  Screen_Strategy                    */
  37. ;/*   LINKAGE: Far Call                         */
  38. ;/*                                    */
  39. ;/* INPUT:  ES = Selector of Request Packet                */
  40. ;/*        BX = Offset of Request Packet                */
  41. ;/*                                    */
  42. ;/*   Category 3 Functions:                        */
  43. ;/*                                    */
  44. ;/*    65h    Get 3xBox CodePage (Not supported in 2.0)  @T51 @C13    */
  45. ;/*    70h    Allocate a Selector                    */
  46. ;/*    71h    Deallocate a Selector                    */
  47. ;/*    74h    Allocate a Selector:Offset            @T30    */
  48. ;/*    75h    Allocate a Selector:Offset                */
  49. ;/*    76h    Allocate a Selector:Offset with requested attr    @B01    */
  50. ;/*                                    */
  51. ;/*                                             */
  52. ;/*   Category 80 Functions added                    */
  53. ;/*                                    */
  54. ;/* EXIT-NORMAL:  Request Block Status Field set to good return code    */
  55. ;/*                                    */
  56. ;/* EXIT-ERROR:  Request Block Status Field set to error:        */
  57. ;/*                                    */
  58. ;/*         Error Code        Cause                */
  59. ;/*         ------------------------------------------        */
  60. ;/*         ERROR_I24_BAD_COMMAND    Invalid Request         */
  61. ;/*                                    */
  62. ;/* EFFECTS:  None                            */
  63. ;/*                                    */
  64. ;/* INTERNAL REFERENCES:  None                        */
  65. ;/*   ROUTINES:  Init, IOCtl                        */
  66. ;/*                                    */
  67. ;/* EXTERNAL REFERENCES:  None                        */
  68. ;/*   ROUTINES:  Device_Help (DevHlp_PhysToUVirt)            */
  69. ;/*                                    */
  70. ;/************************ END OF SPECIFICATIONS ************************/
  71.  
  72. ;Bgnsub Screen_Strategy
  73. ;: If Function = INIT
  74. ;: : Call Init to initialize the device driver
  75. ;: Else
  76. ;: : Preset return code for INVALID_CATEGORY
  77. ;: : If Category = 3
  78. ;: : : Preset return code for BAD_COMMAND
  79. ;: : : If Function = DEINSTALL
  80. ;: : : : Set good return code
  81. ;: : : Elseif Funtion = GENERIC IOCtl
  82. ;: : : : Call IOCtl to process Screen IOCtl requests
  83. ;: : : Endif
  84. ;: : Endif
  85. ;: : If Category = 80H                                            
  86. ;: : : Preset return code for BAD_COMMAND
  87. ;: : : Elseif Funtion = GENERIC IOCtl
  88. ;: : : : Call SVGA_IOCtl to process SVGA IOCtl requests
  89. ;: : : Endif                                                      
  90. ;: : If Function = 4,8 or 9  (Read or Write or Write/Verify)  @@5
  91. ;: : : Set byte count = 0                      @@5
  92. ;: Endif
  93. ;Endsub
  94.  
  95. ;Bgnsub IOCtl
  96. ;: Preset return code for BAD_COMMAND
  97. ;: If Function = Deallocate selector (71h)
  98. ;: : Call Device_Help (DevHlp_PhysToUVirt) to deallocate a selector
  99. ;: Elseif Function = Allocate selector (70h)
  100. ;: : Check for valid range for physical address
  101. ;: : If invalid physical address
  102. ;: : : Set return code for     address
  103. ;: : Else
  104. ;: : : Call Device_Help (DevHlp_PhysToUVirt) to allocate a selector
  105. ;: : Endif
  106. ;: Endif
  107. ;Endsub
  108.  
  109. ;Bgnsub SVGA_IOCtl                                        
  110. ;: Preset return code for BAD_COMMAND
  111. ;: If function supported, Dispatch to it
  112. ;: Endif
  113. ;Endsub                                                   
  114.  
  115. ;Bgnsub Init
  116. ;: Set up end of data and code addresses
  117. ;: Set good return code
  118. ;Endsub
  119.  
  120. .xlist
  121.     INCLUDE devhlp.inc        ; Define DevHlp functions
  122.     INCLUDE devsym.inc        ; Define DOS equates
  123.     INCLUDE basemaca.inc        ;;;;;; 2.0 unique (dosmac replacement)
  124.     INCLUDE error.inc        ; Define Error Messages
  125.     INCLUDE ioctl.inc        ; Define IOCTL equates ;@@B
  126.     INCLUDE struc.inc        ; Define STRUC macros
  127. .list
  128.  
  129. ;***************************************
  130. ;
  131. ;  PVB Address Function Return Structure
  132. ;
  133. ;***************************************
  134.  
  135. pvbdata STRUC
  136. pvb_off DW    ?            ; PVB address offset
  137. pvb_sel DW    ?            ; PVB address segment/selector
  138. pvb_len DW    ?            ; Length of the PVB
  139. acc_bit DW    ?            ; Access bits for function 76H    ;@B01
  140. pvbdata ENDS
  141.  
  142. ;                       start of SVGA support
  143. ;SVGA category, functions and parameter packet structures
  144. ;All SVGA functions in SVGAROUT.ASM
  145.  
  146.     EXTRN   SVGA_IOCTL          : NEAR  ;           moved to svgarout.asm
  147.     EXTRN   Init                : NEAR  ;           moved to svgarout.asm
  148.  
  149. SVGA_CATEGORY  EQU  80h     ; SVGA SCREENDD category
  150.  
  151. BioData SEGMENT WORD PUBLIC 'DATA'    ;           changed alignment
  152.     ASSUME    DS:BioData
  153.  
  154. ; Define I/O packet offsets for useful values.
  155. ;
  156. ; SEE ALSO
  157. ;    CP/DOS Technical Reference manual section on Installable Device Drivers
  158.  
  159. dev_attribute EQU DEV_CHAR_DEV+DEVLEV_1+DEV_COUT;SCRDD Attribute Word Value           
  160.  
  161. ;**    Device Table Record
  162. ;           *
  163. ;    Devices are described by a chain of these records
  164. ;
  165. ;  Copied from devhdr.inc in dos subdirectory.
  166. ;    Note:  Required since Device Name field was not defined as a String!
  167.  
  168.     Assume    CS:BiosSeg,DS:BioData,ES:NOTHING,SS:NOTHING
  169.     public    Screen$         ;@SZL
  170. Screen$ DD    -1            ; Pointer to next device header ;@SZL
  171.     DW    dev_attribute        ; Attributes of the device
  172.     DW    offset BiosSeg:Screen_Strategy ; Strategy entry point
  173.     DW    JustReturn              ; Interrupt entry point
  174.     DB    'SCREEN$ '              ; Dev Name (only 1st byte used for blk)
  175.     DW    0            ; Prot-mode CS sel of strat entry pt
  176.     DW    0            ; Prot-mode DS sel
  177.     DW    0            ; Real-mode CS seg of strat entry pt
  178.     DW    0            ; Real-mode DS seg
  179.  
  180. Public    DevHelp
  181. DevHelp DD    0            ; DevHelp Function Router Address
  182.  
  183. BioData ends
  184.  
  185. BiosSeg SEGMENT WORD Public 'CODE'
  186.     ASSUME    CS:BiosSeg
  187.  
  188. PUBLIC    Screen_Strategy
  189. Screen_Strategy PROC FAR
  190.     push    ds            ;@@1
  191.     push    es            ;@@
  192.     push    bx            ;@@
  193.     mov    dh,es:[bx].ReqFunc    ; Command code ;1
  194.     .IF    <dh eq CMDInitBase>    ;if a base request ;1;@@8;@@B
  195.         CALL    Init        ;process the init ;1
  196.     .ELSE                ;1
  197.         mov     ax,STERR+ERROR_I24_BAD_COMMAND ;Preset error ;1;@@;@@8;@@B
  198.         .IF     <dh eq CMDDeInstall> ;if a deinstall request ;@@
  199.         sub    ax,ax        ;NOERROR ;1
  200.         .ELSE
  201.         .IF    <dh eq CMDGenIOCtl> ;if a generic IOCtl request ;@@
  202.             .if     <es:[bx].GIOCategory eq IOC_SC> ;@@;@@B
  203.             CALL    IOCtl            ;process the IOCtl
  204.             .else            ;           start
  205.               .if     <es:[bx].GIOCategory eq SVGA_CATEGORY> 
  206.             CALL    SVGA_IOCtl      ;process the IOCtl
  207.                       .endif                    ;           end
  208.                     .endif
  209.         .ELSE            ;@@7
  210.             .IF     <dh eq CMDINPUT> OR ;@@5
  211.             .IF     <dh eq CMDOUTPUT> OR ;@@5
  212.             .IF     <dh eq CMDOUTPUTV> ;@@5
  213.                 sub    ax,ax    ;NOERROR ;@@7
  214.                 mov    es:[bx].IOcount,ax ;Byte Count ;@@5;@@7
  215.             .ENDIF        ;@@5
  216.             .ENDIF
  217.         .ENDIF
  218.     .ENDIF
  219.     pop    bx            ;@@
  220.     pop    es            ;@@
  221.     pop    ds            ;@@1
  222.     or    ax,STDON        ; Set the done bit
  223.     mov    es:[bx].ReqStat,ax    ; Set return status
  224. JustReturn LABEL FAR            ;@@
  225.     ret                ; restore regs and return
  226. Screen_Strategy ENDP
  227.  
  228. PUBLIC    IOCtl
  229. IOCtl    PROC    NEAR
  230.     enter    2,0            ;Reserve a word for size    ;@T30
  231.     DataSize equ <word ptr [bp-2]>    ;                ;@T30
  232.     mov    dh,es:[bx].GIOFunction    ;Get IOCtl function ;@@
  233.     .if    <dh eq 71H>        ;Deallocate selector ;@@
  234.         mov     di,word ptr es:[bx].GIOParaPack ;@@2
  235.         mov     ax,word ptr es:[bx].GIOParaPack+2 ;Parm ptr ;@@2
  236.         mov     cx,2        ;2-byte buffer ;@@2
  237.         mov     dh,0        ;Read Access ;@@2
  238.         Call    Verify        ;Verify access ;@@2
  239.         .if     nc            ;@@2
  240.         mov    es,word ptr es:[bx].GIOParaPack+2 ;Parm ptr ;@@2
  241.         mov    ax,es:[di]    ; selector to free
  242.         mov    dh,2        ; UnMap      BUGBUG
  243.         mov    dl,DevHlp_PhysToUVirt
  244.         call    DevHelp
  245.         xor    ax,ax
  246.         .endif            ;@@2
  247.     .else    near
  248.         mov     DataSize,2        ;Return selector only        ;@T30
  249.         sub     si,si        ;Default is read access     ;@B01
  250.         .if     <dh ne 70H> near    ;Allocate selector:offset    ;@B01
  251.         mov    DataSize,4    ;Return selector:offset     ;@T30
  252.         .endif                            ;@T30
  253.         mov     dl,dh        ;Save IOCTL function        ;@B01
  254.         .if     <dh eq 70H> or near ;Allocate selector        ;@B01
  255.         .if     <dh ae 75H> near                    ;@B01
  256.  
  257.         push    es
  258.         push    bx
  259.  
  260.         mov    di,word ptr es:[bx].GIOParaPack ;@@2
  261.         mov    ax,word ptr es:[bx].GIOParaPack+2 ;Parm ptr ;@@2
  262.         mov    cx,6        ;6-byte buffer ;@@2
  263.         push    dx                        ;@B01
  264.         mov    dh,0        ;Read Access ;@@2
  265.         Call    Verify        ;@@2
  266.         pop    dx                        ;@B01
  267.         .if    nc near     ;@@2
  268.  
  269.             mov     es,word ptr es:[bx].GIOParaPack+2 ;Parm ptr ;@@2
  270.             mov     bx,es:[di].pvb_off ; 32-bit physical address
  271.             mov     ax,es:[di].pvb_sel ; 32-bit physical address
  272.  
  273.             sub     si,si                    ;@B01
  274.             mov     cx,es:[di].pvb_len ;Length of PVB ;@@3
  275.             .if     <dl eq 76H> near                ;@B01
  276.             mov    si,es:[di].acc_bit            ;@B01
  277.             .if    <si a 5> or    ;Invalid access bits    ;@B01
  278.             .if    <si eq 2>    ;Invalid access bits    ;@B01
  279.                 mov     ax,STERR+ERROR_I24_INVALID_PARAMETER;@B01
  280.                 jmp     bad_bits    ;            ;@B01
  281.             .endif
  282.             or    si,8000h                ;@B01
  283.             .endif                        ;@B01
  284.             dec     cx        ;@@3
  285.             sub     dx,dx    ;@@3
  286.             add     cx,bx    ;@@3
  287.             adc     dx,ax    ;DX:CX = Addr32 of final byte ;@@3
  288.             mov     bx,si    ;Access bits            ;@B01
  289.  
  290.             .if     <ax a 000Fh> or ;Above FFFFFh (Prot Mode) or ;@@3
  291.             .if     <dx a 000Fh> ;Above FFFFFh (Prot Mode) ;@@3;DCR0226
  292.             mov    ax,STERR+ERROR_I24_INVALID_PARAMETER ;@@3
  293.             .else        ;@@3
  294.             mov    cx,es:[di].pvb_len ;Length of PVB
  295.             mov    dh,bl        ;Access bits        ;@B01
  296.             .if    <al ae 000Ah> and ;@@C
  297.             .if    <dl b 000Ch> ;@@3
  298.                 .if     <bh ne 80H> near            ;@B01
  299.                 mov    dh,5 ;Read/Write Segment ;DCR0216
  300.                 .endif                    ;@B01
  301.                 sub     si,si ;DCR0216
  302.             .elseif <bl ne 0> and ;Invalid access bits    ;@B01
  303.             .if    <bl ne 3>     ;Invalid access bits    ;@B01
  304.                 mov     ax,STERR+ERROR_I24_INVALID_PARAMETER;@B01
  305.                 jmp     bad_bits                ;@B01
  306.             .endif        ;Else dh=0=Read Only ;@@3
  307.             mov    bx,es:[di].pvb_off ; 32-bit phys addr    ;@B01
  308.             mov    dl,DevHlp_PhysToUVirt
  309.             call    DevHelp
  310.  
  311.             mov    si,es    ;SI=Selector            ;@T30
  312.             mov    dx,bx    ;save offset in DX        ;@T30
  313.             pop    bx
  314.             pop    es    ;Restore Request Block Addressibility
  315.             push    es    ;@@2
  316.             push    bx    ;Save it again ;@@2
  317.  
  318.             mov    ax,STERR+ERROR_I24_BAD_COMMAND ; Set error ;1
  319.             .if    nc
  320.                 mov     di,word ptr es:[bx].GIODataPack ;@@2
  321.                 mov     ax,word ptr es:[bx].GIODataPack+2 ;Data ptr ;@@2
  322.                 mov     cx,DataSize ;2 or 4-byte buffer ;@@2;@T30
  323.                 push    dx                    ;@T30
  324.                 mov     dh,1 ;Read/Write Access ;@@2
  325.                 Call    Verify ;@@2
  326.                 pop     dx                    ;@T30
  327.                 .if     nc    ;@@2
  328.                 mov    ds,word ptr es:[bx].GIODataPack+2 ;Data ptr ;@@2t
  329.                 .if <DataSize eq 2>            ;@T30
  330.                     mov     [di],si   ;Return sel. only ;@T30
  331.                 .else                    ;@T30
  332.                     mov     [di],dx   ;Return sel:off    ;@T30
  333.                     mov     [di+2],si            ;@T30
  334.                 .endif                    ;@T30
  335.                 sub    ax,ax
  336.                 .endif    ;@@2
  337.             .endif
  338.             .endif        ;@@3
  339.         .endif            ;@@2
  340. bad_bits:    pop    bx        ;@@2                ;@B01
  341.         pop    es        ;Restore Request Block Addr ;@@2
  342. ;@T51        .else                            ;@C13
  343. ;@T51        .if    <dh eq 65H>        ;Get 3xBox CodePage      @C13
  344. ;@T51            Call    Get3xBoxCP                    ;@C13
  345. ;@T51        .endif                            ;@C13
  346.         .endif
  347.     .endif
  348.     leave                                ;@T30
  349.     ret
  350. IOCtl    ENDP
  351.  
  352. Verify    PROC    NEAR            ;@@2
  353.     mov    dl,DevHlp_VerifyAccess    ;@@2
  354.     Call    DS:DevHelp        ;Verify access ;@@2
  355.     mov    ax,STERR+error_invalid_access ;@@2
  356.     ret                ;@@2
  357. Verify    ENDP                ;@@2
  358.  
  359. ;@T51 Get3xBoxCP PROC NEAR                        ;@C13
  360. ;@T51    PUBLIC    Get3xBoxCP                        ;@C13
  361. ;@T51    les    di,dword ptr es:[bx].GIODataPack ;Data ptr         @C13
  362. ;@T51    mov    ax,es            ;Data ptr             @C13
  363. ;@T51    mov    cx,2            ;2-byte buffer = Length      @C13
  364. ;@T51    mov    dh,0            ;Read Access             @C13
  365. ;@T51    Call    Verify            ;Verify access             @C13
  366. ;@T51    .if    nc                            ;@C13
  367. ;@T51        mov     cx,es:[di]        ;Get size of output buffer     @C13
  368. ;@T51        mov     ax,es        ;Data ptr             @C13
  369. ;@T51        mov     dh,1        ;Read/Write Access         @C13
  370. ;@T51        Call    Verify                        ;@C13
  371. ;@T51        .if     nc                            ;@C13
  372.  
  373. ;@T51        .if    <cx ae 4>    ;Enough room for CodePage     @C13
  374. ;@T51            push    bx                        ;@C13
  375. ;@T51            mov     al,11    ;Dos CodePage Segment         @C13
  376. ;@T51            mov     dl,DevHlp_GetDosVar             ;@C13
  377. ;@T51            call    DevHelp    ;Get Dos Variable table      @C13
  378. ;@T51            mov     ds,ax                    ;@C13
  379. ;@T51            mov     cx,[bx]    ;Get current 3xBox CodePage     @C13
  380. ;@T51            pop     bx                        ;@C13
  381.  
  382. ;@T51            mov     es:[di+2],cx ;Return the CodePage         @C13
  383. ;@T51            sub     ax,ax                    ;@C13
  384. ;@T51        .endif                            ;@C13
  385. ;@T51        .endif                            ;@C13
  386. ;@T51    .endif                                ;@C13
  387. ;@T51    RET                                ;@C13
  388. ;@T51 Get3xBoxCP ENDP                            ;@C13
  389.  
  390. BiosSeg ends
  391.     end
  392.  
  393. ;1 = 08/15/86 STJ, Add check for invalid category
  394. ;@@ = 11/19/86 STJ, Make the device driver loadable
  395. ;@@1 = 03/04/87 STJ, 64h = Get data segment addr and shadow PalRegs
  396. ;@@2 = 05/04/87 STJ, Start shadowing at DD Init time and change IOCTL
  397. ;@@3 = 05/05/87 STJ, Limit selector allocation to 400h-500h and A0000h-FFFFFh
  398. ;@@4 = 06/25/87 STJ, Set device and data size to limit, not length
  399. ;@@5 = 07/31/87 JMP, Set length to 0 for illegal read/write function calls
  400. ;@@6 = 07/31/87 JMP, Get pallete register data address from BIOS data area
  401. ;@@7 = 11/30/87 STJ, Add a new IOCTL to get the 3xBox CodePage and do cleanup
  402. ;@@A = 12/11/87 STJ, Use a new Init command for base device drivers
  403. ;@@B = 03/09/87 STJ, Correctly check for Category IOC_SC (3)
  404. ;@@C = 10/02/88 STJ, Changes to support DCR71
  405. ;DCR0216 = 02/10/89 STJ, Use new PhysToUVirt request type for video validation
  406. ;DCR0226 = 02/17/89 STJ, Remove unused IOCTLs and expand valid selector range
  407. ;@C13 = 03/29/89 CJJ, Add back IOCTL to get the 3xBox CodePage, B700817
  408. ;@SZL = 04/24/89 STJ, Allow combining of all base DDs
  409. ;@T30 = 05/10/89 TPL, DCR 511 changes
  410. ;@T51 = 08/26/89 TPL, Removal of 3xbox code in 2.0, DCR 432.10
  411. ;@B01 = 01/24/90 WKB, Add IOCTL function 76H in 2.0, DCR 702
  412. ;           = 12/28/92 Senja, SVGA support expansion.
  413.