Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 847 → Rev 848

/kernel/branches/kolibri_pe/blkdev/rd.inc
891,6 → 891,7
;
;--------------------------------------------------------------
fs_RamdiskRead:
 
cmp byte [esi], 0
jnz @f
or ebx, -1
/kernel/branches/kolibri_pe/boot/bootcode.inc
20,6 → 20,7
;
;==========================================================================
 
use16
 
putchar:
; in: al=character
124,6 → 125,11
mov dl,0 ; dl=0 (drive 0 (a:))
pop bx
retn
 
sayerr:
call print
jmp $
 
; needed variables
BPB_SecPerTrk dw 0 ; sectors per track
BPB_NumHeads dw 0 ; number of heads
147,35 → 153,23
include 'bootvesa.inc' ;Include source for boot vesa
 
start_of_code:
 
cld
; \begin{diamond}[02.12.2005]
; if bootloader sets ax = 'KL', then ds:si points to loader block
cmp ax, 'KL'
jnz @f
mov word [cs:cfgmanager.loader_block], si
mov word [cs:cfgmanager.loader_block+2], ds
@@:
; \end{diamond}[02.12.2005]
 
; if bootloader sets cx = 'HA' and dx = 'RD', then bx contains identifier of source hard disk
; (see comment to bx_from_load)
cmp cx, 'HA'
jnz no_hd_load
cmp dx,'RD'
jnz no_hd_load
mov word [cs:bx_from_load], bx ; {SPraid}[13.03.2007]
no_hd_load:
xor ecx, ecx
xor edx, edx
xor esi, esi
xor edi, edi
xor ebp, ebp
 
; set up stack
mov ax, 3000h
mov eax, 0x3000
mov ss, ax
mov sp, 0EC00h
; set up segment registers
push cs
pop ds
push cs
pop es
mov esp, 0EC00h
 
mov ebx, 0x1000
mov ds, bx
mov es, bx
 
; set videomode
mov ax, 3
int 0x10
218,6 → 212,7
lodsb
stosw
loop @b
 
; draw spaces
mov si, space_msg
mov dx, 25 - d80x25_top_num - d80x25_bottom_num
243,66 → 238,10
 
_setcursor d80x25_top_num,0
 
 
; TEST FOR 386+
 
mov bx, 0x4000
pushf
pop ax
mov dx, ax
xor ax, bx
push ax
popf
pushf
pop ax
and ax, bx
and dx, bx
cmp ax, dx
 
mov si, not386
jz sayerr
 
xor eax, eax
cpuid
cmp eax, 0
mov si, sz_nopse
jbe sayerr
 
mov eax, 1
cpuid
bt edx, 3
mov si, sz_nopse
jnc sayerr
 
xor ebx, ebx
mov es, bx
 
mov edi, 0x9104
mov ecx, 20
mov edx, 0x534D4150
 
mov [es:0x9100], ebx
mov eax, 0xe820
int 0x15
mov si, sz_nosmap
jc sayerr
 
cmp eax, 0x534D4150
je cpugood
sayerr:
call print
jmp $
 
 
cpugood:
 
push 0
popf
sti
 
; set up esp
movzx esp, sp
 
push 0
pop es
and word [es:0x9031], 0
409,13 → 348,6
apm_end:
_setcursor d80x25_top_num, 0
 
;CHECK current of code
cmp [cfgmanager.loader_block], -1
jz noloaderblock
les bx, [cfgmanager.loader_block]
cmp byte [es:bx], 1
mov si, loader_block_error
jnz sayerr
push 0
pop es
 
425,7 → 357,6
call calc_vmodes_table
call check_first_parm ;check and enable cursor_pos
 
 
; \begin{diamond}[30.11.2005]
cfgmanager:
; settings:
829,368 → 760,6
mov al, [preboot_dma]
mov [es:0x901F], al
 
; VRR_M USE
 
