windows-nt/Source/XPSP1/NT/base/mvdm/softpc.new/bios/msinit.asm
2020-09-26 16:20:57 +08:00

289 lines
6.3 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

page ,160
title msinit for BIOS
;
;----------------------------------------------------------------------------
;
; Modification history
;
; 26-Feb-1991 sudeepb Ported for NT DOSEm
;----------------------------------------------------------------------------
;
EXTENDEDKEY equ 1 ; use extended keyboard functions
include version.inc ; set build flags
include biosseg.inc ; establish bios segment structure
include msequ.inc
include dossym.inc
include dosmac.inc
include biostruc.inc
include dossvc.inc
include vint.inc
; the following segment follows sysinit. It is used to define
; the location to load MSDOS.SYS into.
dos_load_seg segment para public 'dos_load_seg'
dos_load_seg ends
extrn RomVectors:dword
extrn NUMROMVECTORS:abs
extrn res_dev_list:word
extrn keyrd_func:byte ; for mscon. defined in msdata.
extrn keysts_func:byte ; for mscon. defined in msdata.
extrn endBIOSData:byte
extrn dosdatasg:word
extrn Int15:far ; M036
extrn int19:far
extrn intret:near
extrn cbreak:near
extrn outchr:near
extrn outchr:near
sysinitseg segment
assume cs:sysinitseg
extrn current_dos_location:word
extrn device_list:dword
extrn memory_size:word
extrn sysinit:far
sysinitseg ends
Bios_Data_Init segment
assume cs:datagrp
;*********************************************************
; system initialization
;
; the entry conditions are established by the bootstrap
; loader and are considered unknown. the following jobs
; will be performed by this module:
;
; 1. all device initialization is performed
;
; 2. a local stack is set up and ds:si are set
; to point to an initialization table. then
; an inter-segment call is made to the first
; byte of the dos
;
; 3. once the dos returns from this call the ds
; register has been set up to point to the start
; of free memory. the initialization will then
; load the command program into this area
; beginning at 100 hex and transfer control to
; this program.
;
;********************************************************
;===========================================================================
;
; entry from boot sector. the register contents are:
;
; dl = int 13 drive number we booted from
; ch = media byte
; bx = first data sector on disk.
; ax = first data sector (high)
; di = sectors/fat for the boot media.
;
public init
init proc near
assume ds:nothing,es:nothing
FCLI
xor ax,ax
mov ds,ax
; Save a pack of interrupt vectors...
push cs
pop es ; cannot use cs override for stos
mov cx, NUMROMVECTORS ; no. of rom vectors to be saved
mov si, offset RomVectors ; point to list of int vectors
next_int:
lods byte ptr cs:[si] ; get int number
cbw ; assume < 128
shl ax, 1
shl ax, 1 ; int no * 4
mov di, ax
xchg si, di
lodsw
stosw
lodsw
stosw ; save the vector
xchg si, di
loop next_int
; set up int 15 for new action ; M036
mov word ptr ds:[15h*4],offset Int15 ; M036
mov ds:[15h*4+2],cs ; M036
; set up int 19 for new action
mov word ptr ds:[19h*4],offset int19
mov ds:[19h*4+2],cs
;
xor dx,dx
mov ss,dx
mov sp,700h ;local stack
FSTI
assume ss:nothing
; NTVDM we do not intialize the com,prn ports here
; to stay seamless with the host OS
; 15-Sep-1992 Jonle
;
; mov al,3 ; init com4
; call aux_init
; mov al,2 ; init com3
; call aux_init
; mov al,1 ; init com2
; call aux_init
; xor al,al ; init com1
; call aux_init
;
; mov al,2 ; init lpt3
; call print_init
; mov al,1 ; init lpt2
; call print_init
; xor al,al ; init lpt1
; call print_init
xor dx,dx
mov ds,dx ; to initialize print screen vector
mov es,dx
xor ax,ax
mov di,initspot
stosw ; init four bytes to 0
stosw
mov ax,cs ; fetch segment
mov ds:word ptr brkadr,offset cbreak ;break entry point
mov ds:brkadr+2,ax ;vector for break
mov ds:word ptr chrout*4,offset outchr
mov ds:word ptr chrout*4+2,ax
mov di,4
mov bx,offset intret ;will initialize rest of interrupts
xchg ax,bx
stosw ;location 4
xchg ax,bx
stosw ;int 1 ;location 6
add di,4
xchg ax,bx
stosw ;location 12
xchg ax,bx
stosw ;int 3 ;location 14
xchg ax,bx
stosw ;location 16
xchg ax,bx
stosw ;int 4 ;location 18
mov ds:word ptr 500h,dx ;set print screen & break =0
mov ds:word ptr lstdrv,dx ;clean out last drive spec
mov dx,sysinitseg
mov ds,dx
assume ds:sysinitseg
; set pointer to resident device driver chain
mov word ptr device_list,offset res_dev_list
mov word ptr device_list+2,cs
mov current_dos_location,dos_load_seg ; will load MSDOS here
ifdef EXTENDEDKEY
; we will check if the system has ibm extended keyboard by
; looking at a byte at 40:96. if bit 4 is set, then extended key board
; is installed, and we are going to set keyrd_func to 10h, keysts_func to 11h
; for the extended keyboard function. use cx as the temporary register.
xor cx,cx
mov ds,cx
assume ds:nothing
mov cl,ds:0496h ; get keyboard flag
test cl,00010000b
jz org_key ; orginal keyboard
mov byte ptr keyrd_func,10h ; extended keyboard
mov byte ptr keysts_func,11h ; change for ext. keyboard functions
org_key:
endif
push cs
pop ds
push cs
pop es
assume ds:datagrp, es:datagrp
mov di, offset endBIOSData ; BIOS data segment end address
shr di,1
shr di,1
shr di,1
shr di,1 ; Converted to segmnet
inc di ; para align
add di,datagrp ; Add segment of BIOS data
mov [dosdatasg],di ; di = to be dos data segment
mov di,dos_load_seg
SVC SVC_DEMLOADDOS ; di is segment to load DOS
; If it fails it never comes back
jmp sysinit
init endp
;--------------------------------------------------------------------
; al = device number
print_init proc near
assume ds:nothing,es:nothing
cbw
mov dx,ax ; get printer port number into dx
mov ah,1 ;initalize printer port
int 17h ;call rom-bios routine
ret
print_init endp
;--------------------------------------------------------------------
aux_init proc near
assume ds:nothing,es:nothing
cbw
mov dx,ax
mov al,rsinit ;2400,n,1,8 (msequ.inc)
mov ah,0 ;initalize aux port
int 14h ;call rom-bios routine
ret
aux_init endp
Bios_Data_Init ends
end