jak se vratit po resetu na spravne misto... ve vm86 se to nepodari! bud je zapotrebi real nebo ring0, ale to jsem nezkousel (proc asi):
[bits 16]
[org 100h]
[section .bss]
stack_end:
resw 50
stack_begin:
[section .data]
multitask: db 'Program nelze spustit ve virtualnim rezimu!',13,10,'$'
reset_msg: db 'Pokud se cinnost pocitace zastavi pocitac vypnete!',13,10
db 'Signal reset byl zaslan procesoru... ',36
digits: db '0123456789abcdef'
model: db 'model 0x$'
revision: db ', revision 0x$'
CRLF: db 13,10,'$'
[section .text]
smsw ax
and ax,1
jz fajn
mov ah,9
mov dx,multitask
int 21h
ret ; konec programu
fajn: mov ah,9
mov dx,reset_msg
int 21h
cli
push word 40h
pop ds
mov ax,cs
mov word[67h],real
mov word[69h],ax ; 0040h:67h
mov al,0fh
out 70h,al
jmp delay
delay: mov al,0ah
out 71h,al
mov al,0fch ; shutdown processoru tj.
; 1) navrat do realneho rezimu z prot.
; 2) provede se skok dle 0040:0067 hned po resetu
out 64h,al ; nyni se provadi 'pomaly' reset
stuj: hlt ; pozastavi cinnost procesoru az
; do chvile, kdy se zresetuje
jmp stuj ; pouze pojistka pro prichod NMI
nop
real: mov ax,cs ; tady bude pokracovat nase rutina
mov ss,ax
mov ds,ax
mov es,ax ; ted jsou vsechny segm. reg rovny
mov sp,stack_begin ; nastaveni prozatimniho zasobniku
and sp,0fffch ; zarovnani ??? zkusmo
mov al,0ffh
out 64h,al ; povolit klavesnici
cld
sti
push dx ; v DX je model a revize procesoru !!!
mov ah,9
mov dx,model
int 21h ; napis model
pop ax
push ax
mov al,ah
call ByteToHex ; napis cislo modelu
mov dx,revision
mov ah,9
int 21h ; retezec revize
pop ax ; tady je vysledek
call ByteToHex ; napis cislo revize
mov ah,9
mov dx,CRLF
int 21h ; zaradkuj
mov ah,4ch
int 21h ; navrat do DOSu
ByteToHex:
push bx
push ax
push ax
mov bx,digits
shr al,4
xlatb
mov ah,0eh
int 10h ; emulace dalnopisu
pop ax
and al,0fh
xlatb
mov ah,0eh
int 10h ; emulace dalnopisu
pop ax
pop bx
ret
WordToHex:
push ax
call ByteToHex
pop ax
mov al,ah
call ByteToHex
ret
hehe, to jsem byl jeste pilna vcelka a komentoval kod ;)