home *** CD-ROM | disk | FTP | other *** search
/ The Unsorted BBS Collection / thegreatunsorted.tar / thegreatunsorted / programming / asm_programming / KEYINT.ZIP / KEYINT.ASM < prev    next >
Assembly Source File  |  1993-03-29  |  3KB  |  140 lines

  1.         DOSSEG
  2.         .MODEL SMALL
  3.         .STACK 200h
  4.         .CODE
  5.         .286
  6.         LOCALS
  7.         Ideal
  8.  
  9.         ASSUME  CS:@CODE, DS:@CODE
  10.         
  11. GLOBAL  PrintByte:NEAR
  12.  
  13. ;======- DATA -======
  14.  
  15. message db      13,10,"Hit a key: $"
  16.  
  17. Credits db      13,10,"It's over...$"
  18.  
  19. OLDINT  dd      0
  20.  
  21. Numtoprint db   0
  22.  
  23. keystring db 128 dup ("-"),"$"
  24.  
  25. ;======SUBROUTINES================
  26.  
  27. PROC Doint near
  28.         pusha
  29.         mov     ah,35h
  30.         mov     al,15h
  31.         int     21h
  32.         mov     [WORD cs:oldint],bx
  33.         mov     [WORD cs:oldint+2],es
  34.         mov     al,15h
  35.         mov     ah,25h
  36.         mov     dx,offset interrupt
  37.         mov     bx,cs
  38.         mov     ds,bx
  39.         int     21h
  40.         popa
  41.         ret
  42. ENDP Doint
  43.  
  44. PROC unDoint near
  45.         pusha
  46.         mov     dx,[WORD cs:oldint]
  47.         mov     ax,[WORD cs:oldint+2]
  48.         mov     ds,ax
  49.         mov     al,15h
  50.         mov     ah,25h
  51.         int     21h
  52.         popa
  53.         ret
  54. ENDP unDoint
  55.  
  56. interrupt:
  57.         cmp     ah,4fh
  58.         jne     noint
  59.         pusha
  60.         mov     [cs:numtoprint],al
  61.         mov     bl,al
  62.         xor     bh,bh
  63.         cmp     bl,0e0h       ;is it special character?
  64.         je      doneint
  65.         mov     al,"+"
  66.         test    bl,10000000b
  67.         je      turnon
  68.         mov     al,"-"
  69. Turnon:
  70.         and     bl,01111111b
  71.         mov     [cs:keystring+bx],al
  72. Doneint:
  73.         clc
  74.         popa
  75.         iret    ;retf 2 if you do a retf 2, then this program will not exit
  76. noint:
  77.         pushf
  78.         call    [DWORD CS:OLDINT]   ;there are other services on int 15h
  79.         iret
  80.  
  81. ;======- End Subs -======
  82.  
  83. START:
  84.         mov     AX,CS
  85.         MOV     ds,ax
  86.         mov     es,ax
  87.         mov     ax,0003h
  88.         int     10h
  89.  
  90.         call    doint
  91.  
  92.         mov     ah,9
  93.         mov     bx,cs
  94.         mov     ds,bx
  95.         mov     es,bx
  96.         mov     dx,offset message
  97.         int     21h
  98.  
  99. Nokeypress:
  100.         mov     ah,2
  101.         xor     bh,bh
  102.         xor     dx,dx
  103.         int     10h
  104.         
  105.         mov     ah,9
  106.         mov     dx,offset keystring
  107.         int     21h
  108.  
  109.         mov     al,[numtoprint]
  110.         call    PrintByte
  111.  
  112.         mov     ah,1
  113.         int     16h
  114.         jz      nokeypress
  115.         xor     ah,ah
  116.         int     16h
  117.         
  118.         cmp     al,"q"
  119.         jne     nokeypress
  120.  
  121.         mov     ah,9
  122.         mov     dx,offset credits
  123.         int     21h
  124.  
  125.         call    undoint
  126.  
  127.         mov     ax,4c00h
  128.         int     21h
  129.  
  130. END START
  131.  
  132. ; what it does:
  133. ;     interrupt #9 calls int 15h fn#4fh with the make or break key codes
  134. ;     normally, this function is simply a iret.  I redefine it to be a
  135. ;     bit of code that takes the make and break scan codes and turns on or
  136. ;     off a corresponding byte. (+ or -) Useful?  if you set the carry flag,
  137. ;     the new key is in al.  Obviously, you cannot change the flags when you
  138. ;     do an iret, so you have to do a retf 2.  The '2' pops 2 bytes off the
  139. ;     stack when returning.
  140.