home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
assemblr
/
library
/
nor_asm
/
disklite.asm
< prev
next >
Wrap
Assembly Source File
|
1989-08-14
|
8KB
|
224 lines
;-----------------------------------------------------------------------;
; Disk Light creates an on-screen version of the disk light that is ;
; usually on disk drives. The difference, however, is that this light ;
; will only be on as long as it takes to read or write to the disk. In ;
; other words, it does not stay on while the disk spins without any ;
; activity. ;
; ;
; This program intercepts the INT 13h vector, which is the entry point ;
; for the ROM BIOS's diskette routine. On entry, Disklite displays ;
; the drive letter in the upper-right corner of the screen, and ;
; restores this section of the screen on exit. ;
;-----------------------------------------------------------------------;
;-----------------------------------------------------------------------;
; Here is the DISKLITE's entry point. It jumps to the initialization ;
; routine which is at the very end so we can throw it out of memory ;
; after we've used it. ;
;-----------------------------------------------------------------------;
CODE_SEG SEGMENT
ASSUME CS:CODE_SEG, DS:CODE_SEG
ORG 100h ;Reserve for DOS Program Segment Prefix
BEGIN: JMP INIT_VECTORS
AUTHOR_STRING DB "Installed Disklite, by John Socha"
DB 0Dh, 0Ah, '$'
ROM_DISKETTE_INT DD ?
DISPLAY_BASE DW ?
OLD_DISPLAY_CHARS DB 4 DUP (?)
DISPLAY_CHARS DB 'A', 70h, ':', 70h
NUM_FLOPPIES DB ? ;Number of floppy drives
UPPER_LEFT EQU (80 - 2) * 2 ;Offset to drive light
;-----------------------------------------------------------------------;
; This procedure intercepts calls to the ROM BIOS's diskette I/O ;
; vector, and it does several things: ;
; ;
; 1. Checks to see if the screen is in an 80 column text mode ;
; so we can write to the screen. Disklite won't write any ;
; characters to the screen if it's not in an 80 column mode. ;
; 2. Displays the disk drive letter, "A:" for example, in the ;
; upper-right corner of the screen. ;
; 3. Calls the old ROM BIOS routine to do the actual work. ;
; 4. Restores the two characters in the upper-right corner of the ;
; screen. ;
;-----------------------------------------------------------------------;
INTERCEPT_DISKETTE_INT PROC FAR
Assume CS:CODE_SEG, DS:Nothing
PUSHF ;Save the old flags
PUSH AX
PUSH SI
PUSH DI
PUSH DS
PUSH ES
CALL GET_DISPLAY_BASE ;Calculates the screen's display base
CALL SAVE_SCREEN ;Save two chars in upper right
CALL DISPLAY_DRIVE_LETTER ;Display the drive letter
POP ES
POP DS
POP DI
POP SI
POP AX
POPF ;Restore the old flags
PUSHF ;Simulate an INT call
CALL ROM_DISKETTE_INT ; to the old ROM BIOS routine
PUSHF ;Save the returned flags
PUSH AX
PUSH SI
PUSH DI
PUSH DS
PUSH ES
LEA SI,OLD_DISPLAY_CHARS ;Point to the old screen image
CALL WRITE_TO_SCREEN ;Restore two chars in upper right
POP ES
POP DS
POP DI
POP SI
POP AX
POPF ;Recover the returned flags
RET 2 ;Leave the status flags intact
INTERCEPT_DISKETTE_INT ENDP
;-----------------------------------------------------------------------;
; This procedure calculates the segment address for the display adapter ;
; that we're using. ;
; ;
; Destroys: AX ;
;-----------------------------------------------------------------------;
GET_DISPLAY_BASE PROC NEAR
Assume CS:CODE_SEG, DS:Nothing
INT 11h ;Get the current equipment flag
AND AX,30h ;Isolate the display flags
CMP AX,30h ;Is this a monochrome display?
MOV AX,0B800h ;Set for a color graphics adapter
JNE DONE_GET_BASE ;Color graphics, base already set
MOV AX,0B000h ;Set for monochrome display
DONE_GET_BASE:
MOV DISPLAY_BASE,AX ;Save this display base
RET
GET_DISPLAY_BASE ENDP
;-----------------------------------------------------------------------;
; This procedure saves the two characters in the upper right corner of ;
; the screen so that we can restore them later. ;
; ;
; Destroys: AX, SI, DI, DS, ES ;
;-----------------------------------------------------------------------;
SAVE_SCREEN PROC NEAR
Assume CS:CODE_SEG, DS:Nothing
MOV SI,UPPER_LEFT ;Read chars from the screen
LEA DI,OLD_DISPLAY_CHARS ;Write chars to local memory
MOV AX,DISPLAY_BASE ;Get segment address of screen
MOV DS,AX
MOV AX,CS ;Point to the local data
MOV ES,AX
CLD ;Set for auto-increment
MOVSW ;Move two characters
MOVSW
RET
SAVE_SCREEN ENDP
;-----------------------------------------------------------------------;
; This procedure displays the drive letter in the upper-right corner of ;
; the screen. ;
; ;
; Destroys: AX, SI ;
;-----------------------------------------------------------------------;
DISPLAY_DRIVE_LETTER PROC NEAR
Assume CS:CODE_SEG, DS:Nothing
MOV AL,DL ;Get the drive number
CMP AL,80h ;Is this a hard disk drive?
JB DISPLAY_LETTER ;No, then continue
SUB AL,80h ;Convert to hard disk number
ADD AL,NUM_FLOPPIES ;Convert to correct disk number
DISPLAY_LETTER:
ADD AL,'A' ;Convert this into a drive letter
LEA SI,DISPLAY_CHARS ;Point to new char image
MOV CS:[SI],AL ;Save this character
CALL WRITE_TO_SCREEN
RET
DISPLAY_DRIVE_LETTER ENDP
;-----------------------------------------------------------------------;
; This procedure writes two characters in the upper-right corner of the ;
; screen. ;
; ;
; On entry: CS:SI Screen image for two characters ;
; Destroys: AX, SI, DI, DS, ES ;
;-----------------------------------------------------------------------;
WRITE_TO_SCREEN PROC NEAR
Assume CS:CODE_SEG, DS:Nothing
MOV DI,UPPER_LEFT ;Write chars to the screen
MOV AX,DISPLAY_BASE ;Get segment address of screen
MOV ES,AX
MOV AX,CS ;Point to the local data
MOV DS,AX
CLD ;Set for auto-increment
MOVSW ;Move two characters
MOVSW
RET
WRITE_TO_SCREEN ENDP
;-----------------------------------------------------------------------;
; This procedure daisy-chains Disklite onto the diskette I/O vector ;
; so that we can monitor the disk activity. ;
;-----------------------------------------------------------------------;
INIT_VECTORS PROC NEAR
Assume CS:CODE_SEG, DS:CODE_SEG
LEA DX,AUTHOR_STRING ;Print out the author notice
MOV AH,9 ;Display this string
INT 21h
CALL GET_NUM_FLOPPIES ;See how many floppy drives installed
MOV AH,35h ;Ask for an interrupt vector
MOV AL,13h ;Get the vector for INT 13h
INT 21h ;Put vector in ES:BX
MOV Word Ptr ROM_DISKETTE_INT,BX
MOV Word Ptr ROM_DISKETTE_INT[2],ES
MOV AH,25h ;Ask to set an interrupt vector
MOV AL,13h ;Set the INT 13h vector to DS:DX
MOV DX,Offset INTERCEPT_DISKETTE_INT
INT 21h ;Set INT 13h to point to our procedure
MOV DX,Offset INIT_VECTORS ;End of resident portion
INT 27h ;Terminate but stay resident
INIT_VECTORS ENDP
;-----------------------------------------------------------------------;
; This procedure determines how many logical floppy disk drives are in ;
; the system. The next drive letter will be used for hard disk drives. ;
;-----------------------------------------------------------------------;
GET_NUM_FLOPPIES PROC NEAR
Assume CS:CODE_SEG, DS:CODE_SEG
INT 11h ;Get the equipment flag
MOV CL,6
SHR AX,CL ;Right justify num of floppies
AND AL,3 ;Strip all the other flags
INC AL ;Returns 0 for 1 floppy
CMP AL,1 ;Is this a one floppy system?
JA DONE_GET_FLOPPIES ;No, then this is the correct number
MOV AL,2 ;Yes, there are 2 logical drives
DONE_GET_FLOPPIES:
MOV NUM_FLOPPIES,AL ;Save this number
RET
GET_NUM_FLOPPIES ENDP
CODE_SEG ENDS
END BEGIN