mov al,[preboot_vrrm]
mov [es:0x9030], al
mov [es:0x901E], byte 1
 
; BOOT DEVICE
 
mov al, [preboot_device]
dec al
mov [boot_dev], al
 
; READ DISKETTE TO MEMORY
 
; cmp [boot_dev],0
jne no_sys_on_floppy
mov si,diskload
call print
xor ax, ax ; reset drive
xor dx, dx
int 0x13
; do we boot from CD-ROM?
mov ah, 41h
mov bx, 55AAh
xor dx, dx
int 0x13
jc .nocd
cmp bx, 0AA55h
jnz .nocd
mov ah, 48h
push ds
push es
pop ds
mov si, 0xa000
mov word [si], 30
int 0x13
pop ds
jc .nocd
push ds
lds si, [es:si+26]
test byte [ds:si+10], 40h
pop ds
jz .nocd
; yes - read all floppy by 18 sectors
 
; TODO: !!!! read only first sector and set variables !!!!!
; ...
; TODO: !!! then read flippy image track by track
 
mov cx, 0x0001 ; startcyl,startsector
.a1:
push cx dx
mov al, 18
mov bx, 0xa000
call boot_read_floppy
mov si, movedesc
push es
push ds
pop es
mov cx, 256*18
mov ah, 0x87
int 0x15
pop es
pop dx cx
test ah, ah
jnz sayerr_floppy
add dword [si+8*3+2], 512*18
inc dh
cmp dh, 2
jnz .a1
mov dh, 0
inc ch
cmp ch, 80
jae ok_sys_on_floppy
pusha
mov al, ch
shr ch, 2
add al, ch
aam
xchg al, ah
add ax, '00'
mov si, pros
mov [si], ax
call printplain
popa
jmp .a1
.nocd:
; no - read only used sectors from floppy
; now load floppy image to memory
; at first load boot sector and first FAT table
 
; read only first sector and fill variables
mov cx, 0x0001 ; first logical sector
xor dx, dx ; head = 0, drive = 0 (a:)
mov al, 1 ; read one sector
mov bx, 0xB000 ; es:bx -> data area
call boot_read_floppy
; fill the necessary parameters to work with a floppy
mov ax, word [es:bx+24]
mov word [BPB_SecPerTrk], ax
mov ax, word [es:bx+26]
mov word [BPB_NumHeads], ax
mov ax, word [es:bx+22]
mov word [BPB_FATSz16], ax
mov ax, word [es:bx+17]
mov word [BPB_RootEntCnt], ax
mov ax, word [es:bx+11]
mov word [BPB_BytsPerSec], ax
mov ax, word [es:bx+14]
mov word [BPB_RsvdSecCnt], ax
mov ax, word [es:bx+19]
mov word [BPB_TotSec16], ax
mov al, byte [es:bx+13]
mov byte [BPB_SecPerClus], al
mov al, byte [es:bx+16]
mov byte [BPB_NumFATs], al
; count of clusters in FAT12 ((size_of_FAT*2)/3)
mov ax, word [BPB_FATSz16]
mov cx, word [BPB_BytsPerSec]
xor dx, dx
mul cx
shl ax, 1
mov cx, 3
div cx ; now ax - number of clusters in FAT12
mov word [end_of_FAT], ax
 
; load first FAT table
mov cx, 0x0002 ; startcyl,startsector ; TODO!!!!!
xor dx, dx ; starthead,drive
mov al, byte [BPB_FATSz16] ; no of sectors to read
add bx, word [BPB_BytsPerSec] ; es:bx -> data area
call boot_read_floppy
mov bx, 0xB000
 
; and copy them to extended memory
mov si, movedesc
mov [si+8*2+3], bh ; from
 
mov ax, word [BPB_BytsPerSec]
shr ax, 1 ; words per sector
mov cx, word [BPB_RsvdSecCnt]
add cx, word [BPB_FATSz16]
mul cx
push ax ; save to stack count of words in boot+FAT
xchg ax, cx
 
