home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / sampler0 / int13.asm < prev    next >
Assembly Source File  |  1985-08-17  |  10KB  |  298 lines

  1. PAGE 64,132
  2. ;
  3. ;         This program intercepts Int 13H calls and prints
  4. ;         the drive, side, track, sector, # of sectors, operation,
  5. ;         and return code.
  6. cseg    segment 
  7.         org 100h
  8. INT13   proc far
  9.         assume cs:cseg,ds:cseg
  10. ;
  11.         jmp install                    ;install and make routine resident
  12. ;
  13. redef13      label      word
  14. oldint13     dd         0              ;save area for old int13 vector
  15. int13loc     equ        13h*4h         ;vector location for int13h
  16. drive_a      equ         'A'
  17. drive_b      equ         'B'
  18. drive_c      equ         'C'
  19. drive_d      equ         'D'
  20. drive_x      equ         'X'
  21. save_ip      dw         0              ;save area for calling pgm's IP
  22. save_cs      dw         0              ;save area for calling pgm's CS
  23. ;
  24. message      db 'Drv: '
  25. drive        db ?
  26.              db ' Side: '
  27. side1        db ?
  28. side2        db ?
  29.              db '   Tr: '
  30. track1       db ?
  31. track2       db ?
  32.              db ' Sec: '
  33. sector1      db ?
  34. sector2      db ?
  35.              db '  # secs: '
  36. sec_cnt1     db ?
  37. sec_cnt2     db ?
  38.              db ' Op: '
  39. op_1         db ?
  40. op_2         db ?
  41.              db '   Retcd: '
  42. status1      db ?
  43. status2      db ?
  44.              db '  Addr: '
  45. cs_1         db ?
  46. cs_2         db ?
  47. cs_3         db ?
  48. cs_4         db ?
  49.              db ':'
  50. ip_1         db ?
  51. ip_2         db ?
  52. ip_3         db ?
  53. ip_4         db ?
  54.              db 0ah,0dh
  55. ;------------------------------
  56. inst_msg     db 'INT13 is now installed.......$'
  57. ;
  58. newint13:
  59.         sti
  60.         push ax
  61.         push bp
  62.         mov bp,sp                      
  63.         mov ax,[bp+4]                  ;Retrieve return IP value 
  64.         mov cs:save_ip,ax              ;    from stack.
  65.         mov ax,[bp+6]                  ;Retrieve return CS value
  66.         mov cs:save_cs,ax              ;    from stack.
  67.         pop bp                         ;Save anything which will be
  68.         pop ax                         ;    be changed during
  69.         pushf                          ;    processing.
  70.         push di
  71.         push si
  72.         push ds
  73.         push es
  74.         push bx
  75.         push cx
  76.         push dx
  77.         push ax
  78.         mov ax,cs
  79.         mov ds,ax
  80. ;---------------DRIVE------------------
  81.         cmp dl,00h                     ;Drive A? (dl=00)
  82.         jne chk1                       ; Note: processing is in place for
  83.         mov drive,drive_a              ;    logging disk activity on all
  84.         jmp drv_exit                   ;    drives, if desired.  See below
  85. chk1:   cmp dl,01h                     ;Drive B?
  86.         jne chk2
  87.         mov drive,drive_b
  88.         jmp drv_exit
  89. chk2:   cmp dl,02h                     ;Drive C?
  90.         jne chk3
  91.         mov drive,drive_c
  92.         jmp drv_exit
  93. chk3:   cmp dl,03h
  94.         jne chkx
  95.         mov drive,drive_d
  96.         jmp drv_exit
  97. chkx:   mov drive,drive_x
  98. drv_exit:
  99. ;---------------SIDE  (DH) ------------
  100.         mov ah,dh                      ;record side being requested-left digit
  101.         call leftdig                   ;convert to ASCII code for printing
  102.         mov cs:side1,ah                ;move code to message area
  103.         mov ah,dh                      ;same for right digit
  104.         call rightdig
  105.         mov cs:side2,ah
  106. ;---------------TRACK NO. (CH)----------
  107.         mov ah,ch
  108.         call leftdig
  109.         mov cs:track1,ah
  110.         mov ah,ch
  111.         call rightdig
  112.         mov cs:track2,ah
  113. ;----------------------------------------
  114. ;
  115. ;----------------SECTOR NO. (CL)---------
  116.         mov ah,cl
  117.         call leftdig
  118.         mov cs:sector1,ah
  119.         mov ah,cl
  120.         call rightdig
  121.         mov cs:sector2,ah
  122. ;------------------------------------------
  123. ;
  124. ;----------------NO. OF SECTORS (AL)-------
  125. ;
  126.         pop ax      ;recall ax
  127.         push ax     ;save it again
  128.         mov ah,al
  129.         call leftdig
  130.         mov cs:sec_cnt1,ah
  131.         pop ax
  132.         push ax
  133.         mov ah,al
  134.         call rightdig
  135.         mov cs:sec_cnt2,ah
  136. ;--------------------------------------------------
  137. ;
  138. ;--------------OPERATION TYPE (AH)-----------------
  139. ; 00:reset 01:read status 02:read sectors 03:write sec. 04:verify 05:format
  140. ;
  141.  
  142.         pop ax      ;recall ax
  143.         push ax     ;save it again
  144.         call leftdig
  145.         mov cs:op_1,ah
  146.         pop ax
  147.         push ax
  148.         call rightdig
  149.         mov cs:op_2,ah
  150. ;-------------- RETURN ADDRESS CS:IP -------------------
  151. ;
  152.         mov ax,cs:save_ip
  153.         call leftdig
  154.         mov cs:ip_1,ah
  155.         mov ax,cs:save_ip
  156.         call rightdig
  157.         mov cs:ip_2,ah
  158.         mov ax,cs:save_ip
  159.         xchg ah,al
  160.         call leftdig
  161.         mov cs:ip_3,ah
  162.         mov ax,cs:save_ip
  163.         xchg ah,al
  164.         call rightdig
  165.         mov cs:ip_4,ah
  166. ;
  167.         mov ax,cs:save_cs
  168.         call leftdig
  169.         mov cs:cs_1,ah
  170.         mov ax,cs:save_cs
  171.         call rightdig
  172.         mov cs:cs_2,ah
  173.         mov ax,cs:save_cs
  174.         xchg ah,al
  175.         call leftdig
  176.         mov cs:cs_3,ah
  177.         mov ax,cs:save_cs
  178.         xchg ah,al
  179.         call rightdig
  180.         mov cs:cs_4,ah
  181. ;--------------------------------
  182.              pop ax                    ;Restore the things which were
  183.              pop dx                    ;    saved
  184.              pop cx
  185.              pop bx
  186.              pop es
  187.              pop ds
  188.              pop si
  189.              pop di
  190.              popf
  191. ;--------------------
  192.              pushf           ; Put flags, CS and IP onto stack for return to
  193.              push cs         ;  routine below after standard int 13h processing
  194.              call intcall    ; IP will point to next instruction
  195. ;
  196. ;---------------------------Report status of int 13h call----------
  197. ;
  198.              pushf
  199.              push ax                   ;Save it again
  200.              call leftdig
  201.              mov cs:status1,ah
  202.              pop ax
  203.              push ax
  204.              call rightdig
  205.              mov cs:status2,ah
  206.              pop ax
  207. ;------------  PRINT THE MESSAGE --------------------------
  208.              cmp dl,00h  ;******** REMOVE THESE TWO LINES IF YOU WISH
  209.              jne goback  ;********   ALL DISK ACTIVITY TO BE LOGGED
  210.              push ax
  211.              push cx
  212.              push dx
  213.              push si
  214.              mov cx,52h                ; Length of message
  215.              mov si,offset message
  216.              xor dx,dx
  217. prnloop:     mov ah,00h
  218.              mov al,cs:[si]  
  219.              int 17h
  220.              inc si
  221.              loop prnloop
  222.              pop si
  223.              pop dx
  224.              pop cx
  225.              pop ax
  226. goback:      popf
  227. ;-------------------------------------------------------
  228.              ret  2          ; Go back to calling program.
  229.                              ; Note:"iret" is not used because the flags
  230.                              ;   would be popped (and we wish to pass back
  231.                              ;   the changed set of flags).  The "2" ensures
  232.                              ;   that the stack is restored by incrementing
  233.                              ;   the stack pointer by two extra bytes.
  234. ;-----------------------
  235. intcall      PROC near     ; get set to go to standard int 13h routine
  236.              pushf
  237.              push cs:[redef13 + 2]     ; "cs" of int 13h routine
  238.              push cs:[redef13]         ; "ip" of int 13h routine
  239.              iret                      ; Branch to normal int13h code in ROM
  240. intcall      endp 
  241. ;--------------------------
  242. ;   Routine to convert high-order digit in AH to an ASCII character
  243. ;
  244. leftdig      PROC
  245.              and ah,11110000b ; Mask right 4 bits
  246.              shr ah,1         ; Move high-order digit to low-order pos.
  247.              shr ah,1
  248.              shr ah,1
  249.              shr ah,1
  250.              cmp ah,0ah       ; Check for value 0 through 9
  251.              jnb b37          ; If value hex A through F, jump 
  252.              add ah,30h       ; Add 30h to make ASCII character
  253.              jmp b2
  254.        b37:  add ah,37h       ; If hex A-F, add 37h to make ASCII character
  255.         b2:  ret
  256. leftdig      endp
  257. ;-----------------------
  258. ;   Routine to convert low-order digit in AH to an ASCII character
  259. ;
  260. rightdig     PROC near
  261.              and ah,00001111b ; mask left 4 bits
  262.              cmp ah,0ah
  263.              jnb a37
  264.              add ah,30h
  265.              jmp a1
  266.        a37:  add ah,37h
  267.         a1:  ret
  268. rightdig     endp
  269. ;-----------------------
  270. install:
  271.              mov ax,0
  272.              mov es,ax
  273.              mov di,int13loc           ;Save old 
  274.              mov ax,es:[di]            ;   interrupt 13h
  275.              mov bx,es:[di+2]          ;   vector
  276.              mov si,offset oldint13    ;     "
  277.              mov [si],ax               ;     "
  278.              mov [si+2],bx             ;     "
  279.              mov ax,0                  
  280.              mov es,ax
  281.              mov bx,ds
  282.              cli                       ;Turn off interrupts
  283.              mov di,int13loc           ;Change int13h ....
  284.              mov ax,offset newint13    ;   vector to...
  285.              mov es:[di],ax            ;   point to...
  286.              mov es:[di+2],bx          ;   this program.
  287.              sti                       ;Turn interrupts back on
  288.              mov dx,offset inst_msg
  289.              mov ah,09h                ;Print string function
  290.              int 21h                   ;Print "install" message
  291.              mov dx,offset install     ;Address of end of resident routine
  292.              int 27h                   ;Terminate and stay resident
  293. INT13        endp
  294. ;------------------------------
  295. cseg         ends
  296. end          INT13
  297.