|
|
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
|