home *** CD-ROM | disk | FTP | other *** search
/ The Unsorted BBS Collection / thegreatunsorted.tar / thegreatunsorted / programming / misc_programming / csip.asm < prev    next >
Assembly Source File  |  1991-12-28  |  5KB  |  274 lines

  1.  
  2. ;------------
  3. ; CSIP - CONTINUOUS DISPLAY OF SOME REGISTERS ON SCREEN
  4. ;------------
  5.  
  6. ;
  7. ; This program will terminate and stay resident.  It intercepts the clock
  8. ; tick interrupt, providing a continuous display of selected cpu registers.
  9. ;
  10. ; samuel h. smith, 12-10-91
  11. ;
  12.  
  13. vectors     segment at 0
  14.                 org 4*8
  15.    iovector     dw  ?           ;offset of interrupt vector to replace
  16.    iovector2    dw  ?           ;within segment 0
  17.  
  18.                 org 0417h
  19.    kbdflags     db ?
  20.    scrollbit = 010h             ;scroll-lock bit
  21.  
  22.                 org 0449h
  23.    vidmode      db ?
  24.  
  25. vectors     ends
  26.  
  27.  
  28. code        segment
  29.    org 100h
  30.    assume cs:code,ds:nothing,es:nothing,ss:nothing
  31.  
  32.  
  33. ; startup entry point
  34. entry:      
  35.    jmp install
  36.  
  37.  
  38. ; vector for old interrupt
  39. oldhandler  dd 0
  40.  
  41.  
  42. ; display only after skipping a specified number of interrupts
  43. skip_init = 3
  44. skip_count  db skip_init
  45.  
  46.  
  47. ; segment address for display memory
  48. disp_seg    dw 0b800h   ;display segment (mono=b000)
  49. disp_ofs    dw 0        ;current display offset
  50. initial_ofs = 120       ;initial display offset
  51. next_ofs    dw 120      ;display offset for next update
  52. last_ofs    = initial_ofs+4*(80*2)
  53. disp_color  = 15        ;display color
  54.  
  55.  
  56. ; a signature in bytes
  57. signature   db 0ah,0dh,'CSIP - Resident CPU register display.  Samuel H. Smith, 12-27-91'
  58.             db 0ah,0dh,'Press SCROLL LOCK key to toggle SS:SP CS:IP status display.'
  59.             db 0ah,0dh,'$',1ah
  60.  
  61.  
  62. ; user return address pointer
  63. returnptr   dd 0
  64.  
  65.  
  66.  
  67. ;-------------------------------------------------------------------
  68. ; new clock tick interrupt
  69. ;------------
  70. ;
  71. newhandler:
  72.    dec skip_count
  73.    jz continue
  74.    jmp oldhandler
  75.  
  76. continue:
  77.    pushf
  78.    call oldhandler
  79.  
  80.    sti
  81.  
  82.    mov skip_count,skip_init
  83.  
  84.    pop word ptr returnptr         ;get return ip
  85.    pop word ptr returnptr+2       ;get return cs
  86.    push word ptr returnptr+2
  87.    push word ptr returnptr
  88.  
  89.    push ds
  90.    push es
  91.    push bx               ;save scratch registers
  92.    push ax
  93.  
  94.    mov ax,0
  95.    mov es,ax            ;activate display only when scroll-lock active
  96.    assume es:vectors
  97.    test kbdflags,scrollbit
  98.    jnz active
  99.    jmp inactive
  100.  
  101. active:
  102.    mov ax,next_ofs
  103.    mov disp_ofs,ax
  104.    add ax,80*2
  105.    cmp ax,last_ofs
  106.    jle setofs
  107.    mov ax,initial_ofs
  108.  
  109. setofs:
  110.    mov next_ofs,ax
  111.  
  112. ;
  113. ; display ss:sp
  114. ;
  115.    mov ax,ss
  116.    call hexout
  117.    mov al,':'
  118.    call putch
  119.    mov ax,sp
  120.    call hexout
  121.    mov al,' '
  122.    call putch
  123.  
  124. ;
  125. ; display cs:ip
  126. ;
  127.    mov ax,word ptr returnptr+2
  128.    call hexout
  129.    mov al,':'
  130.    call putch
  131.    mov ax,word ptr returnptr
  132.    call hexout
  133.  
  134. inactive:
  135.    pop ax
  136.    pop bx
  137.    pop es                ;restore initial entry registers
  138.    pop ds
  139.    assume ds:nothing,es:nothing
  140.  
  141.    iret
  142.  
  143. ;------------------------------------------------
  144. ; hexout - display ax as 4 hex digits
  145. ;
  146. hexout      proc near
  147.    call hexbyte   ;output ah byte
  148.  
  149.    mov ah,al
  150.    call hexbyte   ;output al byte
  151.  
  152.    ret
  153. hexout   endp
  154.  
  155.  
  156.  
  157. ;------------------------------------------------
  158. ; hexbyte - display ah as 2 hex digits
  159. ;
  160. hexbyte     proc near
  161.    push ax
  162.    mov al,ah
  163.    shr al,1
  164.    shr al,1
  165.    shr al,1
  166.    shr al,1
  167.    and al,0fh
  168.    add al,"0"
  169.    cmp al,3ah
  170.    jb hexok
  171.  
  172.    add al,7
  173. hexok:
  174.    call putch
  175.  
  176.    pop ax
  177.    push ax
  178.    mov al,ah
  179.    and al,0fh
  180.    add al,"0"
  181.    cmp al,3ah
  182.    jb hexok2
  183.  
  184.    add al,7
  185. hexok2:
  186.    call putch
  187.    pop ax
  188.    ret
  189. hexbyte   endp
  190.  
  191. ;------------------------------------------------
  192. ; putch - display a message code on the screen
  193. ; code in al
  194. ;
  195. putch     proc near
  196.    push es
  197.    push bx
  198.    push ax
  199.  
  200.    mov bx,disp_seg
  201.    mov es,bx
  202.    mov bx,disp_ofs
  203.    inc bx
  204.    inc bx
  205.    mov disp_ofs,bx
  206.  
  207.    mov ah,disp_color
  208.    mov es:[bx],ax
  209.  
  210.    pop ax
  211.    pop bx
  212.    pop es
  213.    ret
  214. putch   endp
  215.  
  216.  
  217.  
  218. ;----------------------------------------------------------------
  219. ; startup code
  220. ;------------
  221. ;
  222. install:    
  223.    assume ds:code,es:nothing
  224.  
  225. ;------------
  226. ; display the program signon message now that we are sure
  227. ; that we can be installed
  228. ;
  229.    mov dx,offset signature
  230.    mov ah,9
  231.    int 21h               ;display signon message
  232.  
  233. ;
  234. ; now install new interrupt handler
  235. ;
  236.    mov ax,0
  237.    mov es,ax
  238.    assume es:vectors
  239.  
  240. ;
  241. ; determine video ram segment based on video mode
  242. ;
  243.    cmp vidmode,7
  244.    jnz colormode
  245.  
  246.    mov disp_seg,0b000h  ;mono
  247. colormode:
  248.  
  249. ;
  250. ; save old vector
  251. ;
  252.    mov ax,iovector
  253.    mov word ptr oldhandler,ax
  254.    mov ax,iovector2
  255.    mov word ptr oldhandler+2,ax
  256.  
  257. ;
  258. ; install new vector
  259. ;
  260.    mov ax,offset newhandler
  261.    mov iovector,ax      ;entry point offset
  262.    mov ax,cs
  263.    mov iovector2,ax     ;this code segment
  264.  
  265. ;
  266. ; set last resident code offset
  267. ; and terminate-and-stay-resident
  268. ;
  269.    mov dx,offset install
  270.    int 27h
  271.  
  272. code        ends
  273.             end  entry
  274.