push es
push ds
pop es
mov ah, 0x87
int 0x15
pop es
test ah, ah
jz @f
sayerr_floppy:
mov dx, 0x3f2
mov al, 0
out dx, al
mov si, memmovefailed
jmp sayerr_plain
@@:
pop ax ; restore from stack count of words in boot+FAT
shl ax, 1 ; make bytes count from count of words
and eax, 0ffffh
add dword [si+8*3+2], eax
 
; copy first FAT to second copy
; TODO: BPB_NumFATs !!!!!
add bx, word [BPB_BytsPerSec] ; !!! TODO: may be need multiply by BPB_RsvdSecCnt !!!
mov byte [si+8*2+3], bh ; bx - begin of FAT
 
mov ax, word [BPB_BytsPerSec]
shr ax, 1 ; words per sector
mov cx, word [BPB_FATSz16]
mul cx
mov cx, ax ; cx - count of words in FAT
 
push es
push ds
pop es
mov ah, 0x87
int 0x15
pop es
test ah, ah
jnz sayerr_floppy
 
mov ax, cx
shl ax, 1
and eax, 0ffffh ; ax - count of bytes in FAT
add dword [si+8*3+2], eax
 
; reading RootDir
; TODO: BPB_NumFATs
add bx, ax
add bx, 100h
and bx, 0ff00h ; bx - place in buffer to write RootDir
push bx
 
mov bx, word [BPB_BytsPerSec]
shr bx, 5 ; divide bx by 32
mov ax, word [BPB_RootEntCnt]
xor dx, dx
div bx
push ax ; ax - count of RootDir sectors
 
mov ax, word [BPB_FATSz16]
xor cx, cx
mov cl, byte [BPB_NumFATs]
mul cx
add ax, word [BPB_RsvdSecCnt] ; ax - first sector of RootDir
 
mov word [FirstDataSector], ax
pop bx
push bx
add word [FirstDataSector], bx ; Begin of data region of floppy
 
; read RootDir
call conv_abs_to_THS
pop ax
pop bx ; place in buffer to write
push ax
call boot_read_floppy ; read RootDir into buffer
; copy RootDir
mov byte [si+8*2+3], bh ; from buffer
pop ax ; ax = count of RootDir sectors
mov cx, word [BPB_BytsPerSec]
mul cx
shr ax, 1
mov cx, ax ; count of words to copy
push es
push ds
pop es
mov ah, 0x87
int 0x15
pop es
 
mov ax, cx
shl ax, 1
and eax, 0ffffh ; ax - count of bytes in RootDir
add dword [si+8*3+2], eax ; add count of bytes copied
 
; Reading data clusters from floppy
mov byte [si+8*2+3], bh
push bx
 
mov di, 2 ; First data cluster
.read_loop:
mov bx, di
shr bx, 1 ; bx+di = di*1.5
jnc .even
test word [es:bx+di+0xB200], 0xFFF0 ; TODO: may not be 0xB200 !!!
jmp @f
.even:
test word [es:bx+di+0xB200], 0xFFF ; TODO: may not be 0xB200 !!!
 
@@:
jz .skip
; read cluster di
;.read:
;conv cluster di to abs. sector ax
; ax = (N-2) * BPB_SecPerClus + FirstDataSector
mov ax, di
sub ax, 2
xor bx, bx
mov bl, byte [BPB_SecPerClus]
mul bx
add ax, word [FirstDataSector]
call conv_abs_to_THS
pop bx
push bx
mov al, byte [BPB_SecPerClus] ; number of sectors in cluster
call boot_read_floppy
push es
push ds
pop es
pusha
;
mov ax, word [BPB_BytsPerSec]
xor cx, cx
mov cl, byte [BPB_SecPerClus]
mul cx
shr ax, 1 ; ax = (BPB_BytsPerSec * BPB_SecPerClus)/2
mov cx, ax ; number of words to copy (count words in cluster)
;
mov ah, 0x87
int 0x15 ; copy data
test ah, ah
popa
pop es
jnz sayerr_floppy
; skip cluster di
.skip:
mov ax, word [BPB_BytsPerSec]
xor cx, cx
mov cl, byte [BPB_SecPerClus]
mul cx
and eax, 0ffffh ; ax - count of bytes in cluster
add dword [si+8*3+2], eax
 
