Annotation of Net2/arch/i386/boot/bios.s, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Ported to boot 386BSD by Julian Elischer ([email protected]) Sept 1992
                      3:  *
                      4:  * Mach Operating System
                      5:  * Copyright (c) 1992, 1991 Carnegie Mellon University
                      6:  * All Rights Reserved.
                      7:  * 
                      8:  * Permission to use, copy, modify and distribute this software and its
                      9:  * documentation is hereby granted, provided that both the copyright
                     10:  * notice and this permission notice appear in all copies of the
                     11:  * software, derivative works or modified versions, and any portions
                     12:  * thereof, and that both notices appear in supporting documentation.
                     13:  * 
                     14:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                     15:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
                     16:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     17:  * 
                     18:  * Carnegie Mellon requests users of this software to return to
                     19:  * 
                     20:  *  Software Distribution Coordinator  or  [email protected]
                     21:  *  School of Computer Science
                     22:  *  Carnegie Mellon University
                     23:  *  Pittsburgh PA 15213-3890
                     24:  * 
                     25:  * any improvements or extensions that they make and grant Carnegie Mellon
                     26:  * the rights to redistribute these changes.
                     27:  */
                     28: 
                     29: /*
                     30:  * HISTORY
                     31:  * $Log: bios.S,v $
                     32:  * Revision 1.1  1993/03/21 18:08:23  cgd
                     33:  * after 0.2.2 "stable" patches applied
                     34:  *
                     35:  * Revision 2.2  92/04/04  11:34:26  rpd
                     36:  *     Fix Intel Copyright as per B. Davies authorization.
                     37:  *     [92/04/03            rvb]
                     38:  *     From 2.5 version
                     39:  *     [92/03/30            mg32]
                     40:  * 
                     41:  * Revision 2.2  91/04/02  14:35:21  mbj
                     42:  *     Add Intel copyright
                     43:  *     [90/02/09            rvb]
                     44:  * 
                     45:  */
                     46: 
                     47: 
                     48: /*
                     49:   Copyright 1988, 1989, 1990, 1991, 1992 
                     50:    by Intel Corporation, Santa Clara, California.
                     51: 
                     52:                 All Rights Reserved
                     53: 
                     54: Permission to use, copy, modify, and distribute this software and
                     55: its documentation for any purpose and without fee is hereby
                     56: granted, provided that the above copyright notice appears in all
                     57: copies and that both the copyright notice and this permission notice
                     58: appear in supporting documentation, and that the name of Intel
                     59: not be used in advertising or publicity pertaining to distribution
                     60: of the software without specific, written prior permission.
                     61: 
                     62: INTEL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
                     63: INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
                     64: IN NO EVENT SHALL INTEL BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
                     65: CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
                     66: LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
                     67: NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
                     68: WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
                     69: */
                     70: 
                     71:        .file   "bios.s"
                     72: 
                     73: #include "asm.h"
                     74:        .text
                     75: 
                     76: /*
                     77: # biosread(dev, cyl, head, sec)
                     78: #      Read one sector from disk into the internal buffer "intbuf" which
                     79: #      is the first 512 bytes of the boot loader.
                     80: # BIOS call "INT 0x13 Function 0x2" to read sectors from disk into memory
                     81: #      Call with       %ah = 0x2
                     82: #                      %al = number of sectors
                     83: #                      %ch = cylinder
                     84: #                      %cl = sector
                     85: #                      %dh = head
                     86: #                      %dl = drive (0x80 for hard disk, 0x0 for floppy disk)
                     87: #                      %es:%bx = segment:offset of buffer
                     88: #      Return:         
                     89: #                      %al = 0x0 on success; err code on failure
                     90: */
                     91: 
                     92: ENTRY(biosread)
                     93:        push    %ebp
                     94:        mov     %esp, %ebp
                     95: 
                     96:        push    %ebx
                     97:        push    %ecx
                     98:        push    %edx
                     99:        push    %es
                    100: 
                    101:        movb    0x10(%ebp), %dh
                    102:        movw    0x0c(%ebp), %cx
                    103:        xchgb   %ch, %cl        # cylinder; the highest 2 bits of cyl is in %cl
                    104:        rorb    $2, %cl
                    105:        movb    0x14(%ebp), %al
                    106:        orb     %al, %cl
                    107:        incb    %cl             # sector; sec starts from 1, not 0
                    108:        movb    0x8(%ebp), %dl  # device
                    109:        xor     %ebx, %ebx      # offset -- 0
                    110:                                # prot_to_real will set %es to BOOTSEG
                    111: 
                    112:        call    EXT(prot_to_real)       # enter real mode
                    113:        movb    $0x2, %ah       # subfunction
                    114:        movb    $0x1, %al       # number of sectors -- one
                    115: 
                    116:        sti
                    117:        int     $0x13
                    118:        cli
                    119: 
                    120:        mov     %eax, %ebx      # save return value
                    121: 
                    122:        data16
                    123:        call    EXT(real_to_prot) # back to protected mode
                    124: 
                    125:        xor     %eax, %eax
                    126:        movb    %bh, %al        # return value in %ax
                    127: 
                    128:        pop     %es
                    129:        pop     %edx
                    130:        pop     %ecx
                    131:        pop     %ebx
                    132:        pop     %ebp
                    133: 
                    134:        ret
                    135: 
                    136: 
                    137: /*
                    138: # putc(ch)
                    139: # BIOS call "INT 10H Function 0Eh" to write character to console
                    140: #      Call with       %ah = 0x0e
                    141: #                      %al = character
                    142: #                      %bh = page
                    143: #                      %bl = foreground color ( graphics modes)
                    144: */
                    145: 
                    146: 
                    147: ENTRY(putc)
                    148:        push    %ebp
                    149:        mov     %esp, %ebp
                    150:        push    %ebx
                    151:        push    %ecx
                    152: 
                    153:        movb    0x8(%ebp), %cl
                    154: 
                    155:        call    EXT(prot_to_real)
                    156: 
                    157:        data16
                    158:        mov     $0x1, %ebx      # %bh=0, %bl=1 (blue)
                    159:        movb    $0xe, %ah
                    160:        movb    %cl, %al
                    161:        sti
                    162:        int     $0x10           # display a byte
                    163:        cli
                    164: 
                    165:        data16
                    166:        call    EXT(real_to_prot)
                    167: 
                    168:        pop     %ecx
                    169:        pop     %ebx
                    170:        pop     %ebp
                    171:        ret
                    172: 
                    173: 
                    174: /*
                    175: # getc()
                    176: # BIOS call "INT 16H Function 00H" to read character from keyboard
                    177: #      Call with       %ah = 0x0
                    178: #      Return:         %ah = keyboard scan code
                    179: #                      %al = ASCII character
                    180: */
                    181: 
                    182: ENTRY(getc)
                    183:        push    %ebp
                    184:        mov     %esp, %ebp
                    185:        push    %ebx            # save %ebx
                    186: 
                    187:        call    EXT(prot_to_real)
                    188: 
                    189:        movb    $0x0, %ah
                    190:        sti
                    191:        int     $0x16
                    192:        cli
                    193: 
                    194:        movb    %al, %bl        # real_to_prot uses %eax
                    195: 
                    196:        data16
                    197:        call    EXT(real_to_prot)
                    198: 
                    199:        xor     %eax, %eax
                    200:        movb    %bl, %al
                    201: 
                    202:        pop     %ebx
                    203:        pop     %ebp
                    204:        ret
                    205: /*
                    206: # ischar()
                    207: #       if there is a character pending, return it; otherwise return 0
                    208: # BIOS call "INT 16H Function 01H" to check whether a character is pending
                    209: #      Call with       %ah = 0x1
                    210: #      Return:
                    211: #              If key waiting to be input:
                    212: #                      %ah = keyboard scan code
                    213: #                      %al = ASCII character
                    214: #                      Zero flag = clear
                    215: #              else
                    216: #                      Zero flag = set
                    217: */
                    218: ENTRY(ischar)
                    219:        push    %ebp
                    220:        mov     %esp, %ebp
                    221:        push    %ebx
                    222: 
                    223:        call    EXT(prot_to_real)               # enter real mode
                    224: 
                    225:        xor     %ebx, %ebx
                    226:        movb    $0x1, %ah
                    227:        sti
                    228:        int     $0x16
                    229:        cli
                    230:        data16
                    231:        jz      nochar
                    232:        movb    %al, %bl
                    233: 
                    234: nochar:
                    235:        data16
                    236:        call    EXT(real_to_prot)
                    237: 
                    238:        xor     %eax, %eax
                    239:        movb    %bl, %al
                    240: 
                    241:        pop     %ebx
                    242:        pop     %ebp
                    243:        ret
                    244: 
                    245: /*
                    246: #
                    247: # get_diskinfo():  return a word that represents the
                    248: #      max number of sectors and  heads and drives for this device
                    249: #
                    250: */
                    251: 
                    252: ENTRY(get_diskinfo)
                    253:        push    %ebp
                    254:        mov     %esp, %ebp
                    255:        push    %es
                    256:        push    %ebx
                    257:        push    %ecx
                    258:        push    %edx
                    259: 
                    260:        movb    0x8(%ebp), %dl          # diskinfo(drive #)
                    261:        call    EXT(prot_to_real)       # enter real mode
                    262: 
                    263:        movb    $0x8, %ah               # ask for disk info
                    264: 
                    265:        sti
                    266:        int     $0x13
                    267:        cli
                    268: 
                    269:        data16
                    270:        call    EXT(real_to_prot)       # back to protected mode
                    271: 
                    272:        xor     %eax, %eax
                    273: 
                    274:        /*form a longword representing all this gunk*/
                    275:        movb    %dh, %ah                # # heads
                    276:        andb    $0x3f, %cl              # mask of cylinder gunk
                    277:        movb    %cl, %al                # # sectors
                    278: 
                    279:        pop     %edx
                    280:        pop     %ecx
                    281:        pop     %ebx
                    282:        pop     %es
                    283:        pop     %ebp
                    284:        ret
                    285: 
                    286: /*
                    287: #
                    288: # memsize(i) :  return the memory size in KB. i == 0 for conventional memory,
                    289: #              i == 1 for extended memory
                    290: #      BIOS call "INT 12H" to get conventional memory size
                    291: #      BIOS call "INT 15H, AH=88H" to get extended memory size
                    292: #              Both have the return value in AX.
                    293: #
                    294: */
                    295: 
                    296: ENTRY(memsize)
                    297:        push    %ebp
                    298:        mov     %esp, %ebp
                    299:        push    %ebx
                    300: 
                    301:        mov     8(%ebp), %ebx
                    302: 
                    303:        call    EXT(prot_to_real)               # enter real mode
                    304: 
                    305:        cmpb    $0x1, %bl
                    306:        data16
                    307:        je      xext
                    308:        
                    309:        sti
                    310:        int     $0x12
                    311:        cli
                    312:        data16
                    313:        jmp     xdone
                    314: 
                    315: xext:  movb    $0x88, %ah
                    316:        sti
                    317:        int     $0x15
                    318:        cli
                    319: 
                    320: xdone:
                    321:        mov     %eax, %ebx
                    322: 
                    323:        data16
                    324:        call    EXT(real_to_prot)
                    325: 
                    326:        mov     %ebx, %eax
                    327:        pop     %ebx
                    328:        pop     %ebp
                    329:        ret

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.