home *** CD-ROM | disk | FTP | other *** search
- ;
- ; sy_drive.asm
- ;
- ; Purpose:
- ;
- ; Sterling Castle Library Functions
- ; (c) Copyright 1985,1989 Sterling Castle Software
- ;
-
- include model
- include blackstr.mac
-
- extrnf free
- extrnf malloc
-
-
- dseg 'DATA'
-
- public _doserr_
-
- SECSIZE equ 512 ;disk sectore size
- msdosf equ 21h ;msdos function call
-
- ifdef asm_386
- alias doserr_,DWORD
- _doserr_ dd 00 ;dos fatal error code
-
- else
- alias doserr_,WORD
- _doserr_ dw 00 ;dos fatal error code
- endif
-
- enddseg
-
-
- cseg sy_getint_
-
- ;-------------------------
- ; sy_getint_(vec,ptr) get interrupt vec to vector ptr
- ;--------------------------
- ; vector address in ebx:ecx
- ; Usage: sy_getint_(vec,p);
- ;
- ; int sy_getint_(int vec, int *p);
-
- public sy_getint_
-
- sy_getint_ proc
- parm386<<vec,dword>,<p,ptr>>
- parm86<<vec,word>,<p,ptr>>
- prolog
- push es
-
- mov eax,vec ;get vector number to get
- mov ah,35h
- int 21h
-
- loadptr lds,esi,p
-
- ifdef asm_386
- mov dword ptr[esi],ebx
- mov [esi+4],es
-
- else
- mov [si],bx
- mov [si+2],es
- endif
-
- pop es
-
- ifdef asm_386
- movsx eax,ax
- endif
-
- epilog
- sy_getint_ endp
-
-
- ;-------------------------
- ; sy_setint_(int,vect) set interrupt int to vector vect
- ;--------------------------
- ; int number in al
- ; vector address in ebx:ecx
- ; Usage: sy_setint_(vec,off,seg);
- ;
- ; int sy_setint_(int vec, int off, int seg);
-
- public sy_setint_
-
- sy_setint_ proc
- parm386<<vect,dword>,<off,dword>,<segm,word>>
- parm86<<vect,word>,<off,word>,<segm,word>>
- prolog
- push ds
-
- mov eax,vect ;get interrupt number to set
- mov edx,off ;vector offset
- mov cx,segm ;get segment
- mov ds,cx ;vector segment
-
- mov ah,25h ;set int command
- int msdosf ;do function interrupt
-
- pop ds
-
- ifdef asm_386
- movsx eax,ax
- endif
-
- epilog
- sy_setint_ endp
-
-
- ;------------------------
- ; sy_isdrive_(drno) check for drive available
- ;-----------------------
- ; Usage: sy_isdrive_(drno);
- ;
- ; int sy_isdrive_(int drno);
- ;
-
- public sy_isdrive_
-
- sy_isdrive_ proc
- parm386<<drno,dword>>
- parm86<<drno,word>>
- prolog
-
- ifdef Large_data
- push es
- endif
-
- mov eax,SECSIZE ;sector size
- push eax
- call malloc
- add esp,Word_size
-
- ifdef Large_data
- mov es,dx ;get segment
- endif
-
- mov ebx,eax ;buffer pointer
- mov eax,drno ;drive number
- mov ecx,1 ;read 1 sector
- mov edx,0 ;start at sector 0
-
- ifdef Large_data
- push es ;segment onto stack
- endif
-
- push ebx ;save buffer pointer
- push ds
- mov ds,dx ;segment from malloc
-
- int 25h ;absolute read
- pop ds
- mov esi,01 ;assume it is there
- jnc isdr_x
-
- mov esi,0 ;drive is not there
-
- isdr_x: pop edx ;adjust for dos
- call free
- add esp,Word_size
- mov eax,esi ;drive flag back
-
- ifdef Large_data
- pop es
- endif
-
- epilog
- sy_isdrive_ endp
-
-
- ;--------------
- ; _dummyi24_ fatal error routine to return only
- ;---------------
-
- public _dummyi24_
-
- _dummyi24_ proc
- ifdef Large_data
- push ds
- mov ax,seg _doserr_
- mov ds,ax
- endif
-
- mov _doserr_,edi ;save the error #
- and _doserr_,0fh ;mask it
- mov al,0 ;ignore the error
-
- ifdef Large_data
- pop ds
- endif
-
- iret ;and return
- _dummyi24_ endp
-
- endcseg sy_getint_
- end
-
-