View Single Post
  #4   Report Post  
Posted to microsoft.public.excel.programming
Michel[_3_] Michel[_3_] is offline
external usenet poster
 
Posts: 23
Default How disabling sounds when calling a shell program?

!!!! there was a fault in the FASM code which could overload the
memory.

at the end change this:
jmp _NextVal

with:
cmp byte [BX],0Dh
jne _NextVal ;if char < [enter] then read next char

So, the full inPCplay.com follows he

; Play notes on PC internal speaker without any sounds through the
soundcard.
; This way you can audio notify the MS-Excel user without disturbing
the online streaming radio and so...
; author ver:1.1
; use: inPCplay hertz1 playtime1 [pausetime1 [hertz2 playtime2 ...]]
; time in 1/100 second
; use Excel: call shell ("c:\inPCplay.com 1000 20 20 3000 20")

;wait for a time-change of the 1/18sec ticks before starting
mov AH,0 ;function 0 for int 1Ah = read system timer
int 1Ah ;read bios timer (CX:DX = 1/18.206sec,
AL=midnightflag)
mov BX,DX ;save low word to compare later
_Loop:
mov AH,0 ;function 0 for int 1Ah = read system timer
int 1Ah ;read bios timer (CX:DX = 1/18.206sec,
AL=midnightflag)
cmp DX,BX
je _Loop ;if timer = saved time then wait

;initialize
mov AL, 0b6h ;Prepare the PC's internal speaker to sound a note
out 43h, AL ;set port 43h for channel 2
mov BX,0080h ;BX used to point to buffer (= first address -1)
mov DX,0 ;DX used for modes: 0=Hertz, 1=playtime,
2=pausetime

_NextVal:
mov CX,0 ;CX used to see if any value has been read
mov AX,0 ;AX used to hold value being read out of buffer
_ReadChar:
inc BX ;next character (bufferaddress+1)
cmp byte [BX],30h ;char from buffer[BX]
jb _ChkVal ;if character < "0" then stop read and check value
cmp byte [BX],39h ;char from buffer[BX]
ja _ChkVal ;if character "9" then stop read and check value
mov CX,0Ah ;a numeric character has been found
push DX ;save DX
mul CX ;value*10 (DX:AX = AX * CX)
mov DX,0 ;(DX = 0)
mov DL,byte [BX] ;make word from byte (DX = BXpointedAddressValue)
add AX,DX ;value+char.ascII (DX:AX = AX + DX)
sub AX,30h ;value-48 ("0"=0, "1"=1, ...)
pop DX ;restore DX and delete overflow, value=max 65535
jmp _ReadChar ;get next char
_ChkVal:
cmp CX,0
jne _DoVal ;if CX < 0 (some val given)
cmp byte [BX],0Dh
je _Exit ;if char = [enter] then stop
jmp _NextVal

_DoVal:
mov CX,AX ;CX=value (CX=AX)
cmp DX,2
je _PauseTime ;if DL=2
cmp DX,1
je _PlayTime ;if DL=1
_SetFrequence:
mov DX,14h ;high divider of frequency
mov AX,4F38h ;low divider of frequency
div CX ;CX = 1331000 / hertz (DX:AX= DX:AX / CX)
out 42h, AL ;Output low byte
mov AL,AH ;AL=AH
out 42h, AL ;Output high byte
mov DX,1 ;next val = Playtime
jmp _NextVal
_PlayTime:
in AL,61h ;read port 61h
or AL,3 ;set bits 1 & 0
out 61h, al ;send new value
mov DX,2 ;next val = Pausetime
jmp _Pause
_PauseTime:
in AL, 61h ;read port 61h
and AL, 252 ;clear bits 1 & 0
out 61h, al ;send new value
mov DL,0 ;next val = SetFrequence
jmp _Pause

_Pause:
push DX ;save mode
push BX ;save char-address
cmp CX,00FFh ;CX=delaytime in 1/100 second
jbe _TimeOk ;if time < 2,55sec then do pause
mov CX,00FFh ;lower val to maximum time (2,55 sec)
_TimeOk:
;change 1/100sec to 1/18.206 sec
mov AX,91 ;multiplier
mul CX ;time = time * 91 (DX:AX = CX * AX)
mov BX,500 ;divider
div BX ;time = time / 500 (DX:AX = DX:AX / BX)
mov BX,AX ;save result
mov AH,0 ;function 0 for int 1Ah = read system timer
int 1Ah ;read bios timer (CX:DX = 1/18.206sec,
AL=midnightflag)
add BX,DX ;add present time to delay time
_Loop1:
mov AH,0 ;function 0 for int 1Ah = read system timer
int 1Ah ;read bios timer (CX:DX = 1/18.206sec,
AL=midnightflag)
cmp DX,BX
ja _Loop1 ;if time delay then wait on truncate low-word
_Loop2:
mov AH,0 ;function 0 for int 1Ah = read system timer
int 1Ah ;read bios timer (CX:DX = 1/18.206sec,
AL=midnightflag)
cmp DX,BX
jb _Loop2 ;if time < delay then wait
pop BX ;get saved char-address
pop DX ;get saved mode
cmp byte [BX],0Dh
jne _NextVal ;if char < [enter] then read next char

_Exit:
in AL, 61h ;read port 61h
and AL, 252 ;clear bits 1 & 0
out 61h, al ;send new value to stop any sound
mov AH,0
int 21h ;end