10,9 → 10,9 |
|
system_shutdown: ; shut down the system |
|
mov eax,3 ; stop playing cd |
push 3 ; stop playing cd |
pop eax |
call sys_cd_audio |
cli |
cld |
|
mov al,[0x2f0000+0x9030] |
19,123 → 19,120 |
cmp al,1 |
jl no_shutdown_parameter |
cmp al,4 |
jg no_shutdown_parameter |
jmp yes_shutdown_param |
jle yes_shutdown_param |
no_shutdown_parameter: |
|
movzx ecx,word [0x2f0000+0x900A] |
movzx esi,word [0x2f0000+0x900C] |
imul ecx,esi ;[0xfe04] |
; mov ecx,0x500000/4 ;3fff00/4 ; darken screen |
push ecx |
mov esi,[0xfe80] |
cmp esi,32*0x100000 |
jbe no_darken_screen |
mov edi,16*0x100000 |
sdnewpix: |
mov eax,[esi] |
add esi,4 |
shr eax,1 |
and eax,0x7f7f7f7f |
stosd |
loop sdnewpix |
pop ecx |
mov esi,16*0x100000 |
mov edi,[0xfe80] |
cld |
rep movsd |
no_darken_screen: |
; movzx ecx,word [0x2f0000+0x900A] |
; movzx esi,word [0x2f0000+0x900C] |
; imul ecx,esi ;[0xfe04] |
;; mov ecx,0x500000/4 ;3fff00/4 ; darken screen |
; push ecx |
; mov esi,[0xfe80] |
; cmp esi,32*0x100000 |
; jbe no_darken_screen |
; mov edi,16*0x100000 |
; push esi edi |
; sdnewpix: |
; lodsd |
; shr eax,1 |
; and eax,0x7f7f7f7f |
; stosd |
; loop sdnewpix |
; pop ecx |
; pop esi edi |
; rep movsd |
; no_darken_screen: |
|
; read shutdown code: |
; 1) display shutdown "window" |
|
mov eax,[0xfe00] |
shr eax,1 |
sub eax,220 |
lea esi,[eax+220] ; x end |
sub eax,220 ; x start |
|
mov ebx,[0xfe04] |
shr ebx,1 |
mov [shutdownpos],ebx |
sub ebx,120 |
lea ebp,[ebx+105] ; y end |
sub ebx,120 ; y start |
|
mov edi,1 |
xor edi,edi |
inc edi ; force putpixel & dtext |
mov ecx,0x0000ff |
|
; vertical loop begin |
sdnewpix1: |
push eax ; save x start |
|
; horizontal loop begin |
sdnewpix2: |
|
call [putpixel] |
|
inc eax |
mov esi,[0xfe00] |
shr esi,1 |
add esi,220 |
cmp eax,esi |
jnz sdnewpix2 |
; horizontal loop end |
|
dec ecx |
dec ecx ; color |
pop eax ; restore x start |
|
inc ebx ; advance y pos |
cmp ebx,ebp |
jnz sdnewpix1 |
; vertical loop end |
|
; 2) display text strings |
; a) version |
mov eax,[0xfe00] |
shr eax,1 |
sub eax,220 |
|
inc ebx |
|
mov edx,[shutdownpos] |
add edx,105 |
cmp ebx,edx |
jnz sdnewpix2 |
|
|
mov esi,[0xfe00] ; menuet version |
shr esi,1 |
sub esi,220 |
add esi,27 |
shl esi,16 |
mov eax,esi |
add eax,[shutdownpos] |
sub eax,105 |
shl eax,16 |
mov ax,word [shutdownpos] |
push eax |
sub eax,(220-27)*10000h + 105 |
mov ebx,0xffff00 |
mov ecx,version |
mov edx,34 |
mov edi,1 |
push 34 |
pop edx |
call dtext |
|
mov esi,[0xfe00] ; 'it is safe..' |
shr esi,1 |
sub esi,220 |
add esi,27 |
shl esi,16 |
mov eax,esi |
add eax,[shutdownpos] |
add eax,33 |
mov esi,6 |
mov ebx,0xffffff |
; b) variants |
add eax,105+33 |
push 6 |
pop esi |
; mov ebx,0xffffff |
mov bl,0xFF |
mov ecx,shutdowntext |
mov edx,40 |
mov edi,1 |
mov dl,40 |
newsdt: |
call dtext |
add eax,10 |
add ecx,40 |
add ecx,edx |
dec esi |
jnz newsdt |
|
; 3) load & display rose.txt |
mov eax,rosef ; load rose.txt |
mov ebx,0 |
mov ecx,16800 |
xor ebx,ebx |
push 2 |
pop ecx |
mov edx,0x90000 |
mov esi,12 |
push edx |
push 12 |
pop esi |
push edi ; may be destroyed |
call fileread |
pop edi |
|
mov esi,[0xfe00] ; draw rose |
shr esi,1 |
add esi,20 |
shl esi,16 |
mov eax,esi |
add eax,[shutdownpos] |
sub eax,110 |
pop ecx |
inc ecx ; do not display stars from rose.txt |
pop eax |
add eax,20*10000h - 110 |
|
mov ebx,0x00ff00 |
mov ecx,0x90001 |
mov edx,27 |
mov edi,1 |
push 27 |
pop edx |
|
nrl: |
call dtext |
142,19 → 139,19 |
sub ebx,0x050000 |
add eax,8 |
add ecx,31 |
cmp ecx,dword 0x90001+25*31 |
cmp cx,word 0x0001+25*31 |
jnz nrl |
|
call checkEgaCga |
|
yes_shutdown_param: |
|
cli |
|
mov eax,kernel ; load kernel.mnt to 0x8000:0 |
mov esi,12 |
mov ebx,0 |
mov ecx,-1 |
push 12 |
pop esi |
xor ebx,ebx |
or ecx,-1 |
mov edx,0x80000 |
call fileread |
|
161,19 → 158,17 |
mov esi,restart_kernel_4000 ; move kernel re-starter to 0x4000:0 |
mov edi,0x40000 |
mov ecx,1000 |
cld |
rep movsb |
|
mov eax,0x2F0000 ; restore 0x0 - 0xffff |
mov ebx,0x0000 |
mov ecx,0xffff |
xor ebx,ebx |
mov ecx,0x10000 |
call memmove |
|
call restorefatchain |
|
mov eax,pr_mode_exit |
mov [0x467+0],ax |
mov [0x467+2],word 0x1000 |
mov word [0x467+0],pr_mode_exit-0x10000 |
mov word [0x467+2],0x1000 |
|
mov al,0x0F |
out 0x70,al |
195,26 → 190,7 |
; setup ds |
push cs |
pop ds |
; mov ax,1000 |
; mov ds,ax |
; mov es,ax |
; mov fs,ax |
; mov gs,ax |
; mov ss,ax |
; mov bl,[shutdown_parameter] |
; mov [es:shutdown_parameter-0x10000],bl |
|
jmp real_mode-0x10000 |
|
old_ints_h: |
dw 4*0x20 |
dd 0 |
dw 0 |
|
rdelay: |
ret |
real_mode: |
|
lidt [old_ints_h-0x10000] |
;remap IRQs |
mov al,0x11 |
249,14 → 225,20 |
out 0xA1,al |
sti |
|
jmp temp_3456 |
temp_3456: |
xor ax,ax |
mov es,ax |
mov al,byte [es:0x9030] |
cmp al,1 |
jl nbw |
cmp al,4 |
jle nbw32 |
|
nbw: |
xor ax,ax |
in al,0x60 |
call pause_key |
cmp al,7 |
jge nbw |
cmp al,6 |
jae nbw |
mov bl,al |
nbw2: |
in al,0x60 |
266,7 → 248,7 |
cmp al,240 ;ax,240 |
jne nbw31 |
mov al,bl |
dec al |
dec ax |
jmp nbw32 |
nbw31: |
add bl,128 |
276,45 → 258,40 |
|
nbw32: |
|
cmp al,1 ; write floppy |
jne no_floppy_write |
dec ax ; 1 = write floppy |
js nbw |
jnz no_floppy_write |
call floppy_write |
jmp temp_3456 ;nbw |
no_floppy_write: |
|
cmp al,2 ; poweroff |
jne no_apm_off |
dec ax ; 2 = power off |
jnz no_apm_off |
call APM_PowerOff |
jmp $ |
no_apm_off: |
|
cmp al,3 ; boot |
jnz no_sys_boot |
mov ax,0x0040 |
mov ds,ax |
dec ax ; 3 = reboot |
jnz restart_kernel ; 4 = restart kernel |
push 0x40 |
pop ds |
mov word[0x0072],0x1234 |
jmp 0xF000:0xFFF0 |
no_sys_boot: |
|
cmp al,4 ; restart kernel |
je restart_kernel |
|
temp_3456: |
push word 0x0000 |
pop es |
mov al,byte [es:0x9030] |
cmp al,1 |
jl nbw |
cmp al,4 |
jg nbw |
jmp nbw32 |
|
; jmp nbw |
pause_key: |
mov ecx,100 |
mov cx,100 |
pause_key_1: |
loop pause_key_1 |
ret |
|
old_ints_h: |
dw 0x400 |
dd 0 |
dw 0 |
|
rdelay: |
ret |
|
iglobal |
kernel db 'KERNEL MNT' |
; shutdown_parameter db 0 |
361,10 → 338,10 |
xor si, si |
xor di, di |
rep movsw |
mov ax, 0x9000 |
mov ds, ax |
mov ax, 0x2000 |
mov es, ax |
push 0x9000 |
pop ds |
push 0x2000 |
pop es |
pop cx |
rep movsw |
|
434,93 → 411,72 |
mov cx,3 |
int 0x15 |
;!!!!!!!!!!!!!!!!!!!!!!!! |
fwwritedone: |
ret |
uglobal |
|
flm db 0 |
endg |
|
floppy_write: ; write diskette image to physical floppy |
|
pusha |
|
mov ax,0x1000 |
mov es,ax |
cmp [es:flm-0x10000],byte 1 |
cmp [flm-0x10000],byte 1 |
je fwwritedone |
mov [es:flm-0x10000],byte 1 |
mov [flm-0x10000],byte 1 |
|
mov ax,0x0000 ; reset drive |
mov dx,0x0000 |
xor ax, ax ; reset drive |
xor dx, dx |
int 0x13 |
|
mov cx,0x0001 ; startcyl,startsector |
mov dx,0x0000 ; starthead,drive |
push word 80*2 ; read no of sect |
; mov dx,0x0000 ; starthead,drive |
xor dx, dx |
mov ax, 80*2 ; read no of sect |
|
fwwrites: |
pusha |
push ax |
|
; move 1mb+ -> 0:a000 |
|
pusha |
mov si,fwmovedesc -0x10000 |
push word 0x1000 |
pop es |
mov cx,256*18 |
mov ah,0x87 |
push ds |
pop es |
int 0x15 |
mov eax,[es:fwmovedesc-0x10000+0x12] |
add eax,512*18 |
mov [es:fwmovedesc-0x10000+0x12],eax |
add dword [fwmovedesc-0x10000+0x12], 512*18 |
popa |
|
xor si,si |
mov es,si |
fwnewwrite: |
push word 0x0 |
pop es |
mov bx,0xa000 ; es:bx -> data area |
mov ax,0x0300+18 ; read, no of sectors to read |
int 0x13 |
|
cmp ah,0 |
test ah, ah |
jz fwgoodwrite |
|
add si,1 |
inc si |
cmp si,10 |
jnz fwnewwrite |
|
add esp,32+2 |
|
popa ; can't access diskette |
; can't access diskette - return |
pop ax |
ret |
|
fwgoodwrite: |
|
popa |
|
inc dh |
cmp dh,2 |
jnz fwbb2 |
mov dh,0 |
inc ch |
|
fwbb2: |
|
cld |
pop ax |
dec ax |
push ax |
cmp ax,0 |
jnz fwrs |
jnz fwwrites |
ret |
|
pop ax |
|
jmp fwwritedone |
fwrs: |
jmp fwwrites |
|
fwmovedesc: |
|
db 0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0 |
db 0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0 |
db 0xff,0xff,0x0,0x00,0x10,0x93,0x0,0x0 |
530,13 → 486,6 |
db 0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0 |
db 0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0 |
|
fwwritedone: |
|
popa |
|
ret |
|
|
use32 |
|
uglobal |
544,14 → 493,16 |
endg |
|
iglobal |
;shutdowntext: |
; db "IT'S SAFE TO POWER OFF COMPUTER OR " |
; db ' ' |
; db '1) SAVE RAMDISK TO FLOPPY ' |
; db '2) APM - POWEROFF ' |
; db '3) REBOOT ' |
; db '4) RESTART KERNEL ' |
if lang eq en |
shutdowntext: |
db "IT'S SAFE TO POWER OFF COMPUTER OR " |
db ' ' |
db '1) SAVE RAMDISK TO FLOPPY ' |
db '2) APM - POWEROFF ' |
db '3) REBOOT ' |
db '4) RESTART KERNEL ' |
else |
shutdowntext: |
db "¥§®¯ ᮥ ¢ëª«î票¥ ª®¬¯ìîâ¥à ¨«¨ " |
db ' ' |
db '1) ®åà ¨âì à ¬¤¨áª ¤¨áª¥âã ' |
558,6 → 509,7 |
db '2) APM - ¢ëª«î票¥ ¯¨â ¨ï ' |
db '3) ¥à¥§ £à㧪 á¨á⥬ë ' |
db '4) ¥áâ àâ ï¤à ¨§ ' |
end if |
rosef: |
db 'ROSE TXT' |
endg |