⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kernel.asm

📁 开源DOS的C代码源程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;
; File:
;                          kernel.asm
; Description:
;                       kernel start-up code
;
;                    Copyright (c) 1995, 1996
;                       Pasquale J. Villani
;                       All Rights Reserved
;
; This file is part of DOS-C.
;
; DOS-C is free software; you can redistribute it and/or
; modify it under the terms of the GNU General Public License
; as published by the Free Software Foundation; either version
; 2, or (at your option) any later version.
;
; DOS-C is distributed in the hope that it will be useful, but
; WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
; the GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public
; License along with DOS-C; see the file COPYING.  If not,
; write to the Free Software Foundation, 675 Mass Ave,
; Cambridge, MA 02139, USA.
;
; $Id: kernel.asm,v 1.54 2004/04/24 15:09:34 bartoldeman Exp $
;

                %include "segs.inc"
                %include "ludivmul.inc"


segment	PSP

                extern  _ReqPktPtr:wrt LGROUP

STACK_SIZE      equ     384/2           ; stack allocated in words

;************************************************************	    
; KERNEL BEGINS HERE, i.e. this is byte 0 of KERNEL.SYS
;************************************************************	    

..start:
entry:	
                jmp short realentry

;************************************************************	    
; KERNEL CONFIGURATION AREA
; this is copied up on the very beginning
; it's a good idea to keep this in sync with KConfig.h
;************************************************************	    
                global _LowKernelConfig                                        
_LowKernelConfig:
                db 'CONFIG'             ; constant
                dw configend-configstart; size of config area
                                        ; to be checked !!!

configstart:

DLASortByDriveNo            db 0        ; sort disks by drive order
InitDiskShowDriveAssignment db 1        ;
SkipConfigSeconds           db 2        ;
ForceLBA                    db 0        ;
GlobalEnableLBAsupport      db 1        ;
BootHarddiskSeconds         db 0        ;

configend:

;************************************************************	    
; KERNEL CONFIGURATION AREA END
;************************************************************	    


;************************************************************	    
; KERNEL real entry (at ~60:20)
;                               
; moves the INIT part of kernel.sys to high memory (~9000:0)
; then jumps there
; to aid debugging, some '123' messages are output
; this area is discardable and used as temporary PSP for the
; init sequence
;************************************************************	    


realentry:                              ; execution continues here

                push ax
                push bx
                pushf              
                mov ax, 0e31h           ; '1' Tracecode - kernel entered
                mov bx, 00f0h                                        
                int 010h
                popf
                pop bx
                pop ax

                jmp	far kernel_start
beyond_entry:   resb    256-(beyond_entry-entry)
                                        ; scratch area for data (DOS_PSP)

segment INIT_TEXT

		extern	_FreeDOSmain

                ;
                ; kernel start-up
                ;
kernel_start:

                push bx
                pushf              
                mov ax, 0e32h           ; '2' Tracecode - kernel entered
                mov bx, 00f0h                                        
                int 010h
                popf
                pop bx

		mov	ax,seg init_tos
		cli
		mov	ss,ax
		mov	sp,init_tos
		int	12h		; move init text+data to higher memory
		mov	cl,6
		shl	ax,cl           ; convert kb to para
		mov	dx,15 + init_end wrt INIT_TEXT
		mov	cl,4
		shr	dx,cl
		sub	ax,dx
		mov	es,ax
		mov	dx,__INIT_DATA_START wrt INIT_TEXT ; para aligned
		shr	dx,cl
		add	ax,dx
		mov	ss,ax		; set SS to init data segment
		sti                     ; now enable them
		mov	ax,cs
		mov	dx,__InitTextStart wrt HMA_TEXT    ; para aligned
		shr	dx,cl
%ifdef WATCOM
		add	ax,dx
%endif
		mov	ds,ax
		mov	si,-2 + init_end wrt INIT_TEXT     ; word aligned
		lea	cx,[si+2]
		mov	di,si
		shr	cx,1
		std			; if there's overlap only std is safe
		rep	movsw

					; move HMA_TEXT to higher memory
		sub	ax,dx
		mov	ds,ax		; ds = HMA_TEXT
		mov	ax,es
		sub	ax,dx
		mov	es,ax		; es = new HMA_TEXT

		mov	si,-2 + __InitTextStart wrt HMA_TEXT
		lea	cx,[si+2]
		mov	di,si
		shr	cx,1
		rep	movsw
		
		cld
%ifndef WATCOM				; for WATCOM: CS equal for HMA and INIT
		add	ax,dx
		mov	es,ax		; otherwise CS -> init_text
%endif
		push	es
		mov	ax,cont
		push	ax
		retf
cont:		; Now set up call frame
                mov     ds,[cs:_INIT_DGROUP]
                mov     bp,sp           ; and set up stack frame for c

                push bx
                pushf              
                mov ax, 0e33h           ; '3' Tracecode - kernel entered
                mov bx, 00f0h                                        
                int 010h
                popf
                pop bx

		mov	byte [_BootDrive],bl ; tell where we came from

