mirror of
https://github.com/KolibriOS/kolibrios.git
synced 2024-12-27 00:39:41 +03:00
8a1c0404e2
git-svn-id: svn://kolibrios.org@384 a494cfbc-eb01-0410-851d-a64ba20cac60
1081 lines
27 KiB
PHP
1081 lines
27 KiB
PHP
|
|
struc VBE_VGAInfo {
|
|
.VESASignature dd ? ; char
|
|
.VESAVersion dw ? ; short
|
|
.OemStringPtr dd ? ; char *
|
|
.Capabilities dd ? ; ulong
|
|
.VideoModePtr dd ? ; ulong
|
|
.TotalMemory dw ? ; short
|
|
; VBE 2.0+
|
|
.OemSoftwareRev db ? ; short
|
|
.OemVendorNamePtr dw ? ; char *
|
|
.OemProductNamePtr dw ? ; char *
|
|
.OemProductRevPtr dw ? ; char *
|
|
.reserved rb 222 ; char
|
|
.OemData rb 256 ; char
|
|
}
|
|
|
|
struc VBE_ModeInfo {
|
|
.ModeAttributes dw ? ; short
|
|
.WinAAttributes db ? ; char
|
|
.WinBAttributes db ? ; char
|
|
.WinGranularity dw ? ; short
|
|
.WinSize dw ? ; short
|
|
.WinASegment dw ? ; ushort
|
|
.WinBSegment dw ? ; ushort
|
|
.WinFuncPtr dd ? ; void *
|
|
.BytesPerScanLine dw ? ; short
|
|
.XRes dw ? ; short
|
|
.YRes dw ? ; short
|
|
.XCharSize db ? ; char
|
|
.YCharSize db ? ; char
|
|
.NumberOfPlanes db ? ; char
|
|
.BitsPerPixel db ? ; char
|
|
.NumberOfBanks db ? ; char
|
|
.MemoryModel db ? ; char
|
|
.BankSize db ? ; char
|
|
.NumberOfImagePages db ? ; char
|
|
.res1 db ? ; char
|
|
.RedMaskSize db ? ; char
|
|
.RedFieldPosition db ? ; char
|
|
.GreenMaskSize db ? ; char
|
|
.GreenFieldPosition db ? ; char
|
|
.BlueMaskSize db ? ; char
|
|
.BlueFieldPosition db ? ; char
|
|
.RsvedMaskSize db ? ; char
|
|
.RsvedFieldPosition db ? ; char
|
|
.DirectColorModeInfo db ? ; char ; MISSED IN THIS TUTORIAL!! SEE ABOVE
|
|
; VBE 2.0+
|
|
.PhysBasePtr dd ? ; ulong
|
|
.OffScreenMemOffset dd ? ; ulong
|
|
.OffScreenMemSize dw ? ; short
|
|
; VBE 3.0+
|
|
.LinbytesPerScanLine dw ? ; short
|
|
.BankNumberOfImagePages db ? ; char
|
|
.LinNumberOfImagePages db ? ; char
|
|
.LinRedMaskSize db ? ; char
|
|
.LinRedFieldPosition db ? ; char
|
|
.LingreenMaskSize db ? ; char
|
|
.LinGreenFieldPosition db ? ; char
|
|
.LinBlueMaskSize db ? ; char
|
|
.LinBlueFieldPosition db ? ; char
|
|
.LinRsvdMaskSize db ? ; char
|
|
.LinRsvdFieldPosition db ? ; char
|
|
.MaxPixelClock dd ? ; ulong
|
|
.res2 rb 190 ; char
|
|
}
|
|
|
|
virtual at $A000
|
|
vi VBE_VGAInfo
|
|
mi VBE_ModeInfo
|
|
modes_table:
|
|
end virtual
|
|
|
|
ln_top db 1
|
|
ln_num db 6
|
|
ln_cnt db ?
|
|
db ?
|
|
|
|
ln_top2 db ?
|
|
ln_num2 db ?
|
|
ln_cnt2 db ?
|
|
db ?
|
|
|
|
vm_row db 2
|
|
vm_col db 2
|
|
|
|
print_vesa_info:
|
|
push 0
|
|
pop es
|
|
|
|
_setcursor 3,2
|
|
|
|
mov [es:vi.VESASignature],'VBE2'
|
|
mov ax,$4F00
|
|
mov di,vi
|
|
int $10
|
|
or ah,ah
|
|
jz @f
|
|
mov [es:vi.VESASignature],'VESA'
|
|
mov ax,$4F00
|
|
mov di,vi
|
|
int $10
|
|
or ah,ah
|
|
jnz .exit
|
|
@@:
|
|
cmp [es:vi.VESASignature],'VESA'
|
|
jne .exit
|
|
cmp [es:vi.VESAVersion],$0100
|
|
jb .exit
|
|
jmp .vesaok2
|
|
|
|
.exit:
|
|
;pushad
|
|
push 0
|
|
pop es
|
|
mov si,novesa-0x10000
|
|
call printplain
|
|
ret
|
|
;pushw 'bb'
|
|
;jmp enum_modes.modes_ok
|
|
|
|
.vesaok2:
|
|
mov ecx,0x00200000
|
|
mov ax,[es:vi.TotalMemory]
|
|
shr ax,4
|
|
mov bl,10
|
|
div bl
|
|
mov ch,ah
|
|
and ax,0x00FF
|
|
div bl
|
|
shl ecx,8
|
|
mov cx,ax
|
|
add ecx,'000'
|
|
|
|
mov ax,[es:vi.VESAVersion]
|
|
add ax,'00'
|
|
|
|
push 0x1000
|
|
pop es
|
|
mov [es:s_vesa.ver-0x10000], ah
|
|
mov [es:s_vesa.ver+2-0x10000], al
|
|
mov dword[es:s_vesa.mem-0x10000],ecx
|
|
mov si,s_vesa-0x10000
|
|
call printplain
|
|
|
|
if 0 ; mm
|
|
_setcursor 5,2
|
|
mov si,_oem-0x10000
|
|
call printplain
|
|
end if ; mm
|
|
|
|
push 0
|
|
pop es
|
|
mov si,word[es:vi.OemStringPtr]
|
|
mov di,si
|
|
push word[es:vi.OemStringPtr+2]
|
|
pop es
|
|
if 0 ; mm
|
|
; mov al,0x0A
|
|
pop es
|
|
mov ax,es
|
|
mov ds,ax
|
|
call printplain
|
|
pop es
|
|
end if ; mm
|
|
push 0x1000
|
|
pop ds
|
|
mov si,s_ven_intel-0x10000
|
|
call substr
|
|
mov al,1
|
|
je .vendor_ok
|
|
mov si,s_ven_s3-0x10000
|
|
call substr
|
|
mov al,2
|
|
je .vendor_ok
|
|
mov al,3
|
|
.vendor_ok:
|
|
push 0 0x1000
|
|
pop ds es
|
|
mov [es:0x9035],al
|
|
ret
|
|
|
|
;-----------------------------------------------------------------------------
|
|
|
|
calc_vmodes_table:
|
|
push 0 0x1000
|
|
pop ds es
|
|
;movzx eax,byte [es:preboot_graph-0x10000]
|
|
;cmp eax,0
|
|
;jne pre_graph
|
|
;_setcursor 9,2
|
|
;mov si,gr_mode-0x10000
|
|
;call printplain
|
|
.enum_modes:
|
|
pushad
|
|
push 0x0000
|
|
pop es
|
|
;mov si,s_mode1-0x10000
|
|
;call printplain
|
|
mov si,word[es:vi.VideoModePtr]
|
|
push word[es:vi.VideoModePtr+2]
|
|
pop fs
|
|
;pushw 1
|
|
|
|
mov bx,modes_table;-0x10000
|
|
.next_mode:
|
|
mov cx,[fs:si] ; mode number
|
|
cmp cx,-1
|
|
je .modes_ok.2
|
|
|
|
mov ax,$4F01
|
|
mov di,mi
|
|
int $10
|
|
|
|
or ah,ah
|
|
jnz .modes_ok.2;vesa_info.exit
|
|
test [es:mi.ModeAttributes],00000001b
|
|
jz @f
|
|
test [es:mi.ModeAttributes],00010000b
|
|
jz @f
|
|
|
|
cmp [es:mi.BitsPerPixel],16
|
|
jne .l0
|
|
cmp [es:mi.GreenMaskSize],5
|
|
jne .l0
|
|
mov [es:mi.BitsPerPixel],15
|
|
.l0:
|
|
|
|
cmp [es:mi.XRes],640
|
|
jb @f
|
|
cmp [es:mi.YRes],480
|
|
jb @f
|
|
cmp [es:mi.BitsPerPixel],15
|
|
jb @f
|
|
|
|
mov ax,[es:mi.XRes]
|
|
mov [es:bx+0],ax ; +0[2] : resolution X
|
|
mov ax,[es:mi.YRes]
|
|
mov [es:bx+2],ax ; +2[2] : resolution Y
|
|
mov ax,[es:mi.ModeAttributes]
|
|
mov [es:bx+4],ax ; +4[2] : attributes
|
|
cmp [s_vesa.ver-0x10000],'2'
|
|
jb .lp1
|
|
or cx,0x4000 ; use LFB
|
|
.lp1: mov [es:bx+6],cx ; +6[2] : mode number
|
|
mov al,[es:mi.BitsPerPixel]
|
|
mov [es:bx+8],al ; +8[1] : bits per pixel
|
|
|
|
add bx,10
|
|
|
|
@@:
|
|
add si,2
|
|
jmp .next_mode
|
|
|
|
.modes_ok.2:
|
|
|
|
mov si,modes_table;-0x10000;m_info
|
|
|
|
@@: add si,10
|
|
cmp si,bx
|
|
jae @f
|
|
mov ax,[es:si+0-10]
|
|
cmp ax,[es:si+0]
|
|
ja .xch
|
|
jb @b
|
|
mov ax,[es:si+2-10]
|
|
cmp ax,[es:si+2]
|
|
ja .xch
|
|
jb @b
|
|
mov al,[es:si+8-10]
|
|
cmp al,[es:si+8]
|
|
ja .xch
|
|
jb @b
|
|
pushad
|
|
.del: push dword[es:si+0] dword[es:si+4] word[es:si+8] dword[es:si+0+10] dword[es:si+4+10] word[es:si+8+10]
|
|
pop word[es:si+8] dword[es:si+4] dword[es:si+0] word[es:si+8+10] dword[es:si+4+10] dword[es:si+0+10]
|
|
add si,10
|
|
cmp si,bx
|
|
jb .del
|
|
popad
|
|
mov si,modes_table
|
|
sub bx,10
|
|
jmp @b
|
|
.xch: push dword[es:si+0] dword[es:si+4] word[es:si+8] dword[es:si+0-10] dword[es:si+4-10] word[es:si+8-10]
|
|
pop word[es:si+8] dword[es:si+4] dword[es:si+0] word[es:si+8-10] dword[es:si+4-10] dword[es:si+0-10]
|
|
mov si,modes_table;-0x10000;m_info
|
|
jmp @b
|
|
|
|
@@:
|
|
|
|
push 0
|
|
pop es
|
|
mov word[es:bx],-1
|
|
mov si,modes_table
|
|
mov di,0x0AC00
|
|
pushw [es:si+2] [es:si+0]
|
|
mov bp,sp
|
|
mov [ds:ln_cnt],0
|
|
mov word[es:si-10],0
|
|
jmp .wr.2
|
|
|
|
@@:
|
|
cmp word[es:si-10],-1
|
|
je @f
|
|
|
|
mov ax,[es:si+0]
|
|
cmp ax,[ss:bp+0]
|
|
jne .wr
|
|
mov ax,[es:si+2]
|
|
cmp ax,[ss:bp+2]
|
|
jne .wr
|
|
|
|
.ww: mov al,[es:si+8]
|
|
mov bx,4
|
|
cmp al,4
|
|
je .l1
|
|
add bx,4
|
|
cmp al,8
|
|
je .l1
|
|
add bx,4
|
|
cmp al,15
|
|
je .l1
|
|
add bx,4
|
|
cmp al,16
|
|
je .l1
|
|
add bx,4
|
|
cmp al,24
|
|
je .l1
|
|
add bx,4
|
|
.l1: mov eax,[es:si+4] ; mode attributes & number
|
|
mov [es:di+bx],eax
|
|
|
|
add si,10
|
|
jmp @b
|
|
|
|
.wr:
|
|
pushw [ss:bp+0] [ss:bp+2]
|
|
popw [es:di+2] [es:di+0]
|
|
add di,4+6*4
|
|
inc [ds:ln_cnt]
|
|
pushw [es:si+0] [es:si+2]
|
|
popw [ss:bp+2] [ss:bp+0]
|
|
.wr.2:
|
|
mov cx,(4+6*4)/2
|
|
xor ax,ax
|
|
push di
|
|
cld
|
|
rep stosw
|
|
pop di
|
|
jmp .ww
|
|
|
|
@@: add sp,4
|
|
popad
|
|
ret
|
|
|
|
;-----------------------------------------------------------------------------
|
|
|
|
vm_bpp db 4,8,15,16,24,32
|
|
|
|
draw_current_vmode:
|
|
push es ds 0 0x1000
|
|
pop es ds
|
|
movzx ax,[es:vm_row]
|
|
mov dx,4+6*4
|
|
mul dx
|
|
mov si,ax
|
|
add si,0x0AC00
|
|
mov di,0x0A000
|
|
movzx eax,word[si+0]
|
|
mov ecx,10
|
|
call int2strnz
|
|
mov byte[ds:di],'x'
|
|
inc di
|
|
movzx eax,word[si+2]
|
|
call int2strnz
|
|
mov byte[ds:di],'x'
|
|
inc di
|
|
movzx bx,[es:vm_col]
|
|
movzx eax,[es:bx+vm_bpp]
|
|
call int2strnz
|
|
mov byte[ds:di],0
|
|
mov si,0x0A000
|
|
call printplain
|
|
pop ds es
|
|
ret
|
|
|
|
;-----------------------------------------------------------------------------
|
|
|
|
draw_vmodes_table:
|
|
_setcursor 9,2
|
|
mov si,gr_mode-0x10000
|
|
call printplain
|
|
;mov ah,9
|
|
;mov dx,_tl
|
|
;int $21
|
|
mov si,_tl-0x10000
|
|
call printplain
|
|
push 0
|
|
pop es
|
|
movzx ax,[ds:ln_top]
|
|
mov dx,4+6*4
|
|
mul dx
|
|
mov si,ax
|
|
add si,0x0AC00
|
|
|
|
mov eax,dword[ds:ln_top]
|
|
mov dword[ds:ln_top2],eax ; top+num+cnt
|
|
|
|
movzx cx,[ds:ln_num2]
|
|
@@: push cx
|
|
|
|
movzx eax,word[es:si+0]
|
|
mov di,_rs-0x10000+2+14
|
|
mov ecx,10
|
|
mov bl,4
|
|
call int2str
|
|
movzx eax,word[es:si+2]
|
|
inc di
|
|
mov bl,4
|
|
call int2str
|
|
|
|
add si,4
|
|
add di,4
|
|
mov cx,6
|
|
.lp0: mov al,' '
|
|
cmp word[es:si],0
|
|
je .lp1
|
|
mov al,0xFB ; check
|
|
.lp1: mov [ds:di],al
|
|
add si,4
|
|
add di,6
|
|
loop .lp0
|
|
|
|
push si
|
|
mov si,_rs-0x10000
|
|
call printplain
|
|
pop si
|
|
|
|
pop cx
|
|
loop @b
|
|
|
|
mov si,_bt-0x10000
|
|
call printplain
|
|
ret
|
|
|
|
;-----------------------------------------------------------------------------
|
|
|
|
draw_vmodes_table_cursor: ; 9+5
|
|
mov al,[vm_row]
|
|
sub al,[ln_top]
|
|
add al,13
|
|
mov dh,al
|
|
mov al,[vm_col]
|
|
mov dl,6
|
|
mul dl
|
|
add al,28
|
|
mov dl,al
|
|
call setcursor
|
|
mov si,_sel1-0x10000
|
|
mov [si],ch
|
|
call printplain
|
|
add dl,2
|
|
call setcursor
|
|
mov si,_sel2-0x10000
|
|
mov [si],cl
|
|
call printplain
|
|
dec dl
|
|
call setcursor
|
|
ret
|
|
|
|
;-----------------------------------------------------------------------------
|
|
|
|
macro qwe
|
|
{
|
|
pushad
|
|
pushfd
|
|
push es ds 0 0x1000
|
|
pop ds es
|
|
mov si,badsect-2-0x10000
|
|
call printplain
|
|
pop ds es
|
|
popfd
|
|
popad
|
|
}
|
|
|
|
set_vmode:
|
|
push 0 0x1000
|
|
pop ds es
|
|
movzx ax,[ds:vm_row]
|
|
mov dx,4+6*4
|
|
mul dx
|
|
add ax,0x0AC00
|
|
mov si,ax
|
|
mov cx,[es:si+0] ; resolution X
|
|
mov dx,[es:si+2] ; resolution Y
|
|
movzx bx,[ds:vm_col]
|
|
shl bx,2
|
|
mov bx,[es:si+4+bx+2] ; mode number
|
|
|
|
; mov bx,0x4118
|
|
; mov cx,1024
|
|
; mov dx,768
|
|
; mov byte[es:0x9000],24
|
|
|
|
cmp bx,0x12
|
|
je .gml00
|
|
cmp bx,0x13
|
|
je .sgml1
|
|
|
|
movzx bp,[ds:vm_col]
|
|
mov al,[ds:bp+vm_bpp]
|
|
mov [es:0x9000],al
|
|
jmp .gml10
|
|
|
|
.sgml1:
|
|
mov [es:0x9000],byte 32
|
|
jmp .gml10
|
|
|
|
.gml00:
|
|
mov [es:0x9000],byte 4
|
|
|
|
.gml10:
|
|
mov [es:0x9008],bx
|
|
mov [es:0x900A],cx
|
|
mov [es:0x900C],dx
|
|
mov al,[s_vesa.ver-0x10000]
|
|
mov [es:0x9034],al
|
|
; push 0x1000
|
|
; pop es
|
|
mov [s_bpp.bpp-0x10000],'8 '
|
|
cmp bx,0x13
|
|
je .bppl;nov
|
|
mov [s_bpp.bpp-0x10000],'4 '
|
|
cmp bx,0x12
|
|
je .bppl;nov
|
|
|
|
; bx - mode : cx - x size : dx - y size
|
|
|
|
; FIND VESA 2.0 LFB & BPP
|
|
|
|
mov ax,0x4f01
|
|
mov cx,bx
|
|
and cx,0xfff
|
|
push 0x0000
|
|
pop es
|
|
mov di,mi;0xa000
|
|
int 0x10
|
|
; LFB
|
|
mov eax,[es:mi.PhysBasePtr];di+0x28]
|
|
mov [es:0x9018],eax
|
|
; BPP
|
|
; cmp [es:mi.BitsPerPixel],16
|
|
; jne .l0
|
|
; cmp [es:mi.GreenMaskSize],5
|
|
; jne .l0
|
|
; mov [es:mi.BitsPerPixel],15
|
|
; .l0: mov al,[es:mi.BitsPerPixel];di+0x19]
|
|
; mov [es:0x9000],al
|
|
; ---- vbe voodoo
|
|
;BytesPerScanLine equ 0x10
|
|
push ax
|
|
mov ax, [es:mi.BytesPerScanLine];di+BytesPerScanLine]
|
|
mov [es:0x9001],ax
|
|
pop ax
|
|
; -----
|
|
.nov:
|
|
mov al,[es:0x9000]
|
|
|
|
cmp al,15
|
|
jnz .nbpp15
|
|
mov [s_bpp.bpp-0x10000],'15'
|
|
jmp .bppl
|
|
.nbpp15:
|
|
cmp al,16
|
|
jnz .nbpp16
|
|
mov [s_bpp.bpp-0x10000],'16'
|
|
jmp .bppl
|
|
.nbpp16:
|
|
cmp al,24
|
|
jnz .nbpp24
|
|
mov [s_bpp.bpp-0x10000],'24'
|
|
jmp .bppl
|
|
.nbpp24:
|
|
cmp al,32
|
|
jnz .nbpp32
|
|
mov [s_bpp.bpp-0x10000],'32'
|
|
jmp .bppl
|
|
.nbpp32:
|
|
mov [s_bpp.bpp-0x10000],'??'
|
|
mov si,s_bpp-0x10000
|
|
call printplain
|
|
jmp $
|
|
.bppl:
|
|
mov si,s_bpp-0x10000
|
|
call printplain
|
|
|
|
|
|
; FIND VESA 1.2 PM BANK SWITCH ADDRESS
|
|
|
|
cmp [s_vesa.ver-0x10000],'2'
|
|
jb @f
|
|
|
|
mov ax,0x4f0A
|
|
mov bx,0x0
|
|
int 0x10
|
|
xor eax,eax
|
|
xor ebx,ebx
|
|
mov ax,es
|
|
shl eax,4
|
|
mov bx,di
|
|
add eax,ebx
|
|
movzx ebx,word[es:di]
|
|
add eax,ebx
|
|
push 0x0000
|
|
pop es
|
|
mov [es:0x9014],eax
|
|
jmp .lp1
|
|
@@:
|
|
|
|
mov dword[es:0x9018],0x000A0000
|
|
.lp1:
|
|
|
|
ret
|
|
|
|
;=============================================================================
|
|
;=============================================================================
|
|
;=============================================================================
|
|
|
|
; DISPLAY VESA INFORMATION
|
|
vesa_info:
|
|
macro sdfawgsgwaew {
|
|
push 0
|
|
pop es
|
|
|
|
mov [es:vi.VESASignature],'VBE2'
|
|
mov ax,$4F00
|
|
mov di,vi
|
|
int $10
|
|
or ah,ah
|
|
jz @f
|
|
mov [es:vi.VESASignature],'VESA'
|
|
mov ax,$4F00
|
|
mov di,vi
|
|
int $10
|
|
or ah,ah
|
|
jnz .exit
|
|
@@:
|
|
cmp [es:vi.VESASignature],'VESA'
|
|
jne .exit
|
|
cmp [es:vi.VESAVersion],$0100
|
|
jb .exit
|
|
jmp vesaok2
|
|
|
|
.exit:
|
|
pushad
|
|
push 0
|
|
pop es
|
|
mov si,s_mode1-0x10000
|
|
call printplain
|
|
; mov si,word[es:vi.VideoModePtr]
|
|
; push word[es:vi.VideoModePtr+2]
|
|
; pop fs
|
|
pushw 'bb'
|
|
jmp enum_modes.modes_ok
|
|
; push 0x1000
|
|
; pop es
|
|
; mov si,novesa-0x10000
|
|
; call print
|
|
; mov ax,16
|
|
; jmp $;novesafound
|
|
|
|
vesaok2:
|
|
mov ecx,0x00200000
|
|
mov ax,[es:vi.TotalMemory]
|
|
shr ax,4
|
|
mov bl,10
|
|
div bl
|
|
mov ch,ah
|
|
and ax,0x00FF
|
|
div bl
|
|
shl ecx,8
|
|
mov cx,ax
|
|
add ecx,'000'
|
|
|
|
mov ax,[es:vi.VESAVersion]
|
|
add ax,'00'
|
|
|
|
push 0x1000
|
|
pop es
|
|
mov [es:s_vesa.ver-0x10000], ah
|
|
mov [es:s_vesa.ver+2-0x10000], al
|
|
mov dword[es:s_vesa.mem-0x10000],ecx
|
|
mov si,s_vesa-0x10000
|
|
call print
|
|
|
|
;// mike.dld, 2005-08-20 [
|
|
mov si,_oem-0x10000
|
|
call print
|
|
|
|
push 0
|
|
pop es
|
|
mov si,word[es:vi.OemStringPtr]
|
|
mov di,si
|
|
push word[es:vi.OemStringPtr+2]
|
|
pop es
|
|
mov al,0x0A
|
|
push es
|
|
call draw_text
|
|
pop es
|
|
|
|
push 0x1000
|
|
pop ds
|
|
mov si,s_ven_intel-0x10000
|
|
call substr
|
|
mov al,1
|
|
je vendor_ok
|
|
mov si,s_ven_s3-0x10000
|
|
call substr
|
|
mov al,2
|
|
je vendor_ok
|
|
mov al,3
|
|
vendor_ok:
|
|
push 0 0x1000
|
|
pop ds es
|
|
mov [es:0x9035],al
|
|
;// mike.dld, 2005-08-20 ]
|
|
|
|
novesafound:
|
|
;!! call setbase1000
|
|
|
|
; ASK GRAPHICS MODE
|
|
|
|
movzx eax,byte [es:preboot_graph-0x10000]
|
|
cmp eax,0
|
|
jne pre_graph
|
|
mov si,gr_mode-0x10000
|
|
call printplain
|
|
enum_modes:
|
|
pushad
|
|
push 0x0000
|
|
pop es
|
|
mov si,s_mode1-0x10000
|
|
call printplain
|
|
mov si,word[es:vi.VideoModePtr]
|
|
push word[es:vi.VideoModePtr+2]
|
|
pop fs
|
|
pushw 1
|
|
|
|
mov bx,modes_table;-0x10000
|
|
.next_mode:
|
|
mov cx,[fs:si] ; mode number
|
|
cmp cx,-1
|
|
je .modes_ok.2
|
|
|
|
mov ax,$4F01
|
|
mov di,mi
|
|
int $10
|
|
|
|
or ah,ah
|
|
jnz .modes_ok.2;vesa_info.exit
|
|
test [es:mi.ModeAttributes],00000001b
|
|
jz @f
|
|
test [es:mi.ModeAttributes],00010000b
|
|
jz @f
|
|
|
|
cmp [es:mi.BitsPerPixel],16
|
|
jne .l0
|
|
cmp [es:mi.GreenMaskSize],5
|
|
jne .l0
|
|
mov [es:mi.BitsPerPixel],15
|
|
.l0:
|
|
|
|
cmp [es:mi.XRes],640
|
|
jb @f
|
|
cmp [es:mi.YRes],480
|
|
jb @f
|
|
cmp [es:mi.BitsPerPixel],15
|
|
jb @f
|
|
|
|
mov ax,[es:mi.XRes]
|
|
mov [es:bx+0],ax
|
|
mov ax,[es:mi.YRes]
|
|
mov [es:bx+2],ax
|
|
mov ax,[es:mi.ModeAttributes]
|
|
mov [es:bx+4],ax
|
|
cmp [s_vesa.ver-0x10000],'2'
|
|
jb .lp1
|
|
or cx,0x4000 ; use LFB
|
|
.lp1: mov [es:bx+6],cx
|
|
mov al,[es:mi.BitsPerPixel]
|
|
mov [es:bx+8],al
|
|
|
|
add bx,10
|
|
|
|
@@:
|
|
add si,2
|
|
jmp .next_mode
|
|
|
|
.modes_ok.2:
|
|
|
|
mov si,modes_table;-0x10000;m_info
|
|
|
|
@@: add si,10
|
|
cmp si,bx
|
|
jae @f
|
|
mov ax,[es:si+0-10]
|
|
cmp ax,[es:si+0]
|
|
ja .xch
|
|
jb @b
|
|
mov ax,[es:si+2-10]
|
|
cmp ax,[es:si+2]
|
|
ja .xch
|
|
jb @b
|
|
mov al,[es:si+8-10]
|
|
cmp al,[es:si+8]
|
|
ja .xch
|
|
jb @b
|
|
pushad
|
|
.del: push dword[es:si+0] dword[es:si+4] word[es:si+8] dword[es:si+0+10] dword[es:si+4+10] word[es:si+8+10]
|
|
pop word[es:si+8] dword[es:si+4] dword[es:si+0] word[es:si+8+10] dword[es:si+4+10] dword[es:si+0+10]
|
|
add si,10
|
|
cmp si,bx
|
|
jb .del
|
|
popad
|
|
mov si,modes_table
|
|
sub bx,10
|
|
jmp @b
|
|
.xch: push dword[es:si+0] dword[es:si+4] word[es:si+8] dword[es:si+0-10] dword[es:si+4-10] word[es:si+8-10]
|
|
pop word[es:si+8] dword[es:si+4] dword[es:si+0] word[es:si+8-10] dword[es:si+4-10] dword[es:si+0-10]
|
|
mov si,modes_table;-0x10000;m_info
|
|
jmp @b
|
|
|
|
@@: ;mov ah,9
|
|
;mov dx,_tl
|
|
;int $21
|
|
mov si,_tl-0x10000
|
|
push bx
|
|
call printplain
|
|
pop bx
|
|
push 0
|
|
pop es
|
|
mov word[es:bx],-1
|
|
mov si,modes_table;-0x10000;m_info
|
|
pushw [es:si+0] [es:si+2] 'c'
|
|
mov bp,sp
|
|
|
|
@@:
|
|
cmp word[es:si-10],-1
|
|
je @f
|
|
; cmp si,bx
|
|
; jae @f
|
|
mov ax,[es:si+0]
|
|
cmp ax,[ss:bp+4]
|
|
jne .wr
|
|
mov ax,[es:si+2]
|
|
cmp ax,[ss:bp+2]
|
|
jne .wr
|
|
|
|
.ww: push bx
|
|
movzx eax,word[es:si+0]
|
|
mov di,_rs-0x10000+2
|
|
mov ecx,10
|
|
mov bl,4
|
|
call int2str
|
|
movzx eax,word[es:si+2]
|
|
inc di
|
|
mov bl,4
|
|
call int2str
|
|
|
|
mov al,[es:si+8]
|
|
mov di,_rs-0x10000+16
|
|
cmp al,4
|
|
je .l1
|
|
add di,5
|
|
cmp al,8
|
|
je .l1
|
|
add di,5
|
|
cmp al,15
|
|
je .l1
|
|
add di,5
|
|
cmp al,16
|
|
je .l1
|
|
add di,5
|
|
cmp al,24
|
|
je .l1
|
|
add di,5
|
|
.l1: mov al,[ss:bp]
|
|
cmp byte[ds:di],'-'
|
|
jne .lp0
|
|
mov [ds:di],al
|
|
inc byte[ss:bp]
|
|
jmp .lp2
|
|
.lp0:
|
|
.lp2:
|
|
pop bx
|
|
add si,10
|
|
jmp @b;.sk
|
|
|
|
.wr: ;mov ah,9
|
|
;mov dx,_rs
|
|
;int $21
|
|
push bx si
|
|
mov si,_rs-0x10000
|
|
call printplain
|
|
pop si bx
|
|
|
|
mov byte[ds:_rs-0x10000+16+5*0],'-'
|
|
mov byte[ds:_rs-0x10000+16+5*1],'-'
|
|
mov byte[ds:_rs-0x10000+16+5*2],'-'
|
|
mov byte[ds:_rs-0x10000+16+5*3],'-'
|
|
mov byte[ds:_rs-0x10000+16+5*4],'-'
|
|
mov byte[ds:_rs-0x10000+16+5*5],'-'
|
|
|
|
pushw [es:si+0] [es:si+2]
|
|
popw [ss:bp+2] [ss:bp+4]
|
|
|
|
.sk:
|
|
jmp .ww;@b
|
|
|
|
@@: ;add sp,6
|
|
|
|
pop bx
|
|
add sp,6
|
|
sub bl,2
|
|
shl bx,8
|
|
push bx
|
|
; mov ah,9
|
|
; mov dx,_bt
|
|
; int $21
|
|
mov si,_bt-0x10000
|
|
call printplain
|
|
|
|
.modes_ok:
|
|
pop bx
|
|
mov bp,sp
|
|
mov [ss:bp+4*4],bx
|
|
popad
|
|
|
|
gml0:
|
|
mov bl,'a'
|
|
call getkey ; !! getchar
|
|
pre_graph:
|
|
or al,al
|
|
jz gml00
|
|
cmp al,1
|
|
je sgml1
|
|
;shl ax,4
|
|
sub ax,2
|
|
mov si,10
|
|
mul si
|
|
add ax,modes_table;-0x10000
|
|
mov si,ax
|
|
mov bx,[es:si+6]
|
|
mov cx,[es:si+0]
|
|
mov dx,[es:si+2]
|
|
jmp gml10
|
|
sgml1:
|
|
; cmp al,9
|
|
; jnz gml00
|
|
mov bx,0x13
|
|
mov cx,640
|
|
mov dx,480
|
|
push 0x0
|
|
pop es
|
|
mov [es:0x9000],byte 32
|
|
; push 0x1000
|
|
; pop es
|
|
jmp gml10
|
|
gml00:
|
|
; cmp al,0xa
|
|
; jnz gml02
|
|
mov bx,0x12
|
|
mov cx,640
|
|
mov dx,480
|
|
push 0x0
|
|
pop es
|
|
mov [es:0x9000],byte 4;32
|
|
|
|
gml10:
|
|
push 0x0000
|
|
pop es
|
|
mov [es:0x9008],bx
|
|
mov [es:0x900A],cx
|
|
mov [es:0x900C],dx
|
|
mov al,[s_vesa.ver-0x10000]
|
|
mov [es:0x9034],al
|
|
push 0x1000
|
|
pop es
|
|
mov [s_bpp.bpp-0x10000],'8 '
|
|
cmp bx,0x13
|
|
je .bppl;nov
|
|
mov [s_bpp.bpp-0x10000],'4 '
|
|
cmp bx,0x12
|
|
je .bppl;nov
|
|
|
|
; bx - mode : cx - x size : dx - y size
|
|
|
|
; FIND VESA 2.0 LFB & BPP
|
|
|
|
mov ax,0x4f01
|
|
mov cx,bx
|
|
and cx,0xfff
|
|
push 0x0000
|
|
pop es
|
|
mov di,mi;0xa000
|
|
int 0x10
|
|
; LFB
|
|
mov eax,[es:mi.PhysBasePtr];di+0x28]
|
|
mov [es:0x9018],eax
|
|
; BPP
|
|
cmp [es:mi.BitsPerPixel],16
|
|
jne .l0
|
|
cmp [es:mi.GreenMaskSize],5
|
|
jne .l0
|
|
mov [es:mi.BitsPerPixel],15
|
|
.l0: mov al,[es:mi.BitsPerPixel];di+0x19]
|
|
mov [es:0x9000],al
|
|
; ---- vbe voodoo
|
|
;BytesPerScanLine equ 0x10
|
|
push ax
|
|
mov ax, [es:mi.BytesPerScanLine];di+BytesPerScanLine]
|
|
mov [es:0x9001],ax
|
|
pop ax
|
|
; -----
|
|
.nov:
|
|
cmp al,15
|
|
jnz .nbpp15
|
|
mov [s_bpp.bpp-0x10000],'15'
|
|
jmp .bppl
|
|
.nbpp15:
|
|
cmp al,16
|
|
jnz .nbpp16
|
|
mov [s_bpp.bpp-0x10000],'16'
|
|
jmp .bppl
|
|
.nbpp16:
|
|
cmp al,24
|
|
jnz .nbpp24
|
|
mov [s_bpp.bpp-0x10000],'24'
|
|
jmp .bppl
|
|
.nbpp24:
|
|
cmp al,32
|
|
jnz .nbpp32
|
|
mov [s_bpp.bpp-0x10000],'32'
|
|
jmp .bppl
|
|
.nbpp32:
|
|
mov [s_bpp.bpp-0x10000],'??'
|
|
call print
|
|
jmp $
|
|
.bppl:
|
|
mov si,s_bpp-0x10000
|
|
call printplain
|
|
|
|
|
|
; FIND VESA 1.2 PM BANK SWITCH ADDRESS
|
|
|
|
cmp [s_vesa.ver-0x10000],'2'
|
|
jb @f
|
|
|
|
mov ax,0x4f0A
|
|
mov bx,0x0
|
|
int 0x10
|
|
xor eax,eax
|
|
xor ebx,ebx
|
|
mov ax,es
|
|
shl eax,4
|
|
mov bx,di
|
|
add eax,ebx
|
|
movzx ebx,word[es:di]
|
|
add eax,ebx
|
|
push 0x0000
|
|
pop es
|
|
mov [es:0x9014],eax
|
|
jmp .lp1
|
|
@@:
|
|
|
|
mov dword[es:0x9018],0x000A0000
|
|
.lp1:
|
|
push 0x1000
|
|
pop es
|
|
}
|