mov ax, word [end_of_FAT] ; max cluster number
pusha
; draw percentage
; total clusters: ax
; read clusters: di
xchg ax, di
mov cx, 100
mul cx
div di
aam
xchg al, ah
add ax, '00'
mov si, pros
cmp [si], ax
jz @f
mov [si], ax
call printplain
@@:
popa
inc di
cmp di, word [end_of_FAT] ; max number of cluster
jnz .read_loop
pop bx ; clear stack
 
ok_sys_on_floppy:
mov si, backspace2
call printplain
mov si, okt
call printplain
no_sys_on_floppy:
xor ax, ax ; reset drive
xor dx, dx
int 0x13
mov dx, 0x3f2 ; floppy motor off
mov al, 0
out dx, al
 
 
; GET SMAP
 
xor ebx, ebx
mov es, bx
 
mov edi, 0x9104
mov ecx, 20
mov edx, 0x534D4150
@@:
mov [es:0x9100], ebx
mov eax, 0xe820
int 0x15
 
jc .nosmap
cmp eax, 0x534D4150
jne .nosmap
 
test ebx, ebx
jz .nosmap
 
add edi, ecx
jmp @B
 
.nosmap:
 
; SET GRAPHICS
 
xor ax, ax
1234,3 → 803,4
gmok2:
push ds
pop es
 
/kernel/branches/kolibri_pe/boot/bootru.inc
13,10 → 13,6
 
$Revision$
 
sz_nosmap db 'No BIOS memory table. System halted.', 0
 
sz_nopse db 'Page size extensions not supported. System halted.', 0
 
d80x25_bottom:
db 186,' Kolibri OS ®á­®¢ ­  ­  Menuet OS ¨ ­¥ ¯à¥¤®áâ ¢«ï¥â '
db '­¨ª ª¨å £ àa­â¨©. ',186
/kernel/branches/kolibri_pe/boot/preboot.inc
31,8 → 31,8
preboot_blogesc = 0 ; start immediately after bootlog
preboot_biosdisk db 2 ; use V86 to access disks through BIOS (1-yes, 2-no)
 
if $>0x200
ERROR: prebooting parameters must fit in first sector!!!
end if
; if $>0x200
;ERROR: prebooting parameters must fit in first sector!!!
; end if
hdsysimage db 'KOLIBRI IMG' ; load from
image_save db 'KOLIBRI IMG' ; save to
/kernel/branches/kolibri_pe/const.inc
198,6 → 198,7
kernel_tabs equ (page_tabs+ (OS_BASE shr 10)) ;0xFDE00000
master_tab equ (page_tabs+ (page_tabs shr 10)) ;0xFDFF70000
 
LOAD_BASE equ 0x00100000
OS_BASE equ 0xE0000000
 
window_data equ OS_BASE
283,7 → 284,7
FONT_II equ (OS_BASE+0x006DC00)
FONT_I equ (OS_BASE+0x006E600)
 
sys_pgdir equ (OS_BASE+0x006F000)
;sys_pgdir equ (OS_BASE+0x006F000)
 
DRIVE_DATA equ (OS_BASE+0x0070000)
 
/kernel/branches/kolibri_pe/core/memory.inc
245,15 → 245,15
 
