home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ddkx86v5.zip / DDKX86 / SRC / IBMGPMI / IPMIMISC.ASM < prev    next >
Assembly Source File  |  1995-04-14  |  14KB  |  435 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. ;/*****************************************************************************
  13. ;*
  14. ;* SOURCE FILE NAME = IPMIMISC.ASM
  15. ;*
  16. ;* DESCRIPTIVE NAME = Clock routines for Number 9 and Diamond Speedstar.
  17. ;*
  18. ;*
  19. ;* VERSION      V2.0
  20. ;*
  21. ;* DATE
  22. ;*
  23. ;* DESCRIPTION  Clock functions for Number 9 GXE and Diamond Speedstar cards.
  24. ;*
  25. ;* FUNCTIONS
  26. ;*
  27. ;*
  28. ;* NOTES        Diamond Stealth was too difficult to convert to 32bit, so
  29. ;*              I left it in bvhsvga for the time being.
  30. ;*
  31. ;* STRUCTURES   NONE
  32. ;*
  33. ;* EXTERNAL REFERENCES
  34. ;*
  35. ;*              NONE
  36. ;*
  37. ;* EXTERNAL FUNCTIONS
  38. ;*
  39. ;*              NONE
  40. ;*
  41. ;* CHANGE ACTIVITY =
  42. ;*   DATE      FLAG        APAR   CHANGE DESCRIPTION
  43. ;*   --------  ----------  -----  --------------------------------------
  44. ;*   mm/dd/yy  @Vr.mpppxx  xxxxx  xxxxxxx
  45. ;*   07/16/94              89439  Build break, _Pascal is not recognized.
  46. ;*   08/27/94              89853  Fixin's needed for S3864 w/ICD2061 to work
  47. ;*****************************************************************************/
  48.  
  49. .386p
  50. CODE32    SEGMENT DWORD USE32 PUBLIC 'CODE'
  51.                 ASSUME CS:FLAT, DS:FLAT, ES:NOTHING
  52.                 ALIGN   4
  53.  
  54.         PUBLIC  SETDIAMONDCLK
  55.         PUBLIC  SETNUMBER9CLK           ;            ;          
  56. Read_Miscellaneous      EQU     03CCH           ;Misc output read register
  57. CRT_3B4                 EQU     03B4H           ;Monochrome CRT index addr
  58. CRT_3D4                 EQU     03D4H           ;Monochrome CRT index addr
  59. ;/***************************************************************************
  60. ;*
  61. ;* FUNCTION NAME = SETNUMBER9CLK                                           ;          
  62. ;*
  63. ;* DESCRIPTION   = Set the video clock on #9 adapter with S3
  64. ;*
  65. ;*                 ENTRY POINT: SetNumber9Clk
  66. ;*                 LINKAGE:   CALL NEAR
  67. ;*
  68. ;* INPUT         = (Passed on stack)
  69. ;*                 SerialClockValue (dword)
  70. ;*
  71. ;* RETURN-NORMAL = Specified clock bits set serially.
  72. ;* RETURN-ERROR  = NONE
  73. ;*
  74. ;**************************************************************************/
  75.  CLOCK_DELAY0           EQU     73              ; delay loop for 1/8 sec
  76.  CLOCK_DELAY1           EQU     145             ; delay loop for 1/4 sec
  77.  
  78.  C_NONE                 EQU     0       ; for freq synth programming
  79.  C_CLK                  EQU     1       ; for freq synth programming
  80.  C_DATA                 EQU     2       ; for freq synth programming
  81.  C_BOTH                 EQU     3       ; for freq synth programming
  82.  CLOCK_DELAY            EQU     CLOCK_DELAY1
  83.  
  84.  DELAY_CLOCK_SETUP      EQU     1       ; Delay when changing freq
  85.  
  86. SerialClockValue            equ     DWORD  PTR [ebp+8]
  87.  
  88. SETNUMBER9CLK  PROC    NEAR
  89.         push    ebp
  90.         mov     ebp, esp
  91.         push    esi
  92.         push    edi
  93.         push    ebx
  94.         MOV     ESI, WORD PTR SS:SerialClockValue
  95.         MOV     DX,Read_Miscellaneous           ;Get Misc read register           
  96.         IN      AL,DX                           ;Read the register                
  97.         MOV     DX,CRT_3B4                      ;Set Mono                         
  98.         TEST    AL,01                           ;0 - MONO 1 - Color               
  99.         JE      Set_Mono                        ;Return Mono                      
  100.         MOV     DX,CRT_3D4                      ;Set Color                        
  101.  
  102. CRT_Mono:                                                              ;          
  103.         MOV     AL, 42h                 ; go to the mode ctrl reg (CR42)
  104.         out     dx, al
  105.         inc     dx
  106.         IN      AL,DX                   ; and read it again
  107.         dec     dx
  108.         AND     AL,0F0h
  109.         MOV     AH,AL                   ; save this for later
  110.         OR      AH,2                    ; set the index to two
  111.         CALL    Set_Frequency           ; set the frequency synthesizer
  112.         pop     ebx
  113.         pop     edi
  114.         pop     esi
  115.         pop     ebp
  116. ;        ret     4             
  117.         ret
  118.  
  119. SETNUMBER9CLK   ENDP
  120.  
  121. ;****************************************************************
  122. ;
  123. ;
  124. ;****************************************************************
  125. ; Set the frequency synthesizer to the desired frequency.
  126. ; The frequency synthesizer is an IDC 2061a part.
  127. ; This code turns off the video display prior to setting
  128. ; the synthesizer, and then returns the display to the
  129. ; previous state.
  130. ;       Entry:  ESI     - contains the 24 bit clock Number
  131. ;               AH      - contains the saved CR42 reg
  132. ;               dx      - 3?4
  133. ;****************************************************************
  134. Set_Frequency   PROC
  135.         PUSH    DX
  136.  
  137. ;        PUSH    AX                      ; save CR42 (twice!)
  138. ;        MOV     AX, 0A039H              ; register lock 1 index
  139. ;        OUT     DX, AX                  ; Unlock the soft switches
  140. ;        POP     AX                      ; restore the saved CR42 in AX
  141.  
  142.         MOV     AL, 1                   ; To turn off video display
  143.         MOV     DX, 03C4h               ; go to the Clocking Mode register
  144.         OUT     DX, AL
  145.         INC     DX
  146.         IN      AL, DX                  ; read the Clocking Mode reg
  147.         PUSH    AX                      ; save the Clocking Mode Reg
  148.         OR      AL, 20h                 ; set video OFF bit
  149.         OUT     DX, AL                  ; turn off video output
  150.  
  151.         MOV     DX, 03CCh               ; read clock bits in Misc Output reg
  152.         IN      AL, DX
  153.         PUSH    AX                      ; save this old value
  154.         OR      AL, 0Ch                 ; enable CR42 bits 2 & 3
  155.         MOV     DX, 03C2h
  156.         OUT     DX, AL                  ; write new misc output value
  157.         POP     AX
  158.         PUSH    AX
  159.         MOV     DX,Read_Miscellaneous           ;Get Misc read register
  160.         IN      AL,DX                           ;Read the register
  161.         MOV     DX,CRT_3B4                      ;Set Mono
  162.         TEST    AL,01                           ;0 - MONO 1 - Color
  163.         JE      Set_Mono                        ;Return Mono
  164.         MOV     DX,CRT_3D4                      ;Set Color
  165.  
  166. Set_Mono:
  167.         MOV     AL, 42h                 ; the Mode Control Reg (CR42)
  168.         OUT     DX, AL                  ; write index to 3?4
  169.         INC     DX                      ; Move DX to 3?5
  170.         XCHG    AH,AL                   ; Swap Index/Data
  171.         OUT     DX,AL                   ; Program the data
  172.         XCHG    AH,AL                   ; AH=Data                      
  173.  
  174. ;**************************************************************************
  175. ;***************** START OF CRITICAL SECTION OF CODE **********************
  176. ;**************************************************************************
  177.         PUSHF                   ; save the flags prior to critical section
  178.         CLI                     ; no interupts please...
  179.  
  180.         MOV     AL, C_NONE      ; start programming ICD2061A
  181.         OUT     DX, AL
  182.         MOV     AL, C_DATA
  183.         OUT     DX, AL
  184.         MOV     ECX, 6
  185.  
  186. unLockSeq:
  187.         MOV     AL, C_BOTH       ; Unlock sequence
  188.         OUT     DX, AL
  189.         MOV     AL, C_DATA
  190.         OUT     DX, AL
  191.         LOOP    SHORT unLockSeq
  192.  
  193.         MOV     AL, C_NONE
  194.         OUT     DX, AL
  195.         MOV     AL, C_CLK
  196.         OUT     DX, AL
  197.         MOV     AL, C_NONE
  198.         OUT     DX, AL
  199.         MOV     AL, C_CLK
  200.         OUT     DX, AL
  201.  
  202. ;        SAR     SI, 1            ; do shift (ignore 1st bit)
  203. ;        RCR     BX, 1            ; set the carry flag
  204. ;            removed this extra rcr and adjusted #9 clock values by
  205. ;            shifting right 1 bit in ipmimain.c
  206. ;            RCR     ESI, 1           ; set the carry flag
  207.         MOV     ECX, 24           ; Program the 24 bit value into REG0
  208.  
  209. programREG0:
  210. ;        SAR     SI, 1            ; clock_value >>= 1
  211. ;        RCR     BX, 1
  212.         RCR     ESI, 1           ; set the carry flag
  213.         JNC     SHORT clock0
  214.  
  215. clock1:
  216.         MOV     AL, C_CLK
  217.         OUT     DX, AL
  218.         MOV     AL, C_NONE
  219.         OUT     DX, AL
  220.         MOV     AL, C_DATA
  221.         OUT     DX, AL
  222.         MOV     AL, C_BOTH
  223.         OUT     DX, AL
  224.         JMP     SHORT programCont
  225. clock0:
  226.         MOV     AL, C_BOTH
  227.         OUT     DX, AL
  228.         MOV     AL, C_DATA
  229.         OUT     DX, AL
  230.         MOV     AL, C_NONE
  231.         OUT     DX, AL
  232.         MOV     AL, C_CLK
  233.         OUT     DX, AL
  234.  
  235. programCont:
  236.         LOOP    SHORT programREG0
  237.  
  238.         MOV     AL, C_BOTH
  239.         OUT     DX, AL
  240.         MOV     AL, C_DATA
  241.         OUT     DX, AL
  242.         MOV     AL, C_BOTH
  243.         OUT     DX, AL
  244.  
  245.         POPF                    ; resore all flags
  246.         STI                     ; ok for interupts now
  247. ;**************************************************************************
  248. ;******************* END OF CRITICAL SECTION OF CODE **********************
  249. ;**************************************************************************
  250.  
  251.         MOV     AL, AH          ; AH has contained the saved CR42 reg
  252.         OUT     DX, AL          ; Select the VCLOCK index in CR42
  253.  
  254.         POP     AX              ; old Misc Output reg value
  255.         MOV     DX, 03C2h       ; write to write port
  256.         OUT     DX, AL          ; reset the value
  257.  
  258.         MOV     DX, 03C4h       ; To set screen to previous state
  259.         MOV     AL, 1           ; go to the Clocking Mode reg
  260.         OUT     DX, AL
  261.         INC     DX
  262.         POP     AX              ; use old value pushed from Clk Mode Reg
  263.         OUT     DX, AL          ; restore video
  264.  
  265.         POP     DX              ; Restore callers registers
  266.  
  267.         RET
  268. Set_Frequency           ENDP
  269.  
  270. ;/***************************************************************************
  271. ;*
  272. ;* FUNCTION NAME = SETDIAMONDCLK
  273. ;*
  274. ;* DESCRIPTION   = Set the video clock on diamond speedstar 24X on per
  275. ;*                 mode basis.
  276. ;*
  277. ;*                 ENTRY POINT: SetDiamondClk
  278. ;*                 LINKAGE:   CALL NEAR
  279. ;*
  280. ;* INPUT         = (Passed on stack)
  281. ;*                 SerialClockValue (dword)
  282. ;*
  283. ;* RETURN-NORMAL = Specified clock bits set serially.
  284. ;* RETURN-ERROR  = NONE
  285. ;*
  286. ;**************************************************************************/
  287. SETDIAMONDCLK  PROC    NEAR
  288.         push    ebp
  289.         mov     ebp, esp
  290.         push    edi
  291.         push    esi
  292.         push    ebx
  293.         lea     esi,ss:SerialClockValue                   ;point to serial data
  294.  
  295.         mov     dx,3cch
  296.         in      al, dx
  297.         push    ax
  298.  
  299.         mov     ecx, 256
  300. ploop:
  301.         push    ecx
  302.         call    Prog_Clock
  303.  
  304.         pop     ecx
  305.         in      al,dx
  306.         test    al, 10h
  307.         jnz     ppp_done
  308.         sub     si,2
  309.         loop    ploop
  310.  
  311. ppp_done:
  312.         pop     ax
  313.         out     dx,al
  314.  
  315.         sti
  316.  
  317.         pop    ebx
  318.         pop     esi
  319.         pop     edi
  320.         pop     ebp
  321. ;        ret     4             
  322.         ret
  323.  
  324. SETDIAMONDCLK   ENDP
  325. ;/***************************************************************************
  326. ;*
  327. ;* FUNCTION NAME = Prog_Clock
  328. ;*
  329. ;* DESCRIPTION   = Program the speedstar 24 clock using 24 bit data
  330. ;*                 for desired clock frequency
  331. ;*
  332. ;* ENTRY POINT: Prog_Clock
  333. ;* LINKAGE:     CALL
  334. ;*
  335. ;* INPUT         = NONE
  336. ;*
  337. ;* RETURN-NORMAL =
  338. ;* RETURN-ERROR  = NONE
  339. ;*
  340. ;**************************************************************************/
  341.  
  342. Prog_Clock PROC
  343.  
  344.         push    bx
  345.         mov     dx,3cch
  346.         in      al,dx
  347.         mov     dx,3c2h
  348.  
  349.         or      al,8
  350.         mov     ecx,6
  351.         cli
  352.  
  353. kk_1:
  354.         and     al, 0fbh                ;clock low
  355.         out     dx,al
  356.         or      al,4                    ;clock high
  357.         out     dx,al
  358.         loop    kk_1
  359.  
  360.         and     al, 0fbh
  361.         out     dx,al
  362.         and     al, 0f3h                ;clock low data low
  363.         out     dx,al
  364.         or      al,4                    ;clock high
  365.  
  366.         out     dx,al
  367.         and     al,0f3h                 ;clock low data low
  368.         out     dx,al
  369.         or      al,4                    ;clock high
  370.         out     dx,al
  371.  
  372.         mov     bx,8000h                ;program first 16 bits
  373.         call    Send_Serial
  374.         add     si,2                    ;update pointer
  375.         mov     bx,80h                  ;program last 8 bits
  376.         call    Send_Serial
  377.  
  378.         or      al,8
  379.         out     dx,al
  380.         and     al,0fbh                 ;clock low
  381.         out     dx,al
  382.         or      al,4                    ;clock high
  383.         out     dx,al
  384.  
  385.         sti
  386.         pop     bx
  387.         ret
  388.  
  389. Prog_Clock ENDP
  390.  
  391. ;/***************************************************************************
  392. ;*
  393. ;* FUNCTION NAME = Send_Serial
  394. ;*
  395. ;* DESCRIPTION   = Program the speedstar 24 clock using 24 bit data
  396. ;*                 for desired clock frequency
  397. ;*
  398. ;*                 ENTRY POINT: Send_Serial
  399. ;*                 LINKAGE:   CALL NEAR
  400. ;*
  401. ;* INPUT         = NONE
  402. ;*
  403. ;* RETURN-NORMAL =
  404. ;* RETURN-ERROR  = NONE
  405. ;*
  406. ;**************************************************************************/
  407.  
  408. Send_Serial PROC
  409.  
  410. Send_Serial_data:
  411.  
  412.         and     al, 0f7h
  413.         test    word ptr [esi],bx
  414.         jnz     Send_Serial_1
  415.         or      al,8
  416.  
  417. Send_Serial_1:
  418.  
  419.         out     dx,al
  420.         and     al, 0fbh
  421.         out     dx,al
  422.  
  423.         xor     al,8
  424.         out     dx,al
  425.         or      al,4
  426.         out     dx,al
  427.         shr     bx,1
  428.         jnc     Send_Serial_data
  429.         ret
  430.  
  431. Send_Serial ENDP
  432.  
  433. CODE32 ENDS
  434.         END
  435.