More VGA tests
This commit is contained in:
parent
7fa7f53cd0
commit
fed558c8d4
3 changed files with 737 additions and 0 deletions
192
tests/pc/vga/L27-3.ASM
Normal file
192
tests/pc/vga/L27-3.ASM
Normal file
|
|
@ -0,0 +1,192 @@
|
|||
; Program to illustrate flipping from bit-mapped graphics mode to
|
||||
; text mode and back without losing any of the graphics bit-map.
|
||||
;
|
||||
; Assemble with MASM or TASM
|
||||
;
|
||||
; By Michael Abrash
|
||||
;
|
||||
Stack segment para stack 'STACK'
|
||||
db 512 dup(0)
|
||||
Stack ends
|
||||
|
||||
GRAPHICS_SEGMENT equ 0a000h ;mode 10 bit-map segment
|
||||
TEXT_SEGMENT equ 0b800h ;mode 3 bit-map segment
|
||||
|
||||
SC_INDEX equ 3c4h ;Sequence Controller Index register
|
||||
MAP_MASK equ 2 ;index of Map Mask register
|
||||
GC_INDEX equ 3ceh ;Graphics Controller Index register
|
||||
READ_MAP equ 4 ;index of Read Map register
|
||||
|
||||
Data segment para common 'DATA'
|
||||
|
||||
GStrikeAnyKeyMsg0 label byte
|
||||
db 0dh, 0ah, 'Graphics mode', 0dh, 0ah
|
||||
db 'Strike any key to continue...', 0dh, 0ah, '$'
|
||||
|
||||
GStrikeAnyKeyMsg1 label byte
|
||||
db 0dh, 0ah, 'Graphics mode again', 0dh, 0ah
|
||||
db 'Strike any key to continue...', 0dh, 0ah, '$'
|
||||
|
||||
TStrikeAnyKeyMsg label byte
|
||||
db 0dh, 0ah, 'Text mode', 0dh, 0ah
|
||||
db 'Strike any key to continue...', 0dh, 0ah, '$'
|
||||
|
||||
Plane2Save db 2000h dup (?) ;save area for plane 2 data
|
||||
; where font gets loaded
|
||||
CharAttSave db 4000 dup (?) ;save area for memory wiped
|
||||
; out by character/attribute
|
||||
; data in text mode
|
||||
Data ends
|
||||
|
||||
Code segment para public 'CODE'
|
||||
assume cs:Code, ds:Data
|
||||
Start proc near
|
||||
mov ax,10h
|
||||
int 10h ;select video mode 10h (640x350)
|
||||
;
|
||||
; Fill the graphics bit-map with a colored pattern.
|
||||
;
|
||||
cld
|
||||
mov ax,GRAPHICS_SEGMENT
|
||||
mov es,ax
|
||||
mov ah,3 ;initial fill pattern
|
||||
mov cx,4 ;four planes to fill
|
||||
mov dx,SC_INDEX
|
||||
mov al,MAP_MASK
|
||||
out dx,al ;leave the SC Index pointing to the
|
||||
inc dx ; Map Mask register
|
||||
|
||||
FillBitMap:
|
||||
mov al,10h
|
||||
shr al,cl ;generate map mask for this plane
|
||||
out dx,al ;set map mask for this plane
|
||||
sub di,di ;start at offset 0
|
||||
mov al,ah ;get the fill pattern
|
||||
push cx ;preserve plane count
|
||||
mov cx,8000h ;fill 32K words
|
||||
rep stosw ;do fill for this plane
|
||||
pop cx ;get back plane count
|
||||
shl ah,1
|
||||
shl ah,1
|
||||
loop FillBitMap
|
||||
;
|
||||
; Put up "strike any key" message.
|
||||
;
|
||||
mov ax,Data
|
||||
mov ds,ax
|
||||
mov dx,offset GStrikeAnyKeyMsg0
|
||||
mov ah,9
|
||||
int 21h
|
||||
;
|
||||
; Wait for a key.
|
||||
;
|
||||
mov ah,01h
|
||||
int 21h
|
||||
;
|
||||
; Save the 8K of plane 2 that will be used by the font.
|
||||
;
|
||||
mov dx,GC_INDEX
|
||||
mov al,READ_MAP
|
||||
out dx,al
|
||||
inc dx
|
||||
mov al,2
|
||||
out dx,al ;set up to read from plane 2
|
||||
mov ax,Data
|
||||
mov es,ax
|
||||
mov ax,GRAPHICS_SEGMENT
|
||||
mov ds,ax
|
||||
sub si,si
|
||||
mov di,offset Plane2Save
|
||||
mov cx,2000h/2 ;save 8K (length of default font)
|
||||
rep movsw
|
||||
;
|
||||
; Go to text mode without clearing display memory.
|
||||
;
|
||||
mov ax,083h
|
||||
int 10h
|
||||
;
|
||||
; Save the text mode bit-map.
|
||||
;
|
||||
mov ax,Data
|
||||
mov es,ax
|
||||
mov ax,TEXT_SEGMENT
|
||||
mov ds,ax
|
||||
sub si,si
|
||||
mov di,offset CharAttSave
|
||||
mov cx,4000/2 ;length of one text screen in words
|
||||
rep movsw
|
||||
;
|
||||
; Fill the text mode screen with dots and put up "strike any key"
|
||||
; message.
|
||||
;
|
||||
mov ax,TEXT_SEGMENT
|
||||
mov es,ax
|
||||
sub di,di
|
||||
mov al,'.' ;fill character
|
||||
mov ah,7 ;fill attribute
|
||||
mov cx,4000/2 ;length of one text screen in words
|
||||
rep stosw
|
||||
mov ax,Data
|
||||
mov ds,ax
|
||||
mov dx,offset TStrikeAnyKeyMsg
|
||||
mov ah,9
|
||||
int 21h
|
||||
;
|
||||
; Wait for a key.
|
||||
;
|
||||
mov ah,01h
|
||||
int 21h
|
||||
;
|
||||
; Restore the text mode screen to the state it was in on entering
|
||||
; text mode.
|
||||
;
|
||||
mov ax,Data
|
||||
mov ds,ax
|
||||
mov ax,TEXT_SEGMENT
|
||||
mov es,ax
|
||||
mov si,offset CharAttSave
|
||||
sub di,di
|
||||
mov cx,4000/2 ;length of one text screen in words
|
||||
rep movsw
|
||||
;
|
||||
; Return to mode 10h without clearing display memory.
|
||||
;
|
||||
mov ax,90h
|
||||
int 10h
|
||||
;
|
||||
; Restore the portion of plane 2 that was wiped out by the font.
|
||||
;
|
||||
mov dx,SC_INDEX
|
||||
mov al,MAP_MASK
|
||||
out dx,al
|
||||
inc dx
|
||||
mov al,4
|
||||
out dx,al ;set up to write to plane 2
|
||||
mov ax,Data
|
||||
mov ds,ax
|
||||
mov ax,GRAPHICS_SEGMENT
|
||||
mov es,ax
|
||||
mov si,offset Plane2Save
|
||||
sub di,di
|
||||
mov cx,2000h/2 ;restore 8K (length of default font)
|
||||
rep movsw
|
||||
;
|
||||
; Put up "strike any key" message.
|
||||
;
|
||||
mov ax,Data
|
||||
mov ds,ax
|
||||
mov dx,offset GStrikeAnyKeyMsg1
|
||||
mov ah,9
|
||||
int 21h
|
||||
;
|
||||
; Wait for a key before returning to text mode and ending.
|
||||
;
|
||||
mov ah,01h
|
||||
int 21h
|
||||
mov ax,03h
|
||||
int 10h
|
||||
mov ah,4ch
|
||||
int 21h
|
||||
Start endp
|
||||
Code ends
|
||||
end Start
|
||||
Loading…
Reference in a new issue