home *** CD-ROM | disk | FTP | other *** search
- name vmode
- page 55,132
- title 'VMODE --- Set PC Video Mode'
- ;
- ; VMODE utility to set display
- ; mode on IBM Personal Coeputer
- ;
- ; Ray Duncan, July 1983 (Transcribed from Sept 1983 Softtalk p.181)
- ;
- input equ 080h ;address of command tail
- ;buffer (set up by DOS)
- blank equ 20h ;ASCII blank code
- cr equ 0dh ;ASCII carriage return
- lf equ 0ah ;ASCII line feed
- ;
- ;
- cseg segment byte
- assume cs:cseg,ds:cseg
- org 100h
- ;
- vmode: ;initialize DI to the
- ;address of the input buffer
- mov di,offset input
- mov al,[di] ;check if any command tail
- or al,al ;and exit if not
- jz vmode7
- mov al,blank ;load ASCII blank for scan
- inc di ;increment address in DI
- ;past the input count byte
- mov cx,80 ;scan max of 80 chars.
- cld ;clear direction flag
- repz scasb ;look for first non-blank
- ;character in input buffer
- jz vmode7 ;jump if none found
- ;load the non-blank char.,
- ;use offset 0f -1 since DI
- ;will be pointing past it
- mov al,-1[di]
- cmp al,cr ;if first non-blank char
- ;was RETURN, mode was missing
- jz vmode7 ;so go print error message
- cmp al,'0' ;make sure it is range 0-7
- jb vmode8 ;exit if ASCII code is <'0'
- cmp al,'7' ;compare for '7'
- ja vmode8 ;exit if ASCII code >'7'
- mov vmodeb,al ;store mode number into
- ;output string
- and al,0fh ;mask off upper four bits
- ;of character. to get 0-7
- push ax ;save mode for later
- xor bx,bx ;zero BX
- mov es,bx ;set ES=zero
- mov bx,410h ;set BX=addr of DOS's
- ;equipment flags word
- cmp al,7 ;check if monochrome
- ;or graphics board
- mov al,30h ;assume monochrome
- jz vmode6
- mov al,20h ;no, was graphics board
- vmode6: ;mask off the old
- ;display equipment flags
- and byte ptr es:[bx],0cfh
- ;merge in the proper flag
- ;for the newly selected display
- or es:[bx],al
- pop ax ;recover mode
- xor ah,ah ;force AH=zero
- int 10h ;and call ROM BIOS
- ;to set new display,
- ;go print success message,
- ;and exit
- mov dx,offset vmodea
- jmp short vmode9
- vmode7: ;print "missing mode number"
- mov dx,offset vmodec
- jmp short vmode9
- vmode8: ;print "illegal mode number"
- mov dx,offset vmoded
- vmode9: ;print the message whose
- ;address is in reg DX
- mov ah,9 ;function 9 = print string
- int 21h ;call DOS to print
- ;and exit back to DOS
- int 20h
- ;
- vmodea db cr,lf
- db 'Video mode set to '
- vmodeb db ' ',cr,lf,'$'
- vmodec db cr,lf
- db 'Missing mode number '
- db cr,lf,'$'
- vmoded db cr,lf
- db 'Illegal mode number '
- db cr,lf,'$'
- ;
- cseg ends
- ;
- end vmode
-