Import backup from 2003-08-17

This commit is contained in:
Josh Holtrop 2003-08-17 22:00:00 -04:00
parent 149541fbf1
commit 43f3ea24f8
2 changed files with 278 additions and 25 deletions

View File

@ -15,7 +15,8 @@
%define BOOT_VESA 0x0002 ;2 - 0 for console, otherwise VESA mode %define BOOT_VESA 0x0002 ;2 - 0 for console, otherwise VESA mode
%define BOOT_VESA_OEM 0x0004 ;258 - null-terminated OEM identification string %define BOOT_VESA_OEM 0x0004 ;258 - null-terminated OEM identification string
%define BOOT_VESA_VBE 0x0106 ;512 - copy of VESA VBEInfoBlock %define BOOT_VESA_VBE 0x0106 ;512 - copy of VESA VBEInfoBlock
;%define BOOT_ 0x0306 %define BOOT_VESA_INFO 0x0306 ;256 - copy of VESA ModeInfoBlock for selected mode
%define BOOT_VESA_LFB 0x0406 ;1 - boolean: are we using LFB or not

View File

@ -290,7 +290,7 @@ vesa_copyvbe:
mov si, dx mov si, dx
shr edx, 16 shr edx, 16
mov ds, dx ;ds:si points to video mode list mov ds, dx ;ds:si points to video mode list
mov ax, GOOD_MODELIST_SEG mov ax, VESA_MODELIST_SEG
mov es, ax mov es, ax
xor di, di xor di, di
vesa_copymodes: vesa_copymodes:
@ -311,21 +311,181 @@ clear_good_mode_list_loop:
mov ax, VESA_MODELIST_SEG mov ax, VESA_MODELIST_SEG
mov ds, ax mov ds, ax
xor si, si ;ds:si points to video mode list where we can edit it :) xor si, si ;ds:si points to video mode list where we can edit it :)
mov ax, GOOD_MODELIST_SEG
mov es, ax
xor di, di
xor dx, dx ;dx=what good mode # we are on xor dx, dx ;dx=what good mode # we are on
vesa_readmodeinfo_loop: vesa_readmodeinfo_loop:
lodsw
cmp ax, 0xffff
jz vesa_endofmodes
push ax ;save mode#
call checkmode
cmp ax, 0
jz vesa_readmodeinfo_good
pop ax
jmp vesa_readmodeinfo_loop
vesa_readmodeinfo_good:
pop ax ;restore mode#
stosw
call vesa_showmodeinfo
inc dx
jmp vesa_readmodeinfo_loop
vesa_endofmodes: ;here we have a list of good modes at GOOD_MODELIST_SEG:0
xor ax, ax
mov ds, ax
mov si, txt_consolemode
mov ax, 0xb800
mov es, ax
mov di, 160*2
mov ah, 7
call puts
mov di, 160*3
mov cx, dx
mov al, 'b'
vesa_displaylabels:
stosb
push ax
mov al, 7
stosb
mov al, '.'
stosb
mov al, 7
stosb
pop ax
inc al
add di, 160-4
loop vesa_displaylabels ;done drawing screen of VESA choices, now ask for one
;valid options are 'a' through (al-1)
mov bl, al
xor ax, ax
mov ds, ax
mov di, 160*24
mov si, txt_input
mov ah, 14
call puts
vesa_getchoice:
xor ax, ax
int 0x16
cmp al, 'a'
jl vesa_getchoice
cmp al, bl
jge vesa_getchoice
stosb
push ax
mov al, 14
stosb
pop ax
xor ah, ah
sub ax, 'a'
cmp ax, 0
jz vesa_consolemode_only
mov cx, ax ;cx holds good mode# (1=first good vesa mode)
dec cx
mov ax, GOOD_MODELIST_SEG
mov ds, ax
shl cx, 1
mov si, cx ;ds:si points to word containing selected mode#
lodsw
mov cx, ax
mov ax, VESA_MODEINFO_SEG mov ax, VESA_MODEINFO_SEG
mov es, ax mov es, ax
xor di, di xor di, di
lodsw
cmp ax, 0xffff
jnz vesa_notendofmodes
jmp vesa_endofmodes
vesa_notendofmodes:
mov cx, ax
mov ax, 0x4F01 mov ax, 0x4F01
int 0x10 int 0x10
call checkvesa call checkvesa
xor di, di ;es:di -> ModeInfoBlock struc, ds:si -> video mode list
mov dx, 20
call vesa_showmodeinfo
vesa_consolemode_only:
jmp vesa_done
;------------------------------------------------------
vesa_showmodeinfo:
pusha
push es
push ds
mov ax, VESA_MODEINFO_SEG
mov ds, ax
xor si, si
mov ax, 0xb800
mov es, ax
mov cx, dx
mov ax, 160
mul dx ;ax=160*mod#
add ax, 160*3+6 ;offset first line of modes and room on left for label
mov di, ax
mov ax, [ds:18]
call console_putDec
add di, 10
mov al, 'x'
call console_putChar
inc di
inc di
mov ax, [ds:20]
call console_putDec
add di, 10
mov al, 'x'
call console_putChar
inc di
inc di
xor ah, ah
mov al, [ds:25]
call console_putDec
add di, 8
mov al, [ds:0]
test al, 0x80
jz vesa_showmodeinfo_done
mov al, 'L'
call console_putChar
mov al, 'F'
call console_putChar
mov al, 'B'
call console_putChar
inc di
inc di
mov ebx, [ds:40]
mov eax, ebx
shr eax, 24
call puthex2
mov eax, ebx
shr eax, 16
call puthex2
mov al, bh
call puthex2
mov al, bl
call puthex2
vesa_showmodeinfo_done:
pop ds
pop es
popa
ret
;------------------------------------------------------
checkmode:
push bx
push cx
push dx
push es
push ds
push di
push si
mov cx, ax ;cx=modenumber
mov ax, VESA_MODEINFO_SEG
mov es, ax
xor di, di
mov ax, 0x4F01
int 0x10
call checkvesa
xor di, di ;es:di -> ModeInfoBlock struc
mov ax, [es:di] ;ModeAttributes mov ax, [es:di] ;ModeAttributes
test al, 1 ;mode supported test al, 1 ;mode supported
jz vesa_modenogood jz vesa_modenogood
@ -333,6 +493,14 @@ vesa_notendofmodes:
jz vesa_modenogood jz vesa_modenogood
test al, 0x10 ;graphics mode test al, 0x10 ;graphics mode
jz vesa_modenogood jz vesa_modenogood
mov al, [es:di+25] ;BitsPerPixel
cmp al, 16
jz vesa_bppok
cmp al, 24
jz vesa_bppok
cmp al, 32
jnz vesa_modenogood
vesa_bppok:
mov ax, [es:di+18] ;XResolution mov ax, [es:di+18] ;XResolution
mov bx, [es:di+20] ;YResolution mov bx, [es:di+20] ;YResolution
cmp ax, 640 ;640x480 cmp ax, 640 ;640x480
@ -366,24 +534,25 @@ res_goon4:
cmp bx, 1200 cmp bx, 1200
jnz vesa_modenogood jnz vesa_modenogood
vesa_modegood: vesa_modegood:
mov ax, 0xb800 pop si
mov es, ax pop di
mov ax, 160 pop ds
push dx pop es
mul dx ;ax=160*#ofgoodmode
pop dx pop dx
add ax, 160*2 pop cx
pop bx
xor ax, ax
ret
jmp vesa_readmodeinfo_loop
vesa_modenogood: vesa_modenogood:
mov word [ds:si], 0 pop si
jmp vesa_readmodeinfo_loop pop di
pop ds
vesa_endofmodes: pop es
pop dx
pop cx
pop bx
mov ax, 0xffff
ret
;------------------------------------------------------ ;------------------------------------------------------
vesa_done: vesa_done:
@ -393,6 +562,7 @@ vesa_done:
jmp go_pm jmp go_pm
;------------------------------------------------------
puts: puts:
lodsb lodsb
or al, al or al, al
@ -404,6 +574,7 @@ puts:
puts_done: puts_done:
ret ret
;------------------------------------------------------
checkvesa: checkvesa:
cmp ax, 0x004F cmp ax, 0x004F
jnz vesaerror jnz vesaerror
@ -420,6 +591,85 @@ vesaerror:
cli cli
hlt hlt
;-------Function console_putDec
;input:
; AX = number to display
;output:
; number written in decimal to es:di
console_putDec:
pusha
xor dx, dx
xor bh, bh ;no characters written yet
mov cx, 10000
div cx ;ax=quotiont, dx=remainder
add ax, '0'
cmp ax, '0'
je .goon1
call console_putChar
mov bh, 1
.goon1:
mov ax, dx ;load remainder to ax
xor dx, dx
mov cx, 1000
div cx ;ax=quotiont, dx=remainder
add ax, '0'
cmp ax, '0'
je .goon11
call console_putChar
mov bh, 1
jmp .goon2
.goon11:
cmp bh, 0
je .goon2
call console_putChar
.goon2:
mov ax, dx ;load remainder to ax
xor dx, dx
mov cx, 100
div cx ;ax=quotiont, dx=remainder
add ax, '0'
cmp ax, '0'
je .goon21
call console_putChar
mov bh, 1
jmp .goon3
.goon21:
cmp bh, 0
je .goon3
call console_putChar
.goon3:
mov ax, dx ;load remainder to ax
xor dx, dx
mov cx, 10
div cx ;ax=quotiont, dx=remainder
add ax, '0'
cmp ax, '0'
je .goon31
call console_putChar
mov bh, 1
jmp .goon4
.goon31:
cmp bh, 0
je .goon4
call console_putChar
.goon4: ;here dx contains last remainder
mov ax, dx
add ax, '0'
call console_putChar
popa
ret
;------------------------------------------------------
console_putChar:
stosb
mov al, 7
stosb
ret
;------------------------------------------------------ ;------------------------------------------------------
puthex: puthex:
;es:di points to video memory ;es:di points to video memory
@ -494,6 +744,7 @@ txt_vesa: db "VESA version: ", 0
txt_vesaerror: db "VESA function call error! Halting system!", 0 txt_vesaerror: db "VESA function call error! Halting system!", 0
txt_novesa: db "VESA not found. Starting in console mode...", 0 txt_novesa: db "VESA not found. Starting in console mode...", 0
txt_vesaold: db "VESA version 2.0 required. Starting in console mode...", 0 txt_vesaold: db "VESA version 2.0 required. Starting in console mode...", 0
txt_consolemode: db "a. Console mode only.", 0
;------------------------------------------------------ ;------------------------------------------------------
getCHSfromCluster: getCHSfromCluster:
@ -542,6 +793,7 @@ KERNEL_DATA equ $-gdt
gdt_end: gdt_end:
;------------------------------------------------------
go_pm: go_pm:
xor ax, ax xor ax, ax
mov ds, ax mov ds, ax