home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Spezial
/
SPEZIAL2_97.zip
/
SPEZIAL2_97.iso
/
ANWEND
/
TOOLS
/
IHPFS125
/
dumbdrv.asm
< prev
next >
Wrap
Assembly Source File
|
1997-05-03
|
6KB
|
282 lines
;
; DumbDrv - Dummy DOS Device Driver
; Copyright (C) 1994-1997 Marcus Better
;
; This program 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 of the License, or
; (at your option) any later version.
;
; This program 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 this program; if not, write to the Free Software
; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
;
IDEAL
JUMPS
LOCALS
;========================================================= CONSTANTS
; Status codes
stSuccess EQU 0100h
stError EQU 8100h
stUnknownCmd EQU 8103h
stDrvNotReady EQU 8102h
MediaID EQU 0F0h ; Media ID byte - "other"
;========================================================= Driver segment
SEGMENT DrvSeg
ASSUME cs:DrvSeg,ds:NOTHING,es:NOTHING,ss:NOTHING
; Device header
DW 0FFFFh, 0 ; Link to next driver
DW 0 ; Attributes
DW Strategy, Interrupt
DB 1, 7 DUP (0) ; Number of units
;========================================================= Resident DATA area
; Data area
ReqHdrOfs DW 0 ; Offset ot request header
ReqHdrSeg DW 0 ; Segment of request header
VolumeID DB "DUMBDRV", 0
; BIOS Parameter Block
LABEL BPB
BytesPerSec DW 512
SecPerClust DB 2
ResSectors DW 1
FATs DB 1
RootDirEnts DW 32
Sectors DW 512
Media DB 0F0h
FATsecs DW 4
SecPerTrack DW 9
Heads DW 2
HiddenSecs DD 0
HugeSectors DD 0
pBPB DW 26 DUP(OFFSET BPB) ; Array of BPB pointers
JmpTbl DW Init, MediaChk, BuildBPB, 0
DW NotReady, 0, 0, 0
DW NotReady, NotReady
;========================================================= STRATEGY routine
PROC Strategy FAR
mov [ReqHdrOfs], bx
mov [ReqHdrSeg], es
ret
ENDP Strategy
;========================================================= INTERRUPT routine
PROC Interrupt FAR
push ax bx cx dx si di bp ds es
pushf
push cs
pop ds
ASSUME ds:DrvSeg
les bx, [DWORD ReqHdrOfs]
mov al, [es:bx+2] ; Function number
cmp al, 09h
ja @@errUnknownCommand
xor ah, ah
mov si, ax
shl si, 1
mov cx, [JmpTbl+si]
jcxz @@errUnknownCommand
call cx
jmp @@Exit
@@errUnknownCommand:
mov [WORD es:bx+3], stUnknownCmd
@@Exit: popf
pop es ds bp di si dx cx bx ax
ret
ENDP Interrupt
;========================================================= Functions
; Media check
PROC MediaChk
mov [WORD es:bx+3], stSuccess ; Status
mov [BYTE es:bx+14], 1 ; Media unchanged
mov [WORD es:bx+15], OFFSET VolumeID
mov [es:bx+17], cs
ret
ENDP MediaChk
; Build BPB
PROC BuildBPB
mov [WORD es:bx+3], stSuccess ; Status
mov [WORD es:bx+18], OFFSET BPB
mov [es:bx+20], cs
ret
ENDP BuildBPB
; Return "Drive not ready" error for Read or Write req.
PROC NotReady
mov [WORD es:bx+3], stDrvNotReady
mov [WORD es:bx+18], 0 ; Sectors read/written
mov [WORD es:bx+22], OFFSET VolumeID
mov [WORD es:bx+24], cs
ret
ENDP NotReady
LABEL EndResCode
;========================================================= INIT Code
PROC Init
; Say hello
mov ah, 09h
mov dx, OFFSET HelloMsg
int 21h
; Parse command line
call ParseCmdLine
jc @@CmdLineError
or al, al
jz @@CmdLineError ; Zero drives specified
mov ah, [es:bx+22] ; First drive number
add ah, al
cmp ah, 25 ; Maximum number of drives
jna @@DrivesOk
mov al, 26
sub al, [es:bx+22]
@@DrivesOk:
mov [Drives], al
; Set fields
mov [BYTE es:bx+13], al ; Number of units
mov [WORD es:bx+3], stSuccess ; Status
mov [WORD es:bx+14], OFFSET EndResCode
mov [es:bx+16], cs
mov [WORD es:bx+18], OFFSET pBPB
mov [es:bx+20], cs
mov [WORD es:bx+23], 1 ; Error message flag
; Print message
mov ah, [es:bx+22] ; Drive number
add [DrvLetter], ah
mov ah, 09h
mov dx, OFFSET InstallMsg
int 21h
mov al, [Drives]
cmp al, 1
je @@Msg1
add al, [es:bx+22]
dec al
add [DrvLetter2], al
mov ah, 09h
mov dx, OFFSET InstMsg2
int 21h
ret
@@Msg1:
mov ah, 09h
mov dx, OFFSET MsgEnd
int 21h
ret
; Bad cmd line syntax - fail init
@@CmdLineError:
mov ah, 09h
mov dx, OFFSET Syntax
int 21h
mov [BYTE es:bx+13], 0
mov [WORD es:bx+14], 0
mov [WORD es:bx+13], stError
ret
ENDP Init
;---------------------------------------------------------------------
; Parse command line.
PROC ParseCmdLine
push ds
push bx cx dx si di
cld
lds si, [es:bx+18]
ASSUME ds:NOTHING
; Scan past the filename to the first space
@@EatFilename:
lodsb
cmp al, 0Dh
je @@NoParams
cmp al, 0Ah
je @@NoParams
cmp al, ' '
jne @@EatFilename
; Eat spaces
@@EatSpaces:
lodsb
cmp al, ' '
je @@EatSpaces
cmp al, 0Ah
je @@NoParams
cmp al, 0Dh
je @@NoParams
xor dx, dx
; Parse one- or two-digit number
cmp al, '0'
jb @@Error
cmp al, '9'
ja @@Error
mov dl, al
sub dl, '0'
lodsb
cmp al, 0Ah
je @@Done
cmp al, 0Dh
je @@Done
cmp al, ' '
je @@EndParams
cmp al, '0'
jb @@Error
cmp al, '9'
ja @@Error
sub al, '0'
mov dh, dl
mov cl, 3
shl dh, cl
shl dl, 1
add dl, dh
add dl, al
; Make sure command line ends here
@@EndParams:
lodsb
cmp al, 0Ah
je @@Done
cmp al, 0Dh
je @@Done
cmp al, ' '
je @@EndParams
@@Error:
stc
jmp @@Exit
@@NoParams:
mov ax, 1
clc
jmp @@Exit
@@Done:
mov al, dl
xor ah, ah
clc
jmp @@Exit
@@Exit:
pop di si dx cx bx
pop ds
ret
ENDP ParseCmdLine
;========================================================= INIT data
HelloMsg DB 10,13,"DumbDrv Version 1.10 96-01-03", 10, 13
DB "Copyright (c) 1994-96, Marcus Better.",10,13,10,13,"$"
InstallMsg DB "DumbDrv installed as "
DrvLetter DB "A:","$"
InstMsg2 DB " - "
DrvLetter2 DB "A:"
MsgEnd DB 10,13,"$"
Syntax DB "Invalid arguments.",10,13,"$"
Drives DB 1 ; Number of drives to support
ENDS DrvSeg
END