mov eax, [LFBAddress]
or eax, PG_LARGE+PG_UW
mov [sys_pgdir+(LFB_BASE shr 20)], eax
mov [_sys_pdbr+(LFB_BASE shr 20)], eax
add eax, 0x00400000
mov [sys_pgdir+4+(LFB_BASE shr 20)], eax
mov [_sys_pdbr+4+(LFB_BASE shr 20)], eax
 
mov dword [exp_lfb+4], LFB_BASE
 
bt [cpu_caps], CAPS_PGE
jnc @F
or dword [sys_pgdir+(LFB_BASE shr 20)], PG_GLOBAL
or dword [_sys_pdbr+(LFB_BASE shr 20)], PG_GLOBAL
@@:
mov dword [LFBAddress], LFB_BASE
mov eax, cr3 ;flush TLB
462,7 → 462,7
 
.lfb:
shr ebx, 22
mov edx, [sys_pgdir + ebx*4]
mov edx, [_sys_pdbr + ebx*4]
mov [master_tab + ebx*4], edx
jmp .exit
 
483,7 → 483,7
jz .check_ptab ;òàáëèöà ñòðàíèö íå ñîçäàíà
 
.check_ptab:
mov edx, [sys_pgdir + ebx*4]
mov edx, [_sys_pdbr + ebx*4]
test edx, PG_MAP
jnz @F
 
498,7 → 498,7
cld
rep stosd
 
mov [sys_pgdir + ebx*4], edx
mov [_sys_pdbr + ebx*4], edx
@@:
mov [master_tab + ebx*4], edx
jmp .exit
/kernel/branches/kolibri_pe/core/taskman.inc
395,7 → 395,7
rep stosd
 
mov ecx, 1024-(OS_BASE shr 20)/4
mov esi, sys_pgdir+(OS_BASE shr 20)
mov esi, _sys_pdbr+(OS_BASE shr 20)
rep movsd
 
mov edi, [dir_addr]
/kernel/branches/kolibri_pe/core/v86.inc
78,7 → 78,7
; thx to Serge, system is located at high addresses
add edi, (OS_BASE shr 20) - 4
push esi
mov esi, (OS_BASE shr 20) + sys_pgdir
mov esi, (OS_BASE shr 20) + _sys_pdbr
mov ecx, 0x80000000 shr 22
rep movsd
 
/kernel/branches/kolibri_pe/data16.inc
29,18 → 29,7
 
; table for move to extended memory (int 15h, ah=87h)
align 8
movedesc:
db 0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
db 0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
 
db 0xff,0xff,0x0,0xa0,0x00,0x93,0x0,0x0
db 0xff,0xff,0x0,0x00,0x10,0x93,0x0,0x0
 
db 0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
db 0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
db 0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
db 0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
 
fwmovedesc:
db 0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
db 0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
/kernel/branches/kolibri_pe/data32.inc
99,8 → 99,8
read_firstapp db '/sys/'
firstapp db 'LAUNCHER',0
 
char db '/sys/FONTS/CHAR.MT',0
char2 db '/sys/FONTS/CHAR2.MT',0
char db '/rd/1/FONTS/CHAR.MT',0
char2 db '/rd/1/FONTS/CHAR2.MT',0
 
bootpath db '/KOLIBRI '
bootpath2 db 0
135,9 → 135,9
dw 320,240,8,60
 
 
bx_from_load: dw 'r1' ; ñòðóêòóðà äëÿ õðàíåíèÿ ïàðàìåòðîâ- îòêóäà ãàøðóçèëèñü, áåðåòñÿ íèæå èç bx ; {SPraid}[13.03.2007]
; a,b,c,d - âèí÷åñòåðû, r - ðàì äèñê
; # äèñêà... ñèìâîë, à íå áàéò. '1', à íå 1
;bx_from_load: dw 'r1' ; ñòðóêòóðà äëÿ õðàíåíèÿ ïàðàìåòðîâ- îòêóäà ãàøðóçèëèñü, áåðåòñÿ íèæå èç bx ; {SPraid}[13.03.2007]
; ; a,b,c,d - âèí÷åñòåðû, r - ðàì äèñê
; ; # äèñêà... ñèìâîë, à íå áàéò. '1', à íå 1
 
 
 
