139 lines
3.6 KiB
NASM
139 lines
3.6 KiB
NASM
;*ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ*
|
|
; VESA.ASM 386
|
|
; (c) Adeline 1993
|
|
;*ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ*
|
|
|
|
;*--------------------------------------------------------------------------*
|
|
|
|
.386
|
|
jumps
|
|
|
|
.model FLAT, SYSCALL
|
|
|
|
.DATA
|
|
|
|
PUBLIC NoLanguage VESA_Error
|
|
|
|
extrn NoLanguage ScanLine: DWORD
|
|
extrn NoLanguage NonStdVESA: BYTE
|
|
extrn NoLanguage BankShift: BYTE
|
|
|
|
;----------------------------------------------------------------------------
|
|
|
|
RMI equ $
|
|
RMI_EDI dd 0
|
|
RMI_ESI dd 0
|
|
RMI_EBP dd 0
|
|
RMI_RESERVED dd 0
|
|
RMI_EBX dd 0
|
|
RMI_EDX dd 0
|
|
RMI_ECX dd 0
|
|
RMI_EAX dd 0
|
|
RMI_flags dw 0
|
|
RMI_ES dw 0
|
|
RMI_DS dw 0
|
|
RMI_FS dw 0
|
|
RMI_GS dw 0
|
|
RMI_IP dw 0
|
|
RMI_CS dw 0
|
|
RMI_SP dw 0
|
|
RMI_SS dw 0
|
|
|
|
;----------------------------------------------------------------------------
|
|
|
|
Vesa_Error db 0
|
|
|
|
;----------------------------------------------------------------------------
|
|
|
|
.CODE
|
|
|
|
PUBLIC NoLanguage NewBankVesa
|
|
PUBLIC NoLanguage InitModeVesa
|
|
|
|
;----------------------------------------------------------------------------
|
|
NewBankVesa proc
|
|
|
|
push ebx
|
|
|
|
Shift equ $+3
|
|
shl ax, 0
|
|
|
|
mov dx, ax
|
|
mov eax, 4F05h ; change bank VESA
|
|
xor ebx, ebx ; bh = 0, set bank
|
|
int 10h
|
|
|
|
pop ebx
|
|
|
|
ret
|
|
|
|
NewBankVesa endp
|
|
|
|
;----------------------------------------------------------------------------
|
|
InitModeVesa proc
|
|
|
|
mov byte ptr[VESA_Error], 0
|
|
|
|
mov eax, 0100h ; DMPI Allocate Dos Mem
|
|
mov ebx, 32 ; 512 byte just in case
|
|
int 31h ; return dos segment in ax
|
|
push edx ; save selector
|
|
push eax ; save real-mode segment
|
|
|
|
push es ; save es
|
|
mov RMI_ES, ax ; buffer segment
|
|
xor RMI_EDI, 0 ; buffer offset 0
|
|
mov RMI_EAX, 4F01h ; Vesa information
|
|
mov RMI_ECX, 0101h ; mode 101h
|
|
mov ax, ds
|
|
mov es, ax ; es = ds (just in case)
|
|
mov edi, offset RMI ; registers
|
|
mov ax, 0300h ; DMPI generate real-mode int
|
|
mov bx, 10h ; int 10h
|
|
int 31h
|
|
pop es ; restore es
|
|
|
|
mov eax, RMI_EAX
|
|
cmp ax, 004Fh
|
|
jne error
|
|
|
|
pop eax ; restore real-mode segment
|
|
and eax, 0FFFFh ; only segment
|
|
shl eax, 4 ; convert to linear
|
|
|
|
movzx ebx, word ptr[eax+10h]
|
|
cmp ebx, 640
|
|
je okscan
|
|
mov [ScanLine], ebx ; Scanline
|
|
mov [NonStdVESA], 1
|
|
|
|
okscan: mov ax, [eax+4] ; get granularity
|
|
bsr ax, ax ; get higher bit position
|
|
neg al ; - position
|
|
add al, 6 ; shift = 6 - position
|
|
mov byte ptr[Shift], al
|
|
|
|
pop edx ; restore selector
|
|
mov eax, 0101h ; DPMI return Dos memory
|
|
int 31h
|
|
|
|
mov ax, 4F02h ; Switch to Video Mode
|
|
mov bx, 0101h ; VESA 640*480*256
|
|
int 10h
|
|
ret
|
|
error:
|
|
pop eax
|
|
pop edx ; restore selector
|
|
mov eax, 0101h ; DPMI return Dos memory
|
|
int 31h
|
|
|
|
mov byte ptr[VESA_Error], 1
|
|
|
|
ret
|
|
|
|
InitModeVesa endp
|
|
|
|
;----------------------------------------------------------------------------
|
|
|
|
END
|