;!!		int	11h
;!!		mov	cl,6
;!!		shr	al,cl
;!!		inc	al
;!!                mov     byte [_NumFloppies],al ; and how many
                
                mov     ax,ss
                mov     ds,ax
                mov     es,ax
		jmp	_FreeDOSmain


segment	INIT_TEXT_END


;************************************************************	    
; KERNEL CODE AREA END
; the NUL device
;************************************************************	    

segment	CONST

                ;
                ; NUL device strategy
                ;
		global	_nul_strtgy
_nul_strtgy:
                mov     word [cs:_ReqPktPtr],bx     ;save rq headr
                mov     word [cs:_ReqPktPtr+2],es
                retf

                ;
                ; NUL device interrupt
                ;
		global	_nul_intr
_nul_intr:
                push    es
                push    bx
                les     bx,[cs:_ReqPktPtr]            ;es:bx--> rqheadr
                or      word [es:bx+3],100h ;set "done" flag
                pop     bx
                pop     es
                retf

segment _LOWTEXT
                ; floppy parameter table
                global _int1e_table
_int1e_table:   times 0eh db 0

;************************************************************	    
; KERNEL FIXED DATA AREA 
;************************************************************	    


segment	_FIXED_DATA

; Because of the following bytes of data, THIS MODULE MUST BE THE FIRST
; IN THE LINK SEQUENCE.  THE BYTE AT DS:0004 determines the SDA format in
; use.  A 0 indicates MS-DOS 3.X style, a 1 indicates MS-DOS 4.0-6.X style.
                global  DATASTART
DATASTART:
                global  _DATASTART
_DATASTART:
dos_data        db      0
                dw      kernel_start
                db      0               ; padding
                dw      1               ; Hardcoded MS-DOS 4.0+ style

                times (0eh - ($ - DATASTART)) db 0
                global  _NetBios
_NetBios        dw      0               ; NetBios Number

                times (26h - 0ch - ($ - DATASTART)) db 0

; Globally referenced variables - WARNING: DO NOT CHANGE ORDER
; BECAUSE THEY ARE DOCUMENTED AS UNDOCUMENTED (?) AND HAVE
; MANY MULTIPLEX PROGRAMS AND TSR'S ACCESSING THEM
                global  _NetRetry
_NetRetry       dw      3               ;-000c network retry count
                global  _NetDelay
_NetDelay       dw      1               ;-000a network delay count
                global  _DskBuffer
_DskBuffer      dd      -1              ;-0008 current dos disk buffer
                global  _inputptr
_inputptr       dw      0               ;-0004 Unread con input
                global  _first_mcb
_first_mcb      dw      0               ;-0002 Start of user memory
                global  _DPBp
                global  MARK0026H
; A reference seems to indicate that this should start at offset 26h.
MARK0026H       equ     $
_DPBp           dd      0               ; 0000 First drive Parameter Block
                global  _sfthead
_sfthead        dd      0               ; 0004 System File Table head
                global  _clock
_clock          dd      0               ; 0008 CLOCK$ device
                global  _syscon
_syscon         dw      _con_dev,seg _con_dev   ; 000c console device
                global  _maxbksize
_maxbksize      dw      512             ; 0010 maximum bytes/sector of any block device
		dd	0               ; 0012 pointer to buffers info structure
                global  _CDSp
_CDSp           dd      0               ; 0016 Current Directory Structure
                global  _FCBp
_FCBp           dd      0               ; 001a FCB table pointer
                global  _nprotfcb
_nprotfcb       dw      0               ; 001e number of protected fcbs
                global  _nblkdev
_nblkdev        db      0               ; 0020 number of block devices
                global  _lastdrive
_lastdrive      db      0               ; 0021 value of last drive
                global  _nul_dev
_nul_dev:           ; 0022 device chain root
                extern  _con_dev:wrt LGROUP
                dw      _con_dev, seg _con_dev
                                        ; next is con_dev at init time.  
                dw      8004h           ; attributes = char device, NUL bit set
                dw      _nul_strtgy
                dw      _nul_intr
                db      'NUL     '
                global  _njoined
_njoined        db      0               ; 0034 number of joined devices
                dw      0               ; 0035 DOS 4 pointer to special names (always zero in DOS 5)
setverPtr       dw      0,0             ; 0037 setver list
                dw      0               ; 003B cs offset for fix a20
                dw      0               ; 003D psp of last umb exec
                global _LoL_nbuffers
_LoL_nbuffers   dw      1               ; 003F number of buffers
                dw      1               ; 0041 size of pre-read buffer
                global  _BootDrive
_BootDrive      db      1               ; 0043 drive we booted from   

%IF XCPU < 386
                db      0               ; 0044 cpu type (1 if >=386)
%ELSE                
                db      1               ; 0044 cpu type (1 if >=386)
%ENDIF

                dw      0               ; 0045 Extended memory in KBytes
buf_info:		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -