home *** CD-ROM | disk | FTP | other *** search
/ The Unsorted BBS Collection / thegreatunsorted.tar / thegreatunsorted / programming / asm_programming / AO2.ASM < prev    next >
Assembly Source File  |  1990-11-07  |  3KB  |  103 lines

  1. ; ASCII Organ II (Version 2: bypasses DOS)
  2.  
  3. timer   equ     42h
  4. speaker equ     61h
  5. sponmsk equ     4fh
  6. spofmsk equ     4ch
  7. settim  equ     0b6h
  8. termkey equ     1
  9. keyport equ     60h
  10.  
  11. doscall macro   x
  12.         mov     ah,x
  13.         int     21h
  14.         endm
  15.  
  16. pout    macro   x,y
  17.         mov     al,y
  18.         out     x,al
  19.         endm
  20.  
  21. code    segment
  22.         org     100h
  23.         assume  cs:code
  24.  
  25. start:  jmp     begin           ; bypasses variable storage
  26.  
  27. ;---- Variable storage ----
  28.  
  29. msg     db      'Attention: <ESC> to quit$'
  30.  
  31. oldvect dd      0               ; define double word (4 bytes)
  32.                                 ; for storage...
  33. ; Start of Program
  34.  
  35. begin:  mov     dx,offset msg
  36.         doscall 9
  37.         sub     ax,ax           ; establish addressing area
  38.         mov     ds,ax           ; interupt vector
  39.         mov     si,9*4          ; mov si,36
  40.         mov     cx,4
  41.         mov     di,offset oldvect
  42.         cld                     ; in precaution
  43.         rep     movsb
  44.         push    cs              ; set DS = CS
  45.         pop     ds
  46.         mov     dx,offset kbdintarget
  47.         mov     al,9             ; make interrupt 9 point
  48.         doscall 25h              ; to kbdintarget
  49.         mov     dx,offset lastin + 5
  50.         int     27h             ; end, make resident
  51.  
  52. ; execute with each stroke of a key
  53.  
  54. kbdintarget:
  55.         sti                     ; timer interrupt
  56.         push    ax              ; save ax
  57.         in      al,keyport      ; read key 
  58.         cmp     al,80h          ; key > 80h?
  59.         jnb     exit            ; if yes, jump... 
  60.         cmp     al,termkey      ; <esc> key?
  61.         je      lastime         ; if yes, jump...
  62.         push    ax              ; store key
  63.         pout    timer+1,settim
  64.         sub     al,al           ; let AL = 0
  65.         out     timer,al        ; send divisor, LSB first
  66.         pop     ax              ; MSB of divisor=value of key
  67.         out     timer,al        ; timer controls tone 
  68.         pout    speaker,sponmsk  ; play note
  69.  
  70.         mov     ax,2000h        ; wait loop
  71. repeat: dec     ax
  72.         jne     repeat
  73.  
  74.         pout    speaker,spofmsk
  75.         jmp     exit
  76.  
  77. lastime:                        ; resume keyboard vector
  78.         push    ds              ; store all registers in stack
  79.         push    es              ; 
  80.         push    si              ; 
  81.         push    di
  82.         push    cx
  83.         push    cs
  84.         pop     ds              ; let DS = CS
  85.         sub     ax,ax           ; establish addressing area
  86.         mov     es,ax           ; interrupt vector
  87.         mov     di,9*4          ; move program storage
  88.         mov     si,offset oldvect ; into int. vector area
  89.         mov     cx,4
  90.         cld                    
  91.         rep    movsb        ; return former keyboard interrupt
  92.         pop     cx        ; vector and registers
  93.         pop     di              ; in order opposite of push...
  94.         pop     si 
  95.         pop     es     
  96.         pop     ds 
  97.  
  98. exit:   pop     ax
  99. lastin: jmp     [oldvect]       ; jump former rout. keyb. int.
  100.  
  101. code    ends
  102.         end     start
  103.