259,16 → 259,21
db (tss shr 16) and 0xFF
db 10001001b
dw (tss shr 16) and 0xFF00
 
code_16:
dw 0xFFFF
dw 0
db 1
db cpl0
dw 0
 
endofcode:
gdte:
 
align 16
 
__edata: ;equ $-OS_BASE
 
align 4096
 
_sys_pdbr rb 4096
_sys_pdbr rd 1024
 
rb 8192-512
 
/kernel/branches/kolibri_pe/detect/dev_hdcd.inc
218,7 → 218,10
test AL,08h
jnz @@WaitHDReady
; Çàãðóçèòü êîìàíäó â ðåãèñòðû êîíòðîëëåðà
 
pushfd
cli
 
mov DX,[ATABasePortAddr]
inc DX ;ðåãèñòð "îñîáåííîñòåé"
mov AL,[ATAFeatures]
250,7 → 253,9
mov AL,[ATACommand]
inc DX ;ðåãèñòð êîìàíä
out DX,AL
sti
 
popfd
 
; Ñáðîñèòü ïðèçíàê îøèáêè
mov [DevErrorCode],0
jmp @@End_2
/kernel/branches/kolibri_pe/detect/disks.inc
11,5 → 11,7
include 'dev_fd.inc'
include 'dev_hdcd.inc'
include 'getcache.inc'
 
; jmp __12345
include 'sear_par.inc'
 
;__12345:
/kernel/branches/kolibri_pe/detect/sear_par.inc
23,6 → 23,7
mov [fat32part],1
search_partitions_ide0_1:
call set_FAT32_variables
 
cmp [problem_partition],0
jne search_partitions_ide1
inc byte [DRIVE_DATA+2]
/kernel/branches/kolibri_pe/fs/fat32.inc
106,11 → 106,14
 
reserve_hd1:
 
pushfd
cli
cmp [hd1_status],0
 
cmp [hd1_status],0 ;FIXME use mutex
je reserve_ok1
 
sti
popfd
 
call change_task
jmp reserve_hd1
 
122,7 → 125,7
mov eax,[eax+CURRENT_TASK+TASKDATA.pid]
mov [hd1_status],eax
pop eax
sti
popfd
ret
;********************************************
 
138,26 → 141,30
cmp [hdbase], 0x1F0
jne .IDE_Channel_2
.IDE_Channel_1:
pushfd
cli
cmp [IDE_Channel_1],0
je .reserve_ok_1
sti
popfd
call change_task
jmp .IDE_Channel_1
.IDE_Channel_2:
pushfd
cli
cmp [IDE_Channel_2],0
je .reserve_ok_2
sti
popfd
call change_task
jmp .IDE_Channel_2
.reserve_ok_1:
mov [IDE_Channel_1], 1
popfd
push eax
mov al, 1
jmp @f
.reserve_ok_2:
mov [IDE_Channel_2], 1
popfd
push eax
mov al, 3
@@:
/kernel/branches/kolibri_pe/fs/parse_fn.inc
40,7 → 40,7
locals
buff db 4 dup(?) ; for test cd
endl
mov eax,[bx_from_load]
mov eax,[bx_from_load+OS_BASE+LOAD_BASE]
mov ecx,sysdir_path
mov [ecx-64],dword 'sys'
cmp al,'r' ; if ram disk
/kernel/branches/kolibri_pe/kernel.asm
118,7 → 118,6
dd LAST_PAGE
dd __start
 
 
align 16
__start:
cld
165,7 → 164,7
 
