FreeDOS/kernel/intr.asm
2004-03-07 12:19:43 +00:00

306 lines
6.2 KiB
NASM

; File:
; intr.asm
; Description:
; Assembly implementation of calling an interrupt
;
; Copyright (c) 2000
; Steffen Kaiser
; All Rights Reserved
;
; This file is part of FreeDOS.
;
; FreeDOS 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, Inc.,
; 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
;
%include "segs.inc"
%macro INTR 0
push bp ; Standard C entry
mov bp,sp
push si
push di
push ds
push es
mov ax, [bp+4] ; interrupt number
mov [cs:%%intr_1-1], al
jmp short %%intr_2 ; flush the instruction cache
%%intr_2 mov bx, [bp+6] ; regpack structure
mov ax, [bx]
mov cx, [bx+4]
mov dx, [bx+6]
mov si, [bx+8]
mov di, [bx+10]
mov bp, [bx+12]
push word [bx+14] ; ds
mov es, [bx+16]
mov bx, [bx+2]
pop ds
int 0
%%intr_1:
pushf
push ds
push bx
mov bx, sp
mov ds, [ss:bx+8]
mov bx, [ss:bx+20] ; address of REGPACK
mov [bx], ax
pop word [bx+2]
mov [bx+4], cx
mov [bx+6], dx
mov [bx+8], si
mov [bx+10], di
mov [bx+12], bp
pop word [bx+14]
mov [bx+16], es
pop word [bx+22]
pop es
pop ds
pop di
pop si
pop bp
ret
%endmacro
segment HMA_TEXT
;
; void intr(nr, rp)
; REG int nr
; REG struct REGPACK *rp
;
;
global _intr
_intr:
INTR
;; COUNT ASMCFUNC res_DosExec(COUNT mode, exec_blk * ep, BYTE * lp)
global _res_DosExec
_res_DosExec:
mov ah, 4bh
mov bx, sp
mov al, [bx+2]
push ds
pop es
mov dx, [bx+6] ; filename
mov bx, [bx+4] ; exec block
int 21h
jc short no_exec_error
xor ax, ax
no_exec_error:
ret
;; UCOUNT ASMCFUNC res_read(int fd, void *buf, UCOUNT count);
global _res_read
_res_read:
mov bx, sp
mov cx, [bx+6]
mov dx, [bx+4]
mov bx, [bx+2]
mov ah, 3fh
int 21h
jnc no_read_error
mov ax, -1
no_read_error:
ret
segment INIT_TEXT
;
; void init_call_intr(nr, rp)
; REG int nr
; REG struct REGPACK *rp
;
; same stuff as above, but in INIT_SEGMENT
global _init_call_intr
_init_call_intr:
INTR
;
; int init_call_XMScall( (WORD FAR * driverAddress)(), WORD AX, WORD DX)
;
; this calls HIMEM.SYS
;
global _init_call_XMScall
_init_call_XMScall:
push bp
mov bp,sp
mov ax,[bp+8]
mov dx,[bp+10]
call far [bp+4]
pop bp
ret
; void FAR *DetectXMSDriver(VOID)
global _DetectXMSDriver
_DetectXMSDriver:
mov ax, 4300h
int 2fh ; XMS installation check
cmp al, 80h
je detected
xor ax, ax
xor dx, dx
ret
detected:
push es
push bx
mov ax, 4310h ; XMS get driver address
int 2fh
mov ax, bx
mov dx, es
pop bx
pop es
ret
global _keycheck
_keycheck:
mov ah, 1
int 16h
ret
;; int open(const char *pathname, int flags);
global _open
_open:
;; first implementation of init calling DOS through ints:
mov bx, sp
mov ah, 3dh
;; we know that SS=DS during init stage.
mov al, [bx+4]
mov dx, [bx+2]
int 21h
;; AX has file handle
common_exit:
jnc common_no_error
common_error:
mov ax, -1
common_no_error:
ret
;; int close(int fd);
global _close
_close:
mov bx, sp
mov bx, [bx+2]
mov ah, 3eh
int 21h
jmp short common_exit
;; UCOUNT read(int fd, void *buf, UCOUNT count);
global _read
_read:
mov bx, sp
mov cx, [bx+6]
mov dx, [bx+4]
mov bx, [bx+2]
mov ah, 3fh
int 21h
jmp short common_exit
;; int dup2(int oldfd, int newfd);
global _dup2
_dup2:
mov bx, sp
mov cx, [bx+4]
mov bx, [bx+2]
mov ah, 46h
int 21h
jmp short common_exit
;; VOID init_PSPInit(seg psp_seg)
global _init_PSPInit
_init_PSPInit:
push si
mov ah, 55h
mov bx, sp
mov dx, [bx+4]
xor si, si
int 21h
pop si
ret
;; VOID init_PSPSet(seg psp_seg)
global _init_PSPSet
_init_PSPSet:
mov ah, 50h
mov bx, sp
mov bx, [bx+2]
int 21h
ret
;; COUNT init_DosExec(COUNT mode, exec_blk * ep, BYTE * lp)
global _init_DosExec
_init_DosExec:
mov ah, 4bh
mov bx, sp
mov al, [bx+2]
push ds
pop es
mov dx, [bx+6] ; filename
mov bx, [bx+4] ; exec block
int 21h
jc short exec_no_error
xor ax, ax
exec_no_error:
ret
;; int init_setdrive(int drive)
global _init_setdrive
_init_setdrive:
mov ah, 0x0e
common_dl_int21:
mov bx, sp
mov dl, [bx+2]
int 21h
ret
;; int init_switchar(int char)
global _init_switchar
_init_switchar:
mov ax, 0x3701
jmp short common_dl_int21
;; int allocmem(UWORD size, seg *segp)
global _allocmem
_allocmem:
mov ah, 48h
mov bx, sp
mov bx, [bx+2]
int 21h
jc short common_error
mov bx, sp
mov bx, [bx+4]
mov [bx], ax
xor ax, ax
ret
;; void set_DTA(void far *dta)
global _set_DTA
_set_DTA
mov ah, 1ah
mov bx, sp
push ds
lds dx, [bx+2]
int 21h
pop ds
ret