12,205 → 12,18 |
;; ;; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
|
system_shutdown: ; shut down the system |
call stop_all_services |
|
push 3 ; stop playing cd |
pop eax |
call sys_cd_audio |
cld |
|
mov al,[0x2f0000+0x9030] |
cmp al,1 |
jl no_shutdown_parameter |
cmp al,4 |
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 |
; 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 |
lea esi,[eax+220] ; x end |
sub eax,220 ; x start |
|
mov ebx,[ScreenHeight] |
shr ebx,1 |
mov [shutdownpos],ebx |
lea ebp,[ebx+105] ; y end |
sub ebx,120 ; y start |
|
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 |
cmp eax,esi |
jnz sdnewpix2 |
; horizontal loop end |
|
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 |
shl eax,16 |
mov ax,word [shutdownpos] |
push eax |
sub eax,(220-27)*10000h + 105 |
mov ebx,0xffff00 |
mov ecx,version |
push 34 |
pop edx |
call dtext |
|
; b) variants |
add eax,105+33 |
push 6 |
pop esi |
; mov ebx,0xffffff |
mov bl,0xFF |
mov ecx,shutdowntext |
mov dl,40 |
newsdt: |
call dtext |
add eax,10 |
add ecx,edx |
dec esi |
jnz newsdt |
|
; 3) load & display rose.txt |
mov eax,rosef-std_application_base_address ; load rose.txt |
xor ebx,ebx |
push 2 |
pop ecx |
mov edx,0x90000 |
push edx |
push 12 |
pop esi |
push edi ; may be destroyed |
|
pushad |
push eax |
call file_system_lfn ; by SPraid fileread |
pop eax |
popad |
pop edi |
|
pop ecx |
inc ecx ; do not display stars from rose.txt |
pop eax |
add eax,20*10000h - 110 |
|
mov ebx,0x00ff00 |
push 27 |
pop edx |
|
nrl: |
call dtext |
; sub ebx,0x050000 |
ror ebx, 16 |
sub bl, 0x05 |
ror ebx, 16 |
add eax,8 |
add ecx,31 |
cmp cx,word 0x0001+25*31 |
jnz nrl |
|
call checkVga_N13 |
|
yes_shutdown_param: |
cli |
|
mov eax,kernel ; load kernel.mnt to 0x8000:0 |
push 12 |
pop esi |
xor ebx,ebx |
or ecx,-1 |
mov edx,0x80000 |
call fileread |
|
mov esi,restart_kernel_4000+0x10000 ; move kernel re-starter to 0x4000:0 |
mov edi,0x40000 |
mov ecx,1000 |
rep movsb |
|
mov eax,0x2F0000 ; restore 0x0 - 0xffff |
xor ebx,ebx |
mov ecx,0x10000 |
call memmove |
|
call restorefatchain |
|
mov al, 0xFF |
out 0x21, al |
out 0xA1, al |
|
mov word [0x467+0],pr_mode_exit-0x10000 |
mov word [0x467+2],0x1000 |
|
mov al,0x0F |
out 0x70,al |
mov al,0x05 |
out 0x71,al |
|
mov al,0xFE |
out 0x64,al |
hlt |
|
use16 |
|
align 4 |
pr_mode_exit: |
org $-0x10000 |
|
; setup stack |
mov ax, 3000h |
mov ax, 0x3000 |
mov ss, ax |
mov esp, 0EC00h |
mov esp, 0x0EC00 |
; setup ds |
push cs |
pop ds |
|
lidt [old_ints_h-0x10000] |
lidt [old_ints_h] |
;remap IRQs |
mov al,0x11 |
out 0x20,al |
307,90 → 120,64 |
rdelay: |
ret |
|
iglobal |
kernel db 'KERNEL MNT' |
; shutdown_parameter db 0 |
endg |
floppy_write: ; write diskette image to physical floppy |
|
restart_kernel: |
cmp [flm],byte 1 |
je fwwritedone |
mov [flm],byte 1 |
|
mov ax,0x0003 ; set text mode for screen |
int 0x10 |
xor ax, ax ; reset drive |
xor dx, dx |
int 0x13 |
|
jmp 0x4000:0000 |
mov cx,0x0001 ; startcyl,startsector |
xor dx, dx ; starthead,drive |
mov ax, 80*2 ; read no of sect |
|
fwwrites: |
push ax |
|
restart_kernel_4000: |
cli |
; move 1mb+ -> 0:a000 |
|
; mov di,0x1000 ; load kernel image from 0x8000:0 -> 0x1000:0 |
; |
; new_kernel_block_move: |
; |
; mov ebx,0 |
; |
; new_kernel_byte_move: |
; |
; mov ax,di |
; add ax,0x7000 |
; mov es,ax |
; mov dl,[es:bx] |
; mov es,di |
; mov [es:bx],dl |
; |
; inc ebx |
; cmp ebx,65536 |
; jbe new_kernel_byte_move |
; |
; add di,0x1000 |
; cmp di,0x2000 |
; jbe new_kernel_block_move |
pusha |
mov si, fwmovedesc |
mov cx,256*18 |
mov ah,0x87 |
push ds |
pop es |
mov cx, 0x8000 |
push cx |
mov ds, cx |
int 0x15 |
add dword [fwmovedesc+0x12], 512*18 |
popa |
|
xor si, si |
xor di, di |
rep movsw |
push 0x9000 |
pop ds |
push 0x2000 |
pop es |
pop cx |
rep movsw |
mov es,si |
fwnewwrite: |
mov bx,0xa000 ; es:bx -> data area |
mov ax,0x0300+18 ; read, no of sectors to read |
int 0x13 |
|
wbinvd ; write and invalidate cache |
test ah, ah |
jz fwgoodwrite |
|
; mov ax,0x1000 |
; mov es,ax |
; mov ax,0x3000 |
; mov ss,ax |
; mov sp,0xec00 |
; restore timer |
mov al, 00110100b |
out 43h, al |
jcxz $+2 |
mov al, 0xFF |
out 40h, al |
jcxz $+2 |
out 40h, al |
jcxz $+2 |
sti |
inc si |
cmp si,10 |
jnz fwnewwrite |
|
; (hint by Black_mirror) |
; We must read data from keyboard port, |
; because there may be situation when previous keyboard interrupt is lost |
; (due to return to real mode and IRQ reprogramming) |
; and next interrupt will not be generated (as keyboard waits for handling) |
in al, 0x60 |
; can't access diskette - return |
pop ax |
ret |
|
; bootloader interface |
push 0x1000 |
pop ds |
mov si, kernel_restart_bootblock-0x10000 |
mov ax, 'KL' |
jmp 0x1000:0000 |
fwgoodwrite: |
inc dh |
cmp dh,2 |
jnz fwbb2 |
mov dh,0 |
inc ch |
fwbb2: |
pop ax |
dec ax |
jnz fwwrites |
ret |
|
APM_PowerOff: |
mov ax, 5304h |
433,113 → 220,55 |
;!!!!!!!!!!!!!!!!!!!!!!!! |
fwwritedone: |
ret |
org $+0x10000 |
flm db 0 |
org $-0x10000 |
|
floppy_write: ; write diskette image to physical floppy |
restart_kernel: |
|
cmp [flm-0x10000],byte 1 |
je fwwritedone |
mov [flm-0x10000],byte 1 |
mov ax,0x0003 ; set text mode for screen |
int 0x10 |
jmp 0x4000:0000 |
|
xor ax, ax ; reset drive |
xor dx, dx |
int 0x13 |
restart_kernel_4000: |
cli |
|
mov cx,0x0001 ; startcyl,startsector |
; mov dx,0x0000 ; starthead,drive |
xor dx, dx |
mov ax, 80*2 ; read no of sect |
|
fwwrites: |
push ax |
|
; move 1mb+ -> 0:a000 |
|
pusha |
mov si,fwmovedesc -0x10000 |
mov cx,256*18 |
mov ah,0x87 |
push ds |
pop es |
int 0x15 |
add dword [fwmovedesc-0x10000+0x12], 512*18 |
popa |
|
mov cx, 0x8000 |
push cx |
mov ds, cx |
xor si,si |
mov es,si |
fwnewwrite: |
mov bx,0xa000 ; es:bx -> data area |
mov ax,0x0300+18 ; read, no of sectors to read |
int 0x13 |
xor di, di |
rep movsw |
push 0x9000 |
pop ds |
push 0x2000 |
pop es |
pop cx |
rep movsw |
|
test ah, ah |
jz fwgoodwrite |
wbinvd ; write and invalidate cache |
|
inc si |
cmp si,10 |
jnz fwnewwrite |
mov al, 00110100b |
out 43h, al |
jcxz $+2 |
mov al, 0xFF |
out 40h, al |
jcxz $+2 |
out 40h, al |
jcxz $+2 |
sti |
|
; can't access diskette - return |
pop ax |
ret |
; (hint by Black_mirror) |
; We must read data from keyboard port, |
; because there may be situation when previous keyboard interrupt is lost |
; (due to return to real mode and IRQ reprogramming) |
; and next interrupt will not be generated (as keyboard waits for handling) |
in al, 0x60 |
|
fwgoodwrite: |
inc dh |
cmp dh,2 |
jnz fwbb2 |
mov dh,0 |
inc ch |
fwbb2: |
pop ax |
dec ax |
jnz fwwrites |
ret |
org $+0x10000 |
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 |
db 0xff,0xff,0x0,0xa0,0x00,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 |
org $-0x10000 |
use32 |
org $+0x10000 |
uglobal |
shutdownpos dd 0x0 |
endg |
; bootloader interface |
push 0x1000 |
pop ds |
mov si, kernel_restart_bootblock |
mov ax, 'KL' |
jmp 0x1000:0000 |
|
iglobal |
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 if lang eq ru |
shutdowntext: |
db "¥§®¯ ᮥ ¢ëª«î票¥ ª®¬¯ìîâ¥à ¨«¨ " |
db ' ' |
db '1) ®åà ¨âì à ¬¤¨áª ¤¨áª¥âã ' |
db '2) APM - ¢ëª«î票¥ ¯¨â ¨ï ' |
db '3) ¥à¥§ £à㧪 á¨á⥬ë ' |
db '4) ¥áâ àâ ï¤à ¨§ ' |
else |
shutdowntext: |
db "SIE KOENNEN DEN COMPUTER NUN AUSSCHALTEN" |
db ' ' |
db '1) RAMDISK AUF DISK SPEICHERN ' |
db '2) APM - AUSSCHALTEN ' |
db '3) NEUSTARTEN ' |
db '4) KERNEL NEU STARTEN ' |
end if |
rosef: |
dd 0,0,0,1024,0x90000-std_application_base_address |
db '/rd/1/ROSE.TXT',0 |
endg |
|