104 lines
1.8 KiB
ArmAsm
104 lines
1.8 KiB
ArmAsm
.code16
|
|
.globl vm86_code_start
|
|
.globl vm86_code_end
|
|
|
|
#define GET_OFFSET(x) ((x) - vm86_code_start + 0x100)
|
|
|
|
vm86_code_start:
|
|
movw $GET_OFFSET(hello_world), %dx
|
|
movb $0x09, %ah
|
|
int $0x21
|
|
|
|
/* prepare int 0x90 vector */
|
|
xorw %ax, %ax
|
|
movw %ax, %es
|
|
es movw $GET_OFFSET(int90_test), 0x90 * 4
|
|
es movw %cs, 0x90 * 4 + 2
|
|
|
|
/* launch int 0x90 */
|
|
|
|
int $0x90
|
|
|
|
/* test IF support */
|
|
movw $GET_OFFSET(IF_msg), %dx
|
|
movb $0x09, %ah
|
|
int $0x21
|
|
|
|
pushf
|
|
popw %dx
|
|
movb $0xff, %ah
|
|
int $0x21
|
|
|
|
cli
|
|
pushf
|
|
popw %dx
|
|
movb $0xff, %ah
|
|
int $0x21
|
|
|
|
sti
|
|
pushfl
|
|
popl %edx
|
|
movb $0xff, %ah
|
|
int $0x21
|
|
|
|
#if 0
|
|
movw $GET_OFFSET(IF_msg1), %dx
|
|
movb $0x09, %ah
|
|
int $0x21
|
|
|
|
pushf
|
|
movw %sp, %bx
|
|
andw $~0x200, (%bx)
|
|
popf
|
|
#else
|
|
cli
|
|
#endif
|
|
|
|
pushf
|
|
popw %dx
|
|
movb $0xff, %ah
|
|
int $0x21
|
|
|
|
pushfl
|
|
movw %sp, %bx
|
|
orw $0x200, (%bx)
|
|
popfl
|
|
|
|
pushfl
|
|
popl %edx
|
|
movb $0xff, %ah
|
|
int $0x21
|
|
|
|
movb $0x00, %ah
|
|
int $0x21
|
|
|
|
int90_test:
|
|
pushf
|
|
pop %dx
|
|
movb $0xff, %ah
|
|
int $0x21
|
|
|
|
movw %sp, %bx
|
|
movw 4(%bx), %dx
|
|
movb $0xff, %ah
|
|
int $0x21
|
|
|
|
movw $GET_OFFSET(int90_msg), %dx
|
|
movb $0x09, %ah
|
|
int $0x21
|
|
iret
|
|
|
|
int90_msg:
|
|
.string "INT90 started\n$"
|
|
|
|
hello_world:
|
|
.string "Hello VM86 world\n$"
|
|
|
|
IF_msg:
|
|
.string "VM86 IF test\n$"
|
|
|
|
IF_msg1:
|
|
.string "If you see a diff here, your Linux kernel is buggy, please update to 2.4.20 kernel\n$"
|
|
|
|
vm86_code_end:
|