mov dword [_sys_pdbr-OS_BASE], PG_LARGE+PG_SW
mov dword [_sys_pdbr-OS_BASE+4], PG_LARGE+PG_SW+4*1024*1024
mov dword [_sys_pdbr-OS_BASE+(page_tabs shr 20)], sys_pgdir+PG_SW-OS_BASE
mov dword [_sys_pdbr-OS_BASE+(page_tabs shr 20)], _sys_pdbr+PG_SW-OS_BASE
 
mov ebx, cr4
or ebx, CR4_PSE
220,8 → 219,59
sz_nopse db 'Page size extensions not supported',0x0A
db 'Halted',0
 
org $-0x100000
 
align 4
 
_enter_bootscreen:
 
use16
mov eax, cr0
and eax, not 0x80000001
mov cr0, eax
jmp far 0x1000:start_of_code
 
version db 'Kolibri OS version 0.7.1.0 ',13,10,13,10,0
 
include "boot/bootstr.inc" ; language-independent boot messages
include "boot/preboot.inc"
 
if lang eq en
include "boot/booteng.inc" ; english system boot messages
else if lang eq ru
include "boot/bootru.inc" ; russian system boot messages
include "boot/ru.inc" ; Russian font
else if lang eq et
include "boot/bootet.inc" ; estonian system boot messages
include "boot/et.inc" ; Estonian font
else
include "boot/bootge.inc" ; german system boot messages
end if
 
include "data16.inc"
 
include "boot/bootcode.inc" ; 16 bit system boot code
include "bus/pci/pci16.inc"
include "detect/biosdisk.inc"
 
;include "boot/shutdown.inc" ; shutdown or restart
 
cli
 
mov eax, cr0
or eax, 0x80000001
mov cr0, eax
 
jmp pword os_code:__setvars
 
org $+0x100000
 
align 4
_leave_bootscreen:
 
use32
 
 
; CLEAR 0x280000 - HEAP_BASE
 
; xor eax,eax
239,61 → 289,48
; mov ecx, (uglobals_size/4)+4
; rep stosd
 
; SAVE & CLEAR 0-0xffff
 
; xor esi, esi
; mov edi,0x2F0000
; mov ecx,0x10000 / 4
; rep movsd
; xor edi, edi
; mov ecx,0x10000 / 4
; rep stosd
 
; call test_cpu
bts [cpu_caps-OS_BASE], CAPS_TSC ;force use rdtsc
 
; call init_BIOS32
 
mov dword [sys_pgdir-OS_BASE], PG_LARGE+PG_SW
mov dword [sys_pgdir-OS_BASE+4], PG_LARGE+PG_SW+4*1024*1024
; mov dword [sys_pgdir-OS_BASE], PG_LARGE+PG_SW
; mov dword [sys_pgdir-OS_BASE+4], PG_LARGE+PG_SW+4*1024*1024
 
mov ecx, 32
lea edi, [sys_pgdir-OS_BASE+0xE00]
mov eax, PG_LARGE+PG_SW
@@:
stosd
add eax, 4*1024*1024
loop @B
; mov ecx, 32
; lea edi, [sys_pgdir-OS_BASE+0xE00]
; mov eax, PG_LARGE+PG_SW
;@@:
; stosd
; add eax, 4*1024*1024
; loop @B
 
mov ebx, cr4
or ebx, CR4_PSE
and ebx, not CR4_PAE
mov cr4, ebx
; mov ebx, cr4
; or ebx, CR4_PSE
; and ebx, not CR4_PAE
; mov cr4, ebx
 
 
mov eax, sys_pgdir-OS_BASE
mov ebx, cr0
or ebx,CR0_PG+CR0_WP
; mov eax, sys_pgdir-OS_BASE
; mov ebx, cr0
; or ebx,CR0_PG+CR0_WP
 
mov cr3, eax
mov cr0, ebx
; mov cr3, eax
; mov cr0, ebx
 
lgdt [gdts]
jmp pword os_code:high_code
; lgdt [gdts]
; jmp pword os_code:high_code
 
align 4
bios32_entry dd ?
tmp_page_tabs dd ?
 
