📄 intr.asm
字号:
; 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%ifdef WATCOM push bx push cx push dx push es%endif push ds mov ax, [bp+6] ; interrupt number mov [cs:%%intr_1-1], al jmp short %%intr_2 ; flush the instruction cache%%intr_2 mov bx, [bp+4] ; 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+6]%ifdef WATCOM mov bx, [ss:bx+24] ; address of REGPACK%else mov bx, [ss:bx+16] ; address of REGPACK%endif 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 ds%ifdef WATCOM pop es pop dx pop cx pop bx%endif pop di pop si pop bp ret 4%endmacrosegment HMA_TEXT;; COUNT ASMPASCAL res_DosExec(COUNT mode, exec_blk * ep, BYTE * lp) global RES_DOSEXECRES_DOSEXEC: pop es ; ret address pop dx ; filename pop bx ; exec block pop ax ; mode push es ; ret address mov ah, 4bh push ds pop es ; es = ds int 21h jc short no_exec_error xor ax, axno_exec_error: ret;; UCOUNT ASMPASCAL res_read(int fd, void *buf, UCOUNT count); global RES_READRES_READ: pop ax ; ret address pop cx ; count pop dx ; buf pop bx ; fd push ax ; ret address mov ah, 3fh int 21h jnc no_read_error mov ax, -1no_read_error: retsegment INIT_TEXT;; void init_call_intr(nr, rp); REG int nr; REG struct REGPACK *rp; global INIT_CALL_INTRINIT_CALL_INTR: INTR;; int init_call_XMScall( (WORD FAR * driverAddress)(), WORD AX, WORD DX);; this calls HIMEM.SYS ; global INIT_CALL_XMSCALLINIT_CALL_XMSCALL: pop bx ; ret address pop dx pop ax pop cx ; driver address pop es push cs ; ret address push bx push es ; driver address ("jmp es:cx") push cx retf ; void FAR *DetectXMSDriver(VOID)global DETECTXMSDRIVERDETECTXMSDRIVER: mov ax, 4300h int 2fh ; XMS installation check cmp al, 80h je detected xor ax, ax xor dx, dx retdetected: 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 KEYCHECKKEYCHECK: mov ah, 1 int 16h ret ;; int open(const char *pathname, int flags); global INIT_DOSOPENINIT_DOSOPEN: ;; init calling DOS through ints: pop bx ; ret address pop ax ; flags pop dx ; pathname push bx ; ret address mov ah, 3dh ;; AX will have the file handlecommon_int21: int 21h jnc common_no_error mov ax, -1common_no_error: ret;; int close(int fd); global CLOSECLOSE: pop ax ; ret address pop bx ; fd push ax ; ret address mov ah, 3eh jmp short common_int21;; UCOUNT read(int fd, void *buf, UCOUNT count); global READREAD: pop ax ; ret address pop cx ; count pop dx ; buf pop bx ; fd push ax ; ret address mov ah, 3fh jmp short common_int21;; int dup2(int oldfd, int newfd); global DUP2DUP2: pop ax ; ret address pop cx ; newfd pop bx ; oldfd push ax ; ret address mov ah, 46h jmp short common_int21 ;; VOID init_PSPSet(seg psp_seg) global INIT_PSPSETINIT_PSPSET: pop ax ; ret address pop bx ; psp_seg push ax ; ret_address mov ah, 50h int 21h ret;; COUNT init_DosExec(COUNT mode, exec_blk * ep, BYTE * lp) global INIT_DOSEXECINIT_DOSEXEC: pop es ; ret address pop dx ; filename pop bx ; exec block pop ax ; mode push es ; ret address mov ah, 4bh push ds pop es ; es = ds int 21h jc short exec_no_error xor ax, axexec_no_error: ret;; int init_setdrive(int drive) global INIT_SETDRIVEINIT_SETDRIVE: mov ah, 0x0ecommon_dl_int21: pop bx ; ret address pop dx ; drive/char push bx int 21h ret;; int init_switchar(int char) global INIT_SWITCHARINIT_SWITCHAR: mov ax, 0x3701 jmp short common_dl_int21;; seg ASMPASCAL allocmem(UWORD size);; global ALLOCMEMALLOCMEM: pop ax ; ret address pop bx ; size push ax ; ret address mov ah, 48h int 21h sbb bx, bx ; carry=1 -> ax=-1 or ax, bx ; segment ret ;; void set_DTA(void far *dta) global SET_DTASET_DTA: pop ax ; ret address pop bx ; seg(dta) pop dx ; off(dta) push ax ; ret address mov ah, 1ah push ds mov ds, bx int 21h pop ds ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -