[FREELDR]
[reactos.git] / reactos / boot / freeldr / freeldr / arch / realmode / helpers.inc
diff --git a/reactos/boot/freeldr/freeldr/arch/realmode/helpers.inc b/reactos/boot/freeldr/freeldr/arch/realmode/helpers.inc
new file mode 100644 (file)
index 0000000..051bdc2
--- /dev/null
@@ -0,0 +1,104 @@
+\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