;use16
;org $-0x10000
;include "boot/shutdown.inc" ; shutdown or restart
;org $+0x10000
;use32
 
__DEBUG__ fix 1
__DEBUG_LEVEL__ fix 1
 
 
org OS_BASE+$
 
MEM_WB equ 6 ;write-back memory
465,8 → 502,6
mov ax,tss0
ltr ax
 
xchg bx, bx
 
mov ecx, 1280*1024
fastcall _balloc
mov [_display_data], eax
483,9 → 518,37
call _init_mm
mov [pg_data.pg_mutex], 0
 
hlt
mov esi, 0x100000
mov ecx, (_leave_bootscreen-0x100000)/4
mov edi, 0x10000
cld
rep movsd
 
jmp far 0x60:_enter_bootscreen;
 
align 4
__setvars:
mov ax,os_stack
mov dx,app_data
mov ss,ax
mov esp, __os_stack
 
mov ds, dx
mov es, dx
mov fs, dx
mov gs, dx
 
; SAVE & CLEAR 0-0xffff
 
xor esi, esi
mov edi,0x2F0000
mov ecx,0x10000 / 4
rep movsd
xor edi, edi
xor eax, eax
mov ecx,0x10000 / 4
rep stosd
 
; SAVE REAL MODE VARIABLES
mov ax, [BOOT_VAR + 0x9031]
mov [IDEContrRegsBaseAddr], ax
545,6 → 608,7
je @f
cmp [SCR_MODE],word 0x12 ; VGA 640x480
je @f
 
mov ax,[BOOT_VAR+0x9001] ; for other modes
mov [BytesPerScanLine],ax
@@:
701,7 → 765,7
stdcall kernel_alloc, [mem_BACKGROUND]
mov [img_background], eax
 
mov [SLOT_BASE + 256 + APPDATA.dir_table], sys_pgdir - OS_BASE
mov [SLOT_BASE + 256 + APPDATA.dir_table], _sys_pdbr - OS_BASE
 
; REDIRECT ALL IRQ'S TO INT'S 0x20-0x2f
 
740,7 → 804,6
; mov [dma_hdd],1
; CALCULATE FAT CHAIN FOR RAMDISK
 
 
call calculatefatchain
 
 
868,13 → 931,13
 
mov esi,boot_tsc
call boot_log
cli
 
call _rdtsc
mov ecx,eax
mov esi,250 ; wait 1/4 a second
call delay_ms
call _rdtsc
sti
 
sub eax,ecx
shl eax,2
mov [CPU_FREQ],eax ; save tsc / sec
941,7 → 1004,6
; no_st_network:
 
; LOAD FIRST APPLICATION
cli
 
cmp byte [BOOT_VAR+0x9030],1
jne no_load_vrr_m
1012,7 → 1074,6
mov esi,boot_allirqs
call boot_log
 
cli ;guarantee forbidance of interrupts.
mov al,0 ; unmask all irq's
out 0xA1,al
out 0x21,al
1034,8 → 1095,6
setnz [dma_hdd]
mov [timer_ticks_enable],1 ; for cd driver
 
; stdcall init_uart_service, DRV_ENTRY
 
sti
call change_task
 
1058,6 → 1117,7
mov ecx,0x80ffffff ; ASCIIZ string with white color
mov edx,esi
mov edi,1
 
call dtext
 
mov [novesachecksum],1000
2113,10 → 2173,11
test eax,eax
jz .not_found
mov ecx,eax
pushfd
cli
call sysfn_terminate
mov [application_table_status],0
sti
popfd
and dword [esp+32],0
ret
.not_found:
4579,8 → 4640,6
 
rerouteirqs:
 
cli
 
mov al,0x11 ; icw4, edge triggered
out 0x20,al
call pic_delay
4624,8 → 4683,6
out 0x21,al
call pic_delay
 
cli
 
ret