Category : Files from Magazines
Archive   : WDJAN92.ZIP
Filename : 3N01052A

 
Output of file : 3N01052A contained in archive : WDJAN92.ZIP
;-----------------------------------------------------------------------;
; INITVID.ASM, Written Sept 1991 by Jonathan Wood, SoftCircuits ;
; ;
; Routines to determine host display adapter. Assembled using MASM 6.0. ;
; To assemble for different C memory models, modify the .MODEL ;
; directive to the correct model and recompile. To interface with other ;
; languages, change the language specifier on the same line. Depending ;
; on the language, you may need to modify the way parameters are ;
; accessed and which registers are saved. ;
;-----------------------------------------------------------------------;

.MODEL small,c ;Specify memory model/language

MONO_SEG EQU 0B000h ;Standard display segments
COLOR_SEG EQU 0B800h

.DATA
video_segment DW COLOR_SEG ;Display memory segment address
video_type DB 0FFh ;Display combination code
video_iscolor DB 01h ;1 = color, 0 = mono
video_mode DB 03h ;Video display mode
video_page DB 00h ;Video display page
video_rows DB 25h ;Number of text rows
video_cols DB 80h ;Number of text columns

.CODE
;-----------------------------------------------------------------------;
; Determines the active display adapter and various display parameters. ;
; ;
; Prototype: void initvideo(void); ;
; ;
;-----------------------------------------------------------------------;
initvideo PROC USES si di bp
mov ah,0Fh ;Read video information
int 10h
mov video_mode,al ;Video display mode
mov video_page,bh ;Video display page
mov video_cols,ah ;Number of text columns
mov video_segment,MONO_SEG ;Assume mono display for now
mov video_iscolor,0
int 11h ;Read equipment list
and al,00110000b ;Isolate video bits
cmp al,00110000b ;Was it mono?
je find_adapter ;Yes
mov video_segment,COLOR_SEG ;Else set color display
mov video_iscolor,1
find_adapter:
call ps2_state ;Read PS/2 video state
jnz adapter_set ;Done if supported
call ega_state ;Read EGA video state
jnz adapter_Set ;Done if supported
call cga_state ;Determine CGA or MDA
adapter_set:
sub ax,ax ;Adjust display segment for
mov es,ax ; current video page
mov ax,es:[044Eh]
mov cl,4
shr ax,cl
add video_segment,ax
ret
initvideo ENDP

;-----------------------------------------------------------------------;
; This procedure attempts to access PS/2 compatible ROM BIOS video ;
; services. The zero flag is set if they aren't supported. ;
; ;
; Output: zf Zero flag set if PS/2 compatible ROM BIOS is ;
; not present. ;
; ;
;-----------------------------------------------------------------------;
ps2_state PROC NEAR
mov ax,1A00h ;Read PS/2 display code
int 10h
cmp al,1Ah ;Was function supported?
lahf ;Toggle zero flag (zf = 1 if
xor ah,01000000b ; al is not equal to 1Ah)
sahf
jz no_ps2 ;PS/2 BIOS not present
mov video_type,bl ;Save active display code
mov ax,1130h ;Read font code
sub bh,bh ;Font code (not used)
int 10h
inc dl ;Adjust row count (clears zf)
mov video_rows,dl ; and save
no_ps2:
ret
ps2_state ENDP

;-----------------------------------------------------------------------;
; If PS/2 compatible ROM BIOS is not present, this procedure attempts ;
; to access the EGA ROM BIOS video services. ;
; ;
; Output: zf Zero flag set if EGA not active ;
; ;
;-----------------------------------------------------------------------;
ega_state PROC NEAR
mov ah,12h ;Read EGA video state
mov bl,10h
int 10h
cmp bl,10h ;Was function supported?
je no_ega ;No, EGA BIOS not present
cmp video_iscolor,bh ;Is EGA the active display
je no_ega ;No, find active display
add bh,4 ;Else calculate display code
mov video_type,bh ; and save
mov ax,1130h ;Read font code
sub bh,bh ;Font code (not used)
int 10h
inc dl ;Adjust row count (clears zf)
mov video_rows,dl ; and save
no_ega:
ret
ega_state ENDP

;-----------------------------------------------------------------------;
; This procedure is called if neither PS/2 or EGA comaptible ROM BIOS ;
; was active. It simply assumes 25 text rows and sets video_type to MDA ;
; or CGA depending on the value of video_iscolor. ;
;-----------------------------------------------------------------------;
cga_state PROC NEAR
mov video_rows,25 ;If we get here, must be 25 rows
mov video_type,01h ;Assume MDA display adapter for now
cmp video_iscolor,0 ;Is it mono?
je no_cga ;Yes
mov video_type,02h ;Else set CGA display adapter
no_cga:
ret
cga_state ENDP

;-----------------------------------------------------------------------;
; This routine fills a buffer with the current video parameter values. ;
; Note: initvideo() must be called first in order for this procedure to ;
; return meaningful values. ;
; ;
; Usage: void getvconfig(struct video *); ;
; ;
; Where: struct video { ;
; int segment; ;
; int type; ;
; int iscolor; ;
; int mode; ;
; int page; ;
; int rows; ;
; int columns; ;
; }; ;
; ;
;-----------------------------------------------------------------------;
getvconfig PROC USES si di, buffer:PTR
cld
IF @DataSize
les di,buffer ;Load far struct pointer into es:di
ELSE
mov di,buffer ;Load near struct pointer into es:di
push ds
pop es
ENDIF
mov si,OFFSET video_segment ;ds:si points to display variables
lodsw ;Copy video segment to buffer
stosw
mov cx,6 ;Copy 6 more byte values
sub ah,ah ;Clear high byte of ax
copy_loop:
lodsb ;Load byte value in al
stosw ;Copy word value to buffer
loop copy_loop
ret
getvconfig ENDP

END


  3 Responses to “Category : Files from Magazines
Archive   : WDJAN92.ZIP
Filename : 3N01052A

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/