| .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: |
| |