📄 kernel.asm
字号:
;
; 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.
;
; $Header: C:/dos-c/src/kernel/kernel.asv 1.10 03 Feb 1998 23:30:08 patv $
;
; $Log: C:/dos-c/src/kernel/kernel.asv $
;
; Rev 1.10 03 Feb 1998 23:30:08 patv
;Added a start-up stack for loadable device drivers. Need the separate
;stack so that all int 21h functions can be called.
;
; Rev 1.9 22 Jan 1998 4:09:24 patv
;Fixed pointer problems affecting SDA
;
; Rev 1.8 06 Jan 1998 20:12:32 patv
;Reduced device driver stack sizes.
;
; Rev 1.7 04 Jan 1998 17:26:18 patv
;Corrected subdirectory bug
;
; Rev 1.6 03 Jan 1998 8:36:50 patv
;Converted data area to SDA format
;
; Rev 1.5 06 Feb 1997 22:43:18 patv
;Reduced stack sizes for block and clock devices.
;
; Rev 1.4 06 Feb 1997 19:05:48 patv
;Added hooks for tsc command
;
; Rev 1.3 29 May 1996 21:03:44 patv
;bug fixes for v0.91a
;
; Rev 1.2 19 Feb 1996 3:24:06 patv
;Added NLS, int2f and config.sys processing
;
; Rev 1.1 01 Sep 1995 17:54:24 patv
;First GPL release.
;
; Rev 1.0 02 Jul 1995 9:05:44 patv
;Initial revision.
;
; $EndLog$
;
page 60,132
title kernel start-up code
IFDEF ??version
_TEXT segment byte public 'CODE'
DGROUP group _FIXED_DATA,_DATA,_BSS,_BSSEND ; small model
assume cs:_TEXT,ds:DGROUP,ss:DGROUP
_TEXT ends
_FIXED_DATA segment para public 'DATA'
_FIXED_DATA ends
_DATA segment word public 'DATA'
_DATA ends
_BSS segment word public 'BSS'
_BSS ends
_BSSEND segment byte public 'STACK'
_BSSEND ends
ELSE
_TEXT segment byte public 'CODE'
_TEXT ends
_FIXED_DATA segment para public 'DATA'
_FIXED_DATA ends
_DATA segment word public 'DATA'
_DATA ends
CONST segment word public 'CONST'
CONST ends
_BSS segment word public 'BSS'
_BSS ends
_BSSEND segment byte public 'STACK'
_BSSEND ends
DGROUP group CONST,_DATA,_BSS,_BSSEND ; small/tiny model
assume ds:DGROUP, ss:DGROUP
ENDIF
_TEXT segment byte public 'CODE'
assume cs:_TEXT
extrn _main:near
extrn _con_driver:near
extrn _blk_driver:near
extrn _clk_driver:near
STACK_SIZE equ 384/2 ; stack allocated in words
;---------------------------------------------------
;
; Device entry points
;
cmdlen equ 0 ; Length of this command
unit equ 1 ; Subunit Specified
cmd equ 2 ; Command Code
status equ 3 ; Status
media equ 13 ; Media Descriptor
trans equ 14 ; Transfer Address
count equ 18 ; Count of blocks or characters
start equ 20 ; First block to transfer
IFNDEF ??version
IF STANDALONE EQ 1
PUBLIC __acrtused ; trick used by MSC to force in startup
__acrtused = 9876h
ENDIF
ENDIF
;
;
page
;
;
entry proc near
IF STANDALONE EQ 1
jmp short kernel_start
ENDIF
;
; The "CON" device
;
; This device is the standard console device used by
; XDOS and kernel
;
public _con_dev
_con_dev label far
dd -1
dw 8003h ; con device (stdin & stdout)
dw offset con_strategy
dw offset con_entry
db 'CON '
;
; Header for device
;
public _blk_dev
_blk_dev label far
dd -1
dw 0000h ; block device
dw offset blk_strategy
dw offset blk_entry
db 4
db 0,0,0,0,0,0,0
;
; Header for device
;
public _clk_dev
_clk_dev label far
dd -1
dw 8004h ; clock device
dw offset clk_strategy
dw offset clk_entry
db 'CLOCK$ '
page
;
; kernel start-up
;
IF STANDALONE EQ 1
kernel_start: cli ; prevent interrupts while starting
mov ax,DGROUP
mov ss,ax
mov sp,offset DGROUP:tos
; inititalize entry stack for high water tests
; mov di,seg stack_bottom
; mov es,di
; mov di,offset stack_bottom
; mov ax,offset last
; sub ax,di
; sar ax,1
; mov cx,ax
; mov ax,09090h
; cld
; rep stosw
; inititalize api stacks for high water tests
mov di,seg apistk_bottom
mov es,di
mov di,offset apistk_bottom
mov ax,offset apistk_top
sub ax,di
sar ax,1
mov cx,ax
mov ax,09090h
cld
rep stosw
; Now set up call frame
mov ax,ss
mov ds,ax
mov es,ax
mov bp,sp ; and set up stack frame for c
sti ; now enable them
mov _BootDrive,bx ; tell where we came from
mov _NumFloppies,cx ; and how many
mov ax,ds
mov es,ax
call _main
mov ax,0
push ax
call _exit
jmp $
ENDIF
entry endp
;
; _exit
; perform an "exit" and quit
;
; exit(code)
; int code;
;
IF STANDALONE EQ 1
_exit proc near
public _exit
cli
hlt
jmp _exit
_exit endp
ENDIF
page
;
; NUL device strategy
;
_nul_strtgy proc far
public _nul_strtgy
mov word ptr rqhdr,bx ;save rq headr
mov word ptr rqhdr+2,es
ret
_nul_strtgy endp
;
; NUL device interrupt
;
_nul_intr proc far
public _nul_intr
push es
push bx
les bx,rqhdr ;es:bx--> rqheadr
or word ptr es:[bx+3],100h ;set "done" flag
pop bx
pop es
ret
_nul_intr endp
page
;
; con device strategy
;
; NOTE: This code is not standard device driver handlers
; It is written for sperate code and data space.
;
con_strategy proc far
push ds
push ax
; small model
mov ax,DGROUP ; small model - cs != ds
mov ds,ax
mov word ptr DGROUP:con_rp+2,es
mov word ptr DGROUP:con_rp,bx
pop ax
pop ds
ret
con_strategy endp
;
; con device interrupt
;
; NOTE: This code is not standard device driver handlers
; It is written for sperate code and data space.
;
con_entry proc far
push si
push ax
push cx
push dx
push di
push bp
push ds
push es
push bx
; small model
mov ax,DGROUP ; correct for segments
mov ds,ax ; ax to carry segment
mov word ptr DGROUP:con_dos_stk,sp ; use internal stack
mov word ptr DGROUP:con_dos_seg,ss
pushf ; put flags in bx
pop bx
cli ; no interrupts
mov ss,ax
mov sp,offset DGROUP:con_stk_top
push bx
popf ; restore interrupt flag
mov bp,sp ; make a c frame
push word ptr con_rp+2
push word ptr con_rp
call _con_driver
pop cx
pop cx
les bx,dword ptr con_rp ; now return completion code
mov word ptr es:[bx].status,ax ; mark operation complete
pushf
pop bx
cli ; no interrupts
mov sp,word ptr DGROUP:con_dos_stk ; use dos stack
mov ss,word ptr DGROUP:con_dos_seg
push bx
popf ; restore interrupt flag
pop bx
pop es
pop ds
pop bp
pop di
pop dx
pop cx
pop ax
pop si
ret
con_entry endp
;
; block device strategy
;
; NOTE: This code is not standard device driver handlers
; It is written for sperate code and data space.
;
blk_strategy proc far
push ds
push ax
; small model
mov ax,DGROUP ; small model - cs != ds
mov ds,ax
mov word ptr DGROUP:blk_rp+2,es
mov word ptr DGROUP:blk_rp,bx
pop ax
pop ds
ret
blk_strategy endp
;
; block device interrupt
;
; NOTE: This code is not standard device driver handlers
; It is written for sperate code and data space.
;
blk_entry proc far
pushf
push ax
push bx
push cx
push dx
push bp
push si
push di
push ds
push es
; small model
mov ax,DGROUP ; correct for segments
mov ds,ax ; ax to carry segment
mov word ptr DGROUP:blk_dos_stk,sp ; use internal stack
mov word ptr DGROUP:blk_dos_seg,ss
pushf ; put flags in bx
pop bx
cli ; no interrupts
mov ss,ax
mov sp,offset DGROUP:blk_stk_top
push bx
popf ; restore interrupt flag
mov bp,sp ; make a c frame
push word ptr blk_rp+2
push word ptr blk_rp
call _blk_driver
pop cx
pop cx
les bx,dword ptr blk_rp ; now return completion code
mov word ptr es:[bx].status,ax ; mark operation complete
cli ; no interrupts
mov sp,word ptr DGROUP:blk_dos_stk ; use dos stack
mov ss,word ptr DGROUP:blk_dos_seg
pop es
pop ds
pop di
pop si
pop bp
pop dx
pop cx
pop bx
pop ax
popf
ret
blk_entry endp
page
;
; clock device strategy
;
; NOTE: This code is not standard device driver handlers
; It is written for sperate code and data space.
;
clk_strategy proc far
push ds
push ax
; small model
mov ax,DGROUP ; small model - cs != ds
mov ds,ax
mov word ptr DGROUP:clk_rp+2,es
mov word ptr DGROUP:clk_rp,bx
pop ax
pop ds
ret
clk_strategy endp
;
; clock device interrupt
;
; NOTE: This code is not standard device driver handlers
; It is written for sperate code and data space.
;
clk_entry proc far
pushf
push ax
push bx
push cx
push dx
push bp
push si
push di
push ds
push es
; small model
mov ax,DGROUP ; correct for segments
mov ds,ax ; ax to carry segment
mov word ptr DGROUP:clk_dos_stk,sp ; use internal stack
mov word ptr DGROUP:clk_dos_seg,ss
pushf ; put flags in bx
pop bx
cli ; no interrupts
mov ss,ax
mov sp,offset DGROUP:clk_stk_top
push bx
popf ; restore interrupt flag
mov bp,sp ; make a c frame
push word ptr clk_rp+2
push word ptr clk_rp
call _clk_driver
pop cx
pop cx
les bx,dword ptr clk_rp ; now return completion code
mov word ptr es:[bx].status,ax ; mark operation complete
cli ; no interrupts
mov sp,word ptr DGROUP:clk_dos_stk ; use dos stack
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -