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