home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / C-ASM_VI.ARJ / PROGASM.ZIP / PROG064.ASM < prev    next >
Assembly Source File  |  1988-05-16  |  4KB  |  85 lines

  1.  
  2. ;************************************************************************
  3. ; Enable the split screen                                               *
  4. ; Enter:        Split   - Scan line for the split                       *
  5. ; Works only for 'standard' EGA modes                                   *
  6. ;************************************************************************
  7.  
  8. Split           EQU     [BP+4]
  9.  
  10.         PUBLIC  _Split_Screen
  11.  
  12. _Split_Screen   PROC    NEAR
  13.         PUSH    BP                      ;Setup pointer to parameters
  14.         MOV     BP,SP
  15.         CALL    _Vertical_Retrace       ;Wait for vertical retrace
  16.         PUSH    ES                      ;Get pointer to BIOS data area
  17.         XOR     AX,AX
  18.         MOV     ES,AX
  19.         MOV     DX,3B4H                 ;Assume CRTC address is mono address
  20.         TEST    BYTE PTR ES:[BIOS_Equipment],2   ;Is mono display attached?
  21.         JNZ     SS_CRT_Ok               ;...Yes, keep DX as is
  22.         MOV     DX,3D4H                 ;...No, change DX to 3D4
  23. SS_CRT_Ok:
  24.         MOV     AL,18H                  ;Get index for LINE COMPARE register
  25.         OUT     DX,AL                   ;Select register
  26.         INC     DX
  27.         MOV     AX,Split                ;Get split line bits 0-7
  28.         OUT     DX,AL                   ;Set LINE COMPARE register
  29.         DEC     DX
  30.  
  31.         ; Split bits beyond 7 (8 and maybe 9) are handeled differently
  32.         ; for EGA and VGA.  Here we decide which case to handle
  33.  
  34.         CALL    _Get_Scanlines          ;If we have up to 480 lines
  35.         CMP     AX,480                  ;then can do VGA processing
  36.         JL      EGA_Split               ;...otherwise do EGA processing
  37. VGA_Split:
  38.         MOV     AL,7                    ;Select OVERFLOW register
  39.         OUT     DX,AL
  40.         INC     DX
  41.         IN      AL,DX                   ;Get current overflow value
  42.         MOV     BL,Split+1              ;Fetch bit 8 from split
  43.         AND     BL,1
  44.         MOV     CL,4
  45.         SHL     BL,CL
  46.         AND     AL,NOT 10H              ;Clear bit in data just read in
  47.         OR      AL,BL                   ;Add the bit 8 from split
  48.         OUT     DX,AL                   ;Write to new value to OVERFLOW reg
  49.         DEC     DX
  50.         MOV     AL,9                    ;Get MAX SCAN LINE register value
  51.         OUT     DX,AL
  52.         INC     DX
  53.         IN      AL,DX
  54.         AND     AL,NOT 40H              ;Clear bit (since split bit 9 is 0)
  55.         OUT     DX,AL                   ;Set the new value
  56.         JMP     Split_Done
  57. EGA_Split:
  58.         MOV     BL,Split+1              ;Fetch split bit 8 for overflow reg
  59.         AND     BL,1
  60.         MOV     CL,4                    ;Shift bit 8 into proper position
  61.         SHL     BL,CL
  62.         CMP     DX,3B4H                 ;Monochrome mode?
  63.         JE      display_350             ;...Yes,350 line mode
  64.         MOV     AL,ES:[BIOS_Switch]     ;Get display type from
  65.         CMP     AL,3                    ;switch setting
  66.         JE      Display_350             ;Enhanced display?
  67.         CMP     AL,9                    ;...Yes, 350 line mode
  68.         JE      Display_350
  69. Display_200:                            ;...No, use 200 line mode
  70.         OR      BL,01H                  ;Get 200 line value
  71.         JMP     Over_Set
  72. Display_350:
  73.         OR      BL,0FH                  ;Get 350 line value
  74. Over_Set:
  75.         MOV     AL,07H                  ;Select overflow register
  76.         OUT     DX,AL
  77.         INC     DX                      ;Fetch address of overflow register
  78.         MOV     AL,BL                   ;Fetch value for overflow register
  79.         OUT     DX,AL                   ;Set Overflow register
  80. Split_Done:
  81.         POP     ES                      ;Restore ES and return
  82.         POP     BP
  83.         RET
  84. _Split_Screen   ENDP
  85.