--- /dev/null
+\r
+Empty8042:\r
+ .word 0x00eb,0x00eb // jmp $+2, jmp $+2\r
+ in al, 0x64\r
+ cmp al, 0xff // legacy-free machine without keyboard\r
+ jz empty_8042_ret // controllers on Intel Macs read back 0xFF\r
+ test al, 0x02\r
+ jnz x86_16_Empty8042\r
+empty_8042_ret:\r
+ ret\r
+\r
+EnableA20:\r
+ pusha\r
+ call x86_16_Empty8042\r
+ mov al, 0xD1 // command write\r
+ out 0x64, al\r
+ call x86_16_Empty8042\r
+ mov al, 0xDF // A20 on\r
+ out 0x60, al\r
+ call x86_16_Empty8042\r
+ popa\r
+ ret\r
+\r
+/*\r
+ * writestr\r
+ * si = pointer to zero terminated string\r
+ */\r
+writestr:\r
+ pushfd\r
+ pushad\r
+writestr_top:\r
+ lodsb\r
+ and al, al\r
+ jz writestr_end\r
+ call writechr\r
+ jmp short writestr_top\r
+writestr_end:\r
+ popad\r
+ popfd\r
+ ret\r
+\r
+/*\r
+ * writechr\r
+ * al = character to output\r
+ */\r
+writechr:\r
+ pushf\r
+ pusha\r
+ mov ah, 0x0E\r
+ xor bx, bx\r
+ int 0x10\r
+ popa\r
+ popf\r
+ ret\r
+\r
+//\r
+// writehex[248]: Write a hex number in (AL, AX, EAX) to the console\r
+//\r
+writehex2:\r
+ pushfd\r
+ pushad\r
+ shl eax, 24\r
+ mov cx, 2\r
+ jmp short writehex_common\r
+writehex4:\r
+ pushfd\r
+ pushad\r
+ shl eax, 16\r
+ mov cx, 4\r
+ jmp short writehex_common\r
+writehex8:\r
+ pushfd\r
+ pushad\r
+ mov cx, 8\r
+writehex_common:\r
+.loop:\r
+ rol eax, 4\r
+ push eax\r
+ and al, HEX(0F)\r
+ cmp al, 10\r
+ jae .high\r
+.low:\r
+ add al, '0'\r
+ jmp short .ischar\r
+.high:\r
+ add al, 'A'-10\r
+.ischar:\r
+ call writechr\r
+ pop eax\r
+ loop .loop\r
+ popad\r
+ popfd\r
+ ret\r
+\r
+SoftReboot:\r
+ mov ax, HEX(40)\r
+ mov ds, ax\r
+ mov si, HEX(72)\r
+\r
+ /* Set the word at location 40:72 to 1234h */\r
+ mov word ptr [si], HEX(1234)\r
+\r
+ /* and jump to location FFFF:0 in ROM */\r
+ ljmp16 HEX(0FFFF), HEX(0000)\r