289 lines
6.3 KiB
NASM
289 lines
6.3 KiB
NASM
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
|
||
|