windows-nt/Source/XPSP1/NT/base/mvdm/softpc.new/bios/msinit.asm

289 lines
6.3 KiB
NASM
Raw Normal View History

2020-09-26 03:20:57 -05:00
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