/kernel/trunk/boot/bootcode.inc |
---|
139,6 → 139,14 |
call setcursor |
} |
pagetable_set: |
or al, 7 |
@@: |
stosd |
add eax, 1000h |
loop @b |
ret |
; 16-bit data |
; videomodes table |
gr_table: |
275,6 → 283,7 |
cmp ax,dx |
jnz cpugood |
mov si,not386-0x10000 |
sayerr: |
call print |
jmp $ |
cpugood: |
347,9 → 356,9 |
jnz @f |
mov ax,[es:di+4] |
add ax,'0'*256+'0' |
mov [vervesa+vervesa_off-0x10000], ah |
mov [vervesa+vervesa_off+2-0x10000], al |
mov si,vervesa-0x10000 |
mov [si+vervesa_off], ah |
mov [si+vervesa_off+2], al |
@@: call print |
; \begin{diamond}[30.11.2005] |
360,36 → 369,33 |
; b) preboot_mtrr = use hardware acceleration? |
; c) preboot_vrrm = use VRR? |
; d) preboot_device = from what boot? |
mov si, preboot_graph-0x10000 |
mov di, preboot_graph-0x10000 |
; check bootloader block |
cmp [.loader_block-0x10000], 0 |
jz .noloaderblock |
les bx, [.loader_block-0x10000] |
cmp byte [es:bx], 1 |
jz @f |
mov si, loader_block_error-0x10000 |
call print |
jmp $ |
@@: |
jnz sayerr |
test byte [es:bx+1], 1 |
jz @f |
; image in memory present |
cmp [si+preboot_device-preboot_graph], 0 |
cmp [di+preboot_device-preboot_graph], 0 |
jnz @f |
mov [si+preboot_device-preboot_graph], 3 |
mov [di+preboot_device-preboot_graph], 3 |
@@: |
.noloaderblock: |
; determine default settings |
mov [.bSettingsChanged-0x10000], 0 |
cmp byte [si], 0 |
cmp byte [di], 0 |
jnz .preboot_gr_end |
mov [si+preboot_gprobe-preboot_graph], 0 |
mov [di+preboot_gprobe-preboot_graph], 0 |
mov al, [vervesa+vervesa_off-0x10000] |
cmp al, 'x' |
jz .novesa |
cmp al, '1' |
jz .vesa12 |
mov [si+preboot_gprobe-preboot_graph], 2 |
mov [di+preboot_gprobe-preboot_graph], 2 |
mov al, 3 |
jmp @f |
.vesa12: |
398,14 → 404,14 |
.novesa: |
mov al, 10 |
@@: |
mov [si], al |
mov [di], al |
.preboot_gr_end: |
cmp [si+preboot_mtrr-preboot_graph], 1 |
adc [si+preboot_mtrr-preboot_graph], 0 |
cmp [si+preboot_vrrm-preboot_graph], 1 |
adc [si+preboot_vrrm-preboot_graph], 0 |
cmp [si+preboot_device-preboot_graph], 1 |
adc [si+preboot_device-preboot_graph], 0 |
cmp [di+preboot_mtrr-preboot_graph], 1 |
adc [di+preboot_mtrr-preboot_graph], 0 |
cmp [di+preboot_vrrm-preboot_graph], 1 |
adc [di+preboot_vrrm-preboot_graph], 0 |
cmp [di+preboot_device-preboot_graph], 1 |
adc [di+preboot_device-preboot_graph], 0 |
; notify user |
mov si, linef-0x10000 |
call print |
457,21 → 463,11 |
mov si, linef-0x10000 |
call printplain |
mov si, mtrr_msg-0x10000 |
call print |
mov si, on_msg-0x10000 |
cmp [preboot_mtrr-0x10000], 1 |
jz @f |
mov si, off_msg-0x10000 |
@@: |
call printplain |
call .say_on_off |
mov si, vrrm_msg-0x10000 |
call print |
mov si, on_msg-0x10000 |
cmp [preboot_vrrm-0x10000], 1 |
jz @f |
mov si, off_msg-0x10000 |
@@: |
call printplain |
call .say_on_off |
mov si, preboot_device_msg-0x10000 |
call print |
mov al, [preboot_device-0x10000] |
479,7 → 475,6 |
mov si, [preboot_device_msgs-0x10000+eax*2] |
call printplain |
.wait: |
; empty BIOS keyboard buffer |
_setcursor 25,0 ; out of screen |
; set timer interrupt handler |
cli |
497,9 → 492,9 |
; restore timer interrupt |
push 0 |
pop es |
mov ecx, [.oldtimer-0x10000] |
mov [es:8*4], ecx |
mov [.timer-0x10000], ecx |
mov eax, [.oldtimer-0x10000] |
mov [es:8*4], eax |
mov [.timer-0x10000], eax |
_setcursor 7,0 |
mov si, space_msg-0x10000 |
call printplain |
518,13 → 513,13 |
jnz .wait |
_setcursor 15,0 |
mov si,bdev-0x10000 |
call printplain |
call print |
mov bx,'13' |
call getkey |
mov [preboot_device-0x10000], al |
_setcursor 13,0 |
.d: |
mov [.bSettingsChanged-0x10000], al |
mov [.bSettingsChanged-0x10000], 1 |
mov si, space_msg-0x10000 |
call printplain |
_setcursor 15,0 |
553,7 → 548,7 |
.change_b: |
_setcursor 15,0 |
mov si, gr_acc-0x10000 |
call printplain |
call print |
mov bx, '12' |
call getkey |
mov [preboot_mtrr-0x10000], al |
562,16 → 557,28 |
.change_c: |
_setcursor 15,0 |
mov si, vrrmprint-0x10000 |
call printplain |
call print |
mov bx, '12' |
call getkey |
mov [preboot_vrrm-0x10000], al |
_setcursor 12,0 |
jmp .d |
.say_on_off: |
pushf |
call print |
mov si, on_msg-0x10000 |
popf |
jz @f |
mov si, off_msg-0x10000 |
@@: call printplain |
ret |
; novesa and vervesa strings are not used at the moment of executing this code |
virtual at novesa |
.oldtimer dd ? |
.starttime dd ? |
.bSettingsChanged db ? |
.timer dd ? |
end virtual |
.loader_block dd 0 |
.gettime: |
mov ah, 0 |
672,9 → 679,9 |
.cont: |
push cs |
pop ds |
mov byte [space_msg-0x10000+80], 0 |
mov si, space_msg-0x10000 |
mov byte [si+80], 0 |
_setcursor 15,0 |
mov si, space_msg-0x10000 |
call printplain |
_setcursor 15,0 |
.load: |
683,13 → 690,6 |
; ASK GRAPHICS MODE |
movzx ax, [preboot_graph-0x10000] |
test ax, ax |
jne pre_graph |
mov si,gr_mode-0x10000 |
call printplain |
mov bx,'09' |
call getkey |
pre_graph: |
push 0 |
pop es |
; address is gr_table+6*(ax-1)-0x10000 |
699,14 → 699,14 |
mov cx,[si+2] |
mov dx,[si+4] |
cmp al, 9*2 |
mov al, 32 ; BPP |
jb @f |
mov byte [es:0x9000], 32 |
mov [es:0x9000], al |
mov dword [es:0x9018], 0x800000 |
@@: |
mov [es:0x9008],bx |
mov [es:0x900A],cx |
mov [es:0x900C],dx |
mov ax,32 |
test bh, bh |
jz nov |
713,54 → 713,28 |
; USE DEFAULTS OR PROBE |
; bx - mode : cx - x size : dx - y size |
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
movzx ax,[preboot_gprobe-0x10000] |
test ax,ax |
jne pre_probe |
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
test bx,0100000000000000b |
cmp [preboot_gprobe-0x10000], 1 |
jz noprobe |
mov si,probetext-0x10000 |
call printplain |
push bx |
mov bx, '12' |
call getkey |
pop bx |
pre_probe: |
dec ax |
je noprobe |
push cx dx |
mov bx,0x100 |
newprobe: |
inc bx |
cmp bx,0x17f |
jne probemore |
mov si,prnotfnd-0x10000 |
call printplain |
jz sayerr |
jmp $ |
probemore: |
push cx |
mov ax,0x4f01 |
mov cx,bx |
and cx,0xfff |
mov di,0xa000 |
int 0x10 |
pop cx |
test byte [es:di], 80h ; lfb? |
jz newprobe |
mov ax, [es:di+0x12] ; x size? |
cmp ax, [esp+2] |
cmp [es:di+0x12], cx ; x size? |
jnz newprobe |
cmp [es:di+0x14], dx ; y size? |
jnz newprobe |
767,9 → 741,9 |
cmp byte [es:di+0x19], 32 ;24 |
jb newprobe |
add bx,0100000000000000b |
; add bx,0100000000000000b |
or bh, 40h |
mov [es:0x9008],bx |
pop dx cx |
noprobe: |
782,27 → 756,26 |
mov di,0xa000 |
int 0x10 |
; LFB |
mov ecx,[es:di+0x28] |
mov [es:0x9018],ecx |
mov eax,[es:di+0x28] |
mov [es:0x9018],eax |
; ---- vbe voodoo |
BytesPerScanLine equ 0x10 |
mov ax, [es:di+BytesPerScanLine] |
mov [es:0x9001],ax |
; BPP |
movzx ax,byte [es:di+0x19] |
mov al,byte [es:di+0x19] |
mov [es:0x9000],al |
nov: |
cmp ax,24 |
cmp al,24 |
mov si,bt24-0x10000 |
jz bppl |
cmp ax,32 |
cmp al,32 |
mov si,bt32-0x10000 |
jz bppl |
mov si,btns-0x10000 |
jmp sayerr |
bppl: |
call print |
jmp $ |
bppl: |
call printplain |
; FIND VESA 1.2 PM BANK SWITCH ADDRESS |
825,33 → 798,12 |
; GRAPHICS ACCELERATION |
mov al, [preboot_mtrr-0x10000] |
test al,al |
jne pre_mtrr |
mov si,gr_acc-0x10000 |
call printplain |
mov bx,'12' |
call getkey |
pre_mtrr: |
mov [es:0x901C],al |
; commented by diamond - newlines are not used now |
; mov si,linef-0x10000 |
; call printplain |
; VRR_M USE |
mov al,[preboot_vrrm-0x10000] |
test al,al |
jne pre_vrrm |
mov si,vrrmprint-0x10000 |
call print |
mov bx,'13' |
call getkey |
pre_vrrm: |
mov [es:0x9030],al |
; commented by diamond - newlines are not used now |
; mov si,linef2-0x10000 |
; call printplain |
; MEMORY MODEL |
939,24 → 891,12 |
; BOOT DEVICE |
mov al, [preboot_device-0x10000] |
test al, al |
jnz pre_device |
mov si,bdev-0x10000 |
call printplain |
mov bx,'13' |
call getkey |
pre_device: |
dec ax |
dec al |
mov [boot_dev-0x10000],al |
; commented by diamond - newlines are not used now |
; mov si,linef-0x10000 |
; call printplain |
; READ DISKETTE TO MEMORY |
cmp [boot_dev-0x10000],0 |
; cmp [boot_dev-0x10000],0 |
jne no_sys_on_floppy |
mov si,diskload-0x10000 |
call print |
979,6 → 919,7 |
cmp si,10 |
jnz newread |
mov si,badsect-0x10000 |
sayerr_plain: |
call printplain |
jmp $ |
goodread: |
998,8 → 939,7 |
mov al,0 |
out dx,al |
mov si,memmovefailed-0x10000 |
call print |
jmp $ |
jmp sayerr_plain |
goodmove: |
add dword [movedesc-0x10000+0x18+2], 512*18 |
1030,9 → 970,8 |
jnz reads |
readdone: |
pop ax |
mov si,backspace-0x10000 |
mov si,backspace2-0x10000 |
call printplain |
call printplain |
mov si,okt-0x10000 |
call printplain |
no_sys_on_floppy: |
1054,30 → 993,36 |
pop es ; es:di = 6000:0 |
xor di,di |
mov cx,256*map_mem ; Map (mapmem) M |
mov eax,7 |
pt2: |
cmp cx,256*(map_mem-8) ; 8 M map to LFB |
jnz pt3 |
; mov eax,7 |
; pt2: |
; cmp cx,256*(map_mem-8) ; 8 M map to LFB |
; jnz pt3 |
; pop eax |
; add eax,7 |
; pt3: |
; cmp cx,256*(map_mem-12) ; 12 M back to linear = physical |
; jnz pt4 |
; mov eax,12*0x100000 + 7 |
; pt4: |
; stosd |
; add eax,4096 |
; loop pt2 |
; initialize as identity mapping |
xor eax, eax |
call pagetable_set |
; 8M..12M map to LFB |
pop eax |
add eax,7 |
pt3: |
cmp cx,256*(map_mem-12) ; 12 M back to linear = physical |
jnz pt4 |
mov eax,12*0x100000 + 7 |
pt4: |
stosd |
add eax,4096 |
loop pt2 |
; mov cx, 256*4 |
mov ch, 4 |
mov di, 2000h |
call pagetable_set |
push 0x7100 |
pop es |
xor di,di |
mov eax,8*0x100000+7 |
mov eax,8*0x100000 |
mov cx,256*4 |
pt5: |
stosd |
add eax,0x1000 |
loop pt5 |
call pagetable_set |
; 4 KB PAGE DIRECTORY |
1086,15 → 1031,12 |
xor di, di |
mov cx, 64 / 4 |
mov eax, 0x60007 ; for 0 M |
pd4k: |
stosd |
add eax, 0x1000 |
loop pd4k |
call pagetable_set |
mov dword [es:0x800],0x71007 ;map region 0x80000000-0x803FFFFF to 0x800000-0xCFFFFF |
xor si,si |
mov di,second_base_address shr 20 |
mov cx,64/4 |
rep movs dword [es:di], [es:si] |
mov cx,64/2 |
rep movs word [es:di], [es:si] |
mov eax, 0x7F000 +8+16 ; Page directory and enable caches |
mov cr3, eax |
1102,9 → 1044,8 |
; SET GRAPHICS |
pop es |
mov bx,[es:0x9008] ; vga & 320x200 |
mov ax, bx |
push ax |
mov ax,[es:0x9008] ; vga & 320x200 |
mov bx, ax |
cmp ax,0x13 |
je setgr |
cmp ax,0x12 |
1113,12 → 1054,8 |
setgr: |
int 0x10 |
test ah,ah |
jz gmok |
mov si,fatalsel-0x10000 |
call print |
jmp $ |
gmok: |
jnz sayerr |
; set mode 0x12 graphics registers: |
cmp bx,0x12 |
jne gmok2 |
1125,6 → 1062,7 |
mov al,0x05 |
mov dx,0x03ce |
push dx |
out dx,al ; select GDC mode register |
mov al,0x02 |
inc dx |
1138,7 → 1076,7 |
out dx,al ; set mask for all planes 0-3 |
mov al,0x08 |
mov dx,0x03ce |
pop dx |
out dx,al ; select GDC bit mask register |
; for writes to 0x03cf |
/kernel/trunk/boot/booteng.inc |
---|
62,25 → 62,24 |
db 186," EGA/CGA 256 Colors: [9] 320x200, " |
db "VGA 16 Colors: [0] 640x480",13,10 |
db 186," Select mode: ",0 |
bt24 db 13,10,186," Bits Per Pixel: 24",13,10,0 |
bt32 db 13,10,186," Bits Per Pixel: 32",13,10,0 |
vrrmprint db 13,10,186," Apply VRR? (picture frequency greater than 60Hz" |
bt24 db "Bits Per Pixel: 24",13,10,0 |
bt32 db "Bits Per Pixel: 32",13,10,0 |
vrrmprint db "Apply VRR? (picture frequency greater than 60Hz" |
db " only for transfers:",13,10 |
db 186," 1024*768->800*600 and 800*600->640*480) [1-yes,2-no]:",0 |
askmouse db " Mouse at:" |
db " [1] PS/2 (USB), [2] Com1, [3] Com2." |
db " Select port [1-3]: ",0 |
no_com1 db 13,10,186, " No COM1 mouse",0 |
no_com2 db 13,10,186, " No COM2 mouse",0 |
gr_acc db 13,10,186," Vesa 2.0+ : MTRR graphics acceleration " |
;askmouse db " Mouse at:" |
; db " [1] PS/2 (USB), [2] Com1, [3] Com2." |
; db " Select port [1-3]: ",0 |
;no_com1 db 13,10,186, " No COM1 mouse",0 |
;no_com2 db 13,10,186, " No COM2 mouse",0 |
gr_acc db "Vesa 2.0+ : MTRR graphics acceleration " |
db "[1-yes/2-no] ? ",0 |
gr_direct db 186," Use direct LFB writing? " |
db "[1-yes/2-no] ? ",0 |
;gr_direct db 186," Use direct LFB writing? " |
; db "[1-yes/2-no] ? ",0 |
;mem_model db 13,10,186," Motherboard memory [1-16 Mb / 2-32 Mb / " |
; db "3-64Mb / 4-128 Mb / 5-256 Mb] ? ",0 |
bootlog db 13,10,186," After bootlog display [1-continue/2-pause] ? ",0 |
bdev db 186 |
db " Load ramdisk from [1-floppy; 2-C:\menuet.img (FAT32);" |
;bootlog db 13,10,186," After bootlog display [1-continue/2-pause] ? ",0 |
bdev db "Load ramdisk from [1-floppy; 2-C:\menuet.img (FAT32);" |
db 13,10,186," " |
db "3-use preloaded ram-image from kernel restart]: ",0 |
probetext db 13,10,13,10,186," Use standart graphics mode? [1-yes, " |
90,18 → 89,18 |
;memokz64 db 13,10,186," RAM 64 Mb",0 |
;memokz32 db 13,10,186," RAM 32 Mb",0 |
;memokz16 db 13,10,186," RAM 16 Mb",0 |
prnotfnd db " pr. - not found.",0 |
modena db "Fatal - VBE 0x112+ required.",0 |
prnotfnd db "Fatal - Videomode not found.",0 |
;modena db "Fatal - VBE 0x112+ required.",0 |
not386 db "Fatal - CPU 386+ required.",0 |
btns db 13,10,186,"Fatal - Can't determine color depth.",0 |
fatalsel db 13,10,"Fatal - Graphics mode not supported by hardware.",0 |
btns db "Fatal - Can't determine color depth.",0 |
fatalsel db "Fatal - Graphics mode not supported by hardware.",0 |
badsect db 13,10,186," Fatal - Bad sector. Replace floppy. ",0 |
memmovefailed db "Fatal - Int 0x15 move failed.",0 |
memmovefailed db 13,10,186," Fatal - Int 0x15 move failed.",0 |
okt db " ... OK" |
linef db 13,10,0 |
diskload db 13,10,186," Loading diskette: 00 %",8,8,8,8,0 |
backspace db 8,0 |
pros db "00",8,8,0 |
diskload db "Loading diskette: 00 %",8,8,8,8,0 |
pros db "00" |
backspace2 db 8,8,0 |
boot_dev db 0 ; 0=floppy, 1=hd |
start_msg db "Press [abcd] to change settings, press [Enter] to continue booting",13,10,0 |
time_msg db " or wait " |
/kernel/trunk/boot/bootru.inc |
---|
62,25 → 62,24 |
db 186," EGA/CGA 256 ¢¥â®¢: [9] 320x200, " |
db "VGA 16 ¢¥â®¢: [0] 640x480",13,10 |
db 186," ë¡¥à¨â¥ ¢¨¤¥®à¥¦¨¬: ",0 |
bt24 db 13,10,186," «ã¡¨ 梥â : 24",13,10,0 |
bt32 db 13,10,186," «ã¡¨ 梥â : 32",13,10,0 |
vrrmprint db 13,10,186," ᯮ«ì§®¢ âì VRR? (ç áâ®â ª ¤à®¢ ¢ëè¥ 60 æ" |
bt24 db "«ã¡¨ 梥â : 24",13,10,0 |
bt32 db "«ã¡¨ 梥â : 32",13,10,0 |
vrrmprint db "ᯮ«ì§®¢ âì VRR? (ç áâ®â ª ¤à®¢ ¢ëè¥ 60 æ" |
db " ⮫쪮 ¤«ï ¯¥à¥å®¤®¢:",13,10 |
db 186," 1024*768>800*600 ¨ 800*600>640*480) [1-¤ , 2-¥â]: ",0 |
askmouse db "ëèì:" ; 186, " " |
db " [1] PS/2 (USB), [2] Com1, [3] Com2." |
db " ë¡¥à¨â¥ ¯®àâ [1-3]: ",0 |
no_com1 db 13,10,186," No COM1 mouse",0 |
no_com2 db 13,10,186," No COM2 mouse",0 |
gr_acc db 13,10,186," Vesa 2.0+: ª«îç¨âì MTRR ¤«ï ãáª®à¥¨ï £à 䨪¨? " |
;askmouse db "ëèì:" ; 186, " " |
; db " [1] PS/2 (USB), [2] Com1, [3] Com2." |
; db " ë¡¥à¨â¥ ¯®àâ [1-3]: ",0 |
;no_com1 db 13,10,186," No COM1 mouse",0 |
;no_com2 db 13,10,186," No COM2 mouse",0 |
gr_acc db "Vesa 2.0+: ª«îç¨âì MTRR ¤«ï ãáª®à¥¨ï £à 䨪¨? " |
db "[1-¤ /2-¥â]: ",0 |
gr_direct db 186," ᯮ«ì§®¢ âì «¨¥©ë© ¢¨¤¥®¡ãä¥à? " |
db "[1-¤ /2-¥â]: ",0 |
;gr_direct db 186," ᯮ«ì§®¢ âì «¨¥©ë© ¢¨¤¥®¡ãä¥à? " |
; db "[1-¤ /2-¥â]: ",0 |
;mem_model db 13,10,186," ¡ê+¬ ¯ ¬ï⨠[1-16 Mb / 2-32 Mb / " |
; db "3-64Mb / 4-128 Mb / 5-256 Mb]: ",0 |
bootlog db 13,10,186," à®á¬®âà¥âì ¦ãà « § £à㧪¨? [1-¥â/2-¤ ]: ",0 |
bdev db 186 |
db " £à㧨âì ®¡à § ¨§ [1-¤¨áª¥â ; 2-C:\menuet.img (FAT32);" |
;bootlog db 13,10,186," à®á¬®âà¥âì ¦ãà « § £à㧪¨? [1-¥â/2-¤ ]: ",0 |
bdev db " £à㧨âì ®¡à § ¨§ [1-¤¨áª¥â ; 2-C:\menuet.img (FAT32);" |
db 13,10,186," " |
db "3-¨á¯®«ì§®¢ âì 㦥 § £àã¦¥ë© ®¡à §]: ",0 |
probetext db 13,10,13,10,186," â ¤ àâë© ¢¨¤¥®à¥¦¨¬? [1-¤ , " |
90,19 → 89,18 |
;memokz64 db 13,10,186," RAM 64 Mb",0 |
;memokz32 db 13,10,186," RAM 32 Mb",0 |
;memokz16 db 13,10,186," RAM 16 Mb",0 |
prnotfnd db " pr. - ®è¨¡ª .",0 |
modena db "訡ª - ॡã¥âáï ¯®¤¤¥à¦ª VBE 0x112+.",0 |
prnotfnd db "訡ª - ¨¤¥®à¥¦¨¬ ¥ ©¤¥.",0 |
;modena db "訡ª - ॡã¥âáï ¯®¤¤¥à¦ª VBE 0x112+.",0 |
not386 db "訡ª - ॡã¥âáï ¯à®æ¥áá®à 386+.",0 |
btns db 13,10,186," 訡ª - ¥ ¬®£ã ®¯à¥¤¥«¨âì £«ã¡¨ã 梥â .",0 |
fatalsel db 13,10,"訡ª - ë¡à ë© ¢¨¤¥®à¥¦¨¬ ¥ ¯®¤¤¥à¦¨¢ ¥âáï.",0 |
badsect db 13,10,186," 訡ª - ¨áª¥â ¯®¢à¥¦¤¥ . ®¯à®¡ã©â¥ ¤àã£ãî. " |
db 0 |
memmovefailed db "Fatal - Int 0x15 move failed.",0 |
btns db "訡ª - ¥ ¬®£ã ®¯à¥¤¥«¨âì £«ã¡¨ã 梥â .",0 |
fatalsel db "訡ª - ë¡à ë© ¢¨¤¥®à¥¦¨¬ ¥ ¯®¤¤¥à¦¨¢ ¥âáï.",0 |
badsect db 13,10,186," 訡ª - ¨áª¥â ¯®¢à¥¦¤¥ . ®¯à®¡ã©â¥ ¤àã£ãî.",0 |
memmovefailed db 13,10,186," 訡ª - Int 0x15 move failed.",0 |
okt db " ... OK" |
linef db 13,10,0 |
diskload db 13,10,186," £à㧪 ¤¨áª¥âë: 00 %",8,8,8,8,0 |
backspace db 8,0 |
pros db "00",8,8,0 |
diskload db " £à㧪 ¤¨áª¥âë: 00 %",8,8,8,8,0 |
pros db "00" |
backspace2 db 8,8,0 |
boot_dev db 0 |
start_msg db " ¦¬¨â¥ [abcd] ¤«ï ¨§¬¥¥¨ï áâ஥ª, [Enter] ¤«ï ¯à®¤®«¦¥¨ï § £à㧪¨",13,10,0 |
time_msg db " ¨«¨ ¯®¤®¦¤¨â¥ " |
/kernel/trunk/core/debug.inc |
---|
0,0 → 1,344 |
; this code uses following additions to system structures: |
; in additional app info at 80000..8FFFF: |
; AC (dword) 0 or debugger slot |
; BC (dword) address of debug event memory |
; new process slot state: |
; 1 = suspended |
; 2 = suspended waiting for event |
; new event: 8 (and new possible bitflag for A8 in additional app info) |
; diamond, 2006 |
sys_debug_services: |
cmp eax, 8 |
ja @f |
jmp dword [sys_debug_services_table+eax*4] |
@@: ret |
sys_debug_services_table: |
dd debug_set_event_data |
dd debug_getcontext |
dd debug_setcontext |
dd debug_detach |
dd debug_suspend |
dd debug_resume |
dd debug_read_process_memory |
dd debug_write_process_memory |
dd debug_terminate |
debug_set_event_data: |
; in: ebx = pointer |
; destroys eax |
mov eax, [0x3000] |
shl eax, 8 |
mov [eax+0x80000+0xBC], ebx |
ret |
get_debuggee_slot: |
; in: ebx=PID |
; out: CF=1 if error |
; CF=0 and eax=slot*0x20 if ok |
; out: interrupts disabled |
cli |
mov eax, ebx |
call pid_to_slot |
test eax, eax |
jz .ret_bad |
shl eax, 5 |
push ebx |
mov ebx, [0x3000] |
cmp [0x80000+eax*8+0xAC], ebx |
pop ebx |
jnz .ret_bad |
; clc ; automatically |
ret |
.ret_bad: |
stc |
ret |
debug_detach: |
; in: ebx=pid |
; destroys eax,ebx |
call get_debuggee_slot |
jc .ret |
and dword [eax*8+0x80000+0xAC], 0 |
call do_resume |
.ret: |
sti |
ret |
debug_terminate: |
; in: ebx=pid |
call get_debuggee_slot |
jc debug_detach.ret |
mov ebx, eax |
shr ebx, 5 |
push 2 |
pop eax |
jmp sys_system |
debug_suspend: |
; in: ebx=pid |
; destroys eax,ebx |
call get_debuggee_slot |
jc .ret |
mov bl, [0x3000+eax+0xA] ; process state |
test bl, bl |
jz .1 |
cmp bl, 5 |
jnz .ret |
mov bl, 2 |
.2: mov [0x3000+eax+0xA], bl |
.ret: |
sti |
ret |
.1: |
inc ebx |
jmp .2 |
do_resume: |
mov bl, [0x3000+eax+0xA] |
cmp bl, 1 |
jz .1 |
cmp bl, 2 |
jnz .ret |
mov bl, 5 |
.2: mov [0x3000+eax+0xA], bl |
.ret: ret |
.1: dec ebx |
jmp .2 |
debug_resume: |
; in: ebx=pid |
; destroys eax,ebx |
call get_debuggee_slot |
jc .ret |
call do_resume |
.ret: sti |
ret |
debug_getcontext: |
; in: |
; ebx=pid |
; ecx=sizeof(CONTEXT) |
; edx->CONTEXT |
; destroys eax,ecx,edx,esi,edi |
cmp ecx, 28h |
jnz .ret |
add edx, std_application_base_address |
push ebx |
mov ebx, edx |
call check_region |
pop ebx |
dec eax |
jnz .ret |
call get_debuggee_slot |
jc .ret |
imul eax, tss_step/32 |
add eax, tss_data |
mov edi, edx |
cmp [l.cs - tss_sceleton + eax], app_code |
jnz .ring0 |
lea esi, [l.eip - tss_sceleton + eax] |
shr ecx, 2 |
rep movsd |
jmp .ret |
.ring0: |
; note that following code assumes that all interrupt/exception handlers |
; saves ring-3 context by push ds es, pushad in this order |
mov esi, [l.esp0 - tss_sceleton + eax] |
; top of ring0 stack: ring3 stack ptr (ss+esp), iret data (cs+eip+eflags), ds, es, pushad |
sub esi, 8+12+8+20h |
lodsd |
mov [edi+24h], eax |
lodsd |
mov [edi+20h], eax |
lodsd |
mov [edi+1Ch], eax |
lodsd |
lodsd |
mov [edi+14h], eax |
lodsd |
mov [edi+10h], eax |
lodsd |
mov [edi+0Ch], eax |
lodsd |
mov [edi+8], eax |
add esi, 8 |
lodsd |
mov [edi], eax |
lodsd |
lodsd |
mov [edi+4], eax |
lodsd |
mov [edi+18h], eax |
.ret: |
sti |
ret |
debug_setcontext: |
; in: |
; ebx=pid |
; ecx=sizeof(CONTEXT) |
; edx->CONTEXT |
; destroys eax,ecx,edx,esi,edi |
cmp ecx, 28h |
jnz .ret |
add edx, std_application_base_address |
push ebx |
mov ebx, edx |
call check_region |
pop ebx |
dec eax |
jnz .ret |
call get_debuggee_slot |
jc .stiret |
imul eax, tss_step/32 |
add eax, tss_data |
mov esi, edx |
cmp [l.cs - tss_sceleton + eax], app_code |
jnz .ring0 |
lea edi, [l.eip - tss_sceleton + eax] |
shr ecx, 2 |
rep movsd |
jmp .stiret |
.ring0: |
mov edi, [l.esp0 - tss_sceleton + eax] |
sub edi, 8+12+8+20h |
mov eax, [esi+24h] |
stosd |
mov eax, [esi+20h] |
stosd |
mov eax, [esi+1Ch] |
stosd |
scasd |
mov eax, [esi+14h] |
stosd |
mov eax, [esi+10h] |
stosd |
mov eax, [esi+0Ch] |
stosd |
mov eax, [esi+8] |
stosd |
add edi, 8 |
mov eax, [esi] |
stosd |
scasd |
mov eax, [esi+4] |
stosd |
mov eax, [esi+18h] |
stosd |
.stiret: |
sti |
.ret: |
ret |
debug_read_process_memory: |
; in: |
; ebx=pid |
; ecx=length |
; esi->buffer in debugger |
; edx=address in debuggee |
; out: [esp+36]=eax=sizeof(read) |
; destroys all |
add esi, std_application_base_address |
push ebx |
mov ebx, esi |
call check_region |
pop ebx |
dec eax |
jnz .ret |
call get_debuggee_slot |
jc .stiret |
mov ebx, esi |
call read_process_memory |
.stiret: |
sti |
.ret: |
ret |
debug_write_process_memory: |
; in: |
; ebx=pid |
; ecx=length |
; esi->buffer in debugger |
; edx=address in debuggee |
; out: [esp+36]=eax=sizeof(write) |
; destroys all |
add esi, std_application_base_address |
push ebx |
mov ebx, esi |
call check_region |
pop ebx |
dec eax |
jnz .ret |
call get_debuggee_slot |
jc .stiret |
mov ebx, esi |
call write_process_memory |
.stiret: |
sti |
.ret: |
ret |
debugger_notify: |
; in: eax=debugger slot |
; ecx=size of debug message |
; [esp+4]..[esp+4+ecx]=message |
; interrupts must be disabled! |
; destroys all general registers |
; interrupts remain disabled |
mov ebp, eax |
shl eax, 8 |
.1: |
mov edx, [0x80000+eax+0xBC] |
test edx, edx |
jz .ret |
; read buffer header |
push ecx |
push eax |
push eax |
mov eax, ebp |
mov ebx, esp |
mov ecx, 8 |
call read_process_memory |
cmp eax, ecx |
jz @f |
add esp, 12 |
jmp .ret |
@@: |
cmp dword [ebx], 0 |
jg @f |
.2: |
pop ecx |
pop ecx |
pop ecx |
sti |
call change_task |
cli |
jmp .1 |
@@: |
mov ecx, [ebx+8] |
add ecx, [ebx+4] |
cmp ecx, [ebx] |
ja .2 |
; advance buffer position |
push ecx |
mov ecx, 4 |
sub ebx, ecx |
mov eax, ebp |
add edx, ecx |
call write_process_memory |
pop eax |
; write message |
mov eax, ebp |
add edx, ecx |
add edx, [ebx+8] |
add ebx, 20 |
pop ecx |
pop ecx |
pop ecx |
call write_process_memory |
; new debug event |
mov eax, ebp |
shl eax, 8 |
or byte [0x80000+eax+0xA8+1], 1 ; set flag 100h |
.ret: |
ret |
/kernel/trunk/core/newproce.inc |
---|
60,6 → 60,7 |
;input: |
; eax - pointer to filename |
; ebx - parameters to pass |
; edx - flags |
;result: |
; eax - pid of new process |
; or 0 if call fails. |
231,6 → 232,7 |
;input: |
; eax - pointer to filename |
; ebx - parameters to pass |
; edx - flags |
;result: |
; eax - pid of new process |
; or 0 if call fails. |
546,6 → 548,13 |
mov ebx,[new_process_place] |
shl ebx,5 |
mov [0x3000+ebx+0xa],byte 0 ;set process state - running |
; set if debuggee |
test byte [esp+28], 1 |
jz .no_debug |
mov [0x3000+ebx+0xa],byte 1 ;set process state - suspended |
mov eax,[0x3000] |
mov [0x80000+ebx*8+0xac],eax ;set debugger PID - current |
.no_debug: |
mov esi,new_process_running |
call sys_msg_board_str ;output information about succefull startup |
563,6 → 572,7 |
; ecx=thread stack value |
;result: |
; eax=pid |
xor edx,edx ; flags=0 |
pushad |
cmp eax,1 |
1165,6 → 1175,7 |
;eax - file name (kernel address) |
;ebx - file name length |
;ecx - work area (kernel address) |
;edx - flags |
;ebp - parameters |
mov [appl_path],edi |
pushad |
1355,3 → 1366,5 |
sti |
ret |
end if |
include 'debug.inc' |
/kernel/trunk/core/sched.inc |
---|
4,8 → 4,7 |
align 32 |
irq0: |
pushad |
push ds es |
save_ring3_context |
mov ax, os_data |
mov ds, ax |
mov es, ax |
45,6 → 44,7 |
.waiting_for_termination: |
.waiting_for_reuse: |
.waiting_for_event: |
.suspended: |
cmp ebx, [0x3004] |
jb @f |
mov edi, 0x3000 |
55,6 → 55,10 |
inc ebx |
mov al, byte [edi+0xA] |
cmp al, 1 |
jz .suspended |
cmp al, 2 |
jz .suspended |
cmp al, 3 |
je .waiting_for_termination |
cmp al, 4 |
101,8 → 105,7 |
inc [context_counter] ;noname & halyavin |
@@: |
pop es ds |
popad |
restore_ring3_context |
iret |
/kernel/trunk/core/sys32.inc |
---|
164,6 → 164,17 |
dd i40 |
endg |
macro save_ring3_context |
{ |
push ds es |
pushad |
} |
macro restore_ring3_context |
{ |
popad |
pop es ds |
} |
; simply return control to interrupted process |
unknown_interrupt: |
iret |
172,6 → 183,7 |
{ |
forward |
e#num : |
save_ring3_context |
mov bl, num |
jmp exc_c |
} |
181,6 → 193,7 |
forward |
e#num : |
add esp, 4 |
save_ring3_context |
mov bl, num |
jmp exc_c |
} |
193,6 → 206,16 |
mov ds, ax |
mov es, ax |
; test if debugging |
cli |
mov eax, [0x3000] |
shl eax, 8 |
mov eax, [0x80000+eax+0xAC] |
test eax, eax |
jnz .debug |
sti |
; not debuggee => say error and terminate |
add esp, 28h |
movzx eax, bl |
mov [error_interrupt], eax |
call show_error_parameters |
202,6 → 225,25 |
jmp change_task |
.debug: |
; we are debugged process, notify debugger and suspend ourself |
; eax=debugger PID |
movzx ecx, bl |
push ecx |
mov ecx, [0x3010] |
push dword [ecx+4] ; PID of current process |
push 12 |
pop ecx |
push 1 ; 1=exception |
call debugger_notify |
pop ecx |
pop ecx |
pop ecx |
mov edx, [0x3010] |
mov byte [edx+0xA], 1 ; suspended |
call change_task |
restore_ring3_context |
iretd |
;;;;;;;;;;;;;;;;;;;;;;; |
;; FPU ERROR HANDLER ;; |
209,11 → 251,8 |
align 4 |
e7: |
save_ring3_context |
clts |
push eax |
push ds es |
mov ax, os_data |
mov ds, ax |
mov es, ax |
232,10 → 271,7 |
frstor [eax+0x10] |
@@: |
mov [eax + 0x7f], byte 1 |
pop es ds |
pop eax |
restore_ring3_context |
iret |
iglobal |
320,7 → 356,7 |
{ |
forward |
p_irq#num : |
pushad |
save_ring3_context |
mov edi, num |
jmp irq_c |
} |
328,58 → 364,48 |
irqh 2,5,7,8,9,10,11,14,15 |
irq_c: |
push ds es |
mov ax, os_data |
mov ds, ax |
mov es, ax |
call irqhandler |
pop es ds |
popad |
restore_ring3_context |
iret |
p_irq6: |
pushad |
push ds es |
save_ring3_context |
mov ax, os_data |
mov ds, ax |
mov es, ax |
call fdc_irq |
call ready_for_next_irq |
pop es ds |
popad |
restore_ring3_context |
iret |
p_irq3: |
pushad |
push ds es |
save_ring3_context |
mov ax, os_data |
mov ds, ax |
mov es, ax |
call check_mouse_data_com2 |
pop es ds |
popad |
restore_ring3_context |
iret |
p_irq4: |
pushad |
push ds es |
save_ring3_context |
mov ax, os_data |
mov ds, ax |
mov es, ax |
call check_mouse_data_com1 |
pop es ds |
popad |
restore_ring3_context |
iret |
p_irq12: |
pushad |
push ds es |
save_ring3_context |
mov ax, os_data |
mov ds, ax |
mov es, ax |
call check_mouse_data_ps2 |
pop es ds |
popad |
restore_ring3_context |
iret |
ready_for_next_irq: |
396,8 → 422,7 |
ret |
irqD: |
pushad |
push ds es |
save_ring3_context |
mov ax, os_data |
mov ds, ax |
mov es, ax |
412,8 → 437,8 |
mov dx,0x20 |
out dx,al |
pop es ds |
popad |
restore_ring3_context |
iret |
650,12 → 675,13 |
call sys_msg_board_str |
pop esi |
@@: |
cli |
cmp [application_table_status],0 |
je term9 |
sti |
call change_task |
jmp terminate |
jmp @b |
term9: |
call set_application_table_status |
752,6 → 778,23 |
rep stosd |
popa |
; debuggee test |
pushad |
mov edi, esi |
shl edi, 5 |
mov eax, [0x80000+edi*8+0xAC] |
test eax, eax |
jz .nodebug |
push 8 |
pop ecx |
push dword [0x3000+edi+0x4] ; PID |
push 2 |
call debugger_notify |
pop ecx |
pop ecx |
.nodebug: |
popad |
pusha ; at 0x80000+ |
mov edi,esi |
shl edi,8 |
863,6 → 906,25 |
mov edi,esi ; do not run this process slot |
shl edi, 5 |
mov [edi+0x300A],byte 9 |
; debugger test - terminate all debuggees |
mov eax, 2 |
mov ecx, 0x80000+2*0x100+0xAC |
.xd0: |
cmp eax, [0x3004] |
ja .xd1 |
cmp dword [ecx], esi |
jnz @f |
and dword [ecx], 0 |
pushad |
xchg eax, ebx |
mov eax, 2 |
call sys_system |
popad |
@@: |
inc eax |
add ecx, 0x100 |
jmp .xd0 |
.xd1: |
; call systest |
sti ; .. and life goes on |
/kernel/trunk/core/syscall.inc |
---|
8,6 → 8,7 |
i40: |
push ds es |
pushad |
cld |
mov ax,word os_data |
mov ds,ax |
136,9 → 137,9 |
dd sys_process_def ; 66-Process definitions - keyboard |
dd sys_window_move ; 67-Window move or resize |
dd sys_internal_services ; 68-Some internal services |
dd sys_debug_services ; 69-Debug |
times 255 - ( ($-servetable) /4 ) dd undefined_syscall |
dd sys_end ; -1-end application |
endg |
/kernel/trunk/fs/fs.inc |
---|
318,6 → 318,7 |
mov ebx,[ebx+0x10] |
add ebx,[esp+12] |
no_fl_start_param: |
mov edx,[esp+16] ; flags |
call start_application_fl |
440,6 → 441,7 |
add ebx,[esp+12] |
no_flp_start_param: |
mov edx,[esp+16] ; flags |
call start_application_floppy |
778,6 → 780,7 |
mov ebp,[ebp+0x10] |
add ebp,[esp+12] |
no_hd_start_param: |
mov edx,[esp+16] ; flags |
call start_application_hd |
/kernel/trunk/gui/event.inc |
---|
154,6 → 154,18 |
ret |
no_stack_event: |
test byte [edi+1], 1 ; DEBUG |
jz no_debug_event |
mov eax, [0x3000] |
shl eax, 8 |
test [eax+0x80000+0xA8+1], byte 1 |
jz no_debug_event |
and byte [eax+0x80000+0xA8+1], not 1 |
popad |
mov eax, 9 |
ret |
no_debug_event: |
cmp dword [edi], 0xFFFF |
jbe no_events |
/kernel/trunk/hid/keyboard.inc |
---|
30,8 → 30,7 |
align 4 |
irq1: |
pushad |
push ds es |
save_ring3_context |
mov ax, os_data |
mov ds, ax |
mov es, ax |
212,8 → 211,7 |
mov al,0x20 ; ready for next irq |
out 0x20,al |
pop es ds |
popad |
restore_ring3_context |
iret |
set_lights: |
/kernel/trunk/kernel.asm |
---|
728,6 → 728,8 |
cmp al,1 |
jne no_load_vrr_m |
mov eax,vrr_m |
xor ebx,ebx ; no parameters |
xor edx,edx ; no flags |
call start_application_fl |
cmp eax,2 ; if vrr_m app found (PID=2) |
je first_app_found |
734,6 → 736,8 |
no_load_vrr_m: |
mov eax,firstapp |
xor ebx,ebx ; no parameters |
xor edx,edx ; no flags |
call start_application_fl |
cmp eax,2 ; continue if a process has been loaded |
3108,6 → 3112,8 |
cmp [ctrl_alt_del], 1 |
jne nocpustart |
mov eax, cpustring |
xor ebx,ebx ; no parameters |
xor edx,edx ; no flags |
call start_application_fl |
mov [ctrl_alt_del], 0 |
nocpustart: |
4570,6 → 4576,7 |
add ebx,[edi] |
noapppar: |
; call start_application_fl |
xor edx,edx ; compatibility - flags=0 |
call new_start_application_fl |
mov [esp+36],eax |
ret |
4604,7 → 4611,8 |
add edi,0x10 |
add eax,[edi] |
add ecx,[edi] |
mov ebp,0 |
xor ebp,ebp |
xor edx,edx ; compatibility - flags=0 |
call start_application_hd |
mov [esp+36],eax |
ret |