]> git.saurik.com Git - apple/boot.git/blobdiff - i386/libsaio/bios.s
boot-111.tar.gz
[apple/boot.git] / i386 / libsaio / bios.s
index 4be6b70a249a5e558cc98fe10d25498d4d46cae7..4caa9df66b937f3ba2537442386a373f6d6ba201 100644 (file)
@@ -3,21 +3,22 @@
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
- * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
- * Reserved.  This file contains Original Code and/or Modifications of
- * Original Code as defined in and that are subject to the Apple Public
- * Source License Version 1.1 (the "License").  You may not use this file
- * except in compliance with the License.  Please obtain a copy of the
- * License at http://www.apple.com/publicsource and read it before using
- * this file.
+ * Copyright (c) 1999-2003 Apple Computer, Inc.  All Rights Reserved.
+ * 
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
  * 
  * The Original Code and all software distributed under the License are
- * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
- * License for the specific language governing rights and limitations
- * under the License.
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
  * 
  * @APPLE_LICENSE_HEADER_END@
  */
  * Harness for calling real-mode BIOS functions.
  */
 
-#include "legacy/asm.h"
-
-#define data32 .byte 0x66
-#define addr32 .byte 0x67
-
-#define O_INT  0
-#define O_EAX  4
-#define O_EBX  8
-#define O_ECX  12
-#define O_EDX  16
-#define O_EDI  20
-#define O_ESI  24
-#define O_EBP  28
-#define O_CS   32
-#define O_DS   34
-#define O_ES   36
-#define O_FLG  38
+#include <architecture/i386/asm_help.h>
+#include "memory.h"
+
+#define data32  .byte 0x66
+#define addr32  .byte 0x67
+
+#define O_INT   0
+#define O_EAX   4
+#define O_EBX   8
+#define O_ECX   12
+#define O_EDX   16
+#define O_EDI   20
+#define O_ESI   24
+#define O_EBP   28
+#define O_CS    32
+#define O_DS    34
+#define O_ES    36
+#define O_FLG   38
 
 .data
-       .lcomm save_eax,  4,2
-       .lcomm save_edx,  4,2
-       .lcomm save_es,   2,1
-       .lcomm save_flag, 2,1
-       .lcomm new_eax,   4,2
-       .lcomm new_edx,   4,2
-       .lcomm new_es,    2,1
+    .lcomm save_eax,  4,2
+    .lcomm save_edx,  4,2
+    .lcomm save_es,   2,1
+    .lcomm save_flag, 2,1
+    .lcomm new_eax,   4,2
+    .lcomm new_edx,   4,2
+    .lcomm new_es,    2,1
 
 .text
 
  * Call real-mode BIOS INT functions.
  *
  */
-ENTRY(bios)
-       enter   $0,$0
-       pushal
-       
-       movl    8(%ebp), %edx           // address of save area
-       movb    O_INT(%edx), %al        // save int number
-       movb    %al, do_int+1
-       
-       movl    O_EBX(%edx), %ebx
-       movl    O_ECX(%edx), %ecx
-       movl    O_EDI(%edx), %edi
-       movl    O_ESI(%edx), %esi
-       movl    O_EBP(%edx), %ebp
-       movl    %edx, save_edx
-       movl    O_EAX(%edx), %eax
-       movl    %eax, new_eax
-       movl    O_EDX(%edx), %eax
-       movl    %eax, new_edx
-       movw    O_ES(%edx),  %ax
-       movl    %ax, new_es
-
-       call    EXT(_prot_to_real)
-       
-       data32
-       addr32
-       mov     new_eax, %eax
-       data32
-       addr32
-       mov     new_edx, %edx
-       data32
-       addr32
-       mov     new_es, %es
+LABEL(_bios)
+    enter   $0, $0
+    pushal
+
+    movl    8(%ebp), %edx       // address of save area
+    movb    O_INT(%edx), %al    // save int number
+    movb    %al, do_int+1
+
+    movl    O_EBX(%edx), %ebx
+    movl    O_ECX(%edx), %ecx
+    movl    O_EDI(%edx), %edi
+    movl    O_ESI(%edx), %esi
+    movl    O_EBP(%edx), %ebp
+    movl    %edx, save_edx
+    movl    O_EAX(%edx), %eax
+    movl    %eax, new_eax
+    movl    O_EDX(%edx), %eax
+    movl    %eax, new_edx
+    movw    O_ES(%edx),  %ax
+    movl    %ax, new_es
+
+    call    __prot_to_real
+
+    data32
+    addr32
+    mov     OFFSET16(new_eax), %eax
+    data32
+    addr32
+    mov     OFFSET16(new_edx), %edx
+    data32
+    addr32
+    mov     OFFSET16(new_es), %es
 
 do_int:
-       int     $0x00
-       pushf
-       data32
-       addr32
-       movl    %eax, save_eax
-       popl    %eax                        // actually pop %ax
-       addr32
-       movl    %eax, save_flag         // actually movw
-       mov     %es, %ax
-       addr32
-       movl    %eax, save_es           // actually movw
-       data32
-       call    EXT(_real_to_prot)
-       
-       movl    %edx, new_edx           // save new edx before clobbering
-       movl    save_edx, %edx
-       movl    new_edx, %eax           // now move it into buffer
-       movl    %eax, O_EDX(%edx)
-       movl    save_eax, %eax
-       movl    %eax, O_EAX(%edx)
-       movw    save_es, %ax
-       movw    %ax, O_ES(%edx)
-       movw    save_flag, %ax
-       movw    %ax, O_FLG(%edx)
-       movl    %ebx, O_EBX(%edx)
-       movl    %ecx, O_ECX(%edx)
-       movl    %edi, O_EDI(%edx)
-       movl    %esi, O_ESI(%edx)
-       movl    %ebp, O_EBP(%edx)
-       
-       popal
-       leave
-       
-       ret
-       
-/*============================================================================
- * Determines the total system memory size using various BIOS Int 15 calls.
- *
- */
-ENTRY(get_memsize)
-       enter   $0, $0                          # create frame pointer (32 bit operand/stack)
-       pushal                                          # save all registers
-
-       movl    8(%ebp), %ebx           # push input structure pointer to stack
-       pushl   %ebx
-
-       call    EXT(_prot_to_real)      # switch to real mode
-
-       ##################################################################
-       # In real mode.
-       # Do not forget the opcode overrides, since the assembler
-       # does not know we have made a transition to 16-bit operation.
-       ##################################################################
-
-       data32
-       movl    $0xE801, %eax           # Get memory size
-       clc
-       int             $0x15
-       data32
-       jnc             getmsz_e801
-
-       data32
-       movl    $0xDA88, %eax           # Get memory size
-       clc
-       int             $0x15
-       data32
-       jnc             getmsz_da88
-
-       movb    $0x8A, %ah                      # Get memory size
-       clc
-       int             $0x15
-       data32
-       jnc             getmsz_8a
-
-       movb    $0x88, %ah                      # Get memory size
-       clc
-       int             $0x15
-       data32
-       jnc             getmsz_88
-
-       xorl    %edx, %edx                      # Error, cannot get memory size
-       xorl    %eax, %eax
-
-getmsz_done:
-       data32
-       addr32
-       pushl   %eax                            # Push EAX to 32-bit stack
-
-       data32
-       call    EXT(_real_to_prot)  # Back to protected mode. EAX is modified.
-
-       ##################################################################
-       # Back to protected mode.
-       ##################################################################
-
-       popl    %eax                            # Pop EAX from stack
-       popl    %ebx                            # Pop pointer to register structure
-
-       # Copy the result to the input structure pointed to by a pointer
-       # which is on top of the stack. Write register EAX and EDX to the
-       # structure.
-
-       movl    %eax, O_EAX(%ebx)
-       movl    %edx, O_EDX(%ebx)
-
-       popal                                           # restore all registers
-       leave                                           # undo enter operator
-       ret
-
-getmsz_88:
-       orl             %eax, %eax
-       data32
-       jz              getmsz_64m
-       xorl    %edx, %edx
-
-getmsz_8a:
-       data32
-       movl    $1024, %ebx                     # Add in 1M
-       addl    %ebx, %eax
-       adcl    $0, %edx
-       data32
-       jmp             getmsz_done
-
-getmsz_64m:
-       data32
-       movl    $1, %edx
-       xorl    %eax, %eax
-       data32
-       jmp             getmsz_done
-
-getmsz_da88:
-       xor             %dh, %dh
-       movb    %cl, %dl
-       movl    %ebx, %eax
-       data32
-       jmp             getmsz_8a
-
-getmsz_e801:
-       xorl    %edx, %edx
-       orl             %ebx, %ebx
-       data32
-       jz              getmsz_88
-
-       data32
-       movl    $64, %eax
-       mul             %ebx
-
-       data32
-       movl    $16384, %ebx
-       addl    %ebx, %eax
-       adcl    $0, %edx
-
-       data32
-       jmp             getmsz_done
+    int     $0x00
+    pushf
+    data32
+    addr32
+    movl    %eax, OFFSET16(save_eax)
+    popl    %eax                         // actually pop %ax
+    addr32
+    movl    %eax, OFFSET16(save_flag)  // actually movw
+    mov     %es, %ax
+    addr32
+    movl    %eax, OFFSET16(save_es)    // actually movw
+    data32
+    call    __real_to_prot
+
+    movl    %edx, new_edx       // save new edx before clobbering
+    movl    save_edx, %edx
+    movl    new_edx, %eax       // now move it into buffer
+    movl    %eax, O_EDX(%edx)
+    movl    save_eax, %eax
+    movl    %eax, O_EAX(%edx)
+    movw    save_es, %ax
+    movw    %ax, O_ES(%edx)
+    movw    save_flag, %ax
+    movw    %ax, O_FLG(%edx)
+    movl    %ebx, O_EBX(%edx)
+    movl    %ecx, O_ECX(%edx)
+    movl    %edi, O_EDI(%edx)
+    movl    %esi, O_ESI(%edx)
+    movl    %ebp, O_EBP(%edx)
+
+    popal
+    leave
+
+    ret